diff --git a/src/main/java/tech/ailef/dbadmin/external/annotations/DisableCreate.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableCreate.java new file mode 100644 index 0000000..df0e4cf --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableCreate.java @@ -0,0 +1,33 @@ +/* + * Spring Boot Database Admin - An automatically generated CRUD admin UI for Spring Boot apps + * Copyright (C) 2023 Ailef (http://ailef.tech) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +package tech.ailef.dbadmin.external.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Disables create actions on the Entity class. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface DisableCreate { +} \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/external/annotations/DisableDelete.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableDelete.java new file mode 100644 index 0000000..069bb76 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableDelete.java @@ -0,0 +1,33 @@ +/* + * Spring Boot Database Admin - An automatically generated CRUD admin UI for Spring Boot apps + * Copyright (C) 2023 Ailef (http://ailef.tech) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +package tech.ailef.dbadmin.external.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Disables delete actions on the Entity class. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface DisableDelete { +} \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/external/annotations/DisableEdit.java b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableEdit.java new file mode 100644 index 0000000..861db32 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/external/annotations/DisableEdit.java @@ -0,0 +1,33 @@ +/* + * Spring Boot Database Admin - An automatically generated CRUD admin UI for Spring Boot apps + * Copyright (C) 2023 Ailef (http://ailef.tech) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +package tech.ailef.dbadmin.external.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Disables edit actions on the Entity class. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface DisableEdit { +} \ 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 0460296..9ed82d8 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -309,6 +309,12 @@ public class DefaultDbAdminController { public String delete(@PathVariable String className, @PathVariable String id, RedirectAttributes attr) { DbObjectSchema schema = dbAdmin.findSchemaByClassName(className); + if (!schema.isDeleteEnabled()) { + attr.addFlashAttribute("errorTitle", "Unable to DELETE row"); + attr.addFlashAttribute("error", "DELETE operations have been disabled on this table."); + return "redirect:/" + properties.getBaseUrl() + "/model/" + className; + } + try { repository.delete(schema, id); } catch (DataIntegrityViolationException e) { @@ -332,6 +338,12 @@ public class DefaultDbAdminController { public String delete(@PathVariable String className, @RequestParam String[] ids, RedirectAttributes attr) { DbObjectSchema schema = dbAdmin.findSchemaByClassName(className); + if (!schema.isDeleteEnabled()) { + attr.addFlashAttribute("errorTitle", "Unable to DELETE rows"); + attr.addFlashAttribute("error", "DELETE operations have been disabled on this table."); + return "redirect:/" + properties.getBaseUrl() + "/model/" + className; + } + int countDeleted = 0; for (String id : ids) { try { 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 922e97a..de8f51f 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbObjectSchema.java @@ -38,6 +38,9 @@ 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.DisableCreate; +import tech.ailef.dbadmin.external.annotations.DisableDelete; +import tech.ailef.dbadmin.external.annotations.DisableEdit; import tech.ailef.dbadmin.external.annotations.HiddenColumn; import tech.ailef.dbadmin.external.dto.MappingError; import tech.ailef.dbadmin.external.exceptions.DbAdminException; @@ -335,6 +338,18 @@ public class DbObjectSchema { }).toList(); } + public boolean isDeleteEnabled() { + return entityClass.getAnnotation(DisableDelete.class) == null; + } + + public boolean isEditEnabled() { + return entityClass.getAnnotation(DisableEdit.class) == null; + } + + public boolean isCreateEnabled() { + return entityClass.getAnnotation(DisableCreate.class) == null; + } + /** * Returns all the data in this schema, as `DbObject`s * @return diff --git a/src/main/resources/static/css/dbadmin.css b/src/main/resources/static/css/dbadmin.css index bfe5ccd..ae4d702 100644 --- a/src/main/resources/static/css/dbadmin.css +++ b/src/main/resources/static/css/dbadmin.css @@ -30,6 +30,15 @@ a { background: #EDECEF; } +.btn-secondary.disable { + background-color: #A8ADB3; + border: 1px solid #A8ADB3; +} + +form.delete-form button.disable .bi { + color: #9298A0 !important; +} + .null-label { background-color: #EEE; border-radius: 5px; diff --git a/src/main/resources/static/js/table.js b/src/main/resources/static/js/table.js index 9790e92..51971b4 100644 --- a/src/main/resources/static/js/table.js +++ b/src/main/resources/static/js/table.js @@ -1,7 +1,16 @@ function updateBulkActions(table, selected) { + let deleteEnabled = table.dataset.deleteenabled; + let divs = document.querySelectorAll(".bulk-actions"); divs.forEach(div => { - div.innerHTML = `${selected} items selected `; + if (deleteEnabled === "true") { + div.innerHTML = `${selected} items selected + `; + } else { + + div.innerHTML = `

DELETE not allowed on this table

`; + } }); } diff --git a/src/main/resources/templates/fragments/data_row.html b/src/main/resources/templates/fragments/data_row.html index a62978d..beac689 100644 --- a/src/main/resources/templates/fragments/data_row.html +++ b/src/main/resources/templates/fragments/data_row.html @@ -5,14 +5,15 @@ + th:value="${row.getPrimaryKeyValue()}" form="multi-delete-form" + th:classAppend="|${!schema.isDeleteEnabled() ? 'disable' : ''}|">
- +
-
+

This table contains no data.

@@ -30,7 +32,8 @@ - +