jsf dialog spring-webflow

jsf - Cómo incluir un cuadro de diálogo emergente en el subflujo



templates jsf primefaces (1)

No creo que el flujo web principal -> las transiciones de subflujo hayan sido diseñadas para tal problema. El flujo web supone que está haciendo la transición de página -> página. Su mejor opción es hacer una llamada ajax / javascript mientras la ventana emergente se está inicializando a una transición específica definida en su flujo principal / principal y colocar la lógica que desea ejecutar dentro de la transición. Puede configurar Spring Webflow para que devuelva fragmentos de html que solo serán procesados ​​por su código javascript.

Aquí hay un ejemplo de uno de mis proyectos.

<view-state id="edit" view="flows/s/#{flowScope.modelPathName}/v/edit" model="modelObj"> <!-- NOTE: Inheriting flow must implement its own specific binding <binder> <binding property="name" /> <binding property="description" /> </binder> --> <transition on="saveModel" to="chkLocalmodelObjDiff"/> <transition on="cancelSave" to="cancelEdit" bind="false"/> <transition on="objUnlink"> <set name="flashScope.viewResponse" value="pbmService.removeObjRelationship(requestParameters.objId,requestParameters.objName,modelObj)"/> <render fragments="view_response_msg" /> </transition>

así que en el ejemplo anterior estamos en nuestro flujo "padre / principal". la transición "objUnlink" puede ser activada por un enlace html que se ve así.

(URL del código sudo):

${flowExecutionUrl}?_eventId=''objUnlink''&someOtherParam=2

PARAM requerido para desencadenar la transición es: "_eventId = objUnlink"

o a través de una llamada ajax donde la url está estructurada así:

(URL del código sudo):

${flowExecutionUrl}?_eventId=''objUnlink''&someOtherParam=2&ajaxSource=true

Los PARAM necesarios para iniciar la transición a través de ajax son: "_eventId = objUnlink" y "ajaxSource = true"

Porque tenemos el:

<render fragments="view_response_msg" />

Activar cualquiera de las URL solo representará el fragmento ''view_response_msg'' como lo define su vista. En mi caso, estoy usando thymeleaf como mi marco de vista y ''view_response_msg'' se define como un fragmento en thymeleaf.

Entonces, después de enviar la solicitud y ejecutar la transición, mi cuerpo de respuesta solo consistirá en el html procesado que se definió en mi ''view_response_msg'' (y no en toda la página).

Entonces, para su caso de uso, debe:

  1. Defina un fragmento en su marco de vista que solo muestre el contenido de la ventana emergente. Para mantener la coherencia con nuestro ejemplo, lo llamaremos ''view_response_msg''

  2. Luego llame a una transición específica en el flujo principal / principal a través de AJAX. Una vez más, para mantenerse constante lo llamaremos ''objUnlink''

  3. Luego almacene esta respuesta html parcialmente representada en una variable de JavaScript (recuerde que llamamos a esta transición de la llamada ajax) y luego muéstrela dentro de su ventana emergente.

  4. Si desea actualizar el flujo principal / principal cuando alguien cierra la ventana emergente, use el mismo concepto y cree otra llamada ajax -> transición -> procesamiento de fragmentos. Recuerde que no hemos salido del flujo principal.

Perdón por la respuesta larga pero no es un problema trivial :)

Nota: Spring Web Flow debe configurarse EXPLÍCITAMENTE para manejar las solicitudes de ajax. Ver la documentación. Además, su marco de vista específico podría (por ejemplo, thymeleaf) tiene su propia configuración / implementación específica para que Web Flow maneje las solicitudes de ajax y procese fragmentos.

¿Hay alguna manera de llamar a un cuadro de diálogo dentro del estado del subflujo para que el fondo (flujo actual) se deshabilite?

Para que cuando finalice el subflujo (después de cerrar el cuadro de diálogo emergente), pueda actualizar el flujo primario (página actual).

Estoy tratando de lograr algo como la imagen a continuación con subflujo:

Actualizar:

Al final, utilicé el siguiente código en el flujo web para generar dinámicamente el cuadro de diálogo sobre la marcha:

<render fragments="dialogContent"/>