PBToolboxAI v5 ← Site

kanban — u_pbt_kanban #

← Komponentenreferenz · Inhalt des Handbuchs

kanban ist eine Tafel mit Karten, die in Spalten geordnet sind — den Stufen einer Arbeit: zu erledigen, in Arbeit, in Prüfung, erledigt. Der Benutzer zieht eine Karte von einer Spalte in eine andere oder innerhalb ihrer Spalte nach oben und unten; ue_card_moved sagt Ihnen, welche, woher, wohin und an welche Stelle. Jede Karte zeigt einen Titel, farbige Tags, ihren Zuständigen, einen Termin, der bei Verzug rot wird, und ein Badge; jede Spalte hat ihr WIP-Limit und lässt sich einklappen. Die Tafel wird von Hand oder aus einem DataStore gefüllt, der die Verschiebungen empfängt.

▶ Live ansehen — Demoanwendung, Kachel Kanban board: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Userobjectu_pbt_kanban
Elementklassenn_pbt_kanban_column (of_column(key)), n_pbt_kanban_card (of_card(key))
Dient zuEinen Arbeitsfluss verfolgen: Tickets, Aufgaben, Bestellungen, Bewerbungen
PrinzipEine Karte hat einen auf der ganzen Tafel eindeutigen Schlüssel; ihre Spalte ist ein Zustand, der sich bei jeder Verschiebung ändert
Opt-in-Optionenib_veto_moves, ib_write_back, ib_reorderable, ib_toolbar, ib_add_button, ib_quick_add

Schnellstart #

// 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;

Spalten, Karten und Plätze #

Eine Spalte wird über ihren Schlüssel bezeichnet, eine Karte ebenso — und der Schlüssel einer Karte ist auf der ganzen Tafel eindeutig, nicht nur in ihrer Spalte: Eine Karte behält ihren Schlüssel, wenn sie die Spalte wechselt, ihre Handles bleiben gültig, und jedes Ereignis nennt sie allein. Die Spalte einer Karte liest man mit of_card(key).of_column(), ihren Platz mit of_position(); ein Platz zählt ab 1, ausgeblendete Karten inbegriffen.

Eine Spalte hat ein WIP-Limit (il_limit): Ihre Kopfzeile zählt 3/5, und darüber hinaus wird sie rot. Das Limit ist weich — die Karte kommt trotzdem an; für ein hartes Limit lehnen Sie die Verschiebung in ue_card_moving ab, indem Sie il_limit mit of_visible_count() der Spalte vergleichen, dem, was die Kopfzeile zählt (eine ausgeblendete Karte zählt nicht). ib_done kennzeichnet die Spalte der erledigten Arbeit: Ihre Karten sind nie überfällig. Eine Spalte lässt sich zu einem schmalen Streifen einklappen (ihr Winkel, ib_collapsed); eine Karte lässt sich trotzdem darauf ablegen, ans Ende.

Eine Verschiebung des Benutzers (Ziehen, Strg + Pfeile oder die mit der Leertaste angehobene und abgelegte Karte) und eine Verschiebung Ihres Codes (of_move_card) lösen dasselbe ue_card_moved aus, so wie SelectItem das Ereignis des Klicks auslöst. Mit ib_veto_moves wird ue_card_moving in beiden Fällen vorher gestellt: FALSE zurückzugeben lässt die Karte, wo sie ist, und of_move_card gibt dann -4 zurück.

Mit ib_reorderable = true ordnet der Benutzer auch die Spalten neu: Er zieht die Kopfzeile einer Spalte (ein senkrechter Akzentbalken zeigt, wo sie landet, Esc bricht ab) oder drückt Strg + Umschalt + Links / Rechts. ue_column_moved liefert die Spalte und ihre beiden Plätze, ab 1 gezählt unter allen Spalten; of_move_column tut dasselbe aus Ihrem Code und löst dasselbe Ereignis aus, wobei ue_column_moving mit ib_veto_moves vorher gestellt wird. Standardmäßig aus: Die Spalten sind der Prozess Ihrer Anwendung. Was der Benutzer angeordnet hat — die Reihenfolge der Spalten und ihr Einklappen —, liest man mit of_get_layout, gibt es mit of_set_layout zurück, und jede Änderung löst ue_layout_changed mit dem ganzen Layout aus: Speichern Sie es und geben Sie es beim nächsten Start zurück.


Was eine Karte zeigt #

Eine Karte zeigt ihren Titel (is_title), ihren Text (is_text, nach vier Zeilen abgeschnitten), ihre Tags (is_tags, durch Kommas getrennt, gefärbt durch is_tag_tones: Bug=danger|UI=info), ihren Zuständigen (is_assignee, ein runder Avatar mit den Initialen), ihren Termin (is_due, jjjj-mm-tt: rot, sobald überschritten, orange am Tag selbst, verglichen mit is_today oder dem Datum des Arbeitsplatzes) und ein Badge (is_badge). Titel, Text und Badge akzeptieren die Rich-Text-Auszeichnung.

