public FormTree parentTree() { FormClass rootFormClass = getRootFormClass(); assert rootFormClass.isSubForm(); ResourceId parentFormId = rootFormClass.getParentFormId().get(); return subTree(parentFormId); }
@Override public void addField(ResourceId fieldId, CursorObserver<FieldValue> observer) { if(fieldId.asString().equals("@parent")) { recordObservers.add(new ParentObserver(formClass.getParentFormId().get(), observer)); } else { FormField field = formClass.getField(fieldId); FieldObserver fieldObserver = new FieldObserver(field.getName(), field.getType(), observer); recordObservers.add(fieldObserver); } }
/** * Returns a {@code FormField} of type {@code ReferenceType} that will refer to the master submission * of a subform. * * <p>If this {@code FormClass} is a sub form of another form, then each of its {@code FormSubmissions} will * have a {@code @parent} field value that refers back to the master form instance. There is no corresponding * {@code FormField} instance in this {@code FormClass}'s field list, because it is not a user-editable field.</p> */ public Optional<FormField> getParentField() { Optional<ResourceId> parentFormId = getParentFormId(); if(parentFormId.isPresent()) { FormField formField = new FormField(PARENT_FIELD_ID); formField.setLabel("Parent"); formField.setType(ReferenceType.single(parentFormId.get())); return Optional.of(formField); } else { return Optional.absent(); } }
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; } }
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); }
@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; }
@Override public void execute() { for (TypedFormRecord record : records) { for (CursorObserver<ResourceId> idObserver : idObservers) { idObserver.onNext(record.getId()); } for (CursorObserver<FieldValue> parentObserver : parentObservers) { parentObserver.onNext(new ReferenceValue(new RecordRef(formClass.getParentFormId().get(), record.getParentRecordId()))); } for (Map.Entry<ResourceId, CursorObserver<FieldValue>> field : fieldObservers.entries()) { ResourceId fieldId = field.getKey(); FieldValue fieldValue = record.get(fieldId); CursorObserver<FieldValue> observer = field.getValue(); observer.onNext(fieldValue); } } for (CursorObserver<ResourceId> observer : idObservers) { observer.done(); } for (CursorObserver<FieldValue> parentObserver : parentObservers) { parentObserver.done(); } for (CursorObserver<FieldValue> observer : fieldObservers.values()) { observer.done(); } } }
tree.addFormMetadata(root); FormTree.Node node = tree.addRootField(root, parentField.get()); fetchChildren(stack, tree, node, rootSchema.getParentFormId().asSet());
RecordRef parentRef = new RecordRef(formClass.getParentFormId().get(), ResourceId.valueOf(parentRecordId)); ReferenceValue parent = new ReferenceValue(parentRef); for (CursorObserver<FieldValue> parentFieldObserver : parentFieldObservers) {
if (formClass.getParentFormId().isPresent()) { ResourceId parentId = update.getParentId(); if (parentId == null) {