Skip to content

Commit 55fc095

Browse files
author
holivier
committed
Improved: add vuejs as children tag of html tag in screen (OFBIZ-11768)
this tag is used to call vuejs specifics component in the standard vuejs application (the vuejs renderer). vuejs specifics components are similar to ftl files in html standard renderer.
1 parent 12a892c commit 55fc095

File tree

8 files changed

+100
-0
lines changed

8 files changed

+100
-0
lines changed

framework/widget/dtd/widget-screen.xsd

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,15 @@ under the License.
534534
</xs:annotation>
535535
</xs:attribute>
536536
</xs:attributeGroup>
537+
<xs:element name="vuejs" substitutionGroup="HtmlWidgets">
538+
<xs:complexType>
539+
<xs:sequence>
540+
<xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" />
541+
</xs:sequence>
542+
<xs:attribute type="xs:string" name="component-name" use="required" />
543+
<xs:attribute type="xs:string" name="param-map" />
544+
</xs:complexType>
545+
</xs:element>
537546
<xs:element name="html-template-decorator" substitutionGroup="HtmlWidgets">
538547
<xs:annotation>
539548
<xs:documentation>

framework/widget/src/main/java/org/apache/ofbiz/widget/artifact/ArtifactInfoGatherer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
import org.apache.ofbiz.widget.model.ModelScreenWidget.Screenlet;
102102
import org.apache.ofbiz.widget.model.ModelScreenWidget.Section;
103103
import org.apache.ofbiz.widget.model.ModelScreenWidget.Tree;
104+
import org.apache.ofbiz.widget.model.ModelScreenWidget.VueJs;
104105
import org.apache.ofbiz.widget.model.ModelSingleForm;
105106
import org.apache.ofbiz.widget.model.ModelTree;
106107
import org.apache.ofbiz.widget.model.ModelTree.ModelNode;
@@ -241,6 +242,10 @@ public void visit(IterateSectionWidget iterateSectionWidget) throws Exception {
241242
public void visit(Label label) throws Exception {
242243
}
243244

245+
@Override
246+
public void visit(VueJs vuejs) throws Exception {
247+
}
248+
244249
@Override
245250
public void visit(Menu menu) throws Exception {
246251
}

framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.apache.ofbiz.base.util.collections.MapStack;
4040
import org.apache.ofbiz.base.util.string.FlexibleStringExpander;
4141
import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
42+
import org.apache.ofbiz.widget.WidgetFactory;
4243
import org.apache.ofbiz.widget.renderer.ScreenRenderer;
4344
import org.apache.ofbiz.widget.renderer.ScreenStringRenderer;
4445
import org.apache.ofbiz.widget.renderer.html.HtmlWidgetRenderer;
@@ -126,6 +127,8 @@ public HtmlWidget(ModelScreen modelScreen, Element htmlElement) {
126127
subWidgets.add(new HtmlTemplate(modelScreen, childElement));
127128
} else if ("html-template-decorator".equals(childElement.getNodeName())) {
128129
subWidgets.add(new HtmlTemplateDecorator(modelScreen, childElement));
130+
} else if ("vuejs".equals(childElement.getNodeName())) {
131+
subWidgets.add(WidgetFactory.getModelScreenWidget(modelScreen, childElement));
129132
} else {
130133
throw new IllegalArgumentException("Tag not supported under the platform-specific -> html tag with name: "
131134
+ childElement.getNodeName());

framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,71 @@ public FlexibleStringExpander getStyleExdr() {
10691069
return styleExdr;
10701070
}
10711071
}
1072+
public static final class VueJs extends ModelScreenWidget {
1073+
public static final String TAG_NAME = "vuejs";
1074+
private final FlexibleStringExpander componentNameExdr;
1075+
private final List<Parameter> parameterList;
1076+
1077+
public VueJs(ModelScreen modelScreen, Element vueJsElement) {
1078+
super(modelScreen, vueJsElement);
1079+
1080+
this.componentNameExdr = FlexibleStringExpander.getInstance(vueJsElement.getAttribute("component-name"));
1081+
List<? extends Element> parameterElementList = UtilXml.childElementList(vueJsElement, "parameter");
1082+
if (parameterElementList.isEmpty() ) {
1083+
this.parameterList = Collections.emptyList();
1084+
} else {
1085+
List<Parameter> parameterList = new ArrayList<>(parameterElementList.size());
1086+
for (Element parameterElement : parameterElementList) {
1087+
parameterList.add(new Parameter(parameterElement));
1088+
}
1089+
this.parameterList = Collections.unmodifiableList(parameterList);
1090+
}
1091+
1092+
}
1093+
1094+
@Override
1095+
public void renderWidgetString(Appendable writer, Map<String, Object> context, ScreenStringRenderer screenStringRenderer) {
1096+
try {
1097+
screenStringRenderer.renderVueJs(writer, context, this);
1098+
} catch (IOException e) {
1099+
String errMsg = "Error rendering vue-js in screen named [" + getModelScreen().getName() + "]: " + e.toString();
1100+
Debug.logError(e, errMsg, MODULE);
1101+
throw new RuntimeException(errMsg);
1102+
}
1103+
}
1104+
1105+
public Map<String, Object> getParameterMap(Map<String, Object> context) {
1106+
Map<String, Object> fullParameterMap = new HashMap<>();
1107+
for (Parameter parameter : this.parameterList) {
1108+
Object retVal = null;
1109+
if (parameter.value != null) {
1110+
retVal = parameter.value.expandString(context);
1111+
} else if (parameter.fromField != null && parameter.fromField.get(context) != null) {
1112+
retVal = parameter.fromField.get(context);
1113+
} else {
1114+
retVal = context.get(parameter.name);
1115+
}
1116+
fullParameterMap.put(parameter.getName(), retVal);
1117+
}
1118+
return fullParameterMap;
1119+
}
1120+
1121+
public String getComponentName(Map<String, Object> context) {
1122+
return this.componentNameExdr.expandString(context);
1123+
}
1124+
1125+
public FlexibleStringExpander getComponentNameExdr() {
1126+
return componentNameExdr;
1127+
}
1128+
public List<Parameter> getParameterList() {
1129+
return parameterList;
1130+
}
1131+
1132+
@Override
1133+
public void accept(ModelWidgetVisitor visitor) throws Exception {
1134+
visitor.visit(this);
1135+
}
1136+
}
10721137

10731138
public static final class Form extends ModelScreenWidget {
10741139
public static final String TAG_NAME = "include-form";

framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelWidgetVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public interface ModelWidgetVisitor {
6868

6969
void visit(ModelScreenWidget.Label label) throws Exception;
7070

71+
void visit(ModelScreenWidget.VueJs vuejs) throws Exception;
72+
7173
void visit(ModelScreenWidget.ScreenLink link) throws Exception;
7274

7375
void visit(ModelScreenWidget.Menu menu) throws Exception;

framework/widget/src/main/java/org/apache/ofbiz/widget/model/XmlWidgetVisitor.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.apache.ofbiz.widget.model.ModelScreenWidget.Screenlet;
4545
import org.apache.ofbiz.widget.model.ModelScreenWidget.Section;
4646
import org.apache.ofbiz.widget.model.ModelScreenWidget.Tree;
47+
import org.apache.ofbiz.widget.model.ModelScreenWidget.VueJs;
4748
import org.apache.ofbiz.widget.model.ModelTree.ModelNode;
4849
import org.apache.ofbiz.widget.model.ModelTree.ModelNode.ModelSubNode;
4950

@@ -229,6 +230,16 @@ public void visit(Label label) throws Exception {
229230
writer.append("</label>");
230231
}
231232

233+
@Override
234+
public void visit(VueJs vuejs) throws Exception {
235+
writer.append("<vuejs");
236+
visitModelWidget(vuejs);
237+
visitAttribute("component-name", vuejs.getComponentNameExdr());
238+
writer.append(">");
239+
visitParameters(vuejs.getParameterList());
240+
writer.append("</label>");
241+
}
242+
232243
@Override
233244
public void visit(Menu menu) throws Exception {
234245
writer.append("<include-menu");

framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/ScreenStringRenderer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public interface ScreenStringRenderer {
4646

4747
public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException;
4848
public void renderLabel(Appendable writer, Map<String, Object> context, ModelScreenWidget.Label label) throws IOException;
49+
public void renderVueJs(Appendable writer, Map<String, Object> context, ModelScreenWidget.VueJs vuejs) throws IOException;
4950
public void renderLink(Appendable writer, Map<String, Object> context, ModelScreenWidget.ScreenLink link) throws IOException;
5051
public void renderImage(Appendable writer, Map<String, Object> context, ModelScreenWidget.ScreenImage image) throws IOException;
5152

framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/macro/MacroScreenRenderer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ public void renderLabel(Appendable writer, Map<String, Object> context, ModelScr
223223
parameters.put("style", label.getStyle(context));
224224
executeMacro(writer, "renderLabel", parameters);
225225
}
226+
@Override
227+
public void renderVueJs(Appendable writer, Map<String, Object> context, ModelScreenWidget.VueJs vuejs) throws IOException {
228+
//TODO should be implemented
229+
}
226230

227231
@Override
228232
public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException {

0 commit comments

Comments
 (0)