Skip to content

Commit 7264d05

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 77635f9 commit 7264d05

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
@@ -536,6 +536,15 @@ under the License.
536536
</xs:annotation>
537537
</xs:attribute>
538538
</xs:attributeGroup>
539+
<xs:element name="vuejs" substitutionGroup="HtmlWidgets">
540+
<xs:complexType>
541+
<xs:sequence>
542+
<xs:element minOccurs="0" maxOccurs="unbounded" ref="parameter" />
543+
</xs:sequence>
544+
<xs:attribute type="xs:string" name="component-name" use="required" />
545+
<xs:attribute type="xs:string" name="param-map" />
546+
</xs:complexType>
547+
</xs:element>
539548
<xs:element name="html-template-decorator" substitutionGroup="HtmlWidgets">
540549
<xs:annotation>
541550
<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
@@ -40,6 +40,7 @@
4040
import org.apache.ofbiz.base.util.template.FreeMarkerWorker;
4141
import org.apache.ofbiz.security.CsrfUtil;
4242
import org.apache.ofbiz.webapp.SeoConfigUtil;
43+
import org.apache.ofbiz.widget.WidgetFactory;
4344
import org.apache.ofbiz.widget.renderer.ScreenRenderer;
4445
import org.apache.ofbiz.widget.renderer.ScreenStringRenderer;
4546
import org.apache.ofbiz.widget.renderer.html.HtmlWidgetRenderer;
@@ -130,6 +131,8 @@ public HtmlWidget(ModelScreen modelScreen, Element htmlElement) {
130131
subWidgets.add(new HtmlTemplate(modelScreen, childElement));
131132
} else if ("html-template-decorator".equals(childElement.getNodeName())) {
132133
subWidgets.add(new HtmlTemplateDecorator(modelScreen, childElement));
134+
} else if ("vuejs".equals(childElement.getNodeName())) {
135+
subWidgets.add(WidgetFactory.getModelScreenWidget(modelScreen, childElement));
133136
} else {
134137
throw new IllegalArgumentException("Tag not supported under the platform-specific -> html tag with name: "
135138
+ 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
@@ -1065,6 +1065,71 @@ public FlexibleStringExpander getStyleExdr() {
10651065
return styleExdr;
10661066
}
10671067
}
1068+
public static final class VueJs extends ModelScreenWidget {
1069+
public static final String TAG_NAME = "vuejs";
1070+
private final FlexibleStringExpander componentNameExdr;
1071+
private final List<Parameter> parameterList;
1072+
1073+
public VueJs(ModelScreen modelScreen, Element vueJsElement) {
1074+
super(modelScreen, vueJsElement);
1075+
1076+
this.componentNameExdr = FlexibleStringExpander.getInstance(vueJsElement.getAttribute("component-name"));
1077+
List<? extends Element> parameterElementList = UtilXml.childElementList(vueJsElement, "parameter");
1078+
if (parameterElementList.isEmpty() ) {
1079+
this.parameterList = Collections.emptyList();
1080+
} else {
1081+
List<Parameter> parameterList = new ArrayList<>(parameterElementList.size());
1082+
for (Element parameterElement : parameterElementList) {
1083+
parameterList.add(new Parameter(parameterElement));
1084+
}
1085+
this.parameterList = Collections.unmodifiableList(parameterList);
1086+
}
1087+
1088+
}
1089+
1090+
@Override
1091+
public void renderWidgetString(Appendable writer, Map<String, Object> context, ScreenStringRenderer screenStringRenderer) {
1092+
try {
1093+
screenStringRenderer.renderVueJs(writer, context, this);
1094+
} catch (IOException e) {
1095+
String errMsg = "Error rendering vue-js in screen named [" + getModelScreen().getName() + "]: " + e.toString();
1096+
Debug.logError(e, errMsg, MODULE);
1097+
throw new RuntimeException(errMsg);
1098+
}
1099+
}
1100+
1101+
public Map<String, Object> getParameterMap(Map<String, Object> context) {
1102+
Map<String, Object> fullParameterMap = new HashMap<>();
1103+
for (Parameter parameter : this.parameterList) {
1104+
Object retVal = null;
1105+
if (parameter.getValue() != null) {
1106+
retVal = parameter.getValue(context);
1107+
} else if (parameter.getFromField() != null && parameter.getFromField().get(context) != null) {
1108+
retVal = parameter.getFromField().get(context);
1109+
} else {
1110+
retVal = context.get(parameter.getName());
1111+
}
1112+
fullParameterMap.put(parameter.getName(), retVal);
1113+
}
1114+
return fullParameterMap;
1115+
}
1116+
1117+
public String getComponentName(Map<String, Object> context) {
1118+
return this.componentNameExdr.expandString(context);
1119+
}
1120+
1121+
public FlexibleStringExpander getComponentNameExdr() {
1122+
return componentNameExdr;
1123+
}
1124+
public List<Parameter> getParameterList() {
1125+
return parameterList;
1126+
}
1127+
1128+
@Override
1129+
public void accept(ModelWidgetVisitor visitor) throws Exception {
1130+
visitor.visit(this);
1131+
}
1132+
}
10681133

10691134
public static final class Form extends ModelScreenWidget {
10701135
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

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

234+
@Override
235+
public void visit(VueJs vuejs) throws Exception {
236+
writer.append("<vuejs");
237+
visitModelWidget(vuejs);
238+
visitAttribute("component-name", vuejs.getComponentNameExdr());
239+
writer.append(">");
240+
visitParameters(vuejs.getParameterList());
241+
writer.append("</label>");
242+
}
243+
233244
@Override
234245
public void visit(Menu menu) throws Exception {
235246
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
@@ -48,6 +48,7 @@ void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, M
4848
throws IOException;
4949
void renderLabel(Appendable writer, Map<String, Object> context, ModelScreenWidget.Label label) throws IOException;
5050
void renderLink(Appendable writer, Map<String, Object> context, ModelScreenWidget.ScreenLink link) throws IOException;
51+
void renderVueJs(Appendable writer, Map<String, Object> context, ModelScreenWidget.VueJs vuejs) throws IOException;
5152
void renderImage(Appendable writer, Map<String, Object> context, ModelScreenWidget.ScreenImage image) throws IOException;
5253

5354
void renderContentFrame(Appendable writer, Map<String, Object> context, ModelScreenWidget.Content content) throws IOException;

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
@@ -224,6 +224,10 @@ public void renderLabel(Appendable writer, Map<String, Object> context, ModelScr
224224
parameters.put("style", label.getStyle(context));
225225
executeMacro(writer, "renderLabel", parameters);
226226
}
227+
@Override
228+
public void renderVueJs(Appendable writer, Map<String, Object> context, ModelScreenWidget.VueJs vuejs) throws IOException {
229+
//TODO should be implemented
230+
}
227231

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

0 commit comments

Comments
 (0)