PBToolboxAI v5 ← Site

kanban — u_pbt_kanban #

← Referencia de componentes · Índice de la guía

kanban es un tablero de tarjetas ordenadas en columnas — las etapas de un trabajo: por hacer, en curso, en revisión, terminado. El usuario arrastra una tarjeta de una columna a otra, o la sube y baja en la suya; ue_card_moved le dice cuál, desde dónde, hacia dónde y en qué lugar. Cada tarjeta muestra un título, etiquetas de color, su responsable, un vencimiento que se pone rojo con retraso y una insignia; cada columna tiene su límite de trabajo en curso y se pliega. El tablero se llena a mano o desde un DataStore, que recibe los movimientos.

▶ Verlo en vivo — Aplicación de demostración, mosaico Kanban board: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Userobjectu_pbt_kanban
Clases de elementosn_pbt_kanban_column (of_column(key)), n_pbt_kanban_card (of_card(key))
Sirve paraSeguir un flujo de trabajo: incidencias, tareas, pedidos, candidaturas
PrincipioUna tarjeta tiene una clave única en todo el tablero; su columna es un estado que cambia en cada movimiento
Opciones opt-inib_veto_moves, ib_write_back, ib_reorderable, ib_toolbar, ib_add_button, ib_quick_add

Inicio rápido #

// The columns, in the order of the work
uo_board.of_add_column(/*key*/ "todo", /*title*/ "To do")
uo_board.of_add_column(/*key*/ "doing", /*title*/ "In progress")
uo_board.of_add_column(/*key*/ "done", /*title*/ "Done")

// The cards : a key unique on the board, a column, a title
uo_board.of_add_card(/*key*/ "t1", /*column*/ "todo", /*title*/ "Login page")
uo_board.of_add_card(/*key*/ "t2", /*column*/ "doing", /*title*/ "Crash on save")
uo_board.of_card(/*key*/ "t2").is_tags = "Bug"
uo_board.of_card(/*key*/ "t2").is_assignee = "Alan Turing"
// event ue_card_moved of uo_board : (string as_key, string as_from_column,
// string as_to_column, long al_position, long al_from_position)
// Save the new state of the task
UPDATE tasks SET status = :as_to_column WHERE id = :as_key;

Columnas, tarjetas y posiciones #

Una columna se designa por su clave, una tarjeta también — y la clave de una tarjeta es única en todo el tablero, no solo en su columna: una tarjeta conserva su clave cuando cambia de columna, sus handles siguen siendo válidos y cada evento la nombra sola. La columna de una tarjeta se lee con of_card(key).of_column(), su posición con of_position(); una posición se cuenta desde 1, tarjetas ocultas incluidas.

Una columna tiene un límite de trabajo en curso (il_limit): su encabezado cuenta 3/5, y se pone roja más allá. El límite es flexible — la tarjeta llega de todos modos; para un límite estricto, rechace el movimiento en ue_card_moving comparando il_limit con of_visible_count() de la columna, lo que cuenta el encabezado (una tarjeta oculta no cuenta). ib_done marca la columna del trabajo terminado: sus tarjetas nunca están atrasadas. Una columna se pliega en una franja estrecha (su cheurón, ib_collapsed); todavía se puede soltar una tarjeta en ella, al final.

Un movimiento del usuario (arrastrar, Ctrl + flechas, o la tarjeta levantada con Espacio y soltada) y un movimiento de su código (of_move_card) lanzan el mismo ue_card_moved, como SelectItem lanza el evento del clic. Con ib_veto_moves, ue_card_moving se plantea antes, en ambos casos: devolver FALSE deja la tarjeta donde está, y of_move_card devuelve entonces -4.

Con ib_reorderable = true, el usuario reordena también las columnas: arrastra el encabezado de una columna (una barra de acento vertical muestra dónde caerá, Esc cancela) o pulsa Ctrl + Mayús + Izquierda / Derecha. ue_column_moved da la columna y sus dos posiciones, contadas desde 1 entre todas las columnas; of_move_column hace lo mismo desde su código y lanza el mismo evento, planteándose antes ue_column_moving con ib_veto_moves. Desactivado por defecto: las columnas son el proceso de su aplicación. Lo que el usuario ha organizado — el orden de las columnas y su pliegue — se lee con of_get_layout, se devuelve con of_set_layout, y cada cambio lanza ue_layout_changed con la disposición entera: guárdela y devuélvala en el próximo inicio.