Der Inhalt der Karten kann über eine Vorlage geschrieben werden, is_card_template: Rich Text, in dem {customer} ein Feld der Karte ist — eines Ihrer eigenen (of_set_field), eine Spalte des DataStores, aus dem sie stammt, oder ein eingebautes Feld (title, text, tags, assignee, initials, badge, due, column, column_title, key). {due:dddd d mmmm} schreibt ein Datum wie ein Anzeigeformat eines DataWindow (die Kürzel d dd ddd dddd m mm mmm mmmm yy yyyy, ein Text zwischen doppelten Anführungszeichen — außerhalb davon ist ein Buchstabe d, m oder y ein Kürzel —, [shortdate] und [longdate] in der Sprache der Anzeige), {?amount}…{/amount} behält ein Stück, wenn das Feld etwas enthält, {!amount}…{/amount}, wenn es nichts enthält, {x:raw} behält einen Wert als Auszeichnung, {{ }} sind geschweifte Klammern. Ein Wert wird immer so angezeigt, wie er ist, nie als Auszeichnung gelesen.

// 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}"

Aus einem DataStore #

of_from_datastore macht aus jeder Zeile eines DataStores, eines DataWindow oder eines DataWindowChild eine Karte — derselbe Aufruf, und ein DataWindow wird selbst zurückgeschrieben. Ihr Schlüssel ist die RowID der Zeile — of_card(key).of_row() liefert die Nummer ihrer Zeile, solange der DataStore weder geleert noch neu abgerufen wird — oder der Wert der Spalte ROLE_KEY. Eine Zeile, deren Schlüssel leer, ungültig, schon gesehen oder von einer von Hand hinzugefügten Karte belegt ist, wird nicht geladen: Der Aufruf gibt 0 zurück, und of_get_last_error nennt sie mit ihrer Nummer — geben Sie Ihren Karten von Hand Schlüssel, die keine Zahlen sind. Eine Spalte spielt eine Rolle, wenn sie so heißt (title, text, tags, assignee, due, badge, color, order, column, key) oder wenn of_map es sagt. Die Spalte ROLE_COLUMN sagt, in welcher Spalte der Tafel die Karte steht; ein Wert, den keine Spalte trägt, erhält eine eigene Spalte, am Ende — ein Wert mit / oder | erhält einen Schlüssel, in dem sie zu - werden (R&D-QA), und behält seinen Wert, den eine Verschiebung zurückschreibt; ein leerer Wert wird nicht geladen (of_get_last_error nennt ihn), ein mit Leerzeichen aufgefüllter CHAR-Wert findet seine Spalte. Eine aus einem Wert entstandene Spalte verschwindet, sobald sie leer ist, es sei denn, Ihr Code hat ihr eine Eigenschaft oder eine Farbe gegeben. ROLE_ORDER ordnet die Karten einer Spalte: Der Rang ist der Platz einer Karte unter den Karten des DataStores ihrer Spalte, ab 1 (eine von Hand hinzugefügte Karte nimmt keinen Rang). Mit einem Schlüssel ROLE_KEY aktualisieren ein zweites Laden, of_map und of_reload_row die Karten an Ort und Stelle: Eine Karte, die zurückkommt, behält ihre Kennzeichen, ihre Felder und ihren Handle. Mit dem Schlüssel RowID ist ein zweites of_from_datastore ein neues Laden: PowerBuilder vergibt nach einem Reset oder Retrieve dieselben RowIDs an andere Datensätze — alle Karten der alten Zeilen gehen (ihr Handle wird freigegeben) und die Karten werden neu angelegt; of_map und of_reload_row bleiben an Ort und Stelle. Eine Karte, die Ihr Code entfernt hat, kommt mit of_map nicht zurück: Ihre Zeile bleibt im DataStore, das nächste of_from_datastore liest sie wieder. Datums- und Dezimalwerte werden nach den Regionaleinstellungen des Arbeitsplatzes gelesen (ein Dezimalfeld liest sich 1234.5). Jede Spalte ist ein Feld der Vorlage.

Mit ib_write_back = true schreibt eine Karte einer Zeile ihre neue Spalte in die Zeile (und mit ROLE_ORDER die Ränge beider Spalten), bevor sie sich bewegt — die Zeile wird über ihre RowID gefunden und über nichts anderes: ue_card_moved liest den aktuellen DataStore, das Update bleibt bei Ihnen. Die Spalte erhält den Wert der Zielspalte (R&D/QA, nie ihren Schlüssel R&D-QA). Alles oder nichts: Ein Wert, den der DataStore ablehnt — die Spalte oder ein Rang —, stellt wieder her, was schon geschrieben war, lässt die Karte an ihrem Platz (sie geht nie, um zurückzukommen) und löst ue_write_back_failed aus; of_move_card gibt dann -4 zurück. Es wird immer nur eine Verschiebung des Benutzers geschrieben: Eine Geste, bevor die vorige geschrieben ist, wird ignoriert und angesagt. Nachdem Sie selbst eine Zeile geändert haben, sendet of_reload_row sie erneut an die Tafel.

// 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)

Eigenschaften #

EigenschaftTypStandardZweck
is_card_templatestring""Der Inhalt jeder Karte, über eine Vorlage geschrieben (siehe oben). Leer: der Text der Karte (is_text). Die Suche liest, was die Vorlage schreibt
is_count_templatestring""Der Zähler in der Kopfzeile jeder Spalte, über eine Vorlage geschrieben: {count} die sichtbaren Karten, {limit} das Limit (leer ohne Limit), {shown} die Karten, die die Suche behält, {sum:points} die Summe eines Feldes über die sichtbaren Karten (eines Ihrer eigenen oder eine Spalte des DataStores), {title} und {key} der Spalte; {?limit}…{/limit} behält ein Stück, wenn es ein Limit gibt. Leer: 3, 3/5, 1 . 3/5 während einer Suche. Über ihrem Limit wird die Spalte rot, was die Vorlage auch sagt, und ihre Kopfzeile sagt es dem Bildschirmleser. {sum:} liest eine Zahl mit Punkt oder in der Sprache der Anzeige (1.234,5 auf Deutsch); ein Text zählt nicht. Ohne Schlüssel sind Anzahl und Summe die der Karten, die die Demo zeichnet
is_tag_tonesstring""Der Ton jedes Tags, Tag=Ton verbunden durch `: Bug=dangerUI=info. Töne: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (der Akzent), TONE_NEUTRAL`. Ein Tag findet seinen Ton unabhängig von der Groß-/Kleinschreibung; ein nicht aufgeführtes Tag oder ein unbekannter Ton ist neutral
is_todaystring""Der Tag, mit dem die Termine verglichen werden, jjjj-mm-tt; leer: das Datum des Arbeitsplatzes. Ein ungültiges Datum wird abgelehnt: das alte bleibt, of_get_last_error sagt warum
is_filterstring""Die Suche: Nur die Karten bleiben, deren Titel, Inhalt, Tags, Zuständiger, Badge, Schlüssel, eines Ihrer Felder oder eine Spalte des DataStores diesen Text enthalten, ohne Rücksicht auf Groß-/Kleinschreibung und Akzente. Der Zähler einer Spalte nennt dann zuerst die gefundenen Karten (1 . 3). Das Suchfeld der Werkzeugleiste schreibt sie ebenfalls: live gelesen
ib_toolbarbooleanfalseEine Werkzeugleiste über der Tafel, mit einem Suchfeld, das is_filter schreibt (Esc leert es)
ib_add_buttonbooleanfalseEine Schaltfläche + Karte hinzufügen am Fuß jeder offenen Spalte: Sie löst ue_new_requested aus. Ein Doppelklick auf den leeren Teil einer Spalte löst es ebenfalls aus, mit oder ohne Schaltfläche
ib_quick_addbooleanfalseSchnelles Hinzufügen: Die Schaltfläche + Karte hinzufügen und die Taste Einfg öffnen ein Titelfeld am Fuß der Spalte; Eingabe löst ue_new_requested mit dem eingegebenen Titel aus (ein leerer Titel verlangt nichts), das Feld bleibt für die nächste Karte offen, Esc schließt es. Die Tafel fügt weiterhin nichts hinzu: Ihr Code fügt die Karte hinzu
ib_read_onlybooleanfalseDer Benutzer verschiebt nichts: kein Ziehen, kein Strg + Pfeile, kein Entf, keine Hinzufügen-Schaltfläche. Er wählt und öffnet die Karten weiterhin; Ihr Code verschiebt sie weiterhin
ib_reorderablebooleanfalseDer Benutzer ordnet die Spalten neu: Er zieht ihre Kopfzeile oder drückt Strg + Umschalt + Links / Rechts; ue_column_moved, dann ue_layout_changed folgen. ib_read_only hält es ebenfalls auf; Ihr Code verschiebt sie weiterhin (of_move_column). Live gelesen
ib_veto_movesbooleanfalseOpt-in: vor jeder Verschiebung ue_card_moving fragen, die des Benutzers wie die von of_move_card. Standardmäßig aus, wie jedes abbrechbare Ereignis der Bibliothek
ib_write_backbooleanfalseEine von of_from_datastore gespeiste Tafel: Eine Karte einer Zeile schreibt ihre neue Spalte (und mit ROLE_ORDER die Ränge) in den DataStore, bevor sie sich bewegt; ein abgelehnter Wert lässt sie an ihrem Platz (ue_write_back_failed, of_move_card gibt -4 zurück). Eine von Hand hinzugefügte Karte wird nie geschrieben
ii_column_widthinteger272Die Breite einer offenen Spalte in Pixeln, von 180 bis 600 (ein Wert außerhalb wird zurückgeführt); 0: Die offenen Spalten teilen sich die Breite der Tafel, jede mindestens 180 Pixel. Die Tafel scrollt seitlich, wenn die Spalten nicht passen
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Eigenschaften einer Spalte — n_pbt_kanban_column #

