Projects view complex filter
authorVásáry Dániel <vasary@elgekko.net>
Sun, 3 Mar 2024 22:32:48 +0000 (23:32 +0100)
committerVásáry Dániel <vasary@elgekko.net>
Sun, 3 Mar 2024 22:32:48 +0000 (23:32 +0100)
20 files changed:
sly-crm-db/migrations/scripts/029_actual_to_projectstatus.sql [new file with mode: 0644]
sly-crm-db/src/main/java/hu/user/lis/db/ProjectStatus.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/ProjectRepositorySearch.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/ProjectRepositorySearchImpl.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ActiveFilter.java [new file with mode: 0644]
sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/InvoiceFilter.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/PageableFilter.java
sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ProjectFilter.java [new file with mode: 0644]
sly-crm-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/data/common/CachedDataModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/session/SessionSettings.java
sly-crm-ui/src/main/java/hu/user/lis/ui/view/IndexViewModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/view/InvoicesViewModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java
sly-crm-ui/src/main/java/hu/user/lis/ui/view/common/FilterActiveViewModel.java
sly-crm-ui/src/main/resources/metainfo/zk/zk.xml
sly-crm-ui/src/main/resources/web/index.zul
sly-crm-ui/src/main/resources/web/invoices.zul
sly-crm-ui/src/main/resources/web/projects.zul
sly-crm-ui/src/main/resources/web/settings.zul

diff --git a/sly-crm-db/migrations/scripts/029_actual_to_projectstatus.sql b/sly-crm-db/migrations/scripts/029_actual_to_projectstatus.sql
new file mode 100644 (file)
index 0000000..c7153be
--- /dev/null
@@ -0,0 +1,12 @@
+-- // add actual to project_status
+-- Migration SQL that makes the change goes here.
+
+ALTER TABLE project_status
+    ADD COLUMN actual SMALLINT NOT NULL DEFAULT 1;
+
+-- //@UNDO
+-- SQL to undo the change goes here.
+
+ALTER TABLE project_status
+    DROP COLUMN actual;
+CALL SYSPROC.ADMIN_CMD('REORG TABLE project_status');
index 3ccdc94e9b73d04da5b8a8323580727fbd26cabc..c619a673c29274992dd74b55b1a773a2a824a1d3 100644 (file)
@@ -18,7 +18,9 @@ public class ProjectStatus extends IdEntity {
 
     private String name;
 
-    private boolean active;
-
     private int order;
+
+    private boolean active;
+    
+    private boolean actual;
 }
index fc93c46c736a2376f966566aa286236efd405608..a329e533d414a4e52c6984d7653413b7c98c342d 100644 (file)
@@ -1,11 +1,16 @@
 package hu.user.lis.db.repository;
 
 import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.filter.ProjectFilter;
 import org.springframework.data.domain.Pageable;
 
 import java.util.List;
 
 public interface ProjectRepositorySearch {
+    List<Project> search(ProjectFilter filter);
+
+    long count(ProjectFilter filter);
+
     List<Project> search(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive, Pageable pageable);
 
     long count(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive);
index 0c7905628b44f3a46d944a02709a7703c6771a9b..b1192e2198d1f4423b8ef6a95cea4aac6e6c3ab9 100644 (file)
@@ -1,6 +1,7 @@
 package hu.user.lis.db.repository;
 
 import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.filter.ProjectFilter;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Pageable;
@@ -16,6 +17,7 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 @Repository
 public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
@@ -43,6 +45,61 @@ public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
         return predicates.toArray(new Predicate[]{});
     }
 
