Prepare implementations for 0.1.4
authorelgekko <vasary@elgekko.net>
Mon, 14 Aug 2023 20:37:49 +0000 (22:37 +0200)
committerelgekko <vasary@elgekko.net>
Mon, 14 Aug 2023 20:37:49 +0000 (22:37 +0200)
25 files changed:
TODO.txt
lis-db/src/main/java/hu/user/lis/db/repository/ProjectAssociateRepository.java
lis-db/src/main/java/hu/user/lis/db/repository/ProjectRepositorySearch.java
lis-db/src/main/java/hu/user/lis/db/repository/ProjectRepositorySearchImpl.java
lis-ui/src/main/java/hu/user/lis/ui/data/AssociatesDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/CachedDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/ProjectAssociatesDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/ProjectSelectorDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/ProjectsDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/data/SuppliersDataModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/InvoiceEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/ProjectEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/ServiceRecordEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/common/EntityEditorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorModel.java
lis-ui/src/main/java/hu/user/lis/ui/editor/selector/EntitySelectorRouter.java
lis-ui/src/main/java/hu/user/lis/ui/editor/selector/ProjectSelectorModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java
lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java
lis-ui/src/main/resources/web/associates.zul
lis-ui/src/main/resources/web/editor/associate-editor.zul
lis-ui/src/main/resources/web/obsolate/partner-selector.zul
lis-ui/src/main/resources/web/partners.zul
lis-ui/src/main/resources/web/projects.zul
lis-ui/src/main/resources/web/service-records.zul

index fdc04c5bda6819be43d25216da520650194da4ad..42894b34bb91aad464713d3235ef4212cfaff21b 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -85,11 +85,12 @@ treasury hozzáadása után (project mentés előtt) legyen árrés kalkuláció
 
 XXX 20230817
 --hosszútávon: cégnév v adószám alapján adatok letöltése publikus cégadatbázisból
---mindenhol lehessen törölni, legfejlebb a db szól
---project ID - párhuzamos generálás kezelése
---forintról visszaváltva pl. USD-re reset az áfá-n
--számla dátumok egyenlőek is lehetnek, a fizetési határidő a legnagyobb (tisztázni pontosan)
+
+ld. associates --mindenhol lehessen törölni, legfejlebb a db szól
++--project ID - párhuzamos generálás kezelése
++--forintról visszaváltva pl. USD-re reset az áfá-n
 --munkalapnál csak az a projekt jelenjen meg amihez hozzá van rendelve, és a belépett felhasználó
+-számla dátumok egyenlőek is lehetnek, a fizetési határidő a legnagyobb (tisztázni pontosan)
 -a ráfordítás nem veszi figyelembe a munka ráfordítást
 -camunda beepitese: szamla erkeztetes, elszoszor szamlakep csatolas, majd approve
 
