1. Katalog aplikací - řešení

    Článek: AN0002470Aktualizováno:: 30.11.2021

    V tomto článku uvádíme konkrétní nastavení a skripty pro popsané řešení.

    Nejprve se ale podíváme na schéma komunikace jednotlivých objektů řešení.

    Aplikační katalog a CMDB - komunikace ObjectGears objektů

    Webpart Skript na stránce Aplikační katalog

    Záložka Skript

    function OnPreRender()
    {
        //create instance for keeping the text
        var script = '<div class="og-apps"></div><div></div>';

        //add to page
        OGForm.AddControl(OGForm.CreateLiteralControl('lc1', script));
    }

    Záložka Styly

    Url na soubor se styly: modules/OG.AppCatalogue/app-catalogue6.css

    Záložka JavaScript

    Url na soubor s JavaScriptem: modules/OG.AppCatalogue/app-catalogue-demo2-7.js

    Výše uvedené dva soubory nakopírujeme do složky webu ./Modules/OG.AppCatalogue/

    Spouštěný skript

    V modelu, v němž jsme vytvořili stránku s Katalogem aplikací, vytvoříme objekt Spouštěný skript. Nastavíme mu kód app-cat a vlastnost Skript:

    //#block app-cat

    OGResponseContent.ContentText = GetData(OGModel);
    OGResponseContent.FileName = 'data.json';

    Spouštěný skript volá blok skriptu a přebírá od něj data ve formátu json pro zobrazení v katalogu aplikací.

    Blok skriptu

    V modelu, v němž jsme vytvořili stránku s Katalogem aplikací, vytvoříme objekt Blok skriptu. Nastavíme mu kód app-cat a vlastnost Skript:

    var cacheKey = 'og-app-cat';

    function GetData(model) {
      var showKonfPol = OG.Person.IsUserInRoleByCode('it-architect');

      var data = System.Web.HttpContext.Current.Cache.Get(cacheKey);
      var cl = model.ClassDefs['business-application'];
      var ciCl = model.ClassDefs['ci'];

      if (OG.IsNull(data)) {
        //read data
        var f = OG.DataRow.GetDataRowFilter(cl.Id);
        f['display_on_intranet'] = true;
        f.Filter_Sort = 'col' + cl.Columns['application_group'].Id + 'T, col' + cl.Columns['name'].Id;

        OG.DataRow.PrepareFilterForOptimizeRead(f);
        f.PropertiesLoad.Audit = false;
        f.PropertiesLoad.ParentShortDescription = false;

        f.PropertiesLoad.ColumnIds.Add(cl.Columns['is-module-of'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['name'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['description'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['guarantor'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['application_url'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['keyusers'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['icon'].Id);
        f.PropertiesLoad.ColumnIds.Add(cl.Columns['application_group'].Id);
        var sb = new System.Text.StringBuilder(100000);

        var drl = OG.DataRow.GetDataByFilter(f);
        if (drl != null && drl.Count > 0) {
          var sep = '"applications": [';

          for (var i = 0; i < drl.Count; ++i) {
            var dr = drl[i];
            var parentId = dr['is-module-of'] == null ? 0 : dr['is-module-of'];
            var ag = dr['application_group'] == null ? '' : dr.GetColumnDataAsString2('application_group');
            var rn = '';
            var license = '';
            var keyUsers = OG.TextUtils.ConvertEntitiesToSeparatedString(dr['keyusers'], ', ', '');
            var icon = JsonTrimText(dr['icon']);
            if (OG.IsNull(icon)) {
              icon = '';
            }

            sb.Append(sep + '{ "id":"' + dr.Id +
              '","ciId":"' + dr.RemapId(ciCl.Id) +
              '","n":"' + JsonTrimText(dr['name']) +
              '","d":"' + JsonTrimText(dr['description']) +
              '","pId":"' + parentId +
              '","ag":"' + JsonTrimText(ag) +
              '","r":"' + JsonTrimText(rn) +
              '","l":"' + JsonTrimText(license) +
              '","u":"' + JsonTrimText(keyUsers) +
              '","g":"' + JsonTrimText(dr['guarantor']) +
              '","au":"' + JsonTrimText(dr['application_url']) +
              '","i":"' + icon +
              '"'
            );

            sb.Append('}');
            sep = ',';
          }
          sb.Append(']');
        }

        data = sb.ToString();
        System.Web.HttpContext.Current.Cache.Remove(cacheKey);
        System.Web.HttpContext.Current.Cache.Add(cacheKey, data, null, OG.DateTime.Now.AddDays(7), System.Web.Caching.Cache.NoSlidingExpiration,
            System.Web.Caching.CacheItemPriority.Normal, null);
      }

      return '{"buss_app_id":"' + cl.Id + '", "showKonfPol":"' + (showKonfPol ? 'Y' : 'N') + '",' + data + '}';
    }

    function JsonTrimText(text) {
      if (OG.IsNull(text)) {
        return text;
      }

      var s = replaceAll(text, "\\", "\\\\");
      s = replaceAll(s, "{", " ");
      s = replaceAll(s, "}", " ");
      s = replaceAll(s, "\"", "'");
      s = replaceAll(s, "\n", "<br>");
      s = replaceAll(s, "\r", "");
      return s;
    }

    function replaceAll(string, search, replace) {
      return string.split(search).join(replace);
    }

    function ClearCache()
    {
      System.Web.HttpContext.Current.Cache.Remove(cacheKey);
    }

    Skript načte data z cache nebo z databáze, pokud je cache prázdná, a vrátí je ve formátu json. Blok skriptu obsahuje také funkci pro vyčištění cache, kterou volají pravidla níže.

    Pro optimalizaci velikosti přenášených dat jsme v json datech odstranili mezery a názvy zkrátili na 1-2 znaky. Tím jsme v naší implementaci snížili velikost dat ze 110kB na 80kB.

    Pravidla na třídě s aplikacemi

    Na třídě s aplikacemi si vytvoříme tři pravidla typu Skript spouštěné po vytvoření nového záznamu ve třídě, aktualizaci záznamu a po smazání záznamu. Ve všech těchto případech vyčistíme cache, aby si aplikace načetla znovu data. Skript v pravidle zavolá funkci v bloku skriptu, která vyčištění cache provede.

    //#block app-cat

    ClearCache();

×