/** * Removes selected items from the list component with confirmation dialog. <br> * After confirmation removes items from DB if the bound container is not nested. * * @param target list component * @param <E> entity type */ public <E extends Entity> void removeSelected(ListComponent<E> target) { builder(target) .withConfirmation(true) .remove(); }
protected <E extends Entity> void removeItems(RemoveBuilder<E> builder, List<E> selectedItems) { FrameOwner origin = builder.getOrigin(); ScreenData screenData = UiControllerUtils.getScreenData(origin); CollectionContainer<E> container = getCollectionContainer(builder); commitIfNeeded(selectedItems, container, screenData); if (selectedItems.size() == 1) { container.getMutableItems().remove(selectedItems.get(0)); } else { container.getMutableItems().removeAll(selectedItems); } focusListComponent(builder); }
protected <E extends Entity> void triggerAction(RemoveBuilder<E> builder) { List<E> selectedItems = Collections.emptyList(); if (builder.getItems() != null) { selectedItems = builder.getItems(); } else if (builder.getListComponent() != null) { selectedItems = new ArrayList<>(builder.getListComponent().getSelected()); } if (!selectedItems.isEmpty()) { if (builder.isConfirmationRequired()) { performActionWithConfirmation(builder, selectedItems); } else { performAction(builder, selectedItems); } } }
protected <E extends Entity> void performAction(RemoveBuilder<E> builder, List<E> selectedItems) { if (builder.getBeforeActionPerformedHandler() != null) { BeforeActionPerformedEvent<E> event = new BeforeActionPerformedEvent<>(builder.getOrigin(), selectedItems); builder.getBeforeActionPerformedHandler().accept(event); if (event.isActionPrevented()) { // do not perform action return; } } if (builder.getOperation() == Operation.EXCLUDE) { excludeItems(builder, selectedItems); } else { removeItems(builder, selectedItems); } if (builder.getAfterActionPerformedHandler() != null) { AfterActionPerformedEvent<E> event = new AfterActionPerformedEvent<>(builder.origin, selectedItems); builder.getAfterActionPerformedHandler().accept(event); } }
@SuppressWarnings("unchecked") protected <E extends Entity> void excludeItems(RemoveBuilder<E> builder, List<E> selectedItems) { CollectionContainer<E> container = getCollectionContainer(builder); if (!(container instanceof Nested)) { throw new IllegalArgumentException("Exclude action supports only Nested containers"); } InstanceContainer masterDc = ((Nested) container).getMaster(); String property = ((Nested) container).getProperty(); Entity masterItem = masterDc.getItem(); MetaProperty metaProperty = masterItem.getMetaClass().getPropertyNN(property); MetaProperty inverseMetaProperty = metaProperty.getInverse(); if (inverseMetaProperty != null && !inverseMetaProperty.getRange().getCardinality().isMany()) { Class inversePropClass = extendedEntities.getEffectiveClass(inverseMetaProperty.getDomain()); Class dcClass = extendedEntities.getEffectiveClass(container.getEntityMetaClass()); if (inversePropClass.isAssignableFrom(dcClass)) { // update reference for One-To-Many for (Entity item : selectedItems) { item.setValue(inverseMetaProperty.getName(), null); } } } container.getMutableItems().removeAll(selectedItems); focusListComponent(builder); }
@SuppressWarnings("CodeBlock2Expr") protected <E extends Entity> void performActionWithConfirmation(RemoveBuilder<E> builder, List<E> selectedItems) { ScreenContext screenContext = getScreenContext(builder.getOrigin()); Dialogs dialogs = screenContext.getDialogs(); String title = builder.getConfirmationTitle() != null ? builder.getConfirmationTitle() : messages.getMainMessage("dialogs.Confirmation"); String message = builder.getConfirmationTitle() != null ? builder.getConfirmationTitle() : messages.getMainMessage("dialogs.Confirmation.Remove"); dialogs.createOptionDialog() .withCaption(title) .withMessage(message) .withActions( new DialogAction(DialogAction.Type.YES).withHandler(e -> { performAction(builder, selectedItems); }), new DialogAction(DialogAction.Type.NO).withHandler(e -> { focusListComponent(builder); if (builder.getActionCancelledHandler() != null) { ActionCancelledEvent<E> event = new ActionCancelledEvent<>(builder.getOrigin(), selectedItems); builder.getActionCancelledHandler().accept(event); } }) ) .show(); }
@SuppressWarnings("unchecked") @Override public void actionPerform(Component component) { // if standard behaviour if (!hasSubscriptions(ActionPerformedEvent.class)) { if (!(target.getItems() instanceof ContainerDataUnit)) { throw new IllegalStateException("ExcludeAction target items is null or does not implement ContainerDataUnit"); } ContainerDataUnit items = (ContainerDataUnit) target.getItems(); CollectionContainer container = items.getContainer(); if (container == null) { throw new IllegalStateException("ExcludeAction target is not bound to CollectionContainer"); } removeOperation.excludeSelected(target); } else { super.actionPerform(component); } } }
@SuppressWarnings("unchecked") @Override public void actionPerform(Component component) { if (!hasSubscriptions(ActionPerformedEvent.class)) { if (!(target.getItems() instanceof ContainerDataUnit)) { throw new IllegalStateException("RemoveAction target items is null or does not implement ContainerDataUnit"); } ContainerDataUnit items = (ContainerDataUnit) target.getItems(); CollectionContainer container = items.getContainer(); if (container == null) { throw new IllegalStateException("RemoveAction target is not bound to CollectionContainer"); } removeOperation.removeSelected(target); } else { super.actionPerform(component); } } }
/** * Excludes selected items from the list component without confirmation. Works with nested containers only. * * @param target list component * @param <E> entity type */ public <E extends Entity> void excludeSelected(ListComponent<E> target) { builder(target) .withConfirmation(false) .exclude(); }
/** * Creates a remove builder using list component, e.g. {@link Table} or {@link DataGrid}. * * @param listComponent list component * @param <E> type of entity */ public <E extends Entity> RemoveBuilder<E> builder(ListComponent<E> listComponent) { checkNotNullArgument(listComponent); checkNotNullArgument(listComponent.getFrame()); FrameOwner frameOwner = listComponent.getFrame().getFrameOwner(); Class<E> entityClass; DataUnit items = listComponent.getItems(); if (items instanceof ContainerDataUnit) { entityClass = ((ContainerDataUnit) items).getEntityMetaClass().getJavaClass(); } else { throw new IllegalStateException(String.format("Component %s is not bound to data", listComponent)); } return builder(entityClass, frameOwner) .withListComponent(listComponent); }