protected FormInstance flatColumnData(FormInstance formInstance) { if (formInstance.getLayout() != null) { for (LayoutRow row : formInstance.getLayout().getRows()) { row.getColumns().forEach(c -> c.flatItems()); } } return formInstance; } }
protected List<LayoutItem> collectItems(LayoutRow row) { List<LayoutItem> collected = new ArrayList<>(); for (LayoutColumn column : row.getColumns()) { collected.addAll(column.getItems()); for (LayoutRow nestedRow : column.getRows()) { collected.addAll(collectItems(nestedRow)); } } return collected; } }
public void addNestedForm(FormInstance nestedForm) { this.nestedForms.put(nestedForm.getId(), nestedForm); }
protected FormInstance generateDefaultProcessForm(ProcessDefinition processDesc) { FormInstance form = new FormInstance(); form.setId(UUID.randomUUID().toString()); form.setName("Default form - " + processDesc.getName()); form.setModel(new FormModel()); form.setFields(new ArrayList<>()); FormLayout layout = new FormLayout(); layout.setRows(new ArrayList<>()); form.setLayout(layout); FormField field = new FormField(); field.setId(UUID.randomUUID().toString()); field.setBinding(entry.getKey()); field.setCode(entry.getValue().contains("Boolean")?"CheckBox" :"TextBox"); field.setLabel(entry.getKey()); field.setName(entry.getKey()); field.setType(entry.getValue()); form.getFields().add(field); LayoutRow row = new LayoutRow(); layout.getRows().add(row); row.setColumns(new ArrayList<>()); LayoutColumn column = new LayoutColumn(); column.setSpan("12"); column.setItems(new ArrayList<>());
boolean wrapJson, List<String> scriptDataList) { FormLayout layout = form.getLayout(); if (form.getModel().getClassName() != null && wrapJson) { jsonTemplate .append("'") .append(form.getModel().getName()) .append("' : ") .append("{") .append("'") .append(form.getModel().getClassName()) .append("' : ") .append("{"); for (LayoutRow row : layout.getRows()) { row.setHeader(form.getName()); for (LayoutColumn column : row.getColumns()) { for (LayoutItem item : column.getItems()) { if (item.getValue() != null) { String output = item.getValue(); if (output.contains("${")) { String uuid = UUID.randomUUID().toString();; loadTemplate(fieldLevelStringLoader, uuid, new ByteArrayInputStream(item.getValue().getBytes(Charset.forName("UTF-8")))); Map<String, Object> parameters = new HashMap<>(); parameters.putAll(inputs); FormField field = form.getField(item.getFieldId());
FormInstance nestedForm = topLevelForm.getNestedForm(field.getCreationForm()); if (nestedForm == null) { throw new RuntimeException("Unable to find creation form with form id " + field.getCreationForm()); for (TableInfo tableInfo : field.getTableInfo()) { FormField nestedField = nestedForm.getFieldByBinding(tableInfo.getProperty()); String jsType = getFieldType(nestedField.getType()); tableInfo.setType(jsType); Object bindingData = outputs.get(field.getBinding()); if (bindingData == null) { bindingData = inputs.get(field.getBinding()); mappedData.put("table_" + field.getId() + "_" + index, data); index++; String loadDataScript = "tableData.set('table_" + field.getId() +"', new Map(Object.entries(JSON.parse('" + jsonData + "'))));"; scriptDataList.add(loadDataScript); scriptDataList.add(buildFunctionWithBody("formData_" + field.getId(), " return " + creationJsonTemplate.toString() + ";")); FormLayout nestedLayout = nestedForm.getLayout(); Map<String, Object> parameters = new HashMap<>(); parameters.put("rows", nestedLayout.getRows()); String output = renderTemplate(layoutTemplate, parameters); parameters.put("tableColumns", field.getTableInfo()); parameters.put("tableData", bindingData);
StringBuilder content) { FormInstance nestedForm = topLevelForm.getNestedForm(field.getNestedForm()); if (nestedForm == null) { throw new RuntimeException("Unable to find nested form with form id " + field.getNestedForm()); Object binding = outputs.get(field.getBinding()); if (binding == null) { binding = inputs.get(field.getBinding()); Map<String, Object> nestedDataExtracted = reader.extractValues(binding); nestedInputs.putAll(nestedDataExtracted); parameters.put("header", nestedForm.getName()); String output = renderTemplate(HEADER_LAYOUT_TEMPLATE, parameters); content.append(output); FormLayout nestedLayout = nestedForm.getLayout(); parameters.put("rows", nestedLayout.getRows()); output = renderTemplate(layoutTemplate, parameters);
FormLayout layout = form.getLayout(); StringBuilder jsonTemplate = new StringBuilder(); parameters.put("rows", layout.getRows()); parameters.put("renderButtons", true); String output = renderTemplate(PROCESS_LAYOUT_TEMPLATE, parameters); parameters.put(HEADER_LAYOUT_TEMPLATE, form.getName()); parameters.put("body", output); parameters.put("scriptData", buildScriptData(scriptDataList));
@Override public LayoutItem deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectCodec oc = p.getCodec(); JsonNode node = oc.readTree(p); JsonNode propertiesNode = node.get("properties"); LayoutItem item = new LayoutItem(); if (propertiesNode.has("field_id")) { item.setFieldId(propertiesNode.get("field_id").asText()); item.setFormId(propertiesNode.get("form_id").asText()); } else if (propertiesNode.has("HTML_CODE")) { item.setValue(propertiesNode.get("HTML_CODE").asText()); } return item; }
public String getCaseRenderedForm(String renderer, String containerId, String caseDefinitionId) { if (caseRuntimeDataService == null) { throw new RuntimeException("Case capability in jBPM UI are not enabled"); } String resolvedContainerId = registry.getContainerId(containerId, ContainerLocatorProvider.get().getLocator()); CaseDefinition caseDefinition = caseRuntimeDataService.getCase(resolvedContainerId, caseDefinitionId); if (caseDefinition == null) { throw new CaseDefinitionNotFoundException("Case definition " + resolvedContainerId + " : " + caseDefinitionId + " not found"); } String formStructure = formManagerService.getFormByKey(resolvedContainerId, caseDefinitionId + SUPPORTED_FORM_SUFFIX); FormInstance form = formReader.readFromString(formStructure); if (form != null) { form.setNestedFormsLookup(formId -> { Map<String, String> forms = indexedForms.get(resolvedContainerId); String formStructureNested = forms.get(formId); return formReader.readFromString(formStructureNested); }); } FormRenderer formRenderer = renderers.get(renderer); if (formRenderer == null) { throw new IllegalArgumentException("Form renderer with name " + renderer + " not found"); } String output = formRenderer.renderCase(resolvedContainerId, caseDefinition, form); return output; }
public void flatItems() { if (rows != null && !rows.isEmpty()) { for (LayoutRow row : rows) { this.items.addAll(collectItems(row)); } } }
public FormField getField(String fieldId) { return fields.stream().filter(f -> f.getId().equals(fieldId)).findFirst().get(); }
public FormField getFieldByBinding(String binding) { return fields.stream().filter(f -> f.getBinding().equals(binding)).findFirst().get(); }
protected FormInstance generateDefaultTaskForm(Task task, Map<String, String> inputs, Map<String, String> outputs) { FormInstance form = new FormInstance(); form.setId(UUID.randomUUID().toString()); form.setName("Default form - " + task.getName()); form.setModel(new FormModel()); form.setFields(new ArrayList<>()); FormLayout layout = new FormLayout(); layout.setRows(new ArrayList<>()); form.setLayout(layout); FormField field = new FormField(); field.setId(UUID.randomUUID().toString()); field.setBinding(entry.getKey()); field.setCode(entry.getValue().contains("Boolean")?"CheckBox" :"TextBox"); field.setLabel(entry.getKey()); field.setName(entry.getKey()); field.setType(entry.getValue()); field.setReadOnly(true); form.getFields().add(field); LayoutRow row = new LayoutRow(); layout.getRows().add(row); row.setColumns(new ArrayList<>()); LayoutColumn column = new LayoutColumn(); column.setSpan("12");
FormLayout layout = form.getLayout(); processFormLayout(form, form, Collections.emptyMap(), Collections.emptyMap(), CASE_LAYOUT_TEMPLATE, jsonTemplate, true, scriptDataList); .append("}"); rows = layout.getRows(); } else { jsonTemplate parameters.put(HEADER_LAYOUT_TEMPLATE, form != null ? form.getName() : "Case form"); parameters.put("body", output); parameters.put("scriptData", buildScriptData(scriptDataList));
form.setNestedFormsLookup(formId -> { Map<String, String> forms = indexedForms.get(resolvedContainerId); String formStructureNested = forms.get(formId);
public void indexDeploymentForms(String containerId) { Map<String, String> forms = formManagerService.getAllFormsByDeployment(containerId); if (forms != null) { List<String> supportedFormsOnly = forms.entrySet() .stream() .filter( entry -> entry.getKey().endsWith( ".frm" ) ) .map( entry -> entry.getValue() ) .collect(Collectors.toList()); if (!supportedFormsOnly.isEmpty()) { Map<String, String> formsByDeployment = new HashMap<>(); indexedForms.put(containerId, formsByDeployment); for (String formContent : supportedFormsOnly) { String formId = formReader.readFromString(formContent).getId(); formsByDeployment.put(formId, formContent); } } } }
public String renderTask(String containerId, Task task, FormInstance form, Map<String, Object> inputs, Map<String, Object> outputs) { List<String> scriptDataList = new ArrayList<>(); FormLayout layout = form.getLayout(); StringBuilder jsonTemplate = new StringBuilder(); parameters.put("rows", layout.getRows()); parameters.put("renderButtons", true); String output = renderTemplate(TASK_LAYOUT_TEMPLATE, parameters); parameters.put(HEADER_LAYOUT_TEMPLATE, form.getName()); parameters.put("body", output); parameters.put("scriptData", buildScriptData(scriptDataList));
form = generateDefaultTaskForm(task, inputs, outputs); form.setNestedFormsLookup(formId -> { Map<String, String> forms = indexedForms.get(resolvedContainerId); String formStructureNested = forms.get(formId);