El contenido de una tarjeta #

Una tarjeta muestra su título (is_title), su texto (is_text, cortado tras cuatro líneas), sus etiquetas (is_tags, separadas por comas, coloreadas por is_tag_tones: Bug=danger|UI=info), su responsable (is_assignee, un avatar redondo con las iniciales), su vencimiento (is_due, aaaa-mm-dd: rojo una vez pasado, naranja el mismo día, comparado con is_today o con la fecha del puesto) y una insignia (is_badge). Título, texto e insignia aceptan el texto enriquecido con etiquetas.

El cuerpo de las tarjetas puede escribirse con una plantilla, is_card_template: texto enriquecido donde {customer} es un campo de la tarjeta — uno de los suyos (of_set_field), una columna del DataStore del que procede, o un campo integrado (title, text, tags, assignee, initials, badge, due, column, column_title, key). {due:dddd d mmmm} escribe una fecha como un formato de visualización de DataWindow (los símbolos d dd ddd dddd m mm mmm mmmm yy yyyy, un texto entre comillas dobles — fuera de ellas, una letra d, m o y es un símbolo —, [shortdate] y [longdate] en el idioma de la visualización), {?amount}…{/amount} conserva un fragmento cuando el campo dice algo, {!amount}…{/amount} cuando no dice nada, {x:raw} conserva un valor como etiquetas, {{ }} son llaves. Un valor siempre se muestra tal cual, nunca se lee como etiquetas.

// A field of our own, then the body of every card
uo_board.of_set_field(/*key*/ "t1", /*field*/ "customer", /*value*/ "Acme")
uo_board.is_card_template = "{?customer}For [b]{customer}[/b]{/customer}{?due} - due {due:d mmm}{/due}"

Desde un DataStore #

of_from_datastore hace una tarjeta de cada fila de un DataStore, de un DataWindow o de un DataWindowChild — la misma llamada, y un DataWindow se reescribe él mismo. Su clave es el RowID de la fila — of_card(key).of_row() devuelve el número de su fila mientras el DataStore no se vacíe ni se vuelva a leer — o el valor de la columna ROLE_KEY. Una fila cuya clave está vacía, no es válida, ya se vio o está tomada por una tarjeta añadida a mano no se carga: la llamada devuelve 0 y of_get_last_error la nombra por su número — dé a sus tarjetas a mano claves que no sean números. Una columna desempeña un rol cuando se llama como él (title, text, tags, assignee, due, badge, color, order, column, key) o cuando of_map lo dice. La columna ROLE_COLUMN dice en qué columna del tablero está la tarjeta; un valor que ninguna columna lleva recibe su propia columna, al final — un valor que contiene / o | toma una clave en la que se convierten en - (R&D-QA) y conserva su valor, el que un movimiento vuelve a escribir; un valor vacío no se carga (of_get_last_error lo nombra), un valor CHAR completado con espacios encuentra su columna. Una columna nacida de un valor se va una vez vacía, salvo si su código le puso una propiedad o un color. ROLE_ORDER ordena las tarjetas de una columna: el rango es el lugar de una tarjeta entre las tarjetas del DataStore de su columna, desde 1 (una tarjeta añadida a mano no toma rango). Con una clave ROLE_KEY, una segunda carga, of_map y of_reload_row actualizan las tarjetas en su sitio: una tarjeta que vuelve conserva sus indicadores, sus campos y su handle. Con la clave RowID, un segundo of_from_datastore es una carga nueva: PowerBuilder vuelve a dar los mismos RowID tras un Reset o un Retrieve, a otros registros — todas las tarjetas de las filas antiguas se van (su handle se libera) y las tarjetas se rehacen; of_map y of_reload_row se quedan en su sitio. Una tarjeta que su código quitó no vuelve con of_map: su fila se queda en el DataStore, el siguiente of_from_datastore la vuelve a leer. Las fechas y los decimales se leen según la configuración regional del puesto (un campo decimal se lee 1234.5). Todas las columnas son campos de la plantilla.

