custom:development_creazione_nuovo_menu_terzo_livello_leafitem

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Prossima revisione
Revisione precedente
custom:development_creazione_nuovo_menu_terzo_livello_leafitem [2019/12/18 10:45]
giorgio.scali creata
custom:development_creazione_nuovo_menu_terzo_livello_leafitem [2023/03/10 10:43] (versione attuale)
giorgio.scali
Linea 1: Linea 1:
 ======Creazione Nuovo Menu Terzo Livello (leafItem)====== ======Creazione Nuovo Menu Terzo Livello (leafItem)======
  
-**In Generale**+=== In Generale ​===
  
 In Geoweb, un menu di terzo livello, è una particolare tipologia di menu. Più menu di terzo livello (da ora in poi TLM, //Third Level Menu//) sono collegati gerarchicamente ad un unico menu di secondo livello (da ora in poi SLM, //Second Level Menu//). In Geoweb, un menu di terzo livello, è una particolare tipologia di menu. Più menu di terzo livello (da ora in poi TLM, //Third Level Menu//) sono collegati gerarchicamente ad un unico menu di secondo livello (da ora in poi SLM, //Second Level Menu//).
Linea 11: Linea 11:
  
 Esempio: Esempio:
- +<code xml> 
-    <​accordionPaneItem name="​slm1"​ label="​Second Level Menu Item" image=""​ type="​leafItemContainer">​ +<​accordionPaneItem name="​slm1"​ label="​Second Level Menu Item" image=""​ type="​leafItemContainer">​ 
-        <​leafItem name="​tlm1"​ label="​Thirdd Level Menu Item" image=""​ type="​gwClassList">​+    <​leafItem name="​tlm1"​ label="​Thirdd Level Menu Item" image=""​ type="​gwClassList">​
         <​parameter name="​gwClassName"​ value="​class_name"></​parameter>​         <​parameter name="​gwClassName"​ value="​class_name"></​parameter>​
     </​leafItem>​     </​leafItem>​
-    ​</​accordionPaneItem> ​+</​accordionPaneItem>  
 +</code>
  
 In Geoweb sono definiti molteplici tipi di leafItem, tra cui.  In Geoweb sono definiti molteplici tipi di leafItem, tra cui. 
Linea 35: Linea 36:
 Altre tipologie di leafItem sono definite dai vari //plugin// di Geoweb, ed è previsto un meccanismo per poter facilmente crearne di nuove. Altre tipologie di leafItem sono definite dai vari //plugin// di Geoweb, ed è previsto un meccanismo per poter facilmente crearne di nuove.
  
-**Nuovo LeafItem**+=== Nuovo LeafItem ​===
  
 Per definire una nuova tipologia di leafItem semplicemente popolare l'​attributo //type// del tag //​leafItem//​ con un valore univoco. Per definire una nuova tipologia di leafItem semplicemente popolare l'​attributo //type// del tag //​leafItem//​ con un valore univoco.
 Esempio per un ipotetico leafItem di type gwPluginType:​ Esempio per un ipotetico leafItem di type gwPluginType:​
- +<code xml> 
-     ​<​accordionPaneItem name="​slm1"​ label="​Second Level Menu Item" image=""​ type="​leafItemContainer">​ +<​accordionPaneItem name="​slm1"​ label="​Second Level Menu Item" image=""​ type="​leafItemContainer">​ 
-         ​<​leafItem name="​tlm1"​ label="​Thirdd Level Menu Item" image=""​ type="​gwPluginType"> ​        +    <​leafItem name="​tlm1"​ label="​Thirdd Level Menu Item" image=""​ type="​gwPluginType"> ​        
-         ​</​leafItem>​ +    </​leafItem>​ 
-     ​</​accordionPaneItem>​+</​accordionPaneItem
 +</code>
  
 In risposta al click su un leafItem, di norma viene aperta una specifica scheda (fanno eccezione solo particolari tipi di leafItem, gestiti ad hoc, come gwAction). In risposta al click su un leafItem, di norma viene aperta una specifica scheda (fanno eccezione solo particolari tipi di leafItem, gestiti ad hoc, come gwAction).
Linea 52: Linea 54:
   * per **contenuto** la //pagina jsp del modelAndView Spring// ritornato dal controller mappato come nell'​esempio sotto. I parametri //​projectType//​ e //​projectName//​ vengono aggiunti in automatico. Il controller Wrapper non rimanda alla jsp con il contenuto vero e proprio, ma ad un contenitore,​ specifico per ogni projectType,​ che a sua volta si occuperà di recuperare il contenuto della scheda tramite //​wrappedPageAddress//​ ( corredato da  eventuali parametri di //POST//), che è mappato da Sprimg MVC al controller sottostante gwPluginType. Questo modus operandi prevede che ci siano per ogni tipologia di leafItem che apre un tab, un file .jsp wrapper per ogni tipologia di progetto (attualmente GeoManger e GeoExplorer). Ci sono apposite cartelle di tipo progetto sotto jsp/ per ospitare questi wrapper.   * per **contenuto** la //pagina jsp del modelAndView Spring// ritornato dal controller mappato come nell'​esempio sotto. I parametri //​projectType//​ e //​projectName//​ vengono aggiunti in automatico. Il controller Wrapper non rimanda alla jsp con il contenuto vero e proprio, ma ad un contenitore,​ specifico per ogni projectType,​ che a sua volta si occuperà di recuperare il contenuto della scheda tramite //​wrappedPageAddress//​ ( corredato da  eventuali parametri di //POST//), che è mappato da Sprimg MVC al controller sottostante gwPluginType. Questo modus operandi prevede che ci siano per ogni tipologia di leafItem che apre un tab, un file .jsp wrapper per ogni tipologia di progetto (attualmente GeoManger e GeoExplorer). Ci sono apposite cartelle di tipo progetto sotto jsp/ per ospitare questi wrapper.
  
-     @RequestMapping(value = "​{projectType}/​{projectName}/​gwPluginTypeWrapper",​ method = RequestMethod.POST,​ produces = "​text/​html;​ charset=utf-8"​) +<code java> 
-     ​@ResponseBody +@RequestMapping(value = "​{projectType}/​{projectName}/​gwPluginTypeWrapper",​ method = RequestMethod.POST,​ produces = "​text/​html;​ charset=utf-8"​) 
-     ​public ModelAndView gwPluginTypeWrapper(+@ResponseBody 
 +public ModelAndView gwPluginTypeWrapper(
      ​@PathVariable String projectType,​      ​@PathVariable String projectType,​
      ​@PathVariable String projectName,​      ​@PathVariable String projectName,​
      ​@RequestBody HashMap<​String,​ Object> hashMap,      ​@RequestBody HashMap<​String,​ Object> hashMap,
      ​Locale locale      ​Locale locale
-     ){ +){ 
-        ModelAndView modelAndView = null; +     ​ModelAndView modelAndView = null; 
      try{      try{
-     String projectTypePath = projectType.toLowerCase();​ +          ​String projectTypePath = projectType.toLowerCase();​ 
-     ​modelAndView = new ModelAndView(projectTypePath+"/​gwPluginTypeWrapper"​);​ +          modelAndView = new ModelAndView(projectTypePath+"/​gwPluginTypeWrapper"​);​ 
-     ​String param1= (String) hashMap.get("​param1"​);​ +          String param1= (String) hashMap.get("​param1"​);​ 
-     ​String wrappedPageAddress = projectType+"/"​+projectName+"/​gwPluginType.html";​ +          String wrappedPageAddress = projectType+"/"​+projectName+"/​gwPluginType.html";​ 
-     ​modelAndView.addObject("​wrappedPageAddress",​ wrappedPageAddress);​ +          modelAndView.addObject("​wrappedPageAddress",​ wrappedPageAddress);​ 
-     ​modelAndView.addObject("​param1",​ param1);+          modelAndView.addObject("​param1",​ param1);
      ​}catch(Exception e){      ​}catch(Exception e){
-     log.error(e.getMessage(),​ e); +          ​log.error(e.getMessage(),​ e); 
-     ​//throw e; +          //throw e; 
-     ​//return a message to client +          //return a message to client 
-     ​modelAndView = new ModelAndView("​commons/​emptyPageWithDialogErrorMessage"​);​ +          modelAndView = new ModelAndView("​commons/​emptyPageWithDialogErrorMessage"​);​ 
-     ​String dialogMessage = e.getMessage();​ +          String dialogMessage = e.getMessage();​ 
-     ​dialogMessage = GwUtils.javascriptAndHtmlEscape(dialogMessage);​ +          dialogMessage = GwUtils.javascriptAndHtmlEscape(dialogMessage);​ 
-     ​modelAndView.addObject("​dialogMessage",​ dialogMessage);​+          modelAndView.addObject("​dialogMessage",​ dialogMessage);​
      ​} ​      ​} ​
      ​return modelAndView;​      ​return modelAndView;​
-     +
-     ​@RequestMapping(value = "​{projectType}/​{projectName}/​gwPluginType",​ method = RequestMethod.POST,​ produces = "​text/​html;​ charset=utf-8"​) + 
-     ​@ResponseBody +@RequestMapping(value = "​{projectType}/​{projectName}/​gwPluginType",​ method = RequestMethod.POST,​ produces = "​text/​html;​ charset=utf-8"​) 
-     ​public ModelAndView gwPluginType(+@ResponseBody 
 +public ModelAndView gwPluginType(
      ​@PathVariable String projectType,​      ​@PathVariable String projectType,​
      ​@PathVariable String projectName,​      ​@PathVariable String projectName,​
      ​@RequestBody HashMap<​String,​ Object> hashMap,      ​@RequestBody HashMap<​String,​ Object> hashMap,
      ​Locale locale      ​Locale locale
-     ){+){
     ...     ...
-    ​}+} 
 +</​code>​
  
 Un eventuale plugin di Geoweb che faccia uso di uno specifico type di leafItem, dovrà quindi anche preoccuparsi di esporre un congruo metodo (mappato appropriatamente tramite @RequestMapping) dentro una sua classe controller. Un eventuale plugin di Geoweb che faccia uso di uno specifico type di leafItem, dovrà quindi anche preoccuparsi di esporre un congruo metodo (mappato appropriatamente tramite @RequestMapping) dentro una sua classe controller.
  
-**Handler Function**+=== LeafItem jsp Path === 
 +Per le versioni precedenti alla **4.6.0** è inoltre necessario impostare esplicitamente il //​leafItemJspPath//​ di default, nel gwRegistry o nei vari *InitializerService.java dei plugin, tramite l'​istruzione:​ 
 +<code java> 
 +gwRegistry.setLeafItemJspPath("​gwPluginType",​ "/​jsp/​commons/​accordionPaneBar/​accordionPane/​leafItem/​leafItemSimple.jsp"​);​ 
 +</​code>​ 
 +Dalla versione **4.6.0** //​leafItemSimple.jsp//​ è assegnato di default. 
 + 
 +=== LeafItem jsp Path Override === 
 +E' possibile bypassare questo meccanismo impostando una specifica .jsp che può essere usata per determinare il come verrà mostrato il LeafItem. 
 + 
 +La .jsp per il leafItem si imposta cosi (nel gwRegistry o nei vari *InitializerService.java dei plugin). 
 +<code java> 
 +gwRegistry.setLeafItemJspPath("​gwPluginType","/​jsp/​commons/​pathToSpecific/​file.jsp"​);​ 
 +</​code>​ 
 + 
 +Naturalmente la jsp mappata deve essere resa disponibile nel plugin o in qualche altra parte del framework. 
 + 
 +=== Handler Function ===
  
 Accade che, in taluni casi, non si voglia aprire un tab al click sul leafItem. Accade che, in taluni casi, non si voglia aprire un tab al click sul leafItem.
Linea 104: Linea 126:
  
 Es: una eventuale function //​onGwPluginTypeLeafItemClickHandler(parametersMap){..}//​ sarebbe mappata ed eseguita per leafItem di tipo //​gwPluginType//​. Es: una eventuale function //​onGwPluginTypeLeafItemClickHandler(parametersMap){..}//​ sarebbe mappata ed eseguita per leafItem di tipo //​gwPluginType//​.
- 
-**LeafItem jsp Path** 
- 
-Volendo intervenire ancora più a monte è possibile bypassare questo meccanismo impostando una specifica .jsp che può essere usata per determinare il come verrà mostrato il LeafItem. 
-Esiste una .jsp di default (.../​leafItemSimple.jsp) che viene usata in automatico (e lavora come descritto sopra). Se necessario se ne può utilizzare una specializzata per rispondere in modo customizzato all'​interazione utente. 
-La .jsp per il leafItem si imposta cosi (nel gwRegistry o nei vari *InitializerService.class dei plugin ). 
- 
- 
-     ​gwRegistry.setLeafItemJspPath("​gwPluginType","/​jsp/​commons/​pathToSpecific/​file.jsp"​);​ 
- 
-Di default varrebbe così: 
- 
-     ​gwRegistry.setLeafItemJspPath("​gwPluginType","/​jsp/​commons/​accordionPaneBar/​accordionPane/​leafIt 
-      
- 
-Naturalmente la jsp mappata deve essere resa disponibile nel plugin o in qualche altra parte del framework. 
  • custom/development_creazione_nuovo_menu_terzo_livello_leafitem.1576662324.txt.gz
  • Ultima modifica: 2019/12/18 10:45
  • da giorgio.scali