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

io.imunity.furms.ui.views.fenix.dashboard.DashboardView Maven / Gradle / Ivy

There is a newer version: 4.3.1
Show newest version
/*
 * Copyright (c) 2021 Bixbit s.c. All rights reserved.
 * See LICENSE file for licensing information.
 */

package io.imunity.furms.ui.views.fenix.dashboard;

import com.vaadin.flow.component.ComponentUtil;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.checkbox.CheckboxGroup;
import com.vaadin.flow.component.checkbox.CheckboxGroupVariant;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.Route;
import io.imunity.furms.api.resource_credits.ResourceCreditService;
import io.imunity.furms.api.resource_types.ResourceTypeService;
import io.imunity.furms.api.sites.SiteService;
import io.imunity.furms.domain.resource_credits.ResourceCreditWithAllocations;
import io.imunity.furms.domain.resource_types.ResourceMeasureUnit;
import io.imunity.furms.domain.sites.Site;
import io.imunity.furms.domain.sites.SiteId;
import io.imunity.furms.ui.components.FurmsViewComponent;
import io.imunity.furms.ui.components.PageTitle;
import io.imunity.furms.ui.components.ViewHeaderLayout;
import io.imunity.furms.ui.components.support.models.CheckboxModel;
import io.imunity.furms.ui.user_context.UIContext;
import io.imunity.furms.ui.views.fenix.menu.FenixAdminMenu;

import java.math.BigDecimal;
import java.time.ZoneId;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;

import static com.vaadin.flow.component.ComponentUtil.getData;
import static com.vaadin.flow.component.ComponentUtil.setData;
import static com.vaadin.flow.component.icon.VaadinIcon.SEARCH;
import static io.imunity.furms.ui.views.fenix.dashboard.DashboardOptions.INCLUDE_EXPIRED;
import static io.imunity.furms.ui.views.fenix.dashboard.DashboardOptions.INCLUDE_FULLY_DISTRIBUTED;
import static io.imunity.furms.utils.UTCTimeUtils.convertToZoneTime;
import static java.util.stream.Collectors.toSet;

@Route(value = "fenix/admin/dashboard", layout = FenixAdminMenu.class)
@PageTitle(key = "view.fenix-admin.dashboard.page.title")
public class DashboardView extends FurmsViewComponent {

	private final ResourceCreditService creditService;
	private final ResourceTypeService resourceTypeService;
	private final SiteService siteService;

	private final DashboardViewFilters filters;
	private final ResourceAllocationsGrid grid;
	private final ZoneId browserZoneId;

	DashboardView(ResourceCreditService creditService,
	              ResourceTypeService resourceTypeService,
	              SiteService siteService) {
		this.creditService = creditService;
		this.resourceTypeService = resourceTypeService;
		this.siteService = siteService;
		this.browserZoneId = UIContext.getCurrent().getZone();

		this.filters = initializeFilters();
		this.grid = new ResourceAllocationsGrid(
				this::allocateButtonAction,
				this::loadCredits,
				"view.fenix-admin.dashboard.grid.column");

		addTitle();
		addFiltersAndSearch();
		getContent().add(grid);
	}

	private DashboardViewFilters initializeFilters() {
		final DashboardViewFilters filters = new DashboardViewFilters();
		final DashboardViewFilters savedFilters = getData(UI.getCurrent(), DashboardViewFilters.class);
		if (savedFilters != null) {
			filters.setName(savedFilters.getName());
			filters.setIncludeExpired(savedFilters.isIncludeExpired());
			filters.setIncludeFullyDistributed(savedFilters.isIncludeFullyDistributed());
			setData(UI.getCurrent(), DashboardViewFilters.class, null);
		}

		return filters;
	}

	private void addTitle() {
		final ViewHeaderLayout headerLayout = new ViewHeaderLayout(getTranslation("view.fenix-admin.dashboard.title"));
		getContent().add(headerLayout);
	}

	private void addFiltersAndSearch() {
		final CheckboxGroup> filters = createFiltersForm();
		final TextField searchForm = createSearchForm();

		final HorizontalLayout layout = new HorizontalLayout(filters, searchForm);
		layout.setWidthFull();
		layout.setAlignItems(FlexComponent.Alignment.CENTER);
		layout.setJustifyContentMode(FlexComponent.JustifyContentMode.START);

		getContent().add(layout);
	}

