365 Commits

Author SHA1 Message Date
Annamaria Sassi 55935e6809 - Correzione reset shape con variazione dimensione split
- Cambiato bottoni Joints in CardFrame
2026-05-11 16:50:10 +02:00
Annamaria Sassi f4072faedb Correzione sash dimension edit (se in edit e avviene una modifica non cambia stato) 2026-05-11 16:19:55 +02:00
Annamaria Sassi fd143bc5ec Aggiornata visualizzazione valore min e max elementi 2026-05-11 14:53:15 +02:00
Annamaria Sassi cfed9635b7 Merge branch 'main' into develop 2026-04-30 15:20:16 +02:00
Annamaria Sassi 61996b4db7 Merge branch 'develop' 2026-04-30 15:19:59 +02:00
Annamaria Sassi a2302094f1 Correzioni overlap elementi 2026-04-29 16:04:14 +02:00
Annamaria Sassi 396cecf492 - Correzione per eliminazione inglesina
- Correzione associazione famiglia hardware
2026-04-29 10:19:54 +02:00
Annamaria Sassi 8f0b54e30f Modificata aggiunta Inglesina in Frame e Vetro fisso 2026-04-23 16:48:37 +02:00
Annamaria Sassi ffe15c59a6 Correzioni inglesina 2026-04-22 08:51:31 +02:00
Annamaria Sassi f2ad83fd09 Correzioni 2026-04-16 17:53:16 +02:00
Annamaria Sassi 8f56f2e2a6 Merge branch 'main' into develop 2026-04-16 16:15:14 +02:00
Annamaria Sassi 832c2ee304 Merge commit '1e212ed3e143e301a4239d9e2767938ec1e32a8b' 2026-04-16 16:14:55 +02:00
Annamaria Sassi 1e212ed3e1 Correzioni inglesina 2026-04-16 09:31:25 +02:00
Annamaria Sassi 1e2dc2bae1 Correzini Inglesina 2026-04-15 11:26:40 +02:00
Annamaria Sassi baa2ced4b6 Correzioni 2026-04-14 15:15:34 +02:00
Annamaria Sassi 5e4907479b - Aggiunta Copy per Inglesina
- Iniziato a sistemare per converisone dimensione Inglesina
2026-04-14 13:08:38 +02:00
Annamaria Sassi d5fe7645dd Merge branch 'main' into develop 2026-04-13 14:49:01 +02:00
Annamaria Sassi 6fbb12ac94 Merge branch 'develop' 2026-04-13 14:48:39 +02:00
Annamaria Sassi 88a2ab66d1 Aggiunto inglesine 2026-04-13 13:35:23 +02:00
Annamaria Sassi 635197055f Edit Finestra doppia 2026-04-02 15:42:29 +02:00
Annamaria Sassi 7449dd50c8 Rimosso preselezione vecchio modo 2026-03-31 09:26:07 +02:00
Samuele Locatelli 030fd93895 Merge tag 'FixCiCd_Yaml_sln' into develop
Fix CI/CD x upload nuget
2026-03-30 16:55:03 +02:00
Samuele Locatelli 7eb42d2ee1 Merge branch 'release/FixCiCd_Yaml_sln' 2026-03-30 16:54:01 +02:00
Samuele Locatelli 2c2e314797 Merge branch 'develop' of https://gitlab.steamware.net/etis/webwindowconfigurator into develop 2026-03-30 16:52:08 +02:00
Samuele Locatelli 8b1d39663c Fix CI/CD yaml file x gitlab DEVOP: fix compilazione e nuget vari 2026-03-30 16:52:03 +02:00
Annamaria Sassi 1eb79fd20d Merge branch 'main' into develop 2026-03-30 16:43:49 +02:00
Annamaria Sassi c5042a2d2b Merge branch 'develop' 2026-03-30 16:43:25 +02:00
Annamaria Sassi 69a862961d Aggiornato salvataggio hardware prima delle domande 2026-03-30 16:43:00 +02:00
Samuele Locatelli 056f2f8978 Typo commenti 2026-03-30 16:02:11 +02:00
Samuele Locatelli 7566597475 Cambio wait message 2026-03-30 15:56:34 +02:00
Samuele Locatelli 59beafef78 Update nome soluzione 2026-03-30 15:44:01 +02:00
Samuele Locatelli 5d11a30e45 Merge tag 'AddTryAddParamsCheck' into develop
Fix gestione TryAdd x duplicati in chiavi missing
2026-03-30 15:43:07 +02:00
Samuele Locatelli a25a559364 Merge branch 'release/AddTryAddParamsCheck' 2026-03-30 15:42:54 +02:00
Samuele Locatelli aac150615c Fix x gestione deserializzazione Wood come chaive duplicata in check parametri 2026-03-30 15:41:34 +02:00
Annamaria Sassi a73268ed88 Merge branch 'main' into develop 2026-03-30 13:40:56 +02:00
Annamaria Sassi d8ac7d4122 Merge branch 'develop' 2026-03-30 13:40:36 +02:00
Annamaria Sassi 114d946818 Fix 2026-03-30 13:40:23 +02:00
Annamaria Sassi cbfbe59c91 Merge branch 'main' into develop 2026-03-30 13:20:44 +02:00
Annamaria Sassi df34efbcda Merge branch 'develop' 2026-03-30 13:20:03 +02:00
Annamaria Sassi d5aee28e8a Aggiunto controllo valori nulli dizionario PendReq 2026-03-30 13:19:40 +02:00
Annamaria Sassi c9e6c759aa Merge branch 'main' into develop 2026-03-30 12:28:53 +02:00
Annamaria Sassi 3bdb64cd90 Merge branch 'develop' 2026-03-30 12:28:35 +02:00
Annamaria Sassi 96f9ba262a Fix 2026-03-30 12:28:20 +02:00
Annamaria Sassi 35393c7254 Merge branch 'main' into develop 2026-03-30 12:25:50 +02:00
Annamaria Sassi 41eac04af8 Merge branch 'develop' 2026-03-30 12:25:19 +02:00
Annamaria Sassi 57160cd18c Cambiato nome Material in Wood 2026-03-30 12:24:58 +02:00
Annamaria Sassi c7a8fa9e99 Merge branch 'main' into develop 2026-03-30 10:46:32 +02:00
Annamaria Sassi e0d1d76260 Merge branch 'develop' 2026-03-30 10:46:14 +02:00
Annamaria Sassi 2d015ecf98 Fix gestione domande pendenti 2026-03-30 10:46:00 +02:00
Annamaria Sassi 662b504530 Merge branch 'main' into develop 2026-03-30 10:29:00 +02:00
Annamaria Sassi 33f613b61f Merge branch 'develop' 2026-03-30 10:28:46 +02:00
Annamaria Sassi b662cf2d9c Gestione domande pendenti 2026-03-30 10:28:30 +02:00
Annamaria Sassi 3315022da3 Merge branch 'main' into develop 2026-03-27 18:26:07 +01:00
Annamaria Sassi e727018602 Merge branch 'develop' 2026-03-27 18:25:52 +01:00
Annamaria Sassi 1708911a6b Gestione dizionario domande pendenti 2026-03-27 18:25:37 +01:00
Annamaria Sassi 81cfc8d57c Merge branch 'main' into develop 2026-03-27 17:36:27 +01:00
Annamaria Sassi 10f8bbcf55 Merge branch 'develop' 2026-03-27 17:36:06 +01:00
Annamaria Sassi ddb3cedd24 Aggiunto parametro per richieste pendenti 2026-03-27 17:35:52 +01:00
Annamaria Sassi fa6fe1600c Merge branch 'main' into develop 2026-03-27 16:38:47 +01:00
Annamaria Sassi d4f6fddba8 Merge branch 'develop' 2026-03-27 16:38:20 +01:00
Annamaria Sassi 429006b889 Modificata gestione forza parametri 2026-03-27 16:37:56 +01:00
Annamaria Sassi 52bdaec430 - Cambiata gestione inizializzazione dati
- Aggiunto reset shape nell'aggiunta sashGroup
- Tolta chiamatareset dict nel cambiare shape split
2026-03-24 12:01:58 +01:00
Annamaria Sassi c3fcfad641 Merge branch 'main' into develop 2026-03-20 17:12:53 +01:00
Annamaria Sassi 410aa5103e Merge branch 'develop' 2026-03-20 17:12:33 +01:00
Annamaria Sassi 83a1c62d26 Aggiornati controlli per chiamate 2026-03-20 17:12:07 +01:00
Samuele Locatelli f0e9ef706a Merge tag 'UpdateDisplaySvg_03' into develop
Fix comportamento componente x display
2026-03-20 10:33:00 +01:00
Samuele Locatelli 398e990430 Merge branch 'release/UpdateDisplaySvg_03' 2026-03-20 10:32:52 +01:00
Samuele Locatelli d031563e69 Fix componente x corretto display su cambio 2026-03-20 10:27:26 +01:00
Samuele Locatelli b1fe7dc02e Fix comportamento apgina test x partenza vuota/piena JWD + da nascosto a mostrato 2026-03-20 10:24:08 +01:00
Samuele Locatelli 5cbd973c22 Update logica gestione aggiornamento sul primo render con JWD vuoti 2026-03-20 10:00:51 +01:00
Samuele Locatelli 4f83692336 Riorganizzazione metodi protected - private per separare logica implementata da derivata 2026-03-20 10:00:35 +01:00
Annamaria Sassi 1518005f06 Aggiornati nuget EgwCoreLib 2026-03-18 18:08:12 +01:00
Samuele Locatelli 3137e96225 Merge branch 'main' into develop 2026-03-18 15:40:09 +01:00
Samuele Locatelli 6faaa74359 Fix test componente 2026-03-18 15:38:20 +01:00
Annamaria Sassi ae45bd5429 Correzione gestione joint sash 2026-03-18 11:25:47 +01:00
Annamaria Sassi 10e1a79b0a Gestione joint sash con aggiunta split nel frame 2026-03-16 18:28:59 +01:00
Annamaria Sassi 83161fd2c4 - Eliminazioni commenti
- Eliminazione funzioni non più usate
- Eliminazione pagine razor sostituite
2026-03-16 17:02:49 +01:00
Annamaria Sassi 171cc8cb90 Merge branch 'main' into develop 2026-03-16 10:40:22 +01:00
Annamaria Sassi cc7bf34ec1 Merge branch 'develop' 2026-03-16 10:40:02 +01:00
Annamaria Sassi 63c8c83143 - Aggiornata tabella gerarchia
- Allineamento bottoni joint
2026-03-16 10:39:37 +01:00
Annamaria Sassi 36c16e58bf Modificata gestione joint sash 2026-03-13 13:12:12 +01:00
Annamaria Sassi 01ec96e16f Merge branch 'main' into develop 2026-03-12 18:41:23 +01:00
Annamaria Sassi 1bb8251de8 Merge branch 'develop' 2026-03-12 18:41:04 +01:00
Annamaria Sassi 8c59d127d9 - Aggiunti bottoni aggiuni ed elimina nella tabella
- Joint sash per archi gestiti in automatico di tipo Angled
2026-03-12 18:40:44 +01:00
Annamaria Sassi 4055915efe Merge branch 'main' into develop 2026-03-11 09:05:11 +01:00
Annamaria Sassi ad751d2dfa Merge branch 'develop' 2026-03-11 09:04:45 +01:00
Annamaria Sassi 3e6ab70807 Aggiornata interfaccia tabella 2026-03-10 16:57:39 +01:00
Annamaria Sassi bab6831f71 Modificati bottoni misure e joint 2026-03-10 09:57:12 +01:00
Annamaria Sassi 0cbbb3290a Modifica per passare da split a griglia a orizzontale o verticale 2026-03-09 18:01:59 +01:00
Annamaria Sassi b16d98966c Merge branch 'main' into develop 2026-03-09 16:00:44 +01:00
Annamaria Sassi 1dda6a7221 Merge branch 'develop' 2026-03-09 16:00:23 +01:00
Annamaria Sassi 424357ffab Aggiornati elenchi con bottoni 2026-03-09 15:59:57 +01:00
Annamaria Sassi 197c7e277a Merge branch 'main' into develop 2026-03-06 16:44:36 +01:00
Annamaria Sassi 2478fd0d8e Merge branch 'develop' 2026-03-06 16:44:07 +01:00
Annamaria Sassi 2de7c431d7 Interfaccia parametri e jwd mancanti 2026-03-06 16:43:48 +01:00
Annamaria Sassi b0f08318de Merge branch 'main' into develop 2026-03-06 15:40:11 +01:00
Annamaria Sassi 6aaaa3e4d2 Merge branch 'develop' 2026-03-06 15:39:48 +01:00
Annamaria Sassi a49429eecd Fix jwd vuoto 2026-03-06 15:39:17 +01:00
Annamaria Sassi 97191f8a03 Merge branch 'main' into develop 2026-03-06 15:09:22 +01:00
Annamaria Sassi c57b2bf2e3 Merge branch 'develop' 2026-03-06 15:09:00 +01:00
Annamaria Sassi 5c3506b0fd Corretta gestione jwd vuoto 2026-03-06 15:06:51 +01:00
Annamaria Sassi b6991be6bc Modificato calcolo dimensione proporzionale 2026-03-06 11:23:59 +01:00
Annamaria Sassi bb140410ca Aggiornati jwd di esempio 2026-03-05 18:50:58 +01:00
Annamaria Sassi 63abe7a022 Correzione dimension di inizio split 2026-03-05 18:30:48 +01:00
Annamaria Sassi 4e75db06f1 Correzione conversione dimensione in proporzionale 2026-03-05 17:17:07 +01:00
Annamaria Sassi df44ae4bf2 Modificata proprietà SplitStartVert 2026-03-05 15:41:28 +01:00
Annamaria Sassi ff8e65ecef Merge branch 'main' into develop 2026-03-04 15:10:25 +01:00
Annamaria Sassi 001f17f15c Merge branch 'develop' 2026-03-04 15:10:08 +01:00
Annamaria Sassi 80d7da0830 Correzione 2026-03-04 15:09:44 +01:00
Annamaria Sassi 2aa207d0d7 - Gestione soglia quando viene eliminata anta
- Gestione spessore split in anta o meno
2026-03-04 14:48:23 +01:00
Annamaria Sassi 76b11e7ba1 Merge branch 'main' into develop 2026-03-03 19:06:05 +01:00
Annamaria Sassi 71775a48fb Merge branch 'develop' 2026-03-03 19:05:45 +01:00
Annamaria Sassi ada0fc2ce5 - Gestito salvataggio e chiusura componente con salvataggio jwd
- Correzioni valori nulli
- Aggiunta funzione per calcolare altezza sashGroup
2026-03-03 19:02:42 +01:00
Annamaria Sassi 224bac0947 Merge branch 'main' into develop 2026-03-02 18:32:25 +01:00
Annamaria Sassi 0ffaa38d12 Merge branch 'develop' 2026-03-02 18:31:58 +01:00
Annamaria Sassi e3cdc7c0eb Correzione calcolo larghezza split 2026-03-02 18:27:52 +01:00
Annamaria Sassi 522625710e - Modificata gestione overlap
- Modificato aggiornamento dimensioni a cascata
2026-03-02 17:04:11 +01:00
Annamaria Sassi 96b6deda20 Fix aggiornamento dimensioni sottoaree 2026-02-25 14:59:48 +01:00
Annamaria Sassi 36573dfa4e Modificato aggiornamento dimensioni sottoaree 2026-02-24 17:45:02 +01:00
Annamaria Sassi 940d6de755 Merge branch 'main' into develop 2026-02-20 13:10:41 +01:00
Annamaria Sassi 8b918929bc Merge branch 'develop' 2026-02-20 13:10:16 +01:00
Annamaria Sassi 82df3857fb - Modificato ricalcolo aree per modifica elemento
- Testo selezionato in grassetto nei dropdown
2026-02-20 13:08:54 +01:00
Annamaria Sassi e0bb0ddb20 Correzioni 2026-02-19 17:15:28 +01:00
Annamaria Sassi 5fc60445ac Aggiornata interfaccia 2026-02-18 18:16:51 +01:00
Annamaria Sassi d49655bee3 Merge branch 'main' into develop 2026-02-18 16:42:00 +01:00
Annamaria Sassi 4848f11994 Merge branch 'develop' 2026-02-18 16:41:38 +01:00
Annamaria Sassi 4a5c6654cc Migliorata interfaccia 2026-02-18 16:41:17 +01:00
Annamaria Sassi 7c836e3fbf Corretto calcolo altezza sottoarea split 2026-02-17 17:11:19 +01:00
Annamaria Sassi 44b68627e9 Fix 2026-02-17 16:40:33 +01:00
Annamaria Sassi 80a8d44172 - Iniziato ad aggiungere inglesine come split
- Corretto warnings
2026-02-17 16:14:04 +01:00
Annamaria Sassi 3baec4170a Merge branch 'main' into develop 2026-02-17 14:34:14 +01:00
Annamaria Sassi 07a068d8e5 Merge branch 'develop' 2026-02-17 14:33:46 +01:00
Annamaria Sassi 60bcd0c554 - Modificato ricalcolo dimensioni dopo aver modificato un singolo elemento
- Modificato calcolo dimensioni split
2026-02-17 13:17:16 +01:00
Annamaria Sassi e692d8249f Modificato aggiornamento dimensione anta vetro 2026-02-17 10:45:46 +01:00
Annamaria Sassi 39d5cb4367 Merge branch 'main' into develop 2026-02-17 10:20:58 +01:00
Annamaria Sassi ca64e6e595 Merge branch 'develop' 2026-02-17 10:20:31 +01:00
Annamaria Sassi c59585e25b Fix aggiornamento dimensioni a causa di una variazione delle dimensioni del frame 2026-02-17 10:19:45 +01:00
Annamaria Sassi 9cbe6df807 Modificato aggiornamento dimensioni split a causa di una variazione delle dimensioni del frame 2026-02-17 09:47:10 +01:00
Annamaria Sassi a886e7f324 - Modificato calcolo altezza split group
- Modificato aggiornamento dimensioni per cambio forma frame
2026-02-16 17:55:45 +01:00
Annamaria Sassi 44b1b8bbd3 - Gestita dimensione standard e solo luce per i cambi di tipologie di misure per sash e split
- Aggiornato metodo per cambiare numero di split
- Aggiornato metodo che calcola larghezza sashGroup e splitGroup
2026-02-12 18:26:13 +01:00
Annamaria Sassi a898ccced5 - Possibilità di nascondere figli multipli nella pagina con la gerarchia
- Gestione bottom rail del frame
2026-02-10 12:17:00 +01:00
Annamaria Sassi 3d092b53fb - Modificata gestione elementi split (su dimensione secondaria si specifica solo una larghezza per split)
- Aggiunta gestione profili bottom rail per sash e frame
- Iniziato a gestire dimensione solo luce per sash
2026-02-06 17:48:03 +01:00
Annamaria Sassi 5db36307da Aggiunto NLog 2026-02-05 10:50:56 +01:00
Annamaria Sassi 62d9d2f5c8 Aggiornati metodi async 2026-02-04 18:16:30 +01:00
Samuele Locatelli 7fbc1a5598 Aggiunta analizzatore x async compliance 2026-02-04 17:27:40 +01:00
Samuele Locatelli 133575c38b Merge tag 'UpdateDictCrash_02' into develop
Update con nuovo metodo request non gestito
2026-02-04 17:21:36 +01:00
Samuele Locatelli a6bdaf184f Merge branch 'release/UpdateDictCrash_02' 2026-02-04 17:21:04 +01:00
Samuele Locatelli 154d969ef4 Update metodi reset richieste 2026-02-04 17:20:38 +01:00
Samuele Locatelli f99dd90713 Merge tag 'UpdateDictCrash_01' into develop
revisione gestione refresh in UpdateTable
2026-02-04 16:55:13 +01:00
Samuele Locatelli de8dd09890 Merge branch 'release/UpdateDictCrash_01' 2026-02-04 16:54:55 +01:00
Samuele Locatelli c0ceb8f4e9 Update table comp x evitare (maybe) race condition in update table 2026-02-04 16:54:26 +01:00
Annamaria Sassi 5182fc2247 Merge branch 'main' into develop 2026-02-04 15:50:07 +01:00
Annamaria Sassi 4080f99b7d Merge branch 'develop' 2026-02-04 15:49:51 +01:00
Annamaria Sassi 3a87536ad3 Gestito hw option (reset e domanda) 2026-02-04 15:49:36 +01:00
Annamaria Sassi 36a777a4b4 Merge branch 'main' into develop 2026-02-04 10:29:30 +01:00
Annamaria Sassi 7de4c7d9e0 Merge branch 'develop' 2026-02-04 10:28:04 +01:00
Annamaria Sassi 5afb1c8842 Aggiornata costruzione finestra con vetro fisso partendo da jwd vuoto 2026-02-04 10:26:08 +01:00
Annamaria Sassi dff06ff704 Aggiunti nuovi hardware 2026-02-03 17:29:44 +01:00
Annamaria Sassi d43d1b6470 Merge branch 'develop' 2026-02-03 17:26:16 +01:00
Annamaria Sassi bb61341924 Gestito jwd vuoto creando frame con vetro fisso 2026-02-03 17:25:47 +01:00
Samuele Locatelli 8e11dc48b0 Merge branch 'main' into develop 2026-02-03 16:31:57 +01:00
Annamaria Sassi 31adc74841 Merge branch 'develop' 2026-02-03 16:27:05 +01:00
Annamaria Sassi e1ab802bbb Aggiornata versione a 3.1 2026-02-03 16:24:27 +01:00
Annamaria Sassi cb98adaa11 Gestione jwd vuoto 2026-02-03 16:15:58 +01:00
Samuele Locatelli 5d5ee71bb5 Merge tag 'UpdateDemo_01' into develop
Update x pubblicazione pre fiera
2026-02-03 15:19:44 +01:00
Samuele Locatelli 2248581045 Merge branch 'release/UpdateDemo_01' 2026-02-03 15:19:30 +01:00
Samuele Locatelli 52f886ecbf refresh 2026-02-03 15:18:54 +01:00
Annamaria Sassi fb69d47f62 Correzione 2026-02-02 18:28:31 +01:00
Annamaria Sassi 6636eacc04 - Impostato calcolo per dimensione solo luce
- Aggiunto reset lista profili elementi
- Aggiunta richiesta lista profili elementi per gli split
2026-02-02 16:59:25 +01:00
Annamaria Sassi 2f71c72ff4 Aggiornati jwd 2026-02-02 10:53:00 +01:00
Annamaria Sassi 662b309cde Modifica larghezza da interfaccia per bottom rail frame e sash 2026-01-30 10:58:58 +01:00
Annamaria Sassi 41cd75cdf8 Aggiunti element per Bottom rail 2026-01-29 18:00:18 +01:00
Annamaria Sassi be0ea6e42d Gestiti elementi degli split 2026-01-29 12:16:54 +01:00
Samuele Locatelli 3c5b6b0418 Merge tag 'AddAreaProfile_02' into develop
Update gestione obj profiles
2026-01-28 16:44:13 +01:00
Samuele Locatelli e9e66a204b Merge branch 'release/AddAreaProfile_02' 2026-01-28 16:43:59 +01:00
Annamaria Sassi 955b9cd6b2 Gestita risposta ProfElement 2026-01-28 16:07:34 +01:00
Annamaria Sassi f4762f402a Aggiornato AreaProfiles 2026-01-28 16:07:00 +01:00
Annamaria Sassi 576b5316f5 Merge branch 'develop' of https://gitlab.steamware.net/etis/webwindowconfigurator into develop 2026-01-28 11:27:01 +01:00
Annamaria Sassi ce8bd4fafc Corretti alcuni Warnings 2026-01-28 11:26:54 +01:00
Samuele Locatelli db524a7c26 Merge tag 'AddAreaProfile_01' into develop
Aggiunta passaggio info AreaProfile
2026-01-27 17:04:48 +01:00
Samuele Locatelli 5e10c8aca9 Merge branch 'release/AddAreaProfile_01' 2026-01-27 17:04:37 +01:00
Annamaria Sassi 3f96d71c30 Correzioni 2026-01-27 16:51:26 +01:00
Annamaria Sassi f18f2bb05a - Aggiornata gestione risposta AreaProfili
- Creata classe AreaProfili
- Non selezionabile soglia se non c'è un'anta
2026-01-27 12:46:37 +01:00
Annamaria Sassi 25c39470a0 Corretto Elementi split verticali 2026-01-27 10:45:57 +01:00
Annamaria Sassi 8a968c6ff0 Aggiornamento profili degli elementi 2026-01-26 17:22:55 +01:00
Annamaria Sassi 9a460ace4f Aggiornati JWD di inizializzazione 2026-01-26 16:52:50 +01:00
Samuele Locatelli bb1b24422c Merge tag 'FixGestioneSubmodeProfShape_03' into develop
Update componetne x nuova richiesta ProfShape
2026-01-26 15:05:08 +01:00
Samuele Locatelli 404fcd2760 Merge branch 'release/FixGestioneSubmodeProfShape_03' 2026-01-26 15:04:45 +01:00
Annamaria Sassi 93889a3aff Aggiornato readme 2026-01-26 14:28:23 +01:00
Annamaria Sassi 34a41ca85b Fix richiesta Profilo da Area 2026-01-26 11:34:36 +01:00
Samuele Locatelli e9fce48b37 Merge tag 'FixGestioneSubmodeProfShape_02' into develop
Update versione restSharp alla 113
2026-01-26 11:19:20 +01:00
Samuele Locatelli 144aad50f5 Merge branch 'release/FixGestioneSubmodeProfShape_02' 2026-01-26 11:18:57 +01:00
Samuele Locatelli 41bbc6278b Update versione restSharp 2026-01-26 11:18:33 +01:00
Samuele Locatelli 6c8035320c Merge tag 'FixGestioneSubmodeProfShape_01' into develop
Fix versione submode forma profili + fix gestione centralizzata num vers
pacchetti condivisi
2026-01-26 11:10:58 +01:00
Samuele Locatelli bff5daec02 Merge branch 'release/FixGestioneSubmodeProfShape_01' 2026-01-26 11:10:38 +01:00
Samuele Locatelli 5cde8ae3f6 Installata gestione conf centralizzata x progetto 2026-01-26 11:09:43 +01:00
Samuele Locatelli 4d0671e06d Fix versione enum corretto 2026-01-26 11:07:10 +01:00
Annamaria Sassi fd599e28b0 Merge branch 'develop' of https://gitlab.steamware.net/etis/webwindowconfigurator into develop 2026-01-26 11:04:38 +01:00
Annamaria Sassi 73f790378a Preparata nuova domanda per ricevere i profili degli Element 2026-01-26 10:55:47 +01:00
Annamaria Sassi d650a30091 - Aggiornata interfaccia degli ELement
- Numero Element dipendente dalla forma del Frame
2026-01-26 09:51:44 +01:00
Samuele Locatelli 97eab06e76 Merge tag 'RemoveDeprecatedThresh_01' into develop
Rimozione metodi deprecati
2026-01-23 09:44:35 +01:00
Samuele Locatelli 943051e73b Merge branch 'release/RemoveDeprecatedThresh_01' 2026-01-23 09:44:28 +01:00
Samuele Locatelli 5a6c91f9ca Update main x versione senza parametri deprecati 2026-01-23 09:43:42 +01:00
Annamaria Sassi 04d2b8201e - Eliminate aree deprecate
- Aggiunti parametri min e max degli elementi del frame e split
2026-01-23 09:24:49 +01:00
Samuele Locatelli edf2e2d068 commentato #if false aree deprecate 2026-01-22 16:18:14 +01:00
Samuele Locatelli 2b120f2813 Merge tag 'AddDeprecatedManaged_01' into develop
Inserita vera gestione dei deprecati x vecchie info threshold e profile
2026-01-22 16:13:09 +01:00
Samuele Locatelli f9df19961a Merge branch 'release/AddDeprecatedManaged_01' 2026-01-22 16:12:54 +01:00
Samuele Locatelli c0fd981d45 minor fix condizioni su profile/profileList + fix togliendo old data 2026-01-22 16:12:26 +01:00
Annamaria Sassi e1ba401353 Gestito parametro di ingresso lista Profili 2026-01-22 14:46:39 +01:00
Samuele Locatelli db317ccd77 Merge tag 'GestioneSoglie_04' into develop
update x gestione nuovo formato info elenco profili (nome, threshold,
dizionario parametri)
2026-01-22 09:25:42 +01:00
Samuele Locatelli bd48a52479 Merge branch 'release/GestioneSoglie_04' 2026-01-22 09:25:17 +01:00
Samuele Locatelli a0b9f9d4a8 Nuovo payload x info profile con dizionario parametri 2026-01-22 09:24:32 +01:00
Samuele Locatelli d689675ec7 Update proj vers 2.8 x cambio anno 2026-01-22 09:24:18 +01:00
Annamaria Sassi 115268816b Aggiunta larghezza elementi sash e split 2026-01-22 09:03:03 +01:00
Annamaria Sassi 220b29b4b7 Aggiunto larghezza elementi frame 2026-01-21 14:32:11 +01:00
Annamaria Sassi 10f0574e37 Cambiato file di partenza jwd 2026-01-21 14:31:17 +01:00
Annamaria Sassi aae2fa5ba7 Aggiunto livello utente (utente base vs utente avanzato) 2026-01-19 10:31:08 +01:00
Annamaria Sassi bc96177d74 Modificato componente semplificato 2026-01-19 10:29:50 +01:00
Annamaria Sassi 8ef408c244 Aggiunto componente semplificato (per utente base) 2026-01-16 15:10:19 +01:00
Annamaria Sassi 372dfd6f52 - Correzione dimensione split
- Eliminazione commenti
- Rinominato variabili
2026-01-13 18:45:23 +01:00
Annamaria Sassi b5d629c3d9 Modificata conversione valori dimensioni 2025-12-30 08:54:35 +01:00
Annamaria Sassi cc2263404d Aggiornato interfaccia 2025-12-23 17:21:38 +01:00
Annamaria Sassi 5cf6b3d870 Aggiornata gestione aggiunta split in frame (da testare) 2025-12-23 17:21:18 +01:00
Samuele Locatelli c2aee51edb Merge tag 'GestioneSoglie_03' into develop
Gestione eccezioni se mancasse threshold
2025-12-23 16:05:02 +01:00
Samuele Locatelli fa993cea8b Merge branch 'release/GestioneSoglie_03' 2025-12-23 16:04:53 +01:00
Samuele Locatelli 1a5192d613 Update x gestione valore Threshold mancante senza eccezioni 2025-12-23 16:04:38 +01:00
Samuele Locatelli 9dbde84a2c update demo data threshold 2025-12-23 15:36:32 +01:00
Samuele Locatelli 3961275dfc Merge tag 'GestioneSoglie_02' into develop
Conf Threshold come dizionario completo dall'inizio
2025-12-23 15:07:18 +01:00
Samuele Locatelli 9f615a9a82 Merge branch 'release/GestioneSoglie_02' 2025-12-23 15:07:05 +01:00
Annamaria Sassi cb2fa4cf4f Cambiata gestione lista threshold 2025-12-23 14:29:43 +01:00
Samuele Locatelli 703931868a Merge tag 'GestioneSoglie_01' into develop
Update nuget e gestione soglie
2025-12-23 12:07:56 +01:00
Samuele Locatelli 36db2cf282 Update nuget & dipendenze 2025-12-23 12:07:36 +01:00
Samuele Locatelli c1bd6cac5d Merge branch 'release/GestioneSoglie_01' 2025-12-23 12:03:49 +01:00
Annamaria Sassi 73a338e599 - Modificati nomi metodi sottocomponenti
- Aggiornato readme
2025-12-23 12:00:51 +01:00
Annamaria Sassi 10b63ff6b6 Aggiunta Threshold in Frame 2025-12-22 14:44:30 +01:00
Annamaria Sassi 5ad4baa471 Opzione hardware HMan trasformata da select a input 2025-12-22 09:17:08 +01:00
Annamaria Sassi 94c8124425 Aggiornati jwd di test 2025-12-22 09:15:54 +01:00
Annamaria Sassi b1c1afdf09 Componente con i template 2025-12-22 09:15:31 +01:00
Annamaria Sassi 2c9a7ac9c1 - Aggiornati nomi profili
- Modificato comportamento dimensioni ante se sono solo in percentuale o proporzionale
2025-12-18 12:32:41 +01:00
Annamaria Sassi 2b3f858422 Aggiornata gestione split a griglia 2025-12-17 18:28:34 +01:00
Annamaria Sassi 75261bb770 Aggiunto WIndowUid in interfaccia 2025-12-17 13:09:24 +01:00
Annamaria Sassi 623b5e80e1 Merge branch 'develop' of https://gitlab.steamware.net/etis/webwindowconfigurator into develop 2025-12-17 13:01:14 +01:00
Annamaria Sassi 8949762c34 - Corretti nomi profili disponibili
- Modifica tipi dimensione split
- Modificati valori CalcUid e windowUid a valori random
2025-12-17 13:01:07 +01:00
Samuele Locatelli 5ddaa52e92 Merge tag 'FixEventCallingArgs_01' into develop
Update gesitone event callings
2025-12-15 18:19:48 +01:00
Samuele Locatelli 409de844fe Merge branch 'release/FixEventCallingArgs_01' 2025-12-15 18:19:34 +01:00
Annamaria Sassi a8047f4ca8 - Corretto conversione tipi dimensioni
- Corretto aggiornamento dimensioni a causa di una modifica (no gestione split grid)
2025-12-15 18:17:36 +01:00
Annamaria Sassi 7e125dbb52 Correzione 2025-12-09 17:24:57 +01:00
Annamaria Sassi dae7ee80d9 - Disabilitata scelta dei joint del frame per Arc full, Double Arc, Three center arc
- Aggiunto InputDouble per le dimensioni
2025-12-09 12:46:31 +01:00
Annamaria Sassi 8e7bdb235f Aggiornato interfaccia 2025-12-05 16:54:25 +01:00
Samuele Locatelli 8db91ae95a Update gestione baseUrl
Update grafica x test deploy su develop
2025-12-05 16:06:06 +01:00
Samuele Locatelli d32939e748 Aggiunta ClientLibrary
Aggiunta IIS Deploy conf
2025-12-05 16:05:51 +01:00
Samuele Locatelli aac5c06bc2 Merge tag 'UpdateGestioneEventreport_01' into develop
update gestione eventi + inserimento nuove funzionalità (es measure
type)
2025-12-05 15:39:03 +01:00
Samuele Locatelli 1eb40dc91c Merge branch 'release/UpdateGestioneEventreport_01' 2025-12-05 15:38:45 +01:00
Annamaria Sassi b43071ceec - Aggiornato svuotamento dizionario shape e opzioni hw
- Aggiornato calcolo altezza split
2025-12-05 15:36:35 +01:00
Annamaria Sassi 5e3e535139 - Corretto conversione misure dimensioni
- Aggiornato tipi misure negli split (sia verticale sia orizzontale)
- Aggiornati commenti
2025-12-04 16:19:51 +01:00
Annamaria Sassi ba80c4eca0 Aggiornato inserimento dimensioni frame con arco 2025-12-02 18:19:57 +01:00
Annamaria Sassi dfe4ecd9d1 Aggiunto arc element per Frame e Sash (da rivedere) 2025-12-02 16:44:01 +01:00
Annamaria Sassi 5a7987d02b Aggiornate chiamate eventi 2025-12-01 08:55:18 +01:00
Annamaria Sassi de2f4ed9e9 Aggiornato modo per sollevare eventi di SashGroup, SashDimension 2025-11-26 17:07:25 +01:00
Annamaria Sassi afa394acec Fix nuovi eventi split 2025-11-26 13:00:39 +01:00
Annamaria Sassi 5f227241f8 - Aggiornato modo per sollevare gli eventi di Split
- Aggiunto componente per dimensioni split
2025-11-26 12:51:19 +01:00
Annamaria Sassi 30e69bde86 Aggiornato modo per sollevare gli eventi di Frame, Fill, Splitted, Joint 2025-11-26 10:30:53 +01:00
Annamaria Sassi f56ed1052d - Aggiunta gestione altezza singoli split
- Conversione tutti split ad uno stesso tipo
2025-11-25 09:49:41 +01:00
Annamaria Sassi 69eb70d5a6 Aggiornati jwd di esempio 2025-11-25 09:47:08 +01:00
Annamaria Sassi 1fed423ab0 - Aggiornato passaggio parametri tra componenti
- Aggiornata interfaccia sash
- Aggiornato jwd di base nel caso di sbagliata deserializzazione
- Aggiornato readme
2025-11-24 14:50:32 +01:00
Samuele Locatelli cf912c8f21 Aggiunto init basico in casi di errore deserializzazione x cambio formati 2025-11-20 17:58:46 +01:00
Annamaria Sassi 8c906a7b00 - Gestito tipi misura in split
- spostato joint in ogni anta
- cambiato interfaccia della singola anta
2025-11-20 17:47:05 +01:00
Annamaria Sassi d823112bed Aggiornati nomi canali e nuget 2025-11-18 15:47:30 +01:00
Annamaria Sassi 576404e6f1 Update settings & altro 2025-11-18 15:42:58 +01:00
Samuele Locatelli 254f9c75aa Merge branch 'feature/fix-HwOptions' 2025-11-18 11:51:26 +01:00
Annamaria Sassi 3c0f8a27f5 Aggiunto campo MeasureType in Split (non gestito) 2025-11-14 15:38:12 +01:00
Annamaria Sassi d63ec149b0 Gestiti i diversi tipi di dimensioni per sash 2025-11-13 19:05:36 +01:00
Annamaria Sassi 39a8634627 Aggiornato loading hw option 2025-11-11 16:45:05 +01:00
Samuele Locatelli cf7eccb3ba fix catena update hwopt 2025-11-11 09:49:24 +01:00
Annamaria Sassi d0a55fdeed Loading hw option 2025-11-11 09:04:03 +01:00
Samuele Locatelli a931d7f5d8 Update con esempio x gestione segnaposto, update e cascading aprameters 2025-11-10 16:30:56 +01:00
Samuele Locatelli ea44092919 nizio test sub components x update a cascata 2025-11-10 16:21:38 +01:00
Annamaria Sassi 6b06ec861e Aggiunti tipi di misure (absolut, proportional, percentage) per sashDimension 2025-11-10 15:22:04 +01:00
Samuele Locatelli 1d3edf121c Merge tag 'UpdatePostNameChange_01' into develop
Update componente x uso in LUX
2025-11-07 18:00:34 +01:00
Samuele Locatelli ca17ed3ea8 Merge branch 'release/UpdatePostNameChange_01' 2025-11-07 18:00:24 +01:00
Samuele Locatelli 1345dcfe19 Update librerie + refresh x main 2025-11-07 18:00:01 +01:00
Annamaria Sassi 4edcef86fc Aggiornata grafica 2025-11-07 16:20:30 +01:00
Annamaria Sassi 0e95f51b2b Fix rename Channel 2025-11-07 10:49:30 +01:00
Annamaria Sassi b57e7e1efb Aggiornat nomi Channel 2025-11-07 10:37:36 +01:00
Annamaria Sassi 4e21a36fef Aggiornato AGBOptionText per testi non editabili 2025-11-07 10:36:56 +01:00
Annamaria Sassi a08b8d4eb5 Eliminato template da WebWindowComplex 2025-11-06 15:06:43 +01:00
Annamaria Sassi b8829ab77d Aggiunto elemento di Loading mentre si aspetta la risposta delle opzioni 2025-11-06 10:32:50 +01:00
Annamaria Sassi 38c9a90e5f Aggiornato componente Test 2025-11-06 10:31:40 +01:00
Annamaria Sassi 68b5baf317 Aggiornato componente di Test 2025-11-06 10:31:09 +01:00
Annamaria Sassi e8cecb3113 - Aggiornati select con lista dati
- Aggiornato readme
2025-11-05 16:15:33 +01:00
Annamaria Sassi c11c82d880 Aggiornato nome JWD nel dizionario delle domanre con SerializedData 2025-11-05 16:14:14 +01:00
Annamaria Sassi ddd339fe74 Aggiunta forma al frame: Arco a tre centri 2025-11-05 16:12:43 +01:00
Annamaria Sassi ea2044c863 - Aggiunto reset shape con eliminazione sash group
- Aggiunto salvataggio tipo richiesta precedente
- Aggiunta gestione famiglia hw se non trovata dopo update shape
2025-11-04 10:42:07 +01:00
Samuele Locatelli d4e1a73d57 Update catena eventi x richiesta reset dizionario 2025-11-03 16:42:37 +01:00
Samuele Locatelli 15acb8936f Merge tag 'AddHwOptions' into develop
Aggiunta gestione HwOptions nel configuratore JWD
2025-11-03 15:51:03 +01:00
Samuele Locatelli c2cf25fcd8 Merge branch 'release/AddHwOptions' 2025-11-03 15:50:52 +01:00
Annamaria Sassi d384b9d5ed Aggiornati nomi tipologie aperture sash 2025-11-03 15:41:35 +01:00
Annamaria Sassi 86f3d59a98 - Aggiunto componente Hw Option e sua gestione
- Utilizzate liste nei select (forma frame, tipo apertura sash,  forma split)
2025-11-03 15:27:41 +01:00
Annamaria Sassi 0caf3ef83b Aggiornati eventi ricalcolo hw option e forma ante 2025-10-31 14:53:18 +01:00
Annamaria Sassi 64a2019b6d Aggiornati jwd con nuovi nomi variabili e hw option 2025-10-31 14:52:04 +01:00
Annamaria Sassi fe1e7735e3 Aggiornata nQtySash 2025-10-30 17:50:57 +01:00
Samuele Locatelli 16cf5eda54 update x forzare refresh 2025-10-30 15:19:39 +01:00
Annamaria Sassi 2e4bc8b4d3 Aggiunta serializzazione e deserializzazione Hw option 2025-10-30 14:52:12 +01:00
Samuele Locatelli 9d4d6128c3 Fix chiamata senza HW iniziale + altre in ordine 2025-10-29 16:52:59 +01:00
Samuele Locatelli 1525dd1da1 Fix x evitare doppia chiamata iniziale 2025-10-29 16:19:24 +01:00
Annamaria Sassi 86fe130edf Selezione hw option 2025-10-29 14:42:02 +01:00
Samuele Locatelli 3f8f97c29e update x dizionario optionsXML 2025-10-29 12:38:46 +01:00
Annamaria Sassi eaea52f45d Serializzazione hw option nel JWD 2025-10-28 15:04:04 +01:00
Annamaria Sassi 960d20e256 Aggiornato gestione AGBOptionText 2025-10-27 16:32:07 +01:00
Annamaria Sassi f187bbe5c5 Correzione struttura select 2025-10-27 14:40:15 +01:00
Annamaria Sassi c7a151e530 - Inizio gestione opzioni hardware
- Aggiunta chiamata per opzioni hardware
- Aggiunto componente per AGBOptionCombo
2025-10-27 13:19:24 +01:00
Samuele Locatelli d8da5ed827 Update catena aggiornamenti sath 2025-10-23 17:27:45 +02:00
Annamaria Sassi d477fb9319 Inserimento shape negli oggetti sash 2025-10-23 14:55:56 +02:00
Samuele Locatelli 1ed1658195 update x gestioen richeiste forme + svg corrette 2025-10-23 12:38:45 +02:00
Samuele Locatelli f3ad3e4ce4 Renaming forme (Frame) + readme 2025-10-23 10:26:50 +02:00
Annamaria Sassi e68847318f - Aggiornato readme
- Piccole correzioni
2025-10-23 09:50:12 +02:00
Samuele Locatelli 38ab3eee81 Ancora update x gestione ritorno dizionario forme validate 2025-10-22 19:20:31 +02:00
Samuele Locatelli 6b9ab0421c update parziale calcolo shape 2025-10-22 19:14:19 +02:00
Annamaria Sassi aa956217eb Aggiornato nome IdGroup in GroupId 2025-10-22 17:00:44 +02:00
Annamaria Sassi fad95d22b6 Correzioni 2025-10-22 16:48:04 +02:00
Samuele Locatelli b7a3497019 Update componenti comunicazione + inizio modifica gestione calcolo shape 2025-10-22 12:51:30 +02:00
Samuele Locatelli 39bfd3889e Modifica da testare con nuovo nuget 2025-10-21 19:12:54 +02:00
Samuele Locatelli adfb9b551f Merge tag 'AddOtherCalcUpdate_01' into develop
Aggiunta altre condizioni ricalcolo info
2025-10-21 17:49:49 +02:00
Samuele Locatelli eba2921522 Merge branch 'release/AddOtherCalcUpdate_01' 2025-10-21 17:49:41 +02:00
Samuele Locatelli b3eda12449 Aggiunta gestione richiesta calcolo post update hw type e shape 2025-10-21 17:48:49 +02:00
Samuele Locatelli 764cc634f0 Bozza metodi x nuove richieste x engine 2025-10-21 15:56:00 +02:00
Samuele Locatelli a658f12aff Update conf x leggere canale svg corretto 2025-10-20 18:46:18 +02:00
Annamaria Sassi fa23038e6f Merge branch 'main' into develop 2025-10-20 14:56:06 +02:00
Annamaria Sassi 00687d33e5 Merge branch 'develop' 2025-10-20 14:55:47 +02:00
Annamaria Sassi ff5bf48fc5 Fix dipendenze 2025-10-20 14:53:37 +02:00
Annamaria Sassi 22764917e9 Merge branch 'develop' of https://gitlab.steamware.net/etis/webwindowconfigurator into develop 2025-10-20 14:44:56 +02:00
Annamaria Sassi ad5977eb0f Aggiornati Nuget 2025-10-20 14:44:47 +02:00
Samuele Locatelli 025c7f584c Merge tag 'AddMassParamUpd_01' into develop
Update mass update params
2025-10-17 10:14:31 +02:00
Samuele Locatelli d1ad8fac6a Merge branch 'release/AddMassParamUpd_01' 2025-10-17 10:14:04 +02:00
Annamaria Sassi cfc019c8e7 aggiornata funzione SerialMan 2025-10-15 16:13:55 +02:00
Samuele Locatelli 1b57d2826a Aggiunto bozza serializzatore x mass modification 2025-10-15 11:57:54 +02:00
Samuele Locatelli d1bc2a2fe0 Merge tag 'UpdateCompo_01' into develop
iUpdate componenti a blocchi
2025-10-15 11:09:55 +02:00
Samuele Locatelli 0a659b1729 Merge branch 'release/UpdateCompo_01' 2025-10-15 11:09:41 +02:00
Samuele Locatelli 5dcb723a99 update vers 2025-10-15 11:09:23 +02:00
Annamaria Sassi 0b01ee68d9 Correzioni 2025-10-15 11:06:52 +02:00
Annamaria Sassi 90e6bc799a - Aggiunta lista Profili
- Aggiornato setup Hardware
2025-10-14 15:02:39 +02:00
Annamaria Sassi 0d8effa120 - Aggiunto componenti CardSashGroup e CardSplit
- Aggiornato visualizzazione componenti
2025-10-14 12:15:25 +02:00
Samuele Locatelli 0fb44da4c7 typo nullable area 2025-10-13 16:32:04 +02:00
Samuele Locatelli 9fd167e34e Update catena eventi controlli binded 2025-10-13 16:30:30 +02:00
Samuele Locatelli a3112a9929 Update catena update elementi frame 2025-10-13 16:12:19 +02:00
Annamaria Sassi 36eca36cee Corretto aggiornamento hardware se si cambia maniglia 2025-10-13 14:47:49 +02:00
Annamaria Sassi 698cc69b4c Aggiunto componente CardFrame 2025-10-13 13:36:03 +02:00
Annamaria Sassi d7cfc9de29 - Aggiunto componente CardTree
- Aggiunti commenti
- Enum di TableComp portati in un file esterno (LayoutConst)
2025-10-13 12:20:15 +02:00
Annamaria Sassi bd0e3536fb Gestione componente AreaSplit in CardFill 2025-10-13 10:41:03 +02:00
Samuele Locatelli 566dc8cf04 Eliminato area precedente CardFill 2025-10-10 17:35:51 +02:00
Samuele Locatelli 89bcf9e396 Gestione componente CardFill 2025-10-10 17:35:31 +02:00
Samuele Locatelli 01f7e5b072 Inizio riorganizzazione sotto-componenti 2025-10-10 17:05:25 +02:00
Samuele Locatelli c6867f4c0d Completata separazione huge file 2025-10-10 17:03:04 +02:00
Samuele Locatelli c5003bd644 Inizio spacchettamento file window delle classi di base del modello 2025-10-10 16:58:14 +02:00
Samuele Locatelli 17db9b16c6 Riorganizzazione window in folder models 2025-10-10 16:47:28 +02:00
Samuele Locatelli 0a904e9292 Update gestione componenti 2025-10-10 16:42:16 +02:00
Annamaria Sassi 0bdcefedcd Aggiunta componente indipendente per Area Split 2025-10-10 15:36:50 +02:00
Annamaria Sassi 3f9d919969 Aggiunto controllo per valore di Glass e Material scritto nel Jwd 2025-10-10 13:34:11 +02:00
Samuele Locatelli 0852e61f3b Merge tag 'FixCompoDataFlux_05' into develop
Fix con sottocomponenti del controllo
2025-10-10 12:18:54 +02:00
Samuele Locatelli dd2f6dcaa8 Merge branch 'release/FixCompoDataFlux_05' 2025-10-10 12:18:35 +02:00
Samuele Locatelli 55a84780a8 Spostato blocco general in compoente indipendente 2025-10-10 12:18:07 +02:00
Samuele Locatelli bd8aa4b025 Modifica fix rimozione/riaggiunta finestra
Estratto componente AreaFrame
2025-10-10 11:48:36 +02:00
Samuele Locatelli e3042e7d9e COmpletata prima review blocco gestione errori/warnings 2025-10-10 10:47:30 +02:00
Samuele Locatelli 6a35c5c871 Fix validazione preliminare liste parametri 2025-10-10 09:40:51 +02:00
Samuele Locatelli 843f043c12 Update gestione nuova lib window 2025-10-09 18:45:01 +02:00
2488 changed files with 163475 additions and 12921 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: 'Test.UI'
SOL_NAME: 'WebWindowConfigurator'
NUGET_PATH: 'C:\Tools\nuget.exe'
DEST: 'install'
@@ -146,7 +146,7 @@ Test.UI:build:
- win
variables:
APP_NAME: Test.UI
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
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: Test.UI
SOL_NAME: WebWindowConfigurator
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: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -211,7 +211,7 @@ WebWindowConfigurator:SDK:deploy:
- win
variables:
APP_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -234,7 +234,7 @@ WebWindowComplex:SDK:deploy:
- win
variables:
APP_NAME: WebWindowComplex
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Debug
before_script:
- *nuget-fix
@@ -260,7 +260,7 @@ WebWindowComplex:SDK:deploy:
# - win
# variables:
# APP_NAME: Test.UI
# SOL_NAME: Test.UI
# SOL_NAME: WebWindowConfigurator
# 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: Test.UI
# SOL_NAME: WebWindowConfigurator
# NEXUS_PATH: MP-LAND
# before_script:
# - *nuget-fix
@@ -307,7 +307,7 @@ WebWindowComplex:SDK:deploy:
# - win
# variables:
# APP_NAME: Test.UI
# SOL_NAME: Test.UI
# SOL_NAME: WebWindowConfigurator
# NEXUS_PATH: MP-LAND
# before_script:
# - *nuget-fix
@@ -328,7 +328,7 @@ WebWindow.Base:SDK:release:
- win
variables:
APP_NAME: WebWindow.Base
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Release
before_script:
- *nuget-fix
@@ -349,7 +349,7 @@ WebWindowConfigurator:SDK:release:
- win
variables:
APP_NAME: WebWindowConfigurator
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Release
before_script:
- *nuget-fix
@@ -370,7 +370,7 @@ WebWindowComplex:SDK:release:
- win
variables:
APP_NAME: WebWindowComplex
SOL_NAME: Test.UI
SOL_NAME: WebWindowConfigurator
NU_TYPE: Release
before_script:
- *nuget-fix
+24
View File
@@ -0,0 +1,24 @@
<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>
+104 -60
View File
@@ -1,93 +1,137 @@
# WebWindowConfigurator
Componente per configurare un serramento partendo da un JWD.
Durante la configurazione ad ogni cambiamento viene aggiornata l'immagine del serramento.
## Getting started
## Requisiti
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
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.
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)!
## Funzionalità componente
## Add your files
Il componente permette i seguenti comportamenti principali:
- [ ] [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:
- 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.
```
cd existing_repo
git remote add origin https://gitlab.steamware.net/etis/webwindowconfigurator.git
git branch -M main
git push -uf origin main
```
## JWD
## Integrate with your tools
Il JWD descrive la struttura e le caratteristiche di un serramento.
- [ ] [Set up project integrations](https://gitlab.steamware.net/etis/webwindowconfigurator/-/settings/integrations)
Un serramento è composto da un determinato tipo di elementi:
- Telaio (obbligatorio)
- Divisione (facoltativa)
- Gruppo ante (facoltativo)
- Riempimento (obbligatorio almeno un riempimento)
## Collaborate with your team
Al serramento sono associate le seguenti caratteristiche:
- Profilo;
- Materiale;
- Vetro;
- Colore serramento.
- [ ] [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/)
### Telaio (Frame)
## Test and Deploy
Al frame sono associate le seguenti caratteristiche:
- Forma;
- Dimensioni;
- Soglia;
- Giunti;
- Quantità bottom Rail.
Use the built-in continuous integration in GitLab.
#### Forme Telaio
- [ ] [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)
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.
***
### Divisione (Split)
# Editing this README
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.
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.
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).
## Suggestions for a good README
### Gruppo di ante (Sash group)
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.
Al gruppo di ante sono associate le seguenti caratteristiche:
- Numero di ante;
- Orientamento;
- Quantità bottom rail;
- Codice hardware.
## Name
Choose a self-explaining name for your project.
#### Singola anta
## 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.
La singola anta ha associate le seguenti caratteristiche:
- Tipologia di apertura;
- Dimensione;
- Tipo di misura della dimensione (assoluta, percentuale o proporzionale);
- Presenza maniglia;
- Giunti.
## 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.
#### Hardware
## 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.
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).
## 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 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.
## 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.
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.
## 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.
#### Opzioni Hardware
Le opzioni hardware vengono ricevute in formato xml.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
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.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
### Riempimento (Fill)
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.
Descrive il tipo di riempimento: vetro o pannello.
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.
## Richieste di informazioni a EgwMultiEnginManager
## 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.
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.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.17" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
</ItemGroup>
</Project>
+14 -5
View File
@@ -4,18 +4,27 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<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" /> *@
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="Test.UI.styles.css" />
<link rel="stylesheet" href="css/site.min.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
@* <HeadOutlet /> *@
<HeadOutlet @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
</head>
<body>
<Routes />
@* <Routes /> *@
@* <Routes @rendermode=RenderMode.InteractiveServer /> *@
<Routes @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
<script src="_framework/blazor.web.js"></script>
<script type="text/javascript" src="lib/bootstrap/js/bootstrap.min.js"></script>
</body>
</html>
@@ -0,0 +1,13 @@
<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>
@@ -0,0 +1,38 @@
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
@@ -0,0 +1,24 @@
@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>
}
@@ -0,0 +1,46 @@
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
}
}
+6 -4
View File
@@ -6,14 +6,16 @@
</div>
<main>
<div class="top-row px-4">
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
<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>
<article class="content px-4">
@Body
</article>
</main>
</div>
@@ -7,7 +7,7 @@
protected void UpdateNavDisplay()
{
navLarge = !navLarge;
sideClass = navLarge ? "sidebar" : "sidebarSmall";
sideClass = navLarge ? "sidebar shadow-sm" : "sidebarSmall shadow-sm";
}
private bool navLarge = true;
@@ -5,14 +5,13 @@
}
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, #d5f1f2, #d5f1f2);
background: -webkit-linear-gradient(to bottom, #c5d6ed, #c5d6ed);
/* Chrome 10-25, Safari 5.1-6 */
background: linear-gradient(to bottom, #d5f1f2, #d5f1f2);
background: linear-gradient(to bottom, #c5d6ed, #c5d6ed);
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
}
.top-row {
@@ -57,14 +56,12 @@ main {
.sidebar {
width: 13.5rem;
height: 100vh;
position: fixed;
position: sticky;
top: 0;
left: 0;
border-radius: 30px;
z-index: 1000;
}
.sidebarSmall {
width: 4.5rem;
width: 5.5rem;
height: 100vh;
position: sticky;
top: 0;
@@ -73,7 +70,7 @@ main {
.top-row {
position: sticky;
top: 0;
z-index: 1;
z-index: 1000;
}
.top-row,
article {
@@ -6,14 +6,13 @@
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, #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+ */
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+ */
}
.top-row {
@@ -64,15 +63,13 @@ main {
.sidebar {
width: 13.5rem;
height: 100vh;
position: fixed;
position: sticky;
top: 0;
left: 0;
border-radius: 30px;
z-index:1000;
}
.sidebarSmall {
width: 4.5rem;
width: 5.5rem;
height: 100vh;
position: sticky;
top: 0;
@@ -82,7 +79,7 @@ main {
.top-row {
position: sticky;
top: 0;
z-index: 1;
z-index: 1000;
}
.top-row, article {
+1 -1
View File
@@ -1 +1 @@
.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;}}
.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;}}
+17 -20
View File
@@ -2,7 +2,7 @@
@inject NavigationManager NavigationManager
<div class="top-row ps-3 navbar navbar-dark">
<div class="top-row ps-3 navbar navbar-dark shadow-sm">
<div class="container-fluid px-0 text-center">
@if (!showText)
{
@@ -12,41 +12,38 @@
{
<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="Home" Match="NavLinkMatch.All">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> Home
<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>
</div>
<div class="nav-item px-3">
<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 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>
</div>
<div class="nav-item px-3">
<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 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>
</div>
<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">
@* <div class="nav-item px-3">
<NavLink class="nav-link" href="EditJWD">
<span class="bi bi-house-fill px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">EditJWD</span>
<span class="fa-solid fa-gear px-2 fs-4" aria-hidden="true"></span> <span class="@hideText">EditJWD</span>
</NavLink>
</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>
</div> *@
</nav>
</div>
+1 -1
View File
@@ -13,7 +13,7 @@ namespace Test.UI.Components.Layout
NavigationManager.LocationChanged -= OnLocationChanged;
}
protected string hideText { get => showText ? "" : "invisible"; }
protected string hideText { get => showText ? "px-2" : "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 subChannel = "";
private string channelSub = "";
private string CalcUid = "TestBeam";
private string currSvg = "";
private string apiUrl = "";
@@ -27,7 +27,7 @@ namespace Test.UI.Components.Pages
public void Dispose()
{
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
DLService.PipeSvg.EA_NewMessage -= PipeSvg_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 async Task OnInitializedAsync()
protected override Task OnInitializedAsync()
{
ConfInit();
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
DLService.PipeSvg.EA_NewMessage += PipeSvg_EA_NewMessage;
//await ReloadData();
await Task.Delay(1);
return 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") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
channelSub = Config.GetValue<string>("ServerConf:ChannelSvg") ?? "";
}
private async Task SendBtlRequest(Dictionary<string, string> CurrArgs)
@@ -67,14 +67,14 @@ namespace Test.UI.Components.Pages
}
}
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
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($"{subChannel}:{CalcUid}"))
if (currArgs.msgUid.Equals($"{channelSub}:{CalcUid}"))
{
currSvg = currArgs.newMessage;
}
+32
View File
@@ -0,0 +1,32 @@
@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
@@ -0,0 +1,555 @@
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
}
}
+93 -9
View File
@@ -1,14 +1,95 @@
@page "/EditJWD"
@page "/"
@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> *@
<WebWindowComplex.TableComp ListPayload="SetupList"
LiveData="CurrData"
EC_OnUpdate="SaveJWD"
EC_OnClose="CloseObj">
</WebWindowComplex.TableComp>
@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>
}
@if (!string.IsNullOrEmpty(outClose))
{
@@ -22,6 +103,9 @@ else if (!string.IsNullOrEmpty(outSave))
@outSave
</div>
}
<p>
@currJwd
</p>
<div class="card">
<div class="card-body small">
@JsonSer
</div>
</div>
+416 -168
View File
@@ -1,86 +1,56 @@
using EgwCoreLib.Lux.Core;
using Egw.Window.Data;
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.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
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
protected string currJwd = "...";
protected string prevJwd = "";
protected Dictionary<string, string> m_CurrArgs = new Dictionary<string, string>();
/// <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;
#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;");
@@ -90,72 +60,409 @@ 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();
InitialJwd = File.ReadAllText("Data\\AntaDoppia.jwd");
currJwd = InitialJwd;
await ReloadBaseList();
User = false;
Random random = new Random();
CalcUid = Convert.ToString(random.Next(1000, 10000));
windowUid = CalcUid;
currJwd = initialJwd;
// rileggo altri dati
await ReloadData();
//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();
// preparo conf oggetti x controllo
SetupList = SetupList = new BaseListPayload()
SetupList = new BaseListPayload()
{
ColorMaterial = AvailColorMaterialList,
FamilyHardware = AvailFamilyHardwareList,
Glass = AvailGlassList,
Hardware = AvailHardwareList,
Material = AvailMaterialList,
TemplateDTO = null
Wood = AvailWoodList,
ProfileList = profList
};
CurrData = new LivePayload()
{
InitJwd = InitialJwd,
SvgPreview = currSvg
CurrJwd = currJwd,
SvgPreview = currSvg,
DictShape = currGroupShape,
DictOptionsXml = currHwOption
};
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
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;
}
/// <summary>
/// Configurazione elenchi anagrafiche
/// </summary>
protected BaseListPayload SetupList = new BaseListPayload();
/// <summary>
/// Predisposizione valori live SVG/JWD
/// </summary>
protected LivePayload CurrData = new LivePayload();
#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>
/// Predisposizione valori live SVG/JWD
/// </summary>
private LivePayload CurrData = new LivePayload();
private List<AreaProfiles> currElement = new List<AreaProfiles>();
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 = "";
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 TemplateSelectDTO? currSel = null;
private string channelHwOpt = "";
private string channelProfElem = "";
private string channelProfList = "";
private string channelShape = "";
private string channelSvg = "";
private string currSvg = "";
private string imgBasePath = "";
private bool doEdit = false;
private string GenericBasePath = "";
private string subChannel = "";
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 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
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
/// <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)
{
// aggiorno visualizzazione
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly SVG da mostrare
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}"))
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}"))
{
currSvg = currArgs.newMessage;
CurrData.SvgPreview = currArgs.newMessage;
@@ -165,101 +472,42 @@ namespace Test.UI.Components.Pages
await Task.Delay(1);
}
private void ConfInit()
private void SetEdit(Microsoft.AspNetCore.Components.Web.MouseEventArgs args)
{
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") ?? "";
doEdit = true;
}
/// <summary>
/// Rilettura dati
/// </summary>
/// <returns></returns>
private async Task ReloadData()
private Task ToggleJwd()
{
//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);
startEmpty = !startEmpty;
currJwd = initialJwd;
currSvg = "";
CurrData.CurrJwd = currJwd;
CurrData.SvgPreview = currSvg;
return InvokeAsync(StateHasChanged);
}
private async Task SaveJWD(Dictionary<string, string> CurrArgs)
private async Task UpdateInfoJwdAsync(string currSer, string? newFamilyHardware, string? newColorMaterial, string? newWood, string? newGlass, string? newProfile)
{
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);
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;
}
#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
@@ -1,36 +0,0 @@
@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
@@ -1,35 +0,0 @@
@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
@@ -1,280 +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 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
}
}
+30 -14
View File
@@ -1,23 +1,39 @@
@page "/"
@page "/Home"
@page "/Home"
@rendermode InteractiveServer
<PageTitle>Home</PageTitle>
<PageTitle>Select template</PageTitle>
@if (isLoading)
@if(SelTemplate == null)
{
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
<WebWindowMaker TemplateDTOList="@AvailTemplateList"
EC_OnSelectedTemplate="SetTemplate">
</WebWindowMaker>
}
else
{
<WebWindowMaker IN_TemplateDTOList="@AvailTemplateList"
IN_SelTemplate="@SelTemplate"
EC_OnUpdate="SaveJWD"
EC_OnSelectedTemplate="SetTemplate"
LiveSVG="@currSvg">
</WebWindowMaker>
<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>
}
@* <p>
@m_CurrArgs.GetValueOrDefault("Jwd")
</p> *@
+224 -57
View File
@@ -4,6 +4,9 @@ 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
@@ -12,7 +15,7 @@ namespace Test.UI.Components.Pages
{
#region Public Properties
public Template SelTemplate { get; set; } = new Template(0, "---SELECT---", "", "");
public Template SelTemplate { get; set; } = new Template(0, "", "", "") ;
#endregion Public Properties
@@ -20,15 +23,30 @@ namespace Test.UI.Components.Pages
public void Dispose()
{
DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage;
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
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
@@ -36,6 +54,37 @@ 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!;
@@ -58,15 +107,25 @@ namespace Test.UI.Components.Pages
#region Protected Methods
protected override async Task OnInitializedAsync()
protected override void OnAfterRender(bool firstRender)
{
isLoading = true;
ConfInit();
DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
await ReloadData();
if (firstRender)
{
// JS interop or data fetches go here
isInteractive = true;
}
}
protected override Task OnInitializedAsync()
{
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();
}
private bool isLoading = false;
#endregion Protected Methods
@@ -75,50 +134,41 @@ namespace Test.UI.Components.Pages
private string apiUrl = "";
private string calcTag = "";
private string CalcUid = "CurrWindow";
private string cFile = "Data/Setup.json";
private string cFileTemplate = "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 subChannel = "";
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;
#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
private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e)
/// <summary>
/// Effettua chiusura oggetto con eventuale save
/// </summary>
/// <param name="reqSave"></param>
private void CloseObj(DataSave reqSave)
{
// 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);
currJwd = reqSave.currJwd;
outClose = !reqSave.ForceSave ? "Richiesto chiusura!" : "";
outSave = reqSave.ForceSave ? "Richiesto salvataggio!" : "";
}
private void ConfInit()
@@ -127,7 +177,118 @@ namespace Test.UI.Components.Pages
imgBasePath = Config.GetValue<string>("ServerConf:ImageBaseUrl") ?? "";
GenericBasePath = Config.GetValue<string>("ServerConf:GenericBaseUrl") ?? "";
calcTag = Config.GetValue<string>("ServerConf:CalcTag") ?? "";
subChannel = Config.GetValue<string>("ServerConf:SvgChannel") ?? "";
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);
}
/// <summary>
@@ -136,13 +297,13 @@ namespace Test.UI.Components.Pages
/// <returns></returns>
private async Task ReloadData()
{
//return base.OnInitializedAsync();
// Caricamento lista Template
AvailTemplateList = new List<TemplateSelectDTO>();
await Task.Delay(100);
// brutale, da rivedere...
if (File.Exists(cFile))
if (File.Exists(cFileTemplate))
{
string rawVal = File.ReadAllText(cFile);
string rawVal = File.ReadAllText(cFileTemplate);
var rawList = JsonConvert.DeserializeObject<List<TemplateSelectDTO>>(rawVal) ?? new List<TemplateSelectDTO>();
// calcolo URL immagini... DTO interno da rivedere?
@@ -153,19 +314,16 @@ namespace Test.UI.Components.Pages
AvailTemplateList.Add(item);
}
}
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)
// Caricamento lista hardware
AvailHardwareList = new List<Hardware>();
if (File.Exists(cFileHardware))
{
CalcRequestDTO calcRequestDTO = new CalcRequestDTO();
calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW;
calcRequestDTO.DictExec = m_CurrArgs;
await ICService.CallRestPost($"{apiUrl}/{GenericBasePath}", $"{calcTag}/{CalcUid}", calcRequestDTO);
string rawValHW = File.ReadAllText(cFileHardware);
var rawListHW = JsonConvert.DeserializeObject<List<Hardware>>(rawValHW) ?? new List<Hardware>();
foreach (var item in rawListHW)
{
AvailHardwareList.Add(item);
}
}
}
@@ -179,6 +337,15 @@ 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
@@ -0,0 +1,31 @@
@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>
@@ -0,0 +1,350 @@
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
}
}
@@ -1,25 +0,0 @@
@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>
@@ -1,217 +0,0 @@
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
}
}
@@ -1,24 +0,0 @@
@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>
@@ -1,215 +0,0 @@
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
@@ -0,0 +1,40 @@
@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
@@ -0,0 +1,630 @@
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
@@ -0,0 +1,50 @@
@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
@@ -0,0 +1,51 @@
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
}
}
+130 -49
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,82 +8,163 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 1200.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"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
}
],
"JointList": [
{
"nIndex": 1,
"JointType": "FULL_V"
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"JointType": "FULL_V"
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"JointType": "FULL_V"
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"JointType": "FULL_V"
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"bIsSashVertical": true,
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"nSashId": 1,
"OpeningType": "TURNONLY_LEFT",
"bHasHandle": false,
"dDimension": 50.0
"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": 2,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"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"
}
]
}
],
"SashType": "NULL",
"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,
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000631",
"HwOptionList": [],
"GroupId": 2,
"AreaList": [
{
"IdGroup": 3,
"GroupId": 3,
"AreaList": [
{
"IdGroup": 4,
"FillType": "GLASS",
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -91,11 +172,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 5,
"GroupId": 5,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 6,
"GroupId": 6,
"AreaList": [],
"AreaType": "FILL"
}
+367
View File
@@ -0,0 +1,367 @@
{
"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"
}
]
}
+97 -28
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,73 +8,142 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 800.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"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
}
],
"JointList": [
{
"nIndex": 1,
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"bIsSashVertical": true,
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"nSashId": 1,
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"bHasHandle": true,
"dDimension": 100.0
"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"
}
]
}
],
"SashType": "NULL",
"JointList": [
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000623",
"HwOptionList": [
{
"nIndex": 1,
"JointType": "FULL_H"
"Name": "Entrata",
"Value": "15"
},
{
"nIndex": 2,
"JointType": "FULL_H"
"Name": "LavManigliaPassante",
"Value": "false"
},
{
"nIndex": 3,
"JointType": "FULL_H"
"Name": "PosizioneForoCilindro",
"Value": "sopra"
},
{
"nIndex": 4,
"JointType": "FULL_H"
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "500"
}
],
"Hardware": "000558",
"IdGroup": 2,
"GroupId": 2,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 3,
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
+198
View File
@@ -0,0 +1,198 @@
{
"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"
}
]
}
+164 -44
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,37 +8,57 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"dValue": 2100.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": [
{
"nIndex": 1,
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"SplitShape": "HORIZONTAL",
@@ -46,22 +66,32 @@
"SplitVertList": [],
"SplitHorizList": [
{
"bIsRelative": true,
"dDimension": 40.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
},
{
"bIsRelative": true,
"dDimension": 60.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
}
],
"IdGroup": 2,
"ElementDimVertList": [],
"ElementDimHorizList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
}
],
"GroupId": 7,
"AreaList": [
{
"IdGroup": 3,
"GroupId": 9,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 4,
"GroupId": 10,
"AreaList": [],
"AreaType": "FILL"
}
@@ -69,52 +99,142 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 5,
"GroupId": 8,
"AreaList": [
{
"bIsSashVertical": true,
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"nSashId": 1,
"OpeningType": "TURNONLY_LEFT",
"bHasHandle": false,
"dDimension": 50.0
"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": 2,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"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"
}
]
}
],
"SashType": "NULL",
"JointList": [
"BottomRail": false,
"BottomRailQty": 0,
"BottomRailElemDimList": [],
"Hardware": "000631",
"HwOptionList": [
{
"nIndex": 1,
"JointType": "FULL_H"
"Name": "Entrata",
"Value": "15"
},
{
"nIndex": 2,
"JointType": "FULL_H"
"Name": "LavManigliaPassante",
"Value": "false"
},
{
"nIndex": 3,
"JointType": "FULL_H"
"Name": "PosizioneForoCilindro",
"Value": "sopra"
},
{
"nIndex": 4,
"JointType": "FULL_H"
"Name": "Deviatore",
"Value": "false"
},
{
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "170"
}
],
"Hardware": "000559",
"IdGroup": 6,
"GroupId": 2,
"AreaList": [
{
"IdGroup": 7,
"GroupId": 3,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 8,
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -122,11 +242,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 9,
"GroupId": 5,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 10,
"GroupId": 6,
"AreaList": [],
"AreaType": "FILL"
}
+168 -74
View File
@@ -1,106 +1,178 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
{
"Shape": "DOUBLECHAMFER",
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"dValue": 1500.0
"Index": 2,
"Name": "Height",
"Value": 1200.0
}
],
"ElementDimensionList": [
{
"Index": 1,
"Value": 78.0
},
{
"nIndex": 3,
"sName": "Full Height",
"dValue": 1800.0
"Index": 2,
"Value": 78.0
},
{
"Index": 3,
"Value": 78.0
},
{
"Index": 4,
"Value": 78.0
}
],
"JointList": [
{
"nIndex": 1,
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"SplitShape": "VERTICAL",
"SplitStartVert": true,
"SplitVertList": [
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
},
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
}
],
"SplitHorizList": [],
"IdGroup": 2,
"ElementDimVertList": [
{
"Index": 1,
"Value": 85.0,
"Area": 0
}
],
"ElementDimHorizList": [],
"GroupId": 5,
"AreaList": [
{
"IdGroup": 3,
"GroupId": 6,
"AreaList": [
{
"bIsSashVertical": true,
"IsSashVertical": true,
"IsDimensionLight": true,
"SashList": [
{
"nSashId": 1,
"SashId": 1,
"OpeningType": "TILTTURN_LEFT",
"bHasHandle": true,
"dDimension": 100.0
"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"
}
]
}
],
"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,
"Hardware": "000558",
"IdGroup": 4,
"BottomRailElemDimList": [],
"Hardware": "000635",
"HwOptionList": [
{
"Name": "Entrata",
"Value": "15"
},
{
"Name": "LavManigliaPassante",
"Value": "false"
},
{
"Name": "PosizioneForoCilindro",
"Value": "sopra"
},
{
"Name": "ModelloCilindro",
"Value": "c999"
},
{
"Name": "LavCilindroPassante",
"Value": "false"
},
{
"Name": "HMan",
"Value": "500"
}
],
"GroupId": 2,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 5,
"GroupId": 4,
"AreaList": [],
"AreaType": "FILL"
}
@@ -111,45 +183,67 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 6,
"GroupId": 7,
"AreaList": [
{
"bIsSashVertical": true,
"IsSashVertical": true,
"IsDimensionLight": false,
"SashList": [
{
"nSashId": 1,
"OpeningType": "TILTTURN_RIGHT",
"bHasHandle": true,
"dDimension": 100.0
"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"
}
]
}
],
"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,
"Hardware": "000558",
"IdGroup": 7,
"BottomRailElemDimList": [],
"Hardware": "000635",
"HwOptionList": [],
"GroupId": 9,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 8,
"GroupId": 8,
"AreaList": [],
"AreaType": "FILL"
}
+79 -35
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,73 +8,117 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"dValue": 1800.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": [
{
"nIndex": 1,
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"SplitShape": "GRID",
"SplitStartVert": false,
"SplitVertList": [
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
},
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"SplitHorizList": [
{
"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
"IsRelative": true,
"Dimension": 1.0,
"MeasureType": "PROPORTIONAL"
}
],
"IdGroup": 2,
"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,
"AreaList": [
{
"IdGroup": 3,
"GroupId": 12,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 4,
"GroupId": 13,
"AreaList": [],
"AreaType": "FILL"
}
@@ -82,11 +126,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 5,
"GroupId": 14,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 6,
"GroupId": 15,
"AreaList": [],
"AreaType": "FILL"
}
@@ -94,11 +138,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 7,
"GroupId": 16,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 8,
"GroupId": 17,
"AreaList": [],
"AreaType": "FILL"
}
@@ -106,11 +150,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 9,
"GroupId": 18,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 10,
"GroupId": 19,
"AreaList": [],
"AreaType": "FILL"
}
@@ -118,11 +162,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 11,
"GroupId": 20,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 12,
"GroupId": 21,
"AreaList": [],
"AreaType": "FILL"
}
@@ -130,11 +174,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 13,
"GroupId": 22,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 14,
"GroupId": 23,
"AreaList": [],
"AreaType": "FILL"
}
+120
View File
@@ -0,0 +1,120 @@
{
"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"
}
]
}
+51 -21
View File
@@ -1,6 +1,6 @@
{
"ProfilePath": "Profilo78",
"Material": "Pino",
"Wood": "Pino",
"ColorMaterial": "Black",
"Glass": "Vetro BE 2S 4T/16/4T",
"AreaList": [
@@ -8,60 +8,90 @@
"Shape": "RECTANGLE",
"DimensionList": [
{
"nIndex": 1,
"sName": "Width",
"dValue": 1500.0
"Index": 1,
"Name": "Width",
"Value": 800.0
},
{
"nIndex": 2,
"sName": "Height",
"dValue": 1800.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": [
{
"nIndex": 1,
"Index": 1,
"JointType": "FULL_H"
},
{
"nIndex": 2,
"Index": 2,
"JointType": "FULL_H"
},
{
"nIndex": 3,
"Index": 3,
"JointType": "FULL_H"
},
{
"nIndex": 4,
"Index": 4,
"JointType": "FULL_H"
}
],
"Threshold": "Bottom",
"BottomRail": false,
"BottomRailQty": 0,
"IdGroup": 1,
"BottomRailElemDimList": [],
"GroupId": 1,
"AreaList": [
{
"SplitShape": "VERTICAL",
"SplitStartVert": true,
"SplitVertList": [
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
},
{
"bIsRelative": true,
"dDimension": 50.0
"IsRelative": true,
"Dimension": 50.0,
"MeasureType": "PERCENTAGE"
}
],
"SplitHorizList": [],
"IdGroup": 2,
"ElementDimVertList": [
{
"Index": 1,
"Value": 78.0,
"Area": 0
}
],
"ElementDimHorizList": [],
"GroupId": 8,
"AreaList": [
{
"IdGroup": 3,
"GroupId": 9,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 4,
"GroupId": 7,
"AreaList": [],
"AreaType": "FILL"
}
@@ -69,11 +99,11 @@
"AreaType": "SPLITTED"
},
{
"IdGroup": 5,
"GroupId": 10,
"AreaList": [
{
"FillType": "GLASS",
"IdGroup": 6,
"GroupId": 11,
"AreaList": [],
"AreaType": "FILL"
}
+368
View File
@@ -0,0 +1,368 @@
{
"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"
}
]
}
+23 -11
View File
@@ -13,26 +13,38 @@
},
{
"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": 4,
"Index": 6,
"Description": "Finestra con split a griglia",
"SVGFileName": "FinestraSplitGrid.svg",
"JwdFileName": "Data/FinestraSplitGrid.jwd"
},
{
"Index": 7,
"Description": "Finestra con split verticale",
"SVGFileName": "FinestraSplitVert.svg",
"JwdFileName": "Data/FinestraSplitVert.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"
"Index": 8,
"Description": "Finestra con split orizzontale",
"SVGFileName": "FinestraSplitHoriz.svg",
"JwdFileName": "Data/FinestraSplitHoriz.jwd"
}
]
File diff suppressed because it is too large Load Diff
+30 -2
View File
@@ -1,5 +1,9 @@
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;
@@ -7,10 +11,14 @@ 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()
@@ -20,6 +28,20 @@ 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
@@ -28,10 +50,16 @@ 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())
{
@@ -0,0 +1,25 @@
<?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>
+19 -7
View File
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@@ -29,20 +29,32 @@
</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" 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" />
<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" />
</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,4 +1,5 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
+70 -13
View File
@@ -1,24 +1,81 @@
{
"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"
"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;"
},
"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"
}
"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"
}
}
+21
View File
@@ -0,0 +1,21 @@
{
"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.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

File diff suppressed because one or more lines are too long

After

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
@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 476 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 507 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 514 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 579 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 250 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 279 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 286 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 366 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 854 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 457 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 477 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 484 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 564 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 607 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 642 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 634 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 714 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 359 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 421 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 428 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 493 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 495 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 514 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 521 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 601 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 617 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 640 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 662 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 727 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 251 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 279 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 286 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 366 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 686 B

@@ -0,0 +1,3 @@
<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>

After

Width:  |  Height:  |  Size: 717 B

@@ -0,0 +1,4 @@
<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>

After

Width:  |  Height:  |  Size: 737 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-8-square" viewBox="0 0 16 16">
<path d="M10.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.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"/>
<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>

After

Width:  |  Height:  |  Size: 804 B

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