@Nonnull protected AggregatePresentationModelBuilder aggregateBuilder() { // FIXME: uses the column header names, should be an internal id instead return AggregatePresentationModelBuilder.newInstance() .with(JOB_EVENT, (Displayable) () -> jobEvent.getName()) .with(NOTES, (Displayable) () -> jobEvent.getDescription()) // FIXME: this is dynamically computed, can be slow - should be also cached .with(AMOUNT, (Displayable) () -> MONEY_FORMATTER.format(jobEvent.getEarnings()), STYLE_RIGHT_ALIGNED); }
return AggregatePresentationModelBuilder.newInstance() .with("Client", (Displayable) () -> ((CustomerSpi)project.getCustomer()).getName()) .with("Status", (Displayable) () -> project.getStatus().name()) .with("#", (Displayable) () -> project.getNumber()) .with("Name", (Displayable) () -> project.getName()) .with("Start Date", (Displayable) () -> DATE_FORMATTER.format(project.getStartDate()), new DefaultStyleable("right-aligned")) .with("Due Date", (Displayable) () -> DATE_FORMATTER.format(project.getEndDate()), new DefaultStyleable("right-aligned")) .with("Notes", (Displayable) () -> project.getNotes()) .with("Budget", (Displayable) () -> MONEY_FORMATTER.format(budget), new DefaultStyleable("right-aligned", budget.isEqualTo(Money.ZERO) ? "alerted" : "")) .with("Earnings", (Displayable) () -> MONEY_FORMATTER.format(earnings), new DefaultStyleable("right-aligned", earnings.greaterThan(budget) ? "alerted" : "", earnings.isEqualTo(budget) ? "green" : "")) .with("Time", (Displayable) () -> DURATION_FORMATTER.format(project.getDuration()), new DefaultStyleable("right-aligned")) .with("Invoiced", (Displayable) () -> MONEY_FORMATTER.format(invoicedEarnings), new DefaultStyleable("right-aligned", invoicedEarnings.greaterThan(earnings) ? "alerted" : "", invoicedEarnings.isEqualTo(earnings) ? "green" : "")) .create();
@Override @Nonnull protected AggregatePresentationModelBuilder aggregateBuilder() { return super.aggregateBuilder() .with(DATE, (Displayable) () -> DATE_FORMATTER.format(jobEvent.getDateTime().toLocalDate())) .with(HOURLY_RATE, new DefaultDisplayable("")) .with(TIME, (Displayable) () -> DURATION_FORMATTER.format(jobEvent.getDuration()), STYLE_RIGHT_ALIGNED); }
@Override @Nonnull public PresentationModel createPresentationModel (final @Nonnull Object... instanceRoles) { final Styleable styleable = new DefaultStyleable(getStyles()); return jobEvent.findChildren() .stream() .map(jobEvent -> (JobEventSpi)jobEvent) .sorted(comparing(JobEventSpi::getDateTime)) .map(jobEvent -> jobEvent.as(Presentable).createPresentationModel()) .collect(toCompositePresentationModel(aggregateBuilder().create(), styleable)); // FIXME: use SimpleCompositePresentable? }
/******************************************************************************************************************* * * Factory method for the PresentationModel of SimpleDciEntity instances. * ******************************************************************************************************************/ @Nonnull private PresentationModel pmFor (final @Nonnull SimpleDciEntity entity) { // FIXME: column names final Aggregate aggregate = AggregatePresentationModelBuilder.newInstance() .with("C1", new DefaultDisplayable(entity.getName())) .with("C2", new DefaultDisplayable("" + entity.getAttribute1())) .with("C3", new DefaultDisplayable("" + entity.getAttribute2())) .create(); final Selectable selectable = () -> onSelected(entity); final UserAction action1 = new UserActionSupport8(() -> action1(entity), new DefaultDisplayable("Action 1")); final UserAction action2 = new UserActionSupport8(() -> action2(entity), new DefaultDisplayable("Action 2")); final UserAction action3 = new UserActionSupport8(() -> action3(entity), new DefaultDisplayable("Action 3")); // No explicit Displayable here, as the one inside SimpleDciEntity is used. return new DefaultPresentationModel(entity, aggregate, selectable, UserActionProvider.of(action1, action2, action3)); }
@Override @Nonnull protected AggregatePresentationModelBuilder aggregateBuilder() { return super.aggregateBuilder() .with(DATE, (Displayable) () -> DATETIME_FORMATTER.format(jobEvent.getStartDateTime())) .with(TIME, (Displayable) () -> DURATION_FORMATTER.format(computeDuration()), STYLE_RIGHT_ALIGNED) .with(HOURLY_RATE, (Displayable) () -> MONEY_FORMATTER.format(jobEvent.getHourlyRate()), STYLE_RIGHT_ALIGNED); }
@Override public PresentationModel createPresentationModel (final @Nonnull Object... instanceRoles) { final Styleable styleable = new DefaultStyleable(getStyles()); return new DefaultPresentationModel("", aggregateBuilder().create(), styleable); }
@Override @Nonnull protected AggregatePresentationModelBuilder aggregateBuilder() { return super.aggregateBuilder() .with(DATE, (Displayable) () -> DATE_FORMATTER.format(jobEvent.getDate())) .with(TIME, new DefaultDisplayable("")) .with(HOURLY_RATE, new DefaultDisplayable("")) .with(AMOUNT , (Displayable) () -> MONEY_FORMATTER.format(jobEvent.getEarnings()), new DefaultStyleable("right-aligned"), new RedStyleForNegativeMoney(jobEvent::getEarnings)); }