Ihr Handle, über of_column(key). Ihr of_count() zählt die Karten, die sie enthält, und ihr of_keys_at(n) liefert den Schlüssel der n-ten, in ihrer Reihenfolge; of_child_keys liefert sie alle mit einem einzigen Lesen.

EigenschaftTypStandardZweck
is_titlestring""Titel der Spalte. Akzeptiert die Rich-Text-Auszeichnung. Leer zeigt die Spalte ihren Schlüssel
il_limitlong0WIP-Limit: 0, keines. Mit Limit zeigt die Kopfzeile 3/5, und die Spalte wird rot, sobald sie mehr enthält; während eine Karte über eine volle Spalte gezogen wird, zeigt sie es. Weiches Limit: Für ein hartes in ue_card_moving ablehnen
ib_collapsedbooleanfalsetrue klappt die Spalte zu einem schmalen Streifen ein: Ihr nach unten geschriebener Titel und ihr Zähler bleiben, ihre Karten verschwinden, eine Karte lässt sich trotzdem ablegen (ans Ende). ue_column_toggled folgt, wie bei einem Klick auf ihren Winkel. Live gelesen
ib_visiblebooleantruefalse nimmt die Spalte und ihre Karten aus der Tafel; sie behalten ihren Platz und ihre Reihenfolge
ib_donebooleanfalseDie Spalte der erledigten Arbeit: Ihre Karten werden nie als überfällig oder heute fällig angezeigt
of_keys_at (long al_index) → string——Der Schlüssel der Karte an Rang al_index (ab 1) in der Spalte, in ihrer Reihenfolge; leer außerhalb. Da eine Karte allein über ihren Schlüssel bezeichnet wird, ist es das, was of_card nimmt
of_child_keys (ref string as_keys[]) → long——Füllt as_keys[] mit den Schlüsseln aller Karten der Spalte, in ihrer Reihenfolge — was of_keys_at(1..n) liefert — und gibt ihre Anzahl zurück, mit einem einzigen Lesen: 2 000 Karten mit of_keys_at zu durchlaufen liest die Liste 2 000-mal
of_position ( ) → long——Gibt den Platz der Spalte auf der Tafel jetzt zurück, ab 1 gezählt unter allen Spalten (ausgeblendete inbegriffen) — der Benutzer kann sie verschoben haben; 0, wenn die Tafel sie nicht enthält
of_visible_count ( ) → long——Gibt die Zahl der sichtbaren Karten der Spalte zurück, das, was ihre Kopfzeile gegen il_limit zählt (2/3): Eine durch ib_visible ausgeblendete Karte zählt nicht, eine Karte außerhalb der Suche zählt; of_count() zählt sie alle. Die Zahl, die für ein hartes Limit mit il_limit zu vergleichen ist; 0, wenn die Tafel die Spalte nicht enthält
is_tooltipstring""Einfacher Tooltip beim Überfahren des Items
is_super_tooltip_titlestring""Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Item-Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Item-Tooltips
il_accentlong-1Akzent der Spalte: der Balken darüber und ihr Zähler übernehmen ihn, nie ihre Karten (-1 = der der Komponente)
il_back_colorlong-1Hintergrund der Spalte, als RGB(r,g,b) (-1 = was das Design vorgibt)
il_text_colorlong-1Textfarbe der Spalte (-1 = was das Design vorgibt)
il_back_color_hoverlong-1Hintergrund der Kopfzeile der Spalte unter dem Mauszeiger (-1 = was das Design vorgibt). Die Farben einer Spalte enden an ihren Karten
il_text_color_hoverlong-1Textfarbe der Kopfzeile der Spalte unter dem Mauszeiger (-1 = was das Design vorgibt)

Eigenschaften einer Karte — n_pbt_kanban_card #