	private CheckboxGroup> createFiltersForm() {
		final CheckboxGroup> checkboxGroup = new CheckboxGroup<>();
		checkboxGroup.setItemLabelGenerator(CheckboxModel::getLabel);
		final List> values = List.of(
				new CheckboxModel<>(INCLUDE_FULLY_DISTRIBUTED,
						getTranslation("view.fenix-admin.dashboard.filters.fully-distributed")),
				new CheckboxModel<>(INCLUDE_EXPIRED,
						getTranslation("view.fenix-admin.dashboard.filters.expired")));
		checkboxGroup.setItems(values);
		checkboxGroup.addThemeVariants(CheckboxGroupVariant.LUMO_VERTICAL);
		checkboxGroup.addValueChangeListener(event -> {
			filters.setIncludeFullyDistributed(isSelectedCheckbox(INCLUDE_FULLY_DISTRIBUTED, event.getValue()));
			filters.setIncludeExpired(isSelectedCheckbox(INCLUDE_EXPIRED, event.getValue()));
			UI.getCurrent().accessSynchronously(grid::reloadGrid);
		});
		checkboxGroup.setValue(
			values.stream()
				.filter(value ->
						filters.isIncludeFullyDistributed() && INCLUDE_FULLY_DISTRIBUTED.equals(value.getOption())
						|| filters.isIncludeExpired() && INCLUDE_EXPIRED.equals(value.getOption()))
				.collect(toSet()));

		return checkboxGroup;
	}

	private boolean isSelectedCheckbox(DashboardOptions checkbox, Set> value) {
		return value.stream()
				.anyMatch(filter -> checkbox.equals(filter.getOption()));
	}

	private TextField createSearchForm() {
		final TextField textField = new TextField();
		textField.setPlaceholder(getTranslation("view.fenix-admin.dashboard.search.placeholder"));
		textField.setPrefixComponent(SEARCH.create());
		textField.setValueChangeMode(ValueChangeMode.EAGER);
		textField.getStyle().set("margin-left", "auto");
		textField.addValueChangeListener(event -> {
			textField.blur();
			filters.setName(event.getValue().toLowerCase());
			UI.getCurrent().accessSynchronously(grid::reloadGrid);
			textField.focus();
		});
		textField.setValue(filters.getName());

		return textField;
	}

	private void allocateButtonAction(ResourceCreditAllocationsGridItem item) {
		ComponentUtil.setData(UI.getCurrent(), ResourceCreditAllocationsGridItem.class, item);
		ComponentUtil.setData(UI.getCurrent(), DashboardViewFilters.class, filters);
		UI.getCurrent().navigate(DashboardResourceAllocateFormView.class);
	}

	private Stream loadCredits() {
		return creditService.findAllWithAllocations(
					filters.getName(),
					filters.isIncludeFullyDistributed(),
					filters.isIncludeExpired())
				.stream()
				.map(this::buildItem);
	}

	private ResourceCreditAllocationsGridItem buildItem(ResourceCreditWithAllocations credit) {
		final ResourceMeasureUnit unit = resourceTypeService.findById(credit.getResourceType().id, credit.getSiteId())
				.map(type -> type.unit)
				.orElse(ResourceMeasureUnit.NONE);

		return ResourceCreditAllocationsGridItem.builder()
				.id(credit.getId())
				.siteId(credit.getSiteId())
				.siteName(findSiteName(credit.getSiteId()))
				.name(credit.getName())
				.split(credit.getSplit())
				.resourceType(credit.getResourceType())
				.credit(createResource(credit.getAmount(), unit))
				.distributed(createResource(calcDistributed(credit), unit))
				.remaining(createResource(credit.getRemaining(), unit))
				.created(convertToZoneTime(credit.getUtcCreateTime(), browserZoneId))
				.validFrom(convertToZoneTime(credit.getUtcStartTime(), browserZoneId))
				.validTo(convertToZoneTime(credit.getUtcEndTime(), browserZoneId))
				.build();
	}

	private BigDecimal calcDistributed(ResourceCreditWithAllocations credit) {
		if (credit == null || credit.getAmount() == null || credit.getRemaining() == null) {
			return BigDecimal.ZERO;
		}
		return credit.getAmount().subtract(credit.getRemaining());
	}

	private String findSiteName(SiteId siteId) {
		return siteService.findById(siteId)
				.map(Site::getName)
				.orElseThrow(() -> new IllegalArgumentException("Incorrect Site ID. Site has not been found."));
	}

	private DashboardGridResource createResource(BigDecimal amount, ResourceMeasureUnit unit) {
		return DashboardGridResource.builder()
				.amount(amount)
				.unit(unit)
				.build();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy