Propiedad multiple listar con saltos de linea -SOLUCIONADO-

cancel
Showing results for 
Search instead for 
Did you mean: 
osksp
Member II

Propiedad multiple listar con saltos de linea -SOLUCIONADO-

Hola, planeto la siguiente cuestión, a ver si alguien sabe orientarme.

He definido, dentro de un modelo, un aspecto el cual posee una propiedad de texto (d:text) con valor multiple. Cuando le he añadido valores, he comprobado que Alfresco muestra la lista de valores separados por comas. Me interesaria muy mucho poder listar esos valores separados por saltos de linea, no por comas.

Es decir, en alfresco aparece:

Minutaje:    00:00 - Punto 1, 03:40 - Punto 2, 06:45 - Punto 3

y a mí me gustaría que apareciese así:

                        00:00 - Punto 1
Minutaje:          03:40 - Punto 2
                        06:45 - Punto 3

¿Habría alguna manera de hacerlo sin tener que modificar la pantalla de edición? No se, alguna propiedad a la hora de crear el aspecto, o algún parámetro a la hora de añadir los valores.

Os pongo lo que tengo hecho:

- El modelo (la parte del aspecto):

<aspect name="amb:video">
   <title>Video</title>
   <properties>
      <property name="amb:fecha">
              <type>d:text</type>
      </property>
      <property name="amb:idfirma">
         <type>d:text</type>
      </property>
      <property name="amb:horainicio">
         <type>d:text</type>
      </property>
      <property name="amb:horafin">
         <type>d:text</type>
      </property>
      <property name="amb:minutaje">
         <type>d:text</type>
         <multiple>true</multiple>
      </property>
      <property name="amb:descriptor">
         <type>d:text</type>
      </property>
   </properties>
</aspect>

- Código:

//Primero recojo las propiedades del nodo:
NamedValue properties[] = info[0].getProperties();   //Esto viene de una busqueda anterior
//Genero otro array con esas propiedades y le añado las mias, en concreto esta propiedad de valor multiple:
properties2[4] = new NamedValue(VideoModel.PROP_MINUTAJE.toString(), true, null, pd.getOrdenDia().getResumenMinutajeArray());
//pd.getOrdenDia().getResumenMinutajeArray() me devuelve un array de String, por si acaso
//Y por ultimo lo añado:
CMLAddAspect cmlAspect = new CMLAddAspect(VideoModel.ASPECT_AMB_VIDEO.toString(),properties, predicate,null);
CML cml = new CML();
cml.setAddAspect(new CMLAddAspect[]{cmlAspect});
WebServiceFactory.getRepositoryService().update(cml);

Funciona perfectamente, solo que la lista aparece separada por comas. Si alguien tiene alguna idea de como podría listarse por saltos de linea, me vendría estupendamente y se lo agradeceria mucho jeje.

Un saludo al foro!
1 Reply
osksp
Member II

Re: Propiedad multiple listar con saltos de linea -SOLUCIONADO-

Hola, bueno he conseguido hacer lo que pretendia asi que aqui os dejo como lo he solucionado por si alguien puede aprovecharse.

Como comentaba, tengo una propiedad de tipo texto pero múltiple. Lo que me interesaba es que al verse en la vista detalles, esta propiedad no apareciera listada por comas, si no en saltos de línea. Lo he solucionado creandome una clase Generator y una clase Renderer, la cual genera la vista de la propiedad como una tabla, y sus valores en columnas.

Primero, crear una clase MinuteListGenerator (le he puesto este nombre porque lo que voy a listar son puntos de un orden del dia contenidos en un video, por lo que en la vista tendre: Minuto - Punto del Orden del Dia - Descripcion):

package com.ambiser.web.bean.generator;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.bean.generator.TextFieldGenerator;
import org.alfresco.web.ui.common.ComponentConstants;
import org.alfresco.web.ui.repo.component.property.PropertySheetItem;
import org.alfresco.web.ui.repo.component.property.UIProperty;
import org.alfresco.web.ui.repo.component.property.UIPropertySheet;

import com.ambiser.util.Constants;

public class MinuteListGenerator extends TextFieldGenerator{
   
   protected UIComponent createComponent(FacesContext context, UIPropertySheet propertySheet, PropertySheetItem item){
      UIComponent component = null;
      if(item instanceof UIProperty){
              if(!propertySheet.inEditMode()){
            component = generate(context, item.getName());
         }
      }
      else component = super.generate(context, item.getName());
      return component;
   }
   