EigenschaftTypStandardZweck
is_titlestring""Titel der Karte, fett. Akzeptiert die Rich-Text-Auszeichnung. Leer zeigt die Karte ihren Schlüssel
is_textstring""Text unter dem Titel, nach vier Zeilen abgeschnitten (Auszeichnung akzeptiert). Angezeigt, solange is_card_template leer ist
is_tagsstring""Tags, durch Kommas getrennt: Bug, UI. Jedes ist ein durch is_tag_tones gefärbtes Kürzel
is_assigneestring""Die Person, der die Karte zugewiesen ist: ein runder Avatar mit den Initialen, bei jedem Laden in derselben Farbe, der Name als Tooltip
is_duestring""Termin, jjjj-mm-tt ("": keiner): rot, sobald überschritten, orange am Tag selbst, nie in einer ib_done-Spalte. Ein ungültiges Datum wird abgelehnt: das alte bleibt, of_get_last_error der Tafel sagt warum
is_badgestring""Kleines Badge oben rechts (Auszeichnung akzeptiert): eine Schätzung, eine Zahl, im Akzent
ib_visiblebooleantruefalse nimmt die Karte aus der Tafel; sie behält Schlüssel, Spalte und Platz und zählt nicht mehr in ihrer Spalte
ib_read_onlybooleanfalseDer Benutzer kann diese Karte weder ziehen noch mit der Tastatur verschieben noch ihr Löschen verlangen; Ihr Code verschiebt sie weiterhin
of_column ( ) → string——Der Schlüssel der Spalte, in der die Karte jetzt steht — der Benutzer kann sie verschoben haben. Nur lesbar: Eine Karte wird über of_move_card verschoben
of_position ( ) → long——Gibt den Platz der Karte in ihrer Spalte jetzt zurück, ab 1 gezählt (ausgeblendete Karten inbegriffen), 0, wenn die Tafel sie nicht enthält
of_row ( ) → long——Gibt die heutige Zeilennummer der Zeile, aus der die Karte stammt, in den an of_from_datastore übergebenen Zeilen zurück — nach einer Sortierung, einem Filter oder dem Löschen anderer Zeilen; 0 für eine von Hand hinzugefügte Karte oder eine, deren Zeile verschwunden ist
is_tooltipstring""Einfacher Tooltip beim Überfahren des Items
is_super_tooltip_titlestring""Titel des erweiterten Item-Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Item-Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Item-Tooltips
il_accentlong-1Akzent der Karte: ein Streifen an ihrer Anfangskante, ihr Auswahlring und ihr Badge übernehmen ihn; er geht der Farbe einer ROLE_COLOR-Spalte vor. -1 = der der Komponente, ohne Streifen
il_back_colorlong-1Hintergrund der Karte, als RGB(r,g,b) (-1 = was das Design vorgibt)
il_text_colorlong-1Textfarbe der Karte (-1 = was das Design vorgibt)
il_back_color_hoverlong-1Hintergrund der Karte unter dem Mauszeiger (-1 = was das Design vorgibt)
il_text_color_hoverlong-1Textfarbe der Karte unter dem Mauszeiger (-1 = was das Design vorgibt)

Drei Lesefunktionen des Handles, nur lesend: of_column() liefert den Schlüssel der Spalte, in der die Karte jetzt steht, of_position() ihren Platz in dieser Spalte ab 1 (0, wenn die Tafel sie nicht enthält), of_row() die Nummer ihrer Zeile im DataStore (0 für eine von Hand hinzugefügte Karte). Eine Karte wird über of_move_card der Tafel verschoben.


Methoden #

MethodeZweck
of_add_card (string as_key, string as_column, string as_title)Fügt eine Karte am unteren Ende einer Spalte hinzu. Ihr Schlüssel ist auf der ganzen Tafel eindeutig. Gibt 0 zurück, sobald hinzugefügt, -5 für einen leeren Schlüssel, einen mit / oder `, einen schon vergebenen (Karten eines DataStores inbegriffen) oder eine unbekannte Spalte, -2`, wenn die Komponente nicht erstellt ist
of_add_column (string as_key, string as_title)Fügt rechts der Tafel eine Spalte hinzu. Gibt 0 zurück, sobald hinzugefügt, -5 für einen leeren Schlüssel, einen mit / oder ` oder einen schon vergebenen, -2`, wenn die Komponente nicht erstellt ist
of_card (string as_key)Gibt den Handle einer Karte zurück (beim ersten Zugriff erstellt, freigegeben, wenn die Karte entfernt wird)
of_clear ( )Leert die Tafel: Spalten, Karten (die eines DataStores inbegriffen) und ihre Handles; die Optionen bleiben. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_clear_cards ( )Entfernt alle Karten und ihre Handles, behält die Spalten: um die Karten neu zu laden. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_clear_selection ( )Lässt keine Karte ausgewählt: ue_selection_changed folgt mit leerem Schlüssel; nichts ausgewählt, nichts wird ausgelöst. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_column (string as_key)Gibt den Handle einer Spalte zurück (beim ersten Zugriff erstellt, freigegeben, wenn die Spalte entfernt wird)
of_from_datastore (datastore ads)Macht aus jeder Zeile des DataStores eine Karte (siehe oben). Ein zweites Laden aktualisiert die Karten an Ort und Stelle mit einem Schlüssel ROLE_KEY, legt sie mit dem Schlüssel RowID neu an; die Karten verschwundener Zeilen gehen, die von Hand hinzugefügten bleiben; eine nicht geladene Zeile nennt of_get_last_error. Gibt 0 zurück, sobald geladen, -5, wenn der DataStore ungültig ist oder keine Spalte hat, -2, wenn die Komponente nicht erstellt ist
of_from_datastore (datawindow adw)Dasselbe aus den Zeilen eines DataWindow — desjenigen, das der Benutzer daneben sieht: ib_write_back schreibt in dieses DataWindow. Gibt 0 zurück, sobald geladen, -5, wenn das DataWindow ungültig ist, keine Spalte hat oder seine Zeilen nicht teilen kann (ShareData), -2, wenn die Komponente nicht erstellt ist
of_from_datastore (datawindowchild adwc)Dasselbe aus den Zeilen eines DataWindowChild (ein DropDown-DataWindow, ein verschachtelter Bericht), von ib_write_back zurückgeschrieben. Gibt 0 zurück, sobald geladen, -5, wenn es ungültig ist, keine Spalte hat oder seine Zeilen nicht teilen kann (ShareData), -2, wenn die Komponente nicht erstellt ist
of_get_field (string as_key, string as_field)Liest ein Feld einer Karte, live: eines Ihrer eigenen, eine Spalte ihres DataStores oder ein eingebautes Feld (column_title, initials…). Eine leere Zeichenkette, wenn sie keines hat
of_get_last_error ( )Warum der letzte Aufruf fehlschlug: eine Methode, die -5 oder -4 zurückgab, ein abgelehntes Datum (is_due, is_today), die Zeilen, die ein Laden ausgelassen hat, mit ihrer Nummer. Von jedem Aufruf geleert; sonst der letzte Fehler der Bibliothek
of_get_layout ( )Was der Benutzer angeordnet hat, als JSON: {"columns":[{"key":"todo","collapsed":false},...]} — jede Spalte in ihrer Reihenfolge (ausgeblendete inbegriffen), mit ihrem Einklappen. Zum Speichern und späteren Zurückgeben an of_set_layout. Titel, Limits und Karten gehören Ihnen: nicht darin. Live gelesen
of_map (string as_role, string as_column)Gibt einer Spalte des DataStores eine Rolle (ROLE_KEY, ROLE_COLUMN, ROLE_TITLE, ROLE_TEXT, ROLE_TAGS, ROLE_ASSIGNEE, ROLE_DUE, ROLE_BADGE, ROLE_COLOR, ROLE_ORDER). Nach of_from_datastore werden die Zeilen an Ort und Stelle neu gelesen: Eine verschobene Karte bleibt, wo sie abgelegt wurde, und behält ihre Kennzeichen und ihren Handle. Eine leere Spalte gibt die Rolle an die gleichnamige Spalte zurück. Eine Karte, die Ihr Code entfernt hat, kommt nicht zurück. Gibt 0 zurück, sobald gesetzt, -5 für eine unbekannte Rolle oder eine Spalte, die der DataStore nicht hat, -2, wenn die Komponente nicht erstellt ist
of_move_card (string as_key, string as_column, long al_position)Verschiebt eine Karte in eine Spalte, an einen ab 1 gezählten Platz (über den letzten hinaus: ans Ende), wie ein Ziehen: die Rückfrage mit ib_veto_moves, dann ue_card_moved, und mit ib_write_back wird der DataStore vor der Verschiebung geschrieben. Gibt 0 zurück, sobald verschoben (oder schon dort: nichts wird ausgelöst), -4, wenn ue_card_moving abgelehnt hat, der DataStore die neue Spalte oder einen Rang abgelehnt hat (die Karte bleibt, ue_write_back_failed, of_get_last_error sagt warum) oder die Tafel auf die Seite wartet (ein Aufruf aus einem Timer während eines Lesens: weder die Frage noch das Schreiben sind möglich), -5 für eine unbekannte Karte oder Spalte, -2, wenn die Komponente nicht erstellt ist
of_move_column (string as_key, long al_position)Verschiebt eine Spalte an einen ab 1 gezählten Platz unter allen Spalten, ausgeblendete inbegriffen (über die letzte hinaus: die letzte), wie ein Ziehen ihrer Kopfzeile: die Rückfrage mit ib_veto_moves, dann ue_column_moved und ue_layout_changed. Weder ib_reorderable noch ib_read_only halten Ihren Code auf. Gibt 0 zurück, sobald verschoben (oder schon dort: nichts wird ausgelöst), -4, wenn ue_column_moving abgelehnt hat, -5 für eine unbekannte Spalte, -2, wenn die Komponente nicht erstellt ist
of_reload_row (long al_row)Sendet eine Zeile des DataStores von of_from_datastore erneut an die Tafel, jetzt gelesen, nachdem Ihr Code sie geändert hat; ihre Karte wird an Ort und Stelle aktualisiert (Kennzeichen, Felder und Handle bleiben) und folgt ihrer Spalte und ihrem Rang. Gibt 0 zurück, sobald gesendet, -5, wenn nichts gebunden ist, die Zeile nicht existiert, ihr Schlüssel von einer von Hand hinzugefügten Karte belegt ist, ihr Spaltenwert leer ist oder ihr Wert ROLE_KEY nicht mehr der Schlüssel ihrer Karte ist — ein Schlüssel ist eine Identität: Laden Sie nach einem Update, das die Schlüssel vergibt, mit of_from_datastore neu (of_get_last_error sagt es, nichts hat sich geändert), -2, wenn die Komponente nicht erstellt ist
of_remove_card (string as_key)Entfernt eine Karte und gibt ihren Handle frei; das Entfernen der ausgewählten Karte hebt die Auswahl auf. Gibt 0 zurück, sobald entfernt, -5 für eine unbekannte Karte, -2, wenn die Komponente nicht erstellt ist
of_remove_column (string as_key)Entfernt eine Spalte und alle ihre Karten samt Handles. Gibt 0 zurück, sobald entfernt, -5 für eine unbekannte Spalte, -2, wenn die Komponente nicht erstellt ist
of_reset ( )Leert die Tafel, vergisst den DataStore und setzt jede Eigenschaft auf ihren Standardwert zurück. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist
of_select_card (string as_key)Wählt eine Karte wie ein Klick aus, ohne die Ansicht zu verschieben (wie SelectRow eines DataWindow), und ue_selection_changed folgt. Gibt 0 zurück, sobald ausgewählt (oder schon ausgewählt: nichts wird ausgelöst), -5 für eine unbekannte oder nicht gezeichnete Karte (ausgeblendet, in einer eingeklappten oder ausgeblendeten Spalte, außerhalb der Suche, jenseits der Demo-Grenze), -2, wenn die Komponente nicht erstellt ist
of_selected_key ( )Der Schlüssel der ausgewählten Karte, gleich wer sie ausgewählt hat; leer, wenn keine. Live gelesen
of_set_field (string as_key, string as_field, string as_value)Gibt einer Karte ein eigenes Feld für is_card_template; es geht einer gleichnamigen DataStore-Spalte vor. Ein Feldname: Buchstaben, Ziffern und _, keine Ziffer am Anfang. Gibt 0 zurück, sobald gesetzt, -5 für eine unbekannte Karte oder einen ungültigen Namen, -2, wenn die Komponente nicht erstellt ist
of_set_layout (string as_layout_json)Gibt ein mit of_get_layout gelesenes oder mit ue_layout_changed empfangenes Layout zurück: die Spalten, die es nennt, in seiner Reihenfolge, dann die anderen in ihrer, jede mit ihrem Einklappen; eine Spalte, die die Tafel nicht enthält, wird ignoriert. ue_layout_changed wird einmal ausgelöst, wenn sich etwas geändert hat (weder ue_column_moved noch ue_column_toggled: Es stellt einen Zustand wieder her). Gibt 0 zurück, sobald angewendet, -5, wenn der Text leer oder kein JSON-Objekt ist, -2, wenn die Komponente nicht erstellt ist

