1. Změna stavu záznamu pomocí tlačítek

    Článek: AN0001922Aktualizováno::

    Některé aplikace umožňují definovat pravidla pro změnu stavů záznamů. Věšinou se jedná o matici určující, z kterého stavu záznam může přejít do jakého a kdo tuto operaci může provést. Takového chování můžeme v ObjectGears také snadno dosáhnout.

    Naším cílem je umožnit změnu stavu pomocí tlačítek, které se uživateli nabízí v závislosti na jeho roli a na stavu záznamu. Nahradíme tím výběr záznamů v comboboxu nebo ve vyhledávacím formuláři. Uživateli tak práci zjednodušíme a zrychlíme.

    Příklad: Na níže uvedeném obrazovce vidíme záznam ve stavu Připravovaný (vpravo nahoře) a na spodním toolbaru se uživateli nabízí dvě tlačítka: Zrušit a Poslat.

    Toho dosáhneme v několika krocích:

    1. Rozmyslíme se, jakých stavů může naše entita nabývat a jaká je logika přechodů mezi stavy
    2. Vytvoříme třídu s evidencí stavů
    3. Vytvoříme sloupec Stav odkazující na třídu stavů
    4. Vytvoříme třídu povolených přechodů mezi stavy
    5. Vytvoříme tlačítka pro změnu stavů
    6. Na třídě s daty nastavíme sloupec Stav jen ke čtení

    Přehled stavů a logika přechodů mezi nimi

     

    Třída s evidencí stavů

    Jednotlivé stavy můžeme evidovat ve zvláštní třídě. Pokud však chceme vytvářet více entit s různými stavy (např. požadavky, objednávky, příjmy, faktury atd.), můžeme použít také jednu třídu pro všechny stavy a záznamy odlišit kódem související třídy.

     Definice sloupců ve třídě.

    Sloupec Stav odkazující na třídu stavů

     Ve sloupci Stav v nastavení Filtru na záložce Reference stanovíme, aby se nabízely pouze hodnoty pro naši třídu.

    Třída povolených přechodů mezi stavy

     Povolené přechody mezi stavy zajistíme třídou, která se ve dvou sloupcích bude odkazovat na třídu Stav. Pro každý Stav můžeme mít několik záznamů lišících se Dalším stavem. Každý záznam také může obsahovat Kód tlačítka (viz níže), které se má zobrazit.

     Definice sloupců ve třídě.

    Tlačítka pro změnu stavů

    Na třídě si vytvoříme tlačítka typu Skript (zobrazovaná při změně záznamu) pro změnu stavů a dáme jim kódy uvedené v třídě pro změnu stavů (viz výše).

    Ke každému tlačítku nastavíme role, podle toho, kdo je oprávněn danou operaci provést. Dále musíme zajistit, aby se pro daný stav zobrazila jen ta tlačítka, která záznam posunou do dalších povolených stavů. To zajistí skript pro detail záznamu definovaný ve třídě.

    function OnPreRender()
    {
      if ( OGDataRowId != null)
      {
        //skrýt tlačítka kromě těch uvedených pro daný stav v tabulce status_flow
        //načíst záznamy z "Přechod stavů - status_flow"
        var f = OG.DataRow.GetDataRowFilter(OGModel.ClassDefs['status_flow'].Id);
        f['active'] = true;
        f['status'] = status[0].Id;
        f.Filter_OnlyActive = true;
        var drl = OG.DataRow.GetDataByFilter(f);

        //zakázat tlacitka
        OGControlOperations['cancel'].Visible = false;
        OGControlOperations['submit'].Visible = false;
        OGControlOperations['withdraw'].Visible = false;
        OGControlOperations['reject'].Visible = false;
        OGControlOperations['create_po'].Visible = false;
        OGControlOperations['confirm_receipt'].Visible = false;

        //povolit dle stavu
        if ( drl != null && drl.Count > 0)
        {
          for( var i = 0; i < drl.Count; ++i)
          {
            var co = OGControlOperations[drl[i]['control']];
            if ( co != null)
            {
             co.Visible = true;
            }
          }
        }
      }
    }

     Vlastní změnu Stavu provede skript definovaný v tlačítku.

    Příklad: Tlačítko Poslat

    /*Změnit stav požadavku na 'submitted' a uložit záznam*/

    var clStatus = OGModel.ClassDefs['status'];
    var f = OG.DataRow.GetDataRowFilter(clStatus.Id);
    f['code'] = 'submitted';
    f['related_class_code'] = '"' + OGDataParent.Code + '"';

    var drl = OG.DataRow.GetDataByFilter(f);
    if ( drl.Count == 1)
    {
        var ht = OG.CreateHashtable();
        ht['status'] = drl[0].Id;

        OGDataDetailForm.Save(false, ht);
    }

    Poznámka: Ve výše uvedeném skriptu používáme příkaz f['related_class_code'] = '"' + OGDataParent.Code + '"';. Kód třídy, podle kterého se filtruje, vkládáme do uvozovek, aby byla hledána přesná shoda. Jinak by byl použit operátor LIKE a mohly by být vráceny i záznamy s podobným kódem třídy. Viz objekt DataRowFilter a filtrování textů.

    Sloupec Stav jen ke čtení

    U sloupce Stav musíme v jeho definici povolit editaci při změně záznamu, protože stavy se budou měnit tlačítky. Zakážeme však jeho editaci uživatelem v ovládacím prvku, tak aby uživatel mohl použít jen tlačítko. K tomu nám poslouží skript pro detail záznamu definovaný na třídě.

    function OnAfterLoadColumns()
    {
      OGColumns['status'].ReadOnly = true;
    }

×