   public UIComponent generate(FacesContext context, String id){
          UIComponent component = context.getApplication().createComponent(ComponentConstants.JAVAX_FACES_OUTPUT);
          component.setRendererType(Constants.MINUTE_LIST_DISPLAY_RENDERER);
          FacesHelper.setupComponentId(context, component, id);
          return component;
   }   
}

Fijaros que la clase Constants es una clase definida por mi para poner valores propios, en este caso MINUTE_LIST_DISPLAY_RENDERER contendra la ruta de la clase con el Renderer.

Despues creamos la clase MinuteListRenderer:

package com.ambiser.web.ui.extension.renderer;

import java.io.IOException;
import java.util.ArrayList;

import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

import org.alfresco.web.ui.common.renderer.BaseRenderer;

public class MinuteListRenderer extends BaseRenderer {

   public void encodeEnd (FacesContext context, UIComponent component) throws IOException{
      if(component.isRendered()==false) return;
      ResponseWriter out = context.getResponseWriter();
      
      //Para recoger los valores de la propiedad, los extraigo de la siguiente manera, como un ArrayList
                ArrayList list = (ArrayList)((ValueHolder)component).getValue();

                //Ahora solo me queda recorrer el ArrayList, ir extrayendo valores y generando la respuesta
      out.write("<table border='0'>");
      out.write("<tr><td><b>Tiempo</b></td><td width='3'></td><td><b>Punto</b></td><td width='3'></td><td><center><b>Descripcion</b></center></td></tr>");

                //En mi caso, las lineas van a ser del tipo: <mark>Minuto</mark><id>Punto</id><desc>Descripcion</desc>
      for(int i=0;i<list.size();i++){         
         String linea = list.get(i).toString();
         linea = linea.substring(linea.indexOf("<mark>")+6);
         out.write("<tr><td>"+linea.substring(0,linea.indexOf("</mark>"))+"</td><td></td>");
         linea = linea.substring(linea.indexOf("<id>")+4);
         out.write("<td>"+linea.substring(0,linea.indexOf("</id>"))+"</td><td></td>");
         linea = linea.substring(linea.indexOf("<desc>")+6);
         out.write("<td>"+linea.substring(0,linea.indexOf("</desc>"))+"</td></tr>");
      }
      out.write("</table>");
   }
}

Por ultimo, un par de detalles, en la clase Constans que os comentaba, escribo:


package com.ambiser.util;

public class Constants {

   public static final String MINUTE_LIST_DISPLAY_RENDERER = "com.ambiser.faces.MinuteListRenderer";
}


En el faces-config-custom.xml añado el bean correspondiente y el renderer-kit:

<managed-bean>
   <description>Bean to list minutaje values</description>
   <managed-bean-name>MinuteListGenerator</managed-bean-name>
   <managed-bean-class>com.ambiser.web.bean.generator.MinuteListGenerator</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
   
<render-kit>
   <renderer>
   <component-family>javax.faces.Output</component-family>
   <renderer-type>com.ambiser.faces.MinuteListRenderer</renderer-type>
   <renderer-class>com.ambiser.web.ui.extension.renderer.MinuteListRenderer</renderer-class>
        </renderer>
</render-kit>

Y por ultimo en el property-sheet del Aspecto que he creado, en el archivo web-client-config-custom.xml, a la hora de mostrar la propiedad, le añado el component-generator:

<config evaluator="aspect-name" condition="amb:video">
   <property-sheet>
      <separator name="sep" display-label-id="detalles_video" component-generator="LabelSeparatorGenerator"/>
      <show-property name="amb:fecha" display-label-id="fecha" show-in-edit-mode="false"/>
      <show-property name="amb:horainicio" display-label-id="horainicio" show-in-edit-mode="false"/>
      <show-property name="amb:horafin" display-label-id="horafin" show-in-edit-mode="false"/>
===>      <show-property name="amb:minutaje" display-label-id="minutaje" component-generator="MinuteListGenerator" show-in-edit-mode="false"/>    <===
      <show-association name="amb:intervinientes" display-label-id="intervinientes" component-generator="IntervinientesGenerator"/>
   </property-sheet>
</config>

En fin, creo que eso es todo, al final me muestra los valores de la propiedad una bonita tabla. Facil, divertido y para toda la familia jeje. Si alguien necesita cualquier aclaracion, o cualquier duda, adelante, a preguntar.

Un saludo al foro!!