All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ikasan.dashboard.ui.scheduler.component.LocalEventJobSelectDialog Maven / Gradle / Ivy

The newest version!
package org.ikasan.dashboard.ui.scheduler.component;

import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.grid.HeaderRow;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.html.NativeLabel;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.provider.ConfigurableFilterDataProvider;
import com.vaadin.flow.data.provider.DataProvider;
import com.vaadin.flow.data.provider.SortDirection;
import com.vaadin.flow.data.renderer.ComponentRenderer;
import org.ikasan.dashboard.ui.general.component.AbstractCloseableResizableDialog;
import org.ikasan.dashboard.ui.scheduler.listener.SchedulerJobSelectedListener;
import org.ikasan.job.orchestration.util.ContextHelper;
import org.ikasan.scheduled.job.model.SolrSchedulerJobSearchFilterImpl;
import org.ikasan.spec.scheduled.context.model.ContextTemplate;
import org.ikasan.spec.scheduled.job.model.InternalEventDrivenJob;
import org.ikasan.spec.scheduled.job.model.LocalEventJob;
import org.ikasan.spec.scheduled.job.model.SchedulerJob;
import org.ikasan.spec.scheduled.job.model.SchedulerJobSearchFilter;
import org.ikasan.spec.search.SearchResults;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class LocalEventJobSelectDialog extends AbstractCloseableResizableDialog {

    private DataProvider dataProvider;
    private ConfigurableFilterDataProvider filteredDataProvider;
    private List schedulerJobSelectedListeners = new ArrayList<>();
    private ContextTemplate contextTemplate;
    private Grid localEventJobGrid;

    SchedulerJobSearchFilter searchFilter = new SolrSchedulerJobSearchFilterImpl();

    public LocalEventJobSelectDialog(ContextTemplate contextTemplate) {
        this.setHeight("70vh");
        this.setWidth("70vw");

        this.contextTemplate = contextTemplate;

        this.init();

        VerticalLayout layout = new VerticalLayout();
        layout.setSizeFull();
        layout.add(this.localEventJobGrid);
        layout.getStyle().set("padding-bottom", "20px");

        super.title.setText("Select Local Event Job");
        super.content.add(layout);
    }

    private void init() {
        List localEventJobs = ContextHelper.getLocalEventJobsFromContext(contextTemplate);
        dataProvider = DataProvider.fromFilteringCallbacks(query -> {
            Optional filter = query.getFilter();

            // The index of the first item to load
            int offset = query.getOffset();

            // The number of items to load
            int limit = query.getLimit();

            Stream localEventJobStream;
            if(filter.isPresent() && filter.get().getJobNameFilter() != null &&
                !filter.get().getJobNameFilter().isEmpty()) {
                localEventJobStream =  localEventJobs.stream()
                    .filter(localEventJob
                        -> localEventJob.getJobName().toLowerCase().contains(filter.get().getJobNameFilter().toLowerCase()))
                    .collect(Collectors.toList())
                    .subList(offset, limit)
                    .stream();
            }
            else {
                localEventJobStream = localEventJobs.subList(offset, limit).stream();
            }

            if(query.getSortOrders().size() > 0 && query.getSortOrders().get(0).getDirection().equals(SortDirection.ASCENDING)) {
                return localEventJobStream.sorted(Comparator.comparing(SchedulerJob::getJobName));
            }
            else if(query.getSortOrders().size() > 0 && query.getSortOrders().get(0).getDirection().equals(SortDirection.DESCENDING)) {
                return localEventJobStream.sorted(Comparator.comparing(SchedulerJob::getJobName).reversed());
            }
            else {
                return localEventJobStream;
            }
        }, query -> {
            Optional filter = query.getFilter();

            if(filter.isPresent() && filter.get().getJobNameFilter() != null &&
                !filter.get().getJobNameFilter().isEmpty()) {
                return localEventJobs.stream()
                    .filter(localEventJob
                        -> localEventJob.getJobName().toLowerCase().contains(filter.get().getJobNameFilter().toLowerCase()))
                    .collect(Collectors.toList()).size();
            }
            else {
                return localEventJobs.size();
            }
        });

        filteredDataProvider = dataProvider.withConfigurableFilter();
        filteredDataProvider.setFilter(this.searchFilter);

        this.localEventJobGrid = new Grid<>();
        this.localEventJobGrid.setDataProvider(filteredDataProvider);
        this.localEventJobGrid.setHeight("100%");
        this.localEventJobGrid.addColumn(new ComponentRenderer<>(localEventJob -> {
            HorizontalLayout horizontalLayout = new HorizontalLayout();

            NativeLabel jobNameLabel = new NativeLabel(localEventJob.getJobName());

            horizontalLayout.add(jobNameLabel);

            return horizontalLayout;
        })).setHeader(getTranslation("table-header.job-name", UI.getCurrent().getLocale()))
        .setResizable(true)
        .setSortable(true)
        .setKey("jobName")
        .setFlexGrow(12);

        HeaderRow hr = this.localEventJobGrid.appendHeaderRow();
        this.addGridFiltering(hr, searchFilter::setJobNameFilter, "jobName");

        this.localEventJobGrid.addItemDoubleClickListener(event -> {
            this.schedulerJobSelectedListeners.forEach(listener -> {
                listener.jobSelected(event.getItem());
            });

            this.close();
        });
    }

    /**
     * Add filtering to a column.
     *
     * @param hr
     * @param setFilter
     * @param columnKey
     */
    public void addGridFiltering(HeaderRow hr, Consumer setFilter, String columnKey) {
        TextField textField = new TextField();
        Icon filterIcon = VaadinIcon.FILTER.create();
        filterIcon.setSize("12pt");
        textField.setSuffixComponent(filterIcon);
        textField.setWidthFull();

        textField.addValueChangeListener(ev->{

            setFilter.accept(ev.getValue());

            filteredDataProvider.refreshAll();
        });

        hr.getCell(this.localEventJobGrid.getColumnByKey(columnKey)).setComponent(textField);
    }

    public void addSchedulerJobSelectedListener(SchedulerJobSelectedListener listener) {
        this.schedulerJobSelectedListeners.add(listener);
    }

    public void removeSchedulerJobSelectedListener(SchedulerJobSelectedListener listener) {
        this.schedulerJobSelectedListeners.remove(listener);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy