# Vrh.Web.Common.Lib
Általános célú ASP.NET MVC fejlesztéssel kapcsolatos 
és fordításra kerülő összetevők gyűjteménye.

> Fejlesztve és tesztelve **4.5** .NET framework alatt. 
> Teljes funkcionalitás és hatékonyság kihasználásához szükséges legalacsonyabb framework verzió: **4.5**

> #TODO: Véglegesítendő a komponens dokumentációja!!!

## Főbb összetevők
* **[BaseController osztály](##BaseController-osztaly)**: MVC-s kontroller alaposztály, hasznos és nélkülözhetetlen szolgáltatásokkal.

 > * [ParameterSeparating metódus](###ParameterSeparating-metodus): MVC-s akciók Request.QueryString-jének szétválasztása a kért és egyéb paraméterekre.

* **CookieWebClient**: MVC-s WebClient osztály kiterjesztése, mely a Cookie-kat is kezeli.
* **[WebCommon](##WebCommon-osztaly)**: Egy statikus osztály hasznos segédeszközökkel.
* **[DataTables támogatás](##DataTables-tamogatas)**: DataTables-et támogató osztályok, eszközök.
* **[Redis támogatás](##Redis-tamogatas)**: Redis műveleteket támogató eszközök. Egyelőre csak a RedisConnection osztály.

***
## BaseController osztály
MVC-s alkalmázokhoz használható kontroller alaposztály, hasznos és nélkülözhetetlen szolgáltatásokkal. Főbb szolgáltatások:
- Dispose megvalósítása
- DataTable-hez kapcsolódó hasznos szolgáltatások
- ThrEx: Egy nyelvi fordítóval kiegészített ApplicationException-t dobó metódus.
- Mlmgt: MultiLanguageManager.GetTranslation meghívása a ForcedLanguageCode nyelvi kóddal.

Használati minta:
```javascript
public class XXXXController : BaseController
```
Ahol XXXX az általunk készítendő controller neve.

### Állandók
Alábbi értékek eléréséhez egy minta az általunk készített kontrollerben:
```MODELSTATE``` vagy ```BaseController.MODELSTATE```.

Állandó|Típus|Érték|Leírás
:----|:----|:----
MODELSTATE|```string```|ModelState|A TempData szótár ModelState kulcsának megnevezése. 

### Tulajdonságok
Név|Hatáskör|Leírás
:----|:----
BaseFolder|```protected```|Az alkalmazás alap mappája, ez alatt van az App_Data mappa. A HttpContext.Server.MapPath("~") hívás értéke.
BaseDateFormat|```public```|A megjelenítéskor és szűréskor használatos dátum formátum. Alapértelmezett értéke: Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern
ForcedLanguageCode|```protected```|A ThrEx és az Mlmgt protected metódusok ezzel az értékkel hívják a MultiLanguageManager.GetTranslation-t, azért hogy az ne kérdezze le állandóan a RelevantLanguageCode-t. A BaseController példányosítása során az alapértelmezett értéke: MultiLanguageManager.RelevantLanguageCode. Ha ettől eltérő nyelvet szeretnénk használni, akkor a példányosítás után át kell állítani.
RequestedParameters|```protected```|Azoknak a paramétereknek a gyűjteménye, melyeket megjelöltünk a példányosításkor. Ha nem jelölünk meg ilyen paramétert vagy üres az átadott típus, akkor NULL marad. Értékét a  [ParameterSeparating metódus](###ParameterSeparating-metodus) álltja be.
OtherParameters|```protected```|Azoknak a paramétereknek a gyűjteménye, melyeket nem jelöltünk meg a példányosításkor. Ha nincs feldolgozandó gyűjtemény vagy üres, akkor NULL marad. Értékét a  [ParameterSeparating metódus](###ParameterSeparating-metodus) álltja be.

### ParameterSeparating metódus
Az MVC-s akciók Request.QueryString és Request.Form tulajdonségénak szétválasztása a kért (elvárt) és egyéb paraméterekre.
A megadott tulajdonságokban szereplő paramétereket két részre osztja. Egy RequestedParameters és egy 
OtherParameters szótárra. Hogy mi kerüljön a RequestedParameters szótárba azt egy statikus
osztályban kell beállítani, melynek segítségével aztán hivatkozhatunk a szótár elemeire.
Az összes túlterhelés:
```javascript
void ParameterSeparating(Type requestedParametersType, bool isAddUserName = true, bool ignoreCase = true)
void ParameterSeparating(SeparatingSource source, Type requestedParametersType, bool isAddUserName = true, bool ignoreCase = true)
void ParameterSeparating(NameValueCollection collection, Type requestedParametersType, bool isAddUserName = true, bool ignoreCase = true)
void ParameterSeparating(string[][] paramlist, Type requestedParametersType, bool isAddUserName = true, bool ignoreCase = true)
```

Paraméter|Leírás
:----|:----
requestedParametersType|Az elvárt paramétereket tartalmazó osztály.
isAddUserName|Hozzáadja-e automatikusan az ```OtherParameters``` szótárhoz az aktuális felhasználó nevét (User.Identity.Name) a ```SystemVariableNames.UserName``` kulccsal. Alapértelmezett értéke: true.
ignoreCase|Betű méret figyelmen kívül hagyása az összehasonlítás során. Alapértelmezett értéke: true.
source|Egy ```SeparatingSource``` enum érték, mely a szeparáció forrását és sorrendjét határozza meg.
collection|Egy ```NameValueCollection``` típus, amelynek az elemeit kell szétválogatni.
paramlist|Egy ```string[][]``` típus, amelynek az elemeit kell szétválogatni.

#### A kért (elvárt) paramétereket tartalmazó osztály
Az alábbi minta a Vrh.Web.FileManager Index akciójának lehetséges paraméterei:
```javascript
/// <summary>
/// Az akciók által átvehető url paraméterek nevei.
/// </summary>
public static class QParams
{
    /// <summary>
    /// XmlParser kapcsolati sztring (connection string).
    /// </summary>
    public const string Xml = "xml";

    /// <summary>
    /// A FileManager definíció azonosítója, amely alapján a keresés és megjelenítés megtörténik.
    /// </summary>
    public const string Id = "id";

    /// <summary>
    /// A hívó által kért nyelv kódja, ha üres, akkor a releváns nyelvi kód lesz.
    /// </summary>
    public const string LCID = "lcid";

    /// <summary>
    /// A definícióban megadott gyökér mappa alatti mappa útvonal.
    /// </summary>
    public const string Folder = "folder";

    /// <summary>
    /// A definícióban megadott gyökér mappa alatti mappa útvonal.
    /// </summary>
    public const string File = "filename";
}
```

#### Felhasználási minták
A ```base.ParameterSeparating``` metódus létrehozza és feltölti a
```base.RequestedParameters``` szótárat, melynek pont annyi eleme van,
ahány mezője a ```QParams``` statikus osztálynak, és a szótárban a kulcsok 
megegyeznek az osztály tulajdonságainak értékével. A szótárban az értékek az 
ugyanolyan nevű URL paraméterekben érkezett értéket kapják.
```javascript
public ActionResult Index()
{
    base.ParameterSeparating(typeof(QParams));

    if (String.IsNullOrWhiteSpace(base.RequestedParameters[QParams.LCID]))
    {   // A ForcedLanguageCode a BaseController konstruktorában megkapja a MultiLanguageManager.RelevantLanguageCode-ot
        base.RequestedParameters[QParams.LCID] = base.ForcedLanguageCode;
    }
    else
    {
        base.ForcedLanguageCode = base.RequestedParameters[QParams.LCID];
    }
    if (String.IsNullOrWhiteSpace(base.RequestedParameters[QParams.Folder]))
    {
        base.RequestedParameters[QParams.Folder] = WebCommon.SIGN_BACKSLASH;
    }
    return View(ACTION_INDEX, model);
}
```

Amennyiben nem az alapértelmezett ```Request.QueryString``` ```NameValueCollection```-t
kell feldolgozni, akkor létezik olyan túlterhelése a metódusnak, amelyben megadható a 
feldolgozandó ```NameValueCollection```. Példaként egy POST metódust van itt,
melyben a ```Request.Form``` kollekciót kell feldolgozni:
```javascript
[HttpPost]
public ActionResult SetValami()
{
    base.ParameterSeparating(Request.Form,typeof(QParams));
}
```

Létezik egy olyan túlterhelés is, melyben mind a ```Request.QueryString``` és a ```Request.Form```
feldolgozása is megtörténik. Ebben az esetben az első paraméter az, amelyik meghatározza a szeparáció forrását és sorrendjét.
```javascript
/// <summary>
/// ParameterSeparating metódus gyűjtemény nélküli túlterhelésében
/// a szeparáció forrását és sorrendjét határozza meg.
/// </summary>
protected enum SeparatingSource
{
    /// <summary>
    /// A szeparációban csak a Request.QueryString vesz részt. 
    /// Ez az alapértelmezés.
    /// </summary>
    OnlyQueryString,

    /// <summary>
    /// A szeparációban csak a Request.Form vesz részt. 
    /// </summary>
    OnlyForm,

    /// <summary>
    /// A szeparációban elsőként Request.QueryString, majd
    /// a Request.Form feldolgozása történik meg. 
    /// </summary>
    FirstQueryString,

    /// <summary>
    /// A szeparációban elsőként Request.Form, majd
    /// a Request.QueryString feldolgozása történik meg. 
    FirstForm,
}
```

A hívási minta:
```javascript
[HttpPost]
public ActionResult SetValami()
{
    base.ParameterSeparating(SeparatingSource.FirstForm,typeof(QParams));
}
```
A fenti mintában elsőként a ```Request.Form``` szeparálása történik meg, majd a 
```Request.QueryString``` feldolgozása. A későbben elvégzett szeparáció során a

már a szótárakban létező elemek felülíródhatnak, ha ugyanolyan nevű paramétert talál.

***
## WebCommon osztály
Egy statikus osztály hasznos segédeszközökkel.

### Állandók
Alábbi értékek eléréséhez egy minta: ```Vrh.Web.Common.Lib.WebCommon.HTML_NEWLINE```.

Állandó|Értéke|Leírás
:----|:----|:----
HTML_NEWLINE|```<br />```|A html-ben használatos új sor karaktersorozat.
SIGN_RELATIVE|```~```|A relatív hivatkozás jele az útvonalakban.
SIGN_SLASH|```/```|A "/" jel állandója.
SIGN_BACKSLASH|```\```|A "\" jel állandója.

#### EditModeLetters osztály alatti állandók
Szerkesztési mód betűjelek lehetséges értékei.
Alábbi értékek eléréséhez egy minta: ```Vrh.Web.Common.Lib.WebCommon.EditModes.SELECT```.

Állandó|Értéke|Leírás
:----|:----|:----
SELECT|```s```|A csak lekédezést lehetővé tévő szerkesztési mód betű jele.
ADD|```a```|Létrehozás és módosítást engedő szerkesztési mód betű jele.
DELETE|```d```|A fentiek mellett a törlést is engedő szerkesztési mód betű jele.
MANAGE|```m```|Általános kezelést engedő szerkesztési mód betű jele.

És létezik egy metódus is, amely visszaadja az értékeket egy stringben vesszővel elválasztva.
All() = "s,a,d,m"

### Tulajdonságok
Név|Leírás
:----|:----
Layout|Az alkalmazás számára érvényes általános layout. Alapértelmezés: "~/Views/Shared/_Layout.cshtml"
DefaultViewMode|ViewMode alapértelmezett értéke. Futás közen módosítható. Alapértelmezés: ```ViewModes.Desktop```

### Metódusok

#### Base10ToBase
Egy decimális számot átalakít a megadott számrendszer szerinti számra,
amelyet string formában ad vissza. A számrendszer 2 és 36 között lehet, beleértve a határokat is.
Visszatérő értéke a megadott számrendszerbeli szám egy stringben.

```javascript
static string Base10ToBase(long decNumber, int radix = 36)
```

Paraméter|Leírás
:----|:----
decNumber|A konvertálandó decimális szám.
radix|A számrendszer alapja. Alapértelmezés: 36.

#### ErrorListBuilder
Egy kivételből összeszedi a keletkezett InnerException-öket, és abból egy listát képez.
A DbEntityValidationException-t, és a Data dictionary-t is kifejti.

```javascript
static List<string> ErrorListBuilder(Exception ex, string innerExceptionLabel = null)
```

Paraméter|Leírás
:----|:----
ex|Exception, melyet ki kell fejteni.
innerExceptionLabel|InnerException üzenet kiírásakor ezzel vezeti be az üzenetet. Alapértelmezés: "Inner exception: ".

#### RealPath
Ha a megadott fájl név relatív útvonal, akkor elé illeszti az első paraméterben megadott 
mappát, ami a relatív hivatkozás feloldása. Ha fájlnév relatív, akkor az összefűzött útvonal,
ha nem relatív, akkor maga a fájl név a visszatérő érték. Csak útvonal sztring műveletek,
nem ellenőriz létezést vagy érvényességet.

```javascript
string RealPath(string appPath, string fileName)
```

Paraméter|Leírás
:----|:----
appPath|A relatív értéket feloldó fizikai mappa.
fileName|A relatív (vagy teljes) fájlnév.

#### SqlLikeToRegex
SQL like mintát fordít át egy reguláris kifejezés mintájává.

```javascript
string SqlLikeToRegex(string like)
```

Paraméter|Leírás
:----|:----
like|A relatív értéket feloldó fizikai mappa.

#### ViewModeParser
A ViewMode beállítása egy megadott string alapján.

```javascript
static ViewModes ViewModeParser(string viewMode, bool isThrowException = false)
```

Paraméter|Leírás
:----|:----
viewMode|A view mode sztring értéke. Ha null vagy üres, akkor az ApplicationCookie.DefaultViewMode lesz beállítva.
isThrowException|Ha igaz, akkor rossz érték esetén hibát dob, egyébként a DefaultViewMode-dal tér vissza.

***
## DataTables támogatás
### DataTables statikus osztály
Egyelőre egy statikus osztályt tartalmaz, ami konstansokat tartalmaz a DataTables rendezésének
segítéséhez.
```javascript
/// <summary>
/// A DataTables működését támogató statikus osztály,
/// mely hasznos tagokat és metódusokat tartalmaz a 
/// szerver oldali működés támogatására.
/// </summary>
public static class DataTables
{
    /// <summary>
    /// A DataTables támogatásában hasznos állandók gyűjtőhelye.
    /// </summary>
    public static class Constants
    {
        /// <summary>
        /// Növekvő rendezés jelzése a DataTables-ben.
        /// </summary>
        public const string ORDER_ASC = "asc";

        /// <summary>
        /// Csökkenő rendezés jelzése a DataTables-ben.
        /// </summary>
        public const string ORDER_DESC = "desc";
    }
}
```
### DataTablesIn osztály
```javascript
/// <summary>
/// Egy osztály, amely a dataTables plugin által küldött
/// paramétereket tartalmazza. (Json class sent from dataTables)
/// </summary>
public class DataTablesIn
{
    /// <summary>
    /// Rajz számláló. 
    /// Annak biztosítására, hogy az ajax aszinkronitása ellenére is
    /// a kirajzolás megfelelő sorrendben történjen.
    /// </summary>
    public int Draw { get; set; }

    /// <summary>
    /// A kirajzolt első rekord indexe.
    /// </summary>
    public int Start { get; set; }

    /// <summary>
    /// A rekordok száma, amit a tábla megjelenít.
    /// </summary>
    public int Length { get; set; }

    /// <summary>
    /// Az oszlopok listája.
    /// </summary>
    public List<DTColumn> Columns { get; set; }

    /// <summary>
    /// A teljes táblázatra érvényes kereső objektum.
    /// </summary>
    public DTSearch Search { get; set; }

    /// <summary>
    /// A rendezettség listája. (Több oszlopot is tartalmazhat a rendezés.)
    /// </summary>
    public List<DTOrder> Order { get; set; }

    #region DTColumn class
    /// <summary>
    /// Egy oszlopot leíró osztály.
    /// </summary>
    public class DTColumn
    {
        /// <summary>
        /// Az oszlop tartalma.
        /// </summary>
        public string Data { get; set; }

        /// <summary>
        /// Az oszlop neve (azonosítója).
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// Az oszlop kereshető-e.
        /// </summary>
        public bool Searchable { get; set; }

        /// <summary>
        /// Az oszlop rendezése engedélyezve van-e.
        /// </summary>
        public bool Orderable { get; set; }

        /// <summary>
        /// Az oszlopra vonatkozó kereső objektum.
        /// </summary>
        public DTSearch Search { get; set; }
    }
    #endregion DTColumn class

    #region DTSearch class
    /// <summary>
    /// Egy keresést leíró osztály.
    /// </summary>
    public class DTSearch
    {
        /// <summary>
        /// Egy string kereső érték.
        /// </summary>
        public string Value { get; set; }

        /// <summary>
        /// Igaz, ha a kereső érték egy reguláris kifejezés.
        /// </summary>
        public bool Regex { get; set; }
    }
    #endregion DTSearch class

    #region DTOrder class
    /// <summary>
    /// Egy rendezést leíró osztály.
    /// </summary>
    public class DTOrder
    {
        /// <summary>
        /// Melyik indexű oszlop tartozik a rendezésbe. 
        /// </summary>
        public int Column { get; set; }

        /// <summary>
        /// A rendezettség iránya. 
        /// </summary>
        public string Dir { get; set; }
    }
    #endregion DTOrder class
}
```
***
## Redis támogatás
### RedisConnection osztály
Ha egy Redis adatszolgáltatót kell elérni, akkor a kiszolgálót és a használni kívánt pool-t is
meg kell adni. Ezt egy redis kapcsolati sztringben kell megadni. 
Az osztály egy példánya létrehozható úgy is, ha egy ilyen kapcsolati sztringet adunk meg a
konstruktorban. A konstruktor elvégzi a kapcsolati sztring feldolgozását és ellenőrzését, majd
az értékeket elhelyezi a megfelelő tulajdonságokba:
```javascript
string connectionString = "server:192.168.77.50;pool=ALM;port=6739;";
RedisConnection redisConnection = new RedisConnection(connectionString);
```
Tulajdonság|Típus|Leírás
:----|:----|:----
Server|```string```|Redis server neve vagy IP címe.
Pool|```string```|Redis instance neve.
Port|```int```|Redis portszáma. Alapértelmezés 0.
A konstruktor pontos definíciója:
```javascript
/// <summary>
/// A megadott kapcsolati string feldolgozásával áll elő egy redis kapcsolati példány.
/// </summary>
/// <param name="redisConnectionString">A Redis kapcsolati sztringje.</param>
/// <param name="isRequired">
/// Ha igaz, és <paramref name="redisConnectionString"/> null vagy üres, 
/// akkor hibát dob. Egyébként a példány létrejön üres értékekkel.
/// </param>
/// <exception cref="ArgumentNullException">
/// Ha null vagy üres a <paramref name="redisConnectionString"/> és 
/// <paramref name="isRequired"/> igaz.
/// </exception>
/// <exception cref="ApplicationException">Ha a sztring egyéb ok miatt nem helyes.</exception> 
public RedisConnection(string redisConnectionString, bool isRequired = true)
```


***
### Version History:
#### 2.20.2 (2023.10.13) Patches:
- DataTables.Filter metódus javítása. A nullozható dátumokra is jól működik, nme csak az oszlop szűrésnél, hanem a tábla szűrésnél is.

#### 2.20.1 (2023.09.19) Patches:
- WebCommon.ErrorListBuilder mostantól saját kódot használ, nem a VRH.Common.ErrorListBuilder-ét. A VRH.Common.EF.ErrorListBuilder kód tartalmát használja, ami meg valamiért nem elérhető.

#### 2.20.0 (2023.09.07) Compatible changes:
- DataTablesIn.DTColumn osztály kibővült egy OrderField nevű tulajdonsággal.
- DataTables.Order metódus módosítása, hogy ha ki van töltve az OrderField, akkor a rendezés arra történik. 

#### 2.19.5 (2023.08.10) Patches:
- DataTables.Filter metódus módosítása. Nullozható enumokra is helyesen működik.

#### 2.19.4 (2023.07.18) Patches:
- DataTables.Filter metódus módosítása. Most már Guid típusú mező szűrésekor is helyesen működik.

#### 2.19.3 (2023.06.05) Patches:
- DataTables.Filter metódus módosítása. Enum összehasonlításkor volt típus konfliktus.

#### 2.19.2 (2023.03.17) Patches:
- BaseController.ForcedLanguageCode mostantól csak a MultiLanguageManager.ActiveLanguageCodes
lista egy elemét fogadja el beállításként, egyébként nem változik az értéke.

#### 2.19.1 (2023.03.03) Patches:
- DataTables.Filter metódus módosítása. Mostantól a nullozható értéktípusok esetében is működik a szűrés.

#### 2.19.0 CompatibleChange (nuget)
- Áttérés a VRH.Common 3.0 változatára

#### 2.18.1-2 Patches:
- Az új Mlmgt metódusok megszüntetése. "params object[]" paraméter esetén, nem jók ezek a túlterhelések. A korábbi működéssel nem volt kompatibilis. A BaseController.ForcedLanguageCode beállításával el lehet érni a kívánt fordítást.

#### 2.18.1 Patches:
- Az új Mlmgt metódusok megszüntetése. "params object[]" paraméter esetén, nem jók ezek a túlterhelések. 
A korábbi működéssel nem volt kompatibilis. A BaseController.ForcedLanguageCode beállításával el lehet érni a kívánt fordítást.

#### 2.18.0 (2022.10.26) Compatible changes:
- DataTables.FilterTable és DataTables.FilterColumn navigációs tulajdonságok esestében
is elvégzik a keresést.
- DataTablesIn.DTColumn osztály kibővült egy SearchField nevű tulajdonsággal.
- DataTables.Constants osztályra való hivatkozás mostantól fordítási hibát fog eredményezni.
Már legalább 2 éve "Obsolete".  
- Frissítés a VRH.Common 2.25.0 változatára.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.21.2 változatára.
- Frissítés a Vrh.XmlProcessing 1.30.3 változatára.
 
#### 2.17.0 Compatible change (2022.10.24 nuget):
- BaseController-ből a nemrég betett Log4ProCheckUser metódusok és összes vonzatuk törlése (és áthelyezésük a WebTools modulba)
#### 2.16.0 Compatible change (2022.10.21 nuget):
- új AddModelError metódusok hozzáadása
#### 2.15.0 Compatible change (2022.10.20 nuget):
- új Mlmgt metódusok hozzáadásaModel
#### 2.14.0 Compatible change (2022.10.20 nuget):
- ModelErrorMessageListBuilder hozzáadása
#### 2.13.1-2 Patches:
#### 2.13.0 Compatible change (2022.10.20 nuget):
- BaseController funkcionális bővítése Log4ProCheckUser metódussal, a RunningControllerName és RunningActionName mezőkkel

#### 2.12.2 (2022.10.10) Patches:
- PagedList nuget csomag eltávolítása a projektből.
- VRH.Web.Providers csomag eltávolítása a projektből.
- Microsoft.AspNet.Providers csomag eltávolítása a projektből.
- Microsoft.AspNet.Providers.Core csomag eltávolítása a projektből.

#### 2.12.1 (2022.10.07) Patches:
- Vrh.Membership nuget csomag eltávolítása a projektből.
- Target framework mostantól 4.5.1. !!Ha "Target framework" megváltozik, akkor azért azt legalább jelezni kéne a history-ban!!  

#### 2.12.0 Compatible change (2022.10.05 nuget):
- 2.11.0 módosítások visszavonása; 2.11 nuget csomag törlésre került a nuget szerverről

#### 2.11.0 Compatible change (2022.10.04 nuget):
- BaseController/Log4ProCheckUser metódusok beillesztése

#### 2.10.2 (2022.09.14) Patches:
- DataTables.FilterColumn() metódus mostantól nem dob hibát, ha Boolean mezők szűrését
kell elvégeznie. Nem volt megvalósítva.
- Frissítés a Microsoft.AspNet.Mvc 5.2.9 változatára.
- Frissítés a Microsoft.Web.Infrastructure 2.0.0 változatára.
- Frissítés a VRH.Common 2.23.1 változatára.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.20.2 változatára.
- Frissítés a Vrh.XmlProcessing 1.30.2 változatára.

#### 2.10.1 (2022.08.19) Patches:
- DataTables.Filter() és DataTables.FilterTable() metódus NULL érték lekezelése.
- DataTables.Response() nem jól adta vissza a recordsTotal értéket.

#### 2.10.0 (2021.09.12) Compatible change:
- HtmlHelper megoldások átkerültek a VRH.Log4Pro.WebTools projektbe.

#### 2.9.0 (2021.08.29) Compatible change:
- Frissítés a Vrh.XmlProcessing 1.29.0 változatára, a ResponseTargets enum áthelyezése miatt.
- Frissítés a Newtonsoft.Json 13.0.1 változatára.

#### 2.8.0 (2021.07.22) Compatible change:
- WebCommon.LayoutNoMenu konstans bevezetése, amely egy minimalizált, praktikusan egy menü nélküli layout elérési útját tartalmazza

#### 2.7.1 (2021.03.11) Patch Extension:
- VrhHtmlHelper-ben a common actions kezelő egység a html.action link-et nem jól állította össze

#### 2.7.0 (2021.02.17) Compatible Extension:
- RefreshButtons osztály hozzáadása a VrhHtmlHelper eszközök közé

#### 2.6.3 (2021.02.15) Patches:
- A BaseController.ParameterSeparating javítása, hogy a paraméter osztály mezőit akkor is megtalálja, ha azok származtatott osztályokon keresztül épülnek fel.

#### 2.6.2 (2021.02.10) Compatible changes:
- VrhHtmlHelper.ActionPanel és VrhHtmlHelper.HelpPanel osztályok és egyéb kiegészítő helperek hozzáadása

#### 2.6.1 (2021.01.26) Patches:
- Verzió beállítása merge után.

#### 2.6.0 (2021.01.24) Compatible changes:
- Belekerült a BaseController-be a SetMLMCookie metódus, mely beállítja a controller session-re érvényes nyelvi cookie-t.
- ActionButtonPanel osztály és HtmlHelper hozzáadása

#### 2.5.8 (2021.01.20) Patches:
- Frissítés a VRH.Common 2.20.1 változatára.
- Frissítés a Vrh.XmlProcessing 1.24.0 változatára.

#### 2.5.7 (2020.11.24) Patches:
- Frissítés a Vrh.XmlProcessing 1.19.1 változatára.

#### 2.5.7 (2020.11.12) Patches:
- Frissítés a VRH.Common 2.19.0 változatára.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.17.6 változatára.
- Frissítés a Vrh.XmlProcessing 1.18.5 változatára.

#### 2.5.6 (2020.03.28) Patches:
- NuGet csomag módosítása úgy, hogy a modul ReadMe.md "Build Action" tulajdonsága "None" legyen a telepítés után. Install.ps1 hozzáadása.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.10.1 változatára.

#### 2.5.5 (2020.03.26) Patches:
- Frissítés a VRH.Common 2.13.1 változatára.
- XML dokumentáció pontosítása.
- Frissítés az MSTest.TestAdapter 2.1.0 változatára. (Ez csak a Test projektet érinti!)
- Frissítés az MSTest.TestFramework 2.1.0 változatára. (Ez csak a Test projektet érinti!)

#### 2.5.3-4 (2020.03.19) Patches:
- WebCommon néhány metódusa és állandója átkerült a VRH.Common-ba. WebCommon osztály hívásai nem változtak, a VRH.Common-ba hívnak bele.
- CookieWebClient osztály is átkerült a VRH.Common-ba.

#### 2.5.2 (2020.03.06) Patches:
- A DataTables.Response metódus 1. túlterhelése: Ha IQueryable az átadott lekérdezés, akkor elvégzi előbb rajta a szűrést és rendezést, és utána adja vissza a választ.
- A DataTables.Response metódus 2. túlterhelése: Ha IOrderedQueryable az átadott lekérdezés, akkor csak a választ adja vissza.
- A DataTables.Order metódusban az összefűzött (több oszlopra vonatkozó) rendezésben lévő hiba javítása.

#### 2.5.1 (2020.03.03) Patches:
- A DataTables.FilterTable metódus második paramétere DataTablesIn típusra változott. Csak a táblázatban kereshetőnek jelölt oszlopokot veszi figyelembe a tábla szintű szűrésnél.

#### 2.5.0 (2020.02.22) Compatible changes:
- Új DataTables.FilterTable metódus, mely megvalósít egy tábla szintű szűrést (a teljes oszlopkészleten tartalmazás vizsgálattal).
- Új DataTables.FilterColumn metódus, mely megvalósít egy oszlop szintű szűrést.
- Új DatTables.Filter metódus, mely végrehajtja a FilterTable metódust, és az összes oszlopra a FilterColumn metódust.
- Dátum szűréskor, ha használjuk a vezérlő karaktereket, és mögöttük érvényes integer szám van, azt évszámnak (ÉÉÉÉ) tekinti e verziótól. "Before" esetén ÉÉÉÉ.01.01 00:00:00, "After" esetén ÉÉÉÉ.12.31 23:59:59 értéket képez az összehasonlításhoz. A "Between"-ben értelemszerűen a bal oldalon az előbbi, a jobb oldalon az utóbbi érték képződik.
- A korábbi szűrésre vonatkozó megoldások megmaradtak a BaseController-ben, de hamarosan Obsolete jelölést kapnak.
- Új DataTables.Order metódus, mely végrehajtja az igényelt rendezéseket.
- Új DataTables.Response metódus, mely végrehajtja a szűrést, a rendezést, és előállítja a jquery.datatables számára szükséges választ.
- WebCommon kibővült egy ```bool IsNumericType(Type)``` metódussal. Igazzal tér vissza, ha a típus numerikus.
- Az objektum osztálynak is lett egy új bővítése. Pl. int a= 1; a.IsNumericType() igazzal jelzi, ha numerikus.
- Frissítés a VRH.Common 2.12.1 változatára.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.10.0 változatára.
- Frissítés a Vrh.XmlProcessing 1.17.0 változatára.


#### 2.4.1 (2020.01.27) Patches - release:
- A HtmlHelperExtensions osztály névtere helytelen volt, javítás után a névtér helyesen: "Vrh.Web.Common.Lib".
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.9.2 változatára.
- Frissítés a Vrh.XmlProcessing 1.15.2 változatára.

#### 2.4.0 (2019.09.28) Compatible changes - release:
- A BaseController automatikusan előállít egy ViewBag.ValidationSummaryMessage tulajdonságot üres sztring értékkel.
A BaseController az OnActionExecuted eseményben a ModelState objektumból feltölti ebbe a változóba az üres sztring ("") kulcsú üzeneteket.
A cshtml-ben egy egyszerű "vrhct.bootbox.alert('@ViewBag.ValidationSummaryMessage');" javascript sorral megoldhatjuk az üzenet kiírását.
A "ValidationExtension" osztály megmaradt, továbbra is használható, de ez az új megoldás sokkal kisebb erőforrással elvégzi ugyanazt,
mint az egész "ValidationExtension" osztály és a "ValidationSummary.cshtml" partial együttvéve.
- A BaseController "DataTableSelector" tulajdonsága "Obsolete" jelölést kapott, meg fog szűnni a jövőben.
- HtmlHelper kiterjesztésre került a VrhTextBox és VrhTextBoxFor metódusokkal, melyek ugyanazt tudják, mint a TextBox és TextBoxFor csak kapnak automatikusan egy "form-control" osztály jelölést.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.8.3 változatára.
- Frissítés a Vrh.XmlProcessing 1.5.6 változatára.

#### 2.3.1 (2019.09.12) Patches - release:
- A BaseController-ben lett egy protected állandó MODELSTATE néven és "ModelState" értékkel a TempData szótár használatához.
- A BaseController-nek lett egy csak olvasható protected tulajdonsága a BaseFolder, mely a HttpContext.Server.MapPath("~") hívás értékét tartalmazza. XmlParser-hez mindig kell, és így könnyebben elérhető.
- Dokumentáció bővítése.
- Frissítés a Vrh.XmlProcessing 1.5.2 változatára.

#### 2.3.0 (2019.08.26) Compatible changes - debug:
- BaseController.ParameterSeparating(string[][], type, bool, bool) metódus hozzzáadása.
- BaseController.ParameterSeparating(SeparatingSource, type, bool, bool) metódus hozzáadása. 
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.8.1 változatára.
- Frissítés a Vrh.XmlProcessing 1.5.0 változatára.

#### 2.1.1 (2019.06.19) Patches - debug:
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.5.2 változatára.
- Frissítés a Vrh.XmlProcessing 1.3.0 változatára.

#### 2.1.0 (2019.06.14) Compatible changes - debug:
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.5.0 változatára.
- VRH.ConnectionStringStore függőség megszűnt.

#### 2.0.0 (2019.05.14) Incompatible changes - debug:
- E verziótól az XmlParser, és minden XML feldolgozással kapcsolatos dolog már nem elérhető. Új hely: Vrh.XmlProcessing.
- A standard JSON struktúrák és az IManage interfész át lett helyezve a Vrh.Common-ba.
- Az ITransalation interfész és a TranslationBase osztály át lett helyezve a VRH.Log4Pro.MultiLanguageManager-be.
- Minden "depricated" és "obsolete" jelölésű eszköz véglegesen megszűnt.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.4.0 változatára.
- Vrh.XmlProcessing 1.0.0 hozzáadása.
- Dokumentáció a változásoknak megfelelően frissítve.
- ReadMe.md-ből a "csharp" jelölések cseréje "javascript"-re.
 
#### 1.18.1 (2019.04.04) Patches - debug:
- Frissítés a Microsoft.AspNet.Mvc 5.2.7 változatára.

#### 1.18.0 (2019.03.01) Compatible changes - debug:
- A CommonModel osztályba bekerült egy GetBoolList nevű metódus, mely bool mezők
feletti szűréshez állít elő "","Igen","Nem" tartalmú SelectList-et nyelvhelyesen.
- IManage interface létrehozása, mely meghatározza egy karbantartást biztosító 
osztály elvárt tulajdonságait és módszereit.
- ITranslation interface létrehozása, mely meghatározza egy fordítási 
szolgáltatásokat biztosító osztály elvárt tulajdonságait és módszereit.
- TranslationBase absztrakt osztály létrehozása egyéb osztályok alapozásához.
- Frissítés a Microsoft.AspNet.Mvc 5.2.7 változatára.
- Frissítés a Newtonsoft.Json 12.0.1 változatára.
- Frissítés a VRH.Log4Pro.MultiLanguageManager 3.1.0 változatára.
  
#### 1.17.0 (2018.12.17) Compatible changes - debug:
- XmlConnection konstruktora levágja az elején és végén található white space és '/' karaktereket,
a kapcsolati sztringben megadott 'element' össztevőről.
- Kikerült a debug verzióból pár diagnosztikai célú üzenet kiírás.
- VariableDictionary-ben elérhető a szeparátorok listája 'Separators' néven.
- VariableDictionary.FindVariables visszatér egy listával, mely egy szövegben megtalált változók
neveit tartalmazza.
- XmlParser felépít egy XmlVarsInfo és egy ConectionStringsInfo szótárat. A szótár elemei VariableInfo
típusúak, mely elmondja egy változóról, melyik fájlban található, milyen XPath kereső 
kifejezéssel érhető el, és honnan származik.

#### 1.16.1 (2018.11.15) Patches - debug:
- WebCommon.ErrorListBuilder már nem teszi be a '(0)'-kat a hibaüzenetbe.

#### 1.16.0 (2018.10.26) Compatible changes - debug:
- RedisConnection osztály beépítése. A WebMonitor és RedisManager számára hasznos, hogy 
egységes és következetes legyen.
- CommonModel osztály beépítése rendszeresen használt tulajdonságokkal és metódusokkal.

#### 1.15.1 (2018.10.20) Patches - debug:
- A Microsoft.AspNet.Mvc 5.2.6 függőség beállítása. Frissítés már megvolt korábban.

#### 1.15.0 (2018.10.11) Compatible changes - debug:
- WebCommon.Base10ToBase() függvény beépítése, ami egy 10-es számrendszerbeli számot alakít át 2-36
számrendszer beli számmá. 
- XmlLinqBase.GetXElement metódusán kellett módosítani.

#### 1.14.0 (2018.09.27) Compatible API changes - debug:
- CookieApplicationSettings-ben EntryPointName lett a ReferenceName.

#### 1.13.0 (2018.09.25) Compatible API changes - debug:
- Lehet több XmlParser elem egy xml paraméterfájlban illetve egy konfigurációs elem alatt.
- XmlParser elem tartalmazhat egy hivatkozást egy külső fájlra az Include attribútummal.

#### 1.12.0 (2018.08.24) Compatible API changes - debug:
- Frissítés a VRH.Log4Pro.MultilanguageManager 3.0.0-ás változatára.
- DataTables támogatás: DataTables és DataTablesIn osztályok bevezetése.
- CRUD támogatás: MasterData statikus osztály bevezetése.

#### 1.11.0 (2018.08.13) Compatible API changes - debug:
- ```CookieApplicationSettings``` osztály kiegészült a "WelcomeUrl" tulajdonsággal, 
hogy a Layout be tudja állítani a logo, és login/logout link értékét.

#### 1.10.1 (2018.08.10) Patches - debug:
- Az XmlParser hibakezelésén kellet javítani. Hibát dob, ha a konfigurációban megadott elem
nem létezik.

#### 1.10.0 (2018.08.10) Compatible API changes - debug:
- ```CookieApplicationSettings``` osztály kiegészült a "ConfigurationName" és a 
"ReferenceName" tulajdonságokkal, hogy ez is megőrződjön az alkalmazás cookie-ban.

#### 1.9.2 (2018.08.08) Patches - debug:
- Az ```UrlElement.GetUrl()``` ```StringBuilder```-t használ, és a paraméterek nevében
vagy értékében előforduló "?&=" jeleket a szabványos URL encode értékre cseréli.
- A ```ParameterSeparating``` metódus kapott egy túlterhelést (overload),
amelyben megadható a feldolgozandó ```NameValueCollection```.

#### 1.9.1 (2018.08.01) Patches - debug:
- A WebCommon.RealPath metódust kellet pontosítani.

#### 1.9.0 (2018.07.27) Compatible API changes - debug:
- ```VariableDictionary``` osztály bevezetése. A ```VariableCollection``` a 2.0-ás
változattól már nem lesz használható.
- ```ParameterQuery``` osztály megszűnt. A szolgáltatások a ```BaseController``` osztály
```ParameterSeparating``` metódusába vándoroltak.
- 'USERNAME' rendszerváltozó automatikusan hozzáadódik az ```OtherParameters```szótárhoz.

#### 1.8.3 (2018.07.26) Patches - debug:
- URL paraméterek azonnal hozzáadódnak az XmlVars gyűjteményhez, és ezeknek az értékét nem
módosíthatja, ha van ilyen változó az xml paraméterfájlokban.

#### 1.8.2 (2018.07.25) Patches - debug:
- XmlParser és BaseController osztályokban történtek javítások.
- A VariableCollection csak olyan változókat tartalmazhat, amelyek neve
megfelel a "[a-zA-Z_]\w*" reguláris kifejezésnek.
- XmlLinqBase az IDisposable osztályból származtatva

#### 1.8.1 (2018.07.24) Patches - debug:
- XmlConnection konstruktorában történt javítás. Alapértelmezett fájl és 
konfigurációnév megadással kapcsolatban.

#### 1.8.0 (2018.07.16) Compatible API changes - debug:
- ParameterQuery osztály bevezetése. A .NET-es akciók Request.QueryString-jének szétválasztása
a kért és egyéb paraméterekre. 
- XmlConnection osztály bevezetése. XmlParser connection string feldolgozásához.
- XmlParser új konstruktorokkal bővült, melyek alkalmasak az XmlConnection,
ParameterQuery osztályok és az XmlParser connection string fogadására a példányosításkor. 

#### 1.7.1 (2018.06.30) Patches - debug:
- A CookieApplicationSettings osztályban a Set metódusban a ProductName és CopyRight
UrlEncode után kerül mentésre, és visszaolvasáskor UrlDecode történik. (A cookie nem
tud letárolni UNICODE-ot.)

#### 1.7.0 (2018.05.30) Compatible API changes - debug:
- Elkészült egy újabb XmlParser konstruktor, mely nem konfigurációs nevet vár, hanem
egy létező xml fájl nevét. Ez a konstruktor feldolgozza a gyökér XmlParser változóit,
de nem foglalkozik annak Configuration elemével.

#### 1.6.0 (2018.05.11) Compatible API changes:
- ValidationExtension static osztály hozzáadása (a régi DataTables.dll-ből átemelve)

#### 1.5.0 (2018.04.13) Compatible API changes:
- CookieApplicationSettings osztály létrehozása.
- A WebCommon static osztály létrehozása, a VRH web alkalmazásokban alapvetően 
vagy sokszor használt tulajdonságok és metódusok eléréséhez.
- ViewModes enum létrehozása (Desktop, Mobile, Touch) értékekkel.

#### 1.4.3 (2018.03.21) Patches:
- VariableCollection.Substitution nem dob hibát, ha null értékű sztringet kap a behelyettesítéshez. Null-t add vissza ilyenkor.

#### 1.4.2 (2018.03.19) Patches:
- XmlParser újra abstract. 

#### 1.4.1 (2018.03.07) Compatible API changes:
- XmlParser az érték nélküli változókat is létrehozza üres string értékkel. 
- Rendszerváltozó nevű XmlVar esetén hiba keletkezik.
- Dokumentácó bővítése, javítása. 

#### 1.4.0 (2018.03.03) Compatible API changes:
- XmlLinqBase, XmlCondition, XmlVariable és XmlParser osztály létrehozása, az XML
feldolgozás egységesítéséhez.
- Dokumentácó bővítése, javítása. 

#### 1.3.2 (2018.01.19) Patches:
- UrlElement osztályban javítás és módosítás (konstruktor).

#### 1.3.1 (2017.12.19) Patches:
- Dokumentáció bővítése, pontosítása.
- Új név került be a rendszerváltozók közé, a "USERNAME".

#### 1.3.0 (2017.12.08) Compatibility API changes::
- VariableCollection osztály létrehozása, az XML feldolgozáskor alkalmazott változók behelyettesítésére, és egységben tartására.
- SystemVariableNames statikus osztály létrehozása a rendszerváltozók egységes kezelése céljából.
- Dokumentációk bővítése és pontosítása.

#### 1.2.3 (2017.11.30) Patches:
- Dokumentáció bővítése, pontosítása.
- BaseController.ErrorMessageBuilder már magától levágja az utolsó soremelést.

#### 1.2.2 (2017.11.07) Patches:
- A Vrh.Common.Serialization.Structures Lib kimozgatása az iScheduler alól ebbe az önálló solutionbe, és átnevezése Vrh.Web.Common.Lib-re
- Nuget csomaggá alakítás