+    Predicate[] getPredicates(CriteriaBuilder cb, Root<Project> root, ProjectFilter filter) {
+        List<Predicate> predicates = new ArrayList<>();
+        if (StringUtils.isNotBlank(filter.getPartialSearch())) {
+            List<Predicate> orPredicates = new ArrayList<>();
+            orPredicates.add(cb.like(cb.lower(root.get("name")), "%" + filter.getPartialSearch().toLowerCase() + "%"));
+            orPredicates.add(cb.like(cb.lower(root.get("humanId")), "%" + filter.getPartialSearch().toLowerCase() + "%"));
+            orPredicates.add(cb.like(cb.lower(root.join("partner").get("name")), "%" + filter.getPartialSearch().toLowerCase() + "%"));
+            predicates.add(cb.or(orPredicates.toArray(new Predicate[]{})));
+        }
+        if (!ListUtils.emptyIfNull(filter.getProjectIds()).isEmpty()) {
+            predicates.add(root.get("id").in(filter.getProjectIds()));
+        }
+        if (filter.isFilterShowActive() && !filter.isFilterShowInActive()) {
+            predicates.add(cb.isTrue(root.get("active")));
+        }
+        if (filter.isFilterShowInActive() && !filter.isFilterShowActive()) {
+            predicates.add(cb.isFalse(root.get("active")));
+        }
+        if (filter.isActual()) {
+            predicates.add(cb.isTrue(root.join("projectStatus").get("active")));
+        }
+        if (Objects.nonNull(filter.getPartner())) {
+            predicates.add(cb.equal(root.get("partner"), filter.getPartner()));
+        }
+        if (Objects.nonNull(filter.getStatus())) {
+            predicates.add(cb.equal(root.get("projectStatus"), filter.getStatus()));
+        }
+        return predicates.toArray(new Predicate[]{});
+    }
+
+    @Override
+    public List<Project> search(ProjectFilter filter) {
+        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+        CriteriaQuery<Project> cq = cb.createQuery(Project.class);
+        Root<Project> root = cq.from(Project.class);
+
+        cq.where(getPredicates(cb, root, filter));
+        cq.orderBy(QueryUtils.toOrders(filter.getPageable().getSort(), root, cb));
+        TypedQuery<Project> query = entityManager.createQuery(cq);
+        query.setMaxResults(filter.getPageable().getPageSize());
+        query.setFirstResult(filter.getPageable().getPageSize() * filter.getPageable().getPageNumber());
+        return query.getResultList();
+    }
+
+    @Override
+    public long count(ProjectFilter filter) {
+        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
+        Root<Project> root = cq.from(Project.class);
+
+        cq.select(cb.count(root));
+        cq.where(getPredicates(cb, root, filter));
+        return entityManager.createQuery(cq).getSingleResult();
+    }
+
     @Override
     public List<Project> search(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive, Pageable pageable) {
         CriteriaBuilder cb = entityManager.getCriteriaBuilder();
diff --git a/sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ActiveFilter.java b/sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ActiveFilter.java
new file mode 100644 (file)
index 0000000..d5fb79f
--- /dev/null
@@ -0,0 +1,20 @@
+package hu.user.lis.db.repository.filter;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@Setter
+@SuperBuilder
+@ToString
+public class ActiveFilter extends PageableFilter {
+
+    private boolean filterShowInActive;
+
+    private boolean filterShowActive;
+
+    private boolean filterShowBoth;
+
+}
index 14914d73f21ba5cef5d9193b7b082019d1884ccc..c1a24af58c692fb2c8b7b357881c34af8ca574be 100644 (file)
@@ -3,16 +3,18 @@ package hu.user.lis.db.repository.filter;
 import hu.user.lis.db.InvoiceStatus;
 import hu.user.lis.db.Partner;
 import hu.user.lis.db.Project;
-import lombok.*;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
 
 import java.util.Date;
 
+
 @Getter
 @Setter
-@Builder
+@SuperBuilder
 @ToString
-@NoArgsConstructor
-@AllArgsConstructor
 public class InvoiceFilter extends PageableFilter {
 
     private Partner partner;
index 43a2dbc112dbbaf6d06f6a4a317e0e2687aa9cf5..50e0f86e527cb96bf3435e988faea0d0759c3a79 100644 (file)
@@ -2,10 +2,12 @@ package hu.user.lis.db.repository.filter;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.SuperBuilder;
 import org.springframework.data.domain.Pageable;
 
 @Getter
 @Setter
+@SuperBuilder
 public class PageableFilter {
     private Pageable pageable;
 }
diff --git a/sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ProjectFilter.java b/sly-crm-db/src/main/java/hu/user/lis/db/repository/filter/ProjectFilter.java
new file mode 100644 (file)
index 0000000..8aa7199
--- /dev/null
@@ -0,0 +1,28 @@
+package hu.user.lis.db.repository.filter;
+
+import hu.user.lis.db.Partner;
+import hu.user.lis.db.ProjectStatus;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import java.util.List;
+
+@Getter
+@Setter
+@SuperBuilder
+@ToString
+public class ProjectFilter extends ActiveFilter {
+
+    private Partner partner;
+
+    private ProjectStatus status;
+
+    private boolean actual;
+
+    private String partialSearch;
+
+    private List<Long> projectIds;
+
+}
index b1a4a1710e964e6080af567dadbde656aa27f10b..06751134bba22f7c168ca5804f6ab9ba8934e848 100644 (file)
@@ -5,6 +5,7 @@ import hu.user.lis.db.Project;
 import hu.user.lis.db.ProjectStatus;
 import hu.user.lis.db.repository.InvoiceRepository;
 import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.db.repository.filter.ProjectFilter;
 import hu.user.lis.service.data.EntityDataService;
 import hu.user.lis.ui.data.common.CachedSpringDataModel;
 import lombok.extern.log4j.Log4j2;
@@ -40,6 +41,8 @@ public class ProjectsDataModel extends CachedSpringDataModel<Project> {
     @Autowired
     EntityDataService<Project> projectDataService;
 
+    private ProjectFilter filter;
+
     private String partialName;
 
     private boolean listAll;
@@ -56,20 +59,25 @@ public class ProjectsDataModel extends CachedSpringDataModel<Project> {
     @Override
     public List<Project> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
         Pageable pageable = createPageable(page, pageSize, sortComparator);
-        List<Project> result = listAll ? projectRepository.findAll() :
-                projectRepository.search(partialName, null, filterShowActive, filterShowInActive, pageable);
-        return result;
+        Optional.ofNullable(filter).ifPresent(f -> f.setPageable(pageable));
+        return Objects.isNull(filter) ? projectRepository.findAll(pageable).getContent() : projectRepository.search(filter);
     }
 
     @Override
     public int getResultSetCount() {
-        long result = listAll ? projectRepository.count() :
-                projectRepository.count(partialName, null, filterShowActive, filterShowInActive);
+        long result = Objects.isNull(filter) ? projectRepository.count() : projectRepository.count(filter);
         return (int) result;
     }
 
+
+    public void search(ProjectFilter filter) {
+        log.info("Searching projects using filter: {}", filter);
+        this.filter = filter;
+        super.reset();
+    }
+
     public void search(String partialName) {
-        log.info("Searching partner using filters: name LIKE {}", partialName);
+        log.info("Searching projects using filters: name LIKE {}", partialName);
         listAll = false;
         this.partialName = partialName;
         super.reset();
index ca047acc22dbe03d20cefb980de35b1fbb42b3a7..c1250fbefbeb47b37c42354920c0340ada26b1a6 100644 (file)
@@ -199,6 +199,7 @@ public abstract class CachedDataModel<T> extends ListModelList<T> {
         String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss").format(LocalDateTime.now());
         Path destinationTempPath = Paths.get(applicationUIProperties.getExportTempPath(), String.format("%s-%s.xlsx", getShortName(), timestamp));
         int resultSetCount = getResultSetCount();
+        log.info("Result total count is {}", resultSetCount);
         if (resultSetCount == 0) {
             Messagebox.show("Nincs exportálható adat.");
             return;
index efb580967b5d8d9f5c2c5ce3104db9206c9d058c..5fcbebb6115f13b0cfe61b3909a294ec3bf518fa 100644 (file)
@@ -4,6 +4,7 @@ import lombok.extern.log4j.Log4j2;
 import org.springframework.stereotype.Service;
 import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.Sessions;
+import org.zkoss.zul.theme.Themes;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
@@ -17,6 +18,14 @@ public class SessionSettings {
         log.info("SessionSettings created");
     }
 
+    public void applyTheme(String theme) {
+//        HttpServletResponse response = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
+        //ez a zk alapertelmezett tema cookie                  Cookie[] cookies = request.getCookies();
+//        Cookie themeCookie = new Cookie("zktheme", theme);
+//        response.addCookie(themeCookie);
+        Themes.setTheme(Executions.getCurrent(), theme);
+    }
+
     private HttpServletRequest getNativeRequest() {
         return (HttpServletRequest) Executions.getCurrent().getNativeRequest();
     }
@@ -47,7 +56,6 @@ public class SessionSettings {
         return getNativeSession().getId();
     }
 
-
     public void setAttribute(String name, Object obj) {
         HttpSession session = getNativeSession();
         if (Objects.isNull(session)) {
index d24589d823c0cce65cc8978701535ee501b9cdce..f3c9b3d93f44f9e8616b313bb7585449547c4dfb 100644 (file)
@@ -21,6 +21,7 @@ import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Destroy;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.lang.Strings;
+import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.EventListener;
 import org.zkoss.zk.ui.select.annotation.VariableResolver;
@@ -239,4 +240,9 @@ public class IndexViewModel implements EventListener<Event> {
         });
     }
 
+    @Command
+    public void applyTheme(@BindingParam("name") String name) {
+        sessionSettings.applyTheme(name);
+        Executions.getCurrent().sendRedirect(Strings.EMPTY);
+    }
 }
index ce7500ac90ca8a8252de4aeebe027842c17f0842..6e83d040dfebef520e7f033d5a5ce0f7d37ec25e 100644 (file)
@@ -13,8 +13,10 @@ import hu.user.lis.ui.event.EventBus;
 import hu.user.lis.ui.event.SaveEntityEvent;
 import hu.user.lis.ui.view.common.EntityViewModel;
 import lombok.Getter;
+import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.transaction.annotation.Transactional;
+import org.zkoss.bind.BindContext;
 import org.zkoss.bind.BindUtils;
 import org.zkoss.bind.PropertyChangeEvent;
 import org.zkoss.bind.annotation.*;
@@ -30,6 +32,10 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     @Getter
     private InvoiceFilter invoiceFilter;
 
+    @Getter
+    @Setter
+    private boolean showPartner;
+
     @WireVariable
     private EventBus eventBus;
 
@@ -97,9 +103,9 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     }
 
     @Command
-    public void setIncoming(@BindingParam("incoming") boolean value) {
+    public void setIncoming(@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx, @BindingParam("incoming") boolean value) {
         invoiceFilter.setIncoming(value);
-        BindUtils.postNotifyChange(null, null, invoiceFilter, "incoming");
+        BindUtils.postNotifyChange(invoiceFilter, "incoming");
     }
 
     @Command
@@ -108,9 +114,9 @@ public class InvoicesViewModel extends EntityViewModel<Invoice> implements Event
     }
 
     @Override
-    public void onEvent(Event evt) throws Exception {
-        if (evt instanceof PropertyChangeEvent) {
-            PropertyChangeEvent propertyEvent = (PropertyChangeEvent) evt;
+    public void onEvent(Event event) throws Exception {
+        if (event instanceof PropertyChangeEvent) {
+            PropertyChangeEvent propertyEvent = (PropertyChangeEvent) event;
 //           (this.equals(propertyEvent.getBase()) && propertyEvent.getProperty().startsWith("invoiceFilter")))
             if (invoiceFilter.equals(propertyEvent.getBase())) {
                 log.info("Refresh needed, {} changed", propertyEvent.getProperty());
index 818bd967024590dcc9a6efc22ba07b6a1a981106..cf62b00a0c0bf8fda8fbfade1a73eec43bffabe5 100644 (file)
@@ -1,9 +1,13 @@
 package hu.user.lis.ui.view;
 
+import hu.user.lis.db.Partner;
 import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.filter.ActiveFilter;
+import hu.user.lis.db.repository.filter.ProjectFilter;
 import hu.user.lis.ui.Constants;
 import hu.user.lis.ui.data.ProjectsDataModel;
 import hu.user.lis.ui.data.common.CachedSpringDataModel;
+import hu.user.lis.ui.editor.selector.EntitySelectorRouter;
 import hu.user.lis.ui.event.EventBus;
 import hu.user.lis.ui.event.SaveEntityEvent;
 import hu.user.lis.ui.view.common.FilterActiveViewModel;
@@ -11,9 +15,9 @@ import hu.user.lis.workflow.invoice.service.WorkflowManagerService;
 import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
 import org.zkoss.bind.BindUtils;
-import org.zkoss.bind.annotation.Command;
-import org.zkoss.bind.annotation.Destroy;
-import org.zkoss.bind.annotation.Init;
+import org.zkoss.bind.PropertyChangeEvent;
+import org.zkoss.bind.annotation.*;
+import org.zkoss.zk.ui.Component;
 import org.zkoss.zk.ui.event.Event;
 import org.zkoss.zk.ui.event.EventListener;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
@@ -26,15 +30,24 @@ import java.util.Objects;
 
 
 @Log4j2
-public class ProjectsViewModel extends FilterActiveViewModel<Project> implements EventListener {
+public class ProjectsViewModel extends FilterActiveViewModel<Project> implements EventListener<Event> {
     @WireVariable
     @Getter
     private ProjectsDataModel projectsDataModel;
     @WireVariable
     private EventBus eventBus;
+
+    @Getter
+    @WireVariable
+    private EntitySelectorRouter entitySelectorRouter;
+
     @WireVariable
     private WorkflowManagerService workflowManagerService;
 
+    public ProjectFilter getProjectFilter() {
+        return (ProjectFilter) super.getActiveFilter();
+    }
+
     @Override
     protected CachedSpringDataModel<Project> getDataModel() {
         return projectsDataModel;
@@ -50,6 +63,8 @@ public class ProjectsViewModel extends FilterActiveViewModel<Project> implements
     public void init() {
         super.init();
         eventBus.register(this);
+        eventBus.registerForBinding(this);
+
         addColumns(Arrays.asList(
                 "humanId,Azonosító,ascending,left,true",
                 "partner.name,Ügyfél,natural,left,true",
@@ -63,6 +78,20 @@ public class ProjectsViewModel extends FilterActiveViewModel<Project> implements
         ));
     }
 
+    @Override
+    @AfterCompose
+    public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
+        entitySelectorRouter.configureSelector(Partner.class, this, "partnerFilter.partner");
+    }
+
+    protected ActiveFilter createFilter() {
+        return ProjectFilter.builder()
+                .filterShowActive(true)
+                .filterShowInActive(false)
+                .actual(true)
+                .build();
+    }
+
     public void saveEntity(SaveEntityEvent<Project> event) {
 
     }
@@ -70,11 +99,13 @@ public class ProjectsViewModel extends FilterActiveViewModel<Project> implements
     protected void refresh() {
         projectsDataModel.clearSelection();
         setSelectedEntity(null);
-        if (isFilterShowBoth()) {
-            projectsDataModel.search(true, true);
-        } else {
-            projectsDataModel.search(isFilterShowActive(), isFilterShowInActive());
-        }
+        projectsDataModel.search(getProjectFilter());
+//        if (isFilterShowBoth()) {
+//            projectsDataModel.search(true, true);
+//        } else {
+//            projectsDataModel.search(isFilterShowActive(), isFilterShowInActive());
+//        }
+
         BindUtils.postNotifyChange(this, "selectedEntity");
     }
 
@@ -100,6 +131,15 @@ public class ProjectsViewModel extends FilterActiveViewModel<Project> implements
             refresh();
             projectsDataModel.addToSelection(formDocument);
         }
+        if (event instanceof PropertyChangeEvent) {
+            PropertyChangeEvent propertyEvent = (PropertyChangeEvent) event;
+//           (this.equals(propertyEvent.getBase()) && propertyEvent.getProperty().startsWith("invoiceFilter")))
+            if (getProjectFilter().equals(propertyEvent.getBase())) {
+                log.info("Refresh needed, {} changed", propertyEvent.getProperty());
+                refresh();
+            }
+        }
+
     }
 
     @Destroy
index 54127105e7ed01ad80d1f2d80c476f3acbd95576..274ee91eb57b3281360c99524318d525a2f737a1 100644 (file)
@@ -1,5 +1,7 @@
 package hu.user.lis.ui.view.common;
 
+import hu.user.lis.db.repository.filter.ActiveFilter;
+import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.bind.annotation.NotifyChange;
@@ -9,53 +11,56 @@ import java.io.Serializable;
 
 @Log4j2
 public abstract class FilterActiveViewModel<T extends Serializable> extends EntityViewModel<T> {
-    boolean filterShowInActive;
 
-    boolean filterShowActive;
-
-    boolean filterShowBoth;
+    @Getter
+    ActiveFilter activeFilter;
 
     protected abstract void refresh();
 
     @Init
     public void init() {
         super.init();
+        activeFilter = createFilter();
         setFilterShowActive(true);
     }
 
+    protected ActiveFilter createFilter() {
+        return ActiveFilter.builder().build();
+    }
+
     public boolean isFilterShowActive() {
-        return filterShowActive;
+        return activeFilter.isFilterShowActive();
     }
 
     @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"})
     public void setFilterShowActive(boolean filterShowActive) {
-        this.filterShowBoth = false;
-        this.filterShowInActive = false;
-        this.filterShowActive = filterShowActive;
+        activeFilter.setFilterShowBoth(false);
+        activeFilter.setFilterShowInActive(false);
+        activeFilter.setFilterShowActive(true);
         refresh();
     }
 
     public boolean isFilterShowInActive() {
-        return filterShowInActive;
+        return activeFilter.isFilterShowInActive();
     }
 
     @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"})
     public void setFilterShowInActive(boolean filterShowInActive) {
-        this.filterShowBoth = false;
-        this.filterShowActive = false;
-        this.filterShowInActive = filterShowInActive;
+        activeFilter.setFilterShowBoth(false);
+        activeFilter.setFilterShowActive(false);
+        activeFilter.setFilterShowInActive(true);
         refresh();
     }
 
     public boolean isFilterShowBoth() {
-        return this.filterShowBoth;
+        return activeFilter.isFilterShowBoth();
     }
 
     @NotifyChange({"filterShowActive", "filterShowInActive", "filterShowBoth"})
     public void setFilterShowBoth(boolean filterShowBoth) {
-        this.filterShowActive = false;
-        this.filterShowInActive = false;
-        this.filterShowBoth = filterShowBoth;
+        activeFilter.setFilterShowBoth(true);
+        activeFilter.setFilterShowActive(false);
+        activeFilter.setFilterShowInActive(false);
         refresh();
     }
 
index c9600d9993d529c0bfc570acca8acac9d4f176ba..c645c808532e451d4c749b8b689b1ad70858b5df 100644 (file)
     <system-config>
         <max-upload-size>10240</max-upload-size>
     </system-config>
-    <library-property>
-        <name>org.zkoss.theme.preferred</name>
-        <value>silvertail</value>
-        <!--        <value>sapphire</value>-->
-        <!--        <value>atlantic</value>-->
-    </library-property>
+    <!--    <library-property>-->
+    <!--        <name>org.zkoss.theme.preferred</name>-->
+    <!--        <value>silvertail</value>-->
+    <!--        <value>sapphire</value>-->
+    <!--        <value>atlantic</value>-->
+    <!--    </library-property>-->
     <library-property>
         <name>org.zkoss.zul.grid.rod</name>
         <value>false</value>
index 9ce151b1b0a1b7e240e66ac651eb92e4c88e3a81..9370c8531b8ec441d210239a7fd0bc28a9fb6422 100644 (file)
                                                 Messagebox.show("Coming soon!", "Information", Messagebox.OK, Messagebox.INFORMATION);
                                             ]]></attribute>
                                 </menuitem>
+                                <menuseparator/>
+                                <menu iconSclass="z-icon-picture-o" label="Téma">
+                                    <menupopup>
+                                        <menuitem label="Silvertail (alapértelmezett)"
+                                                  onClick="@command('applyTheme', name='silvertail')"/>
+                                        <menuitem label="Sapphire" onClick="@command('applyTheme', name='sapphire')"/>
+                                        <menuitem label="Atlantic" onClick="@command('applyTheme', name='atlantic')"/>
+                                    </menupopup>
+                                </menu>
+
                                 <menuseparator/>
                                 <menuitem label="Kijelentkezés">
                                     <attribute name="onClick"><![CDATA[
index 74726fef4eb1604fe39f4fb47232f21fdd8c2e28..52b8c0e97d811b1617bb041e7db53fb9d282df2f 100644 (file)
         </caption>
         <borderlayout>
             <north hflex="true">
-                <toolbar>
-                    <toolbarbutton label="Partner" tooltip="partner_filter"/>
-                    <popup id="partner_filter">
-                        <label value="Partner"/>
-                        <separator orient="vertical"/>
-                        <entity-selector selector_id="inv_partner" entity="Partner"
-                                         style="display: inline-block;"
-                                         width="300px"/>
-                    </popup>
-                    <toolbarbutton label="Projekt" tooltip="project_filter"/>
-                    <popup id="project_filter">
-                        <label value="Projekt"/>
-                        <separator orient="vertical"/>
-                        <entity-selector selector_id="inv_project" entity="Project"
-                                         style="display: inline-block;"
-                                         width="300px"/>
-                    </popup>
-                    <toolbarbutton label="Dátum" tooltip="date_filter"/>
-                    <popup id="date_filter">
-                        <combobox instant="true" model="${dateTypes}"
-                                  selectedItem="@bind(vm.invoiceFilter.dateType)"
-                                  readonly="true">
-                            <template name="model">
-                                <comboitem label="${each.display}"/>
-                            </template>
-                        </combobox>
+                <tabbox id="tb">
+                    <tabs id="tabs">
+                        <tab label="Partner"/>
+                        <tab label="Projekt"/>
+                        <tab label="Dátum"/>
+                    </tabs>
+                    <toolbar>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-external-link" label="Bejövő"
+                                       checked="@load(vm.invoiceFilter.incoming)"
+                                       onClick="@command('setIncoming', incoming=true)"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-sign-in" label="Kimenő"
+                                       checked="@load(!vm.invoiceFilter.incoming)"
+                                       onClick="@command('setIncoming', incoming=false)"/>
 
-                        <separator orient="vertical"/>
+                        <space bar="true"/>
 
-                        <datebox instant="true" format="yyyy. MM. dd."
-                                 value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
-                        <label value="-"/>
-                        <datebox instant="true" format="yyyy. MM. dd."
-                                 value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
-                    </popup>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-external-link" label="Bejövő"
-                                   checked="@load(vm.invoiceFilter.incoming)"
-                                   onClick="@command('setIncoming', incoming=true)"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-sign-in" label="Kimenő"
-                                   checked="@load(!vm.invoiceFilter.incoming)"
-                                   onClick="@command('setIncoming', incoming=false)"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Kiegyenlítve"
+                                       checked="@bind(vm.invoiceFilter.paid)"/>
+                    </toolbar>
+                    <tabpanels>
+                        <tabpanel>
+                            <entity-selector selector_id="inv_partner" entity="Partner"
+                                             style="display: inline-block;" width="300px"/>
 
-                    <separator orient="vertical"/>
+                        </tabpanel>
+                        <tabpanel>
+                            <entity-selector selector_id="inv_project" entity="Project"
+                                             style="display: inline-block;" width="300px"/>
+                        </tabpanel>
+                        <tabpanel>
+                            <hlayout>
+                                <combobox instant="true" model="${dateTypes}"
+                                          selectedItem="@bind(vm.invoiceFilter.dateType)"
+                                          readonly="true">
+                                    <template name="model">
+                                        <comboitem label="${each.display}"/>
+                                    </template>
+                                </combobox>
 
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Kiegyenlítve"
-                                   checked="@bind(vm.invoiceFilter.paid)"/>
-                </toolbar>
+                                <space bar="false"/>
+
+                                <datebox instant="true" format="yyyy. MM. dd."
+                                         value="@bind(vm.invoiceFilter.paymentDeadLineFrom)"/>
+                                <label value="-"/>
+                                <datebox instant="true" format="yyyy. MM. dd."
+                                         value="@bind(vm.invoiceFilter.paymentDeadLineTo)"/>
+                            </hlayout>
+                        </tabpanel>
+                    </tabpanels>
+                </tabbox>
             </north>
             <center border="none">
                 <vlayout vflex="true">
index b1b331017c3325f78412ceb114c8a7fe9f0d01ad..36d108b2e3e81354076a473ba66acfd243bc4c03 100644 (file)
@@ -1,3 +1,4 @@
+<?component name="entity-selector" inline="true" class="hu.user.lis.ui.editor.widget.EntitySelector"?>
 <zk>
     <window vflex="true" viewModel="@id('vm') @init('hu.user.lis.ui.view.ProjectsViewModel')">
         <caption sclass="stretch-content">
         </caption>
         <borderlayout>
             <north flex="true">
-                <toolbar>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
-                                   checked="@bind(vm.filterShowActive)"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-ban" label="Inaktív"
-                                   checked="@bind(vm.filterShowInActive)"/>
-                    <toolbarbutton mode="toggle" iconSclass="z-icon-adjust" label="Mind"
-                                   checked="@bind(vm.filterShowBoth)"/>
-                </toolbar>
+                <tabbox id="tb">
+                    <tabs id="tabs">
+                        <tab label="Partner"/>
+                    </tabs>
+                    <toolbar>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-credit-card" label="Aktuális"
+                                       checked="@bind(vm.projectFilter.actual)"/>
+                        <space bar="tre"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
+                                       checked="@bind(vm.filterShowActive)"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-ban" label="Inaktív"
+                                       checked="@bind(vm.filterShowInActive)"/>
+                        <toolbarbutton mode="toggle" iconSclass="z-icon-adjust" label="Mind"
+                                       checked="@bind(vm.filterShowBoth)"/>
+                    </toolbar>
+                    <tabpanels>
+                        <tabpanel>
+                            <entity-selector selector_id="inv_partner" entity="Partner"
+                                             style="display: inline-block;" width="300px"/>
+
+                        </tabpanel>
+                    </tabpanels>
+                </tabbox>
+
             </north>
             <center border="none">
                 <vlayout vflex="true">
index 51fe949c9f034ae0ad007f7c0bcc8570c640ed46..cd21eda420cf2118d48de8db536af003865f2bdc 100644 (file)
@@ -34,6 +34,7 @@
                                 <listheader label="Sorrend" align="left"/>
                                 <listheader label="Név" align="left"/>
                                 <listheader label="Aktív" align="left"/>
+                                <listheader label="Aktuális" align="left"/>
                             </listhead>
                             <template name="model">
                                 <listitem>
                                         <checkbox checked="@bind(each.active)"
                                                   onCheck="@command('onProjectStatusChanged', entity=each)"/>
                                     </listcell>
+                                    <listcell>
+                                        <checkbox checked="@bind(each.actual)"
+                                                  onCheck="@command('onProjectStatusChanged', entity=each)"/>
+                                    </listcell>
                                 </listitem>
                             </template>
                         </listbox>