Foros Néfele 4 Harbour › Foros › Dudas › combobox browse uncaught
- Este debate tiene 4 respuestas, 3 mensajes y ha sido actualizado por última vez el 3 años, 11 meses por Eduardo Trasviña. This post has been viewed 675 times
-
AutorEntradas
-
-
30-11-2020 a las 22:40 #1594Eduardo TrasviñaParticipante
Hola Equipo Nefele.
Tengo problemas con una pagina, la aisle en un micro-proyecto para enviarla por este foro, este es el proyecto.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485Class TCgi FROM XCgi// Este es nuestro Router para evitar inyección de código malicioso y aportar la máxima seguridad.// Solo se permite la llamada a los Method de oCgi aquí nombrados que a su vez llaman a Procedure, Function o Method'sMETHOD MainFunction() INLINE MainPage()METHOD actualiza_combo_grupos() INLINE actualiza_combo_grupos()METHOD pon_browse_grupos() INLINE pon_browse_grupos()METHOD actualiza_browse_grupos() INLINE actualiza_browse_grupos()METHOD amplia_grupo() INLINE amplia_grupo()METHOD sube_nivel_grupos() INLINE sube_nivel_grupos()END CLASSPROCEDURE MainPage()LOCAL chtml, tiempo* instanciamos nuestra web page principalwith object TWebPage():New():cTitle := "Prueba Grupos Anidados":lContainer := .f.:lAlerts := .t.:lFooter := .f.WITH object WPanel():New(:WO):cTitle := "Directorio De Grupos":aWidth[ _grande ] := 8:aOffset[ _grande ] := 2With Object WSeparator():New(:WO):lLine := .T.:Create()End WithWITH OBJECT WBevel():New(:WO):nStyle := xc_Row:aWidth[ _grande ] := 2WITH object WButton():New(:WO):cIcon := "addbox":lLarge := .T.:nFix := "100%":oStyle:cBox_shadow := "none":cAjaxBevel := "NflCargo":Create()END:Create()ENDWITH OBJECT WBevel():New( :WO ):cId := "obevel_combo_grupos":aWidth[ _grande ] := 8actualiza_combo_grupos(:WO, "0", "S"):Create()ENDWITH OBJECT WBevel():New(:WO):nStyle := xc_Row:aWidth[ _grande ] := 2WITH object WButton():New(:WO):cIcon := "arrow_upward":lLarge := .T.:nFix := "100%":oStyle:cBox_shadow := "none":cOnClick := "sube_nivel_grupos":cAjaxBevel := "NflCargo":aParams := {{"combogrupo", "#combogrupo"}}:Create()END:Create()ENDWITH OBJECT WBevel():New( :WO ):cId := "obevel_browse_grupos"pon_browse_grupos(:WO, "0"):Create()End WithWith Object WSeparator():New(:WO):lLine := .f.:Create()End Withtiempo:=Seconds():Assert( "tiempo " + ToString( Seconds() - tiempo ) ):Create()ENDchtml:=:create()oCgi:SendPage(chtml) // Se crea el HTML final y se envial navegador saliendo del ejecutable CGIEnd WithRETURN//------------------------------------------------------------------------------FUNCTION actualiza_combo_grupos(bevel_padre, cidgrupo_padre, cinicial)LOCAL adatos:={}, cidselect, apu, ocomboif cidgrupo_padre = nilcidgrupo_padre:= obtiene_un_valor_de_aparams_de_cgi( "cidgrupo", "0")endifif cinicial = nilcinicial:= obtiene_un_valor_de_aparams_de_cgi( "cinicial", "S")endifcidselect:= obtiene_un_valor_de_aparams_de_cgi( "cidselect", "")if cinicial="S"adatos:={{0, "Grupos Primarios"}}endifif cinicial="N"adatos:=obtiene_registros(cidgrupo_padre)endifapu:=1if Len(cidselect)>0apu := AScan( adatos, {| aVal| aVal[ 1 ] == Val(cidselect) } )apu := IIF(apu=0, 1, apu)endifoCGI:Console(adatos[apu,01])with OBJECT ocombo := WComboBox():New(bevel_padre):cId := "combogrupo":aItems := adatos:cSelected := adatos[apu,01]*:cText := "Seleccione Grupo":cIcon := "event_available":cTitle := "Grupos":lReLoad := .t.:cAjaxBevel := "obevel_browse_grupos":lAjaxWaitON := .t.:cOnChange := "actualiza_browse_grupos":Create()if bevel_padre = niloCGI:SendPage(:FullHTML)endifend withRETURN (nil)//------------------------------------------------------------------------------FUNCTION pon_browse_grupos(obevel_browse, cidgrupo)LOCAL adatos:={}, obrowse, alinea:={}, corigen, cicono_edit, cicono_deleteLOCAL cicono_examinar, cnombre, chtmladatos:=obtiene_registros(cidgrupo)WITH OBJECT obrowse := WArrayBrowse():New(obevel_browse):cId := "browse_modal_grupos":nStyle := xc_Striped:nIndexValue := 1:aparams := {{"combogrupo"}, {"#combogrupo"}}with object :AddCol() AS wItemColBrowse:cheadtext := "ID":cheadalign := xc_Center:calign := xc_Center:lvisible := .f.:nstyle := xc_Text:nwidth := 0end withwith object :AddCol() AS wItemColBrowse:cheadtext := "DESCRIPCION":cheadalign := xc_Left:calign := xc_Left:lvisible := .t.:nstyle := xc_Text:nwidth := 90end withwith object :AddCol() AS wItemColBrowse:cid := "editar_grupo":cheadtext := "":calign := xc_Center:nwidth := 5end withwith object :AddCol() AS wItemColBrowse:cid := "borrar_grupo":cCursor := "pointer":nwidth := 5end withwith object :AddCol() AS wItemColBrowse:cid := "para_ampliar_grupo":cheadtext := "":calign := xc_Center:cCursor := "pointer":cOnClick := "amplia_grupo":nwidth := 5:cAjaxBevel := "nflcargo"end withif !Empty(adatos)FOR each alinea IN adatoscorigen :=ToString(alinea[1])+"|"+cidgrupocnombre :=alinea[2]cicono_edit :=IIF(alinea[1]<>0, "icon:edit", "")cicono_delete :=IIF(alinea[1]<>0, "icon:delete", "")cicono_examinar :=IIF(alinea[1]<>0, "icon:remove_red_eye", "")AAdd( :aItems, {corigen, cnombre, cicono_edit, cicono_delete, cicono_examinar } )nextENDIF:Create()IF Empty( obevel_browse )return obrowse:fullhtmlendifend withRETURN chtml//------------------------------------------------------------------------------FUNCTION amplia_grupo()LOCAL chtml, cidgrupo, cidgrupo_padre, rcookie, cdata, adata:={}cdata:=obtiene_un_valor_de_aparams_de_cgi("para_ampliar_grupo")adata := hb_ATokens( cdata, "|" )cidgrupo :=adata[1]cidgrupo_padre:=adata[2]envia_texto_ajax( CallAutoForm( "actualiza_combo_grupos",{{"cidgrupo", cidgrupo_padre}, {"cinicial", "N"}, {"cidselect", cidgrupo}}, "obevel_combo_grupos", .F. ) )envia_texto_ajax( CallAutoForm( "actualiza_browse_grupos",{{"combogrupo", cidgrupo}}, "obevel_browse_grupos", .F. ) )chtml := asigna_valor_modal( "combogrupo" , ToString(cidgrupo) )envia_script_ajax( chtml )RETURN (nil)//------------------------------------------------------------------------------FUNCTION actualiza_browse_grupos()LOCAL chtml, cidgrupocidgrupo:= obtiene_un_valor_de_aparams_de_cgi( "combogrupo")chtml :=pon_browse_grupos(, cidgrupo )RETURN envia_dato_ajax( chtml )//------------------------------------------------------------------------------FUNCTION sube_nivel_grupos()LOCAL carma, chtml, cidgrupo, adgru, cidselect:="0", lbusca_abuelo:=.t.LOCAL adatos:={}cidgrupo:=obtiene_un_valor_de_aparams_de_cgi("combogrupo")adatos:=obtiene_registros(cidgrupo, lbusca_abuelo)*row1 = datos idabuelo*row2 = datos idpadrecidselect:=ToString(adatos[2,01])envia_texto_ajax( CallAutoForm( "actualiza_combo_grupos",{{"cidgrupo", adatos[1,01]}, {"cinicial", "N"}, {"cidselect", cidselect}}, "obevel_combo_grupos", .F. ) )envia_texto_ajax( CallAutoForm( "actualiza_browse_grupos",{{"combogrupo", adatos[2,01]}}, "obevel_browse_grupos", .F. ) )chtml := asigna_valor_modal( "combogrupo" , ToString(adatos[1,01]) )envia_script_ajax( chtml )RETURN (nil)//------------------------------------------------------------------------------FUNCTION obtiene_registros(cidgrupo, lbusca_abuelo)LOCAL adatos:={}, arespuesta:={}, alinea:={}LOCAL nrenglon_abuelo:=0, nrenglon_padre:=0if lbusca_abuelo = nillbusca_abuelo := .f.endif* ADATOS* 1 2 3*| | ID | |*| ID | Padre | Descripcion |oCGI:Console(cidgrupo)adatos:= {{ 1, 0, "Herramientas"},;{ 2, 0, "Escritorios"},;{ 3, 0, "Casas"},;{ 4, 0, "Grupo Negro"},;{ 5, 1, "Palas"},;{ 6, 1, "Escaleras"},;{ 7, 1, "Martillos"},;{ 8, 1, "Desarmadores"},;{ 9, 5, "Grandes"},;{10, 5, "Medianas"},;{11, 5, "Chicas"},;{12, 6, "Aluminio"},;{13, 6, "Madera"},;{14, 6, "Plastico"},;{15, 7, "Industriales"},;{16, 7, "Caseros"},;{17, 7, "Hibridos"},;{18, 8, "Profesionales"},;{19, 8, "Economicos"},;{20, 8, "En Promocion"},;{21, 2, "Para Oficina"},;{22, 2, "Para Casa"},;{23, 2, "Para Exteriores"}}if lbusca_abuelo*oCGI:Console("iniciando busqueda de idpadre")for each alinea in adatos*oCGI:Console("comparando alinea[1]="+ToString(alinea[1])+" contra val(cidgrupo)="+cidgrupo)if alinea[1]= Val(cidgrupo)nrenglon_padre:=alinea[2]*oCGI:Console("encontro renglon = "+ToString(alinea:__enumindex)+" nrenglon_padre="+ToString(nrenglon_padre))exitendifnextif nrenglon_padre<>0*oCGI:Console("iniciando busqueda de abuelo")for each alinea in adatos*oCGI:Console("comparando alinea[1]="+ToString(alinea[1])+" contra nrenglon_padre="+ToString(nrenglon_padre))if alinea[1]=nrenglon_padrenrenglon_abuelo:=alinea[2]*oCGI:Console("encontro renglon = "+ToString(alinea:__enumindex)+" nrenglon_abuelo="+ToString(nrenglon_abuelo))exitendifnextendifAAdd(arespuesta,{nrenglon_abuelo, "es id abuelo"})AAdd(arespuesta,{nrenglon_padre , "es id padreo"})oCGI:Console(arespuesta)return(arespuesta)endifFOR each alinea IN adatosif Val(cidgrupo) = alinea[2]AAdd(arespuesta,{alinea[1], alinea[3]})endifnextif Len(arespuesta)=0AAdd(arespuesta,{0, "Sin Grupos.."})endifoCGI:Console(arespuesta)RETURN (arespuesta)//------------------------------------------------------------------------------FUNCTION obtiene_un_valor_de_aparams_de_cgi( cdata, cdefault)LOCAL n, apu, cdatoif cdefault = nilcdefault:=""endifcdata:=Upper(cdata)apu := ascan( oCGI:aparams, {| aVal| aVal[ 1 ] == cdata } )cdata:=IIF(apu=0, cdefault, oCGI:aparams[apu,02])RETURN cdata//------------------------------------------------------------------------------FUNCTION envia_script_ajax( cScript, cModal, cFocus )LOCAL cpasoIF !Empty( cModal )cScript += cOpenModal( cModal )ENDIFIF !Empty( cFocus )cScript += SetFocus( cFocus )ENDIFcScript := "<script>" + crlf + cScript + crlf + "</script>"oCGI:send( "" )oCGI:send( cScript )RETURN NIL//------------------------------------------------------------------------------FUNCTION envia_texto_ajax( cText, cModal, cFocus )IF !Empty( cModal )cText += cOpenModal( cModal )ENDIFIF !Empty( cFocus )cText += SetFocus( cFocus )ENDIFoCGI:send( "" )oCGI:send( cText )RETURN NIL//-------------------------------------FUNCTION envia_dato_ajax( cDato )oCGI:Send( "" )oCGI:Send( cDato )RETURN NIL//------------------------------------------------------------------------------FUNCTION asigna_valor_modal( cName, cValue )RETURN 'document.querySelector("#' + cName + '").value="' + ToString( cValue ) + '";' + crlf//------------------------------------------------------------------------------FUNCTION cOpenModal( cName )LOCAL crescres := '$("#' + cName + '").modal("open");' + crlf*oCGI:console("=cres=")*oCGI:console(cres)RETURN '$("#' + cName + '").modal("open");' + crlfAl iniciar la pagina veo la consola de javascript y veo los siguientes mensajes.
Algo que me ha llamado la atencion es que cuando inicio no muestra el valor seleccionado para el combobox, me presenta una linea en blanco
si reviso su valor en la consola me arroja lo siguiente:
si selecciono manualmente la opcion en el combobox me arroja lo siguiente:
otra cosa si quiero obtener el valor del combox como por ejemplo al dar click en un boton lo agrego en :aParams y si me lo envia sin problema,
12345678910WITH object WButton():New(:WO):cIcon := "arrow_upward":lLarge := .T.:nFix := "100%":oStyle:cBox_shadow := "none":cOnClick := "sube_nivel_grupos":cAjaxBevel := "NflCargo":aParams := {{"combogrupo", "#combogrupo"}}:Create()ENDpero he intentado que los eventos del browse me devuelvan el valor del combobox y no lo he logrado, si lo pongo en la definicion del objeto browse no envia el parametro, parece como si lo ignorara.
12345WITH OBJECT obrowse := WArrayBrowse():New(obevel_browse):cId := "browse_modal_grupos":nStyle := xc_Striped:nIndexValue := 1:aparams := {{"combogrupo"}, {"#combogrupo"}}y si lo pongo al definir addcol.
1234567891011with object :AddCol() AS wItemColBrowse:cid := "para_ampliar_grupo":cheadtext := "":calign := xc_Center:cCursor := "pointer":cOnClick := "amplia_grupo":nwidth := 5:cAjaxBevel := "nflcargo":aparams := {{"combogrupo"}, {"#combogrupo"}}end withme marca el siguiente error:
lo que intento es que en el evento click de la quinta columna del browse (amplia_grupo) mande a la funcion el dato del elemento seleccionado del combobox.
Como siempre agradezco su apoyo y tiempo.
Saludos!!
-
01-12-2020 a las 11:50 #1599Pedro AmaroSuperadministrador
Buenos dias Eduardo;
El primer problema es producido porque wComboBox considera un cSelected := 0 como no seleccionado.
En el segundo caso hay dos problemas;
1º Las columnas del wArrayBrowse no estan heredando el aParams del wArrayBrowse: Tenemos que estudiar si es necesario
2º Estas definiendo mal el aparams de las comunas:
Lo correcto seria :aparams := {{"combogrupo", "#combogrupo"}}
y estas poniendo :aparams := {{"combogrupo"}, {"#combogrupo"}}Un saludo
-
01-12-2020 a las 12:25 #1600Pedro AmaroSuperadministrador
Por cierto esta función
12345678910FUNCTION cOpenModal( cName )LOCAL crescres := '$("#' + cName + '").modal("open");' + crlf*oCGI:console("=cres=")*oCGI:console(cres)RETURN '$("#' + cName + '").modal("open");' + crlfla puedes reemplazar por
12nfl_OpenModal(cId,lDirect) // --> cScriptlDirect es .F. por defecto y es lo correcto en tu casoTengo que seguir dedicandole tiempo al wiki, me quedan funciones por documentar.
Pero me ha gustado como lo has resuelto.
-
01-12-2020 a las 14:44 #1601Alfredo SanzSuperadministrador
Hoola!
Tal y como está ahora, el :aparams lo puedes poner en cada :addCol() de esta forma
12345678910with object :AddCol() AS wItemColBrowse:cid := "para_ampliar_grupo":cheadtext := "":aParams := {{"combogrupo","#combogrupo"}}:calign := xc_Center:cCursor := "pointer":cOnClick := "amplia_grupo":nwidth := 5:cAjaxBevel := "nflcargo"end withPero ya lo hemos modificado para que tenga en cuenta los aparams "generales" para todo el browse que se definen al definir el browse
12345WITH OBJECT obrowse := WArrayBrowse():New(obevel_browse):cId := "browse_modal_grupos":nStyle := xc_Striped:nIndexValue := 1:aparams := {{"combogrupo","#combogrupo"}}En la próxima versión tendrás disponible este cambio.
Ojo: En caso de que se defina el mismo nombre de aparam tanto al definir el browse como dentro de una columna, tiene preferencia el valor asignado en la columna
En cuanto al error de javascript formSelect, al definir el combo, tienes que cambiar la línea del :lReload := .t. por
1:lReLoad := (bevel_padre = nil)De esta forma hacemos que fuerce la recreación del control, pero solo cuando estamos generando el combo a través de una llamada ajax (no tiene bevel padre), cuando lo generamos la primera vez, al estar dentro del código inicial no hay que hacerlo
-
02-12-2020 a las 19:36 #1611Eduardo TrasviñaParticipante
Gracias Alfredo, Pedro, todo solucionado.
Creo que estaba cometiendo errores básicos, hay veces que se cierran las ideas jeje.
Saludos!
-
-
AutorEntradas
- Debes estar registrado para responder a este debate.