1. Modul MultiEdit

    Article: AN0001821Updated:

    Modul obsahuje webpart pro hromadnou editaci záznamů. Pomocí jednoduchého skriptování můžete hromadně upravovat více záznamů a zrychlit tak některé operace.

     

    Pomocí skriptů předáte webpartu seznam záznamů, na které má uživatel právo a které může upravit. Webpart je zobrazí ve formě řádků, kde každé pole může změnit. Uživatel zároveň může záznam smazat nebo vytvořit nové záznamy.

    V horní části webpartu jsou zobrazeny informace o nadřazeném záznamu, pokud existuje - např. záznam faktury, kde uživatel může hromadně měnit položky faktury.

    Webpart nezajišťuje kontrolu práv. To je třeba zajistit pomocí skriptů při inicializaci. Při načtení záznamů je třeba načíst jen ty, které uživatel může editovat a při ukládání uložit jen to, co je třeba.

    Konfigurace

    Vlastnost Popis
    Povolit nové záznamy Vlastnost pro vytváření nových záznamů. Povolením může uživatel vytvořit nový záznam.
    Povolit smazání záznamů Vlastnost pro smazání záznamu. Povolením může uživatel smazat záznam.
    Skript pro inicializaci Skript se spustí při zobrazení stránky s webpartem.
    Skript pro načtení záznamů Skript se spustí pro načtení záznamů pro editaci.
    Skript pro zobrazení záznamů Skript se spustí pro každý záznam před jeho zobrazením na stránce.
    Skript pro nový záznam Skript se spustí při vytváření nového záznamu.
    Skript pro uložení záznamů Skript se spustí při uložení všech záznamů.
    Skript pro smazání záznamu Skript se spustí při mazání záznamu.

    Parametry skriptu pro inicializaci

    Ve skriptu ověřte, zda uživatel může něco editovat. Pak načtete třídu, kterou bude uživatel editovat a sloupce, které mají být ve webpartu zobrazeny.

    OGInit - objekt pro inicializaci webpartu.

    OGWebPart - instance tohoto webpartu

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jeji kód.

    Vlastnosti objektu OGInit.

    Vlastnost Popis
    bool NewAsPerson Příznak, zda pro nový záznam se má nejprve zobrazit okno pro výběr uživatele, který je v novém záznamu pak vyplněn. Při nezaškrtnutí je rovnou přidán nový záznam.
    ClassDef ClassDef Třída, jejíž záznamy má uživatel editovat.
    Query Query Dotaz, jehož zázmany může uživatel vidět.
    ColumnClassDefList Columns Seznam sloupců ze třídy, které se mají uživateli zobrazit pro editaci.
    string ErrorMessage Při zadání chybového hlášení bude uživatel přesměrován na chybovou stránku. Vlastnost použijte např. při neoprávněném přístupu uživatele na stránku.
    string LinkNavigation Text pro drobečkovou navigaci. Formát je stejný jako u metody OGForm.SetLinkNavigation.
    string BackUrl URL pro tlačítko Zpět.
    bool HorizontalScrollable Příznak, zda se data mají zobrazit v horizontálně skrolovacím panelu - nedochází tak k velkému roztažení stránky.
    void SetColumnWidth(int index, int width) Metoda nastaví pro sloupec šířku buňky.
    void SetColumnCss(int index, string css) Metoda nastaví pro sloupec CSS styl.
    void SetColumnReadOnly(int index, bool readOnly) Metoda nastaví pro sloupec příznak readonly.

    Parametry skriptu pro načtení záznamů

    Ve skriptu načtěte záznamy, které má uživatel vidět a editovat.

    OGInit - objekt z inicializace. Obsahuje třídu, pro kterou se mají záznamy načíst.

    OGWebPart - instance tohoto webpartu

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jejich kód.

    Seznam záznamů vraťte pomocí return.

    Parametry skriptu pro zobrazení záznamů

    Skript se spouští pro každý záznam, předtím než je zobrazen na stránce.

    OGRow - konfigurace pro aktuálně zobrazovaný záznam.
    OGClassDef - Třída, které záznam patří.
    OGDataRow - záznam, který se má zobrazit

    OGWebPart - instance tohoto webpartu.

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jejich kód.

    Vlastnosti objektu OGRow.

    Název Popis
    bool EnableDelete Příznak pro povolení/zakázání mazání záznamu.
    bool EnableSave Příznak pro povolení/zakázání uložení záznamu.
    ColumnMultiEdit this[string code] Funkce vrátí nastavení pro sloupec dle zadaného kódu.
    ColumnMultiEdit this[int columnId] Funkce vrátí nastavení pro sloupec dle zadaného id.

    Vlastnosti objektu ColumnMultiEdit.

    Název Popis
    ColumnClassDef Column Určení sloupce, jehož se nastavení týká.
    bool ReadOnly Příznak, zda se má sloupec zobrazit v režimu readonly.
    bool Visible Příznak, zda se má sloupec zobrazit.

    Parametry skriptu pro nový záznam

    Skript se spustí po kliknutí na tlačítko Nový.

    OGNewDataRow - dataRow pro nový záznam.
    OGActualMessage - objekt pro nastavení chybového hlášení.
    OGDataRows - seznam záznamů, které jsou již v editaci. Můžete ho použít pro kontrolu, zda uživatel může nový záznam přidat.
    OGPerson - vybraný nový uživatel.

    OGWebPart - instance tohoto webpartu.

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jejich kód.

    Při nastavení chybového hlášení pomocí metody OGActualMessage.SetError můžete zrušit přidání nového záznamu. Uživateli se tak zobrazí chybové hlášení.

     

    Pokud je v nastavení webpartu zaškrtnuta vlastnost NewAsPerson, pak je v parametru OGPerson předána osoba, kterou uživatel vybral při vytváření nového záznamu. Ve skriptu si tuto vlastnost načtěte a případně zkontroluje, zda je možné záznam s vybraným uživatelem vytvořit. Vložte jej pak dle potřeby do OGNewDataRow.

    Parametry skriptu pro uložení záznamů

    OGDataRows - seznam záznamů, které se mají uložit. Seznam obsahuje jen záznamy, které byly uživatelem změněny. Zároveň DataRow obsahuje jen sloupce, které nejsou readonly.

    OGOriginalDataRows - kolekce původních záznamů

    OGWebPart - instance tohoto webpartu.

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jejich kód.

    Vlastní uložení zajistí webpart. Vy jen proveďte kontroly, zda je vše správně zadáno. Pokud naleznete chybu, pak ve skriptu vyvolejte výjimku (OG.Throw) a ukládání bude zrušeno.

    Parametry skriptu pro smazání záznamu

    OGDataRowId - Id mazaného záznamu

    OGWebPart - instance tohoto webpartu.

    OGWebParts - seznam všech webpartů na stránce. Pro přístup k webpartům použijte jejich kód.

    Pokud při mazání ve skriptu vyvoláte vyjímku (OG.Throw), pak bude mazání zrušeno.

    Metoda SetColumn...

    Metodami SetColumn... můžete pro konkrétní sloupec nastavit určitou vlastnost. Používejte je pouze v inicializačním skriptu.

    Index pro sloupec začíná od 0 pro první sloupec.

    CSS styly nevložíte na stránku pomocí tohoto webpartu, ale můžete je vložit pomocí webpartu Skript.

    Následující skript vloží do konfigurace dotaz a přidá dva sloupce. Následně pro ně nastaví CSS styl. Nakonec zapne horizontální posun.

    var m = OG.Model.GetByCode('it');
    var q = m.Queries['task_multi_edit'];
    OGInit.Query = q;
    OGInit.Columns.Add( q.Columns['t_name']);
    OGInit.Columns.Add( q.Columns['p_name']);
     
    OGInit.SetColumnCss( 0, 'task headcol');
    OGInit.SetColumnCss( 1, 'proj');
     
    OGInit.HorizontalScrollable = true;

    Skripty na stránce

    Pomocí následujícího skriptu můžete na stránce nastavit url pro tlačítko zpět a drobečkovou navigaci. Hodnoty načtete z webpartu MultiEdit s kódem multi-edit. Tyto hodnoty jste předtím nastavili v inicializačním skriptu webpartu.

    function OnPreRender()
    {
        var m = OGWebParts['multi-edit'];

        OGForm.SetLinkNavigation( m.LinkNavigation);

        var b = OGForm.GetControl('backToolbarButton');
        b.Visible = true;
        b.NavigateUrl = m.BackUrl;
    }

    Ukázka spriptů

    Skripty jsou z modelu kapacitního plánování, kdy uživatelé mají možnost hromadně editovat plán kapacit na projektu.

    Skript pro inicializaci

    var cl = OG.ClassDef.GetByCode( 'it', 'project_year_requested_resources_monthly');
    OGInit.ClassDef = cl;
    OGInit.NewAsPerson = true;
    OGInit.Columns.Add(cl.Columns['resource']);
    OGInit.Columns.Add(cl.Columns['requested_resource_status']);
    OGInit.Columns.Add(cl.Columns['m01']);
    OGInit.Columns.Add(cl.Columns['m02']);
    OGInit.Columns.Add(cl.Columns['m03']);
    OGInit.Columns.Add(cl.Columns['m04']);
    OGInit.Columns.Add(cl.Columns['m05']);
    OGInit.Columns.Add(cl.Columns['m06']);
    OGInit.Columns.Add(cl.Columns['m07']);
    OGInit.Columns.Add(cl.Columns['m08']);
    OGInit.Columns.Add(cl.Columns['m09']);
    OGInit.Columns.Add(cl.Columns['m10']);
    OGInit.Columns.Add(cl.Columns['m11']);
    OGInit.Columns.Add(cl.Columns['m12']);

    var zpid = OG.QueryString.GetInt('drId');
    if ( zpid != null)
    {
        var clPR = OG.ClassDef.GetByCode( 'it', 'project_resources');
        var f = OG.DataRow.GetDataRowFilter( clPR.Id, zpid);
        var r = OG.ClassDef.HaveUserRightByClassDef( clPR.Id, OG.ClassDef.ClassDefRoleOperation_Update);
        if ( r == OG.ClassDef.RoleRight_RoleWithOrgStructure)
        {
            f.Filter_AplyOrgStructureForOperation = OG.ClassDef.ClassDefRoleOperation_Update;
        }
        var drl = OG.DataRow.GetDataByFilter(f);

        if ( drl != null && drl.Count == 1)
        {
            var dr = drl[0];
            var drp = dr.GetDR('project');
            var i = OGInit.Detail.CreateItem(clPR.Columns['project'].Name, drp.ShortDescription);
            i.ValueLink = drp.DetailUrl;
            OGInit.Detail.AddRow(i);

            var i1 = OGInit.Detail.CreateItem(clPR.Columns['year'].Name, dr['year']);
            var i2 = OGInit.Detail.CreateItem(clPR.Columns['amount'].Name, dr['amount']);
            OGInit.Detail.AddRow(i1, i2);

            var col = clPR.Columns['cost_type'];
            var i1 = OGInit.Detail.CreateItem(clPR.Columns['cost_type'].Name, dr.GetColumnDataAsString2( col.Id, col.ColumnType));
            var i2 = OGInit.Detail.CreateItem(clPR.Columns['accounting_amount'].Name, dr['accounting_amount']);
            OGInit.Detail.AddRow(i1, i2);

            var col = clPR.Columns['accounting_currency'];
            var i = OGInit.Detail.CreateItem(clPR.Columns['accounting_currency'].Name, dr.GetColumnDataAsString2( col.Id, col.ColumnType));
            OGInit.Detail.AddRow(i);

            OGInit.LinkNavigation = clPR.Model.Name + '|ModelInfo.aspx?Id=' + clPR.Model.Id + '>' + clPR .Name + '|' + dr.ListUrl + '>Záznam ID ' + dr.Id + '|' + dr.DetailUrl + '>Multi edit|WebContentPage.aspx' + OG.QueryString.Query;
            OGInit.BackUrl = dr.DetailUrl;
        }
        else
        {
            OGInit.ErrorMessage = 'Nemáte právo na úpravu zdrojů.';
        }
    }
    else
    {
        OGInit.ErrorMessage = 'Není zadán zdroj pro úpravu.';
    }

    Skript pro načtení záznamů

    var zpid = OG.QueryString.GetInt('drId');
    if ( zpid != null)
    {
        var col = OGInit.ClassDef.Columns['project_resources'];

        var f = OG.DataRow.GetDataRowFilter( OGInit.ClassDef.Id);
        f.Filter_OnlyActive = true;
        f.SetColumnData( col.Id, zpid);
        //seradit
        var drl = OG.DataRow.GetDataByFilter(f);

        var cl = OG.ClassDef.GetByCode( OGInit.ClassDef.Model.Id, 'requested_resource_status');
        var planStatus = OG.DataRow.GetDataRowByCode(null, cl, 'plan');
        var approvedStatus = OG.DataRow.GetDataRowByCode(null, cl, 'approved');
        var forapproveStatus = OG.DataRow.GetDataRowByCode(null, cl, 'for_approve');

        var usIds = ',';
        for( var i = 0; i < drl.Count; ++i)
        {
            var statusId = drl[i]['requested_resource_status'];
            if ( statusId == planStatus.Id || statusId == forapproveStatus.Id)
            {
                usIds += drl[i]['resource'].Id + ',';
            }
        }
        OG.SetItem('users1', usIds);

        return drl;
    }

    return null;

    Skript pro zobrazení záznamů

    OGRow['resource'].ReadOnly = true;
    OGRow['requested_resource_status'].ReadOnly = true;

    var usIds = OG.GetItem('users1');
    if ( usIds != null)
    {
       var cl = OG.ClassDef.GetByCode( OGClassDef.Model.Id, 'requested_resource_status');
       var approvedStatus = OG.DataRow.GetDataRowByCode(null, cl, 'approved');

       if ( OGDataRow['requested_resource_status'] == approvedStatus.Id && usIds.indexOf( ',' + OGDataRow['resource'].Id + ',') >= 0)
       {
          //var planStatus = OG.DataRow.GetDataRowByCode(null, cl, 'plan');
          var ro = true;   //!( OGDataRow['requested_resource_status'] == planStatus.Id);
          OGRow['m01'].ReadOnly = ro;
          OGRow['m02'].ReadOnly = ro;
          OGRow['m03'].ReadOnly = ro;
          OGRow['m04'].ReadOnly = ro;
          OGRow['m05'].ReadOnly = ro;
          OGRow['m06'].ReadOnly = ro;
          OGRow['m07'].ReadOnly = ro;
          OGRow['m08'].ReadOnly = ro;
          OGRow['m09'].ReadOnly = ro;
          OGRow['m10'].ReadOnly = ro;
          OGRow['m11'].ReadOnly = ro;
          OGRow['m12'].ReadOnly = ro;
       }
    }

    Skript pro nový záznam

    var cl1 = OG.ClassDef.GetById( OGNewDataRow.ParentId);
    var cl = OG.ClassDef.GetByCode( cl1.Model.Id, 'requested_resource_status');
    var planStatus = OG.DataRow.GetDataRowByCode(null, cl, 'plan');

    OGNewDataRow['requested_resource_status'] = planStatus .Id;
    OGNewDataRow['resource'] = OGPerson.ToPersonInfo();
    OGNewDataRow['project_resources'] = OG.QueryString.GetInt('drId');

    if ( OGPerson != null && OGDataRows != null)
    {
        for( var i = 0; i < OGDataRows.Count; ++i)
        {
            var p = OGDataRows[i]['resource'];
            if ( p != null && p.Id == OGPerson.Id)
            {
                OGActualMessage.SetError('Tento uživatel je již vybrán. Vyberte prosím jiného.');
            }
        }
    }

    Příklad vzhledu

    V horní části webpartu jsou hodnoty z nadřízeného záznamu. Vlastnosti a hodnoty se plní skriptem pro inicializaci.

    Následují tlačítka pro nový záznam a uložení všech záznamů.

    Poslední částí jsou vlastní záznamy pro editaci. V příkladu jsou první dva sloupce v režimu readonly. Editovat je možné pouze ostatní položky na řádku.

     

    Příklad konfigurace webpartu. Pro každý skript je vlastní textové pole.

×