ContactApp.java
package sk.iway.basecms.contact;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.PathFilter;
import sk.iway.iwcm.components.WebjetComponentAbstract;
import sk.iway.iwcm.system.annotations.DefaultHandler;
import sk.iway.iwcm.system.annotations.WebjetAppStore;
import sk.iway.iwcm.system.annotations.WebjetComponent;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
/**
* <p>Príkladová trieda pre komponentu - http://docs.webjetcms.sk/v2022/#/custom-apps/spring-mvc/</p>
* <p>Trieda musí byt anotovaná @WebjetComponent, pre názov v anotácii sa musí použiť celý názov triedy aj s package</p>
* <p>Príklad include:</p>
* <code>!INCLUDE(sk.iway.basecms.contact.ContactApp, country="sk")!</code>
*
* Anotacia @WebjetAppStore zabezpeci zobrazenie aplikacie v zozname aplikacii v editore (v AppStore)
*
* V pripade, ze nejaka metoda ma byt dostupna len pre prihlaseneho pouzivatela, admina, prip. nejaku pouzivatelsku skupinu mozeme pouzit anotacie:
* @PreAuthorize("@WebjetSecurityService.isLogged()") - prihalseny pouzivatel
* @PreAuthorize("@WebjetSecurityService.isAdmin()") - admin
* @PreAuthorize("@WebjetSecurityService.isInUserGroup('nazov-skupiny')") - patri do skupiny
* @see sk.iway.iwcm.system.spring.services.WebjetSecurityService
*/
@WebjetComponent("sk.iway.basecms.contact.ContactApp")
@WebjetAppStore(nameKey = "apps.contact.title", descKey = "apps.contact.desc", imagePath = "ti ti-id", galleryImages = "/components/map/screenshot-1.jpg,/components/gdpr/screenshot-2.png,/components/gallery/screenshot-3.jpg", commonSettings = false)
@Getter
@Setter
public class ContactApp extends WebjetComponentAbstract {
//Spring DATA repozitar
@JsonIgnore
private ContactRepository contactRepository;
/**
* Privatne vlastnosti s get/set-rami slúžia na prenesenie parametrov pageParams z !INCLUDE()! do triedy
* Pomocou anotacie @DataTableColumn vytvarame pole pre nastavenie aplikacie
*/
@DataTableColumn(inputType = DataTableColumnType.SELECT, title = "components.contact.property.country" , tab = "basic", editor = {
@DataTableColumnEditor(
options = {
//klasicky option tag
//@DataTableColumnEditorAttr(key = "Slovensky", value = "sk"),
//ukazka ziskania zoznamu krajin volanim statickej metody, vo value su mena property pre text a hodnotu option pola
@DataTableColumnEditorAttr(key = "method:sk.iway.basecms.contact.ContactRestController.getCountries", value = "label:value")
//ukazka napojenia na ciselnik, mozne je zadat meno alebo ID ciselnika, vo value su mena property pre text a hodnotu option pola
//@DataTableColumnEditorAttr(key = "enumeration:Okresne Mestá", value = "string1:string2")
}
)
})
private String country;
@Autowired
public ContactApp(ContactRepository contactRepository) {
this.contactRepository = contactRepository;
}
/**
* metoda init sa vola po vytvoreni objektu a nastaveni parametrov,
* je volana pred kazdym view volanim a umozni nastavit pripadne atributy
* @param request
* @param response
*/
@Override
public void init(HttpServletRequest request, HttpServletResponse response) {
Logger.debug(ContactApp.class, "Init call, request.getHeader(User-Agent)="+request.getHeader("User-Agent"));
}
/**
* Metóda anotovaná @DefaultHandler sa vykoná, ak v requeste nie je žiaden parameter, ktorý by sa zhodoval s názvom inej metódy v triede
* Metóda môže mať ľubovolný názov
* @param model
* @param request
* @return String URL adresa súboru ktorý bude v contente renderovaný namiesto !INCLUDE()!
*/
@DefaultHandler
public String view(Model model, HttpServletRequest request)
{
model.addAttribute("contants", contactRepository.findAllByCountry(country, null));
return "/apps/contact/mvc/list";
}
/**
* Metóda edit slúži na zobrazenie formuláru pre úpravu existujúceho záznamu
* @param id
* @param model
* @param request
* @return
*/
public String edit(@RequestParam("id") long id, Model model, HttpServletRequest request) {
ContactEntity contact = contactRepository.getById(id);
model.addAttribute("entity", contact);
//pridaj do modelu moznosti pre select country
model.addAttribute("countries", ContactRestController.getCountries());
return "/apps/contact/mvc/edit";
}
/**
* Metóda edit slúži na zobrazenie formuláru pre úpravu existujúceho záznamu
* @param model
* @param request
* @return
*/
public String add(Model model) {
ContactEntity contact = new ContactEntity();
//tu mozete nastavit nejake default hodnoty
contact.setCountry("sk");
//pridaj do modelu moznosti pre select country
model.addAttribute("countries", ContactRestController.getCountries());
model.addAttribute("entity", contact);
return "/apps/contact/mvc/edit";
}
/**
* Metóda saveForm slúži na validáciu a uloženie úpravy existujúceho záznamu
* @param entity
* @param result
* @param model
* @param request
* @return
*/
public String saveForm(@Valid @ModelAttribute("entity") ContactEntity entity, BindingResult result, Model model, HttpServletRequest request) {
if (!result.hasErrors()) {
contactRepository.save(entity);
return "redirect:" + PathFilter.getOrigPath(request);
}
model.addAttribute("error", result);
model.addAttribute("entity", entity);
return "/apps/contact/mvc/edit";
}
}