@page "/about"
@inherits APageComponent
@{try{
<!--=============================================================================================-->
<div style="float: right">
   <span style="color: Red; font-size: x-large; vertical-align: middle">&#x21AF;</span>
   <AButton Title="Unhandled exception test" Classes="ml-1" Focusable=@false
            ON_Click=@UnhandledExceptionButton_OnClick>Throw unexpected error</AButton>
</div>
<p class="page_ImpressiveTitle">
   About <b>BookRegistry</b>-application (sample of DB-operation tool)
   <img src="images/book_registry.png" class="ml-1"/>
</p>
<div id="about_pg_ContactsDIV">
   <div style="text-align: right">
      <span class="about_pg_ContactsCaptionSPAN">Author requisites (contacts):</span><br>
   </div>
   <div style="margin-top: 5px">
      <span class="about_pg_AuthorRequisiteNameSPAN">Author<b>:</b></span>
         <b>Sergei Y.Kitaev</b><br>
      <span class="about_pg_AuthorRequisiteNameSPAN">E-Mail<b>:</b></span>
         <a href="mailto:S.Y.Kitaev@yandex.ru" title="Mail-to">S.Y.Kitaev@yandex.ru</a><br>
      <span class="about_pg_AuthorRequisiteNameSPAN">Residence<b>:</b></span>
         Voronezh, Russia
   </div>
</div>
<p align="justify">
   <b>BookRegistry</b>-program is a sample Web-application which is intended to probe <b>Blazor-WASM</b> framework
   and to work out some generalized C#-cooperation: WASM-Blazor client (C#) versus Web-server in ASP.NetCore (C#),
   plus necessary TypeScript for access to DOM. The purpose was to elaborate a multilingual support
   (in programming languages) for traditional client-server functionality that should be accessible from Web-page
   (so-called client-server app.engine for Web).
</p>
<span class="page_ContentTitleSPAN mt-1">Content:</span>
<ol class="primaryIndexOL">
   <li>
      <a href="#internals" title="Sctoll to" onclick="return HRef_ScrollToId('about_pg_InternalsA')">
         @BlockTitle_Internals
      </a>
   </li>
   <li>
      <a href="#at_server_side" title="Sctoll to" onclick="return HRef_ScrollToId('about_pg_AtServerSideA')">
         @BlockTitle_AtServerSide
      </a>
   </li>
   <li>
      <a href="#inside_database" title="Sctoll to" onclick="return HRef_ScrollToId('about_pg_InsideDatabase')">
         @BlockTitle_InsideDatabase
      </a>
   </li>
   <li>
      <a href="#resume" title="Sctoll to" onclick="return HRef_ScrollToId('about_pg_ResumeA')">
         @BlockTitle_Resume
      </a>
   </li>
</ol>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
@BlockTitleHRef( "I.", 0, "about_pg_InternalsA", "#internals",
   BlockTitle_Internals, null, "about_pg_AtServerSideA" )
<p class="littleSpacingP_J">
   SPA (<i><b>S</b>ingle <b>P</b>age <b>A</b>pplication</i>) is equipped with so-called <b><i>Magistral</i></b>-layout,
   which has been designed as SPA-container for clean internal SPA-navigation and possibility of explicit cancellation
   (abandoment by user) of server request invocation. Such cancellable busy-operation is realized here as semi-blocking
   visual procedure.
</p>
<p class="littleSpacingP_J">
   <b>Magistral</b>-layout is implemented with help of <b>TypeScript</b> (there is C# API for Blazor-client; .NET-classes:
   <b>AFXUI.UMagistral</b> and <b>AFXUI.UMagistralMI</b>). Magistral HTML (layout elements in markup) was intentionally built
   at topmost in <b>wwwroot</b>&#x2F;<b>index.html</b> (instead of Razor-file) — for the sake of sense presence of embedded SPA-enhancement,
   as if it has been built-in into browser (for such perceptional effect).
</p>
<p class="littleSpacingP_J">
   <b>BookRegistry</b>-application consists of a set of modules (DLLs) and each side (client/server) has its own subset.<br>
   This Blazor-based program (WASM-client) uses special error control technique for UI-access from C#.
   This technique is based on extensive usage of corresponding exception guards in UI-message/event circuit.
   This mechanism together with other helpers of visual character are packed into <b>AFXUI</b> auxiliary library
   (<b>AFXUI.dll</b>-module; <b>AFXUI</b>-namespace). Public types (lib.classes etc) has following name-patterns:
   “<b><i>U…</i></b>” (prefixed) and “<b><i>…AFX</i></b>” (suffixed).<br>
   Other app.-framework extensions are implemented in client-project, in <b>AFXUI.App</b>-subfolder.<br>
   In addition, this application uses its own modest component collection located in “<b>Client\Shared</b>”-subfolder
   (“<b><i>A…</i></b>”-classes).<br>
   In folder “<b>SHARED\$General.AFX</b>” there are extension classes for both sides: C#-client &#x2F; C#-server.<br>
   (<b>AFX</b>-abbreviation means here <i><b>A</b>pplication <b>F</b>ramework <b>E</b>xtension</i>.)
</p>
<p class="littleSpacingP">
   <b>BookRegistry</b>-application is build with auxiliary base library <b><i>DotNetHelpers</i></b>
   (set of libs with extensions of general runtime character), which is represented by following modules:<br>
   – <b>CommonHelpers.WASM.dll</b> (at client-side);<br>
   – <b>CommonHelpers.dll</b>+<b>CommonHelpers.2.dll</b>+<b>CommonHelpers.3.dll</b> (at server-side).
</p>
<p class="littleSpacingP">
   <u>Satellite library sources (<b>DotNetHelpers</b> base-lib.):</u><br>
   – “HandicraftSDK\DotNetHelpers\Libraries\.WASM\<b>CommonHelpers.WASM</b>” (code-packages: <b><i>$Core</i></b>);<br>
   – “HandicraftSDK\DotNetHelpers\Libraries\.WIN32\<b>CommonHelpers.*</b>” (code-packages:
   <b><i>$Core</i></b>, <b><i>$Plus</i></b>, <b><i>$Console</i></b>, <b><i>$Data</i></b>, <b><i>$ORM</i></b>, …).
</p>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
@BlockTitleHRef( "II.", 0, "about_pg_AtServerSideA", "#at_server_side",
   BlockTitle_AtServerSide, "about_pg_InternalsA", "about_pg_InsideDatabase" )
<p class="littleSpacingP_J">
   On side of Web-server service code is separated into following two different parts:
   “<b>solid-code</b>” (C#-controllers) and “<b>soft-code</b>” (procedural T-SQL).
   In spite of any difficulties of such division, soft-code is very useful thing, because it may be corrected
   on the fly, without need of server restart. Also the code may be changed by little pieces as opposed to solid C# EXE/DLL-recompilation.<br>
</p>
<p class="littleSpacingP_J">
   In <b>BookRegistry</b> Web-server each query to database is represented by two nearly-situated files of same base-name:
   <b><i>&lt;NamedQuery&gt;</i>.sql</b> and <b><i>&lt;NamedQuery&gt;</i>.cs</b>. Such DB-query is visible not only for server-side C#,
   but also exposes correspondent data-structures and/or error-statuses for C#-client (WASM app.).
   Directives of conditional compilation are used intensively for the sake of flexibility
   (instead of simple DLL-sharing by means of .NET-standard format).<br>
   The project uses (intentionally) its own specially-made support for database access — extremely lightweight ORM to SP
   and “traditional queries”, which sits directly on ADO.NET.
</p>
<p class="littleSpacingP_J">
   Database data-models (structures) are normally declared only once in C# — simultaneously for server and client sides
   (with some differences, that is achieved via conditional compilation).
   This approach is used to form interaction API (Web-client—Web-server) with minimal involvement of usage of JSON-attributes for C#.
   Exchangeable C# data-models are implemented as so-called self-checking objects, with strict property getters
   applied to values, whose type (in C#) does not provide null. Such autonomous checking technique (C#-only)
   is used to guarantee consistency of nulls.<br>
   At client-side additional JSON-to-null checking is fired automatically by service invocation routine (in AFX) —
   when response-object is received from server. It is realized as so-called “back-packing”-test (in AFX)
   for the sake of null-checking (before access to response object properties from application writer client-code).
</p>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
@BlockTitleHRef( "III.", 0, "about_pg_InsideDatabase", "#inside_database",
   BlockTitle_InsideDatabase, "about_pg_AtServerSideA", "about_pg_ResumeA" )
<p class="littleSpacingP_J">
   At DB-level — <b>Transact-SQL</b> is used for queries. SQL-code is maintained with help of <b><i>SQL-file technology</i></b> —
   lightweight scripting&#x2F;command-line tools for Transact-SQL enhancement, which allows to organize SQL-project on base
   of traditional file&#x2F;directory structure usage (for code-files), with corresponding code-translation: from SQL-files to SQL-database.<br>
   In <b>BookRegistry</b>-application SQL-code is located in following folders:<br>
   – “<b>SHARED\$ClientServer\!DB-queries (application SP)</b>”: top-level stored procedures;<br>
   – “<b>SQL (DB-modelling)</b>”: base stored procedures, table creation, initial data filling, data deletion, table-structure removal etc.
</p>
<p class="littleSpacingP">
   <u><b>SQL-file technology</b> includes following components:</u><br>
   – <b><i>$SqlTrans</i></b> command utility (SQL-file to DB translation, preprocessor etc; it is based on well-known <b>SQLCMD</b>-tool);<br>
   – other CMD-utilities: <b><i>$SqlUplodad</i></b>, <b><i>$SqlToCsvExp</i></b> (<b><i>SqlToCsvExport.exe</i></b>), <b><i>$SqlCon</i></b>, <b><i>$SQL</i></b>;<br>
   – <b><i>SQLAUX</i></b> scripting library (helper objects like SP, scalar/table-function, etc; import definitions, templates etc);<br>
   – integration features (plugin/marco for <b>Far-Manager</b>, settings/instructions, etc);<br>
   – miscellaneous templates and samples, illustration pictures etc.
</p>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
@BlockTitleHRef( "IV.", 0, "about_pg_ResumeA", "#resume",
   BlockTitle_Resume, "about_pg_InsideDatabase" )
<p class="littleSpacingP_J">
   <b>BookRegistry</b>-program together with its libraries (<b>AFXUI.dll</b>, <b>DotNetHelpers</b>,
   modest app.component lib. and other AFX-subfolders in application projects), — all this has been built/united
   as minimal implementation of simple idea: to launch <u><b>Client-Server WASM-application</b> in <b>C#</b>, <b>TypeScript</b> and <b>T-SQL</b></u>.
   <b>BookRegistry</b>-program (WASM-Blazor app.) is working example of this idea.<br>
   (This minimal sample code-project was produced in <b>April 2020</b>.)
</p>
<!--=============================================================================================-->
<p class="bigSpacingP">
   <span class="small_bold_text">Main assembly properties (WASM):</span>
</p>
<table class="propertyTABLE">
   <thead>
      <tr>
         <th class="propertyNameTH">Assembly attribute</th>
         <th class="propertySeparatorTH"></th>
         <th class="propertyValueTH">Value</th>
      </tr>
   </thead>
   <tbody>
      @PropertyTR( "Assembly (name)",  BookRegistry_Client_Info.AssemblyName, true )
      @PropertyTR( "Exe-module",       BookRegistry_Client_Info.ModuleName )
      @PropertyTR( "Product",          BookRegistry_Client_Info.ProductName )
      @PropertyTR( "Version",          BookRegistry_Client_Info.VersionString )
      @PropertyTR( "Configuration",    BookRegistry_Client_Info.ConfigurationName )
      @PropertyTR( "Target framework", BookRegistry_Client_Info.TargetFramework )
      @PropertyTR( "Description",      BookRegistry_Client_Info.ProductDescription )
      @PropertyTR( "Company",          BookRegistry_Client_Info.CompanyName )
      @PropertyTR( "Authors",          BookRegistry_Client_Info.Authors )
      @PropertyTR( "Copyright",        BookRegistry_Client_Info.CopyrightString )
@*
      @PropertyTR( "Public key",       BookRegistry_Client_Info.PublicKeyString )
*@
      @PropertyTR( "Public key token", BookRegistry_Client_Info.PublicKeyToken )
   </tbody>
</table>
<!--=============================================================================================-->
}catch(Exception e){ProcessRenderingError(GetType(),e);}}
