From ca1931cda6dcadcc16edd7bfdb9c47f1cec550b9 Mon Sep 17 00:00:00 2001 From: Francesco Date: Tue, 26 Sep 2023 16:38:42 +0200 Subject: [PATCH] WIP --- .../external/annotations/Filterable.java | 1 + .../controller/DefaultDbAdminController.java | 1 - .../dbmapping/AdvancedJpaRepository.java | 8 +- .../dbadmin/external/dbmapping/DbField.java | 41 +++++ .../external/dbmapping/DbFieldValue.java | 20 ++- .../external/dbmapping/DbObjectSchema.java | 32 +++- src/main/resources/static/css/dbadmin.css | 13 ++ src/main/resources/static/js/filters.js | 2 +- .../resources/templates/fragments/forms.html | 147 +++++++++++------- src/main/resources/templates/home.html | 100 ------------ src/main/resources/templates/model/list.html | 3 +- 11 files changed, 202 insertions(+), 166 deletions(-) diff --git a/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java b/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java index 2f40d79..463a02e 100644 --- a/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/Filterable.java @@ -16,4 +16,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Filterable { + public String type() default ""; } \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index 7f75d3a..ea27765 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -19,7 +19,6 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java index e08efd0..7e40c84 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java @@ -90,7 +90,7 @@ public class AdvancedJpaRepository extends SimpleJpaRepository { .collect(Collectors.toList()); List queryPredicates = new ArrayList<>(); - if (q != null) { + if (q != null && !q.isBlank()) { for (DbField f : stringFields) { Path path = root.get(f.getJavaName()); queryPredicates.add(cb.like(cb.lower(cb.toString(path)), "%" + q.toLowerCase() + "%")); @@ -118,15 +118,15 @@ public class AdvancedJpaRepository extends SimpleJpaRepository { ); } else if (op == CompareOperator.EQ) { finalPredicates.add( - cb.equal(root.get(field), value) + cb.equal(root.get(field), Double.parseDouble(value.toString())) ); } else if (op == CompareOperator.GT) { finalPredicates.add( - cb.greaterThan(root.get(field), value.toString()) + cb.greaterThan(root.get(field), Double.parseDouble(value.toString())) ); } else if (op == CompareOperator.LT) { finalPredicates.add( - cb.lessThan(root.get(field), value.toString()) + cb.lessThan(root.get(field), Double.parseDouble(value.toString())) ); } else if (op == CompareOperator.AFTER) { if (value instanceof LocalDate) diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java index 5162a91..735af4f 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbField.java @@ -1,10 +1,15 @@ package tech.ailef.dbadmin.external.dbmapping; import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import com.fasterxml.jackson.annotation.JsonIgnore; import tech.ailef.dbadmin.external.annotations.DisplayImage; +import tech.ailef.dbadmin.external.annotations.Filterable; public class DbField { protected String dbName; @@ -128,6 +133,25 @@ public class DbField { return type == DbFieldType.TEXT; } + public boolean isFilterable() { + return getPrimitiveField().getAnnotation(Filterable.class) != null; + } + + public boolean isFilterableCategorical() { + Filterable filterable = getPrimitiveField().getAnnotation(Filterable.class); + return filterable != null && filterable.type().equalsIgnoreCase("categorical"); + } + + public Set getAllValues() { + List findAll = schema.getJpaRepository().findAll(); + Set allValues = new HashSet<>(); + for (Object o : findAll) { + DbFieldValue val = new DbObject(o, schema).get(this); + allValues.add(val); + } + return allValues; + } + @Override public String toString() { return "DbField [name=" + dbName + ", javaName=" + javaName + ", type=" + type + ", field=" + field @@ -135,6 +159,23 @@ public class DbField { + ", schema=" + schema.getClassName() + "]"; } + @Override + public int hashCode() { + return Objects.hash(dbName, type); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DbField other = (DbField) obj; + return Objects.equals(dbName, other.dbName) && type == other.type; + } + } diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java index 0dd7918..6575818 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldValue.java @@ -1,5 +1,7 @@ package tech.ailef.dbadmin.external.dbmapping; +import java.util.Objects; + import com.fasterxml.jackson.annotation.JsonIgnore; public class DbFieldValue { @@ -39,6 +41,22 @@ public class DbFieldValue { public String toString() { return "DbFieldValue [value=" + value + ", field=" + field + "]"; } - + @Override + public int hashCode() { + return Objects.hash(field, value); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DbFieldValue other = (DbFieldValue) obj; + return Objects.equals(field, other.field) && Objects.equals(value, other.value); + } + } diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java index 89b2c7e..aaf594a 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -18,7 +19,6 @@ import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import tech.ailef.dbadmin.external.DbAdmin; import tech.ailef.dbadmin.external.annotations.ComputedColumn; -import tech.ailef.dbadmin.external.annotations.Filterable; import tech.ailef.dbadmin.external.exceptions.DbAdminException; import tech.ailef.dbadmin.external.misc.Utils; @@ -182,13 +182,41 @@ public class DbObjectSchema { public List getFilterableFields() { return getSortedFields().stream().filter(f -> { return !f.isBinary() && !f.isPrimaryKey() - && f.getPrimitiveField().getAnnotation(Filterable.class) != null; + && f.isFilterable(); }).toList(); } + + public List findAll() { + List r = jpaRepository.findAll(); + List results = new ArrayList<>(); + for (Object o : r) { + results.add(new DbObject(o, this)); + } + return results; + } @Override public String toString() { return "DbObjectSchema [fields=" + fields + ", className=" + entityClass.getName() + "]"; } + + @Override + public int hashCode() { + return Objects.hash(tableName); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DbObjectSchema other = (DbObjectSchema) obj; + return Objects.equals(tableName, other.tableName); + } + + } diff --git a/src/main/resources/static/css/dbadmin.css b/src/main/resources/static/css/dbadmin.css index ddc1e93..d3b3f38 100644 --- a/src/main/resources/static/css/dbadmin.css +++ b/src/main/resources/static/css/dbadmin.css @@ -181,6 +181,19 @@ AUTOCOMPLETE background-color: #F0F0F0; } +ul.categorical-select { + list-style-type: none; + margin-bottom: 0px; +} + +ul.categorical-select button { + color: #007fd0; + text-decoration: underline; + background: transparent; + border: none; +} + + /** * Images */ diff --git a/src/main/resources/static/js/filters.js b/src/main/resources/static/js/filters.js index befd667..42b49b7 100644 --- a/src/main/resources/static/js/filters.js +++ b/src/main/resources/static/js/filters.js @@ -9,7 +9,7 @@ document.addEventListener("DOMContentLoaded", () => { activeFilters.forEach(activeFilter => { activeFilter.addEventListener('click', function(e) { let formId = e.target.dataset.formid; - document.getElementById(formId).submit() + document.getElementById(formId).submit(); }); }); diff --git a/src/main/resources/templates/fragments/forms.html b/src/main/resources/templates/fragments/forms.html index 110203a..4035955 100644 --- a/src/main/resources/templates/fragments/forms.html +++ b/src/main/resources/templates/fragments/forms.html @@ -46,64 +46,99 @@
- -
- - - - - - -
- - - - Equals - -
- - -
+ Propagate queryParams containing other filters with hidden fields + + + + Handle non categorical filter + + +
+ + + + + + + + + + Equals + +
+ + +
+
-
- -
- - - - - - - - + + + + + + + +
+ + + Handle categorical filter + + +
    +
  • +
    + + + + + - - -
- - - + + + + + + +
+ +
    +
  • +
    + + + + + + + + + +
    +
  • +
+
+
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 8960472..015fa73 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -58,108 +58,8 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/model/list.html b/src/main/resources/templates/model/list.html index fa5a9e5..a35ff0d 100644 --- a/src/main/resources/templates/model/list.html +++ b/src/main/resources/templates/model/list.html @@ -81,7 +81,8 @@ + > + [[ ${filter}]]