From: elgekko Date: Sat, 5 Aug 2023 20:33:52 +0000 (+0200) Subject: Profile settings for view column sort orders X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=5657670c48941b5e15a600db0c4a7f722657ef05;p=sly-crm.git Profile settings for view column sort orders --- diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 3adb055..4431c81 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,7 +2,9 @@ + + diff --git a/KB.md b/KB.md index 2e92b52..2bb18c4 100644 --- a/KB.md +++ b/KB.md @@ -36,6 +36,7 @@ https://www.baeldung.com/spring-email ##### ZK +https://www.zkoss.org/documentation#References https://www.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml/The_Library_Properties https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/Performance_Tips https://www.zkoss.org/wiki/ZK%20Developer%27s%20Reference/Performance%20Tips/Listbox,%20Grid%20and%20Tree%20for%20Huge%20Data/Implement%20ListModel%20and%20TreeModel @@ -43,6 +44,8 @@ https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/MVC/Controller/Wire_Variab https://www.zkoss.org/wiki/ZK_Client-side_Reference/General_Control/Client-side_selection_of_elements_and_widgets https://www.zkoss.org/wiki/ZK_Developer%27s_Reference/Testing/Testing_Tips https://www.zkoss.org/wiki/Small_Talks/2013/October/ZK_Testing_with_Sahi +https://zkfiddle.org/sample/3ltrsms/9-Grid-style-7-1 +https://zkfiddle.org/sample/3bmc52p/1-detect-dark-mode ##### Spring ZK diff --git a/lis-app/src/main/resources/application-dev.yaml b/lis-app/src/main/resources/application-dev.yaml index fe83809..fe39966 100644 --- a/lis-app/src/main/resources/application-dev.yaml +++ b/lis-app/src/main/resources/application-dev.yaml @@ -24,7 +24,12 @@ spring: logging: level: org.hibernate.engine.jdbc.spi.SqlExceptionHelper: ERROR -# org.springframework.security: DEBUG +hu: + user-ibm: + sly-crm: + ui: + user-name: user + password: password # org.springframework.security.web: INFO # pattern: # console: "%d %-5level %logger : %msg%n" diff --git a/lis-db/migrations/README b/lis-db/migrations/README index 641e4e9..8dcc3a6 100644 --- a/lis-db/migrations/README +++ b/lis-db/migrations/README @@ -48,8 +48,11 @@ Enjoy. DOCKER -docker run -itd --name lis --privileged=true -p 50000:50000 -p 27017:27017 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=true -v /Docker:/database ibmcom/db2 +docker run -itd --name lis --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INSTANCE=db2admin -e DB2INST1_PASSWORD=password -e DBNAME=lis -e PERSISTENT_HOME=true -v /Docker:/database ibmcom/db2 docker logs -f lis docker exec -it lis bash docker stop lis docker remove lis + +MIGRATE +migrate new create profile --idpattern=000 diff --git a/lis-db/migrations/scripts/005_create_profile.sql b/lis-db/migrations/scripts/005_create_profile.sql new file mode 100644 index 0000000..cfc8ed2 --- /dev/null +++ b/lis-db/migrations/scripts/005_create_profile.sql @@ -0,0 +1,16 @@ +-- // create profile +-- Migration SQL that makes the change goes here. + +CREATE TABLE profile ( + id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, + login VARCHAR(255), + type VARCHAR(255), + setting CLOB, + CONSTRAINT pk_profile PRIMARY KEY (id) +); +CREATE UNIQUE INDEX UDX_PROFILE_LOGIN_TYPE ON PROFILE(LOGIN, TYPE); + +-- //@UNDO +-- SQL to undo the change goes here. +DROP TABLE profile; + diff --git a/lis-db/src/main/java/hu/user/lis/db/Profile.java b/lis-db/src/main/java/hu/user/lis/db/Profile.java new file mode 100644 index 0000000..1e800a8 --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/Profile.java @@ -0,0 +1,24 @@ +package hu.user.lis.db; + +import lombok.*; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.io.Serializable; + +@Getter +@Setter +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Profile implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + String login; + String type; + String setting; +} diff --git a/lis-db/src/main/java/hu/user/lis/db/repository/ProfileRepository.java b/lis-db/src/main/java/hu/user/lis/db/repository/ProfileRepository.java new file mode 100644 index 0000000..9da06ba --- /dev/null +++ b/lis-db/src/main/java/hu/user/lis/db/repository/ProfileRepository.java @@ -0,0 +1,17 @@ +package hu.user.lis.db.repository; + +import hu.user.lis.db.Profile; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface ProfileRepository extends JpaRepository { + + Optional findByLoginAndType(String login, String type); + + List findAllByLogin(String login); + + void deleteAllByLogin(String login); + +} diff --git a/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java index bd57725..58697ba 100644 --- a/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java +++ b/lis-services/src/main/java/hu/user/lis/services/data/EntityDataService.java @@ -41,6 +41,16 @@ public class EntityDataService extends EntityDataService return result; } + public T fromJSON(String data, Class objectClass) { + T result = null; + try { + result = (T) objectMapper.readValue(data, objectClass); + } catch (JsonProcessingException e) { + log.catching(e); + } + return result; + } + public boolean areEquals(T entity1, T entity2) { boolean result = true; String json1 = toJSON(entity1); diff --git a/lis-ui/src/main/java/hu/user/lis/ui/SlyCrmUIProperties.java b/lis-ui/src/main/java/hu/user/lis/ui/SlyCrmUIProperties.java new file mode 100644 index 0000000..136c478 --- /dev/null +++ b/lis-ui/src/main/java/hu/user/lis/ui/SlyCrmUIProperties.java @@ -0,0 +1,15 @@ +package hu.user.lis.ui; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Getter +@Setter +@Component +@ConfigurationProperties(prefix = "hu.user-ibm.sly-crm.ui") +public class SlyCrmUIProperties { + String userName; + String password; +} diff --git a/lis-ui/src/main/java/hu/user/lis/ui/auth/CurrentProfile.java b/lis-ui/src/main/java/hu/user/lis/ui/auth/CurrentProfile.java index a8700fe..8402070 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/auth/CurrentProfile.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/auth/CurrentProfile.java @@ -1,16 +1,48 @@ package hu.user.lis.ui.auth; import hu.user.lis.db.Associate; +import hu.user.lis.db.Profile; +import hu.user.lis.db.repository.ProfileRepository; import lombok.Getter; -import lombok.Setter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + @Service -@Getter -@Setter public class CurrentProfile { + @Autowired + ProfileRepository profileRepository; + @Getter + Associate associate; + + @Getter + Map settings = new HashMap<>(); + + public void setAssociate(Associate associate) { + this.associate = associate; + loadSettings(); + } + + private void loadSettings() { + List profileSettings = profileRepository.findAllByLogin(associate.getLogin()); + settings = profileSettings.stream().collect(Collectors.toMap(Profile::getType, p -> p)); + } - private Associate associate; + public Profile getSetting(String type) { + return settings.get(type); + } - + public void addSetting(Profile columnProfile) { + Profile existing = settings.get(columnProfile.getType()); + if (Objects.nonNull(existing)) { + columnProfile.setId(existing.getId()); + } + settings.put(columnProfile.getType(), columnProfile); + profileRepository.save(columnProfile); + } } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java index 3c491d7..8e000b9 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/data/CachedSpringDataModel.java @@ -1,8 +1,12 @@ package hu.user.lis.ui.data; +import hu.user.lis.db.Profile; +import hu.user.lis.services.data.EntityDataService; +import hu.user.lis.ui.auth.CurrentProfile; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -10,6 +14,9 @@ import org.springframework.stereotype.Component; import org.zkoss.json.JSONObject; import org.zkoss.zul.FieldComparator; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Objects; @Component @@ -18,12 +25,37 @@ public abstract class CachedSpringDataModel extends CachedDataModel { @Getter @Setter - JSONObject cols = new JSONObject(); + JSONObject columnSettings = new JSONObject(); - public void addColumn(String name, String direction) { + @Autowired + CurrentProfile currentProfile; + + @Autowired + EntityDataService entityDataService; + + public void addColumns(Map columns) { + Profile profile = currentProfile.getSetting(getClass().getSimpleName()); + if (Objects.isNull(profile)) { + columns.keySet().forEach(colName -> addColumn(colName, columns.get(colName))); + saveProfileSetting(); + } else { + columnSettings = entityDataService.fromJSON(profile.getSetting(), JSONObject.class); + } + } + + private void saveProfileSetting() { + Profile columnProfile = Profile.builder() + .login(currentProfile.getAssociate().getLogin()) + .type(getClass().getSimpleName()) + .setting(entityDataService.toJSON(columnSettings)) + .build(); + currentProfile.addSetting(columnProfile); + } + + private void addColumn(String name, String direction) { JSONObject sort = new JSONObject(); sort.put("sortDirection", direction); - cols.put(name, sort); + columnSettings.put(name, sort); if (!direction.equals(NATURAL)) { setSortComparator(new FieldComparator(name, direction.equals(ASCENDING))); @@ -42,5 +74,23 @@ public abstract class CachedSpringDataModel extends CachedDataModel { log.info("{} {}", getClass().getSimpleName(), pageable); return pageable; } + + @Override + public void sort(Comparator cmpr, boolean ascending) { + super.sort(cmpr, ascending); + + FieldComparator sortComparator = (FieldComparator) cmpr; + columnSettings.keySet().forEach(colName -> { + LinkedHashMap col = (LinkedHashMap) columnSettings.get(colName); + if (colName.equals(sortComparator.getRawOrderBy())) { + col.put("sortDirection", ascending ? ASCENDING : DESCENDING); + } else { + col.put("sortDirection", NATURAL); + } + }); + saveProfileSetting(); + log.info("Sort settings for {} : {}", getClass().getSimpleName(), columnSettings.toJSONString()); + } + } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java index 834be1b..2070dfd 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/AssociatesViewModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.view; +import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Associate; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.AssociatesDataModel; @@ -34,9 +35,11 @@ public class AssociatesViewModel extends FilterActiveViewModel { @Init public void init() { super.init(); - addColumn("name", ASCENDING); - addColumn("login", NATURAL); - addColumn("active", NATURAL); + addColumns(ImmutableMap.of( + "name", ASCENDING, + "login", NATURAL, + "active", NATURAL + )); } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/LoginViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/LoginViewModel.java index b2075f9..579cdee 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/LoginViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/LoginViewModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.view; +import hu.user.lis.ui.SlyCrmUIProperties; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.springframework.boot.info.BuildProperties; @@ -13,6 +14,9 @@ public class LoginViewModel { @WireVariable BuildProperties buildProperties; + @WireVariable + SlyCrmUIProperties slyCrmUIProperties; + public LoginViewModel() { } diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java index a7030bc..d2e51c3 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/PartnersViewModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.view; +import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Partner; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.CachedSpringDataModel; @@ -34,10 +35,12 @@ public class PartnersViewModel extends FilterActiveViewModel { @Init public void init() { super.init(); - addColumn("name", ASCENDING); - addColumn("vatNr", NATURAL); - addColumn("address", NATURAL); - addColumn("active", NATURAL); + addColumns(ImmutableMap.of( + "name", ASCENDING, + "vatNr", NATURAL, + "address", NATURAL, + "active", NATURAL + )); } protected void refresh() { diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java index e5ea839..8e31c07 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ProjectsViewModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.view; +import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Project; import hu.user.lis.ui.Constants; import hu.user.lis.ui.data.CachedSpringDataModel; @@ -44,12 +45,14 @@ public class ProjectsViewModel extends FilterActiveViewModel implements public void init() { super.init(); eventBus.register(this); - addColumn("humanId", ASCENDING); - addColumn("partner.name", NATURAL); - addColumn("projectStatus.name", NATURAL); - addColumn("name", NATURAL); - addColumn("contactName", NATURAL); - addColumn("active", NATURAL); + addColumns(ImmutableMap.of( + "humanId", ASCENDING, + "partner.name", NATURAL, + "projectStatus.name", NATURAL, + "name", NATURAL, + "contactName", NATURAL, + "active", NATURAL + )); } protected void refresh() { diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java index 03b69b6..ca91a4f 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/ServiceRecordsViewModel.java @@ -1,5 +1,6 @@ package hu.user.lis.ui.view; +import com.google.common.collect.ImmutableMap; import hu.user.lis.db.Associate; import hu.user.lis.db.Project; import hu.user.lis.db.ServiceRecord; @@ -65,13 +66,15 @@ public class ServiceRecordsViewModel extends EntityViewModel impl super.init(); eventBus.register(this); eventBus.registerForBinding(this); - addColumn("project.humanId", ASCENDING); - addColumn("project.name", NATURAL); - addColumn("project.partner.name", NATURAL); - addColumn("associate.name", NATURAL); - addColumn("workDay", NATURAL); - addColumn("description", NATURAL); - addColumn("workHours", NATURAL); + addColumns(ImmutableMap.of( + "project.humanId", ASCENDING, + "project.name", NATURAL, + "project.partner.name", NATURAL, + "associate.name", NATURAL, + "workDay", NATURAL, + "description", NATURAL, + "workHours", NATURAL + )); } @AfterCompose diff --git a/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java index 97b261b..578cad2 100644 --- a/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java +++ b/lis-ui/src/main/java/hu/user/lis/ui/view/common/EntityViewModel.java @@ -16,6 +16,7 @@ import org.zkoss.zk.ui.util.Clients; import org.zkoss.zkplus.spring.DelegatingVariableResolver; import java.io.Serializable; +import java.util.Map; import java.util.Set; @@ -31,14 +32,14 @@ public abstract class EntityViewModel { @WireVariable EntityDataService entityDataService; - protected void addColumn(String name, String direction) { - getDataModel().addColumn(name, direction); + protected void addColumns(Map columns) { + getDataModel().addColumns(columns); } public JSONObject getCols() { - return getDataModel().getCols(); + return getDataModel().getColumnSettings(); } - + abstract protected CachedSpringDataModel getDataModel(); @AfterCompose diff --git a/lis-ui/src/main/resources/web/editor/associate-editor.zul b/lis-ui/src/main/resources/web/editor/associate-editor.zul index 7891406..49bbae4 100644 --- a/lis-ui/src/main/resources/web/editor/associate-editor.zul +++ b/lis-ui/src/main/resources/web/editor/associate-editor.zul @@ -13,9 +13,13 @@ +