diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java index 041f565666a2f08c16bfe8e224823f1aacad5935..90d82fe8a274136b310ccc6fd4bdca24c861854e 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java +++ b/src/main/java/de/deadlocker8/budgetmaster/controller/PaymentController.java @@ -1,19 +1,24 @@ package de.deadlocker8.budgetmaster.controller; +import de.deadlocker8.budgetmaster.entities.Category; import de.deadlocker8.budgetmaster.entities.CategoryType; import de.deadlocker8.budgetmaster.entities.Payment; import de.deadlocker8.budgetmaster.entities.Settings; +import de.deadlocker8.budgetmaster.repositories.CategoryRepository; import de.deadlocker8.budgetmaster.repositories.PaymentRepository; import de.deadlocker8.budgetmaster.repositories.SettingsRepository; import de.deadlocker8.budgetmaster.services.HelpersService; +import de.deadlocker8.budgetmaster.utils.Colors; +import de.deadlocker8.budgetmaster.validators.CategoryValidator; +import de.deadlocker8.budgetmaster.validators.PaymentValidator; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.CookieValue; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; +import tools.ConvertTo; import java.util.List; @@ -24,6 +29,9 @@ public class PaymentController extends BaseController @Autowired private PaymentRepository paymentRepository; + @Autowired + private CategoryRepository categoryRepository; + @Autowired private SettingsRepository settingsRepository; @@ -89,6 +97,35 @@ public class PaymentController extends BaseController return "redirect:/payments"; } + @RequestMapping("/payments/newPayment") + public String newCategory(Model model) + { + Payment emptyPayment = new Payment(); + model.addAttribute("categories", categoryRepository.findAllByOrderByNameAsc()); + model.addAttribute("payment", emptyPayment); + return "payments/newPayment"; + } + + @RequestMapping(value = "/payments/newPayment", method = RequestMethod.POST) + public String post(Model model, @ModelAttribute("NewPayment") Payment payment, BindingResult bindingResult) + { + PaymentValidator userValidator = new PaymentValidator(); + userValidator.validate(payment, bindingResult); + + if(bindingResult.hasErrors()) + { + model.addAttribute("error", bindingResult); + model.addAttribute("payment", payment); + return "payments/newPayment"; + } + else + { + paymentRepository.save(payment); + } + + return "redirect:/payments"; + } + private boolean isDeletable(Integer ID) { Payment paymentToDelete = paymentRepository.getOne(ID); diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Payment.java b/src/main/java/de/deadlocker8/budgetmaster/entities/Payment.java index 2066b4dab38a8bdf92f6636c46d399133e7a3900..3356c326a5ba7510c36701646123b307ef9cc029 100644 --- a/src/main/java/de/deadlocker8/budgetmaster/entities/Payment.java +++ b/src/main/java/de/deadlocker8/budgetmaster/entities/Payment.java @@ -19,6 +19,10 @@ public class Payment private String description; // private RepeatingDefinition repeatingDefinition; + public Payment() + { + } + public Integer getID() { return ID; diff --git a/src/main/java/de/deadlocker8/budgetmaster/validators/PaymentValidator.java b/src/main/java/de/deadlocker8/budgetmaster/validators/PaymentValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..a9c632f7583ec212c8b894f2cf2b2a6aff7fd87d --- /dev/null +++ b/src/main/java/de/deadlocker8/budgetmaster/validators/PaymentValidator.java @@ -0,0 +1,22 @@ +package de.deadlocker8.budgetmaster.validators; + +import de.deadlocker8.budgetmaster.entities.Payment; +import de.deadlocker8.budgetmaster.utils.Strings; +import org.springframework.validation.Errors; +import org.springframework.validation.ValidationUtils; +import org.springframework.validation.Validator; + + +public class PaymentValidator implements Validator +{ + public boolean supports(Class clazz) + { + return Payment.class.equals(clazz); + } + + public void validate(Object obj, Errors errors) + { + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", Strings.WARNING_EMPTY_PAYMENT_NAME); + ValidationUtils.rejectIfEmptyOrWhitespace(errors, "amount", Strings.WARNING_PAYMENT_AMOUNT); + } +} \ No newline at end of file diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties index 71f48a474859b9ca5cda3584404cc5fa37e3e1e5..e75205f18d0babefe390e1650390e4c8a0b1e009 100644 --- a/src/main/resources/languages/_de.properties +++ b/src/main/resources/languages/_de.properties @@ -292,20 +292,14 @@ menu.logout=Logout category.new.label.name=Name -payment.new.label.name=Name: -payment.new.label.max.characters.name=(max. 150 Zeichen) -payment.new.label.max.characters.description=(max. 200 Zeichen) -payment.new.label.amount=Betrag: -payment.new.label.category=Kategorie: -payment.new.label.date=Datum: -payment.new.label.description=Notiz: -payment.new.label.tags=Tags: -payment.new.label.repeating=Wiederholung: -payment.new.label.repeating.all=Alle -payment.new.label.repeating.days=Tage -payment.new.label.repeating.monthday=jeden Monat am: -payment.new.label.enddate=Enddatum: -payment.new.button.save=Speichern +payment.new.label.name=Name +payment.new.label.amount=Betrag +payment.new.label.category=Kategorie +payment.new.label.date=Datum +payment.new.label.description=Notiz +payment.new.label.tags=Tags +payment.new.label.repeating=Wiederholung + paymenttab.button.filter=Filter paymenttab.label.filter.active=Filter aktiv diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties index 13c7e724279d1464eb686e70277fd0cb419ec52e..10f50b7de83911a22e121b6ce92fec589df3dba3 100644 --- a/src/main/resources/languages/_en.properties +++ b/src/main/resources/languages/_en.properties @@ -292,20 +292,13 @@ menu.logout=Logout category.new.label.name=Name -payment.new.label.name=Name: -payment.new.label.max.characters.name=(up to 150 characters) -payment.new.label.max.characters.description=(up to 200 characters) -payment.new.label.amount=Amount: -payment.new.label.category=Category: -payment.new.label.date=Date: -payment.new.label.description=Description: -payment.new.label.tags=Tags: -payment.new.label.repeating=Repeating: -payment.new.label.repeating.all=every -payment.new.label.repeating.days=days -payment.new.label.repeating.monthday=every month at: -payment.new.label.enddate=Enddate: -payment.new.button.save=Save +payment.new.label.name=Name +payment.new.label.amount=Amount +payment.new.label.category=Category +payment.new.label.date=Date +payment.new.label.description=Description +payment.new.label.tags=Tags +payment.new.label.repeating=Repeating paymenttab.button.filter=Filter paymenttab.label.filter.active=Filter active diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css index 5122a4997b45176751a25771e464a919a57ec8ef..c116eed68cf3a5f638e6fafa3afdc9212d29961f 100644 --- a/src/main/resources/static/css/style.css +++ b/src/main/resources/static/css/style.css @@ -253,6 +253,10 @@ ul.dropdown-content.select-dropdown li span { color: #2E79B9; } +ul.dropdown-content.select-dropdown li.selected { + background-color: rgba(0, 0, 0, 0.15); +} + .hidden { display: none; } diff --git a/src/main/resources/static/js/datePicker.js b/src/main/resources/static/js/datePicker.js index 62eea54a7f6e7be5577dd32bbbb6caebcbb491f8..78044a363273eead7568180e49449432e45b2998 100644 --- a/src/main/resources/static/js/datePicker.js +++ b/src/main/resources/static/js/datePicker.js @@ -1,7 +1,5 @@ $(document).ready(function () { - $(document).ready(function() { - $('select').material_select(); - }); + $('select').material_select(); $("#buttonChooseDate").click(function () { var month = $("#selectMonth").val(); diff --git a/src/main/resources/static/js/payments.js b/src/main/resources/static/js/payments.js index c0002d6fedb20c60a261fc0e2de54c03fec3420b..967ade61448d677f6e73a27c300e497391afb1ae 100644 --- a/src/main/resources/static/js/payments.js +++ b/src/main/resources/static/js/payments.js @@ -1,3 +1,5 @@ $( document ).ready(function() { $('#modalConfirmDelete').modal('open'); + + $('select').material_select(); }); \ No newline at end of file diff --git a/src/main/resources/templates/categories/newCategory.ftl b/src/main/resources/templates/categories/newCategory.ftl index c2fe4d2e41645f4ed4481a108f8f8ea0387be35e..aed5a0f300fe721235ec1844b15e00ee09157ff2 100644 --- a/src/main/resources/templates/categories/newCategory.ftl +++ b/src/main/resources/templates/categories/newCategory.ftl @@ -18,7 +18,7 @@ </div> </div> <div class="container"> - <#import "../validation.ftl" as validation> + <#import "../validation.ftl" as validation> <form name="NewCategory" action="/categories/newCategory" method="post"> <input type="hidden" name="ID" value="<#if category.getID()??>${category.getID()}</#if>"> <div class="row"> diff --git a/src/main/resources/templates/payments/newPayment.ftl b/src/main/resources/templates/payments/newPayment.ftl new file mode 100644 index 0000000000000000000000000000000000000000..a9f10fcc1437d4f5132432e3a8f9cae14481b242 --- /dev/null +++ b/src/main/resources/templates/payments/newPayment.ftl @@ -0,0 +1,96 @@ +<html> + <head> + <#import "../header.ftl" as header> + <@header.header/> + <#assign locale = static["tools.Localization"]> + </head> + <body class="budgetmaster-blue-light"> + <#import "../navbar.ftl" as navbar> + <@navbar.navbar "payments"/> + + <main> + <div class="card main-card"> + <div class="container"> + <div class="section center-align"> + <div class="grey-text text-darken-4 headline"><#if payment.getID()??>${locale.getString("title.payment.edit")}<#else>${locale.getString("title.payment.new")}</#if></div> + </div> + </div> + <div class="container"> + <#import "../validation.ftl" as validation> + <form name="NewPayment" action="/payments/newPayment" method="post"> + <input type="hidden" name="ID" value="<#if payment.getID()??>${payment.getID()}</#if>"> + <div class="row"> + <div class="input-field col s12 m12 l8 offset-l2"> + <input id="payment-name" type="text" name="name" <@validation.validation "name"/> value="<#if payment.getName()??>${payment.getName()}</#if>"> + <label for="payment-name">${locale.getString("payment.new.label.name")}</label> + </div> + </div> + <div class="row"> + <div class="input-field col s12 m12 l8 offset-l2"> + <input id="payment-amount" type="text" name="amount" <@validation.validation "amount"/> value="<#if payment.getAmount()??>${payment.getAmount()}</#if>"> + <label for="payment-amount">${locale.getString("payment.new.label.amount")}</label> + </div> + </div> + <div class="row"> + <div class="input-field col s12 m12 l8 offset-l2"> + <select id="payment-amount" name="category" <@validation.validation "category"/>> + <#list categories as category> + <#if payment.getCategory()??> + <option selected value="${category.getID()}">${category.getName()}</option> + <#else> + <#if category.getType() == "NONE"> + <option selected value="${category.getID()}">${category.getName()}</option> + <#else> + <option value="${category.getID()}">${category.getName()}</option> + </#if> + </#if> + </#list> + </select> + <label for="payment-amount">${locale.getString("payment.new.label.category")}</label> + </div> + </div> + <div class="row"> + <div class="input-field col s12 m12 l8 offset-l2"> + <textarea id="payment-description" class="materialize-textarea" name="description" <@validation.validation "description"/>><#if payment.getDescription()??>${payment.getDescription()}</#if></textarea> + <label for="payment-description">${locale.getString("payment.new.label.description")}</label> + </div> + </div> + <br> + <div class="row hide-on-small-only"> + <div class="col m6 l4 offset-l2 right-align"> + <a href="/payments" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">clear</i>${locale.getString("cancel")}</a> + </div> + + <div class="col m6 l4 left-align"> + <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action"> + <i class="material-icons left">save</i>${locale.getString("save")} + </button> + </div> + </div> + <div class="hide-on-med-and-up"> + <div class="row center-align"> + <div class="col s12"> + <a href="/categories" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">clear</i>${locale.getString("cancel")}</a> + </div> + </div> + <div class="row center-align"> + <div class="col s12"> + <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="buttonSave"> + <i class="material-icons left">save</i>${locale.getString("save")} + </button> + </div> + </div> + </div> + </form> + </div> + </div> + </main> + + <!-- Scripts--> + <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script> + <script src="/js/main.js"></script> + <script src="/js/spectrum.js"></script> + <script src="/js/payments.js"></script> + </body> +</html> \ No newline at end of file