2 Commits

Author SHA1 Message Date
Samuele Locatelli 3d530fc46e Fix versioni pacchetti: compila 2025-10-09 17:57:47 +02:00
Annamaria Sassi b13dc6540d - Aggiunta gestione Template
- Aggiornato tipo apertura per hardware
2025-10-09 17:46:13 +02:00
2488 changed files with 12948 additions and 163502 deletions
+12 -12
View File
@@ -5,7 +5,7 @@ variables:
NUM_REL: '0.1.2.3'
NU_TYPE: 'Debug'
APP_NAME: 'Test.UI'
SOL_NAME: 'WebWindowConfigurator'
SOL_NAME: 'Test.UI'
NUGET_PATH: 'C:\Tools\nuget.exe'
DEST: 'install'
@@ -146,7 +146,7 @@ Test.UI:build:
- win
variables:
APP_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
rules:
- if: $CI_COMMIT_BRANCH == 'develop'
- if: $CI_COMMIT_BRANCH == 'main'
@@ -169,7 +169,7 @@ Test.UI:IIS01:deploy:
- win
variables:
APP_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
before_script:
- *nuget-fix
- dotnet restore "$env:SOL_NAME.sln"
@@ -188,7 +188,7 @@ WebWindow.Base:SDK:deploy:
- win
variables:
APP_NAME: WebWindow.Base
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -211,7 +211,7 @@ WebWindowConfigurator:SDK:deploy:
- win
variables:
APP_NAME: WebWindowConfigurator
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -234,7 +234,7 @@ WebWindowComplex:SDK:deploy:
- win
variables:
APP_NAME: WebWindowComplex
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -260,7 +260,7 @@ WebWindowComplex:SDK:deploy:
# - win
# variables:
# APP_NAME: Test.UI
# SOL_NAME: WebWindowConfigurator
# SOL_NAME: Test.UI
# before_script:
# - *nuget-fix
# - dotnet restore "$env:SOL_NAME.sln"
@@ -281,7 +281,7 @@ WebWindowComplex:SDK:deploy:
# - win
# variables:
# APP_NAME: Test.UI
# SOL_NAME: WebWindowConfigurator
# SOL_NAME: Test.UI
# NEXUS_PATH: MP-LAND
# before_script:
# - *nuget-fix
@@ -307,7 +307,7 @@ WebWindowComplex:SDK:deploy:
# - win
# variables:
# APP_NAME: Test.UI
# SOL_NAME: WebWindowConfigurator
# SOL_NAME: Test.UI
# NEXUS_PATH: MP-LAND
# before_script:
# - *nuget-fix
@@ -328,7 +328,7 @@ WebWindow.Base:SDK:release:
- win
variables:
APP_NAME: WebWindow.Base
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Release
before_script:
- *nuget-fix
@@ -349,7 +349,7 @@ WebWindowConfigurator:SDK:release:
- win
variables:
APP_NAME: WebWindowConfigurator
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Release
before_script:
- *nuget-fix
@@ -370,7 +370,7 @@ WebWindowComplex:SDK:release:
- win
variables:
APP_NAME: WebWindowComplex
SOL_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
NU_TYPE: Release
before_script:
- *nuget-fix
-24
View File
@@ -1,24 +0,0 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="AsyncFixer" Version="2.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
<PackageVersion Include="Egw.Window.Data" Version="2.8.1.2611" />
<PackageVersion Include="EgwCoreLib.Lux.Core" Version="1.0.2603.2112" />
<PackageVersion Include="EgwCoreLib.Lux.Data" Version="1.0.2603.2112" />
<PackageVersion Include="EgwCoreLib.Razor" Version="1.5.2511.312" />
<PackageVersion Include="EgwCoreLib.Utils" Version="1.5.2511.312" />
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="8.0.21" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.21" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.21" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NLog" Version="6.0.7" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="6.1.0" />
<PackageVersion Include="RestSharp" Version="113.1.0" />
</ItemGroup>
</Project>
+60 -104
View File
@@ -1,137 +1,93 @@
# WebWindowConfigurator
Componente per configurare un serramento partendo da un JWD.
Durante la configurazione ad ogni cambiamento viene aggiornata l'immagine del serramento.
## Requisiti
## Getting started
I requisiti per utilizzare il componente sono:
- JWD da modificare;
- Lista delle famiglie hardware;
- Lista hardware;
- Lista dei materiali;
- Lista dei colori dei materiali;
- Lista dei vetri ammessi;
- Lista dei profili gestiti;
- Lista delle soglie associate al profilo selezionato.
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
## Funzionalità componente
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
Il componente permette i seguenti comportamenti principali:
## Add your files
- Aggiungere un gruppo di ante al telaio;
- Aggiungere uno split al telaio o a un anta;
- Copiare il contenuto di un'anta in un'altra anta;
- Eliminare un gruppo di ante;
- Eliminare uno split;
- Cambiare le caratteristiche dei gruppi di ante, delle singole ante, degli split e del frame.
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
## JWD
```
cd existing_repo
git remote add origin https://gitlab.steamware.net/etis/webwindowconfigurator.git
git branch -M main
git push -uf origin main
```
Il JWD descrive la struttura e le caratteristiche di un serramento.
## Integrate with your tools
Un serramento è composto da un determinato tipo di elementi:
- Telaio (obbligatorio)
- Divisione (facoltativa)
- Gruppo ante (facoltativo)
- Riempimento (obbligatorio almeno un riempimento)
- [ ] [Set up project integrations](https://gitlab.steamware.net/etis/webwindowconfigurator/-/settings/integrations)
Al serramento sono associate le seguenti caratteristiche:
- Profilo;
- Materiale;
- Vetro;
- Colore serramento.
## Collaborate with your team
### Telaio (Frame)
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
Al frame sono associate le seguenti caratteristiche:
- Forma;
- Dimensioni;
- Soglia;
- Giunti;
- Quantità bottom Rail.
## Test and Deploy
#### Forme Telaio
Use the built-in continuous integration in GitLab.
Le forme ammesse per il telaio sono le seguenti:
- Rectangle;
- Right Chamfer;
- Left Chamfer;
- Double Chamfer;
- Arc;
- Full Arc;
- Fillet;
- Double Arc;
- Three Center Arc;
- Triangle;
- Custom.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
### Divisione (Split)
***
Uno split genera sempre almeno due sottoaree contenenti ognuna un riempimento (Fill) di tipo vetro.
Se ci sono solo due sottoaree generate da uno split, si possono scambiare tra di loro.
# Editing this README
Uno split può essere:
- Orizzontale, viene definito il numero di split orizzontali e l'altezza delle nuove aree orizzontali formate;
- Verticale, viene definito il numero di split verticali e la larghezza delle nuove aree verticali formate;
- A griglia, viene definito il numero di split orizzontali e verticali e l'altezza delle aree orizzontali e la larghezza delle aree verticali; in questo caso si può scegliere se hanno la precedenza gli split orizzontali o verticali (cambia il modo in cui si esegue l'incrocio tra gli split).
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
### Gruppo di ante (Sash group)
## Suggestions for a good README
Al gruppo di ante sono associate le seguenti caratteristiche:
- Numero di ante;
- Orientamento;
- Quantità bottom rail;
- Codice hardware.
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
#### Singola anta
## Name
Choose a self-explaining name for your project.
La singola anta ha associate le seguenti caratteristiche:
- Tipologia di apertura;
- Dimensione;
- Tipo di misura della dimensione (assoluta, percentuale o proporzionale);
- Presenza maniglia;
- Giunti.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
#### Hardware
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
Per calcolare la lista di hardware ammessi data una famiglia di hardware servono i seguenti dati:
- Forma del gruppo di ante (tramite richiesta al programma di calcolo);
- Tipo di apertura dell'anta con la maniglia;
- Numero di ante;
- Posizione anta battente (nel caso di tre o più ante, bisogna sapere se l'anta con la maniglia è incernierata al telaio o a un'altra anta).
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
La richiesta della forma del gruppo di ante viene trasmessa se si cambiano i seguenti parametri:
- Forma del telaio;
- Dimensioni del telaio;
- Aggiunta di uno split nel frame se già presente un gruppo di ante;
- Se si effettua lo scambio delle aree di uno split e una delle aree contiene una sash;
- Eliminazione di uno split.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
La lista degli hardware viene aggiornata se si cambiano i seguenti parametri:
- Forma del gruppo di ante;
- Numero ante nello stesso gruppo di ante;
- Se si sposta la maniglia e cambia il tipo di apertura e/o la posizione dell'anta battente.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
#### Opzioni Hardware
Le opzioni hardware vengono ricevute in formato xml.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
Vengono richieste nei seguenti casi:
- Click sul pulsante per visualizzarle;
- Cambiamento nel numero di ante;
- Cambiamento nella selezione dell'hardware;
- Cambiamento nella selezione della famiglia hardware;
- Cambiamento di un valore delle opzioni hardware.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
### Riempimento (Fill)
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
Descrive il tipo di riempimento: vetro o pannello.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
## Richieste di informazioni a EgwMultiEnginManager
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
Nel componente sono presenti quattro tipi di richieste al programma EgwMultiEngineManager:
1. SVG: serve per avere SVG dato il JWD per poter rappresentare il disegno. La domanda è costituita dal JWD e la risposta contiene il SVG;
2. Forma del telaio: la forma serve per poter determinare la lista degli hardware coerenti con le caratteristiche scelte. La domanda è costituita dal JWD e dalla lista di groupId interessati. La risposta contiene un dizionario di valori interi-stringa che rappresentano groupId-forma;
3. Hardware option: serve per avere le opzioni relative all'hardware selezionato. La domanda è costituita dal JWD e la lista di groupId interessati. La risposta contiene un dizionario interi-stringa che rappresentano groupId-opzioni hardware. Le opzioni hardware sono restituite in formato xml;
4. Profili degli elementi: serve per avere i profili degli elementi del groupId richiesto (nel caso di gruppi di ante gli elemeneti sono specificati per ogni anta). La domanda è costituita dal JWD e dalla lista di groupId interessati. La risposta contiene una lisra di oggetti AreaProfiles.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.17" />
</ItemGroup>
</Project>
+1 -3
View File
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36915.13
VisualStudioVersion = 17.14.36203.30
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.UI", "Test.UI\Test.UI.csproj", "{8F1D6298-C1E6-44E6-82BD-4128AE17C0C7}"
EndProject
@@ -15,8 +15,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebWindowComplex", "WebWind
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebWindowTest", "WebWindowTest\WebWindowTest.csproj", "{C22770A7-C344-4CE9-8D6F-6ACE62091C31}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution", "Solution", "{9110EFC6-A67D-4D02-8ED2-5C8440B39EA5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+5 -14
View File
@@ -4,27 +4,18 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Lux UI Test Component" />
<meta name="author" content="EgalWare" />
<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico" />
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="lib/font-awesome/css/all.min.css" />
<link rel="stylesheet" href="lib/bootstrap-icons/font/bootstrap-icons.min.css" />
@* <link rel="stylesheet" href="bootstrap/bootstrap.min.css" /> *@
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="Test.UI.styles.css" />
<link rel="stylesheet" href="css/site.min.css" />
@* <HeadOutlet /> *@
<HeadOutlet @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
</head>
<body>
@* <Routes /> *@
@* <Routes @rendermode=RenderMode.InteractiveServer /> *@
<Routes @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
<Routes />
<script src="_framework/blazor.web.js"></script>
<script type="text/javascript" src="lib/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
@@ -1,13 +0,0 @@
<div class="card my-2">
<div class="card-header @CssClass">
<h3>@Name</h3>
</div>
<div class="card-body">
<div class="fs-3">@Message</div>
<small>@LocalInfo</small>
<Test.UI.Components.Compo.ChildObj Name="@SubName" CssClass="bg bg-primary" Message="load OPT" LoadPar="loadHwOpt"></Test.UI.Components.Compo.ChildObj>
<Test.UI.Components.Compo.ChildObj Name="@SubName" CssClass="bg bg-primary" Message="load PNG" LoadPar="loadPng"></Test.UI.Components.Compo.ChildObj>
<Test.UI.Components.Compo.ChildObj Name="@SubName" CssClass="bg bg-primary" Message="load SVG" LoadPar="loadSvg"></Test.UI.Components.Compo.ChildObj>
</div>
</div>
@@ -1,38 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace Test.UI.Components.Compo
{
public partial class ChildNoLoad
{
#region Public Properties
[Parameter]
public string CssClass { get; set; } = "";
[Parameter]
public string Message { get; set; } = "";
[Parameter]
public string Name { get; set; } = "NONE";
#endregion Public Properties
#region Protected Fields
protected string LocalInfo = "";
protected string SubName = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnParametersSet()
{
LocalInfo = $"Updated on {DateTime.Now:HH:ss.fff}";
SubName = $"Child of {Name}";
}
#endregion Protected Methods
}
}
-24
View File
@@ -1,24 +0,0 @@
@if (IsLoading)
{
<div class="card my-2">
<div class="card-header @CssClass placeholder-glow">
<h3 class="placeholder col-3"></h3>
</div>
<div class="card-body">
<div class="fs-3 placeholder col-6"></div>
<small class="placeholder col-8"></small>
</div>
</div>
}
else
{
<div class="card my-2">
<div class="card-header @CssClass">
<h3>@Name</h3>
</div>
<div class="card-body">
<div class="fs-3">@Message</div>
<small>@LocalInfo</small>
</div>
</div>
}
@@ -1,46 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace Test.UI.Components.Compo
{
public partial class ChildObj
{
#region Public Properties
[Parameter]
public string CssClass { get; set; } = "";
[Parameter]
public string Message { get; set; } = "";
[Parameter]
public string Name { get; set; } = "NONE";
[Parameter]
public string LoadPar { get; set; } = "";
[CascadingParameter(Name = "CurrLoading")]
public List<string> CurrLoading { get; set; } = new List<string>();
#endregion Public Properties
#region Protected Fields
protected string LocalInfo = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnParametersSet()
{
LocalInfo = $"Updated on {DateTime.Now:HH:ss.fff}";
}
private bool IsLoading
{
get => CurrLoading != null && CurrLoading.Count > 0 && CurrLoading.Contains(LoadPar);
}
#endregion Protected Methods
}
}
+4 -6
View File
@@ -6,16 +6,14 @@
</div>
<main>
<div class="top-row justify-content-between">
<div>WebWindowConfigurator Test site</div>
<div>
<a class="btn btn-primary text-light" href="https://iis01.egalware.com/Lux/UI/" target="_blank">Lux Dev Site</a>
</div>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>
@@ -7,7 +7,7 @@
protected void UpdateNavDisplay()
{
navLarge = !navLarge;
sideClass = navLarge ? "sidebar shadow-sm" : "sidebarSmall shadow-sm";
sideClass = navLarge ? "sidebar" : "sidebarSmall";
}
private bool navLarge = true;
@@ -5,13 +5,14 @@
}
main {
flex: 1;
margin-left: 14rem;
}
.sidebar,
.sidebarSmall {
/*background-image: linear-gradient(180deg, rgb(5, 39, 103) 20%, #3aa6ff 90%);*/
background: -webkit-linear-gradient(to bottom, #c5d6ed, #c5d6ed);
background: -webkit-linear-gradient(to bottom, #d5f1f2, #d5f1f2);
/* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #c5d6ed, #c5d6ed);
background: linear-gradient(to bottom, #d5f1f2, #d5f1f2);
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.top-row {
@@ -56,12 +57,14 @@ main {
.sidebar {
width: 13.5rem;
height: 100vh;
position: sticky;
position: fixed;
top: 0;
left: 0;
border-radius: 30px;
z-index: 1000;
}
.sidebarSmall {
width: 5.5rem;
width: 4.5rem;
height: 100vh;
position: sticky;
top: 0;
@@ -70,7 +73,7 @@ main {
.top-row {
position: sticky;
top: 0;
z-index: 1000;
z-index: 1;
}
.top-row,
article {
@@ -6,13 +6,14 @@
main {
flex: 1;
margin-left: 14rem;
}
.sidebar,
.sidebarSmall {
/*background-image: linear-gradient(180deg, rgb(5, 39, 103) 20%, #3aa6ff 90%);*/
background: -webkit-linear-gradient(to bottom, #c5d6ed, #c5d6ed); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #c5d6ed, #c5d6ed); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background: -webkit-linear-gradient(to bottom, #d5f1f2, #d5f1f2); /* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #d5f1f2, #d5f1f2); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.top-row {
@@ -63,13 +64,15 @@ main {
.sidebar {
width: 13.5rem;
height: 100vh;
position: sticky;
position: fixed;
top: 0;
left: 0;
border-radius: 30px;
z-index:1000;
}
.sidebarSmall {
width: 5.5rem;
width: 4.5rem;
height: 100vh;
position: sticky;
top: 0;
@@ -79,7 +82,7 @@ main {
.top-row {
position: sticky;
top: 0;
z-index: 1000;
z-index: 1;
}
.top-row, article {
+1 -1
View File
@@ -1 +1 @@
.page{position:relative;display:flex;flex-direction:column;}main{flex:1;}.sidebar,.sidebarSmall{background:-webkit-linear-gradient(to bottom,#c5d6ed,#c5d6ed);background:linear-gradient(to bottom,#c5d6ed,#c5d6ed);}.top-row{background-color:#f7f7f7;border-bottom:1px solid #d6d5d5;height:3.5rem;display:flex;align-items:center;}.top-row ::deep a,.top-row .btn-link{white-space:nowrap;margin-left:1.5rem;}.top-row a:first-child{overflow:hidden;text-overflow:ellipsis;}.bottom-row{color:#dedede;background-color:#000;height:1.6rem;align-items:center;}@media(max-width:640.98px){.top-row:not(.auth){display:none;}.top-row.auth{justify-content:space-between;}.top-row a,.top-row .btn-link{margin-left:0;}}@media(min-width:641px){.page{flex-direction:row;}.sidebar{width:13.5rem;height:100vh;position:sticky;top:0;border-radius:30px;}.sidebarSmall{width:5.5rem;height:100vh;position:sticky;top:0;border-radius:30px;}.top-row{position:sticky;top:0;z-index:1000;}.top-row,article{padding-left:.5rem!important;padding-right:.5rem!important;}}
.page{position:relative;display:flex;flex-direction:column;}main{flex:1;margin-left:14rem;}.sidebar,.sidebarSmall{background:-webkit-linear-gradient(to bottom,#d5f1f2,#d5f1f2);background:linear-gradient(to bottom,#d5f1f2,#d5f1f2);}.top-row{background-color:#f7f7f7;border-bottom:1px solid #d6d5d5;height:3.5rem;display:flex;align-items:center;}.top-row ::deep a,.top-row .btn-link{white-space:nowrap;margin-left:1.5rem;}.top-row a:first-child{overflow:hidden;text-overflow:ellipsis;}.bottom-row{color:#dedede;background-color:#000;height:1.6rem;align-items:center;}@media(max-width:640.98px){.top-row:not(.auth){display:none;}.top-row.auth{justify-content:space-between;}.top-row a,.top-row .btn-link{margin-left:0;}}@media(min-width:641px){.page{flex-direction:row;}.sidebar{width:13.5rem;height:100vh;position:fixed;top:0;left:0;border-radius:30px;z-index:1000;}.sidebarSmall{width:4.5rem;height:100vh;position:sticky;top:0;border-radius:30px;}.top-row{position:sticky;top:0;z-index:1;}.top-row,article{padding-left:.5rem!important;padding-right:.5rem!important;}}
+20 -17
View File
@@ -2,7 +2,7 @@
@inject NavigationManager NavigationManager
<div class="top-row ps-3 navbar navbar-dark shadow-sm">
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid px-0 text-center">
@if (!showText)
{
@@ -12,38 +12,41 @@
{
<a class="navbar-brand text-center" @onclick="() => ToggleCompress()">Window <i class="fas fa-caret-square-left"></i></a>
}
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="EditJWD" Match="NavLinkMatch.All">
<span class="fa-solid fa-gear px-2 fs-4" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">EditJWD</span>
}
<NavLink class="nav-link" href="Home" Match="NavLinkMatch.All">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="BaseEdit">
<span class="fa-solid fa-pencil px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">BaseEdit</span>
<NavLink class="nav-link" href="TestComponentTemplate">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">TestTemplate</span>
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="TestError">
<span class="fa-solid fa-pencil px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">TestError</span>
<NavLink class="nav-link" href="TestComponentJWD">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">TestJWD</span>
</NavLink>
</div>
@* <div class="nav-item px-3">
<div class="nav-item px-3">
<NavLink class="nav-link" href="Gerarchia">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText"> Gerarchia</span>
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="EditJWD">
<span class="fa-solid fa-gear px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">EditJWD</span>
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">EditJWD</span>
</NavLink>
</div> *@
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="Aedifica">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">Aedifica</span>
</NavLink>
</div>
</nav>
</div>
+1 -1
View File
@@ -13,7 +13,7 @@ namespace Test.UI.Components.Layout
NavigationManager.LocationChanged -= OnLocationChanged;
}
protected string hideText { get => showText ? "px-2" : "invisible"; }
protected string hideText { get => showText ? "" : "invisible"; }
protected string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
+8 -8
View File
@@ -9,7 +9,7 @@ namespace Test.UI.Components.Pages
public partial class Aedifica : IDisposable
{
private string channelSub = "";
private string subChannel = "";
private string CalcUid = "TestBeam";
private string currSvg = "";
private string apiUrl = "";
@@ -27,7 +27,7 @@ namespace Test.UI.Components.Pages
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
protected MarkupString JsonSer
@@ -37,12 +37,12 @@ namespace Test.UI.Components.Pages
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
protected override Task OnInitializedAsync()
protected override async Task OnInitializedAsync()
{
ConfInit();
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
//await ReloadData();
return Task.Delay(1);
await Task.Delay(1);
}
private void ConfInit()
@@ -51,7 +51,7 @@ namespace Test.UI.Components.Pages
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
//imgTag = Config.GetValue<string>("ServerConf:ImageFileTag") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSub = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
private async Task SendBtlRequest(Dictionary<string, string> CurrArgs)
@@ -67,14 +67,14 @@ namespace Test.UI.Components.Pages
}
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSub}:{CalcUid}"))
if (currArgs.msgUid.Equals($"{subChannel}:{CalcUid}"))
{
currSvg = currArgs.newMessage;
}
-32
View File
@@ -1,32 +0,0 @@
@page "/BaseEdit"
@rendermode InteractiveServer
<PageTitle>BaseEdit</PageTitle>
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveData="CurrData"
baseUser="User"
EC_ActionReq="DoAction"
EC_DoUpdate="ExecRequest"
EC_OnClose="CloseObj">
</WebWindowComplex.TableComp>
@if (!string.IsNullOrEmpty(outClose))
{
<div class="alert alert-danger fs-4">
@outClose
</div>
}
else if (!string.IsNullOrEmpty(outSave))
{
<div class="alert alert-success fs-4">
@outSave
</div>
}
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
-555
View File
@@ -1,555 +0,0 @@
using Egw.Window.Data;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using WebWindowComplex;
using WebWindowComplex.DTO;
using static WebWindowComplex.LayoutConst;
namespace Test.UI.Components.Pages
{
public partial class BaseEdit
{
#region Public Fields
public string InitialJwd = "";
#endregion Public Fields
#region Public Methods
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage -= PipeHwOption_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
/// <summary>
/// Livello di accesso
/// -- true: utente base (versione semplificata)
/// -- false: utente avanzato (versione completa)
/// </summary>
protected bool User = false;
protected Dictionary<int, string> currGroupShape = new Dictionary<int, string>();
protected Dictionary<int, string> currHwOption = new Dictionary<int, string>();
protected string currJwd = "...";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
protected string prevJwd = "";
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
#endregion Protected Fields
#region Protected Properties
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("ArTech"),
new string("ArTechPlana")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
/// <summary>
/// Lista profili da DB
/// </summary>
private List<ProfilePayload> AvailProfileList = new List<ProfilePayload>();
private List<Threshold> ThresholdProfilo78 = new List<Threshold>()
{
{ new Threshold(3, "Bottom") },
{ new Threshold(1, "Threshold") }
};
private List<Threshold> ThresholdProfiloSaomad = new List<Threshold>()
{
{ new Threshold(3, "Bottom") },
{ new Threshold(2, "BottomWaterdrip") },
{ new Threshold(1, "Threshold") }
};
private Dictionary<string, double> ParamProfilo78 = new Dictionary<string, double>()
{
{"Frame_Fill_Rail_DimMax", 85},
{"Frame_Fill_Rail_DimMin", 70},
{"Frame_Fill_Rail_DimStd", 72},
{"Frame_Fixed_Bottom_DimMax", 80},
{"Frame_Fixed_Bottom_DimMin", 70},
{"Frame_Fixed_Bottom_DimStd", 78},
{"Frame_Fixed_Top_DimMax", 80},
{"Frame_Fixed_Top_DimMin", 70},
{"Frame_Fixed_Top_DimStd", 78},
{"Frame_Frame_Split_DimMax", 85},
{"Frame_Frame_Split_DimMin", 55},
{"Frame_Frame_Split_DimStd", 60},
{"Frame_Mixed_Bottom_DimMax", 80},
{"Frame_Mixed_Bottom_DimMin", 70},
{"Frame_Mixed_Bottom_DimStd", 78},
{"Frame_Mixed_Split_DimMax", 110},
{"Frame_Mixed_Split_DimMin", 70},
{"Frame_Mixed_Split_DimStd", 90},
{"Frame_Mixed_Top_DimMax", 80},
{"Frame_Mixed_Top_DimMin", 70},
{"Frame_Mixed_Top_DimStd", 78},
{"Frame_Rail_Bottom_DimMax", 80},
{"Frame_Rail_Bottom_DimMin", 70},
{"Frame_Rail_Bottom_DimStd", 78},
{"Frame_Rail_DimMax", 78},
{"Frame_Rail_DimMin", 68},
{"Frame_Rail_DimStd", 72},
{"Frame_Sash_Bottom_DimMax", 80},
{"Frame_Sash_Bottom_DimMin", 70},
{"Frame_Sash_Bottom_DimStd", 78},
{"Frame_Sash_Horizontal_DimMax", 110},
{"Frame_Sash_Horizontal_DimMin", 75},
{"Frame_Sash_Horizontal_DimStd", 95},
{"Frame_Sash_Threshold_DimMax", 26},
{"Frame_Sash_Threshold_DimMin", 24},
{"Frame_Sash_Threshold_DimStd", 25},
{"Frame_Sash_Top_DimMax", 80},
{"Frame_Sash_Top_DimMin", 70},
{"Frame_Sash_Top_DimStd", 78},
{"Frame_Sash_Vertical_DimMax", 110},
{"Frame_Sash_Vertical_DimMin", 75},
{"Frame_Sash_Vertical_DimStd", 95},
{"Frame_Slide_Bottom_DimMax", 60},
{"Frame_Slide_Bottom_DimMin", 50},
{"Frame_Slide_Bottom_DimStd", 55},
{"Frame_Slide_Fixed_DimMax", 60},
{"Frame_Slide_Fixed_DimMin", 50},
{"Frame_Slide_Fixed_DimStd", 55},
{"Frame_Slide_MovableBack_Bottom_DimMax", 60},
{"Frame_Slide_MovableBack_Bottom_DimMin", 50},
{"Frame_Slide_MovableBack_Bottom_DimStd", 55},
{"Frame_Slide_MovableBack_Threshold_DimMax", 10},
{"Frame_Slide_MovableBack_Threshold_DimMin", 3},
{"Frame_Slide_MovableBack_Threshold_DimStd", 4},
{"Frame_Slide_Movable_DimMax", 60},
{"Frame_Slide_Movable_DimMin", 50},
{"Frame_Slide_Movable_DimStd", 55},
{"Frame_Slide_Threshold_DimMax", 10},
{"Frame_Slide_Threshold_DimMin", 3},
{"Frame_Slide_Threshold_DimStd", 4},
{"Frame_Slide_Top_DimMax", 60},
{"Frame_Slide_Top_DimMin", 50},
{"Frame_Slide_Top_DimStd", 55},
{"Sash_Fill_Rail_DimMax", 80},
{"Sash_Fill_Rail_DimMin", 70},
{"Sash_Fill_Rail_DimStd", 78},
{"Sash_Frame_Bottom_DimMax", 80},
{"Sash_Frame_Bottom_DimMin", 70},
{"Sash_Frame_Bottom_DimStd", 78},
{"Sash_Frame_Top_DimMax", 80},
{"Sash_Frame_Top_DimMin", 70},
{"Sash_Frame_Top_DimStd", 78},
{"Sash_French_In_DimMax", 80},
{"Sash_French_In_DimMin", 70},
{"Sash_French_In_DimStd", 78},
{"Sash_French_Out_DimMax", 80},
{"Sash_French_Out_DimMin", 70},
{"Sash_French_Out_DimStd", 78},
{"Sash_Rail_Bottom_DimMax", 80},
{"Sash_Rail_Bottom_DimMin", 70},
{"Sash_Rail_Bottom_DimStd", 78},
{"Sash_Rail_DimMax", 80},
{"Sash_Rail_DimMin", 70},
{"Sash_Rail_DimStd", 78},
{"Sash_Sash_Active_DimMax", 80},
{"Sash_Sash_Active_DimMin", 70},
{"Sash_Sash_Active_DimStd", 78},
{"Sash_Sash_Inactive_DimMax", 80},
{"Sash_Sash_Inactive_DimMin", 70},
{"Sash_Sash_Inactive_DimStd", 78},
{"Sash_Sash_Split_DimMax", 70},
{"Sash_Sash_Split_DimMin", 50},
{"Sash_Sash_Split_DimStd", 60},
{"Sash_Slide_Active_DimMax", 90},
{"Sash_Slide_Active_DimMin", 70},
{"Sash_Slide_Active_DimStd", 80},
{"Sash_Slide_Active_In_DimMax", 90},
{"Sash_Slide_Active_In_DimMin", 70},
{"Sash_Slide_Active_In_DimStd", 80},
{"Sash_Slide_Fixed_Bottom_DimMax", 150},
{"Sash_Slide_Fixed_Bottom_DimMin", 120},
{"Sash_Slide_Fixed_Bottom_DimStd", 135},
{"Sash_Slide_Fixed_Side_DimMax", 90},
{"Sash_Slide_Fixed_Side_DimMin", 70},
{"Sash_Slide_Fixed_Side_DimStd", 80},
{"Sash_Slide_Fixed_Top_DimMax", 90},
{"Sash_Slide_Fixed_Top_DimMin", 70},
{"Sash_Slide_Fixed_Top_DimStd", 80},
{"Sash_Slide_Inactive_DimMax", 90},
{"Sash_Slide_Inactive_DimMin", 70},
{"Sash_Slide_Inactive_DimStd", 80},
{"Sash_Slide_MovableBack_Bottom_DimMax", 150},
{"Sash_Slide_MovableBack_Bottom_DimMin", 120},
{"Sash_Slide_MovableBack_Bottom_DimStd", 135},
{"Sash_Slide_MovableBack_Side_DimMax", 90},
{"Sash_Slide_MovableBack_Side_DimMin", 70},
{"Sash_Slide_MovableBack_Side_DimStd", 80},
{"Sash_Slide_MovableBack_Top_DimMax", 90},
{"Sash_Slide_MovableBack_Top_DimMin", 70},
{"Sash_Slide_MovableBack_Top_DimStd", 80},
{"Sash_Slide_Movable_Bottom_DimMax", 150},
{"Sash_Slide_Movable_Bottom_DimMin", 120},
{"Sash_Slide_Movable_Bottom_DimStd", 135},
{"Sash_Slide_Movable_Side_DimMax", 90},
{"Sash_Slide_Movable_Side_DimMin", 70},
{"Sash_Slide_Movable_Side_DimStd", 80},
{"Sash_Slide_Movable_Top_DimMax", 90},
{"Sash_Slide_Movable_Top_DimMin", 70},
{"Sash_Slide_Movable_Top_DimStd", 80}
};
private Dictionary<string, double> ParamProfiloSaomad = new Dictionary<string, double>()
{
{"Frame_Frame_Split_DimMax", 85},
{"Frame_Frame_Split_DimMin", 55},
{"Frame_Frame_Split_DimStd", 60},
{"Frame_Mixed_Bottom_DimMax", 80},
{"Frame_Mixed_Bottom_DimMin", 70},
{"Frame_Mixed_Bottom_DimStd", 78},
{"Frame_Mixed_Split_DimMax", 110},
{"Frame_Mixed_Split_DimMin", 70},
{"Frame_Mixed_Split_DimStd", 90},
{"Frame_Mixed_Top_DimMax", 80},
{"Frame_Mixed_Top_DimMin", 70},
{"Frame_Mixed_Top_DimStd", 78},
{"Frame_Rail_Bottom_DimMax", 80}
};
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
protected string SelColorMaterial { get; set; } = "";
protected string SelFamilyHardware { get; set; } = "";
protected string SelGlass { get; set; } = "";
protected string SelMaterial { get; set; } = "";
#endregion Protected Properties
#region Protected Methods
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override async Task OnInitializedAsync()
{
ConfInit();
User = true;
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
//initialJwd = File.ReadAllText("Data\\FinestraSplitGrid.jwd");
InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd");
//initialJwd = File.ReadAllText("Data\\ArcoAntaDoppia.jwd");
currJwd = InitialJwd;
// rileggo altri dati
await ReloadData();
// costruisco lista profili
ProfilePayload pp1 = new ProfilePayload()
{
ProfileName = "Profilo78",
ThresholdList = ThresholdProfilo78,
ParameterDict = ParamProfilo78
};
ProfilePayload pp2 = new ProfilePayload()
{
ProfileName = "ProfiloSaomad",
ThresholdList = ThresholdProfiloSaomad,
ParameterDict = ParamProfiloSaomad
};
AvailProfileList = new List<ProfilePayload> { pp1, pp2 };
// preparo conf oggetti x controllo
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Wood = AvailMaterialList,
ProfileList = AvailProfileList
};
CurrData = new LivePayload()
{
CurrJwd = InitialJwd,
SvgPreview = currSvg,
DictShape = currGroupShape,
DictOptionsXml = currHwOption
};
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage += PipeHwOption_EA_NewMessage;
}
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string windowUid = "CurrWindow";
private string cFileHardware = "Hardware/Setup.json";
private string currSvg = "";
private string GenericBasePath = "";
//private string colorMassUpdate;
//private string familyHWMassUpdate;
//private string glassMassUpdate;
//private Hardware hardwareMassUpdate;
//private string materialMassUpdate;
//private string profileMassUpdate;
/// <summary>
/// Semaforo x definire se sia già in modalità ionterattiva o di prerendering
/// </summary>
private bool isInteractive = false;
private string outClose = "";
private string outSave = "";
private string imgBasePath = "";
private string channelHwOpt = "";
private string channelShape = "";
private string channelSvg = "";
#endregion Private Fields
#region Private Methods
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(DataSave reqSave)
{
currJwd = reqSave.currJwd;
outClose = !reqSave.ForceSave ? "Richiesto chiusura!" : "";
outSave = reqSave.ForceSave ? "Richiesto salvataggio!" : "";
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSvg = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
channelShape = Config.GetValue<string>("ServerConf:ChannelShape") ?? "";
channelHwOpt = Config.GetValue<string>("ServerConf:ChannelHwOpt") ?? "";
}
/// <summary>
/// Esecuzione azione richiesta
/// </summary>
/// <param name="actReq">Azione richiesta</param>
private void DoAction(DataAction actReq)
{
switch (actReq)
{
case DataAction.None:
break;
case DataAction.ResetDictShape:
CurrData.DictShape = new Dictionary<int, string>();
break;
case DataAction.ResetHwOpt:
CurrData.DictOptionsXml = new Dictionary<int, string>();
break;
default:
break;
}
}
/// <summary>
/// Esecuzione richiesta
/// </summary>
/// <param name="CurrArgs"></param>
/// <returns></returns>
private async Task ExecRequest(Dictionary<string, string> CurrArgs)
{
// Proseguo solo se sono in interattivo (NO prerender pagina)
if (isInteractive)
{
outClose = "";
outSave = "";
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("SerializedData"))
{
currJwd = CurrArgs["SerializedData"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs))
{
m_CurrArgs = CurrArgs;
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
}
private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.StartsWith($"{channelHwOpt}:{windowUid}") && currArgs.newMessage.Length > 2)
{
// deserializzo il dizionario delle risposte...
Dictionary<int, string> rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage) ?? new Dictionary<int, string>();
if (rawDict.Count > 0)
{
currHwOption = rawDict;
CurrData.DictOptionsXml = currHwOption;
}
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeShape_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelShape}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage);
currGroupShape = rawDict ?? new Dictionary<int, string>();
CurrData.DictShape = currGroupShape;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSvg}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private Task ReloadData()
{
//return base.OnInitializedAsync();
AvailHardwareList = new List<Hardware>();
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
return Task.Delay(100);
}
private void updateInfoJwd(string currSer, string? newFamilyHardware, Hardware? newHardware, string? newColorMaterial, string? newMaterial, string? newGlass, string? newProfile)
{
Dictionary<string, string> DictParam = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(newFamilyHardware))
DictParam.Add("FamilyHardware", newFamilyHardware!);
if (!string.IsNullOrEmpty(newColorMaterial))
DictParam.Add("Color", newColorMaterial!);
if (!string.IsNullOrEmpty(newMaterial))
DictParam.Add("Material", newMaterial!);
if (!string.IsNullOrEmpty(newGlass))
DictParam.Add("Glass", newGlass!);
if (!string.IsNullOrEmpty(newProfile))
DictParam.Add("Profile", newProfile!);
var dp = SerialMan.MassUpdate(currSer, DictParam);
CurrData.CurrJwd = dp.serializeStruct;
//var newJwd = SerialMan.MassUpdate(currSer, shape, newFamilyHardware, newHardware, newColorMaterial, newMaterial, newGlass, newProfile);
//CurrData.CurrJwd = newJwd;
}
#endregion Private Methods
}
}
+9 -93
View File
@@ -1,95 +1,14 @@
@page "/"
@page "/EditJWD"
@page "/EditJWD"
@rendermode InteractiveServer
<PageTitle>EditJWD</PageTitle>
@* <div class="row mb-2">
<div class="col-6">
<div class="input-group mb-2 justify-content-center">
<span class="input-group-text">FamilyHw</span>
<select class="form-select" @bind="familyHWMassUpdate">
@foreach (var item in AvailFamilyHardwareList)
{
<option value="@item">@item</option>
}
</select>
</div>
</div>
<div class="col-6">
<div class="input-group mb-2 justify-content-center">
<span class="input-group-text">Color</span>
<select class="form-select" @bind="colorMassUpdate">
@foreach (var item in AvailColorMaterialList)
{
<option value="@item">@item</option>
}
</select>
</div>
</div>
<div class="col-6">
<div class="input-group mb-2 justify-content-center">
<span class="input-group-text">Wood</span>
<select class="form-select" @bind="woodMassUpdate">
@foreach (var item in AvailWoodList)
{
<option value="@item">@item</option>
}
</select>
</div>
</div>
<div class="col-6">
<div class="input-group mb-2 justify-content-center">
<span class="input-group-text">Glass</span>
<select class="form-select" @bind="glassMassUpdate">
@foreach (var item in AvailGlassList)
{
<option value="@item">@item</option>
}
</select>
</div>
</div>
<div class="col-6">
<div class="input-group mb-2 justify-content-center">
<span class="input-group-text">Profile</span>
<select class="form-select" @bind="profileMassUpdate">
@foreach (var item in DescriptionProfileList)
{
<option value="@item">@item</option>
}
</select>
</div>
</div>
</div>
<div class="row mb-2">
<div class="col-2">
<button class="btn btn-outline-secondary btn-sm" @onclick="() => UpdateInfoJwdAsync(CurrData.CurrJwd, familyHWMassUpdate, colorMassUpdate, woodMassUpdate, glassMassUpdate, profileMassUpdate)">Save</button>
</div>
</div> *@
@if (doEdit)
{
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveData="CurrData"
PendReq="DictPendReq"
baseUser="User"
EC_ActionReq="DoAction"
EC_DoUpdate="ExecRequest"
EC_OnClose="CloseObj"
EC_UpdateReqPend="PendAction">
</WebWindowComplex.TableComp>
}
else
{
<div class="d-flex justify-content-between">
<div class="px-0">
<button class="btn btn-primary" @onclick="SetEdit">Click per editare</button>
</div>
<div class="px-0">
<button class="btn btn-primary" @onclick="() => ToggleJwd()">Toggle JWD</button>
</div>
</div>
}
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveData="CurrData"
EC_OnUpdate="SaveJWD"
EC_OnClose="CloseObj">
</WebWindowComplex.TableComp>
@if (!string.IsNullOrEmpty(outClose))
{
@@ -103,9 +22,6 @@ else if (!string.IsNullOrEmpty(outSave))
@outSave
</div>
}
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
<p>
@currJwd
</p>
+165 -413
View File
@@ -1,56 +1,86 @@
using Egw.Window.Data;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.DbModel.Config;
using EgwCoreLib.Lux.Data.DbModel.Utils;
using EgwCoreLib.Lux.Data.Services;
using EgwCoreLib.Lux.Data.Services.Config;
using EgwCoreLib.Lux.Data.Services.Utils;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using NLog;
using System.Diagnostics;
using System.Security.AccessControl;
using Egw.Window.Data;
using WebWindowComplex;
using WebWindowComplex.DTO;
using static WebWindowComplex.LayoutConst;
namespace Test.UI.Components.Pages
{
public partial class EditJWD : IDisposable
{
#region Public Properties
public string InitialJwd = "";
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
#endregion Public Properties
#region Public Methods
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage -= PipeHwOption_EA_NewMessage;
DLService.PipeProfElement.EA_NewMessage -= PipeProfElement_EA_NewMessage;
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
/// <summary>
/// Dizionario richieste pendenti
/// </summary>
protected Dictionary<string, string> DictPendReq = new();
/// <summary>
/// Livello di accesso
/// -- true: utente base (versione semplificata)
/// -- false: utente avanzato (versione completa)
/// </summary>
protected bool User = false;
protected string currJwd = "...";
protected string prevJwd = "";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
#endregion Protected Fields
#region Protected Properties
protected List<TemplateSelectDTO> AvailTemplateList { get; set; } = new List<TemplateSelectDTO>();
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("Profilo78"),
new string("Arc")
};
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected string SelFamilyHardware { get; set; } = "";
protected string SelColorMaterial { get; set; } = "";
protected string SelMaterial { get; set; } = "";
protected string SelGlass { get; set; } = "";
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
@@ -60,409 +90,72 @@ namespace Test.UI.Components.Pages
#region Protected Methods
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override async Task OnInitializedAsync()
{
ConfInit();
await ReloadBaseList();
User = false;
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
currJwd = initialJwd;
InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd");
currJwd = InitialJwd;
// rileggo altri dati
//await ReloadData();
// converto i profili nel nuovo formato x payload...
var profList = AvailProfileList.Select(x => new ProfilePayload()
{
ProfileName = x.Code,
ThresholdList = x.ThresholdList,
ParameterDict = x.ProfileDataDict
}).ToList();
await ReloadData();
// preparo conf oggetti x controllo
SetupList = new BaseListPayload()
SetupList = SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Wood = AvailWoodList,
ProfileList = profList
Material = AvailMaterialList,
TemplateDTO = null
};
CurrData = new LivePayload()
{
CurrJwd = currJwd,
SvgPreview = currSvg,
DictShape = currGroupShape,
DictOptionsXml = currHwOption
InitJwd = InitialJwd,
SvgPreview = currSvg
};
DescriptionProfileList = profList.Select(x => x.ProfileName).ToList();
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage += PipeHwOption_EA_NewMessage;
DLService.PipeProfElement.EA_NewMessage += PipeProfElement_EA_NewMessage;
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
}
#endregion Protected Methods
#region Private Properties
[Inject]
private ConfigDataService CDService { get; set; } = default!;
[Inject]
private IConfGlassService CGService { get; set; } = null!;
[Inject]
private IConfProfileService CPService { get; set; } = null!;
[Inject]
private IConfWoodService CWService { get; set; } = null!;
[Inject]
private IGenValService GVService { get; set; } = default!;
[Inject]
private IConfiguration Config { get; set; } = null!;
[Inject]
private DataLayerServices DLService { get; set; } = null!;
[Inject]
private ImageCacheService ICService { get; set; } = null!;
private string SelColorMaterial { get; set; } = "";
private string SelFamilyHardware { get; set; } = "";
private string SelGlass { get; set; } = "";
private string SelWood { get; set; } = "";
#endregion Private Properties
#region Private Fields
private List<GlassModel> AllConfGlass = new();
private List<GenValueModel> AllColors = new();
private List<HardwareModel> AllConfHardware = new();
private List<WoodModel> AllConfWood = new();
private List<string> AvailColorMaterialList = new List<string>();
private List<string> AvailFamilyHardwareList = new List<string>();
private List<string> AvailGlassList = new List<string>();
private List<Hardware> AvailHardwareList = new();
private List<string> AvailWoodList = new List<string>();
private List<ProfileModel> AvailProfileList = new();
private List<string> DescriptionProfileList = new();
private EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS cEnvir = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
private LivePayload CurrData = new LivePayload();
protected LivePayload CurrData = new LivePayload();
private List<AreaProfiles> currElement = new List<AreaProfiles>();
#endregion Protected Methods
private Dictionary<int, string> currGroupShape = new Dictionary<int, string>();
private Dictionary<int, string> currHwOption = new Dictionary<int, string>();
private string currJwd = "...";
private Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
private string prevJwd = "";
#region Private Fields
private string apiUrl = "";
///// <summary>
///// Lista profili da DB
///// </summary>
//private List<ProfilePayload> AvailProfileList = new List<ProfilePayload>();
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFileTemplate = "Data/Setup.json";
private string cFileHardware = "Hardware/Setup.json";
private string channelHwOpt = "";
private string channelProfElem = "";
private string channelProfList = "";
private string channelShape = "";
private string channelSvg = "";
private TemplateSelectDTO? currSel = null;
private string currSvg = "";
private bool doEdit = false;
private string imgBasePath = "";
private string GenericBasePath = "";
private string imgBasePath = "";
/// <summary>
/// Semaforo x definire se sia già in modalità ionterattiva o di prerendering
/// </summary>
private bool isInteractive = false;
private string colorMassUpdate;
private string familyHWMassUpdate;
private string glassMassUpdate;
private Hardware hardwareMassUpdate;
private string woodMassUpdate;
private string profileMassUpdate;
private string outClose = "";
private string outSave = "";
private bool startEmpty = true;
private string subChannel = "";
private string windowUid = "CurrWindow";
#endregion Private Fields
#region Private Properties
private string initialJwd
{
get
{
if (startEmpty)
{
return "{}";
}
else
{
string fullPath = Path.Combine("Data", "AntaDoppia.jwd");
return File.ReadAllText(fullPath);
//return File.ReadAllText("Data\\AntaDoppiaInglesine.jwd");
}
}
}
#endregion Private Properties
#region Private Methods
/// <summary>
/// Init classi configurazione
/// </summary>
/// <returns></returns>
private async Task ReloadBaseList()
{
// lettura config setup varie da DB/Cache Redis
AllConfGlass = await CGService.GetAllAsync();
AvailProfileList = await CPService.GetAllAsync();
// FixMe Todo: eliminare da REDIS e usare elenco DB solamente...
var rawProfiles = CDService.ProfileList(cEnvir, "Default");
// se fosse vuoto chiamo update...
if (rawProfiles == null || rawProfiles.Count == 0)
{
rawProfiles = CDService.ProfileList(cEnvir, "Default");
}
var rawHw = CDService.HwModelList(cEnvir, "HW.AGB");
// hw filtro solo validi...
AllConfHardware = rawHw
.Where(x => !x.FamilyName.Equals(x.Description, StringComparison.OrdinalIgnoreCase))
.ToList();
AllConfWood = await CWService.GetAllAsync();
AllColors = await GVService.GetFiltAsync("WoodCol");
// conversione tipi
AvailGlassList = AllConfGlass
.Select(x => x.Description)
.ToList();
AvailFamilyHardwareList = AllConfHardware
.DistinctBy(x => x.FamilyName)
.OrderBy(x => x.FamilyName)
.Select(x => x.FamilyName)
.ToList();
AvailHardwareList = AllConfHardware
.Select(x => new Egw.Window.Data.Hardware(x.Id, x.FamilyName, x.Description, x.OpeningType, x.Shape, x.SashQty, x.SashPosition))
.ToList();
AvailWoodList = AllConfWood
.Select(x => x.Description)
.ToList();
AvailColorMaterialList = AllColors
.OrderBy(x => x.Index)
.Select(x => x.ValString)
.ToList();
}
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(DataSave reqSave)
{
currJwd = reqSave.ForceSave ? reqSave.currJwd : initialJwd;
outClose = !reqSave.ForceSave ? "Richiesto Close!" : "";
outSave = reqSave.ForceSave ? "Richiesto Close + Save!" : "";
doEdit = false;
}
private void PendAction(Dictionary<string, string> args)
{
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSvg = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
channelShape = Config.GetValue<string>("ServerConf:ChannelShape") ?? "";
channelHwOpt = Config.GetValue<string>("ServerConf:ChannelHwOpt") ?? "";
channelProfElem = Config.GetValue<string>("ServerConf:ChannelProfElem") ?? "";
channelProfList = Config.GetValue<string>("ServerConf:ChannelProfList") ?? "";
}
/// <summary>
/// Esecuzione azione richiesta
/// </summary>
/// <param name="actReq">Azione richiesta</param>
private void DoAction(DataAction actReq)
{
switch (actReq)
{
case DataAction.None:
break;
case DataAction.ResetDictShape:
CurrData.DictShape = new Dictionary<int, string>();
break;
case DataAction.ResetHwOpt:
CurrData.DictOptionsXml = new Dictionary<int, string>();
break;
case DataAction.ResetDimElem:
CurrData.ProfElementList = new List<AreaProfiles>();
break;
default:
break;
}
}
/// <summary>
/// Esecuzione richiesta
/// </summary>
/// <param name="CurrArgs"></param>
/// <returns></returns>
private async Task ExecRequest(Dictionary<string, string> CurrArgs)
{
// Proseguo solo se sono in interattivo (NO prerender pagina)
if (isInteractive)
{
outClose = "";
outSave = "";
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("SerializedData"))
{
currJwd = CurrArgs["SerializedData"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs))
{
m_CurrArgs = CurrArgs;
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
}
private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e)
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.StartsWith($"{channelHwOpt}:{windowUid}") && currArgs.newMessage.Length > 2)
{
// deserializzo il dizionario delle risposte...
Dictionary<int, string> rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage) ?? new Dictionary<int, string>();
if (rawDict.Count > 0)
currHwOption = rawDict;
}
else
{
currHwOption = new Dictionary<int, string>();
}
CurrData.DictOptionsXml = currHwOption;
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeProfElement_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelProfElem}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<List<AreaProfiles>>(currArgs.newMessage);
currElement = rawDict ?? new List<AreaProfiles>();
CurrData.ProfElementList = currElement;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeShape_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelShape}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage);
currGroupShape = rawDict ?? new Dictionary<int, string>();
CurrData.DictShape = currGroupShape;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSvg}:{windowUid}"))
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
@@ -472,42 +165,101 @@ namespace Test.UI.Components.Pages
await Task.Delay(1);
}
private void SetEdit(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
private void ConfInit()
{
doEdit = true;
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
private Task ToggleJwd()
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private async Task ReloadData()
{
startEmpty = !startEmpty;
currJwd = initialJwd;
currSvg = "";
CurrData.CurrJwd = currJwd;
CurrData.SvgPreview = currSvg;
return InvokeAsync(StateHasChanged);
//return base.OnInitializedAsync();
AvailTemplateList = new List<TemplateSelectDTO>();
AvailHardwareList = new List<Hardware>();
// brutale, da rivedere...
if (string.IsNullOrEmpty(InitialJwd))
{
if (File.Exists(cFileTemplate))
{
string rawVal = File.ReadAllText(cFileTemplate);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
foreach (var item in rawList)
{
item.ImageUrl = ICService.ImageUrl($"{apiUrl}/{imgBasePath}", false, item.SVGFileName);
AvailTemplateList.Add(item);
}
}
}
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
await Task.Delay(100);
}
private async Task UpdateInfoJwdAsync(string currSer, string? newFamilyHardware, string? newColorMaterial, string? newWood, string? newGlass, string? newProfile)
private async Task SaveJWD(Dictionary<string, string> CurrArgs)
{
Dictionary<string, string> DictParam = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(newFamilyHardware))
DictParam.Add("FamilyHardware", newFamilyHardware!);
if (!string.IsNullOrEmpty(newColorMaterial))
DictParam.Add("Color", newColorMaterial!);
if (!string.IsNullOrEmpty(newWood))
DictParam.Add("Wood", newWood!);
if (!string.IsNullOrEmpty(newGlass))
DictParam.Add("Glass", newGlass!);
if (!string.IsNullOrEmpty(newProfile))
DictParam.Add("Profile", newProfile!);
var dp = SerialMan.MassUpdate(currSer, DictParam);
CurrData.CurrJwd = dp.serializeStruct;
if (dp.DictParameter.Count > 0)
DictPendReq = DictParam;
//var newJwd = SerialMan.MassUpdate(currSer, newFamilyHardware, newHardware, newColorMaterial, newMaterial, newGlass, newProfile);
//CurrData.CurrJwd = newJwd;
outClose = "";
outSave = "";
m_CurrArgs = CurrArgs;
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("Jwd"))
{
currJwd = CurrArgs["Jwd"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd))
{
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
private void SetTemplate(TemplateSelectDTO selTemp)
{
string rawVal = "";
currSel = selTemp;
// brutale,d a rivedere...
if (File.Exists(selTemp.JwdFileName))
{
rawVal = File.ReadAllText(selTemp.JwdFileName);
}
SelTemplate = new Template(selTemp.Index, selTemp.Description, selTemp.SVGFileName, rawVal);
}
#endregion Private Methods
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(bool reqSave)
{
outClose = !reqSave ? "Richiesto chiusura!" : "";
outSave = reqSave ? "Richiesto salvataggio!" : "";
}
private string outClose = "";
private string outSave = "";
}
}
+36
View File
@@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>
@code{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
private string? RequestId { get; set; }
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
protected override void OnInitialized() =>
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
}
+35
View File
@@ -0,0 +1,35 @@
@page "/Gerarchia"
@rendermode InteractiveServer
<PageTitle>Gerarchia</PageTitle>
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveDaListPayloadta="CurrData"
CurrSelection="SelectData"
EC_OnUpdate="SaveJWD"
EC_OnClose="CloseObj"
EC_OnSelectedTemplate="SetTemplate">
</WebWindowComplex.TableComp>
@if (!string.IsNullOrEmpty(outClose))
{
<div class="alert alert-danger fs-4">
@outClose
</div>
}
else if (!string.IsNullOrEmpty(outSave))
{
<div class="alert alert-success fs-4">
@outSave
</div>
}
<p>
@(temp);
</p>
@*
<p>
@m_CurrArgs.GetValueOrDefault("Jwd")
</p> *@
+280
View File
@@ -0,0 +1,280 @@
using Egw.Window.Data;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using NLog;
using System.Diagnostics;
using System.Numerics;
using System.Security.AccessControl;
using WebWindowComplex;
using WebWindowComplex.DTO;
namespace Test.UI.Components.Pages
{
public partial class Gerarchia : IDisposable
{
#region Public Properties
string temp = "";
public string InitialJwd = "";
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
#endregion Public Properties
#region Public Methods
public void Dispose()
{
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
protected string currJwd = "...";
protected string prevJwd = "";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
#endregion Protected Fields
#region Protected Properties
protected List<TemplateSelectDTO> AvailTemplateList { get; set; } = new List<TemplateSelectDTO>();
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("Profilo78"),
new string("Arc")
};
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected string SelFamilyHardware { get; set; } = "";
protected string SelColorMaterial { get; set; } = "";
protected string SelMaterial { get; set; } = "";
protected string SelGlass { get; set; } = "";
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
ConfInit();
// rileggo altri dati
await ReloadData();
// preparo conf oggetti x controllo
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Material = AvailMaterialList,
TemplateDTO = AvailTemplateList
};
CurrData = new LivePayload()
{
//CurrJwd = InitialJwd,
CurrJwd = "",
SvgPreview = currSvg
};
SelectData = new SelectPayload()
{
FamilyHardware = "Profilo78",
ColorMaterial = "Black",
Material = "Pino",
Glass = "Vetro BE 2S 4T / 16 / 4T",
Template = null,
};
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
}
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
/// <summary>
/// Predisposizione elementi selezionati
/// </summary>
protected SelectPayload SelectData = new SelectPayload();
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFileTemplate = "Data/Setup.json";
private string cFileHardware = "Hardware/Setup.json";
private TemplateSelectDTO? currSel = null;
private string currSvg = "";
private string imgBasePath = "";
private string GenericBasePath = "";
private string subChannel = "";
private string windowUid = "CurrWindow";
private string outClose = "";
private string outSave = "";
#endregion Private Fields
#region Private Methods
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
m_CurrArgs.TryGetValue("Jwd", out temp);
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private async Task ReloadData()
{
//return base.OnInitializedAsync();
AvailTemplateList = new List<TemplateSelectDTO>();
AvailHardwareList = new List<Hardware>();
// brutale, da rivedere...
if (string.IsNullOrEmpty(InitialJwd))
{
if (File.Exists(cFileTemplate))
{
string rawVal = File.ReadAllText(cFileTemplate);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
foreach (var item in rawList)
{
item.ImageUrl = ICService.ImageUrl($"{apiUrl}/{imgBasePath}", false, item.SVGFileName);
AvailTemplateList.Add(item);
}
}
}
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
await Task.Delay(100);
}
private async Task SaveJWD(Dictionary<string, string> CurrArgs)
{
outClose = "";
outSave = "";
m_CurrArgs = CurrArgs;
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("Jwd"))
{
currJwd = CurrArgs["Jwd"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd))
{
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
private void SetTemplate(TemplateSelectDTO selTemp)
{
string rawVal = "";
currSel = selTemp;
// brutale,da rivedere...
if (File.Exists(selTemp.JwdFileName))
{
rawVal = File.ReadAllText(selTemp.JwdFileName);
}
SelTemplate = new Template(selTemp.Index, selTemp.Description, selTemp.SVGFileName, rawVal);
SelectData.Template = SelTemplate;
}
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(bool reqSave)
{
outClose = !reqSave ? "Richiesto chiusura!" : "";
outSave = reqSave ? "Richiesto salvataggio!" : "";
}
#endregion Private Methods
}
}
+14 -30
View File
@@ -1,39 +1,23 @@
@page "/Home"
@page "/"
@page "/Home"
@rendermode InteractiveServer
<PageTitle>Select template</PageTitle>
<PageTitle>Home</PageTitle>
@if(SelTemplate == null)
@if (isLoading)
{
<WebWindowMaker TemplateDTOList="@AvailTemplateList"
EC_OnSelectedTemplate="SetTemplate">
</WebWindowMaker>
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
}
else
{
<TableComp ListPayload="SetupList"
LiveData="CurrData"
EC_ActionReq="DoAction"
EC_DoUpdate="ExecRequest"
EC_OnClose="CloseObj">
</TableComp>
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
}
@if (!string.IsNullOrEmpty(outClose))
{
<div class="alert alert-danger fs-4">
@outClose
</div>
}
else if (!string.IsNullOrEmpty(outSave))
{
<div class="alert alert-success fs-4">
@outSave
</div>
<WebWindowMaker IN_TemplateDTOList="@AvailTemplateList"
IN_SelTemplate="@SelTemplate"
EC_OnUpdate="SaveJWD"
EC_OnSelectedTemplate="SetTemplate"
LiveSVG="@currSvg">
</WebWindowMaker>
}
@* <p>
@m_CurrArgs.GetValueOrDefault("Jwd")
</p> *@
+56 -223
View File
@@ -4,9 +4,6 @@ using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using WebWindowConfigurator;
using WebWindowComplex;
using Egw.Window.Data;
using WebWindowComplex.DTO;
using WebWindowConfigurator.DTO;
namespace Test.UI.Components.Pages
@@ -15,7 +12,7 @@ namespace Test.UI.Components.Pages
{
#region Public Properties
public Template SelTemplate { get; set; } = new Template(0, "", "", "") ;
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
#endregion Public Properties
@@ -23,30 +20,15 @@ namespace Test.UI.Components.Pages
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage -= PipeHwOption_EA_NewMessage;
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
protected Dictionary<int, string> currGroupShape = new Dictionary<int, string>();
protected Dictionary<int, string> currHwOption = new Dictionary<int, string>();
protected string currJwd = "";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
protected string prevJwd = "";
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
#endregion Protected Fields
@@ -54,37 +36,6 @@ namespace Test.UI.Components.Pages
protected List<TemplateSelectDTO> AvailTemplateList { get; set; } = new List<TemplateSelectDTO>();
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("ArTech"),
new string("ArTechPlana")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
[Inject]
protected IConfiguration Config { get; set; } = null!;
@@ -107,26 +58,16 @@ namespace Test.UI.Components.Pages
#region Protected Methods
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override Task OnInitializedAsync()
protected override async Task OnInitializedAsync()
{
isLoading = true;
ConfInit();
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage += PipeHwOption_EA_NewMessage;
return ReloadData();
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
await ReloadData();
}
private bool isLoading = false;
#endregion Protected Methods
#region Private Fields
@@ -134,41 +75,50 @@ namespace Test.UI.Components.Pages
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFileTemplate = "Data/Setup.json";
private string cFile = "Data/Setup.json";
private TemplateSelectDTO? currSel = null;
private string currSvg = "";
private string channelHwOpt = "";
private string channelShape = "";
private string channelSvg = "";
private string imgBasePath = "";
private string GenericBasePath = "";
private string cFileHardware = "Hardware/Setup.json";
private string outClose = "";
private string outSave = "";
private string windowUid = "CurrWindow";
/// <summary>
/// Semaforo x definire se sia già in modalità ionterattiva o di prerendering
/// </summary>
private bool isInteractive = false;
private string subChannel = "";
#endregion Private Fields
#region Private Properties
private string windowUid = "CurrWindow";
//{
// get
// {
// string answ = "";
// if (currSel != null)
// {
// answ = currSel.SVGFileName.Replace(".svg", "");
// }
// return answ;
// }
//}
#endregion Private Properties
#region Private Methods
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(DataSave reqSave)
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
currJwd = reqSave.currJwd;
outClose = !reqSave.ForceSave ? "Richiesto chiusura!" : "";
outSave = reqSave.ForceSave ? "Richiesto salvataggio!" : "";
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
{
currSvg = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private void ConfInit()
@@ -177,118 +127,7 @@ namespace Test.UI.Components.Pages
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSvg = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
channelShape = Config.GetValue<string>("ServerConf:ChannelShape") ?? "";
channelHwOpt = Config.GetValue<string>("ServerConf:ChannelHwOpt") ?? "";
}
/// <summary>
/// Esecuzione azione richiesta
/// </summary>
/// <param name="actReq">Azione richiesta</param>
private void DoAction(LayoutConst.DataAction actReq)
{
switch (actReq)
{
case LayoutConst.DataAction.None:
break;
case LayoutConst.DataAction.ResetDictShape:
CurrData.DictShape = new Dictionary<int, string>();
break;
case LayoutConst.DataAction.ResetHwOpt:
CurrData.DictOptionsXml = new Dictionary<int, string>();
break;
default:
break;
}
}
private async Task ExecRequest(Dictionary<string, string> CurrArgs)
{
// Proseguo solo se sono in interattivo (NO prerender pagina)
if (isInteractive)
{
outClose = "";
outSave = "";
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("SerializedData"))
{
currJwd = CurrArgs["SerializedData"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs))
{
m_CurrArgs = CurrArgs;
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
}
private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.StartsWith($"{channelHwOpt}:{windowUid}") && currArgs.newMessage.Length > 2)
{
// deserializzo il dizionario delle risposte...
Dictionary<int, string> rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage) ?? new Dictionary<int, string>();
if (rawDict.Count > 0)
{
currHwOption = rawDict;
CurrData.DictOptionsXml = currHwOption;
}
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSvg}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeShape_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelShape}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage);
currGroupShape = rawDict ?? new Dictionary<int, string>();
CurrData.DictShape = currGroupShape;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
/// <summary>
@@ -297,13 +136,13 @@ namespace Test.UI.Components.Pages
/// <returns></returns>
private async Task ReloadData()
{
// Caricamento lista Template
//return base.OnInitializedAsync();
AvailTemplateList = new List<TemplateSelectDTO>();
await Task.Delay(100);
// brutale, da rivedere...
if (File.Exists(cFileTemplate))
if (File.Exists(cFile))
{
string rawVal = File.ReadAllText(cFileTemplate);
string rawVal = File.ReadAllText(cFile);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
@@ -314,16 +153,19 @@ namespace Test.UI.Components.Pages
AvailTemplateList.Add(item);
}
}
// Caricamento lista hardware
AvailHardwareList = new List<Hardware>();
if (File.Exists(cFileHardware))
isLoading = false;
}
private async Task SaveJWD(Dictionary<string,string> CurrArgs)
{
m_CurrArgs = CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
if (currSel != null)
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
@@ -337,15 +179,6 @@ namespace Test.UI.Components.Pages
rawVal = File.ReadAllText(selTemp.JwdFileName);
}
SelTemplate = new Template(selTemp.Index, selTemp.Description, selTemp.SVGFileName, rawVal);
CurrData.CurrJwd = rawVal;
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Wood = AvailMaterialList
};
}
#endregion Private Methods
@@ -1,31 +0,0 @@
@page "/SimpleEditOld"
@rendermode InteractiveServer
<PageTitle>SimpleEditOld</PageTitle>
<WebWindowTest.Test ListPayload="SetupList"
LiveData="CurrData"
EC_ActionReq="DoAction"
EC_DoUpdate="ExecRequest"
EC_OnClose="CloseObj">
</WebWindowTest.Test>
@if (!string.IsNullOrEmpty(outClose))
{
<div class="alert alert-danger fs-4">
@outClose
</div>
}
else if (!string.IsNullOrEmpty(outSave))
{
<div class="alert alert-success fs-4">
@outSave
</div>
}
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
@@ -1,350 +0,0 @@
using Egw.Window.Data;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using WebWindowTest.DTO;
using static WebWindowTest.LayoutConst;
namespace Test.UI.Components.Pages
{
public partial class SimpleEditOld : IDisposable
{
#region Public Fields
public string InitialJwd = "";
#endregion Public Fields
#region Public Methods
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage -= PipeHwOption_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
protected Dictionary<int, string> currGroupShape = new Dictionary<int, string>();
protected Dictionary<int, string> currHwOption = new Dictionary<int, string>();
protected string currJwd = "...";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
protected string prevJwd = "";
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
#endregion Protected Fields
#region Protected Properties
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Wood"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("ArTech"),
new string("ArTechPlana")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
protected List<string> AvailProfileList { get; set; } = new List<string>()
{
new string("Profilo78"),
new string("ProfiloSaomad")
};
protected Dictionary<string, List<Threshold>> AvailThreshold { get; set; } = new Dictionary<string, List<Threshold>>()
{
{"Profilo78", new List<Threshold>() { new Threshold(3, "Bottom"), new Threshold(1, "Threshold")}},
{"ProfiloSaomad", new List<Threshold>(){ new Threshold(3, "Bottom"), new Threshold(2, "BottomWaterdrip"), new Threshold(1, "Threshold")}}
};
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
protected string SelColorMaterial { get; set; } = "";
protected string SelFamilyHardware { get; set; } = "";
protected string SelGlass { get; set; } = "";
protected string SelMaterial { get; set; } = "";
#endregion Protected Properties
#region Protected Methods
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override async Task OnInitializedAsync()
{
ConfInit();
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
InitialJwd = File.ReadAllText("Data\\FinestraSplitGrid.jwd");
//initialJwd = File.ReadAllText("Data\\AntaDoppia.jwd");
currJwd = InitialJwd;
// rileggo altri dati
await ReloadData();
// preparo conf oggetti x controllo
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Material = AvailMaterialList,
Profile = AvailProfileList,
Threshold = AvailThreshold
};
CurrData = new LivePayload()
{
CurrJwd = InitialJwd,
SvgPreview = currSvg,
DictShape = currGroupShape,
DictOptionsXml = currHwOption
};
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage += PipeHwOption_EA_NewMessage;
}
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string windowUid = "CurrWindow";
private string cFileHardware = "Hardware/Setup.json";
private string currSvg = "";
private string GenericBasePath = "";
/// <summary>
/// Semaforo x definire se sia già in modalità ionterattiva o di prerendering
/// </summary>
private bool isInteractive = false;
private string outClose = "";
private string outSave = "";
private string imgBasePath = "";
private string channelHwOpt = "";
private string channelShape = "";
private string channelSvg = "";
#endregion Private Fields
#region Private Methods
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(bool reqSave)
{
outClose = !reqSave ? "Richiesto chiusura!" : "";
outSave = reqSave ? "Richiesto salvataggio!" : "";
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSvg = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
channelShape = Config.GetValue<string>("ServerConf:ChannelShape") ?? "";
channelHwOpt = Config.GetValue<string>("ServerConf:ChannelHwOpt") ?? "";
}
/// <summary>
/// Esecuzione azione richiesta
/// </summary>
/// <param name="actReq">Azione richiesta</param>
private void DoAction(DataAction actReq)
{
switch (actReq)
{
case DataAction.None:
break;
case DataAction.ResetDictShape:
CurrData.DictShape = new Dictionary<int, string>();
break;
case DataAction.ResetHwOpt:
CurrData.DictOptionsXml = new Dictionary<int, string>();
break;
default:
break;
}
}
/// <summary>
/// Esecuzione richiesta
/// </summary>
/// <param name="CurrArgs"></param>
/// <returns></returns>
private async Task ExecRequest(Dictionary<string, string> CurrArgs)
{
// Proseguo solo se sono in interattivo (NO prerender pagina)
if (isInteractive)
{
outClose = "";
outSave = "";
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("SerializedData"))
{
currJwd = CurrArgs["SerializedData"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs))
{
m_CurrArgs = CurrArgs;
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
}
private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.StartsWith($"{channelHwOpt}:{windowUid}") && currArgs.newMessage.Length > 2)
{
// deserializzo il dizionario delle risposte...
Dictionary<int, string> rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage) ?? new Dictionary<int, string>();
if (rawDict.Count > 0)
{
currHwOption = rawDict;
CurrData.DictOptionsXml = currHwOption;
}
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeShape_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelShape}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage);
currGroupShape = rawDict ?? new Dictionary<int, string>();
CurrData.DictShape = currGroupShape;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSvg}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private Task ReloadData()
{
//return base.OnInitializedAsync();
AvailHardwareList = new List<Hardware>();
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
return Task.Delay(100);
}
#endregion Private Methods
}
}
@@ -0,0 +1,25 @@
@page "/TestComponentJWD"
@rendermode InteractiveServer
<PageTitle>TestComponent</PageTitle>
<WebWindowTest.Test IN_FamilyHardwareList="@AvailFamilyHardwareList"
IN_HardwareList="@AvailHardwareList"
IN_ColorMaterialList="@AvailColorMaterialList"
IN_MaterialList="@AvailMaterialList"
IN_GlassList="@AvailGlassList"
EC_OnUpdate="SaveJWD"
LiveSVG="@currSvg"
CurrJwd="@InitialJwd">
</WebWindowTest.Test>
@*
IN_SelGlass="@SelGlass"
IN_SelFamilyHardware="@SelFamilyHardware"
IN_SelColorMaterial="@SelColorMaterial"
IN_SelMaterial="@SelMaterial"
*@
<p>
@m_CurrArgs.GetValueOrDefault("Jwd")
</p>
@@ -0,0 +1,217 @@
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using NLog;
using System.Diagnostics;
using System.Security.AccessControl;
using Egw.Window.Data;
using WebWindowTest;
using WebWindowTest.DTO;
namespace Test.UI.Components.Pages
{
public partial class TestComponentJWD : IDisposable
{
#region Public Properties
public string InitialJwd = "";
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
#endregion Public Properties
#region Public Methods
public void Dispose()
{
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
protected string currJwd = "...";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
#endregion Protected Fields
#region Protected Properties
protected List<TemplateSelectDTO> AvailTemplateList { get; set; } = new List<TemplateSelectDTO>();
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("Natura"),
new string("Optima")
};
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pine"),
new string("Fir")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("4/12/4"),
new string("4/16/4"),
new string("4/12/4/12/4"),
new string("4/16/4/16/4"),
new string("4T/12/4T"),
new string("4T/16/4T")
};
protected string SelFamilyHardware { get; set; } = "";
protected string SelColorMaterial { get; set; } = "";
protected string SelMaterial { get; set; } = "";
protected string SelGlass { get; set; } = "";
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
ConfInit();
SelFamilyHardware = "Natura";
//SelColorMaterial = "Black";
//SelColorMaterial = "Pine";
//SelGlass = "4T/16/4T";
InitialJwd = File.ReadAllText("Data\\FinDueAnteBottomFisso.jwd");
currJwd = InitialJwd;
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
await ReloadData();
}
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFileTemplate = "Data/Setup.json";
private string cFileHardware = "Hardware/Setup.json";
private TemplateSelectDTO? currSel = null;
private string currSvg = "";
private string imgBasePath = "";
private string GenericBasePath = "";
private string subChannel = "";
private string windowUid = "CurrWindow";
#endregion Private Fields
#region Private Methods
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
{
currSvg = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private async Task ReloadData()
{
//return base.OnInitializedAsync();
AvailTemplateList = new List<TemplateSelectDTO>();
AvailHardwareList = new List<Hardware>();
// brutale, da rivedere...
if (string.IsNullOrEmpty(InitialJwd))
{
if (File.Exists(cFileTemplate))
{
string rawVal = File.ReadAllText(cFileTemplate);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
foreach (var item in rawList)
{
item.ImageUrl = ICService.ImageUrl($"{apiUrl}/{imgBasePath}", false, item.SVGFileName);
AvailTemplateList.Add(item);
}
}
}
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
await Task.Delay(100);
}
private async Task SaveJWD(Dictionary<string, string> CurrArgs)
{
m_CurrArgs = CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
if (currJwd != null)
{
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
private void SetTemplate(TemplateSelectDTO selTemp)
{
string rawVal = "";
currSel = selTemp;
// brutale,d a rivedere...
if (File.Exists(selTemp.JwdFileName))
{
rawVal = File.ReadAllText(selTemp.JwdFileName);
}
SelTemplate = new Template(selTemp.Index, selTemp.Description, selTemp.SVGFileName, rawVal);
}
#endregion Private Methods
}
}
@@ -0,0 +1,24 @@
@page "/TestComponentTemplate"
@rendermode InteractiveServer
<PageTitle>TestComponent</PageTitle>
<WebWindowTest.Test IN_TemplateDTOList="@AvailTemplateList"
IN_SelTemplate="@SelTemplate"
IN_FamilyHardwareList="@AvailFamilyHardwareList"
IN_SelFamilyHardware="@SelFamilyHardware"
IN_HardwareList="@AvailHardwareList"
IN_ColorMaterialList="@AvailColorMaterialList"
IN_SelColorMaterial="@SelColorMaterial"
IN_MaterialList="@AvailMaterialList"
IN_SelMaterial="@SelMaterial"
IN_GlassList="@AvailGlassList"
IN_SelGlass="@SelGlass"
EC_OnUpdate="SaveJWD"
EC_OnSelectedTemplate="SetTemplate"
LiveSVG="@currSvg">
</WebWindowTest.Test>
<p>
@m_CurrArgs.GetValueOrDefault("Jwd")
</p>
@@ -0,0 +1,215 @@
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using NLog;
using System.Diagnostics;
using System.Security.AccessControl;
using Egw.Window.Data;
using WebWindowTest;
using WebWindowTest.DTO;
namespace Test.UI.Components.Pages
{
public partial class TestComponentTemplate : IDisposable
{
#region Public Properties
public string InitialJwd = "";
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
#endregion Public Properties
#region Public Methods
public void Dispose()
{
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
protected string currJwd = "...";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
#endregion Protected Fields
#region Protected Properties
protected List<TemplateSelectDTO> AvailTemplateList { get; set; } = new List<TemplateSelectDTO>();
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("Natura"),
new string("Optima")
};
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu")
};
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pine"),
new string("Fir")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("4/12/4"),
new string("4/16/4"),
new string("4/12/4/12/4"),
new string("4/16/4/16/4"),
new string("4T/12/4T"),
new string("4T/16/4T")
};
protected string SelFamilyHardware { get; set; } = "";
protected string SelColorMaterial { get; set; } = "";
protected string SelMaterial { get; set; } = "";
protected string SelGlass { get; set; } = "";
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
ConfInit();
SelFamilyHardware = "Natura";
SelColorMaterial = "Black";
SelMaterial = "Pine";
SelGlass = "4T/16/4T";
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
await ReloadData();
}
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFileTemplate = "Data/Setup.json";
private string cFileHardware = "Hardware/Setup.json";
private TemplateSelectDTO? currSel = null;
private string currSvg = "";
private string imgBasePath = "";
private string GenericBasePath = "";
private string subChannel = "";
private string windowUid = "CurrWindow";
#endregion Private Fields
#region Private Methods
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
{
currSvg = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private async Task ReloadData()
{
//return base.OnInitializedAsync();
AvailTemplateList = new List<TemplateSelectDTO>();
AvailHardwareList = new List<Hardware>();
// brutale, da rivedere...
if(string.IsNullOrEmpty(InitialJwd))
{
if (File.Exists(cFileTemplate))
{
string rawVal = File.ReadAllText(cFileTemplate);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
foreach (var item in rawList)
{
item.ImageUrl = ICService.ImageUrl($"{apiUrl}/{imgBasePath}", false, item.SVGFileName);
AvailTemplateList.Add(item);
}
}
}
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
await Task.Delay(100);
}
private async Task SaveJWD(Dictionary<string, string> CurrArgs)
{
m_CurrArgs = CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
if (currJwd != null)
{
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
private void SetTemplate(TemplateSelectDTO selTemp)
{
string rawVal = "";
currSel = selTemp;
// brutale,d a rivedere...
if (File.Exists(selTemp.JwdFileName))
{
rawVal = File.ReadAllText(selTemp.JwdFileName);
}
SelTemplate = new Template(selTemp.Index, selTemp.Description, selTemp.SVGFileName, rawVal);
}
#endregion Private Methods
}
}
-40
View File
@@ -1,40 +0,0 @@
@page "/TestError"
@rendermode InteractiveServer
<PageTitle>EditJWD</PageTitle>
<div class="row">
<div class="col-3"><button class="btn btn-primary" @onclick="() => RemoveJwd()">No JWD</button></div>
<div class="col-3"><button class="btn btn-primary" @onclick="RemoveParams">No Parameters</button></div>
</div>
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveData="CurrData"
baseUser="User"
EC_ActionReq="DoAction"
EC_DoUpdate="ExecRequest"
EC_OnClose="CloseObj">
</WebWindowComplex.TableComp>
@if (!string.IsNullOrEmpty(outClose))
{
<div class="alert alert-danger fs-4">
@outClose
</div>
}
else if (!string.IsNullOrEmpty(outSave))
{
<div class="alert alert-success fs-4">
@outSave
</div>
}
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
-630
View File
@@ -1,630 +0,0 @@
using Egw.Window.Data;
using EgwCoreLib.Lux.Core;
using EgwCoreLib.Lux.Core.RestPayload;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using WebWindowComplex;
using WebWindowComplex.DTO;
using static WebWindowComplex.LayoutConst;
namespace Test.UI.Components.Pages
{
public partial class TestError
{
#region Public Fields
public string InitialJwd = "";
#endregion Public Fields
#region Public Methods
public void Dispose()
{
DLService.PipeSvg.EA_NewMessage -= PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage -= PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage -= PipeHwOption_EA_NewMessage;
DLService.PipeProfElement.EA_NewMessage -= PipeProfElement_EA_NewMessage;
}
#endregion Public Methods
#region Protected Fields
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
/// <summary>
/// Livello di accesso
/// -- true: utente base (versione semplificata)
/// -- false: utente avanzato (versione completa)
/// </summary>
protected bool User = false;
protected Dictionary<int, string> currGroupShape = new Dictionary<int, string>();
protected List<AreaProfiles> currElement = new List<AreaProfiles>();
protected Dictionary<int, string> currHwOption = new Dictionary<int, string>();
protected string currJwd = "...";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
protected string prevJwd = "";
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
#endregion Protected Fields
#region Protected Properties
protected List<string> AvailColorMaterialList { get; set; } = new List<string>()
{
new string("White"),
new string("Black"),
new string("Blu"),
new string("Wood")
};
protected List<string> AvailFamilyHardwareList { get; set; } = new List<string>()
{
new string("ArTech"),
new string("ArTechPlana")
};
protected List<string> AvailGlassList { get; set; } = new List<string>()
{
new string("Vetro BE 2S 4/12/4"),
new string("Vetro BE 2S 4/16/4"),
new string("Vetro BE 3S 4/12/4/12/4"),
new string("Vetro BE 3S 4/16/4/16/4"),
new string("Vetro BE 2S 4T/12/4T"),
new string("Vetro BE 2S 4T/16/4T")
};
protected List<Hardware> AvailHardwareList { get; set; } = new List<Hardware>();
protected List<string> AvailMaterialList { get; set; } = new List<string>()
{
new string("Pino"),
new string("Abete")
};
/// <summary>
/// Lista profili da DB
/// </summary>
private List<ProfilePayload> AvailProfileList = new List<ProfilePayload>();
private List<Threshold> ThresholdProfilo78 = new List<Threshold>()
{
{ new Threshold(3, "Bottom") },
{ new Threshold(1, "Threshold") }
};
private List<Threshold> ThresholdProfiloSaomad = new List<Threshold>()
{
{ new Threshold(3, "Bottom") },
{ new Threshold(2, "BottomWaterdrip") },
{ new Threshold(1, "Threshold") }
};
private Dictionary<string, double> ParamProfilo78 = new Dictionary<string, double>()
{
{"Frame_Fill_Rail_DimMax", 85},
{"Frame_Fill_Rail_DimMin", 70},
{"Frame_Fill_Rail_DimStd", 72},
{"Frame_Fixed_Bottom_DimMax", 80},
{"Frame_Fixed_Bottom_DimMin", 70},
{"Frame_Fixed_Bottom_DimStd", 78},
{"Frame_Fixed_Top_DimMax", 80},
{"Frame_Fixed_Top_DimMin", 70},
{"Frame_Fixed_Top_DimStd", 78},
{"Frame_Frame_Split_DimMax", 85},
{"Frame_Frame_Split_DimMin", 55},
{"Frame_Frame_Split_DimStd", 60},
{"Frame_Mixed_Bottom_DimMax", 80},
{"Frame_Mixed_Bottom_DimMin", 70},
{"Frame_Mixed_Bottom_DimStd", 78},
{"Frame_Mixed_Split_DimMax", 110},
{"Frame_Mixed_Split_DimMin", 70},
{"Frame_Mixed_Split_DimStd", 90},
{"Frame_Mixed_Top_DimMax", 80},
{"Frame_Mixed_Top_DimMin", 70},
{"Frame_Mixed_Top_DimStd", 78},
{"Frame_Rail_Bottom_DimMax", 80},
{"Frame_Rail_Bottom_DimMin", 70},
{"Frame_Rail_Bottom_DimStd", 78},
{"Frame_Rail_DimMax", 78},
{"Frame_Rail_DimMin", 68},
{"Frame_Rail_DimStd", 72},
{"Frame_Sash_Bottom_DimMax", 80},
{"Frame_Sash_Bottom_DimMin", 70},
{"Frame_Sash_Bottom_DimStd", 78},
{"Frame_Sash_Horizontal_DimMax", 110},
{"Frame_Sash_Horizontal_DimMin", 75},
{"Frame_Sash_Horizontal_DimStd", 95},
{"Frame_Sash_Threshold_DimMax", 26},
{"Frame_Sash_Threshold_DimMin", 24},
{"Frame_Sash_Threshold_DimStd", 25},
{"Frame_Sash_Top_DimMax", 80},
{"Frame_Sash_Top_DimMin", 70},
{"Frame_Sash_Top_DimStd", 78},
{"Frame_Sash_Vertical_DimMax", 110},
{"Frame_Sash_Vertical_DimMin", 85},
{"Frame_Sash_Vertical_DimStd", 95},
{"Frame_Slide_Bottom_DimMax", 60},
{"Frame_Slide_Bottom_DimMin", 50},
{"Frame_Slide_Bottom_DimStd", 55},
{"Frame_Slide_Fixed_DimMax", 60},
{"Frame_Slide_Fixed_DimMin", 50},
{"Frame_Slide_Fixed_DimStd", 55},
{"Frame_Slide_MovableBack_Bottom_DimMax", 60},
{"Frame_Slide_MovableBack_Bottom_DimMin", 50},
{"Frame_Slide_MovableBack_Bottom_DimStd", 55},
{"Frame_Slide_MovableBack_Threshold_DimMax", 10},
{"Frame_Slide_MovableBack_Threshold_DimMin", 3},
{"Frame_Slide_MovableBack_Threshold_DimStd", 4},
{"Frame_Slide_Movable_DimMax", 60},
{"Frame_Slide_Movable_DimMin", 50},
{"Frame_Slide_Movable_DimStd", 55},
{"Frame_Slide_Threshold_DimMax", 10},
{"Frame_Slide_Threshold_DimMin", 3},
{"Frame_Slide_Threshold_DimStd", 4},
{"Frame_Slide_Top_DimMax", 60},
{"Frame_Slide_Top_DimMin", 50},
{"Frame_Slide_Top_DimStd", 55},
{"Sash_Fill_Rail_DimMax", 80},
{"Sash_Fill_Rail_DimMin", 70},
{"Sash_Fill_Rail_DimStd", 78},
{"Sash_Frame_Bottom_DimMax", 80},
{"Sash_Frame_Bottom_DimMin", 70},
{"Sash_Frame_Bottom_DimStd", 78},
{"Sash_Frame_Top_DimMax", 80},
{"Sash_Frame_Top_DimMin", 70},
{"Sash_Frame_Top_DimStd", 78},
{"Sash_French_In_DimMax", 80},
{"Sash_French_In_DimMin", 70},
{"Sash_French_In_DimStd", 78},
{"Sash_French_Out_DimMax", 80},
{"Sash_French_Out_DimMin", 70},
{"Sash_French_Out_DimStd", 78},
{"Sash_Rail_Bottom_DimMax", 80},
{"Sash_Rail_Bottom_DimMin", 70},
{"Sash_Rail_Bottom_DimStd", 78},
{"Sash_Rail_DimMax", 80},
{"Sash_Rail_DimMin", 70},
{"Sash_Rail_DimStd", 78},
{"Sash_Sash_Active_DimMax", 80},
{"Sash_Sash_Active_DimMin", 70},
{"Sash_Sash_Active_DimStd", 78},
{"Sash_Sash_Inactive_DimMax", 80},
{"Sash_Sash_Inactive_DimMin", 70},
{"Sash_Sash_Inactive_DimStd", 78},
{"Sash_Sash_Split_DimMax", 70},
{"Sash_Sash_Split_DimMin", 50},
{"Sash_Sash_Split_DimStd", 60},
{"Sash_Slide_Active_DimMax", 90},
{"Sash_Slide_Active_DimMin", 70},
{"Sash_Slide_Active_DimStd", 80},
{"Sash_Slide_Active_In_DimMax", 90},
{"Sash_Slide_Active_In_DimMin", 70},
{"Sash_Slide_Active_In_DimStd", 80},
{"Sash_Slide_Fixed_Bottom_DimMax", 150},
{"Sash_Slide_Fixed_Bottom_DimMin", 120},
{"Sash_Slide_Fixed_Bottom_DimStd", 135},
{"Sash_Slide_Fixed_Side_DimMax", 90},
{"Sash_Slide_Fixed_Side_DimMin", 70},
{"Sash_Slide_Fixed_Side_DimStd", 80},
{"Sash_Slide_Fixed_Top_DimMax", 90},
{"Sash_Slide_Fixed_Top_DimMin", 70},
{"Sash_Slide_Fixed_Top_DimStd", 80},
{"Sash_Slide_Inactive_DimMax", 90},
{"Sash_Slide_Inactive_DimMin", 70},
{"Sash_Slide_Inactive_DimStd", 80},
{"Sash_Slide_MovableBack_Bottom_DimMax", 150},
{"Sash_Slide_MovableBack_Bottom_DimMin", 120},
{"Sash_Slide_MovableBack_Bottom_DimStd", 135},
{"Sash_Slide_MovableBack_Side_DimMax", 90},
{"Sash_Slide_MovableBack_Side_DimMin", 70},
{"Sash_Slide_MovableBack_Side_DimStd", 80},
{"Sash_Slide_MovableBack_Top_DimMax", 90},
{"Sash_Slide_MovableBack_Top_DimMin", 70},
{"Sash_Slide_MovableBack_Top_DimStd", 80},
{"Sash_Slide_Movable_Bottom_DimMax", 150},
{"Sash_Slide_Movable_Bottom_DimMin", 120},
{"Sash_Slide_Movable_Bottom_DimStd", 135},
{"Sash_Slide_Movable_Side_DimMax", 90},
{"Sash_Slide_Movable_Side_DimMin", 70},
{"Sash_Slide_Movable_Side_DimStd", 80},
{"Sash_Slide_Movable_Top_DimMax", 90},
{"Sash_Slide_Movable_Top_DimMin", 70},
{"Sash_Slide_Movable_Top_DimStd", 80},
{"Frame_BottomRail_Overlap", 33.2},
{"French_In_Overlap", 26},
{"French_Out_Overlap", 26},
{"Mixed_Bottom_Overlap", 26},
{"Mixed_Split_Bottom_Overlap", 41},
{"Mixed_Split_Top_Overlap", 41},
{"Mixed_Top_Overlap", 41},
{"NO_Mixed_Bottom_Overlap", 26},
{"NO_Mixed_Split_Bottom_Overlap", 41},
{"NO_Mixed_Split_Top_Overlap", 41},
{"NO_Slide_MovableBack_Threshold_Overlap", 0},
{"NO_Slide_Threshold_Overlap", 0},
{"Sash_Active_Overlap", 26},
{"Sash_Inactive_Overlap", 26},
{"Sash_BottomRail_Overlap", 24.5},
{"Sash_Bottom_Overlap", 26},
{"Sash_Horizontal_Bottom_Overlap", 26},
{"Sash_Horizontal_Top_Overlap", 41},
{"Sash_Threshold_Overlap", 18},
{"Sash_Top_Overlap", 41},
{"Sash_Vertical_Overlap", 41},
{"Slide_Active_Overlap", 80},
{"Slide_Bottom_Overlap", 0},
{"Slide_Fixed_Overlap", -5},
{"Slide_MovableBack_Bottom_Overlap", 0},
{"Slide_MovableBack_Threshold_Overlap", 0},
{"Slide_Movable_Overlap", -5},
{"Slide_Threshold_Overlap", 0},
{"Slide_Top_Overlap", -12}
};
private Dictionary<string, double> ParamProfiloSaomad = new Dictionary<string, double>()
{
{"Frame_Frame_Split_DimMax", 85},
{"Frame_Frame_Split_DimMin", 55},
{"Frame_Frame_Split_DimStd", 60},
{"Frame_Mixed_Bottom_DimMax", 80},
{"Frame_Mixed_Bottom_DimMin", 70},
{"Frame_Mixed_Bottom_DimStd", 78},
{"Frame_Mixed_Split_DimMax", 110},
{"Frame_Mixed_Split_DimMin", 70},
{"Frame_Mixed_Split_DimStd", 90},
{"Frame_Mixed_Top_DimMax", 80},
{"Frame_Mixed_Top_DimMin", 70},
{"Frame_Mixed_Top_DimStd", 78},
{"Frame_Rail_Bottom_DimMax", 80}
};
[Inject]
protected IConfiguration Config { get; set; } = null!;
[Inject]
protected DataLayerServices DLService { get; set; } = null!;
[Inject]
protected ImageCacheService ICService { get; set; } = null!;
protected MarkupString JsonSer
{
get => (MarkupString)currJwd.Replace(Environment.NewLine, "<br/>").Replace(" ", "&nbsp;");
}
protected string SelColorMaterial { get; set; } = "";
protected string SelFamilyHardware { get; set; } = "";
protected string SelGlass { get; set; } = "";
protected string SelMaterial { get; set; } = "";
#endregion Protected Properties
#region Protected Methods
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override async Task OnInitializedAsync()
{
ConfInit();
User = false;
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
//initialJwd = File.ReadAllText("Data\\AntaDoppiaInglesine.jwd");
InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd");
currJwd = InitialJwd;
// rileggo altri dati
await ReloadData();
// costruisco lista profili
ProfilePayload pp1 = new ProfilePayload()
{
ProfileName = "Profilo78",
ThresholdList = ThresholdProfilo78,
ParameterDict = ParamProfilo78
};
ProfilePayload pp2 = new ProfilePayload()
{
ProfileName = "ProfiloSaomad",
ThresholdList = ThresholdProfiloSaomad,
ParameterDict = ParamProfiloSaomad
};
AvailProfileList = new List<ProfilePayload> { pp1, pp2 };
// preparo conf oggetti x controllo
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Wood = AvailMaterialList,
ProfileList = AvailProfileList
};
CurrData = new LivePayload()
{
CurrJwd = InitialJwd,
SvgPreview = currSvg,
DictShape = currGroupShape,
DictOptionsXml = currHwOption
};
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
DLService.PipeShape.EA_NewMessage += PipeShape_EA_NewMessage;
DLService.PipeHwOpt.EA_NewMessage += PipeHwOption_EA_NewMessage;
DLService.PipeProfElement.EA_NewMessage += PipeProfElement_EA_NewMessage;
}
#endregion Protected Methods
#region Private Fields
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string windowUid = "CurrWindow";
private string cFileHardware = "Hardware/Setup.json";
private string currSvg = "";
private string GenericBasePath = "";
//private string colorMassUpdate;
//private string familyHWMassUpdate;
//private string glassMassUpdate;
//private Hardware hardwareMassUpdate;
//private string materialMassUpdate;
//private string profileMassUpdate;
/// <summary>
/// Semaforo x definire se sia già in modalità ionterattiva o di prerendering
/// </summary>
private bool isInteractive = false;
private string outClose = "";
private string outSave = "";
private string imgBasePath = "";
private string channelHwOpt = "";
private string channelShape = "";
private string channelProfList = "";
private string channelProfElem = "";
private string channelSvg = "";
#endregion Private Fields
#region Private Methods
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(DataSave reqSave)
{
currJwd = reqSave.currJwd;
outClose = !reqSave.ForceSave ? "Richiesto chiusura!" : "";
outSave = reqSave.ForceSave ? "Richiesto salvataggio!" : "";
}
private void ConfInit()
{
apiUrl = Config.GetValue<string>("ServerConf:Prog.ApiUrl") ?? "";
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
channelSvg = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
channelShape = Config.GetValue<string>("ServerConf:ChannelShape") ?? "";
channelHwOpt = Config.GetValue<string>("ServerConf:ChannelHwOpt") ?? "";
channelProfElem = Config.GetValue<string>("ServerConf:ChannelProfElem") ?? "";
channelProfList = Config.GetValue<string>("ServerConf:ChannelProfList") ?? "";
}
/// <summary>
/// Esecuzione azione richiesta
/// </summary>
/// <param name="actReq">Azione richiesta</param>
private void DoAction(DataAction actReq)
{
switch (actReq)
{
case DataAction.None:
break;
case DataAction.ResetDictShape:
CurrData.DictShape = new Dictionary<int, string>();
break;
case DataAction.ResetHwOpt:
CurrData.DictOptionsXml = new Dictionary<int, string>();
break;
case DataAction.ResetDimElem:
CurrData.ProfElementList = new List<AreaProfiles>();
break;
default:
break;
}
}
/// <summary>
/// Esecuzione richiesta
/// </summary>
/// <param name="CurrArgs"></param>
/// <returns></returns>
private async Task ExecRequest(Dictionary<string, string> CurrArgs)
{
// Proseguo solo se sono in interattivo (NO prerender pagina)
if (isInteractive)
{
outClose = "";
outSave = "";
// verifico se contiene JWD, lo aggiorno
if (CurrArgs.ContainsKey("SerializedData"))
{
currJwd = CurrArgs["SerializedData"];
CurrData.CurrJwd = currJwd;
}
// se il SSE variato --> invio
if (!currJwd.Equals(prevJwd) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(m_CurrArgs, CurrArgs))
{
m_CurrArgs = CurrArgs;
prevJwd = currJwd;
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
// chiamo la chiamata POST alla API, che manda la richiesta via REDIS
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
}
}
}
private async void PipeHwOption_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.StartsWith($"{channelHwOpt}:{windowUid}") && currArgs.newMessage.Length > 2)
{
// deserializzo il dizionario delle risposte...
Dictionary<int, string> rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage) ?? new Dictionary<int, string>();
if (rawDict.Count > 0)
currHwOption = rawDict;
}
else
{
currHwOption = new Dictionary<int, string>();
}
CurrData.DictOptionsXml = currHwOption;
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeShape_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelShape}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<Dictionary<int, string>>(currArgs.newMessage);
currGroupShape = rawDict ?? new Dictionary<int, string>();
CurrData.DictShape = currGroupShape;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeProfElement_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage) && currArgs.newMessage.Length > 2)
{
if (currArgs.msgUid.StartsWith($"{channelProfElem}:{windowUid}"))
{
// deserializzo il dizionario delle risposte...
var rawDict = JsonConvert.DeserializeObject<List<AreaProfiles>>(currArgs.newMessage);
currElement = rawDict ?? new List<AreaProfiles>();
CurrData.ProfElementList = currElement;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
private async void PipeSvg_EA_NewMessage(object? sender, EventArgs e)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{channelSvg}:{windowUid}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
}
await InvokeAsync(StateHasChanged);
}
await Task.Delay(1);
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private Task ReloadData()
{
AvailHardwareList = new List<Hardware>();
if (File.Exists(cFileHardware))
{
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
return Task.Delay(100);
}
private void updateInfoJwd(string currSer, string? newFamilyHardware, Hardware? newHardware, string? newColorMaterial, string? newMaterial, string? newGlass, string? newProfile)
{
Dictionary<string, string> DictParam = new Dictionary<string, string>();
if (!string.IsNullOrEmpty(newFamilyHardware))
DictParam.Add("FamilyHardware", newFamilyHardware!);
if (!string.IsNullOrEmpty(newColorMaterial))
DictParam.Add("Color", newColorMaterial!);
if (!string.IsNullOrEmpty(newMaterial))
DictParam.Add("Material", newMaterial!);
if (!string.IsNullOrEmpty(newGlass))
DictParam.Add("Glass", newGlass!);
if (!string.IsNullOrEmpty(newProfile))
DictParam.Add("Profile", newProfile!);
var dp = SerialMan.MassUpdate(currSer, DictParam);
CurrData.CurrJwd = dp.serializeStruct;
//var newJwd = SerialMan.MassUpdate(currSer, shape, newFamilyHardware, newHardware, newColorMaterial, newMaterial, newGlass, newProfile);
//CurrData.CurrJwd = newJwd;
}
private void RemoveParams(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
{
SetupList = new BaseListPayload();
}
private Task RemoveJwd()
{
//initialJwd = "{}";
//currJwd = initialJwd;
CurrData.CurrJwd = "{}";
// rileggo altri dati
return ReloadData();
}
#endregion Private Methods
}
}
-50
View File
@@ -1,50 +0,0 @@
@page "/uitest"
@* @attribute [StreamRendering] *@
@rendermode InteractiveServer
<PageTitle>UI test</PageTitle>
<div class="row">
<div class="col-12">
<CascadingValue Value="isLoading" Name="CurrLoading">
<div class="row">
<div class="col-12 ">
<Test.UI.Components.Compo.ChildObj Name="A" CssClass="bg bg-primary" Message="BLOCK A - SVG" LoadPar="loadSvg"></Test.UI.Components.Compo.ChildObj>
</div>
<div class="col-6">
<Test.UI.Components.Compo.ChildNoLoad Name="B" CssClass="bg bg-secondary" Message="BLOCK B (multi)"></Test.UI.Components.Compo.ChildNoLoad>
</div>
<div class="col-6">
<Test.UI.Components.Compo.ChildObj Name="C" CssClass="bg bg-primary" Message="BLOCK C - Shape" LoadPar="loadShape"></Test.UI.Components.Compo.ChildObj>
</div>
</div>
</CascadingValue>
</div>
<div class="col-6">
<button class="btn btn-success btn-lg w-100" @onclick="DoReload">Reload!</button>
</div>
<div class="col-6">
<div class="form-check">
<input class="form-check-input" type="checkbox" @bind="loadPng">
<label class="form-check-label">Reload PNG</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" @bind="loadSvg">
<label class="form-check-label">Reload SVG</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" @bind="loadShape">
<label class="form-check-label">Reload SHAPE</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" @bind="loadHwOpt">
<label class="form-check-label">Reload HW OPT</label>
</div>
</div>
<div class="col-12">
@if (isLoading.Count > 0)
{
<EgwCoreLib.Razor.LoadingData DisplayMode="EgwCoreLib.Razor.LoadingData.SpinMode.BounceLine" Title="@($"...wating {delay}ms")"></EgwCoreLib.Razor.LoadingData>
}
</div>
</div>
-51
View File
@@ -1,51 +0,0 @@
namespace Test.UI.Components.Pages
{
public partial class UiTest
{
#region Protected Fields
protected List<string> isLoading = new List<string>();
#endregion Protected Fields
#region Protected Methods
protected async Task DoReload()
{
isLoading = new List<string>();
if (loadHwOpt)
isLoading.Add("loadHwOpt");
if (loadPng)
isLoading.Add("loadPng");
if (loadShape)
isLoading.Add("loadShape");
if (loadSvg)
isLoading.Add("loadSvg");
while (isLoading.Count > 0)
{
delay = rnd.Next(600, 1000);
await Task.Delay(delay);
int i2rem = rnd.Next(isLoading.Count);
isLoading.RemoveAt(i2rem);
await InvokeAsync(StateHasChanged);
}
isLoading = new List<string>();
}
#endregion Protected Methods
#region Private Fields
private int delay = 0;
private Random rnd = new Random();
private bool loadSvg = false;
private bool loadPng = false;
private bool loadShape = false;
private bool loadHwOpt = false;
#endregion Private Fields
}
}
+49 -130
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,163 +8,82 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 1200.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 1500.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_H"
"nIndex": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_H"
"nIndex": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_H"
"nIndex": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_H"
"nIndex": 4,
"JointType": "FULL_V"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"bIsSashVertical": true,
"SashList": [
{
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"nSashId": 1,
"OpeningType": "TURNONLY_LEFT",
"bHasHandle": false,
"dDimension": 50.0
},
{
"SashId": 2,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"nSashId": 2,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"dDimension": 50.0
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000631",
"HwOptionList": [],
"GroupId": 2,
"JointList": [
{
"nIndex": 1,
"JointType": "FULL_V"
},
{
"nIndex": 2,
"JointType": "FULL_V"
},
{
"nIndex": 3,
"JointType": "FULL_V"
},
{
"nIndex": 4,
"JointType": "FULL_V"
}
],
"Hardware": "000559",
"IdGroup": 2,
"AreaList": [
{
"GroupId": 3,
"IdGroup": 3,
"AreaList": [
{
"IdGroup": 4,
"FillType": "GLASS",
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -172,11 +91,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 5,
"IdGroup": 5,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 6,
"IdGroup": 6,
"AreaList": [],
"AreaType": "FILL"
}
-367
View File
@@ -1,367 +0,0 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 1400.0
},
{
"Index": 2,
"Name": "Height",
"Value": 2000.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 0.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Threshold",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
},
{
"SashId": 2,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000631",
"HwOptionList": [],
"GroupId": 2,
"AreaList": [
{
"GroupId": 3,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 4,
"AreaList": [
{
"Side": "BOTH",
"SplitShape": "GRID",
"SplitStartVert": true,
"SplitVertList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"ElementDimVertList": [
{
"Index": 1,
"Value": 35.0,
"Area": 0
},
{
"Index": 2,
"Value": 35.0,
"Area": 0
}
],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 35.0,
"Area": 1
},
{
"Index": 2,
"Value": 35.0,
"Area": 1
},
{
"Index": 3,
"Value": 35.0,
"Area": 1
},
{
"Index": 4,
"Value": 35.0,
"Area": 1
}
],
"GroupId": 7,
"AreaList": [],
"AreaType": "INGLESINA"
}
],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 5,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 8,
"AreaList": [
{
"Side": "EXTERNAL",
"SplitShape": "GRID",
"SplitStartVert": true,
"SplitVertList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"ElementDimVertList": [
{
"Index": 1,
"Value": 35.0,
"Area": 0
},
{
"Index": 2,
"Value": 35.0,
"Area": 0
}
],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 35.0,
"Area": 1
},
{
"Index": 2,
"Value": 35.0,
"Area": 1
},
{
"Index": 3,
"Value": 35.0,
"Area": 1
},
{
"Index": 4,
"Value": 35.0,
"Area": 1
}
],
"GroupId": 9,
"AreaList": [],
"AreaType": "INGLESINA"
}
],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SASH"
}
],
"AreaType": "FRAME"
}
]
}
+28 -97
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,142 +8,73 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 800.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 1200.0
}
],
"JointList": [
{
"Index": 1,
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"nIndex": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"bIsSashVertical": true,
"SashList": [
{
"SashId": 1,
"nSashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"bHasHandle": true,
"dDimension": 100.0
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000623",
"HwOptionList": [
"JointList": [
{
"Name": "Entrata",
"Value": "15"
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Name": "LavManigliaPassante",
"Value": "false"
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Name": "PosizioneForoCilindro",
"Value": "sopra"
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "500"
"nIndex": 4,
"JointType": "FULL_H"
}
],
"GroupId": 2,
"Hardware": "000558",
"IdGroup": 2,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 4,
"IdGroup": 3,
"AreaList": [],
"AreaType": "FILL"
}
-198
View File
@@ -1,198 +0,0 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "ARC",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1480.0
},
{
"Index": 3,
"Name": "Full Height",
"Value": 1800.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"JointType": "ANGLED"
},
{
"Index": 4,
"JointType": "ANGLED"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "ANGLED"
}
]
},
{
"SashId": 2,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "ANGLED"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000644",
"HwOptionList": [],
"GroupId": 2,
"AreaList": [
{
"GroupId": 3,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 5,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 6,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SASH"
}
],
"AreaType": "FRAME"
}
]
}
+44 -164
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,57 +8,37 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 2100.0
}
],
"JointList": [
{
"Index": 1,
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"nIndex": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"SplitShape": "HORIZONTAL",
@@ -66,32 +46,22 @@
"SplitVertList": [],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 40.0
},
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 60.0
}
],
"ElementDimVertList": [],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
}
],
"GroupId": 7,
"IdGroup": 2,
"AreaList": [
{
"GroupId": 9,
"IdGroup": 3,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 10,
"IdGroup": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -99,142 +69,52 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 8,
"IdGroup": 5,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"bIsSashVertical": true,
"SashList": [
{
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"nSashId": 1,
"OpeningType": "TURNONLY_LEFT",
"bHasHandle": false,
"dDimension": 50.0
},
{
"SashId": 2,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"nSashId": 2,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"dDimension": 50.0
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000631",
"HwOptionList": [
"JointList": [
{
"Name": "Entrata",
"Value": "15"
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Name": "LavManigliaPassante",
"Value": "false"
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Name": "PosizioneForoCilindro",
"Value": "sopra"
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Name": "Deviatore",
"Value": "false"
},
{
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "170"
"nIndex": 4,
"JointType": "FULL_H"
}
],
"GroupId": 2,
"Hardware": "000559",
"IdGroup": 6,
"AreaList": [
{
"GroupId": 3,
"IdGroup": 7,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 4,
"IdGroup": 8,
"AreaList": [],
"AreaType": "FILL"
}
@@ -242,11 +122,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 5,
"IdGroup": 9,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 6,
"IdGroup": 10,
"AreaList": [],
"AreaType": "FILL"
}
+67 -161
View File
@@ -1,178 +1,106 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "RECTANGLE",
"Shape": "DOUBLECHAMFER",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 1500.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 3,
"sName": "Full Height",
"dValue": 1800.0
}
],
"JointList": [
{
"Index": 1,
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"nIndex": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"SplitShape": "VERTICAL",
"SplitStartVert": true,
"SplitVertList": [
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 50.0
},
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 50.0
}
],
"SplitHorizList": [],
"ElementDimVertList": [
{
"Index": 1,
"Value": 85.0,
"Area": 0
}
],
"ElementDimHorizList": [],
"GroupId": 5,
"IdGroup": 2,
"AreaList": [
{
"GroupId": 6,
"IdGroup": 3,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": true,
"bIsSashVertical": true,
"SashList": [
{
"SashId": 1,
"nSashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"bHasHandle": true,
"dDimension": 100.0
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000635",
"HwOptionList": [
"JointList": [
{
"Name": "Entrata",
"Value": "15"
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Name": "LavManigliaPassante",
"Value": "false"
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Name": "PosizioneForoCilindro",
"Value": "sopra"
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "500"
"nIndex": 4,
"JointType": "FULL_H"
}
],
"GroupId": 2,
"BottomRail": false,
"BottomRailQty": 0,
"Hardware": "000558",
"IdGroup": 4,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 4,
"IdGroup": 5,
"AreaList": [],
"AreaType": "FILL"
}
@@ -183,67 +111,45 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 7,
"IdGroup": 6,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": false,
"bIsSashVertical": true,
"SashList": [
{
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"MeasureType": "PERCENTAGE",
"Dimension": 100.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
"nSashId": 1,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"dDimension": 100.0
}
],
"SashType": "NULL",
"JointList": [
{
"nIndex": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"JointType": "FULL_H"
}
],
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000635",
"HwOptionList": [],
"GroupId": 9,
"Hardware": "000558",
"IdGroup": 7,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 8,
"IdGroup": 8,
"AreaList": [],
"AreaType": "FILL"
}
+35 -79
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,117 +8,73 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 1800.0
}
],
"JointList": [
{
"Index": 1,
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"nIndex": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"SplitShape": "GRID",
"SplitStartVert": false,
"SplitVertList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
"bIsRelative": true,
"dDimension": 50.0
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
"bIsRelative": true,
"dDimension": 50.0
}
],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
"bIsRelative": true,
"dDimension": 30.0
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
"bIsRelative": true,
"dDimension": 40.0
},
{
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
"bIsRelative": true,
"dDimension": 30.0
}
],
"ElementDimVertList": [
{
"Index": 1,
"Value": 78.0,
"Area": 1
}
],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
},
{
"Index": 2,
"Value": 78.0,
"Area": 0
}
],
"GroupId": 8,
"IdGroup": 2,
"AreaList": [
{
"GroupId": 12,
"IdGroup": 3,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 13,
"IdGroup": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -126,11 +82,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 14,
"IdGroup": 5,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 15,
"IdGroup": 6,
"AreaList": [],
"AreaType": "FILL"
}
@@ -138,11 +94,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 16,
"IdGroup": 7,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 17,
"IdGroup": 8,
"AreaList": [],
"AreaType": "FILL"
}
@@ -150,11 +106,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 18,
"IdGroup": 9,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 19,
"IdGroup": 10,
"AreaList": [],
"AreaType": "FILL"
}
@@ -162,11 +118,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 20,
"IdGroup": 11,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 21,
"IdGroup": 12,
"AreaList": [],
"AreaType": "FILL"
}
@@ -174,11 +130,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 22,
"IdGroup": 13,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 23,
"IdGroup": 14,
"AreaList": [],
"AreaType": "FILL"
}
-120
View File
@@ -1,120 +0,0 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"SplitShape": "HORIZONTAL",
"SplitStartVert": false,
"SplitVertList": [],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
},
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
}
],
"ElementDimVertList": [],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
}
],
"GroupId": 8,
"AreaList": [
{
"GroupId": 9,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 7,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 10,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 11,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SPLIT"
}
],
"AreaType": "FRAME"
}
]
}
+21 -51
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"Material": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,90 +8,60 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 800.0
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
},
{
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
"nIndex": 2,
"sName": "Height",
"dValue": 1800.0
}
],
"JointList": [
{
"Index": 1,
"nIndex": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"nIndex": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"nIndex": 3,
"JointType": "FULL_H"
},
{
"Index": 4,
"nIndex": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"IdGroup": 1,
"AreaList": [
{
"SplitShape": "VERTICAL",
"SplitStartVert": true,
"SplitVertList": [
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 50.0
},
{
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
"bIsRelative": true,
"dDimension": 50.0
}
],
"SplitHorizList": [],
"ElementDimVertList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
}
],
"ElementDimHorizList": [],
"GroupId": 8,
"IdGroup": 2,
"AreaList": [
{
"GroupId": 9,
"IdGroup": 3,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 7,
"IdGroup": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -99,11 +69,11 @@
"AreaType": "SPLITTED"
},
{
"GroupId": 10,
"IdGroup": 5,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 11,
"IdGroup": 6,
"AreaList": [],
"AreaType": "FILL"
}
-368
View File
@@ -1,368 +0,0 @@
{
"ProfilePath": "Profilo78",
"Wood": "Pino",
"ColorMaterial": "Wood",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "THREECENTERARC",
"DimensionList": [
{
"Index": 1,
"Name": "Width",
"Value": 2000.0
},
{
"Index": 2,
"Name": "Height",
"Value": 2080.0
},
{
"Index": 3,
"Name": "Full Height",
"Value": 2400.0
},
{
"Index": 4,
"Name": "Radius",
"Value": 200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 0.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
},
{
"Index": 5,
"Value": 78.0
},
{
"Index": 6,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_H"
},
{
"Index": 2,
"JointType": "FULL_H"
},
{
"Index": 3,
"JointType": "ANGLED"
},
{
"Index": 4,
"JointType": "ANGLED"
}
],
"Threshold": "Threshold",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"IsSashVertical": true,
"IsDimensionLight": false,
"SashList": [
{
"SashId": 1,
"OpeningType": "TURNONLY_LEFT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
},
{
"Index": 5,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
},
{
"SashId": 2,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": true,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
},
{
"SashId": 3,
"OpeningType": "TURNONLY_RIGHT",
"MeasureType": "PROPORTIONAL",
"Dimension": 1.0,
"HasHandle": false,
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
},
{
"Index": 5,
"Value": 78.0
}
],
"JointList": [
{
"Index": 1,
"JointType": "FULL_V"
},
{
"Index": 2,
"JointType": "FULL_V"
},
{
"Index": 3,
"JointType": "FULL_V"
},
{
"Index": 4,
"JointType": "FULL_V"
}
]
}
],
"SashType": "NULL",
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000000",
"HwOptionList": [],
"GroupId": 3,
"AreaList": [
{
"GroupId": 9,
"AreaList": [
{
"SplitShape": "HORIZONTAL",
"SplitStartVert": false,
"SplitVertList": [],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 30.0,
"MeasureType": "PERCENTAGE"
},
{
"IsRelative": true,
"Dimension": 70.0,
"MeasureType": "PERCENTAGE"
}
],
"ElementDimVertList": [],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 60.0,
"Area": 0
}
],
"GroupId": 13,
"AreaList": [
{
"GroupId": 14,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 2,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 15,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 16,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SPLIT"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 10,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 6,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 11,
"AreaList": [
{
"SplitShape": "HORIZONTAL",
"SplitStartVert": false,
"SplitVertList": [],
"SplitHorizList": [
{
"IsRelative": true,
"Dimension": 30.0,
"MeasureType": "PERCENTAGE"
},
{
"IsRelative": true,
"Dimension": 70.0,
"MeasureType": "PERCENTAGE"
}
],
"ElementDimVertList": [],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 60.0,
"Area": 0
}
],
"GroupId": 17,
"AreaList": [
{
"GroupId": 18,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 19,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
},
{
"GroupId": 20,
"AreaList": [
{
"FillType": "GLASS",
"GroupId": 21,
"AreaList": [],
"AreaType": "FILL"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SPLIT"
}
],
"AreaType": "SPLITTED"
}
],
"AreaType": "SASH"
}
],
"AreaType": "FRAME"
}
]
}
+11 -23
View File
@@ -13,38 +13,26 @@
},
{
"Index": 3,
"Description": "Arco anta doppia",
"SVGFileName": "ArcoAntaDoppia.svg",
"JwdFileName": "Data/ArcoAntaDoppia.jwd"
},
{
"Index": 4,
"Description": "Finestra due ante bottom fisso",
"SVGFileName": "FinDueAnteBottomFisso.svg",
"JwdFileName": "Data/FinDueAnteBottomFisso.jwd"
},
{
"Index": 5,
"Description": "Finestra con due ante separate",
"SVGFileName": "FinestraDueAnteSeparate.svg",
"JwdFileName": "Data/FinestraDueAnteSeparate.jwd"
},
{
"Index": 6,
"Description": "Finestra con split a griglia",
"SVGFileName": "FinestraSplitGrid.svg",
"JwdFileName": "Data/FinestraSplitGrid.jwd"
},
{
"Index": 7,
"Index": 4,
"Description": "Finestra con split verticale",
"SVGFileName": "FinestraSplitVert.svg",
"JwdFileName": "Data/FinestraSplitVert.jwd"
},
{
"Index": 8,
"Description": "Finestra con split orizzontale",
"SVGFileName": "FinestraSplitHoriz.svg",
"JwdFileName": "Data/FinestraSplitHoriz.jwd"
"Index": 5,
"Description": "Finestra con split grid",
"SVGFileName": "FinestraSplitGrid.svg",
"JwdFileName": "Data/FinestraSplitGrid.jwd"
},
{
"Index": 6,
"Description": "Finestra con split orizzontale (sopra due ante e sotto vetro fisso)",
"SVGFileName": "FinDueAnteBottomFisso.svg",
"JwdFileName": "Data/FinDueAnteBottomFisso.jwd"
}
]
File diff suppressed because it is too large Load Diff
+2 -30
View File
@@ -1,9 +1,5 @@
using EgwCoreLib.Lux.Data;
using EgwCoreLib.Lux.Data.Services;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using NLog;
using NLog.Web;
using StackExchange.Redis;
using System.Reflection;
using Test.UI.Client.Pages;
@@ -11,14 +7,10 @@ using Test.UI.Components;
var builder = WebApplication.CreateBuilder(args);
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString();
var logger = LogManager.Setup()
.LoadConfigurationFromAppSettings()
.GetCurrentClassLogger();
ConfigurationManager configuration = builder.Configuration;
logger.Info("Program.cs: startup");
// Add services to the container.
builder.Services.AddRazorComponents()
@@ -28,20 +20,6 @@ builder.Services.AddRazorComponents()
// costruzione connectionMultiplexer redis...
string connStr = configuration.GetConnectionString("Redis") ?? "localhost";
ConnectionMultiplexer redisConn = ConnectionMultiplexer.Connect(connStr);
// registrazione in blocco servizi con metodo extension custom
var connectionString = builder.Configuration.GetConnectionString("Lux.All") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContextFactory<DataLayerContext>(options =>
{
var conn = builder.Configuration.GetConnectionString("Lux.All");
options.UseMySql(conn, ServerVersion.AutoDetect(conn), mySqlOptions =>
{
mySqlOptions.EnableStringComparisonTranslations();
})
.EnableSensitiveDataLogging(false)
.EnableDetailedErrors(false)
.LogTo(_ => { }); // disabilita EF logging;
});
builder.Services.AddLuxData(connectionString);
// registro connMultiplexer REDIS
builder.Services.AddSingleton<IConnectionMultiplexer>(redisConn);
// registro wrapper servizi REDIS
@@ -50,16 +28,10 @@ builder.Services.AddSingleton<RedisSubscriptionManager>();
// Aggiunta servizi specifici
builder.Services.AddSingleton<DataLayerServices>();
builder.Services.AddSingleton<ImageCacheService>();
builder.Services.AddSingleton<ConfigDataService>();
var app = builder.Build();
// aggiunt base URL x routing corretto
string baseUrl = configuration.GetValue<string>("ServerConf:BaseUrl") ?? "";
app.UsePathBase(baseUrl);
logger.Info($"BaseUrl: {baseUrl}");
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish>https://iis01.egalware.com/Lux/test/</SiteUrlToLaunchAfterPublish>
<ExcludeApp_Data>false</ExcludeApp_Data>
<ProjectGuid>8f1d6298-c1e6-44e6-82bd-4128ae17c0c7</ProjectGuid>
<SelfContained>false</SelfContained>
<MSDeployServiceURL>https://IIS01.egalware.com:8172/MsDeploy.axd</MSDeployServiceURL>
<DeployIisAppPath>Default Web Site/Lux/test</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>true</SkipExtraFilesOnServer>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<EnableMSDeployBackup>true</EnableMSDeployBackup>
<EnableMsDeployAppOffline>true</EnableMsDeployAppOffline>
<UserName>jenkins</UserName>
<_SavePWD>true</_SavePWD>
<_TargetId>IISWebDeploy</_TargetId>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
</Project>
+7 -19
View File
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@@ -29,32 +29,20 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="AsyncFixer">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="NLog" />
<PackageReference Include="NLog.Web.AspNetCore" />
<ProjectReference Include="..\Test.UI.Client\Test.UI.Client.csproj" />
<ProjectReference Include="..\WebAedificaConfigurator\WebAedificaConfigurator.csproj" />
<ProjectReference Include="..\WebWindowComplex\WebWindowComplex.csproj" />
<ProjectReference Include="..\WebWindowConfigurator\WebWindowConfigurator.csproj" />
<ProjectReference Include="..\WebWindowTest\WebWindowTest.csproj" />
<PackageReference Include="EgwCoreLib.Lux.Core" />
<PackageReference Include="EgwCoreLib.Lux.Data" />
<PackageReference Include="EgwCoreLib.Razor" />
<PackageReference Include="EgwCoreLib.Utils" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" />
<PackageReference Include="RestSharp" />
<PackageReference Include="EgwCoreLib.Lux.Core" Version="0.9.2509.1718" />
<PackageReference Include="EgwCoreLib.Lux.Data" Version="0.9.2509.1718" />
<PackageReference Include="EgwCoreLib.Razor" Version="1.5.2507.1815" />
<PackageReference Include="EgwCoreLib.Utils" Version="1.5.2507.1815" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.17" />
<PackageReference Include="RestSharp" Version="112.1.0" />
</ItemGroup>
<ItemGroup>
<None Update="Data\AntaDoppiaInglesine.jwd">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\ArcoAntaDoppia.jwd">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\AntaDoppia.jwd">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
-1
View File
@@ -1,5 +1,4 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
+13 -70
View File
@@ -1,81 +1,24 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"NLog": {
"variables": {
"baseFileDir": "${basedir}/logs/",
"layout": "${longdate} | ${uppercase:${level}} | ${logger:shortName=false} | ${message}"
},
// "internalLogLevel": "Info",
// "internalLogFile": "c:\\temp\\internal-nlog.txt",
"extensions": [
{ "assembly": "NLog.Extensions.Logging" },
{ "assembly": "NLog.Web.AspNetCore" }
],
"throwConfigExceptions": true,
"targets": {
"async": true,
"logfile": {
"type": "File",
"fileName": "${basedir}/logs/${shortdate}.log",
"layout": "${layout}",
"archiveEvery": "Day",
"archiveFileName": "${basedir}/logs/old/${shortdate}_{#}.log",
"archiveNumbering": "DateAndSequence",
"archiveAboveSize": "1024000",
"archiveDateFormat": "HH",
"maxArchiveFiles": "60",
"maxArchiveDays": "30"
},
"logconsole": {
"type": "ColoredConsole",
"layout": "${longdate} | ${uppercase:${level}} | ${logger:shortName=true} | ${message}"
}
},
"rules": [
{
"logger": "*",
"minLevel": "Trace",
"writeTo": "logconsole"
},
{
"logger": "*",
"minLevel": "Info",
"writeTo": "logfile"
}
]
},
"AllowedHosts": "*",
"ConnectionStrings": {
"Redis": "redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true",
"DefaultConnection": "Server=mdb.ufficio;port=3306;database=Lux_000;uid=lux_user;pwd=Egal_pwd!;sslmode=None;",
"Lux.All": "Server=mdb.ufficio;port=3306;database=Lux_000;uid=lux_user;pwd=Egal_pwd!;sslmode=None;"
"Redis": "redis.ufficio:26379, serviceName=devel, DefaultDatabase=6, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true"
},
"ServerConf": {
"BaseUrl": "/lux/test/",
"ChannelPng": "lux:png:img",
"ChannelSvg": "lux:svg:img",
"ChannelShape": "lux:shape:curr",
"ChannelHwList": "lux:hw:list",
"ChannelHwOpt": "lux:hw:opt",
"ChannelProfElem": "lux:prof:elem",
"ChannelProfList": "lux:prof:list",
"ChannelBom": "lux:bom",
"ChannelUpdate": "lux:update",
"ChannelPub": "EgwEngineInput",
"ChannelSub": "EgwEngineOutput",
"Prog.ApiUrl": "https://office.egalware.com/lux/srv/api",
"ImageBaseUrl": "window",
"GenericBaseUrl": "generic",
"ImageCalcTag": "svg-preview",
"ImageFileTag": "svgfile",
"ImageLiveTag": "svg",
"CalcTag": "calc"
}
"ServerConf": {
"PubChannel": "EgwEngineInput",
"SubChannel": "EgwEngineOutput",
"SvgChannel": "svg:img",
"Prog.ApiUrl": "https://office.egalware.com/lux/srv/api",
"ImageBaseUrl": "window",
"GenericBaseUrl": "generic",
"ImageLiveTag": "svg",
"ImageFileTag": "svgfile",
"ImageCalcTag": "svg-preview",
"CalcTag": "calc"
}
}
-21
View File
@@ -1,21 +0,0 @@
{
"version": "3.0",
"defaultProvider": "cdnjs",
"libraries": [
{
"provider": "cdnjs",
"library": "bootstrap@5.3.8",
"destination": "wwwroot/lib/bootstrap/"
},
{
"provider": "cdnjs",
"library": "font-awesome@7.0.1",
"destination": "wwwroot/lib/font-awesome/"
},
{
"provider": "cdnjs",
"library": "bootstrap-icons@1.13.1",
"destination": "wwwroot/lib/bootstrap-icons/"
}
]
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.1 MiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-circle-fill" viewBox="0 0 16 16">
<path d="M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-8.012 4.158c1.858 0 2.96-1.582 2.96-3.99V7.84c0-2.426-1.079-3.996-2.936-3.996-1.864 0-2.965 1.588-2.965 3.996v.328c0 2.42 1.09 3.99 2.941 3.99"/>
</svg>

Before

Width:  |  Height:  |  Size: 476 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-circle" viewBox="0 0 16 16">
<path d="M7.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8"/>
</svg>

Before

Width:  |  Height:  |  Size: 507 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-square-fill" viewBox="0 0 16 16">
<path d="M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99"/>
</svg>

Before

Width:  |  Height:  |  Size: 514 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-square" viewBox="0 0 16 16">
<path d="M7.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 579 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M9.283 4.002H7.971L6.072 5.385v1.271l1.834-1.318h.065V12h1.312z"/>
</svg>

Before

Width:  |  Height:  |  Size: 250 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
</svg>

Before

Width:  |  Height:  |  Size: 279 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm7.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
</svg>

Before

Width:  |  Height:  |  Size: 286 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-square" viewBox="0 0 16 16">
<path d="M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 366 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-123" viewBox="0 0 16 16">
<path d="M2.873 11.297V4.142H1.699L0 5.379v1.137l1.64-1.18h.06v5.961zm3.213-5.09v-.063c0-.618.44-1.169 1.196-1.169.676 0 1.174.44 1.174 1.106 0 .624-.42 1.101-.807 1.526L4.99 10.553v.744h4.78v-.99H6.643v-.069L8.41 8.252c.65-.724 1.237-1.332 1.237-2.27C9.646 4.849 8.723 4 7.308 4c-1.573 0-2.36 1.064-2.36 2.15v.057zm6.559 1.883h.786c.823 0 1.374.481 1.379 1.179.01.707-.55 1.216-1.421 1.21-.77-.005-1.326-.419-1.379-.953h-1.095c.042 1.053.938 1.918 2.464 1.918 1.478 0 2.642-.839 2.62-2.144-.02-1.143-.922-1.651-1.551-1.714v-.063c.535-.09 1.347-.66 1.326-1.678-.026-1.053-.933-1.855-2.359-1.845-1.5.005-2.317.88-2.348 1.898h1.116c.032-.498.498-.944 1.206-.944.703 0 1.206.435 1.206 1.07.005.64-.504 1.106-1.2 1.106h-.75z"/>
</svg>

Before

Width:  |  Height:  |  Size: 854 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M6.646 6.24c0-.691.493-1.306 1.336-1.306.756 0 1.313.492 1.313 1.236 0 .697-.469 1.23-.902 1.705l-2.971 3.293V12h5.344v-1.107H7.268v-.077l1.974-2.22.096-.107c.688-.763 1.287-1.428 1.287-2.43 0-1.266-1.031-2.215-2.613-2.215-1.758 0-2.637 1.19-2.637 2.402v.065h1.271v-.07Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 457 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M6.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
</svg>

Before

Width:  |  Height:  |  Size: 477 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm4.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
</svg>

Before

Width:  |  Height:  |  Size: 484 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-square" viewBox="0 0 16 16">
<path d="M6.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 564 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-8.082.414c.92 0 1.535.54 1.541 1.318.012.791-.615 1.36-1.588 1.354-.861-.006-1.482-.469-1.54-1.066H5.104c.047 1.177 1.05 2.144 2.754 2.144 1.653 0 2.954-.937 2.93-2.396-.023-1.278-1.031-1.846-1.734-1.916v-.07c.597-.1 1.505-.739 1.482-1.876-.03-1.177-1.043-2.074-2.637-2.062-1.675.006-2.59.984-2.625 2.12h1.248c.036-.556.557-1.054 1.348-1.054.785 0 1.348.486 1.348 1.195.006.715-.563 1.237-1.342 1.237h-.838v1.072h.879Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 607 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-circle" viewBox="0 0 16 16">
<path d="M7.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8"/>
</svg>

Before

Width:  |  Height:  |  Size: 642 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318"/>
</svg>

Before

Width:  |  Height:  |  Size: 634 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-square" viewBox="0 0 16 16">
<path d="M7.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 714 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-4-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M7.519 5.057c-.886 1.418-1.772 2.838-2.542 4.265v1.12H8.85V12h1.26v-1.559h1.007V9.334H10.11V4.002H8.176zM6.225 9.281v.053H8.85V5.063h-.065c-.867 1.33-1.787 2.806-2.56 4.218"/>
</svg>

Before

Width:  |  Height:  |  Size: 359 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-4-circle" viewBox="0 0 16 16">
<path d="M7.519 5.057q.33-.527.657-1.055h1.933v5.332h1.008v1.107H10.11V12H8.85v-1.559H4.978V9.322c.77-1.427 1.656-2.847 2.542-4.265ZM6.225 9.281v.053H8.85V5.063h-.065c-.867 1.33-1.787 2.806-2.56 4.218"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8"/>
</svg>

Before

Width:  |  Height:  |  Size: 421 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-4-square-fill" viewBox="0 0 16 16">
<path d="M6.225 9.281v.053H8.85V5.063h-.065c-.867 1.33-1.787 2.806-2.56 4.218"/>
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.519 5.057q.33-.527.657-1.055h1.933v5.332h1.008v1.107H10.11V12H8.85v-1.559H4.978V9.322c.77-1.427 1.656-2.847 2.542-4.265Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 428 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-4-square" viewBox="0 0 16 16">
<path d="M7.519 5.057q.33-.527.657-1.055h1.933v5.332h1.008v1.107H10.11V12H8.85v-1.559H4.978V9.322c.77-1.427 1.656-2.847 2.542-4.265ZM6.225 9.281v.053H8.85V5.063h-.065c-.867 1.33-1.787 2.806-2.56 4.218"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 493 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-5-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-8.006 4.158c1.74 0 2.924-1.119 2.924-2.806 0-1.641-1.178-2.584-2.56-2.584-.897 0-1.442.421-1.612.68h-.064l.193-2.344h3.621V4.002H5.791L5.445 8.63h1.149c.193-.358.668-.809 1.435-.809.85 0 1.582.604 1.582 1.57 0 1.085-.779 1.682-1.57 1.682-.697 0-1.389-.31-1.53-1.031H5.276c.065 1.213 1.149 2.115 2.72 2.115Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 495 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-5-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 1 14 0A7 7 0 0 1 1 8m15 0A8 8 0 1 0 0 8a8 8 0 0 0 16 0m-8.006 4.158c-1.57 0-2.654-.902-2.719-2.115h1.237c.14.72.832 1.031 1.529 1.031.791 0 1.57-.597 1.57-1.681 0-.967-.732-1.57-1.582-1.57-.767 0-1.242.45-1.435.808H5.445L5.791 4h4.705v1.103H6.875l-.193 2.343h.064c.17-.258.715-.68 1.611-.68 1.383 0 2.561.944 2.561 2.585 0 1.687-1.184 2.806-2.924 2.806Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 514 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-5-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.994 12.158c-1.57 0-2.654-.902-2.719-2.115h1.237c.14.72.832 1.031 1.529 1.031.791 0 1.57-.597 1.57-1.681 0-.967-.732-1.57-1.582-1.57-.767 0-1.242.45-1.435.808H5.445L5.791 4h4.705v1.103H6.875l-.193 2.343h.064c.17-.258.715-.68 1.611-.68 1.383 0 2.561.944 2.561 2.585 0 1.687-1.184 2.806-2.924 2.806Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 521 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-5-square" viewBox="0 0 16 16">
<path d="M7.994 12.158c-1.57 0-2.654-.902-2.719-2.115h1.237c.14.72.832 1.031 1.529 1.031.791 0 1.57-.597 1.57-1.681 0-.967-.732-1.57-1.582-1.57-.767 0-1.242.45-1.435.808H5.445L5.791 4h4.705v1.103H6.875l-.193 2.343h.064c.17-.258.715-.68 1.611-.68 1.383 0 2.561.944 2.561 2.585 0 1.687-1.184 2.806-2.924 2.806Z"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 601 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-6-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.21 3.855c-1.868 0-3.116 1.395-3.116 4.407 0 1.183.228 2.039.597 2.642.569.926 1.477 1.254 2.409 1.254 1.629 0 2.847-1.013 2.847-2.783 0-1.676-1.254-2.555-2.508-2.555-1.125 0-1.752.61-1.98 1.155h-.082c-.012-1.946.727-3.036 1.805-3.036.802 0 1.213.457 1.312.815h1.29c-.06-.908-.962-1.899-2.573-1.899Zm-.099 4.008c-.92 0-1.564.65-1.564 1.576 0 1.032.703 1.635 1.558 1.635.868 0 1.553-.533 1.553-1.629 0-1.06-.744-1.582-1.547-1.582"/>
</svg>

Before

Width:  |  Height:  |  Size: 617 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-6-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8.21 3.855c1.612 0 2.515.99 2.573 1.899H9.494c-.1-.358-.51-.815-1.312-.815-1.078 0-1.817 1.09-1.805 3.036h.082c.229-.545.855-1.155 1.98-1.155 1.254 0 2.508.88 2.508 2.555 0 1.77-1.218 2.783-2.847 2.783-.932 0-1.84-.328-2.409-1.254-.369-.603-.597-1.459-.597-2.642 0-3.012 1.248-4.407 3.117-4.407Zm-.099 4.008c-.92 0-1.564.65-1.564 1.576 0 1.032.703 1.635 1.558 1.635.868 0 1.553-.533 1.553-1.629 0-1.06-.744-1.582-1.547-1.582"/>
</svg>

Before

Width:  |  Height:  |  Size: 640 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-6-square-fill" viewBox="0 0 16 16">
<path d="M8.111 7.863c-.92 0-1.564.65-1.564 1.576 0 1.032.703 1.635 1.558 1.635.868 0 1.553-.533 1.553-1.629 0-1.06-.744-1.582-1.547-1.582"/>
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm6.21 3.855c1.612 0 2.515.99 2.573 1.899H9.494c-.1-.358-.51-.815-1.312-.815-1.078 0-1.817 1.09-1.805 3.036h.082c.229-.545.855-1.155 1.98-1.155 1.254 0 2.508.88 2.508 2.555 0 1.77-1.218 2.783-2.847 2.783-.932 0-1.84-.328-2.409-1.254-.369-.603-.597-1.459-.597-2.642 0-3.012 1.248-4.407 3.117-4.407Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 662 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-6-square" viewBox="0 0 16 16">
<path d="M8.21 3.855c1.612 0 2.515.99 2.573 1.899H9.494c-.1-.358-.51-.815-1.312-.815-1.078 0-1.817 1.09-1.805 3.036h.082c.229-.545.855-1.155 1.98-1.155 1.254 0 2.508.88 2.508 2.555 0 1.77-1.218 2.783-2.847 2.783-.932 0-1.84-.328-2.409-1.254-.369-.603-.597-1.459-.597-2.642 0-3.012 1.248-4.407 3.117-4.407Zm-.099 4.008c-.92 0-1.564.65-1.564 1.576 0 1.032.703 1.635 1.558 1.635.868 0 1.553-.533 1.553-1.629 0-1.06-.744-1.582-1.547-1.582"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 727 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-7-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.37 5.11h3.972v.07L6.025 12H7.42l3.258-6.85V4.002H5.369v1.107Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 251 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-7-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M5.37 5.11V4.001h5.308V5.15L7.42 12H6.025l3.317-6.82v-.07H5.369Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 279 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-7-square-fill" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm3.37 5.11V4.001h5.308V5.15L7.42 12H6.025l3.317-6.82v-.07H5.369Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 286 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-7-square" viewBox="0 0 16 16">
<path d="M5.37 5.11V4.001h5.308V5.15L7.42 12H6.025l3.317-6.82v-.07H5.369Z"/>
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
</svg>

Before

Width:  |  Height:  |  Size: 366 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-8-circle-fill" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-5.03 1.803c0-1.248-.943-1.84-1.646-1.992v-.065c.598-.187 1.336-.72 1.336-1.781 0-1.225-1.084-2.121-2.654-2.121s-2.66.896-2.66 2.12c0 1.044.709 1.589 1.33 1.782v.065c-.697.152-1.647.732-1.647 2.003 0 1.39 1.19 2.344 2.953 2.344 1.77 0 2.989-.96 2.989-2.355Zm-4.347-3.71c0 .739.586 1.255 1.383 1.255s1.377-.516 1.377-1.254c0-.733-.58-1.23-1.377-1.23s-1.383.497-1.383 1.23Zm-.281 3.645c0 .838.72 1.412 1.664 1.412.943 0 1.658-.574 1.658-1.412 0-.843-.715-1.424-1.658-1.424-.944 0-1.664.58-1.664 1.424"/>
</svg>

Before

Width:  |  Height:  |  Size: 686 B

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-8-circle" viewBox="0 0 16 16">
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-5.03 1.803c0 1.394-1.218 2.355-2.988 2.355-1.763 0-2.953-.955-2.953-2.344 0-1.271.95-1.851 1.647-2.003v-.065c-.621-.193-1.33-.738-1.33-1.781 0-1.225 1.09-2.121 2.66-2.121s2.654.896 2.654 2.12c0 1.061-.738 1.595-1.336 1.782v.065c.703.152 1.647.744 1.647 1.992Zm-4.347-3.71c0 .739.586 1.255 1.383 1.255s1.377-.516 1.377-1.254c0-.733-.58-1.23-1.377-1.23s-1.383.497-1.383 1.23Zm-.281 3.645c0 .838.72 1.412 1.664 1.412.943 0 1.658-.574 1.658-1.412 0-.843-.715-1.424-1.658-1.424-.944 0-1.664.58-1.664 1.424"/>
</svg>

Before

Width:  |  Height:  |  Size: 717 B

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-8-square-fill" viewBox="0 0 16 16">
<path d="M6.623 6.094c0 .738.586 1.254 1.383 1.254s1.377-.516 1.377-1.254c0-.733-.58-1.23-1.377-1.23s-1.383.497-1.383 1.23m-.281 3.644c0 .838.72 1.412 1.664 1.412.943 0 1.658-.574 1.658-1.412 0-.843-.715-1.424-1.658-1.424-.944 0-1.664.58-1.664 1.424"/>
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm8.97 9.803c0 1.394-1.218 2.355-2.988 2.355-1.763 0-2.953-.955-2.953-2.344 0-1.271.95-1.851 1.647-2.003v-.065c-.621-.193-1.33-.738-1.33-1.781 0-1.225 1.09-2.121 2.66-2.121s2.654.896 2.654 2.12c0 1.061-.738 1.595-1.336 1.782v.065c.703.152 1.647.744 1.647 1.992Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 737 B

Some files were not shown because too many files have changed in this diff Show More