Ereignisse #

EventAusgelöst wenn
ue_card_moved (string as_key, string as_from_column, string as_to_column, long al_position, long al_from_position)Eine Karte wurde verschoben: gezogen, mit der Tastatur verschoben oder durch Ihren Code (of_move_card). Die beiden Spaltenschlüssel (derselbe bei einer Verschiebung innerhalb einer Spalte), al_position ihr Platz in der Zielspalte und al_from_position der Platz, den sie verlassen hat, ab 1. Die Karte ist schon an ihrem Platz; mit ib_write_back ist der DataStore schon geschrieben
ue_card_moving (string as_key, string as_from_column, string as_to_column, long al_position) → booleanAbbrechbar, wird vor einer Verschiebung gestellt, nur bei ib_veto_moves = true: Ziehen, Tastatur und of_move_card. FALSE zurückzugeben lässt die Karte, wo sie ist. Der Ort für ein hartes Limit: of_column(as_to_column).of_visible_count() >= il_limit
ue_card_clicked (string as_key)Eine Karte wurde angeklickt (und ausgewählt). Nicht am Ende eines Ziehens
ue_card_opened (string as_key)Doppelklick auf eine Karte oder Eingabe: Öffnen Sie Ihren Editor
ue_card_rclicked (string as_key, long al_x, long al_y)Rechtsklick auf eine Karte (zuerst ausgewählt). al_x, al_y sind Bildschirmpixel; für ein PowerBuilder-Menü PopMenu(PointerX(), PointerY()) Ihres Fensters
ue_column_moved (string as_key, long al_from, long al_to)Eine Spalte wurde verschoben (ib_reorderable): ihre Kopfzeile gezogen, Strg + Umschalt + Links / Rechts oder Ihr Code (of_move_column). al_from und al_to sind ihre Plätze unter allen Spalten, ausgeblendete inbegriffen, ab 1. Die Spalte ist schon an ihrem Platz; ue_layout_changed folgt
ue_column_moving (string as_key, long al_from, long al_to) → booleanAbbrechbar, wird bevor sich eine Spalte bewegt gestellt, nur bei ib_veto_moves = true (dasselbe Opt-in wie für die Karten): Ziehen der Kopfzeile, Tastatur und of_move_column. FALSE zurückzugeben lässt die Spalte, wo sie ist, und of_move_column gibt -4 zurück
ue_column_rclicked (string as_key, long al_x, long al_y)Rechtsklick auf die Kopfzeile einer Spalte. Bildschirmpixel, wie ue_card_rclicked
ue_column_toggled (string as_key, boolean ab_collapsed)Eine Spalte wurde eingeklappt (ab_collapsed = TRUE) oder geöffnet: ihr Winkel, ein Doppelklick auf ihren Streifen, die Tastatur auf ihrer Kopfzeile (Eingabe oder Leertaste klappen ein oder öffnen, + öffnet, - klappt ein) oder ihr von Ihrem Code gesetztes ib_collapsed
ue_delete_requested (string as_key)Entf wurde auf der ausgewählten Karte gedrückt. Die Tafel entfernt nichts: of_remove_card, sobald Ihre Anwendung zustimmt. Nie auf einer schreibgeschützten Karte oder Tafel
ue_layout_changed (string as_layout_json)Das Layout hat sich geändert: eine Spalte verschoben oder eingeklappt, durch den Benutzer oder Ihren Code, oder of_set_layout. as_layout_json ist das ganze Layout, wie of_get_layout es liefert: Speichern Sie es
ue_new_requested (string as_column, string as_title)Der Benutzer verlangt eine neue Karte in einer Spalte: ihre Schaltfläche + Karte hinzufügen, die Taste Einfg oder ein Doppelklick auf ihren leeren Teil; as_title ist der im Feld für schnelles Hinzufügen eingegebene Titel (ib_quick_add), sonst leer. Die Tafel fügt nichts hinzu: of_add_card, auf Wunsch nach Ihrem eigenen Dialog
ue_selection_changed (string as_from_key, string as_key)Die ausgewählte Karte hat sich geändert: Klick, Tastatur, Ihr Code (of_select_card, of_clear_selection), oder die ausgewählte Karte hat die Zeichnung verlassen (entfernt, ausgeblendet, eingeklappt, außerhalb der Suche: as_key ist dann leer)
ue_write_back_failed (string as_key, string as_col, string as_value, string as_reason)ib_write_back: Der DataStore hat die neue Spalte einer verschobenen Karte abgelehnt (ein Wert, den seine Spalte nicht aufnehmen kann, eine seit dem Laden gelöschte Zeile). Auch ein abgelehnter Rang (as_reason beginnt dann mit « the rank of row »). Nichts bleibt geschrieben: Was es war, wird wiederhergestellt. Die Karte hat sich nicht bewegt (der DataStore wird vor der Verschiebung geschrieben), ue_card_moved wird nicht ausgelöst und of_move_card gibt -4 zurück
ue_ready ( )Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt
ue_runtime_missing ( )Die WebView2-Runtime fehlt: die Komponente bleibt leer
ue_bg_color (long al_color)Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor)

Tastatur und Maus #


Beispiele #

Ein hartes Limit und eine Übergangsregel #

// 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

Die Spalten beim nächsten Start wiederfinden #

// 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)

Eine Karte in Ihrem Fenster öffnen #

// 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())

Eine Teamtafel: Punkte, geteilte Breite, schnelles Hinzufügen #

// 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)

Bewährte Praxis #

Vom gemeinsamen Sockel geerbt #

Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.

MitgliederRolleBeschrieben in
of_count · of_keys_at · of_hasDurchlaufen, was die Komponente enthält3.2 Die Items
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine
is_accessible_name · is_accessible_descriptionName und Beschreibung, die ein Bildschirmleser sagt3.4 Optionale Eigenschaften und Events

Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.

← Komponentenreferenz · Inhalt des Handbuchs