Detalles de la solución presentada
Los siguientes objetos se importaron del proyecto de Celulares resuelto en Arena (ver página de ejemplos).
Objetos de dominio:
Objetos home:
Objetos de modelo de vista/application model:
Pantalla principal: búsqueda de celulares
La pantalla tiene el formato:
Controles y sus mapeos:
(*) Hay que tener cuidado, originalmente en el html el control checkbox de la grilla estaba disabled=true. Esto tiene como efecto colateral que al editar un cliente el form de Wicket no refresca ese dato en el model (entonces se pierde el dato de si el cliente quiere recibir el resumen de cuenta en domicilio). La solución es deshabilitar el control desde java, mediante un:
val checkResumen = new CheckBox("recibeResumenCuenta") checkResumen.setEnabled(false)
(**) Al generar el formulario se dispara la búsqueda, entonces al cargar la pantalla se muestran los datos de los clientes existentes,también cuando se vuelve de la pantalla de edición/nuevo cliente. BONUS: Ver cómo cambiar el flujo si lo que se quiere es no hacer la búsqueda al comenzar el formulario.
Decisiones más relevantes:
def editar(Celular celular) { responsePage = new EditarCelularPage(celular, this) }
El formato es el siguiente:
Controles y sus mapeos:
Decisiones más relevantes:
parent.addChild(new DropDownChoice<Modelo>("modeloCelular") => [ choices = loadableModel([| Modelo.home.allInstances ]) choiceRenderer = choiceRenderer([Modelo m| m.descripcion ]) ])
El choice renderer define que se va a mostrar en cada opción del combo la descripción de cada modelo de celular, esto podríamos reemplazarlo por cualquier otro mensaje que queramos.
Al cargarse el panel en modo Alta, el modelo de un celular nuevo referencia a null, no obstante el fwk se da cuenta y deja el combo sin selección.
Al cargarse el panel en modo Edición, el fwk se encarga de matchear el modelo existente con la lista de opciones posibles y bindea automáticamente la selección del combo.
parent.addChild(new XButton("aceptar") => [ onClick = [| try { celular.validar() if (alta) { Celular.home.create(celular) } else { Celular.home.update(celular) } volver() } catch (UserException e) { info(e.getMessage()) } catch (RuntimeException e) { error("Ocurrió un error al procesar el pedido del celular. Consulte al administrador del sistema") } ] ])
def volver() { mainPage.buscarCelulares() responsePage = mainPage }
El mainPage lo recibimos al construir la página de edición:
new(Celular celularAEditar, BusquedaCelularesPage mainPage) { this.mainPage = mainPage ...
De esta manera se conserva la información de la pantalla de búsqueda (por ser stateful).