public EffectiveTableModel(FormSource formSource, FormTree formTree, TableModel tableModel, Optional<Observable<Optional<RecordRef>>> selectedParentRef) { this.formTree = formTree; this.tableModel = tableModel; this.selectedParentRef = selectedParentRef; this.columns = new ArrayList<>(); if(formTree.getRootState() == FormTree.State.VALID) { if (tableModel.getColumns().isEmpty()) { addDefaultColumns(formTree); } else { for (TableColumn tableColumn : tableModel.getColumns()) { columns.add(new EffectiveTableColumn(formTree, tableColumn)); } } } if(selectedParentRef.isPresent()) { // For sub form views, the columnset depends on the selection this.columnSet = selectedParentRef.get().join(parentRecord -> { if(parentRecord.isPresent()) { return formSource.query(buildQuery(columns, parentRecord.get())); } else { return Observable.just(emptyColumnSet(columns)); } }); } else { this.columnSet = formSource.query(buildQuery(columns)); } }
@Override public void updateColumnWidth(String columnId, int newWidth) { TableModel model = this.tableModel.get(); List<TableColumn> updatedColumns = new ArrayList<>(); for (TableColumn column : model.getColumns()) { if(column.getId().equals(columnId)) { updatedColumns.add(ImmutableTableColumn.builder().from(column).width(newWidth).build()); } else { updatedColumns.add(column); } } tableModel.updateIfNotSame(ImmutableTableModel.builder() .from(model) .columns(updatedColumns) .build()); }
@Value.Lazy @Override public JsonValue toJson() { JsonValue object = Json.createObject(); object.put("formId", getFormId().asString()); if(getColumns().size() != 0) { JsonValue columnArray = Json.createArray(); for (TableColumn tableColumn : getColumns()) { columnArray.add(tableColumn.toJson()); } object.put("columns", columnArray); } if (getFilter().isPresent()) { object.put("filter", getFilter().get()); } if (getSorting().size() != 0) { JsonValue columnArray = Json.createArray(); for (SortModel sortModel : getSorting()) { columnArray.add(sortModel.toJson()); } object.put("columns", columnArray); } return object; }
@Test public void serializeModel() { ImmutableTableModel model = ImmutableTableModel.builder() .formId(ResourceId.valueOf("MY_FORM")) .addColumns(ImmutableTableColumn.builder().id("c1").label("Foo Squared").formula("foo*foo").build()) .addColumns(ImmutableTableColumn.builder().id("c2").formula("foo").build()) .build(); JsonValue object = model.toJson(); TableModel remodel = TableModel.fromJson(object); assertThat(remodel.getFormId(), equalTo(model.getFormId())); assertThat(remodel.getColumns(), hasSize(2)); assertThat(remodel.getColumns().get(0), equalTo(model.getColumns().get(0))); assertThat(remodel.getColumns().get(1), equalTo(model.getColumns().get(1))); }
@Test public void testSubFormExport() { IncidentForm incidentForm = setup.getCatalog().getIncidentForm(); TableModel tableModel = ImmutableTableModel.builder().formId(incidentForm.getFormId()) .addColumns(ImmutableTableColumn.builder() .label("My PCODE") .formula(IncidentForm.PROTECTION_CODE_FIELD_ID.asString()) .build()) .build(); TableViewModel viewModel = new TableViewModel(setup.getFormStore(), tableModel); Observable<ExportViewModel> exportModel = viewModel.computeExportModel( Observable.just(ReferralSubForm.FORM_ID), Observable.just(ExportScope.SELECTED)); Connection<TableModel> exportModelConnection = setup.connect(exportModel.transform(ExportViewModel::getTableModel)); Connection<Boolean> columnLimitConnection = setup.connect(exportModel.transform(ExportViewModel::isColumnLimitExceeded)); System.out.println(Json.stringify(exportModelConnection.assertLoaded().toJson(), 2)); assertThat(exportModelConnection.assertLoaded().getFormId(), equalTo(ReferralSubForm.FORM_ID)); assertThat(exportModelConnection.assertLoaded().getColumns(), hasSize(3)); assertThat(columnLimitConnection.assertLoaded(), equalTo(false)); TableColumn firstColumn = exportModelConnection.assertLoaded().getColumns().get(0); assertThat(firstColumn.getLabel(), equalTo(Optional.of("My PCODE"))); assertThat(firstColumn.getFormula(), equalTo( new CompoundExpr(new SymbolNode(ColumnModel.PARENT_SYMBOL), IncidentForm.PROTECTION_CODE_FIELD_ID).asExpression())); }
@Test public void testSubFormExportWithFilter() { IncidentForm incidentForm = setup.getCatalog().getIncidentForm(); TableModel tableModel = ImmutableTableModel.builder().formId(incidentForm.getFormId()) .addColumns(ImmutableTableColumn.builder() .label("My PCODE") .formula(IncidentForm.PROTECTION_CODE_FIELD_ID.asString()) .build()) .filter(constructFilter()) .build(); TableViewModel viewModel = new TableViewModel(setup.getFormStore(), tableModel); Connection<TableModel> exportModel = setup.connect( viewModel.computeExportModel( Observable.just(ReferralSubForm.FORM_ID), Observable.just(ExportScope.SELECTED), Observable.just(ExportScope.SELECTED), Observable.just(ExportFormat.XLS)) .transform(ExportViewModel::getTableModel)); System.out.println(Json.stringify(exportModel.assertLoaded().toJson(), 2)); assertThat(exportModel.assertLoaded().getFormId(), equalTo(ReferralSubForm.FORM_ID)); assertThat(exportModel.assertLoaded().getColumns(), hasSize(3)); assertThat(exportModel.assertLoaded().getFilter(), equalTo(Optional.of(constructFilter()))); }