public SubFormKind getSubFormKind() { if(!isSubForm()) { throw new IllegalStateException("Not a sub form"); } return subFormKind; }
public Set<RepeatingSubFormPanel> getRepeatingSubformPanels() { Set<RepeatingSubFormPanel> set = Sets.newHashSet(); for (Map.Entry<FormClass, SubFormPanel> entry : subformPanels.entrySet()) { if (entry.getKey().isSubForm() && entry.getKey().getSubFormKind() == SubFormKind.REPEATING) { set.add((RepeatingSubFormPanel) entry.getValue()); } } return set; }
public FormTree parentTree() { FormClass rootFormClass = getRootFormClass(); assert rootFormClass.isSubForm(); ResourceId parentFormId = rootFormClass.getParentFormId().get(); return subTree(parentFormId); }
private Optional<FormField> findKeyField(FormClass formClass) { if(formClass.isSubForm() && formClass.getSubFormKind().isPeriod()) { for (FormField formField : formClass.getFields()) { if(formField.getType() instanceof PeriodType && formField.isKey()) { return Optional.of(formField); } } } return Optional.empty(); }
private Slot<TableFilter> computeParentFilter(FilterLevel filterLevel, ResourceId formId) { if(parentFilterMap.containsKey(formId)) { return parentFilterMap.get(formId); } FormClass formClass = formClassProvider.getFormClass(formId); if(!formClass.isSubForm()) { return new PendingSlot<>(TableFilter.ALL_SELECTED); } Slot<PrimaryKeyMap> parentPrimaryKeySlot = addPrimaryKey(filterLevel, formClass.getParentFormId().get()); Slot<ColumnView> parentId = addParentColumn(FilterLevel.NONE, formId); ParentMask filter = new ParentMask(parentPrimaryKeySlot, parentId); parentFilterMap.put(formId, filter); return filter; } }
@Override public void addField(ResourceId fieldId, CursorObserver<FieldValue> observer) { if(fieldId.equals(SubFormPatch.PERIOD_FIELD_ID)) { addResourceId(SubFormPatch.fromRecordId(formClass, observer)); return; } if(fieldId.equals(FormClass.PARENT_FIELD_ID)) { if(!formClass.isSubForm()) { throw new IllegalStateException("Form " + formClass.getId() + " is not a sub form"); } parentObservers.add(observer); } else { fieldObservers.put(fieldId, observer); } }
private boolean isSubFormKey(FormClass owner, FormElement element) { if(element instanceof FormField) { FormField field = (FormField) element; return owner.isSubForm() && owner.getSubFormKind().isPeriod() && field.isKey() && field.getType() instanceof PeriodType; } return true; }
public static FormClass patch(FormClass formClass) { if(formClass.isSubForm()) { if(formClass.getSubFormKind().isPeriod()) { return ensureSubFormHasPeriodField( removeExtraSubFormPeriodField(formClass)); } } return formClass; }
private void authorizeCreate(TypedFormRecord record, FormPermissions formPermissions, FormClass formClass) { if (formClass.isSubForm()){ if (!formPermissions.isCreateAllowed()) { throw new InvalidUpdateException("Unauthorized creation"); } } else if (!PermissionOracle.canCreate(record, formPermissions, formClass)) { throw new InvalidUpdateException("Unauthorized creation"); } }
private void authorizeEdit(TypedFormRecord record, FormPermissions formPermissions, FormClass formClass) { if (formClass.isSubForm()){ if (!formPermissions.isEditAllowed()) { throw new InvalidUpdateException("Unauthorized modification"); } } else if (!PermissionOracle.canEdit(record, formPermissions, formClass)) { throw new InvalidUpdateException("Unauthorized modification"); } }
private void authorizeDelete(TypedFormRecord record, FormPermissions formPermissions, FormClass formClass) { if (formClass.isSubForm()){ if (!formPermissions.isDeleteAllowed()) { throw new InvalidUpdateException("Unauthorized deletion"); } } else if (!PermissionOracle.canDelete(record, formPermissions, formClass)) { throw new InvalidUpdateException("Unauthorized deletion"); } }
private boolean isSubFormKey(FormTree.Node node) { return node.getDefiningFormClass().isSubForm() && node.getField().isKey() && node.getType() instanceof PeriodType; }
public boolean isParentReference() { if(!form.getSchema().isSubForm()) { return false; } if(!(field.getType() instanceof ReferenceType)) { return false; } ReferenceType type = (ReferenceType) getType(); if(type.getRange().size() != 1) { return false; } ResourceId rangeFormId = Iterables.getOnlyElement(type.getRange()); ResourceId parentFormId = form.getSchema().getParentFormId().get(); return rangeFormId.equals(parentFormId); }
public Optional<TypedFormRecord> getWorkingInstance(ResourceId formFieldId, String keyId) { FormClass classByField = getClassByField(formFieldId); if (classByField.equals(rootFormClass)) { return Optional.of(getWorkingRootInstance()); } if (classByField.isSubForm()) { Optional<TypedFormRecord> valueInstance = getSubformValueInstance(classByField, getWorkingRootInstance(), keyId); if (valueInstance.isPresent()) { return valueInstance; } else { TypedFormRecord newInstance = new TypedFormRecord(ResourceId.generatedPeriodSubmissionId(getWorkingRootInstance().getId(), keyId), classByField.getId()); newInstance.setParentRecordId(getWorkingRootInstance().getId()); SubformValueKey valueKey = new SubformValueKey(classByField, getWorkingRootInstance()); Set<TypedFormRecord> allInstances = subFormInstances.get(valueKey); if (allInstances == null) { allInstances = Sets.newHashSet(); subFormInstances.put(valueKey, allInstances); } allInstances.add(newInstance); return Optional.of(newInstance); } } throw new RuntimeException("Failed to identify working instance for field: " + formFieldId + ", keyId: " + keyId); }
@Override public Iterable<ResourceId> getChildren(FormMetadata node) { Set<ResourceId> children = new HashSet<>(); if(node.isAccessible()) { assert node.getSchema() != null : "Missing schema " + node.getId(); if(node.getSchema().isSubForm()) { children.add(node.getSchema().getParentFormId().get()); } for (FormField field : node.getFields()) { if (field.getType() instanceof ReferenceType) { ReferenceType type = (ReferenceType) field.getType(); for (ResourceId childId : type.getRange()) { children.add(childId); } } else if (field.getType() instanceof SubFormReferenceType) { SubFormReferenceType type = (SubFormReferenceType) field.getType(); children.add(type.getClassId()); } } } return children; }
/** * Returns selected key/tab for given field or otherwise null if nothing is selected or it is root instance (no key). * * @return selected key/tab for given field or otherwise null if nothing is selected or it is root instance (no key). */ public String getSelectedKey(FormField field) { FormClass formClass = model.getClassByField(field.getId()); if (formClass.isSubForm()) { SubFormPanel subformPanel = widgetCreator.getSubformPanel(formClass); if (subformPanel instanceof PeriodSubFormPanel) { PeriodSubFormPanel periodSubFormPanel = (PeriodSubFormPanel) subformPanel; Tab selectedTab = periodSubFormPanel.getSelectedTab(); if (selectedTab != null) { return selectedTab.getId(); } } } return null; }
public void onFieldUpdated(FormField field, FieldValue newValue) { Optional<TypedFormRecord> workingInstance = model.getWorkingInstance(field.getId(), getSelectedKey(field)); if (workingInstance.isPresent()) { if (!Objects.equals(workingInstance.get().get(field.getId()), newValue)) { workingInstance.get().set(field.getId(), newValue); relevanceHandler.onValueChange(); // skip handler must be applied after workingInstance is updated } validateField(widgetCreator.get(field.getId())); model.getChangedInstances().add(workingInstance.get()); } else { FormClass formClass = model.getClassByField(field.getId()); if (formClass.isSubForm()) { widgetCreator.get(field.getId()).setInvalid(I18N.CONSTANTS.subFormTabNotSelected()); widgetCreator.get(field.getId()).getFieldWidget().clearValue(); } } }
private void addDefaultColumns(FormTree formTree) { if(!isSubTable() && formTree.getRootFormClass().isSubForm()) { addDefaultColumns(formTree.parentTree()); } for (FormTree.Node node : formTree.getRootFields()) { if(node.getField().isVisible()) { if (isSimple(node.getType())) { columns.add(new EffectiveTableColumn(formTree, defaultColumnModel(node))); } else if (node.getType() instanceof ReferenceType && !node.isParentReference()) { addKeyColumns(columns, node); } } } }
private static String label(FormTree.Node node) { if (node.isRoot()) { return node.fieldLabel(); } else if (node.getParent().isRoot() && node.getParent().getDefiningFormClass().isSubForm()) { return node.fieldLabel(); } else if (node.getParent().isRoot() && node.getParent().getDefiningFormClass().getId().getDomain() == CuidAdapter.MONTHLY_REPORT_FORM_CLASS) { return node.fieldLabel(); } else { return node.formFieldLabel(); } }
@Test public void importSurveyForm() { PastedTable pastedTable = new PastedTable(expectedSurveyExport); SchemaImporterV3 importer = new SchemaImporterV3(database.getId(), null, null); assertTrue("columns found", importer.parseColumns(pastedTable)); boolean success = importer.processRows(); for (SafeHtml warning : importer.getWarnings()) { System.out.println(warning); } assertTrue(success); List<FormClass> formClasses = importer.toSave(); formClassProvider.addAll(formClasses); FormTreeBuilder treeBuilder = new FormTreeBuilder(formClassProvider); FormTreePrettyPrinter prettyPrinter = new FormTreePrettyPrinter(); for (FormClass formClass : formClasses) { if(!formClass.isSubForm()) { prettyPrinter.printTree(treeBuilder.queryTree(formClass.getId())); } } }