Con ib_write_back = true, una tarjeta de una fila escribe su nueva columna en la fila (y, con ROLE_ORDER, los rangos de ambas columnas) antes de moverse — la fila se encuentra por su RowID y por nada más: ue_card_moved lee el DataStore actualizado, el Update sigue siendo cosa suya. La columna recibe el valor de la columna de destino (R&D/QA, nunca su clave R&D-QA). Todo o nada: un valor que el DataStore rechaza — la columna o un rango — repone lo que ya estaba escrito, deja la tarjeta donde estaba (nunca sale para volver) y lanza ue_write_back_failed; of_move_card devuelve entonces -4. Se escribe un solo movimiento del usuario a la vez: un gesto hecho antes de que el anterior se escriba se ignora, y se anuncia. Tras cambiar usted mismo una fila, of_reload_row la vuelve a enviar al tablero.

// The columns of the board : the values of the status column
uo_board.of_add_column(/*key*/ "open", /*title*/ "Open")
uo_board.of_add_column(/*key*/ "active", /*title*/ "Active")
uo_board.of_add_column(/*key*/ "closed", /*title*/ "Closed")

// Which column of the DataStore plays which role
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_COLUMN, /*column*/ "status")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ASSIGNEE, /*column*/ "owner")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ORDER, /*column*/ "rank")

// A move goes into the DataStore, then the rows become cards
uo_board.ib_write_back = true
uo_board.of_from_datastore(/*ads*/ ids_tasks)

Propiedades #

PropiedadTipoPredeterminadoFunción
is_card_templatestring""El cuerpo de cada tarjeta, escrito por una plantilla (ver más arriba). Vacío: el texto de la tarjeta (is_text). La búsqueda lee lo que escribe la plantilla
is_count_templatestring""El contador del encabezado de cada columna, escrito por una plantilla: {count} las tarjetas visibles, {limit} el límite (vacío sin límite), {shown} las tarjetas que conserva la búsqueda, {sum:points} la suma de un campo sobre las tarjetas visibles (uno de los suyos o una columna del DataStore), {title} y {key} de la columna; {?limit}…{/limit} conserva un fragmento cuando hay un límite. Vacío: 3, 3/5, 1 . 3/5 durante una búsqueda. Más allá de su límite la columna se pone roja diga lo que diga la plantilla, y su encabezado lo dice al lector de pantalla. {sum:} lee un número escrito con punto o en el idioma de la visualización (1.234,5 en español); un texto no cuenta. Sin clave, el recuento y la suma son los de las tarjetas que la demo dibuja
is_tag_tonesstring""El tono de cada etiqueta, etiqueta=tono unidos por `: Bug=dangerUI=info. Tonos: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (el acento), TONE_NEUTRAL`. Una etiqueta encuentra su tono sea cual sea su capitalización; una etiqueta no listada, o un tono desconocido, es neutra
is_todaystring""El día con el que se comparan los vencimientos, aaaa-mm-dd; vacío: la fecha del puesto. Una fecha no válida se rechaza: la anterior se queda, of_get_last_error dice por qué
is_filterstring""La búsqueda: solo quedan las tarjetas cuyo título, cuerpo, etiquetas, responsable, insignia, clave, un campo suyo o una columna del DataStore contienen este texto, sin distinguir mayúsculas ni acentos. El contador de una columna dice entonces primero las tarjetas encontradas (1 . 3). El cuadro de búsqueda de la barra de herramientas también la escribe: leída en directo
ib_toolbarbooleanfalseUna barra de herramientas sobre el tablero, con un cuadro de búsqueda que escribe is_filter (Esc lo vacía)
ib_add_buttonbooleanfalseUn botón + Añadir una tarjeta al pie de cada columna abierta: lanza ue_new_requested. Un doble clic en la parte vacía de una columna también lo lanza, con botón o sin él
ib_quick_addbooleanfalseAñadido rápido: el botón + Añadir una tarjeta y la tecla Insert abren un campo de título al pie de la columna; Intro lanza ue_new_requested con el título escrito (un título vacío no pide nada), el campo sigue abierto para la tarjeta siguiente, Esc lo cierra. El tablero sigue sin añadir nada: su código añade la tarjeta
ib_read_onlybooleanfalseEl usuario no mueve nada: ni arrastrar, ni Ctrl + flechas, ni Supr, ni botón de añadir. Sigue seleccionando y abriendo las tarjetas; su código sigue moviéndolas
ib_reorderablebooleanfalseEl usuario reordena las columnas: arrastra su encabezado o pulsa Ctrl + Mayús + Izquierda / Derecha; siguen ue_column_moved y luego ue_layout_changed. ib_read_only también lo detiene; su código sigue moviéndolas (of_move_column). Leída en directo
ib_veto_movesbooleanfalseOpt-in: preguntar ue_card_moving antes de cada movimiento, del usuario como de of_move_card. Desactivado por defecto, como todo evento cancelable de la biblioteca
ib_write_backbooleanfalseUn tablero alimentado por of_from_datastore: una tarjeta de una fila escribe su nueva columna (y los rangos, con ROLE_ORDER) en el DataStore antes de moverse; un valor rechazado la deja en su sitio (ue_write_back_failed, of_move_card devuelve -4). Una tarjeta añadida a mano nunca se escribe
ii_column_widthinteger272La anchura de una columna abierta, en píxeles, de 180 a 600 (un valor fuera se devuelve dentro); 0: las columnas abiertas se reparten la anchura del tablero, 180 píxeles como mínimo cada una. El tablero se desplaza de lado cuando las columnas no caben
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Propiedades de una columna — n_pbt_kanban_column #

