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

org.opensingular.requirement.module.wicket.buttons.NewRequirementLink Maven / Gradle / Ivy

/*
 * Copyright (C) 2016 Singular Studios (a.k.a Atom Tecnologia) - www.opensingular.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.opensingular.requirement.module.wicket.buttons;

import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.StringResourceModel;
import org.opensingular.lib.commons.lambda.ISupplier;
import org.opensingular.lib.commons.ui.Icon;
import org.opensingular.lib.wicket.util.metronic.menu.DropdownMenu;
import org.opensingular.requirement.module.RequirementDefinition;
import org.opensingular.requirement.module.service.RequirementDefinitionService;
import org.opensingular.requirement.module.wicket.NewRequirementUrlBuilder;

import javax.inject.Inject;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.opensingular.lib.wicket.util.util.WicketUtils.$b;
import static org.opensingular.lib.wicket.util.util.WicketUtils.$m;

public class NewRequirementLink extends Panel {

    private final String                                                        url;
    private final Map                                           params;
    private       IModel>> requirements;
    private       IModel                                                labelModel = new StringResourceModel("label.button.insert", this, null);

    @Inject
    private RequirementDefinitionService requirementDefinitionService;

    public NewRequirementLink(String id, String url, Map params,
                              IModel>> requirements) {
        this(id, null, url, params, requirements);
    }

    public NewRequirementLink(String id, IModel labelModel, String url,
                              Map params, IModel>> requirements) {
        super(id);
        this.url          = url;
        this.labelModel   = labelModel == null ? this.labelModel : labelModel;
        this.params       = params;
        this.requirements = requirements;
        buildButtons();
    }

    protected void buildButtons() {
        addSingleButton(() -> Optional.ofNullable(requirements.getObject()).map(Set::size).orElse(0) == 1);
        addDropdownButton(() -> Optional.ofNullable(requirements.getObject()).map(Set::size).orElse(0) > 1);
    }

    protected void addSingleButton(ISupplier visibleSupplier) {
        Optional> findFirst = getRequirementsStream().findFirst();
        if (findFirst.isPresent()) {
            Link newButton = buildLink("_botao", labelModel, findFirst.get());
            newButton.add($b.visibleIf(visibleSupplier));
            this.add(newButton);
        }
    }

    private Link buildLink(String id, IModel labelModel, RequirementDefinition requirement) {
        String url = NewRequirementLink.this.buildURL(requirement);
        return new Link(id) {
            @Override
            protected void onConfigure() {
                super.onConfigure();
                this.add($b.attr("href", url));
                this.add($b.attr("target", "_blank"));
                this.setBody(labelModel);
            }

            @Override
            public void onClick() {
                //DO NOTHING
            }
        };
    }

    protected void addDropdownButton(ISupplier visibleSupplier) {
        final DropdownMenu dropdownMenu = new DropdownMenu("_novos", "Novo", Icon.of("fa fa-file"));
        dropdownMenu.add($b.visibleIf(visibleSupplier));
        dropdownMenu.add($b.onConfigure(c -> {
            if (visibleSupplier.get()) {
                for (RequirementDefinition r : getRequirementsStream().collect(Collectors.toList())) {
                    String name = r.getName();
                    dropdownMenu.adicionarMenu(id -> buildLink(id, $m.ofValue(name), r));
                }
            }
        }));
        this.add(dropdownMenu);
    }

    private Stream> getRequirementsStream() {
        return requirementDefinitionService.getRequirements().stream()
                .filter(req -> requirements.getObject().stream().anyMatch(reqClass -> reqClass.isAssignableFrom(req.getClass())));
    }

    protected String buildURL(RequirementDefinition requirement) {
        return new NewRequirementUrlBuilder(url, requirement.getKey()).getURL(params);
    }

    @Override
    protected boolean getStatelessHint() {
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy