package org.lightadmin.demo.config;
import org.lightadmin.api.config.AdministrationConfiguration;
import org.lightadmin.api.config.builder.*;
import org.lightadmin.api.config.unit.*;
import org.lightadmin.api.config.utils.DomainTypePredicates;
import org.lightadmin.api.config.utils.DomainTypeSpecification;
import org.lightadmin.api.config.utils.FieldValueRenderer;
import org.lightadmin.api.config.utils.ScopeMetadataUtils;
import org.lightadmin.demo.config.listener.SimpleRepositoryEventListener;
import org.lightadmin.demo.model.Customer;
import org.lightadmin.demo.service.CustomerService;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import static org.lightadmin.api.config.utils.FilterMetadataUtils.filter;
import static org.lightadmin.api.config.utils.ScopeMetadataUtils.all;
import static org.lightadmin.api.config.utils.ScopeMetadataUtils.specification;
@SuppressWarnings("unused")
public class CustomerAdministration extends AdministrationConfiguration<Customer> {
@Autowired
private CustomerService customerService;
public EntityMetadataConfigurationUnit configuration(EntityMetadataConfigurationUnitBuilder configurationBuilder) {
return configurationBuilder
.nameField("firstname")
.singularName("Customer")
.pluralName("Customers")
.repositoryEventListener(SimpleRepositoryEventListener.class)
.build();
}
public ScreenContextConfigurationUnit screenContext(ScreenContextConfigurationUnitBuilder screenContextBuilder) {
return screenContextBuilder.screenName("Customers Administration").build();
}
public FieldSetConfigurationUnit listView(final FieldSetConfigurationUnitBuilder fragmentBuilder) {
return fragmentBuilder
.field("avatar").caption("Avatar")
.field("registrationDate").caption("Registration Date")
.field("registrationDateTime").caption("Registration Date Time")
.field("firstname").caption("First Name")
.field("lastname").caption("Last Name")
.field("emailAddress").caption("Email Address")
.field("addresses").caption("Addresses")
.field("discountPrograms").caption("Discount Programs")
.renderable(vipStatusRenderer()).caption("VIP").build();
}
public FieldSetConfigurationUnit quickView(final FieldSetConfigurationUnitBuilder fragmentBuilder) {
return fragmentBuilder
.field("avatar").caption("Avatar")
.field("registrationDate").caption("Registration Date")
.field("firstname").caption("First Name")
.field("lastname").caption("Last Name")
.field("discountPrograms").caption("Discount Programs")
.field("addresses").caption("Addresses")
.renderable(vipStatusRenderer()).caption("VIP").build();
}
public FieldSetConfigurationUnit showView(final FieldSetConfigurationUnitBuilder fragmentBuilder) {
return fragmentBuilder
.field("avatar").caption("Avatar")
.field("registrationDate").caption("Registration Date")
.field("registrationDateTime").caption("Registration Date Time")
.field("firstname").caption("First Name")
.field("lastname").caption("Last Name")
.field("emailAddress").caption("Email Address")
.field("discountPrograms").caption("Discount Programs")
.field("addresses").caption("Addresses")
.renderable(vipStatusRenderer()).caption("VIP").build();
}
public FieldSetConfigurationUnit formView(final PersistentFieldSetConfigurationUnitBuilder fragmentBuilder) {
return fragmentBuilder
.field("avatar").caption("Avatar")
.field("registrationDate").caption("Registration Date")
.field("registrationDateTime").caption("Registration Date Time")
.field("firstname").caption("First Name")
.field("lastname").caption("Last Name")
.field("emailAddress").caption("Email Address")
.field("discountPrograms").caption("Discount Programs")
.field("addresses").caption("Addresses").build();
}
public ScopesConfigurationUnit scopes(final ScopesConfigurationUnitBuilder scopeBuilder) {
return scopeBuilder
.scope("All", all()).defaultScope()
.scope("Buyers", ScopeMetadataUtils.filter(DomainTypePredicates.alwaysTrue()))
.scope("Sellers", specification(customerNameEqDave())).build();
}
public FiltersConfigurationUnit filters(final FiltersConfigurationUnitBuilder filterBuilder) {
return filterBuilder.filters(
filter().field("id").caption("ID").build(),
filter().field("registrationDate").caption("Registration Date").build(),
filter().field("registrationDateTime").caption("Registration Date Time").build(),
filter().field("firstname").caption("First Name").build(),
filter().field("lastname").caption("Last Name").build(),
filter().field("emailAddress").caption("Email Address").build(),
filter().field("addresses").caption("Addresses").build(),
filter().field("discountPrograms").caption("Discount Programs").build()
).build();
}
private DomainTypeSpecification<Customer> customerNameEqDave() {
return new DomainTypeSpecification<Customer>() {
@Override
public Predicate toPredicate(final Root<Customer> root, final CriteriaQuery<?> query, final CriteriaBuilder cb) {
return cb.equal(root.get("firstname"), "Dave");
}
};
}
private FieldValueRenderer<Customer> vipStatusRenderer() {
final CustomerService _customerService = customerService;
return new FieldValueRenderer<Customer>() {
@Override
public String apply(Customer customer) {
return _customerService.isVIP(customer) ? "Yes" : "No";
}
};
}
}