Su handle, mediante of_column(key). Su of_count() cuenta las tarjetas que contiene y su of_keys_at(n) devuelve la clave de la n-ésima, en su orden; of_child_keys las devuelve todas en una sola lectura.

PropiedadTipoPredeterminadoFunción
is_titlestring""Título de la columna. Acepta el texto enriquecido con etiquetas. Vacío, la columna muestra su clave
il_limitlong0Límite de trabajo en curso: 0, ninguno. Con un límite el encabezado dice 3/5, y la columna se pone roja en cuanto contiene más; mientras se arrastra una tarjeta sobre una columna llena, lo muestra. Límite flexible: rechace en ue_card_moving para uno estricto
ib_collapsedbooleanfalsetrue pliega la columna en una franja estrecha: su título escrito hacia abajo y su contador se quedan, sus tarjetas se ocultan, todavía se suelta una tarjeta en ella (al final). Sigue ue_column_toggled, como con un clic en su cheurón. Leída en directo
ib_visiblebooleantruefalse quita la columna y sus tarjetas del tablero; conservan su lugar y su orden
ib_donebooleanfalseLa columna del trabajo terminado: sus tarjetas nunca se muestran atrasadas ni con vencimiento hoy
of_keys_at (long al_index) → string——La clave de la tarjeta en el rango al_index (desde 1) en la columna, en su orden; vacía fuera. Como una tarjeta se designa solo por su clave, es lo que toma of_card
of_child_keys (ref string as_keys[]) → long——Llena as_keys[] con las claves de todas las tarjetas de la columna, en su orden — lo que da of_keys_at(1..n) — y devuelve su número, en una sola lectura: recorrer 2.000 tarjetas con of_keys_at vuelve a leer la lista 2.000 veces
of_position ( ) → long——Devuelve el lugar de la columna en el tablero ahora, contado desde 1 entre todas las columnas (ocultas incluidas) — el usuario puede haberla movido; 0 cuando el tablero no la contiene
of_visible_count ( ) → long——Devuelve el número de tarjetas visibles de la columna, lo que su encabezado cuenta frente a il_limit (2/3): una tarjeta oculta por ib_visible no cuenta, una tarjeta fuera de la búsqueda cuenta; of_count() las cuenta todas. El número que comparar con il_limit para un límite estricto; 0 cuando el tablero no contiene la columna
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el item
is_super_tooltip_titlestring""Título del tooltip enriquecido del item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido del item (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido del item
il_accentlong-1Acento de la columna: la barra sobre ella y su contador lo toman, nunca sus tarjetas (-1 = el del componente)
il_back_colorlong-1Fondo de la columna, en RGB(r,g,b) (-1 = lo que da el tema)
il_text_colorlong-1Color del texto de la columna (-1 = lo que da el tema)
il_back_color_hoverlong-1Fondo del encabezado de la columna bajo el puntero (-1 = lo que da el tema). Los colores de una columna se detienen en sus tarjetas
il_text_color_hoverlong-1Color del texto del encabezado de la columna bajo el puntero (-1 = lo que da el tema)

Propiedades de una tarjeta — n_pbt_kanban_card #

PropiedadTipoPredeterminadoFunción
is_titlestring""Título de la tarjeta, en negrita. Acepta el texto enriquecido con etiquetas. Vacío, la tarjeta muestra su clave
is_textstring""Texto bajo el título, cortado tras cuatro líneas (etiquetas aceptadas). Se muestra mientras is_card_template esté vacío
is_tagsstring""Etiquetas, separadas por comas: Bug, UI. Cada una es una pastilla coloreada por is_tag_tones
is_assigneestring""La persona a quien se confía la tarjeta: un avatar redondo con las iniciales, del mismo color en cada carga, el nombre como información emergente
is_duestring""Vencimiento, aaaa-mm-dd ("": ninguno): rojo una vez pasado, naranja el mismo día, nunca en una columna ib_done. Una fecha no válida se rechaza: la anterior se queda, of_get_last_error del tablero dice por qué
is_badgestring""Pequeña insignia arriba a la derecha (etiquetas aceptadas): una estimación, un número, en el acento
ib_visiblebooleantruefalse quita la tarjeta del tablero; conserva su clave, su columna y su lugar, y deja de contar en su columna
ib_read_onlybooleanfalseEl usuario no puede ni arrastrar esta tarjeta, ni moverla con el teclado, ni pedir su eliminación; su código sigue moviéndola
of_column ( ) → string——La clave de la columna en la que está la tarjeta ahora — el usuario puede haberla movido. Solo lectura: una tarjeta se mueve con of_move_card
of_position ( ) → long——Devuelve el lugar de la tarjeta en su columna ahora, contado desde 1 (tarjetas ocultas incluidas), 0 cuando el tablero no la contiene
of_row ( ) → long——Devuelve el número de fila de hoy, en las filas dadas a of_from_datastore, de la fila de la que viene la tarjeta — tras una ordenación, un filtro o la eliminación de otras filas; 0 para una tarjeta añadida a mano o cuya fila ha desaparecido
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el item
is_super_tooltip_titlestring""Título del tooltip enriquecido del item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido del item (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido del item
il_accentlong-1Acento de la tarjeta: una franja en su borde inicial, su anillo de selección y su insignia lo toman; prevalece sobre el color de una columna ROLE_COLOR. -1 = el del componente, sin franja
il_back_colorlong-1Fondo de la tarjeta, en RGB(r,g,b) (-1 = lo que da el tema)
il_text_colorlong-1Color del texto de la tarjeta (-1 = lo que da el tema)
il_back_color_hoverlong-1Fondo de la tarjeta bajo el puntero (-1 = lo que da el tema)
il_text_color_hoverlong-1Color del texto de la tarjeta bajo el puntero (-1 = lo que da el tema)

Tres lecturas del handle, solo lectura: of_column() devuelve la clave de la columna en la que está la tarjeta ahora, of_position() su lugar en esa columna desde 1 (0 si el tablero no la contiene), of_row() el número de su fila en el DataStore (0 para una tarjeta añadida a mano). Una tarjeta se mueve con of_move_card del tablero.


Métodos #

MétodoFunción
of_add_card (string as_key, string as_column, string as_title)Añade una tarjeta al final de una columna. Su clave es única en todo el tablero. Devuelve 0 una vez añadida, -5 para una clave vacía, con / o `, ya ocupada (tarjetas de un DataStore incluidas) o una columna desconocida, -2` cuando el componente no está creado
of_add_column (string as_key, string as_title)Añade una columna a la derecha del tablero. Devuelve 0 una vez añadida, -5 para una clave vacía, con / o `, o ya ocupada, -2` cuando el componente no está creado
of_card (string as_key)Devuelve el handle de una tarjeta (creado en el primer acceso, liberado cuando se quita la tarjeta)
of_clear ( )Vacía el tablero: columnas, tarjetas (las de un DataStore incluidas) y sus handles; las opciones se quedan. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado
of_clear_cards ( )Quita todas las tarjetas y sus handles, conserva las columnas: para volver a cargar las tarjetas. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado
of_clear_selection ( )No deja ninguna tarjeta seleccionada: sigue ue_selection_changed con una clave vacía; nada seleccionado, no se lanza nada. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado
of_column (string as_key)Devuelve el handle de una columna (creado en el primer acceso, liberado cuando se quita la columna)
of_from_datastore (datastore ads)Hace una tarjeta de cada fila del DataStore (ver más arriba). Una segunda carga actualiza las tarjetas en su sitio con una clave ROLE_KEY, las rehace con la clave RowID; las tarjetas de las filas desaparecidas se van, las añadidas a mano se quedan; una fila no cargada la nombra of_get_last_error. Devuelve 0 una vez cargado, -5 cuando el DataStore no es válido o no tiene columnas, -2 cuando el componente no está creado
of_from_datastore (datawindow adw)Lo mismo desde las filas de un DataWindow — el que el usuario ve al lado: ib_write_back escribe en este DataWindow. Devuelve 0 una vez cargado, -5 cuando el DataWindow no es válido, no tiene columnas o no puede compartir sus filas (ShareData), -2 cuando el componente no está creado
of_from_datastore (datawindowchild adwc)Lo mismo desde las filas de un DataWindowChild (una lista desplegable DataWindow, un informe anidado), reescrito por ib_write_back. Devuelve 0 una vez cargado, -5 cuando no es válido, no tiene columnas o no puede compartir sus filas (ShareData), -2 cuando el componente no está creado
of_get_field (string as_key, string as_field)Lee un campo de una tarjeta, en directo: uno de los suyos, una columna de su DataStore o un campo integrado (column_title, initials…). Una cadena vacía cuando no tiene
of_get_last_error ( )Por qué falló la última llamada: un método que devolvió -5 o -4, una fecha rechazada (is_due, is_today), las filas que una carga dejó fuera, por su número. Vaciada por cada llamada; si no, el último error de la biblioteca
of_get_layout ( )Lo que el usuario ha organizado, en JSON: {"columns":[{"key":"todo","collapsed":false},...]} — cada columna en su orden (ocultas incluidas), con su pliegue. Para guardar y luego devolver a of_set_layout. Títulos, límites y tarjetas son suyos: no están. Leído en directo
of_map (string as_role, string as_column)Da un rol a una columna del DataStore (ROLE_KEY, ROLE_COLUMN, ROLE_TITLE, ROLE_TEXT, ROLE_TAGS, ROLE_ASSIGNEE, ROLE_DUE, ROLE_BADGE, ROLE_COLOR, ROLE_ORDER). Tras of_from_datastore, las filas se vuelven a leer en su sitio: una tarjeta movida se queda donde se soltó y conserva sus indicadores y su handle. Una columna vacía devuelve el rol a la columna que se llama como él. Una tarjeta que su código quitó no vuelve. Devuelve 0 una vez fijado, -5 para un rol desconocido o una columna que el DataStore no tiene, -2 cuando el componente no está creado
of_move_card (string as_key, string as_column, long al_position)Mueve una tarjeta a una columna, en un lugar contado desde 1 (más allá del último: al final), como un arrastre: la pregunta con ib_veto_moves, luego ue_card_moved, y, con ib_write_back, el DataStore escrito antes del movimiento. Devuelve 0 una vez movida (o ya allí: no se lanza nada), -4 cuando ue_card_moving la rechazó, el DataStore rechazó la nueva columna o un rango (la tarjeta se queda, ue_write_back_failed, of_get_last_error dice por qué) o el tablero espera a la página (una llamada desde un temporizador durante una lectura: ni la pregunta ni la escritura pueden hacerse), -5 para una tarjeta o una columna desconocida, -2 cuando el componente no está creado
of_move_column (string as_key, long al_position)Mueve una columna a un lugar contado desde 1 entre todas las columnas, ocultas incluidas (más allá de la última: la última), como un arrastre de su encabezado: la pregunta con ib_veto_moves, luego ue_column_moved y ue_layout_changed. Ni ib_reorderable ni ib_read_only detienen su código. Devuelve 0 una vez movida (o ya allí: no se lanza nada), -4 cuando ue_column_moving la rechazó, -5 para una columna desconocida, -2 cuando el componente no está creado
of_reload_row (long al_row)Vuelve a enviar al tablero una fila del DataStore de of_from_datastore, leída ahora, después de que su código la cambiara; su tarjeta se actualiza en su sitio (indicadores, campos y handle se quedan) y sigue su columna y su rango. Devuelve 0 una vez enviada, -5 cuando nada está vinculado, la fila no existe, su clave está tomada por una tarjeta añadida a mano, su valor de columna está vacío o su valor ROLE_KEY ya no es la clave de su tarjeta — una clave es una identidad: tras un Update que da las claves, vuelva a cargar con of_from_datastore (of_get_last_error lo dice, nada ha cambiado), -2 cuando el componente no está creado
of_remove_card (string as_key)Quita una tarjeta y libera su handle; quitarla seleccionada vacía la selección. Devuelve 0 una vez quitada, -5 para una tarjeta desconocida, -2 cuando el componente no está creado
of_remove_column (string as_key)Quita una columna y todas sus tarjetas, con sus handles. Devuelve 0 una vez quitada, -5 para una columna desconocida, -2 cuando el componente no está creado
of_reset ( )Vacía el tablero, olvida el DataStore y devuelve cada propiedad a su valor por defecto. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado
of_select_card (string as_key)Selecciona una tarjeta como un clic, sin mover la vista (como SelectRow de un DataWindow), y sigue ue_selection_changed. Devuelve 0 una vez seleccionada (o ya seleccionada: no se lanza nada), -5 para una tarjeta desconocida o no dibujada (oculta, en una columna plegada u oculta, fuera de la búsqueda, más allá del límite de demostración), -2 cuando el componente no está creado
of_selected_key ( )La clave de la tarjeta seleccionada, la haya seleccionado quien sea; vacía si ninguna. Leída en directo
of_set_field (string as_key, string as_field, string as_value)Da a una tarjeta un campo suyo, para is_card_template; prevalece sobre una columna del DataStore del mismo nombre. Un nombre de campo: letras, cifras y _, sin cifra inicial. Devuelve 0 una vez fijado, -5 para una tarjeta desconocida o un nombre no válido, -2 cuando el componente no está creado
of_set_layout (string as_layout_json)Devuelve una disposición leída con of_get_layout o recibida por ue_layout_changed: las columnas que nombra en su orden, luego las demás en el suyo, cada una con su pliegue; una columna que el tablero no contiene se ignora. ue_layout_changed se lanza una vez si algo ha cambiado (ni ue_column_moved ni ue_column_toggled: restablece un estado). Devuelve 0 una vez aplicada, -5 cuando el texto está vacío o no es un objeto JSON, -2 cuando el componente no está creado

Eventos #

EventoSe activa cuando
ue_card_moved (string as_key, string as_from_column, string as_to_column, long al_position, long al_from_position)Una tarjeta se ha movido: arrastrada, movida con el teclado, o por su código (of_move_card). Las dos claves de columna (la misma para un movimiento dentro de una columna), al_position su lugar en la columna de destino y al_from_position el que dejó, desde 1. La tarjeta ya está en su sitio; con ib_write_back, el DataStore ya está escrito
ue_card_moving (string as_key, string as_from_column, string as_to_column, long al_position) → booleanCancelable, planteado antes de un movimiento, solo cuando ib_veto_moves = true: arrastre, teclado y of_move_card. Devolver FALSE deja la tarjeta donde está. El lugar para un límite estricto: of_column(as_to_column).of_visible_count() >= il_limit
ue_card_clicked (string as_key)Se ha pulsado una tarjeta (y seleccionado). No al final de un arrastre
ue_card_opened (string as_key)Doble clic en una tarjeta, o Intro: abra su editor
ue_card_rclicked (string as_key, long al_x, long al_y)Clic derecho en una tarjeta (seleccionada primero). al_x, al_y son píxeles de pantalla; para un menú PowerBuilder, PopMenu(PointerX(), PointerY()) de su ventana
ue_column_moved (string as_key, long al_from, long al_to)Una columna se ha movido (ib_reorderable): su encabezado arrastrado, Ctrl + Mayús + Izquierda / Derecha, o su código (of_move_column). al_from y al_to son sus posiciones entre todas las columnas, ocultas incluidas, desde 1. La columna ya está en su sitio; sigue ue_layout_changed
ue_column_moving (string as_key, long al_from, long al_to) → booleanCancelable, planteado antes de que una columna se mueva, solo cuando ib_veto_moves = true (el mismo opt-in que las tarjetas): arrastre del encabezado, teclado y of_move_column. Devolver FALSE deja la columna donde está, y of_move_column devuelve -4
ue_column_rclicked (string as_key, long al_x, long al_y)Clic derecho en el encabezado de una columna. Píxeles de pantalla, como ue_card_rclicked
ue_column_toggled (string as_key, boolean ab_collapsed)Una columna se ha plegado (ab_collapsed = TRUE) o abierto: su cheurón, un doble clic en su franja, el teclado en su encabezado (Intro o Espacio pliegan o abren, + abre, - pliega), o su ib_collapsed fijado por su código
ue_delete_requested (string as_key)Se ha pulsado Supr en la tarjeta seleccionada. El tablero no quita nada: of_remove_card una vez que su aplicación esté de acuerdo. Nunca en una tarjeta o un tablero de solo lectura
ue_layout_changed (string as_layout_json)La disposición ha cambiado: una columna movida o plegada, por el usuario o por su código, o of_set_layout. as_layout_json es la disposición entera, tal como la da of_get_layout: guárdela
ue_new_requested (string as_column, string as_title)El usuario pide una nueva tarjeta en una columna: su botón + Añadir una tarjeta, la tecla Insert o un doble clic en su parte vacía; as_title es el título escrito en el campo de añadido rápido (ib_quick_add), vacío si no. El tablero no añade nada: of_add_card, tras su propio cuadro de diálogo si lo desea
ue_selection_changed (string as_from_key, string as_key)La tarjeta seleccionada ha cambiado: clic, teclado, su código (of_select_card, of_clear_selection), o la tarjeta seleccionada ha salido del dibujo (quitada, oculta, plegada, fuera de la búsqueda: as_key está entonces vacía)
ue_write_back_failed (string as_key, string as_col, string as_value, string as_reason)ib_write_back: el DataStore rechazó la nueva columna de una tarjeta movida (un valor que su columna no admite, una fila eliminada desde la carga). También un rango rechazado (as_reason empieza entonces por « the rank of row »). Nada queda escrito: lo que lo estaba se repone. La tarjeta no se movió (el DataStore se escribe antes del movimiento), no se lanza ue_card_moved y of_move_card devuelve -4
ue_ready ( )El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
ue_runtime_missing ( )El runtime WebView2 está ausente: el componente permanece vacío
ue_bg_color (long al_color)El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor)

Teclado y ratón #


Ejemplos #

Un límite estricto y una regla de paso #

// Once, after the board is built : ask before each move
uo_board.ib_veto_moves = true

// event ue_card_moving of uo_board : a card reaches Done only from Review
if as_to_column = "done" and as_from_column <> "review" then return false

// and a column past its limit takes no more card (what its header counts :
// the visible cards)
if as_to_column <> as_from_column then
	if this.of_column(/*key*/ as_to_column).il_limit > 0 and this.of_column(/*key*/ as_to_column).of_visible_count() >= this.of_column(/*key*/ as_to_column).il_limit then return false
end if
return true

Recuperar las columnas en el próximo inicio #

// Once, after the board is built : the user may move the columns
uo_board.ib_reorderable = true

// The layout stored at the last start, if any
uo_board.of_set_layout(/*layout_json*/ ProfileString(gs_ini, "board", "layout", ""))

// event ue_layout_changed of uo_board : store every change
SetProfileString(gs_ini, "board", "layout", as_layout_json)

Abrir una tarjeta en su ventana #

// event ue_card_opened of uo_board : the row of the card, edited in your window
OpenWithParm(w_task_edit, uo_board.of_card(/*key*/ as_key).of_row())

// The row may have changed : the card follows it
uo_board.of_reload_row(/*row*/ uo_board.of_card(/*key*/ as_key).of_row())

Un tablero de equipo: puntos, anchura repartida, añadido rápido #

// The estimate of a card, a field of our own
uo_board.of_set_field(/*key*/ "t1", /*field*/ "points", /*value*/ "5")

// Every header : its cards, its limit, the sum of the points of its cards
uo_board.is_count_template = "{count}{?limit}/{limit}{/limit} - {sum:points} pts"

// The open columns share the width of the board
uo_board.ii_column_width = 0

// + Add a card opens a title field at the foot of the column
uo_board.ib_add_button = true
uo_board.ib_quick_add = true

// event ue_new_requested of uo_board : the card typed, with a key of ours
uo_board.of_add_card(/*key*/ "new" + String(Cpu()), /*column*/ as_column, /*title*/ as_title)

Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_count · of_keys_at · of_hasRecorrer lo que el componente contiene3.2 Los items
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades
is_accessible_name · is_accessible_descriptionEl nombre y la descripción que dice un lector de pantalla3.4 Propiedades y eventos opcionales

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.

← Referencia de componentes · Índice de la guía