index 2a990153d2af67021b41c33e6dac5e959c1b3351..f6788ab199b821a6fa80dd609572bf444596300e 100644 (file)
@@ -4,10 +4,15 @@ import hu.user.lis.db.ProjectAssociate;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
+import java.util.Optional;
 
 public interface ProjectAssociateRepository extends JpaRepository<ProjectAssociate, Long> {
     List<ProjectAssociate> findAllByProjectId(Long projectId);
 
+    List<ProjectAssociate> findAllByAssociateId(Long associateId);
+
+    Optional<ProjectAssociate> findByAssociateIdAndProjectId(Long associateId, Long projectId);
+
     Long countByProjectId(Long projectId);
 
     void deleteByProjectId(Long projectId);
index b39dfe213c1546a5c72271327be90b15299011e9..fc93c46c736a2376f966566aa286236efd405608 100644 (file)
@@ -6,8 +6,8 @@ import org.springframework.data.domain.Pageable;
 import java.util.List;
 
 public interface ProjectRepositorySearch {
-    List<Project> search(String partialSearch, boolean filterShowActive, boolean filterShowInActive, Pageable pageable);
+    List<Project> search(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive, Pageable pageable);
 
-    long count(String partialSearch, boolean filterShowActive, boolean filterShowInActive);
+    long count(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive);
 
 }
index 9c252ee1db610dbcba78e3b741d50dfc311ab0e3..0c7905628b44f3a46d944a02709a7703c6771a9b 100644 (file)
@@ -1,6 +1,7 @@
 package hu.user.lis.db.repository;
 
 import hu.user.lis.db.Project;
+import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.query.QueryUtils;
@@ -21,7 +22,7 @@ public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
     @PersistenceContext
     EntityManager entityManager;
 
-    Predicate[] getPredicates(CriteriaBuilder cb, Root<Project> root, String partialSearch, boolean filterShowActive, boolean filterShowInActive) {
+    Predicate[] getPredicates(CriteriaBuilder cb, Root<Project> root, String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive) {
         List<Predicate> predicates = new ArrayList<>();
         if (StringUtils.isNotBlank(partialSearch)) {
             List<Predicate> orPredicates = new ArrayList<>();
@@ -30,7 +31,9 @@ public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
             orPredicates.add(cb.like(cb.lower(root.join("partner").get("name")), "%" + partialSearch.toLowerCase() + "%"));
             predicates.add(cb.or(orPredicates.toArray(new Predicate[]{})));
         }
-
+        if (!ListUtils.emptyIfNull(projectIds).isEmpty()) {
+            predicates.add(root.get("id").in(projectIds));
+        }
         if (filterShowActive && !filterShowInActive) {
             predicates.add(cb.isTrue(root.get("active")));
         }
@@ -41,12 +44,12 @@ public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
     }
 
     @Override
-    public List<Project> search(String partialSearch, boolean filterShowActive, boolean filterShowInActive, Pageable pageable) {
+    public List<Project> search(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive, Pageable pageable) {
         CriteriaBuilder cb = entityManager.getCriteriaBuilder();
         CriteriaQuery<Project> cq = cb.createQuery(Project.class);
         Root<Project> root = cq.from(Project.class);
 
-        cq.where(getPredicates(cb, root, partialSearch, filterShowActive, filterShowInActive));
+        cq.where(getPredicates(cb, root, partialSearch, projectIds, filterShowActive, filterShowInActive));
         cq.orderBy(QueryUtils.toOrders(pageable.getSort(), root, cb));
         TypedQuery<Project> query = entityManager.createQuery(cq);
         query.setMaxResults(pageable.getPageSize());
@@ -55,13 +58,13 @@ public class ProjectRepositorySearchImpl implements ProjectRepositorySearch {
     }
 
     @Override
-    public long count(String partialSearch, boolean filterShowActive, boolean filterShowInActive) {
+    public long count(String partialSearch, List<Long> projectIds, boolean filterShowActive, boolean filterShowInActive) {
         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, partialSearch, filterShowActive, filterShowInActive));
+        cq.where(getPredicates(cb, root, partialSearch, projectIds, filterShowActive, filterShowInActive));
         return entityManager.createQuery(cq).getSingleResult();
     }
 }
index 26da552c69f417b14b26c93428d5939e39ef7084..2f2da1c1c9d0cbf8544b68a2e6003a935c868c4a 100644 (file)
@@ -93,4 +93,8 @@ public class AssociatesDataModel extends CachedSpringDataModel<Associate> {
     public Associate save(Associate entity) {
         return associateRepository.save(entity);
     }
+
+    public void delete(Associate selectedEntity) {
+        associateRepository.delete(selectedEntity);
+    }
 }
index 52c8186008db411f3bae8f26710bdf5a8a267062..1610b48b9e564bd4b806625b7a7442f075ad71ca 100644 (file)
@@ -75,7 +75,7 @@ public abstract class CachedDataModel<T> extends ListModelList<T> {
     }
 
     // ListModelList method felulirva
-    // after 1. search ++++++++++
+    // after 1. searchByProject ++++++++++
     @Override
     public int getSize() {
         if (this.resultSetSize < 0) {
index 17fbf0ecbcbaf7d7b1255d57df5ec82199669745..dd7fab79fe0b885a6cf78dd4e2377745210eda80 100644 (file)
@@ -9,10 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 @Component
 @Log4j2
@@ -21,15 +18,28 @@ public class ProjectAssociatesDataModel {
     @Autowired
     ProjectAssociateRepository projectAssociateRepository;
 
-    public List<ProjectAssociate> search(Long projectId) {
+    public List<ProjectAssociate> searchByProject(Long projectId) {
         List<ProjectAssociate> result = null;
         if (Objects.nonNull(projectId)) {
-            log.info("Searching project associate using filter: projectId LIKE {}", projectId);
+            log.info("Searching project associate using filter: projectId = {}", projectId);
             result = projectAssociateRepository.findAllByProjectId(projectId);
         }
         return result;
     }
 
+    public List<ProjectAssociate> searchByAssociate(Long associateId) {
+        List<ProjectAssociate> result = null;
+        if (Objects.nonNull(associateId)) {
+            log.info("Searching project associate using filter: associateId = {}", associateId);
+            result = projectAssociateRepository.findAllByAssociateId(associateId);
+        }
+        return result;
+    }
+
+    public Optional<ProjectAssociate> searchByAssociateAndProject(Long associateId, Long projectId) {
+        log.info("Searching project associate using filter: associateId = {}, projectId = {} ", associateId, projectId);
+        return projectAssociateRepository.findByAssociateIdAndProjectId(associateId, projectId);
+    }
 
     @Transactional
     public void updateAssociates(Project project, Map<Long, Boolean> formAssociates) {
index f674fe16a9219fc3e9eaa0f2f8a3b32043b678b1..de01efa5a16491f148e30e5c10651e17bc718a8d 100644 (file)
@@ -3,7 +3,6 @@ package hu.user.lis.ui.data;
 import hu.user.lis.db.Project;
 import hu.user.lis.db.repository.ProjectRepository;
 import lombok.extern.log4j.Log4j2;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.context.annotation.Scope;
@@ -11,7 +10,9 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Component;
 import org.zkoss.zul.FieldComparator;
 
+import javax.annotation.Nullable;
 import java.util.List;
+import java.util.Objects;
 
 @Component
 @Log4j2
@@ -21,25 +22,27 @@ public class ProjectSelectorDataModel extends CachedSpringDataModel<Project> {
     @Autowired
     ProjectRepository projectRepository;
     private String partialSearch;
+    private List<Long> projectIds;
 
     @Override
     public List<Project> getResultSet(int page, int pageSize, FieldComparator sortComparator) {
         Pageable pageable = createPageable(0, SEARCH_LIMIT, null);
-        List<Project> result = StringUtils.isBlank(partialSearch) ? projectRepository.findAll(pageable).toList() :
-                projectRepository.search(partialSearch, true, false, pageable);
-        return result;
+        return projectRepository.search(partialSearch, projectIds, true, false, pageable);
     }
 
     @Override
     public int getResultSetCount() {
-        int result = StringUtils.isBlank(partialSearch) ?
-                (int) projectRepository.count() :
-                (int) projectRepository.count(partialSearch, true, false);
-        return result > SEARCH_LIMIT ? SEARCH_LIMIT : result;
+        int result = (int) projectRepository.count(partialSearch, projectIds, true, false);
+        return Math.min(result, SEARCH_LIMIT);
     }
 
-    public void search(String partialSearch) {
-        log.info("Searching projects using filter {}", partialSearch);
+    public void search(String partialSearch, @Nullable List<Long> projectIds) {
+        if (Objects.isNull(projectIds)) {
+            log.info("Searching projects using filter {}", partialSearch);
+        } else {
+            log.info("Searching projects using filter {} in associated {} project", partialSearch, projectIds.size());
+        }
+        this.projectIds = projectIds;
         this.partialSearch = partialSearch;
         super.reset();
     }
index 2a881a7b7b14a0831042709bd38857f9549cfedd..a7329c80434dcd88c8d292755b6d7166e47c56c3 100644 (file)
@@ -44,19 +44,19 @@ public class ProjectsDataModel extends CachedSpringDataModel<Project> {
     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, filterShowActive, filterShowInActive, pageable);
+                projectRepository.search(partialName, null, filterShowActive, filterShowInActive, pageable);
         return result;
     }
 
     @Override
     public int getResultSetCount() {
         long result = listAll ? projectRepository.count() :
-                projectRepository.count(partialName, filterShowActive, filterShowInActive);
+                projectRepository.count(partialName, null, filterShowActive, filterShowInActive);
         return (int) result;
     }
 
     public void search(String partialName) {
-        log.info("Searching partner using filters: name LIKE {}");
+        log.info("Searching partner using filters: name LIKE {}", partialName);
         listAll = false;
         this.partialName = partialName;
         super.reset();
index 79c767221b3435dd3fdf64ecd5526d11e5cefc6a..f7e523598d9a2e575a2d92f1e8ce54eee02c0025 100644 (file)
@@ -27,7 +27,7 @@ public class SuppliersDataModel extends CachedDataModel<Supplier> {
 
     private boolean canExecuteSearch() {
         boolean result = StringUtils.isNotBlank(partialName) || StringUtils.isNotBlank(partialZipCode) || listAll;
-        log.info("Can execute search: {}", result);
+        log.info("Can execute searchByProject: {}", result);
         return result;
     }
 
index c86790461fab1731091143a9de4bcf0ac33f291b..a80cd0630b0ee33d3f9ca94ac63ee84d9ceeda4f 100644 (file)
@@ -22,6 +22,8 @@ import java.util.Objects;
 @Setter
 public class InvoiceEditorModel extends EntityEditorModel<Invoice> {
 
+    private boolean vatCalculated;
+
     @Init
     public void init() {
         super.init();
@@ -29,17 +31,24 @@ public class InvoiceEditorModel extends EntityEditorModel<Invoice> {
 
     @AfterCompose
     public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
-        getEntitySelectorRouter().setFormDocument(Partner.class, getFormDocument(), "partner");
+        getEntitySelectorRouter().configureSelector(Partner.class, getFormDocument(), "partner");
     }
 
     @Command
     public void onNetAmountChange() {
         if (Currency.HUF.equals(getFormDocument().getCurrency())) {
+            vatCalculated = true;
             getFormDocument().setGrossAmount(getFormDocument().getNetAmount() * 1.27);
             getFormDocument().setVatAmount(getFormDocument().getGrossAmount() - getFormDocument().getNetAmount());
-            BindUtils.postNotifyChange(getFormDocument(), "grossAmount", "vatAmount");
-            validate();
+        } else {
+            if (vatCalculated) {
+                getFormDocument().setGrossAmount(0);
+                getFormDocument().setVatAmount(0);
+                vatCalculated = false;
+            }
         }
+        BindUtils.postNotifyChange(getFormDocument(), "grossAmount", "vatAmount");
+        validate();
     }
 
     @Override
index ad38e54cec6203c136c4ffaa901394f87c8c226c..4382cef9ef007e9bef6eec3e6422bb8d10815849 100644 (file)
@@ -109,7 +109,7 @@ public class ProjectEditorModel extends EntityEditorModel<Project> {
     private void initDetails() {
         initAssociates();
         serviceRecordsDataModel.search(getFormDocument(), true);
-        getEntitySelectorRouter().setFormDocument(Partner.class, getFormDocument(), "partner");
+        getEntitySelectorRouter().configureSelector(Partner.class, getFormDocument(), "partner");
         incomeMarginsDataModel.recalculate(getFormDocument());
     }
 
@@ -318,7 +318,7 @@ public class ProjectEditorModel extends EntityEditorModel<Project> {
         if (Objects.isNull(getFormDocument().getId())) {
             return;
         }
-        List<ProjectAssociate> projectAssociates = projectAssociatesDataModel.search(getFormDocument().getId());
+        List<ProjectAssociate> projectAssociates = projectAssociatesDataModel.searchByProject(getFormDocument().getId());
         for (int i = 0; i < associatesDataModel.getSize(); i++) {
             Associate associate = associatesDataModel.getElementAt(i);
             boolean exists = projectAssociates.stream()
index 6f657c0a4fc2d505df6abb6ec42820fb3d8982a8..c8d58ad06243f8380e7c1703ea71a5cda2dfef4b 100644 (file)
@@ -2,9 +2,12 @@ package hu.user.lis.ui.editor;
 
 import hu.user.lis.db.Associate;
 import hu.user.lis.db.Project;
+import hu.user.lis.db.ProjectAssociate;
 import hu.user.lis.db.ServiceRecord;
 import hu.user.lis.ui.auth.CurrentProfile;
+import hu.user.lis.ui.data.ProjectAssociatesDataModel;
 import hu.user.lis.ui.editor.common.EntityEditorModel;
+import hu.user.lis.ui.editor.selector.EntitySelectorModel;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.log4j.Log4j2;
@@ -19,8 +22,8 @@ import org.zkoss.zul.Messagebox;
 
 import java.time.LocalDate;
 import java.time.ZoneId;
-import java.util.Date;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Log4j2
 @Getter
@@ -29,6 +32,9 @@ public class ServiceRecordEditorModel extends EntityEditorModel<ServiceRecord> {
     @WireVariable
     CurrentProfile currentProfile;
 
+    @WireVariable
+    ProjectAssociatesDataModel projectAssociatesDataModel;
+
     @Init
     public void init() {
         super.init();
@@ -37,13 +43,49 @@ public class ServiceRecordEditorModel extends EntityEditorModel<ServiceRecord> {
     @AfterCompose
     public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
         if (Objects.isNull(getFormDocument().getId())) {
-            getFormDocument().setAssociate(currentProfile.getAssociate());
-            getFormDocument().setWorkDay(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+            setDefaults();
         }
-        getEntitySelectorRouter().setFormDocument(Associate.class, getFormDocument(), "associate");
-        getEntitySelectorRouter().setFormDocument(Project.class, getFormDocument(), "project");
+        initEntitySelectors();
+    }
+
+    private void initEntitySelectors() {
+        getEntitySelectorRouter().configureSelector(Associate.class, getFormDocument(), "associate");
+        EntitySelectorModel<?> projectEntitySelectorModel = getEntitySelectorRouter().configureSelector(Project.class, getFormDocument(), "project");
+        List<ProjectAssociate> projectAssociates = projectAssociatesDataModel.searchByAssociate(currentProfile.getAssociate().getId());
+        projectEntitySelectorModel.addStaticFilter("projects", getProjectIds(projectAssociates));
     }
 
+    private void setDefaults() {
+        getFormDocument().setAssociate(currentProfile.getAssociate());
+        getFormDocument().setWorkDay(Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant()));
+    }
+
+    @Override
+    protected boolean executePreSaveTask() {
+        boolean[] result = {true};
+        Optional<ProjectAssociate> opProjectAssociate = projectAssociatesDataModel.searchByAssociateAndProject(getFormDocument().getAssociate().getId(),
+                getFormDocument().getProject().getId());
+        if (!opProjectAssociate.isPresent()) {
+            Messagebox.show("A munkatárs a kiválasztott projekt résztvevője lesz.", "Megerősítés",
+                    Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, e -> {
+                        if (e.getName().equals("onCancel")) {
+                            result[0] = false;
+                        } else {
+
+                        }
+                    });
+        }
+        return result[0];
+    }
+
+    private List<Long> getProjectIds(List<ProjectAssociate> projectAssociates) {
+        if (Objects.nonNull(projectAssociates)) {
+            return projectAssociates.stream().map(ProjectAssociate::getProjectId).collect(Collectors.toList());
+        }
+        return Collections.emptyList();
+    }
+
+
     @Override
     protected boolean canSave(ServiceRecord entity) {
         return Objects.nonNull(entity.getProject()) &&
index 7118e85789dde15c64c4023e15dae004cd591df3..62f055e5311c2b1f313a9e1cc08eb7d723302b87 100644 (file)
@@ -55,7 +55,7 @@ public abstract class EntityEditorModel<T extends Serializable> extends Abstract
     @Command
     public void onCloseWindow(@BindingParam("target") Window target, @BindingParam("save") boolean save) {
         if (save) {
-            if (saveEnabled) {
+            if (saveEnabled && executePreSaveTask()) {
                 Events.postEvent(new Event("onClose", target, formDocument));
             }
         } else {
@@ -63,6 +63,10 @@ public abstract class EntityEditorModel<T extends Serializable> extends Abstract
         }
     }
 
+    protected boolean executePreSaveTask() {
+        return true;
+    }
+
     private void setSaveEnabled(boolean saveEnabled) {
         this.saveEnabled = saveEnabled;
         log.info("Document save enabled {}", saveEnabled);
index f9b32acc02d08d7e13ba402381643740fee12a1b..34014f429f40ae1c46f81f7992ad443f5ff67a93 100644 (file)
@@ -2,6 +2,7 @@ package hu.user.lis.ui.editor.selector;
 
 import hu.user.lis.services.data.EntityDataServiceBase;
 import hu.user.lis.ui.data.CachedSpringDataModel;
+import lombok.Getter;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.zkoss.bind.BindContext;
@@ -14,13 +15,22 @@ import org.zkoss.zk.ui.event.InputEvent;
 import org.zkoss.zk.ui.event.OpenEvent;
 import org.zkoss.zul.impl.XulElement;
 
+import java.util.HashMap;
+import java.util.Map;
+
 @Log4j2
 public abstract class EntitySelectorModel<T> {
 
+    private final Map<String, Object> staticFilters = new HashMap<>();
+
     @Autowired
     EntityDataServiceBase entityDataServiceBase;
+
+    @Getter
     private T selectedEntity;
+
     private Object formDocument;
+
     private String member;
 
     public abstract String selectorIdentifier();
@@ -47,20 +57,24 @@ public abstract class EntitySelectorModel<T> {
 
     protected abstract void reset();
 
-    public T getSelectedEntity() {
-        return selectedEntity;
-    }
-
     public void setSelectedEntity(T selectedEntity) {
         this.selectedEntity = selectedEntity;
         entityDataServiceBase.setFieldValue(formDocument, member, selectedEntity);
         BindUtils.postNotifyChange(formDocument, member);
     }
 
-    public void setFormDocument(Object formDocument, String member) {
+    public void configureSelector(Object formDocument, String member) {
         this.formDocument = formDocument;
         this.member = member;
         selectedEntity = (T) entityDataServiceBase.getFieldValue(formDocument, member);
         BindUtils.postNotifyChange(this, "selectedEntity");
     }
+
+    public void addStaticFilter(String kind, Object filter) {
+        staticFilters.put(kind, filter);
+    }
+
+    public Object getFilter(String kind) {
+        return staticFilters.get(kind);
+    }
 }
index a45643e8794aabc34dd50c6f781f640ff2ff60a3..b8eff2d04a07a0852a0b134ab40ed03d9a7d3f79 100644 (file)
@@ -37,10 +37,19 @@ public class EntitySelectorRouter {
         return result;
     }
 
-    public void setFormDocument(Class<?> entityClass, Object formDocument, String member) {
-        usedModels.stream()
-                .filter(m -> m.selectorIdentifier().equals(entityClass.getSimpleName()))
-                .forEach(m -> m.setFormDocument(formDocument, member));
+    public EntitySelectorModel<?> configureSelector(Class<?> entityClass, Object formDocument, String member) {
+        EntitySelectorModel<?> result = null;
+        for (EntitySelectorModel<?> model : usedModels) {
+            if (model.selectorIdentifier().equals(entityClass.getSimpleName())) {
+                model.configureSelector(formDocument, member);
+                result = model;
+                break;
+            }
+        }
+//        usedModels.stream()
+//                .filter(m -> m.selectorIdentifier().equals(entityClass.getSimpleName()))
+//                .forEach(m -> m.configureSelector(formDocument, member));
+        return result;
     }
 
 }
index 080a709d46f6bb124917e574bb680f6ed3260c8b..d503837a06f064a41c70bf4caf3b5cd5d2bd256b 100644 (file)
@@ -14,6 +14,8 @@ import org.springframework.stereotype.Component;
 import org.zkoss.bind.Converter;
 import org.zkoss.zul.impl.XulElement;
 
+import java.util.List;
+
 @Log4j2
 @Getter
 @Setter
@@ -42,11 +44,11 @@ public class ProjectSelectorModel extends EntitySelectorModel<Project> {
 
     @Override
     protected void search(String filter) {
-        projectSelectorDataModel.search(filter);
+        projectSelectorDataModel.search(filter, (List<Long>) getFilter("projects"));
     }
 
     @Override
     protected void reset() {
-        projectSelectorDataModel.search(null);
+        projectSelectorDataModel.search(null, (List<Long>) getFilter("projects"));
     }
 }
index 2070dfd9d9486576462bf1227168dffe77ee6339..1666fc8915b3b5ca8842a935c2af476b0136df6e 100644 (file)
@@ -12,6 +12,7 @@ import lombok.extern.log4j.Log4j2;
 import org.zkoss.bind.annotation.Command;
 import org.zkoss.bind.annotation.Init;
 import org.zkoss.zk.ui.select.annotation.WireVariable;
+import org.zkoss.zul.Messagebox;
 
 import static hu.user.lis.ui.data.CachedDataModel.ASCENDING;
 import static hu.user.lis.ui.data.CachedDataModel.NATURAL;
@@ -72,4 +73,15 @@ public class AssociatesViewModel extends FilterActiveViewModel<Associate> {
         });
     }
 
+    @Command
+    public void onDelete() {
+        Messagebox.show("Biztosan törli a kijelölt elemet?", "Megerősítés",
+                Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, e -> {
+                    if (!e.getName().equals("onCancel")) {
+                        associatesDataModel.delete(getSelectedEntity());
+                        refresh();
+                    }
+                });
+    }
+
 }
index ca91a4fa47e203a400a2982f95f2f3b222dde6ca..3fc73f3b6697df7f652f5b31569ce948523c0dc7 100644 (file)
@@ -79,8 +79,8 @@ public class ServiceRecordsViewModel extends EntityViewModel<ServiceRecord> impl
 
     @AfterCompose
     public void onAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
-        entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate");
-        entitySelectorRouter.setFormDocument(Project.class, this, "filterProject");
+        entitySelectorRouter.configureSelector(Associate.class, this, "filterAssociate");
+        entitySelectorRouter.configureSelector(Project.class, this, "filterProject");
     }
 
     private void refresh() {
@@ -117,8 +117,8 @@ public class ServiceRecordsViewModel extends EntityViewModel<ServiceRecord> impl
     public void onClearFilters() {
         filterAssociate = null;
         filterProject = null;
-        entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate");
-        entitySelectorRouter.setFormDocument(Project.class, this, "filterProject");
+        entitySelectorRouter.configureSelector(Associate.class, this, "filterAssociate");
+        entitySelectorRouter.configureSelector(Project.class, this, "filterProject");
         serviceRecordsDataModel.listAll();
     }
 
@@ -134,8 +134,8 @@ public class ServiceRecordsViewModel extends EntityViewModel<ServiceRecord> impl
             Map<String, Object> data = (Map<String, Object>) evt.getData();
             filterAssociate = (Associate) data.get("filterAssociate");
             filterProject = (Project) data.get("filterProject");
-            entitySelectorRouter.setFormDocument(Associate.class, this, "filterAssociate");
-            entitySelectorRouter.setFormDocument(Project.class, this, "filterProject");
+            entitySelectorRouter.configureSelector(Associate.class, this, "filterAssociate");
+            entitySelectorRouter.configureSelector(Project.class, this, "filterProject");
             serviceRecordsDataModel.search(filterProject, filterAssociate);
         }
 
index 04d0743e2b12d9caa40399f2ed620e0345f973c3..9f1207e68b7c1b2edde4c2ba27f213a2dd2dbffa 100644 (file)
@@ -14,6 +14,8 @@
                     <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
                     <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
                                    disabled="@load(empty vm.selectedEntity)"/>
+                    <toolbarbutton label="Törlés" iconSclass="z-icon-minus" onClick="@command('onDelete')"
+                                   disabled="@load(empty vm.selectedEntity)"/>
                     <separator orient="vertical"/>
                     <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
                                    checked="@bind(vm.filterShowActive)"/>
index 76112ad28917326b4cd2458ea97241e6348f5a99..98809500c116173d4a69d21a7fe6363c4f517863 100644 (file)
@@ -1,7 +1,7 @@
 <?link rel="stylesheet" type="text/css" href="~./static/css/skeleton.css" ?>
 <?link rel="stylesheet" type="text/css" href="~./static/css/webclient.css" ?>
 <zk>
-    <window id="associatePopup" width="60%" height="700px" closable="true"
+    <window id="associatePopup" width="60%" height="450px" closable="true"
             viewModel="@id('vm') @init('hu.user.lis.ui.editor.AssociateEditorModel')">
         <caption label="Munkatárs szerkesztés"/>
         <borderlayout>
index ead141a80e183ee4b1a4ed2ab25bc60673a75501..56e75065351826be6a8390da718378ae17a7ba46 100644 (file)
@@ -49,6 +49,6 @@
                 </listbox>
             </bandpopup>
         </bandbox>
-        <!--        <button iconSclass="z-icon-search-plus" onClick="@command('onPopupPartners')"/>-->
+        <!--        <button iconSclass="z-icon-searchByProject-plus" onClick="@command('onPopupPartners')"/>-->
     </hlayout>
 </zk>
\ No newline at end of file
index 9f099fb21c40e2e155f7d31b59c7aa19bf58eb5d..755c8baa3d2ae3388f74ca82d283030130ce56fd 100644 (file)
@@ -8,6 +8,8 @@
                     <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
                     <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
                                    disabled="@load(empty vm.selectedEntity)"/>
+                    <toolbarbutton label="Törlés" iconSclass="z-icon-minus" onClick="@command('onDelete')"
+                                   disabled="@load(empty vm.selectedEntity)"/>
                     <separator orient="vertical"/>
                     <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
                                    checked="@bind(vm.filterShowActive)"/>
index 24e08e4effb8e91b2a39978c9bd4e22f1e053f10..7a4e145a54aded5e8001b3df31d51f6705a26c35 100644 (file)
@@ -7,6 +7,8 @@
                     <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
                     <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
                                    disabled="@load(empty vm.selectedEntity)"/>
+                    <toolbarbutton label="Törlés" iconSclass="z-icon-minus" onClick="@command('onDelete')"
+                                   disabled="@load(empty vm.selectedEntity)"/>
                     <separator orient="vertical"/>
                     <toolbarbutton mode="toggle" iconSclass="z-icon-check" label="Aktív"
                                    checked="@bind(vm.filterShowActive)"/>
index 821ffb6f4aae4f7ecfc9234618d09d2127846aa4..096d0313d0fbfb17eb183e4d78de39163cda505e 100644 (file)
@@ -8,6 +8,8 @@
                     <toolbarbutton label="Hozzáadás" iconSclass="z-icon-plus" onClick="@command('onAdd')"/>
                     <toolbarbutton label="Szerkesztés" iconSclass="z-icon-edit" onClick="@command('onEdit')"
                                    disabled="@load(empty vm.selectedEntity)"/>
+                    <toolbarbutton label="Törlés" iconSclass="z-icon-minus" onClick="@command('onDelete')"
+                                   disabled="@load(empty vm.selectedEntity)"/>
                     <separator orient="vertical"/>
                     <toolbarbutton label="Törlés" iconSclass="z-icon-minus" onClick="@command('onDelete')"
                                    disabled="@load(empty vm.selectedEntity)"/>