Przejdź do treści

HTMLPanel

Opis

Od wersji 5.4.5 serwera NEOS dostępna jest kontrolka HTML Panel, która umożliwia wyświetlanie HTML'a w kliencie WEB\'owym. Kontrolka ta nie działa pod klientem VCL (zamiast tego można użyć WEBBrowsera do wyświetlania strony). Kontrolka ta wprowadza wiele nowych możliwości. Np. można generować dowolny HTML a następnie wyświetlać go na stronie jako "ReadOnly". Ponadto można osadzać przyciski lub linki. Świetnie nadaje się do generowania podglądu plików graficznych.

Sposób użycia

Aby użyć opisywanej kontrolki wystarczy przeciągnąć ją w odpowiadające nam miejsce z dostępnych kontrolek. Następnie przechodzimy na metody gdzie dodajemy metodę na HTML Template. Generujemy w kodzie C# dowolny HTML i zwracamy jako wynik tej metody. Następnie silnik NEOS'a ustawi wygenerowany HTML w odpowiednie miejsce na naszej formie co spowoduje wyrenderowanie i wyświetlenie go.

Uwaga!

Metoda na template Panelu wykonuje się po zmianie wartości w użytych polach modelu danych lub parametrach w kodzie. Czyli analogicznie jak metody na przeliczenie / walidację.

Tak wygląda kontrolka w zasobniku

Wygląd kontorlki HTMLPanel

Kontrolka HTML Panelu nie przyjmuje innych elementów należy korzystać z metody na template lub wymienić kontrolkę na inną.

Przykłady użycia

Wyświetlenie tekstu

W celu wyświetlenia czystego tekstu lub tekstu posiadającego znaczniki HTML należy ten tekst zwrócić w wyniku metody na template. Należy zwrócić uwagę, że gramatyka template w komponentach Kendo traktuje znak "#" jako znak specjalny. Należy wszystkie jego wystąpienia poprzedzić podwójnym backslashem, aby był to znak przeznaczony do wyświetlenia. W języku C# musimy więc użyć poczwórnego backslasha.

Warto zauważyć, że w metodzie na template możemy odowoływać się do pól modelu danych lub parametrów. W przypadku zmiany zawartości tych pól i parametrów metoda na template zostanie wywołana automatycznie, a nowa wartość wynikowa zostanie przesłana do klienta WEB i odświeżona w oknie.

public string SetHtmlPanelTemplate(HtmlPanelTemplate html)
{
  return _html.ToString().Replace("#","\\\\#");    
}

Wyświetlanie grafiki

W celu wyświetlenia grafiki z repozytoruim wystarczy w metodzie na template wpisać poniższy kod:

public string SetHtmlPanelTemplate(HtmlPanelTemplate html)
{
  // S1 -> zawiera nazwę repozytorium
  // S2 -> zawiera nazwę pliku
  return html.Preview(this.S1, this.S2);
}

Jeśli przekazany plik będzie można wyświetlić bezpośrednio w przeglądarce to metoda Preview wygeneruje odpowiedni kod. W przeciwnym razie metoda zwróci pustego stringa i należy według uznania wygenerować informację dla użytkownika. Metoda wspiera następujące rozszerzenia plików: (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg", ".pdf", ".txt")

W/w przykład wygląda następująco na przykładowej tabeli:

Dokumentu google lub innej strony

W celu wyświetlenia innej strony lub np. dokumentu google należy wykorzystać komponent IFrame. Silnik NEOS wspiera generowanie takiego HTML'a. Poniższy kod prezentuje w jaki sposób można osadzić inną stronę na przykładzie dokumentów google.

public string SetHtmlPanelTemplate(HtmlPanelTemplate html)
{
  return html.Iframe("https://docs.google.com/document/d/1EOJLOG_dPyE7Gk0DrgokMgi4x9hunlLp5HAHneeJRUk/edit");
}

Generowanie przycisku / linku

Jeśli chcemy wygenerować przycisk, link, który będzie reagował na kliknięcie :) należy użyć gotowych szablonów, które udostępnia technologia NEOS. W celu dodania akcji do "dowolnego" elementu w przygotowywanym HTML'u - należy zwrócić się do DBR.

Przykład kodu generującego przycisk / link na podstawie zdefiniowanej akcji.

public string SetHtmlPanelTemplate(HtmlPanelTemplate html)
{
  return $@"<div>
{html.Button(Actions.ShowTestInfo, "REF:" + this.REF, "MI_PANEL")}
{html.Link(Actions.ShowTestInfo, "REF: "+this.REF, "MI_PANEL")}
</div>";

}

Przykład działania w/w kodu:

Przykład użycia HTML Panelu to np. okno informujące o wygaśnięciu sesji

Tak to działa :)

działanie okna wygaśnięcia sesji

Kod w HTMLPanelu

public string SetHtmlPanelTemplate(HtmlPanelTemplate html)
{
  long time = (long)_activeuntil.AsDateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
  string style = "display: flex; font-size: 24px; height: 100%; align-items: center; justify-content: center; padding-bottom: 8px; box-sizing: border-box;";
  string template = $"<div style='{style}'><span>Twoja sesja wygaśnie za <span class='countdown'></span> sekund</span></div>";
  string callback = $@"
    const endtime = new Date({time});
    const countdown = $('.countdown', this.container);
    var refresh = function() {{
      const total = endtime - new Date();
      const seconds = Math.floor(total/1000);
      countdown.text(seconds);
      if (seconds <= 0) {{
        clearInterval(timeinterval);
      }}
    }}
    const timeinterval = setInterval(refresh, 1000);
    refresh();";

  return $@"{template}#data.callback = function(){{{callback}}}#";
}