Skip to content
This repository has been archived by the owner on Mar 31, 2022. It is now read-only.

Commit

Permalink
Refactor XML elements of Formatters #452
Browse files Browse the repository at this point in the history
  • Loading branch information
glebfox committed May 18, 2021
1 parent 42c5d48 commit 1cf5a9a
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 63 deletions.
Expand Up @@ -37,11 +37,11 @@ public class FormatterLoadFactory {

protected final Map<String, Function<Element, ? extends Formatter>> FORMATTERS_MAP =
ImmutableMap.<String, Function<Element, ? extends Formatter>>builder()
.put("classNameFormatter", this::loadClassNameFormatter)
.put("collectionFormatter", this::loadCollectionFormatter)
.put("customFormatter", this::loadCustomFormatter)
.put("dateFormatter", this::loadDateFormatter)
.put("numberFormatter", this::loadNumberFormatter)
.put("className", this::loadClassNameFormatter)
.put("collection", this::loadCollectionFormatter)
.put("custom", this::loadCustomFormatter)
.put("date", this::loadDateFormatter)
.put("number", this::loadNumberFormatter)
.build();

@Autowired
Expand Down
Expand Up @@ -772,12 +772,24 @@ protected Action loadValuePickerDeclarativeAction(ActionsHolder actionsHolder, E

@Nullable
protected Formatter<?> loadFormatter(Element element) {
Element formatterElement = element.element("formatter");
if (formatterElement == null) {
return null;
}

int size = formatterElement.elements().size();
if (size != 1) {
throw new GuiDevelopmentException("Only one formatter needs to be defined. " +
"The current number of formatters is " + size, getContext(),
"Component ID", resultComponent.getId());
}

Element childElement = formatterElement.elements().get(0);
FormatterLoadFactory loadFactory = applicationContext.getBean(FormatterLoadFactory.class);
for (Element childElement : element.elements()) {
if (loadFactory.isFormatter(childElement)) {
return loadFactory.createFormatter(childElement);
}
if (loadFactory.isFormatter(childElement)) {
return loadFactory.createFormatter(childElement);
}

return null;
}

Expand Down
Expand Up @@ -55,21 +55,4 @@ protected void addDefaultActions() {
protected Action loadDeclarativeAction(ActionsHolder actionsHolder, Element element) {
return loadValuePickerDeclarativeAction(actionsHolder, element);
}

@Override
protected void loadFormatter(HasFormatter component, Element element) {
Element formatterElement = element.element("formatter");
if (formatterElement == null) {
return;
}

int size = formatterElement.elements().size();
if (size != 1) {
throw new GuiDevelopmentException("Only one formatter needs to be defined. " +
"The current number of formatters is " + size, getContext(),
"Component ID", ((Component) component).getId());
}

super.loadFormatter(component, formatterElement);
}
}
Expand Up @@ -60,6 +60,6 @@ public void loadComponent() {
loadResponsive(resultComponent, element);
loadCss(resultComponent, element);

resultComponent.setFormatter(loadFormatter(element));
loadFormatter(resultComponent, element);
}
}
Expand Up @@ -29,7 +29,7 @@ public void loadComponent() {

loadDatatype(resultComponent, element);

resultComponent.setFormatter(loadFormatter(element));
loadFormatter(resultComponent, element);

loadInputPrompt(resultComponent, element);
loadCaseConversion(resultComponent, element);
Expand Down
60 changes: 28 additions & 32 deletions ui/src/main/resources/io/jmix/ui/screen/layout.xsd
Expand Up @@ -1347,17 +1347,15 @@
<xs:attribute name="positionY" type="xs:integer"/>
</xs:complexType>

<xs:group name="formatters">
<xs:sequence>
<xs:choice maxOccurs="1">
<xs:element name="classNameFormatter" minOccurs="0"/>
<xs:element name="collectionFormatter" minOccurs="0"/>
<xs:element name="customFormatter" minOccurs="0" type="customFormatterType"/>
<xs:element name="dateFormatter" minOccurs="0" type="dateFormatterType"/>
<xs:element name="numberFormatter" minOccurs="0" type="formattableFormatterType"/>
</xs:choice>
</xs:sequence>
</xs:group>
<xs:complexType name="formatterType">
<xs:choice minOccurs="0">
<xs:element name="className" minOccurs="0"/>
<xs:element name="collection" minOccurs="0"/>
<xs:element name="custom" minOccurs="0" type="customFormatterType"/>
<xs:element name="date" minOccurs="0" type="dateFormatterType"/>
<xs:element name="number" minOccurs="0" type="formattableFormatterType"/>
</xs:choice>
</xs:complexType>

<xs:complexType name="customFormatterType">
<xs:attribute name="bean" type="xs:string" use="required"/>
Expand Down Expand Up @@ -1713,9 +1711,9 @@

<!-- Label -->
<xs:complexType name="labelComponent">
<xs:sequence>
<xs:group ref="formatters" minOccurs="0"/>
</xs:sequence>
<xs:all>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:all>

<xs:attributeGroup ref="hasId"/>
<xs:attributeGroup ref="hasIcon"/>
Expand Down Expand Up @@ -1886,9 +1884,9 @@
<xs:complexType name="textFieldComponent">
<xs:complexContent>
<xs:extension base="baseTextComponent">
<xs:sequence>
<xs:group ref="formatters" minOccurs="0"/>
</xs:sequence>
<xs:all>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:all>

<xs:attributeGroup ref="hasBuffered"/>
<xs:attributeGroup ref="hasDatatype"/>
Expand Down Expand Up @@ -2185,7 +2183,7 @@
<xs:sequence>
<xs:element name="actions" minOccurs="0" type="componentActions"/>
<xs:element name="validators" minOccurs="0" type="baseValidatorType"/>
<xs:element name="formatter" minOccurs="0" type="componentFormatter"/>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:sequence>

<xs:attributeGroup ref="hasBuffered"/>
Expand All @@ -2212,7 +2210,7 @@
<xs:sequence>
<xs:element name="actions" minOccurs="0" type="componentActions"/>
<xs:element name="validators" minOccurs="0" type="baseValidatorType"/>
<xs:element name="formatter" minOccurs="0" type="componentFormatter"/>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:sequence>

<xs:attributeGroup ref="hasBuffered"/>
Expand Down Expand Up @@ -2652,16 +2650,19 @@
<xs:sequence>
<xs:element name="aggregation" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:group ref="formatters" minOccurs="0"/>
</xs:sequence>
<xs:all>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:all>
<xs:attribute name="type" type="aggregation"/>
<xs:attribute name="editable" type="xs:boolean"/>
<xs:attribute name="strategyClass" type="xs:string"/>
<xs:attribute name="valueDescription" type="resourceString"/>
</xs:complexType>
</xs:element>
<xs:group ref="formatters" minOccurs="0"/>

<xs:all>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:all>
</xs:sequence>

<xs:attributeGroup ref="requiresId"/>
Expand Down Expand Up @@ -2769,9 +2770,10 @@
<xs:sequence>
<xs:element name="aggregation" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:group ref="formatters" minOccurs="0"/>
</xs:sequence>
<xs:all>
<xs:element name="formatter" minOccurs="0" type="formatterType"/>
</xs:all>

<xs:attribute name="type" type="aggregation"/>
<xs:attribute name="strategyClass" type="xs:string"/>
<xs:attribute name="valueDescription" type="resourceString"/>
Expand Down Expand Up @@ -4001,12 +4003,6 @@
</xs:sequence>
</xs:complexType>

<xs:complexType name="componentFormatter">
<xs:sequence>
<xs:group ref="formatters" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

<xs:simpleType name="columnAlignment">
<xs:restriction base="xs:string">
<xs:enumeration value="LEFT"/>
Expand Down
12 changes: 9 additions & 3 deletions ui/src/test/resources/formatter/screen/formatter-test-screen.xml
Expand Up @@ -17,13 +17,19 @@
<window xmlns="http://jmix.io/schema/ui/window">
<layout>
<label id="dateFormatterField">
<dateFormatter format="yyyy-MM-dd"/>
<formatter>
<date format="yyyy-MM-dd"/>
</formatter>
</label>
<label id="dateTimeFormatterField">
<dateFormatter type="DATETIME"/>
<formatter>
<date type="DATETIME"/>
</formatter>
</label>
<label id="numberFormatterField">
<numberFormatter format="#,###"/>
<formatter>
<number format="#,###"/>
</formatter>
</label>
<label id="defaultNumberFormatterField"/>
</layout>
Expand Down

0 comments on commit 1cf5a9a

Please sign in to comment.