From 232375a30f0053c332fd021cfe408bcbc930d10b Mon Sep 17 00:00:00 2001 From: "Yassine R." Date: Tue, 24 Sep 2024 19:58:14 +0200 Subject: [PATCH] feat(general): add structure information management and messages for users --- .talismanrc | 33 +- .../db/dumps/domifa_test.postgres.custom.gz | Bin 101420 -> 103796 bytes ...domifa_test.postgres.restore-data-only.sql | 8 + ...st.postgres.truncate-restore-data-only.sql | 8 + ...-create-structure-information-migration.ts | 34 + .../1603812391580-pr-env-create-database.ts | 117 +- ...current-structure-information.decorator.ts | 9 + packages/backend/src/auth/decorators/index.ts | 1 + .../auth/guards/CanGetUserStructure.guard.ts | 1 + packages/backend/src/auth/guards/index.ts | 1 + .../structure-information-access.guard.ts | 64 + .../StructureInformationTable.typeorm.ts | 43 + .../src/database/entities/structure/index.ts | 1 + .../src/database/services/structure/index.ts | 3 +- .../structureInformationRepository.service.ts | 6 + .../usager/usagerRepository.service.ts | 2 +- .../USER_USAGER_ATTRIBUTES.const.ts | 0 .../{const => constants}/index.ts | 0 .../portail-usagers-profile.controller.ts | 16 +- .../structure-information.controller.spec.ts | 20 + .../structure-information.controller.ts | 107 + .../dto/structure-information.dto.ts | 57 + .../portail-usagers/portail-usagers.module.ts | 2 + ...tructure-docs.controller.security-tests.ts | 20 - .../src/util/getCreatedByUserStructure.ts | 11 + packages/backend/src/util/index.ts | 4 +- packages/common/src/index.ts | 1 + .../STRUCTURE_INFORMATION_TYPES.const.ts | 30 + .../structure-information/constants/index.ts | 2 + .../common/src/structure-information/index.ts | 4 + .../StructureInformation.interface.ts | 13 + .../structure-information/interfaces/index.ts | 2 + .../types/StructureInformationType.type.ts | 5 + .../src/structure-information/types/index.ts | 2 + .../common/src/structure/interfaces/index.ts | 1 + packages/common/src/structure/types/index.ts | 1 + packages/frontend/package.json | 3 + .../interceptors/server-error.interceptor.ts | 2 +- .../admin-portail-usagers-routing.module.ts | 5 + .../admin-portail-usagers.module.ts | 27 +- .../admin-portail-usagers-menu.component.html | 17 +- ...min-portail-usagers-menu.component.spec.ts | 2 + .../admin-portail-usagers-menu.component.ts | 2 +- ...e-structure-information-form.component.css | 4 + ...-structure-information-form.component.html | 290 +++ ...ge-structure-information-form.component.ts | 259 +++ ...manage-structure-information.component.css | 3 + ...anage-structure-information.component.html | 184 ++ ...ge-structure-information.component.spec.ts | 28 + .../manage-structure-information.component.ts | 103 + .../manage-temp-messages.component.html | 20 - .../manage-temp-messages.component.spec.ts | 22 - .../manage-temp-messages.component.ts | 8 - .../portail-usagers-params.component.ts | 2 +- .../structure-information.service.spec.ts | 17 + .../services/structure-information.service.ts | 44 + packages/frontend/src/styles.scss | 1 + packages/portail-usagers/jest.config.js | 6 - .../home-usager/home-usager.component.html | 1 + .../structure-information.component.css} | 0 .../structure-information.component.html | 36 + .../structure-information.component.spec.ts | 23 + .../structure-information.component.ts | 48 + .../structure-information.service.spec.ts | 17 + .../services/structure-information.service.ts | 22 + .../usager-account/usager-account.module.ts | 2 + .../src/assets/css/bootstrap-custom.css | 1 + yarn.lock | 1732 ++++++++++++++++- 68 files changed, 3398 insertions(+), 162 deletions(-) create mode 100644 packages/backend/src/_migrations/1723547616571-create-structure-information-migration.ts create mode 100644 packages/backend/src/auth/decorators/current-structure-information.decorator.ts create mode 100644 packages/backend/src/auth/guards/structure-information-access.guard.ts create mode 100644 packages/backend/src/database/entities/structure/StructureInformationTable.typeorm.ts create mode 100644 packages/backend/src/database/services/structure/structureInformationRepository.service.ts rename packages/backend/src/modules/portail-usagers/{const => constants}/USER_USAGER_ATTRIBUTES.const.ts (100%) rename packages/backend/src/modules/portail-usagers/{const => constants}/index.ts (100%) create mode 100644 packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.spec.ts create mode 100644 packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.ts create mode 100644 packages/backend/src/modules/portail-usagers/dto/structure-information.dto.ts create mode 100644 packages/backend/src/util/getCreatedByUserStructure.ts create mode 100644 packages/common/src/structure-information/constants/STRUCTURE_INFORMATION_TYPES.const.ts create mode 100644 packages/common/src/structure-information/constants/index.ts create mode 100644 packages/common/src/structure-information/index.ts create mode 100644 packages/common/src/structure-information/interfaces/StructureInformation.interface.ts create mode 100644 packages/common/src/structure-information/interfaces/index.ts create mode 100644 packages/common/src/structure-information/types/StructureInformationType.type.ts create mode 100644 packages/common/src/structure-information/types/index.ts create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.css create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.html create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.ts create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.css create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.html create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.spec.ts create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.ts delete mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.html delete mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.spec.ts delete mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.ts create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.spec.ts create mode 100644 packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.ts rename packages/{frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.css => portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.css} (100%) create mode 100644 packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.html create mode 100644 packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.spec.ts create mode 100644 packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.ts create mode 100644 packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.spec.ts create mode 100644 packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.ts diff --git a/.talismanrc b/.talismanrc index 6aeb20346d..aadd59409d 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,21 +1,20 @@ fileignoreconfig: -- filename: .kontinuous/env/dev/templates/backend.sealed-secret.yaml - checksum: d76fa05f7587f094d19959816a03c4589ae0c8675436f11fa8bf454cfd917741 -- filename: .kontinuous/env/preprod/templates/backend.sealed-secret.yaml - checksum: 291f7f330aca385888f414aa9a7f4ebfe0c03bd4d154e0ed0f6ee4895ea139c0 -- filename: .kontinuous/env/prod/templates/backend.sealed-secret.yaml - checksum: a066a32a383b37f3e2195d41a309628e64d66e70611aa8ee05159205c0fdcd7c - filename: _scripts/db/dumps/domifa_test.postgres.restore-data-only.sql - checksum: d61470228208094ecc7a14b8ccb30aa49c363009104aaa4d983fe54baba10c08 -- filename: _scripts/db/dumps/domifa_test.postgres.truncate-data.sql - checksum: 0a9b780387e8c40344bd52f033a201da019c8b3e9e5d501ee6cb85040b6e168c + checksum: 502a64b85ffe956adf47db779ed78a2f25bd8b5de188c571180ea7483f88370b - filename: _scripts/db/dumps/domifa_test.postgres.truncate-restore-data-only.sql - checksum: 82670bbe12e21c9cf5af9a3e75f1c06c4a97d1bf5a8825cfab2553bc075e171e -- filename: packages/backend/.env.backend.dev.example.env - checksum: d52c7fbfae21884e63f84a7aa0759c5296f0ecb483e71866541b2b44d7880758 -- filename: packages/backend/.env.backend.test.local.example.env - checksum: 1540bbfa2a80d38a05d5d1628db89f7f0ae1ed1e0f054b54a2589e6fe5ca24e0 -- filename: packages/backend/.env.preset/local-dev.preset.env + checksum: 4b681f0cdd8f85ce6b2877c6c1f2b904b48965fb4a411f2caf56485687ddd020 +- filename: packages/backend/src/_migrations/1723547616571-create-structure-information-migration.ts + checksum: 1b96083efc358311f59512c87fffead4e00aa557ba70454e7f2e152add1e3089 +- filename: packages/backend/src/_migrations/_init-db/1603812391580-pr-env-create-database.ts + checksum: 9a0633f712677ab1f864b3003cb2c947a4d51ff10bf8488af174acef31b80f9c +- filename: packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.ts + checksum: 120db5b7bac6a61f84dae5a5e04b05774fbfb2a9e81b6df0fed56d38db151ee6 +- filename: packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.html + checksum: 30d558a1c39242d78b869fe18c594fa82bdf1e173bec521aaf5d6e9768fce4ed +- filename: yarn.lock + checksum: 838a3248dfbc076c42ce2a3e27ca862a0b02aae15a6a20d908bdfe968083577e +version: "" +v checksum: af5962c1b288218cb9a43c9bff6ddd5d16c086088b7c990278af030261a7f500 - filename: packages/backend/.env.preset/local-test-docker.preset.env checksum: 2a459a7689ff1c0add9bbea1ff00eb44118cf3f3f0e6f6197830d28016a3272a @@ -97,4 +96,8 @@ fileignoreconfig: checksum: 65d0b914b6baa33b2e8ec95786ef0c9d9960787295f1f02450d0262f71fd3d0e - filename: yarn.lock checksum: dce41db10fe65e26fb8b1ca281e9a4672e65131e94a881a5ad6fadbfbcfd9058 +version: "1.0" + checksum: 65d0b914b6baa33b2e8ec95786ef0c9d9960787295f1f02450d0262f71fd3d0e + - filename: yarn.lock + checksum: dce41db10fe65e26fb8b1ca281e9a4672e65131e94a881a5ad6fadbfbcfd9058 version: "1.0" diff --git a/_scripts/db/dumps/domifa_test.postgres.custom.gz b/_scripts/db/dumps/domifa_test.postgres.custom.gz index 21425a262770e17e1a0d839c5ed41b61123f9808..b94db252494bb18e58648d5238279590ba2d7395 100644 GIT binary patch delta 6145 zcmahtc|a6p`}-`1?jnjH#{w>R#wj~9J3BKfmIVeXAR_((Ma2~qQ!XLVQbf&L5no}< z)G$r+%Ji+qPetGpwLVg`^1jeiGBv|A@yhR=*;%r_>bHNe?{nYJ`!3s8Ip5#v>_6o7 zsJJ1}UgOvnG&&9W1j&DR`Hx4Le{VQ}$`<>U^y6P9_&5W; z->t-%5Q#(6LN3Wf)}-k~fG{*L zvd7z4x@JuomN7XuC!Ziuzu=xuU8fYJ=cB|oJY91N3jzzWCT9dr&&kd}P5wr&KVWR~ z1=Dh6gD6$k9-R->A=lU2Aa8vqln|yvJ39NxUbcI|%WTyAkvDq9g-07HgPai>*HSKW zo-HPP-2AB%IdNt@w|AA6RE4KCZm9Nv2TqNA=0IS!@&m^_OBp9JSk;|=q8eX zo-%1XNNP}7tOqIx_rN`3bO0kaM8twKAyOJI)V#`o;|Ja&)#Yguj*4q`AYu%yq#czc zdZL{X9w;;MH%L>eGks_?;ba(`lQcn=G1K^b@@Cm6OCz^ZAG|Kb05D47J(~K1jAziU z1>X4hh+Cw~cvisGX~9~kM5c5f0$X_OG$sV#6FV&6!Rb8#_NXvt!lh#^04MD*g|Av^ zfXjB6##BacfLnH$!3#1;7t^RY&y)1G*@TXdzow5G404NTG>je33S4$n^nzLb58>$0jBZoj$)Dw3Cw2w%No0nLTu@iw`2*q%3Q% zzZ^z1DnB$>p0kXw7w0Q1@Wn~$Na! z9R0Yc58AOb7pw|>`cPj&{{+S<(9u+H6jZtuJ^Zabim!AbbIY;#ZfP2T8TGG}=a}Qf zKtBk;3(7J8l{UAs30RNP08MJNV|WVBT{#F~fGWr{sQQ2x)>b5ect;1VY%IQn%Cl`2s9xA#*4{q#+Hbg^9aPhfE2+IT>*8)SZR%QdbW z1E}3z1>$g8C4o}57|0eB1Pz6bck#r{>)!x0Z#Ur(Occ)CkPK+ac~zfaV(^)bnSc&# zR_JU61D$ZrrUat%GlK(>5Jz_hBW~H84(OFig-5_|Z5amQyB07+(&YBlm`P{<dYA$@Enl{qex<}0`}F$XFF>)jCwLkEAJMXp zz0ql#sLSu7*(kBx)9;^5mXt?oSxTH23PH}4KyC^K)uwsx-Zm0YM3o#K#fVoT!4I$8 zo(AIjKu~b3m=^)wxW^|XcgBMXio@bgQkkmt3MAn6yNW>E)7D;Sfu`_=-C2N&>($Z= zG=qabBT60ofYe8zS(|OV|ML-mvX3ilB;&OBoCZ%EBgFucnp%Ygr82d927y@R+G>TN zZ0#AdcPhXXTh|EW7Q3)73CLSY>0yCk@!+cAfJSbYePuXYePA{~p`9w=Q8k3RxlX2< zDSV{J@BsqXs`}h+&jX{w314yq!Lp z;;iEs)+%IJ<1z?gLw&11<9RW>T z-D=X7NOaMqW8bu8?eX2#OLBRiq9N_Cto)JTE53_np3?V)MP}5Z#2VXSq-Tz$J%R$@@o9h z!=`4`cvaD8!A>`W0X5xGAPx`u@g*Q7xAh>$ZSo}RqH5($ty&ZQ z?T23a={Cfvl4QA??uG(tdtcVe)41qoZ$J)TDG-CVHwOUPcw2$Y_=kIe0I%4Uwz?`F z=fDre+VXHK&WG(S%yW3zukHYXorA|!4+)%VhXs7Qg+%lmbv!Fim0-fA z$6kO2m)SLt8^ij<2q^DY*&Bhz>z>`3hIYDPYXHOd( zX_Lt$z3B{{0Oj9OKuTKE28bsEo)~n5N-K#MOLSlqTiU_{&?#yNg^~1nhyc*b2$|Ka zJmAGL7x0wGaJB_haY|9iO6Bb!h;(PU%}2s(5zo28Q}L@{+t9lbl1MQF2GBmbH;o7IP$jI@2$$db-v zWiYmNE`_~ULkqID%A+ZOZPqCUGOk-Dw$KYQsZ@b+Q8a#uxtK#vd@~AJ(Z=JYfMJ@lrVa z)tztf``fKaTg65ShKe`(*(6`wx8jvB@cc*7j^V(IpL#%hy}ce}0jGy6c{VeWTW3-W zWb$*?t3|d4jMR*od31M`zx2RJ_()Ia7<)CuUBM)r@SaNQSVlS!2o<2UWfWGc(kw4O z9(<*ZU7<)37ycj)qRMAsB+`1D{@gldi&CG{9*PkQFE*ILAX$6DtUp!o*NzGY$4CJ| zFh{XO{lSvBn@ExxbG%3#^^%?jlm3$LBJpJ<6+9#D4u!SQnkB}hn4a8K5#xFJVPurH zg%hz>9`ZYsv=6+m1|cvK33lcG1R*GzzNZyU0x!it7iNhX2zPtyE2tAE0uf=kl-w zT+C{j?Gv)!s2C=Lna~^7$z>LQc}X!u^O9d*m<@7|wG}V-A(K!3d1N0iF*-uwB6COb zw*mBK(;v$++FMb~@FFRkr*!6JC?wX^+S#qwMJh~YMkMX(DRz1l{G|Q;fxO9PooXXi zlO^F#+jkUY`?1-&B|t-q{A+Lv7_om8S-WQ27b}g50@e{MHjq=kig|ak*D{D~(YeBk zgq#Z&w?hrvIwa-JE6ywm`|+~}U4q=YNh3Q&_=Po2aNXe*^Z4d3F?SYyw&mQsJ13t+ zE?WJ1`{*|M!y&ttUOVZ(uF2f%X8Op(JHPKSqwkFOk6bTUcj*-e!C}Px!znwrUkaF6 z-K)ttyL(N+{5d+`r&qq`(~cC24_iXCO-tJNeb`uBc=1fKb`rBa1d=>X9(;Lc{mmyg ztMBvSS;i0W^>0>(>T&&zFDEWNH{s)bN#&X+ef%R2Rqp#a1ll_-8#k`YR}b_T-~>8gf91MlWzW(iH8bv%bo9K&S~y+s?Z}Vx^ZQ3-dinh zeGly0wasyri~k14-G|>ZUg}iMyIqkDc}VaxS7cN#-r+0<3{ZWNnH0Ip}goVsex=@>bdO`IuUxG6IH`~0(P z`cLbl!slKLFljsg78LnW_xx#V)>S-uynkfVcaK9|t9Q)IxYuVrad1T5{9&HOd)sVv zA5&fX@8Q>eUOsAQ{LfzuF@8g@8`W!VRn4cOQ=@f^#~SL!uM<9SUpIdGz;CIeJ3gQN zX+?3%25-wG_Wr()2F@y+)1&C@2r=2w_9 zN*_i=)jPiw#l6){+r(MtKM&}WQ0K+_-rBX`;fn02#_U6Rv338N@wAt=A;o%rp`-cP zneZh8v};iG#o*M^2s!Ku&&)Ts*H8Xsr}?AFqu(hWxU*@R5O?{~xx1#@skali56BC7 zR%OxU9`pLv8vSNn^U2y|-{T#bC8clR_|I-RE_K|~ecOb-Cn_iAZC;b?cq}xYFNrCC zyo=N2##(M9&tL1Y@3pOEnx>Iw&s;c`TjfH|Pqc3@^Vi}#q&xhF`$U8rk9>H$W~weX zzPx$Prs75Q&0qX$%BIsFvB{1-tKQF@sq;G9ZFNoQjD~?V9*bX}a=Gr&ndIGN&WnVh znGHp0c{4Zj$=WsDGH$=Mm`Tg8o*9ruGBJC@;19iW2E5(UQ`@k9_k;FrSlFpf&)&ZiWgelO{4hD!Zv*13&NRcIE n8$zsfcs4wCfI(92JkV)juvEVQjse7rs~3@lnjo4M!_)r)xY)jv delta 5218 zcmZWt2Urx>+U6UIvMSP-x>ylVVRvSBX2*b7us1AVp$Ji92?|P3q9&lRhYRv*Aey_*BX4dd3{n=&D`2p7VUM;$p8pV6 z86>~#$e)SkXd4Hz;4Bt_=I}_$73}3DkEYq~gQ2n|3by;z&S*3;sIC2B7)C_i=(c?| z5t&$A>flL{6;0z`T9?Ty#)R|RgefZlpKX_5OJrsv4tDWZRstUCenehz0@is20a@`Z z=Db4zhAY7q`uyfdWM&%=k`+plJn(0}XJvO577sBjkxc~}S9Y|c9E~QUQRxF3743~1 zJ1=ptGnzuF#NKtH=}@+emHu>V;L>5ctG@H zTSp^p49mo#s#*7S=KetDNnYJlIblro z$DyF>7^NzLR0U%~!LuLhdTa7vO)lVwInzKFrzt{I1!32z)X|{J8?1Wjt|gl#hNLDyGP7*&Npqsoq6=*IkV zUDE{B$Yj+Kmg1ueVkukSiGU8w@*{&LB;^8hfasvy+; zX*mtL0oke|Tvb@iIACQQP`#F*tqc6EWZnAZ4A7lesv;w;NWx2$7VD3K))>%~oNC?C z6{^0EswZqs{OSv!&VGqL_?&nmYbh}YC1lHchC$^?KEy$duIE>(@fd~73w=CM zMDA#yQEu);7^}#da!=>gd7>Le543%qC$i65hn9mUD$Y9ru>^1nx!HN5$^<=HgbKk1 z^%WJ?3%K9<1b`m$-quK)k#l(md?SAvh!u|Dghq;ONFrtiCx`^as8(h(zP51~h!5P~ zLUdf7(6r#2^n7}?f}aWK-H$;OO2uJpzUTay5$tIjwEU*9$fK&S1^ zc=Yy3Kt0hsaXdb|V(V$oB}AXP=;GfVrozD$HR(}0XgqfL<~Mx zJPzO!)qt?zVo3&|oRf-{$H@mX0hMi2c7m8~0X=T_T?{}k)j%-etV5FkZGEB?L5?sYJ6(tdFsmMD2Ip4911f##?Pz3Z*2W;W<=90-LHCOw*4csVhFnsEe+~d@ zt_$iLrI&G>6&G>IfOl0ZW37!A+Na$q}Qd+Y+^)7!HY=fC7&A zqKQ}Dpyne^XhalYI>Q)o`c*%mf;DI48ZWvQ0%-3J1w!l@TC*3Uy8&@<{T1r|vmA3oc6RNE#P17b_8mwRw8TE9HHX>`XclFzr?s!N=(*-`}`IJ z$l;t;4%<==>TuE*?f(4{D&5$kWHd+O+%S^Swb~{WRWFZ;Rmb#oodJ2&Jx6X0atBy5 z4*J6n#7+*@XdF(iClx+dijeg@-uTcPs2Ht7$o2+dxJu%>aKehw0&`Akprg7;L4?xfVR?Hau@M$2RiI0^Xi^HC^2Wo&8 zm7HI3&$|Q4{Yi-`yH(jV@}&Wte$j~fh*~~o9$$M&h!?Ik*K8ex%%A<|d=dBR4O;O+ z2_xX>*QEINZ9wi2XB`4EzA>Ppe;ULhTdP9Sz1GZ0Vr3kG>((b*+K`PTD3@c$-y27EnBxp zEK;O{EE(S-5v0skpa&{Mlki5Vs5KB$4Q!E^q(2;?D^R{I5?bof2HXH$d@5(lGg5q8 z@CWokja(9MWr*0@2@K*7?cgz5^iYABr87<>I+}A>>oL!L?+jjmc5iNx@Zu6z@RWwR zfHxrT>x!X8BC<|E4QWY0kjmX42q;dISd5~*2mC{&wFpd-!ISt9Px~nyv(WO{-a-0A z4=cb~{_4-NEMsF!7BtJD)#`i*g+3^bhTRRK2J*%dO^C3a&T4o^v*oR9=()0cwTBB4tZ~bv1)g#X(gD&+Kk2s z$O7G4I-w)l2nNMgZWx|3s;dOlpX*!b}tlVZ=8vh=*KU140 z@KR!b(mYoS`yOJE6=62gQpf;U3SJsZH6~g=X--TXDpzSH-%#YXwi!h7bZdFKj4e-> zn9nLW6D?gD3^^dybOlF3G?ZPdN8VS|o|;YM5eX!ZNXbx`^FGyRR;HS#E!YH#gN8#r zbQ7aTkfSNc`VlP69sy=M2(fOvD<4@s{sx=hgYg6nEa_Tyu8Cq;_5Yeic7v!{E(1v#aOaN)IkfbWaHK+Ix~)H$MH-#7l>F zuAJ-N?3Y?s-}ssLwYrQZn|Alxrd0V(FFUv}>+i=$k8)|9VW+=S;EV=w|GmWllY3{~ z+uV8!V@UaOY4eqgkHgFb1rh896Uu+)l{*hRbcg5#W zRrG>gA@KYIzlc-YcQpipll_{h<4&%vyVIZQ@u;Nh!I0^X_jF1tTkGYv^w1L9Q=>kX zTx&KayE^3+Ma8ur>_YvztHBk;cwXA8yW^txnmZ5AtuAaGJ}#WT z^y>8uk6TZs9sN)8rTv#@f0ocxSK+;UB8R8kyW+aQWw&e1y8C_pXgJ^M#_<@+Z^6cS z=^MvpWg-XmiBo!mPo4YiF6E8z`+0|*yE5WacLhF-SU;}Kj@P!a+s}`hwsZZen}*t5 z89zksf6?_&)6f&Cdnf<a@FSW5M*2S0v0H2Yb0*GysW z`4B4CcVCyNABJ9RNbqZLv`k#KcH-!HUlUSh?~VKw)xyOyTaodm7~`fS z7&agKM)3daanG`{tk8Nkt9iz+$<>Fd3nr|-JMPsYf7hBVaVfbT1ukdCw;DgQJnDk6 z_kTXxI)is4zRneW*bw!_?o;HqsEZ}la>uSy%pcc!cPa0RP2>H0b(_C(TxY2KblQ}s zmJ`oHN3XW4)>o(BciuR=eSm9C$??pYk1d|R+1>71F6> { + if ( + domifaConfig().envId === "prod" || + domifaConfig().envId === "preprod" || + domifaConfig().envId === "local" + ) { + await queryRunner.query( + `CREATE TABLE "structure_information" ("uuid" uuid NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "version" integer NOT NULL, "title" character varying NOT NULL, "description" character varying, "isTemporary" boolean NOT NULL DEFAULT false, "startDate" TIMESTAMP, "endDate" TIMESTAMP, "type" character varying NOT NULL, "createdBy" jsonb, "structureId" integer NOT NULL, CONSTRAINT "PK_b51c75b37769abf1fdf28fc89ef" PRIMARY KEY ("uuid"))` + ); + await queryRunner.query( + `CREATE INDEX "IDX_17cd35c9fdcd9ab82015a46b22" ON "structure_information" ("structureId") ` + ); + await queryRunner.query( + `ALTER TABLE "structure_information" ADD CONSTRAINT "FK_17cd35c9fdcd9ab82015a46b22c" FOREIGN KEY ("structureId") REFERENCES "structure"("id") ON DELETE CASCADE ON UPDATE NO ACTION` + ); + } + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "structure_information" DROP CONSTRAINT "FK_17cd35c9fdcd9ab82015a46b22c"` + ); + + await queryRunner.query(`DROP TABLE "structure_information"`); + } +} diff --git a/packages/backend/src/_migrations/_init-db/1603812391580-pr-env-create-database.ts b/packages/backend/src/_migrations/_init-db/1603812391580-pr-env-create-database.ts index 9ce9b91943..1ca4217ea3 100644 --- a/packages/backend/src/_migrations/_init-db/1603812391580-pr-env-create-database.ts +++ b/packages/backend/src/_migrations/_init-db/1603812391580-pr-env-create-database.ts @@ -197,7 +197,7 @@ async function createTables(queryRunner: QueryRunner) { "importDate" date NULL, "lastLogin" date NULL, nom text NOT NULL, - "options" jsonb NOT NULL, + "options" jsonb DEFAULT '{"surnom": false, "numeroBoite": true}'::jsonb NOT NULL, responsable jsonb NOT NULL, "structureType" text NOT NULL, "token" text NULL, @@ -214,9 +214,9 @@ async function createTables(queryRunner: QueryRunner) { "organismeType" text NULL, "departmentName" text NULL, "regionName" text NULL, + CONSTRAINT " " UNIQUE (email), CONSTRAINT "PK_a92a6b3dd54efb4ab48b2d6e7c1" PRIMARY KEY (uuid), - CONSTRAINT "UQ_90ac7986e769d602d218075215c" UNIQUE (id), - CONSTRAINT "UQ_b36e92e49b2a68f8fea64ec8d5b" UNIQUE (email) + CONSTRAINT "UQ_90ac7986e769d602d218075215c" UNIQUE (id) ); CREATE INDEX "IDX_30c4985e1148ec42ad6122f0ff" ON public.structure USING btree ("structureType"); CREATE INDEX "IDX_62204f14a6d17cad41d419d150" ON public.structure USING btree ("codePostal"); @@ -224,6 +224,81 @@ async function createTables(queryRunner: QueryRunner) { CREATE INDEX "IDX_b36e92e49b2a68f8fea64ec8d5" ON public.structure USING btree (email); CREATE INDEX "IDX_e848a2cfbd611ec5edc18074e2" ON public.structure USING btree (region); CREATE INDEX "IDX_fa4dea9a1ff8deb8fcf47c451e" ON public.structure USING btree (departement); + CREATE UNIQUE INDEX " " ON public.structure USING btree (email); + + + -- public.structure_information definition + + -- Drop table + + -- DROP TABLE public.structure_information; + + CREATE TABLE public.structure_information ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "createdAt" timestamptz DEFAULT now() NOT NULL, + "updatedAt" timestamptz DEFAULT now() NOT NULL, + "version" int4 NOT NULL, + title varchar NOT NULL, + description varchar NULL, + "isTemporary" bool DEFAULT false NOT NULL, + "startDate" timestamp NULL, + "endDate" timestamp NULL, + "type" varchar NOT NULL, + "createdBy" jsonb NULL, + "structureId" int4 NOT NULL, + CONSTRAINT "PK_b51c75b37769abf1fdf28fc89ef" PRIMARY KEY (uuid) + ); + CREATE INDEX "IDX_17cd35c9fdcd9ab82015a46b22" ON public.structure_information USING btree ("structureId"); + + + -- public.typeorm_metadata definition + + -- Drop table + + -- DROP TABLE public.typeorm_metadata; + + CREATE TABLE public.typeorm_metadata ( + "type" varchar(255) NOT NULL, + "database" varchar(255) DEFAULT NULL::character varying NULL, + "schema" varchar(255) DEFAULT NULL::character varying NULL, + "table" varchar(255) DEFAULT NULL::character varying NULL, + "name" varchar(255) DEFAULT NULL::character varying NULL, + value text NULL + ); + + + -- public.usager_history_states definition + + -- Drop table + + -- DROP TABLE public.usager_history_states; + + CREATE TABLE public.usager_history_states ( + "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, + "createdAt" timestamptz DEFAULT now() NOT NULL, + "updatedAt" timestamptz DEFAULT now() NOT NULL, + "version" int4 NOT NULL, + "usagerUUID" uuid NOT NULL, + "structureId" int4 NOT NULL, + "ayantsDroits" jsonb NOT NULL, + decision jsonb NOT NULL, + entretien jsonb NOT NULL, + rdv jsonb NULL, + "createdEvent" text NOT NULL, + "historyBeginDate" timestamptz NOT NULL, + "historyEndDate" timestamptz NULL, + "isActive" bool DEFAULT false NULL, + "typeDom" text DEFAULT 'PREMIERE_DOM'::text NULL, + nationalite text NULL, + sexe text NULL, + "dateNaissance" timestamptz NULL, + CONSTRAINT "PK_c1bd0d42891df5715d2ef8474d7" PRIMARY KEY (uuid) + ); + CREATE INDEX "IDX_7ed0bb63b8fc294757b8bd8854" ON public.usager_history_states USING btree ("historyEndDate"); + CREATE INDEX "IDX_85ac9012f78c974fb73a5352df" ON public.usager_history_states USING btree ("structureId"); + CREATE INDEX "IDX_9beb1346c63a45ba7c15db9ee7" ON public.usager_history_states USING btree ("historyBeginDate"); + CREATE INDEX "IDX_e819c8b113a23a4a0c13a741da" ON public.usager_history_states USING btree ("usagerUUID"); + CREATE INDEX idx_stats_range ON public.usager_history_states USING btree ("historyBeginDate", "historyEndDate", "isActive"); -- public.message_sms definition @@ -477,42 +552,6 @@ async function createTables(queryRunner: QueryRunner) { CREATE INDEX "IDX_aa19c17fc79f4e4a648643096f" ON public.usager_entretien USING btree ("usagerUUID"); - -- public.usager_history_states definition - - -- Drop table - - -- DROP TABLE public.usager_history_states; - - CREATE TABLE public.usager_history_states ( - "uuid" uuid DEFAULT uuid_generate_v4() NOT NULL, - "createdAt" timestamptz DEFAULT now() NOT NULL, - "updatedAt" timestamptz DEFAULT now() NOT NULL, - "version" int4 NOT NULL, - "usagerUUID" uuid NOT NULL, - "structureId" int4 NOT NULL, - "ayantsDroits" jsonb NOT NULL, - decision jsonb NOT NULL, - entretien jsonb NOT NULL, - rdv jsonb NULL, - "createdEvent" text NOT NULL, - "historyBeginDate" timestamptz NOT NULL, - "historyEndDate" timestamptz NULL, - "isActive" bool DEFAULT false NULL, - "typeDom" text DEFAULT 'PREMIERE_DOM'::text NULL, - nationalite text NULL, - sexe text NULL, - "dateNaissance" timestamptz NULL, - CONSTRAINT "PK_c1bd0d42891df5715d2ef8474d7" PRIMARY KEY (uuid), - CONSTRAINT "FK_85ac9012f78c974fb73a5352dfe" FOREIGN KEY ("structureId") REFERENCES public."structure"(id) ON DELETE CASCADE, - CONSTRAINT "FK_e819c8b113a23a4a0c13a741da0" FOREIGN KEY ("usagerUUID") REFERENCES public.usager("uuid") ON DELETE CASCADE - ); - CREATE INDEX "IDX_7ed0bb63b8fc294757b8bd8854" ON public.usager_history_states USING btree ("historyEndDate"); - CREATE INDEX "IDX_85ac9012f78c974fb73a5352df" ON public.usager_history_states USING btree ("structureId"); - CREATE INDEX "IDX_9beb1346c63a45ba7c15db9ee7" ON public.usager_history_states USING btree ("historyBeginDate"); - CREATE INDEX "IDX_e819c8b113a23a4a0c13a741da" ON public.usager_history_states USING btree ("usagerUUID"); - CREATE INDEX idx_stats_range ON public.usager_history_states USING btree ("historyBeginDate", "historyEndDate", "isActive"); - - -- public.usager_notes definition -- Drop table diff --git a/packages/backend/src/auth/decorators/current-structure-information.decorator.ts b/packages/backend/src/auth/decorators/current-structure-information.decorator.ts new file mode 100644 index 0000000000..0f11013259 --- /dev/null +++ b/packages/backend/src/auth/decorators/current-structure-information.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, ExecutionContext } from "@nestjs/common"; +import { UserStructureAuthenticated } from "../../_common/model"; + +export const CurrentStructureInformation = createParamDecorator( + (_data: unknown, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + return request.structureInformation as UserStructureAuthenticated; + } +); diff --git a/packages/backend/src/auth/decorators/index.ts b/packages/backend/src/auth/decorators/index.ts index 6a5a65e749..ed81022c54 100644 --- a/packages/backend/src/auth/decorators/index.ts +++ b/packages/backend/src/auth/decorators/index.ts @@ -3,6 +3,7 @@ export * from "./AllowUserProfiles.decorator"; export * from "./AllowUserStructureRoles.decorator"; export * from "./current-chosen-user-structure.decorator"; export * from "./current-interaction.decorator"; +export * from "./current-structure-information.decorator"; export * from "./current-usager-note.decorator"; export * from "./current-usager.decorator"; export * from "./current-user.decorator"; diff --git a/packages/backend/src/auth/guards/CanGetUserStructure.guard.ts b/packages/backend/src/auth/guards/CanGetUserStructure.guard.ts index bb8959fba6..0577edf721 100644 --- a/packages/backend/src/auth/guards/CanGetUserStructure.guard.ts +++ b/packages/backend/src/auth/guards/CanGetUserStructure.guard.ts @@ -14,6 +14,7 @@ import { userStructureRepository } from "../../database"; export class CanGetUserStructureGuard implements CanActivate { public async canActivate(context: ExecutionContext) { const r = context.switchToHttp().getRequest(); + const userUuid = r.params.userUuid; const structureId = r.user.structureId; diff --git a/packages/backend/src/auth/guards/index.ts b/packages/backend/src/auth/guards/index.ts index 20257ec6f3..c4cfeb6b65 100644 --- a/packages/backend/src/auth/guards/index.ts +++ b/packages/backend/src/auth/guards/index.ts @@ -2,5 +2,6 @@ export * from "./AppUserGuard.guard"; export * from "./CanGetUserStructure.guard"; export * from "./interactions.guard"; +export * from "./structure-information-access.guard"; export * from "./usager-access.guard"; export * from "./usager-note-access.guard"; diff --git a/packages/backend/src/auth/guards/structure-information-access.guard.ts b/packages/backend/src/auth/guards/structure-information-access.guard.ts new file mode 100644 index 0000000000..b7f5f11855 --- /dev/null +++ b/packages/backend/src/auth/guards/structure-information-access.guard.ts @@ -0,0 +1,64 @@ +import { + CanActivate, + ExecutionContext, + HttpException, + HttpStatus, + Injectable, +} from "@nestjs/common"; + +import { appLogger } from "../../util"; +import { structureInformationRepository } from "../../database"; + +@Injectable() +export class StructureInformationAccessGuard implements CanActivate { + public async canActivate(context: ExecutionContext) { + const r = context.switchToHttp().getRequest(); + + if ( + typeof r.params.uuid === "undefined" || + typeof r.user.structureId === "undefined" + ) { + appLogger.error( + `[StructureInformationAccessGuard] invalid uuid or structureId`, + { + sentry: true, + context: { + usagerRef: r?.params?.uui, + structureId: r?.user?.structureId, + user: r?.user?._id, + }, + } + ); + throw new HttpException( + "STRUCTURE_INFORMATION_NOT_FOUND", + HttpStatus.BAD_REQUEST + ); + } + + const uuid = r.params.uuid; + const structureId = parseInt(r.user.structureId, 10); + + try { + const structureInformation = + await structureInformationRepository.findOneOrFail({ + where: { + structureId, + uuid, + }, + }); + r.structureInformation = structureInformation; + return r; + } catch (e) { + appLogger.error(`[UsagerAccessGuard] structureInformation not found`, { + sentry: true, + context: { + uuid, + structureId, + user: r?.user?._id, + role: r?.user?.role, + }, + }); + throw new HttpException("USAGER_NOT_FOUND", HttpStatus.BAD_REQUEST); + } + } +} diff --git a/packages/backend/src/database/entities/structure/StructureInformationTable.typeorm.ts b/packages/backend/src/database/entities/structure/StructureInformationTable.typeorm.ts new file mode 100644 index 0000000000..38c9ee7988 --- /dev/null +++ b/packages/backend/src/database/entities/structure/StructureInformationTable.typeorm.ts @@ -0,0 +1,43 @@ +import { + StructureInformation, + StructureInformationType, + UserStructureResume, +} from "@domifa/common"; +import { Entity, Column, Index, JoinColumn, ManyToOne } from "typeorm"; +import { AppTypeormTable } from "../_core"; +import { StructureTable } from "./StructureTable.typeorm"; + +@Entity({ name: "structure_information" }) +export class StructureInformationTable + extends AppTypeormTable + implements StructureInformation +{ + @Column({ type: "varchar" }) + title: string; + + @Column({ nullable: true }) + description: string; + + @Column({ default: false }) + isTemporary: boolean; + + @Column({ type: "timestamp", nullable: true }) + startDate: Date | null; + + @Column({ type: "timestamp", nullable: true }) + endDate: Date | null; + + @Column({ type: "varchar" }) + type: StructureInformationType; + + @Column({ type: "jsonb", nullable: true }) + createdBy: UserStructureResume; + + @Index() + @ManyToOne(() => StructureTable, (structure) => structure.id, { + onDelete: "CASCADE", + }) + @Column({ type: "integer", nullable: false }) + @JoinColumn({ name: "structureId", referencedColumnName: "id" }) + public structureId: number; +} diff --git a/packages/backend/src/database/entities/structure/index.ts b/packages/backend/src/database/entities/structure/index.ts index 016612ec5f..b844c22fd9 100644 --- a/packages/backend/src/database/entities/structure/index.ts +++ b/packages/backend/src/database/entities/structure/index.ts @@ -1,3 +1,4 @@ // @index('./*', f => `export * from '${f.path}'`) +export * from "./StructureInformationTable.typeorm"; export * from "./StructureStatsReportingQuestionsTable.typeorm"; export * from "./StructureTable.typeorm"; diff --git a/packages/backend/src/database/services/structure/index.ts b/packages/backend/src/database/services/structure/index.ts index 5bff7cc6dd..9d55a0318c 100644 --- a/packages/backend/src/database/services/structure/index.ts +++ b/packages/backend/src/database/services/structure/index.ts @@ -1,3 +1,4 @@ -// @index('./*', f => `export * from '${f.path}'`) +// @index('./*.service.ts', f => `export * from '${f.path}'`) +export * from "./structureInformationRepository.service"; export * from "./structureRepository.service"; export * from "./structureStatsReportingQuestionsRepository.service"; diff --git a/packages/backend/src/database/services/structure/structureInformationRepository.service.ts b/packages/backend/src/database/services/structure/structureInformationRepository.service.ts new file mode 100644 index 0000000000..d64a9cb7c2 --- /dev/null +++ b/packages/backend/src/database/services/structure/structureInformationRepository.service.ts @@ -0,0 +1,6 @@ +import { StructureInformation } from "@domifa/common"; +import { myDataSource } from "../_postgres"; +import { StructureInformationTable } from "../../entities/structure/StructureInformationTable.typeorm"; + +export const structureInformationRepository = + myDataSource.getRepository(StructureInformationTable); diff --git a/packages/backend/src/database/services/usager/usagerRepository.service.ts b/packages/backend/src/database/services/usager/usagerRepository.service.ts index b82fd78f9f..7c55ffe462 100644 --- a/packages/backend/src/database/services/usager/usagerRepository.service.ts +++ b/packages/backend/src/database/services/usager/usagerRepository.service.ts @@ -4,7 +4,7 @@ import { myDataSource } from ".."; import { UsagerTable } from "../../entities"; import { joinSelectFields, pgRepository } from "../_postgres"; import { getDateForMonthInterval } from "../../../stats/services"; -import { USER_USAGER_ATTRIBUTES } from "../../../modules/portail-usagers/const"; +import { USER_USAGER_ATTRIBUTES } from "../../../modules/portail-usagers/constants"; const baseRepository = pgRepository.get(UsagerTable); diff --git a/packages/backend/src/modules/portail-usagers/const/USER_USAGER_ATTRIBUTES.const.ts b/packages/backend/src/modules/portail-usagers/constants/USER_USAGER_ATTRIBUTES.const.ts similarity index 100% rename from packages/backend/src/modules/portail-usagers/const/USER_USAGER_ATTRIBUTES.const.ts rename to packages/backend/src/modules/portail-usagers/constants/USER_USAGER_ATTRIBUTES.const.ts diff --git a/packages/backend/src/modules/portail-usagers/const/index.ts b/packages/backend/src/modules/portail-usagers/constants/index.ts similarity index 100% rename from packages/backend/src/modules/portail-usagers/const/index.ts rename to packages/backend/src/modules/portail-usagers/constants/index.ts diff --git a/packages/backend/src/modules/portail-usagers/controllers/portail-usagers-profile.controller.ts b/packages/backend/src/modules/portail-usagers/controllers/portail-usagers-profile.controller.ts index 88cf24fdd8..b38700358d 100644 --- a/packages/backend/src/modules/portail-usagers/controllers/portail-usagers-profile.controller.ts +++ b/packages/backend/src/modules/portail-usagers/controllers/portail-usagers-profile.controller.ts @@ -14,7 +14,10 @@ import { AllowUserProfiles, CurrentUser } from "../../../auth/decorators"; import { AppUserGuard } from "../../../auth/guards"; import { ExpressResponse } from "../../../util/express"; import { UserUsagerAuthenticated } from "../../../_common/model"; -import { usagerRepository } from "../../../database"; +import { + structureInformationRepository, + usagerRepository, +} from "../../../database"; import { InteractionsService } from "../../../interactions/services"; import { PageOptionsDto } from "../../../usagers/dto"; @@ -69,6 +72,17 @@ export class PortailUsagersProfileController { } } + @Get("structure-information") + @AllowUserProfiles("usager") + @HttpCode(HttpStatus.OK) + public async getStructureInformation( + @CurrentUser() currentUser: UserUsagerAuthenticated + ) { + return structureInformationRepository.findBy({ + structureId: currentUser.structure.id, + }); + } + @Get("pending-interactions") @AllowUserProfiles("usager") @HttpCode(HttpStatus.OK) diff --git a/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.spec.ts b/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.spec.ts new file mode 100644 index 0000000000..0bf117d203 --- /dev/null +++ b/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from "@nestjs/testing"; +import { StructureInformationController } from "./structure-information.controller"; + +describe("StructureInformationController", () => { + let controller: StructureInformationController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [StructureInformationController], + }).compile(); + + controller = module.get( + StructureInformationController + ); + }); + + it("should be defined", () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.ts b/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.ts new file mode 100644 index 0000000000..d15ddb9c3e --- /dev/null +++ b/packages/backend/src/modules/portail-usagers/controllers/structure-information/structure-information.controller.ts @@ -0,0 +1,107 @@ +import { + Body, + Controller, + Delete, + Get, + HttpStatus, + Param, + ParseUUIDPipe, + Patch, + Post, + Res, + UseGuards, +} from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; +import { ApiTags, ApiBearerAuth } from "@nestjs/swagger"; +import { + AppUserGuard, + StructureInformationAccessGuard, +} from "../../../../auth/guards"; +import { + AllowUserStructureRoles, + CurrentStructureInformation, + CurrentUser, +} from "../../../../auth/decorators"; +import { StructureInformationDto } from "../../dto/structure-information.dto"; +import { structureInformationRepository } from "../../../../database"; +import { UserStructureAuthenticated } from "../../../../_common/model"; +import { ExpressResponse, getCreatedByUserStructure } from "../../../../util"; +import { StructureInformation } from "@domifa/common"; + +@UseGuards(AuthGuard("jwt"), AppUserGuard) +@ApiTags("structure-information") +@AllowUserStructureRoles("admin") +@ApiBearerAuth() +@Controller("structure-information") +export class StructureInformationController { + @AllowUserStructureRoles("admin") + @Post() + public async addInformation( + @Body() structureInformationDto: StructureInformationDto, + @CurrentUser() user: UserStructureAuthenticated, + @Res() res: ExpressResponse + ) { + try { + await structureInformationRepository.save({ + ...structureInformationDto, + structureId: user.structureId, + createdBy: getCreatedByUserStructure(user), + }); + return res.status(HttpStatus.OK).send(); + } catch (e) { + return res.status(HttpStatus.BAD_REQUEST).json({ + message: "CANNOT_ADD_STRUCTURE_INFORMATION", + }); + } + } + + @Get() + @AllowUserStructureRoles("admin") + public async getStructureInformation( + @CurrentUser() user: UserStructureAuthenticated + ) { + return structureInformationRepository.findBy({ + structureId: user.structureId, + }); + } + + @Delete(":uuid") + @AllowUserStructureRoles("admin") + @UseGuards(StructureInformationAccessGuard) + public async deleteInformation( + @Param("uuid", new ParseUUIDPipe()) _uuid: string, + @CurrentStructureInformation() structureInformation: StructureInformation, + @Res() res: ExpressResponse + ) { + await structureInformationRepository.delete({ + uuid: structureInformation.uuid, + }); + return res.status(HttpStatus.OK).json(); + } + + @Patch(":uuid") + @AllowUserStructureRoles("admin") + @UseGuards(StructureInformationAccessGuard) + public async patchInformation( + @Param("uuid", new ParseUUIDPipe()) _uuid: string, + @Body() structureInformationDto: StructureInformationDto, + @CurrentStructureInformation() structureInformation: StructureInformation, + @CurrentUser() user: UserStructureAuthenticated, + @Res() res: ExpressResponse + ) { + try { + await structureInformationRepository.update( + { uuid: structureInformation.uuid }, + { + ...structureInformationDto, + createdBy: getCreatedByUserStructure(user), + } + ); + return res.status(HttpStatus.OK).json(); + } catch (e) { + return res.status(HttpStatus.BAD_REQUEST).json({ + message: "CANNOT_ADD_STRUCTURE_INFORMATION", + }); + } + } +} diff --git a/packages/backend/src/modules/portail-usagers/dto/structure-information.dto.ts b/packages/backend/src/modules/portail-usagers/dto/structure-information.dto.ts new file mode 100644 index 0000000000..8fcf1e9211 --- /dev/null +++ b/packages/backend/src/modules/portail-usagers/dto/structure-information.dto.ts @@ -0,0 +1,57 @@ +import { + IsString, + IsNotEmpty, + IsDate, + IsOptional, + IsEnum, + IsBoolean, +} from "class-validator"; +import { Transform, Type } from "class-transformer"; +import { StructureInformationType } from "@domifa/common"; +import sanitizeHtml from "sanitize-html"; + +export class StructureInformationDto { + @IsString() + @IsNotEmpty() + @Transform(({ value }) => sanitizeHtml(value, { allowedTags: [] })) + title: string; + + @IsString() + @IsNotEmpty() + @Transform(({ value }) => + sanitizeHtml(value, { + allowedTags: [ + "b", + "strong", + "i", + "em", + "ul", + "ol", + "li", + "br", + "p", + "br", + "u", + ], + allowedAttributes: {}, + }) + ) + description: string; + + @IsDate() + @IsOptional() + @Type(() => Date) + startDate: Date; + + @IsDate() + @IsOptional() + @Type(() => Date) + endDate: Date | null; + + @IsBoolean() + @IsNotEmpty() + isTemporary: boolean; + + @IsEnum(["closing", "opening-hours", "general", "other"]) + type: StructureInformationType; +} diff --git a/packages/backend/src/modules/portail-usagers/portail-usagers.module.ts b/packages/backend/src/modules/portail-usagers/portail-usagers.module.ts index 5848a90ef0..b76e51e007 100644 --- a/packages/backend/src/modules/portail-usagers/portail-usagers.module.ts +++ b/packages/backend/src/modules/portail-usagers/portail-usagers.module.ts @@ -8,12 +8,14 @@ import { PortailUsagersLoginController } from "./controllers/portail-usagers-log import { PortailUsagersProfileController } from "./controllers/portail-usagers-profile.controller"; import { PortailUsagersManagerController } from "./controllers/portail-usagers-manager/portail-usagers-manager.controller"; import { AppLogsService } from "../app-logs/app-logs.service"; +import { StructureInformationController } from "./controllers/structure-information/structure-information.controller"; @Module({ controllers: [ PortailUsagersProfileController, PortailUsagersLoginController, PortailUsagersManagerController, + StructureInformationController, ], providers: [InteractionsService, AppLogsService], imports: [ diff --git a/packages/backend/src/usagers/controllers/security-tests/usager-structure-docs.controller.security-tests.ts b/packages/backend/src/usagers/controllers/security-tests/usager-structure-docs.controller.security-tests.ts index 84fece564d..96e9c82595 100644 --- a/packages/backend/src/usagers/controllers/security-tests/usager-structure-docs.controller.security-tests.ts +++ b/packages/backend/src/usagers/controllers/security-tests/usager-structure-docs.controller.security-tests.ts @@ -34,24 +34,4 @@ export const UsagersStructureDocsControllerSecurityTests: AppTestHttpClientSecur ), }), }, - // { - // label: `${CONTROLLER}.getDomifaCustomDoc`, - // query: async (context: AppTestContext) => ({ - // response: await AppTestHttpClient.post( - // "/usagers-structure-docs/domifa/7/attestation_postale", - // { - // context, - // } - // ), - // expectedStatus: expectedResponseStatusBuilder.allowStructureOnly( - // context.user, - // { - // roles: ["simple", "responsable", "admin"], - // validExpectedResponseStatus: HttpStatus.CREATED, - // validStructureIds: [1], // usager 1 only exists in structure 1, else UsagerAccessGuard returns BAD_REQUEST - // invalidStructureIdExpectedResponseStatus: HttpStatus.BAD_REQUEST, - // } - // ), - // }), - // }, ]; diff --git a/packages/backend/src/util/getCreatedByUserStructure.ts b/packages/backend/src/util/getCreatedByUserStructure.ts new file mode 100644 index 0000000000..2200c3bdc5 --- /dev/null +++ b/packages/backend/src/util/getCreatedByUserStructure.ts @@ -0,0 +1,11 @@ +import { UserStructureResume } from "@domifa/common"; +import { UserStructureAuthenticated } from "../_common/model"; + +export function getCreatedByUserStructure( + user: Pick +): UserStructureResume { + return { + userId: user.id, + userName: user.prenom + " " + user.nom, + }; +} diff --git a/packages/backend/src/util/index.ts b/packages/backend/src/util/index.ts index 38d196f13a..e7d5787c9a 100644 --- a/packages/backend/src/util/index.ts +++ b/packages/backend/src/util/index.ts @@ -6,7 +6,9 @@ export * from "./diacritics"; export * from "./encoding"; export * from "./express"; export * from "./expressResponseExcelRenderer.service"; -export * from "./file-manager/FileManager"; +export * from "./file-manager"; +export * from "./getCreatedByUserStructure"; +export * from "./phone"; export * from "./sentry"; export * from "./territoires"; export * from "./traceCaller"; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index c7a4d7da0e..3584dbef04 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -6,6 +6,7 @@ export * from "./message-sms"; export * from "./pagination"; export * from "./stats"; export * from "./structure"; +export * from "./structure-information"; export * from "./structure-stats"; export * from "./telephone"; export * from "./territoires"; diff --git a/packages/common/src/structure-information/constants/STRUCTURE_INFORMATION_TYPES.const.ts b/packages/common/src/structure-information/constants/STRUCTURE_INFORMATION_TYPES.const.ts new file mode 100644 index 0000000000..2991dce359 --- /dev/null +++ b/packages/common/src/structure-information/constants/STRUCTURE_INFORMATION_TYPES.const.ts @@ -0,0 +1,30 @@ +import { StructureInformationType } from "../types"; + +export const STRUCTURE_INFORMATION_TYPES: { + [key in StructureInformationType]: { + label: string; + color: string; + bg: string; + }; +} = { + closing: { + label: "❌ Fermeture", + color: "white", + bg: "danger", + }, + "opening-hours": { + label: "⏰ Horaires d'ouverture", + color: "dark", + bg: "warning", + }, + general: { + label: "Information générale", + color: "white", + bg: "primary", + }, + other: { + label: "Autre information", + color: "dark", + bg: "secondary", + }, +}; diff --git a/packages/common/src/structure-information/constants/index.ts b/packages/common/src/structure-information/constants/index.ts new file mode 100644 index 0000000000..ba0d852389 --- /dev/null +++ b/packages/common/src/structure-information/constants/index.ts @@ -0,0 +1,2 @@ +// @index('./*', f => `export * from '${f.path}'`) +export * from "./STRUCTURE_INFORMATION_TYPES.const"; diff --git a/packages/common/src/structure-information/index.ts b/packages/common/src/structure-information/index.ts new file mode 100644 index 0000000000..b9723b0efe --- /dev/null +++ b/packages/common/src/structure-information/index.ts @@ -0,0 +1,4 @@ +// @index('./*', f => `export * from '${f.path}'`) +export * from "./constants"; +export * from "./interfaces"; +export * from "./types"; diff --git a/packages/common/src/structure-information/interfaces/StructureInformation.interface.ts b/packages/common/src/structure-information/interfaces/StructureInformation.interface.ts new file mode 100644 index 0000000000..919d7d223a --- /dev/null +++ b/packages/common/src/structure-information/interfaces/StructureInformation.interface.ts @@ -0,0 +1,13 @@ +import { AppEntity } from "../../_core"; +import { UserStructureResume } from "../../user-structure"; + +export interface StructureInformation extends AppEntity { + title: string; + description: string; + startDate: Date; + endDate: Date | null; + type: "closing" | "opening-hours" | "general" | "other"; + createdBy: UserStructureResume; + structureId: number; + isTemporary: boolean; +} diff --git a/packages/common/src/structure-information/interfaces/index.ts b/packages/common/src/structure-information/interfaces/index.ts new file mode 100644 index 0000000000..c9315109bc --- /dev/null +++ b/packages/common/src/structure-information/interfaces/index.ts @@ -0,0 +1,2 @@ +// @index('./*', f => `export * from '${f.path}'`) +export * from "./StructureInformation.interface"; diff --git a/packages/common/src/structure-information/types/StructureInformationType.type.ts b/packages/common/src/structure-information/types/StructureInformationType.type.ts new file mode 100644 index 0000000000..30836d0004 --- /dev/null +++ b/packages/common/src/structure-information/types/StructureInformationType.type.ts @@ -0,0 +1,5 @@ +export type StructureInformationType = + | "closing" + | "opening-hours" + | "general" + | "other"; diff --git a/packages/common/src/structure-information/types/index.ts b/packages/common/src/structure-information/types/index.ts new file mode 100644 index 0000000000..e0c634b246 --- /dev/null +++ b/packages/common/src/structure-information/types/index.ts @@ -0,0 +1,2 @@ +// @index('./*', f => `export * from '${f.path}'`) +export * from "./StructureInformationType.type"; diff --git a/packages/common/src/structure/interfaces/index.ts b/packages/common/src/structure/interfaces/index.ts index e925204418..f55bf58769 100644 --- a/packages/common/src/structure/interfaces/index.ts +++ b/packages/common/src/structure/interfaces/index.ts @@ -1,6 +1,7 @@ // @index('./*', f => `export * from '${f.path}'`) export * from "./Structure.interface"; export * from "./StructureAddresseCourrier.interface"; +export * from "../../structure-information/interfaces/StructureInformation.interface"; export * from "./StructureOptions.interface"; export * from "./StructureOrganismeType.type"; export * from "./StructurePortailUsagerParams.interface"; diff --git a/packages/common/src/structure/types/index.ts b/packages/common/src/structure/types/index.ts index 966a88af04..cb1b7b5123 100644 --- a/packages/common/src/structure/types/index.ts +++ b/packages/common/src/structure/types/index.ts @@ -1,4 +1,5 @@ // @index('./*', f => `export * from '${f.path}'`) export * from "./StructureCommon.type"; +export * from "../../structure-information/types/StructureInformationType.type"; export * from "./StructureLight.type"; export * from "./StructureType.type"; diff --git a/packages/frontend/package.json b/packages/frontend/package.json index fb9f2177d0..ff31d1172d 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -27,6 +27,8 @@ "@angular/platform-browser": "^16.2.12", "@angular/platform-browser-dynamic": "^16.2.12", "@angular/router": "^16.2.12", + "@ckeditor/ckeditor5-angular": "^8.0.0", + "@ckeditor/ckeditor5-build-classic": "^43.1.0", "@domifa/common": "workspace:^", "@fortawesome/angular-fontawesome": "0.12.1", "@fortawesome/fontawesome-svg-core": "^6.5.2", @@ -44,6 +46,7 @@ "@swimlane/ngx-charts": "^20.5.0", "angular-user-idle": "^4.0.0", "bootstrap": "^5.3.3", + "ckeditor5": "^43.0.0", "date-fns": "^2.30.0", "file-saver": "^2.0.5", "google-libphonenumber": "^3.2.33", diff --git a/packages/frontend/src/app/interceptors/server-error.interceptor.ts b/packages/frontend/src/app/interceptors/server-error.interceptor.ts index 0a4d6f80a0..91d0fa22b5 100644 --- a/packages/frontend/src/app/interceptors/server-error.interceptor.ts +++ b/packages/frontend/src/app/interceptors/server-error.interceptor.ts @@ -71,7 +71,7 @@ export class ServerErrorInterceptor implements HttpInterceptor { "Problème de connexion au serveur. Veuillez réessayer plus tard." ); } - if (error.status === 401 || error.status === 403) { + if (error.status === 401) { authService.logoutAndRedirect(undefined, true); } else if (error.status === 404) { toastr.error("La page que vous recherchez n'existe pas"); diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers-routing.module.ts b/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers-routing.module.ts index b8c22af8db..d39fe2e7df 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers-routing.module.ts +++ b/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers-routing.module.ts @@ -1,12 +1,17 @@ import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; import { PortailUsagersParamsComponent } from "./components/portail-usagers-params/portail-usagers-params.component"; +import { ManageStructureInformationComponent } from "./components/manage-structure-information/manage-structure-information.component"; const routes: Routes = [ { path: "", component: PortailUsagersParamsComponent, }, + { + path: "informations", + component: ManageStructureInformationComponent, + }, { path: ":section", component: PortailUsagersParamsComponent, diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers.module.ts b/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers.module.ts index 6fec5b23ef..08119d3f1e 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers.module.ts +++ b/packages/frontend/src/app/modules/admin-portail-usagers/admin-portail-usagers.module.ts @@ -1,20 +1,33 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { AdminPortailUsagersRoutingModule } from "./admin-portail-usagers-routing.module"; -import { ManageTempMessagesComponent } from "./components/manage-temp-messages/manage-temp-messages.component"; import { HttpClientModule } from "@angular/common/http"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; +import { + NgbDateParserFormatter, + NgbDatepickerI18n, + NgbModule, +} from "@ng-bootstrap/ng-bootstrap"; import { GeneralModule } from "../general/general.module"; import { SharedModule } from "../shared/shared.module"; import { AdminPortailUsagersMenuComponent } from "./components/admin-portail-usagers-menu/admin-portail-usagers-menu.component"; import { PortailUsagersParamsComponent } from "./components/portail-usagers-params/portail-usagers-params.component"; +import { ManageStructureInformationComponent } from "./components/manage-structure-information/manage-structure-information.component"; +import { ManageStructureInformationFormComponent } from "./components/manage-structure-information-form/manage-structure-information-form.component"; +import { StructureInformationService } from "./services/structure-information.service"; +import { ManagePortailUsagersService } from "./services/manage-portail-usagers.service"; +import { + NgbDateCustomParserFormatter, + CustomDatepickerI18n, +} from "../shared/services"; +import { CKEditorModule } from "@ckeditor/ckeditor5-angular"; @NgModule({ declarations: [ - ManageTempMessagesComponent, AdminPortailUsagersMenuComponent, PortailUsagersParamsComponent, + ManageStructureInformationComponent, + ManageStructureInformationFormComponent, ], imports: [ CommonModule, @@ -25,6 +38,14 @@ import { PortailUsagersParamsComponent } from "./components/portail-usagers-para ReactiveFormsModule, SharedModule, GeneralModule, + CKEditorModule, + ], + providers: [ + StructureInformationService, + ManagePortailUsagersService, + NgbDateCustomParserFormatter, + { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n }, + { provide: NgbDateParserFormatter, useClass: NgbDateCustomParserFormatter }, ], }) export class AdminPortailUsagersModule {} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.html b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.html index fb9dff3b88..fa3e7a88c7 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.html +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.html @@ -42,19 +42,12 @@

Le portail Mon DomiFa, consulter son courrier en ligne

- Diffuser des informations (bientôt disponible) - Diffuser des informations + , onglet actif diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.spec.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.spec.ts index cf5d8b94fa..5fe1bd9043 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.spec.ts +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { AdminPortailUsagersMenuComponent } from "./admin-portail-usagers-menu.component"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; describe("AdminPortailUsagersMenuComponent", () => { let component: AdminPortailUsagersMenuComponent; @@ -9,6 +10,7 @@ describe("AdminPortailUsagersMenuComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [AdminPortailUsagersMenuComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); fixture = TestBed.createComponent(AdminPortailUsagersMenuComponent); diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.ts index 7663268673..b694f693cd 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.ts +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/admin-portail-usagers-menu/admin-portail-usagers-menu.component.ts @@ -8,6 +8,6 @@ import { UserStructure } from "@domifa/common"; changeDetection: ChangeDetectionStrategy.OnPush, }) export class AdminPortailUsagersMenuComponent { - @Input() public section: "" | "parametres" | "informations-temporaires"; + @Input() public section: "" | "parametres" | "informations"; @Input() public me!: UserStructure; } diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.css b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.css new file mode 100644 index 0000000000..fb0fc665fc --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.css @@ -0,0 +1,4 @@ +:host ::ng-deep .ck-editor__editable_inline { + min-height: 200px !important; + border-radius: 0 0 4px 4px !important; +} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.html b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.html new file mode 100644 index 0000000000..e14a97f0bc --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.html @@ -0,0 +1,290 @@ + + +
+ + + +
diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.ts new file mode 100644 index 0000000000..ce43ba8e03 --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information-form/manage-structure-information-form.component.ts @@ -0,0 +1,259 @@ +import { + Component, + EventEmitter, + Input, + OnDestroy, + OnInit, + Output, +} from "@angular/core"; +import { + FormGroup, + FormBuilder, + AbstractControl, + Validators, + ValidationErrors, +} from "@angular/forms"; +import { + CustomToastService, + NgbDateCustomParserFormatter, +} from "../../../shared/services"; +import { StructureInformation } from "@domifa/common"; +import { StructureInformationService } from "../../services/structure-information.service"; + +import { + endDateAfterBeginDateCheck, + formatDateToNgb, +} from "../../../../shared"; +import { Subscription } from "rxjs"; +import { EditorConfig } from "ckeditor5/src/core"; +import { + Bold, + ClassicEditor, + Essentials, + Italic, + List, + Mention, + Paragraph, + Undo, +} from "ckeditor5"; + +@Component({ + selector: "app-manage-structure-information-form", + templateUrl: "./manage-structure-information-form.component.html", + styleUrls: ["./manage-structure-information-form.component.css"], +}) +export class ManageStructureInformationFormComponent + implements OnInit, OnDestroy +{ + public tempMessageForm!: FormGroup; + public tempMessageTypes = ["closing", "opening-hours", "general", "other"]; + public subscription = new Subscription(); + + public submitted = false; + public loading = false; + + @Input() structureInformation: StructureInformation | null; + + @Output() + public getStructureInformation = new EventEmitter(); + + public Editor = ClassicEditor; + public config: EditorConfig = { + toolbar: [ + "bold", + "italic", + "list", + "bulletedList", + "numberedList", + "|", + "undo", + "redo", + ], + plugins: [Bold, Essentials, Italic, Mention, Paragraph, Undo, List], + placeholder: "Contenu de l'information que vous souhaitez diffuser", + language: "fr", + link: { + addTargetToExternalLinks: true, + defaultProtocol: "https://", + decorators: { + openInNewTab: { + mode: "manual", + label: "Ouvrir dans un nouvel onglet", + attributes: { + target: "_blank", + rel: "noopener noreferrer", + }, + }, + }, + }, + }; + + constructor( + private readonly fb: FormBuilder, + private readonly nbgDate: NgbDateCustomParserFormatter, + private readonly structureInformationService: StructureInformationService, + private readonly toastService: CustomToastService + ) {} + + public get f(): { [key: string]: AbstractControl } { + return this.tempMessageForm.controls; + } + + ngOnInit(): void { + this.initForm(); + + this.subscription.add( + this.tempMessageForm + .get("isTemporary") + ?.valueChanges.subscribe((value: boolean) => { + const validator = value ? [Validators.required] : null; + this.tempMessageForm.get("startDate")?.setValidators(validator); + this.tempMessageForm.get("endDate")?.setValidators(validator); + this.tempMessageForm.get("startDate")?.updateValueAndValidity(); + this.tempMessageForm.get("endDate")?.updateValueAndValidity(); + }) + ); + } + + initForm(): void { + this.tempMessageForm = this.fb.group( + { + title: [this.structureInformation?.title ?? "", Validators.required], + description: [ + this.structureInformation?.description ?? "", + [ + Validators.required, + Validators.minLength(10), + this.ckeditorValidator(), + ], + ], + startDate: [ + this.structureInformation?.startDate + ? formatDateToNgb(this.structureInformation?.startDate) + : null, + this.structureInformation?.isTemporary ? Validators.required : null, + ], + endDate: [ + this.structureInformation?.endDate + ? formatDateToNgb(this.structureInformation?.endDate) + : null, + this.structureInformation?.isTemporary ? Validators.required : null, + ], + type: [this.structureInformation?.type ?? "", Validators.required], + isTemporary: [ + this.structureInformation?.isTemporary ?? false, + Validators.required, + ], + }, + { + validators: this.endDateAfterBeginDateValidator, + } + ); + } + + ckeditorValidator() { + return (control: AbstractControl): ValidationErrors | null => { + const value = control.value; + if (!value) { + return { required: true }; + } + + const div = document.createElement("div"); + div.innerHTML = value; + const text = div.textContent || div.innerText || ""; + + if (text.trim().length < 10) { + return { minlength: true }; + } + + return null; + }; + } + onSubmit(): void { + this.submitted = true; + + if (this.tempMessageForm.valid) { + const formData: Partial = { + ...this.tempMessageForm.value, + startDate: + this.tempMessageForm.controls.isTemporary.value === true + ? new Date( + this.nbgDate.formatEn( + this.tempMessageForm.controls.startDate.value + ) + ) + : null, + endDate: + this.tempMessageForm.controls.isTemporary.value === true + ? new Date( + this.nbgDate.formatEn( + this.tempMessageForm.controls.endDate.value + ) + ) + : null, + }; + + if (this.structureInformation) { + this.patchStructureInformation(formData); + } else { + this.postStructureInformation(formData); + } + } else { + this.toastService.error("Veuillez vérifier le formulaire"); + } + } + + private patchStructureInformation(formData: Partial) { + this.subscription.add( + this.structureInformationService + .updateStructureInformation(this.structureInformation.uuid, formData) + .subscribe({ + next: () => { + this.loading = false; + this.toastService.success("Informations mises à jour avec succès"); + this.getStructureInformation.emit(); + }, + error: () => { + this.loading = false; + this.toastService.error( + "Impossible de mettre à jour les paramètres" + ); + }, + }) + ); + } + + private postStructureInformation(formData: Partial) { + this.subscription.add( + this.structureInformationService + .createStructureInformation(formData) + .subscribe({ + next: () => { + this.loading = false; + this.toastService.success("Informations ajoutée avec succès"); + this.getStructureInformation.emit(); + }, + error: () => { + this.loading = false; + this.toastService.error( + "Impossible de mettre à jour les paramètres" + ); + }, + }) + ); + } + + private endDateAfterBeginDateValidator = ( + controls: AbstractControl + ): ValidationErrors | null => { + const beginDateControl: AbstractControl | null = controls.get("startDate"); + const endDateControl: AbstractControl | null = controls.get("endDate"); + + return beginDateControl && endDateControl + ? endDateAfterBeginDateCheck(beginDateControl, endDateControl) + : null; + }; + public ngOnDestroy() { + this.subscription.unsubscribe(); + } +} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.css b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.css new file mode 100644 index 0000000000..93330696fc --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.css @@ -0,0 +1,3 @@ +td { + min-width: 160px; +} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.html b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.html new file mode 100644 index 0000000000..b45c61d156 --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.html @@ -0,0 +1,184 @@ +
+
+
+
+

Informations diffusées sur le portail Mon DomiFa

+
+
+ +
+
+
+
+ +
+
+
+
+

Informations déjà enregistrées

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Liste des informations partagés avec les utilisateurs du portail + "Mon DomiFa" +
Type d'informationContenuDate d'ajoutAjouté parActions
+ {{ + STRUCTURE_INFORMATION_TYPES[information.type].label + }} + + {{ information.title }}
+

+ Du {{ information.startDate | date : "dd MMMM yyyy" }} au + {{ information.endDate | date : "dd MMMM yyyy" }} +

+
+ +
+
+ {{ information.createdAt | date : "dd MMMM yyyy à HH:mm" }} + {{ information.createdBy.userName }} + + +
+
+
+

Aucune information enregistrée

+
+
+
+
+ + + + + + + + + + + + + diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.spec.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.spec.ts new file mode 100644 index 0000000000..a16d48263c --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.spec.ts @@ -0,0 +1,28 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { ManageStructureInformationComponent } from "./manage-structure-information.component"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; +import { RouterTestingModule } from "@angular/router/testing"; +import { NgbModule } from "@ng-bootstrap/ng-bootstrap"; + +describe("ManageStructureInformationComponent", () => { + let component: ManageStructureInformationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ManageStructureInformationComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [NgbModule, HttpClientTestingModule, RouterTestingModule], + }).compileComponents(); + + fixture = TestBed.createComponent(ManageStructureInformationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.ts new file mode 100644 index 0000000000..839f0d8f74 --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-structure-information/manage-structure-information.component.ts @@ -0,0 +1,103 @@ +import { Component, OnInit, TemplateRef, ViewChild } from "@angular/core"; +import { NgbModal, NgbModalRef } from "@ng-bootstrap/ng-bootstrap"; +import { DEFAULT_MODAL_OPTIONS } from "../../../../../_common/model"; +import { + STRUCTURE_INFORMATION_TYPES, + StructureInformation, +} from "@domifa/common"; +import { CustomToastService } from "../../../shared/services"; +import { StructureInformationService } from "../../services/structure-information.service"; +import { Subscription } from "rxjs"; + +@Component({ + selector: "app-manage-structure-information", + templateUrl: "./manage-structure-information.component.html", + styleUrls: ["./manage-structure-information.component.css"], +}) +export class ManageStructureInformationComponent implements OnInit { + @ViewChild("structureInformationEditorModal", { static: true }) + public structureInformationEditorModal!: TemplateRef; + + @ViewChild("structureInformationDeleteConfirmationModal", { static: true }) + public structureInformationDeleteConfirmationModal!: TemplateRef; + + public loading: boolean; + public selectedStructureInformation: StructureInformation | null; + public structureInformation: StructureInformation[]; + private subscription = new Subscription(); + + public readonly STRUCTURE_INFORMATION_TYPES = STRUCTURE_INFORMATION_TYPES; + + constructor( + private readonly modalService: NgbModal, + private readonly structureInformationService: StructureInformationService, + private readonly toastService: CustomToastService + ) { + this.loading = false; + this.structureInformation = []; + this.selectedStructureInformation = null; + + console.log(STRUCTURE_INFORMATION_TYPES); + } + + ngOnInit(): void { + this.getStructureInformation(); + } + + public openForm(structureInformation: StructureInformation | null) { + if (structureInformation) { + this.selectedStructureInformation = structureInformation; + } + this.modalService.open( + this.structureInformationEditorModal, + DEFAULT_MODAL_OPTIONS + ); + } + + public openDeleteConfirmation(structureInformation: StructureInformation) { + this.selectedStructureInformation = structureInformation; + this.modalService.open( + this.structureInformationDeleteConfirmationModal, + DEFAULT_MODAL_OPTIONS + ); + } + + public closeModals() { + this.selectedStructureInformation = null; + this.modalService.dismissAll(); + } + + public deleteStructureInformation() { + this.subscription.add( + this.structureInformationService + .deleteStructureInformation(this.selectedStructureInformation.uuid) + .subscribe({ + next: (structureInformation: StructureInformation[]) => { + this.loading = false; + this.structureInformation = structureInformation; + this.getStructureInformation(); + }, + error: () => { + this.loading = false; + this.toastService.error("Impossible de charger les informations"); + }, + }) + ); + } + + public getStructureInformation() { + this.closeModals(); + this.subscription.add( + this.structureInformationService.getAllStructureInformation().subscribe({ + next: (structureInformation: StructureInformation[]) => { + this.loading = false; + this.structureInformation = structureInformation; + }, + error: () => { + this.loading = false; + this.toastService.error("Impossible de charger les informations"); + }, + }) + ); + } +} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.html b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.html deleted file mode 100644 index ed44808c27..0000000000 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.html +++ /dev/null @@ -1,20 +0,0 @@ -
-
-
-
-

Le portail Mon DomiFa, consulter son courrier en ligne

-
- -
-
-
diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.spec.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.spec.ts deleted file mode 100644 index fa2de8c1a6..0000000000 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ComponentFixture, TestBed } from "@angular/core/testing"; - -import { ManageTempMessagesComponent } from "./manage-temp-messages.component"; - -describe("ManageTempMessagesComponent", () => { - let component: ManageTempMessagesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ManageTempMessagesComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(ManageTempMessagesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it("should create", () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.ts deleted file mode 100644 index a41c545973..0000000000 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from "@angular/core"; - -@Component({ - selector: "app-manage-temp-messages", - templateUrl: "./manage-temp-messages.component.html", - styleUrls: ["./manage-temp-messages.component.css"], -}) -export class ManageTempMessagesComponent {} diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/portail-usagers-params/portail-usagers-params.component.ts b/packages/frontend/src/app/modules/admin-portail-usagers/components/portail-usagers-params/portail-usagers-params.component.ts index dda37a5de9..7bb2d9c3fd 100644 --- a/packages/frontend/src/app/modules/admin-portail-usagers/components/portail-usagers-params/portail-usagers-params.component.ts +++ b/packages/frontend/src/app/modules/admin-portail-usagers/components/portail-usagers-params/portail-usagers-params.component.ts @@ -18,7 +18,7 @@ export class PortailUsagersParamsComponent implements OnInit, OnDestroy { public loading: boolean; private subscription = new Subscription(); - public section: "" | "parametres" | "informations-temporaires" = ""; + public section: "" | "parametres" | "informations" = ""; constructor( private readonly managePortailUsagersService: ManagePortailUsagersService, diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.spec.ts b/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.spec.ts new file mode 100644 index 0000000000..ad99c37821 --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from "@angular/core/testing"; + +import { StructureInformationService } from "./structure-information.service"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; + +describe("StructureInformationService", () => { + let service: StructureInformationService; + + beforeEach(() => { + TestBed.configureTestingModule({ imports: [HttpClientTestingModule] }); + service = TestBed.inject(StructureInformationService); + }); + + it("should be created", () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.ts b/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.ts new file mode 100644 index 0000000000..8e4ee5b196 --- /dev/null +++ b/packages/frontend/src/app/modules/admin-portail-usagers/services/structure-information.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from "@angular/core"; +import { environment } from "../../../../environments/environment"; +import { HttpClient, HttpParams } from "@angular/common/http"; +import { StructureInformation } from "@domifa/common"; +import { Observable } from "rxjs"; + +@Injectable({ + providedIn: "root", +}) +export class StructureInformationService { + private endPoint = `${environment.apiUrl}structure-information`; + + constructor(private readonly http: HttpClient) {} + + public getAllStructureInformation( + params?: HttpParams + ): Observable { + return this.http.get(this.endPoint, { + params, + }); + } + + public createStructureInformation( + data: Partial + ): Observable> { + return this.http.post>(this.endPoint, data); + } + + public updateStructureInformation( + uuid: string, + data: Partial> + ): Observable { + return this.http.patch( + `${this.endPoint}/${uuid}`, + data + ); + } + + public deleteStructureInformation( + uuid: string + ): Observable { + return this.http.delete(`${this.endPoint}/${uuid}`); + } +} diff --git a/packages/frontend/src/styles.scss b/packages/frontend/src/styles.scss index 8a3e37218a..a06231c6fc 100644 --- a/packages/frontend/src/styles.scss +++ b/packages/frontend/src/styles.scss @@ -31,3 +31,4 @@ $font-family-monospace: "Marianne", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; @import "bootstrap/scss/bootstrap"; +@import "ckeditor5/ckeditor5.css"; diff --git a/packages/portail-usagers/jest.config.js b/packages/portail-usagers/jest.config.js index 11ceac58e7..a5a93d78c6 100644 --- a/packages/portail-usagers/jest.config.js +++ b/packages/portail-usagers/jest.config.js @@ -1,10 +1,4 @@ module.exports = { - globals: { - "ts-jest": { - tsconfig: "/tsconfig.spec.json", - stringifyContentPathRegex: "\\.html$", - }, - }, preset: "jest-preset-angular", globalSetup: "jest-preset-angular/global-setup", moduleNameMapper: { diff --git a/packages/portail-usagers/src/app/modules/usager-account/components/home-usager/home-usager.component.html b/packages/portail-usagers/src/app/modules/usager-account/components/home-usager/home-usager.component.html index 73a88b7d9a..b43762aced 100644 --- a/packages/portail-usagers/src/app/modules/usager-account/components/home-usager/home-usager.component.html +++ b/packages/portail-usagers/src/app/modules/usager-account/components/home-usager/home-usager.component.html @@ -8,6 +8,7 @@

>Bienvenue dans votre espace de suivi de courrier + diff --git a/packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.css b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.css similarity index 100% rename from packages/frontend/src/app/modules/admin-portail-usagers/components/manage-temp-messages/manage-temp-messages.component.css rename to packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.css diff --git a/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.html b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.html new file mode 100644 index 0000000000..89d7b46970 --- /dev/null +++ b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.html @@ -0,0 +1,36 @@ +
+

Message de votre structure

+ +
+
+ +
+ + + {{ STRUCTURE_INFORMATION_TYPES[information.type].label }} - + {{ information.title }} +

+ Du {{ information.startDate | date : "dd MMMM yyyy" }} au + {{ information.endDate | date : "dd MMMM yyyy" }} +

+

+
+
+
+
+
+
diff --git a/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.spec.ts b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.spec.ts new file mode 100644 index 0000000000..80de46f58e --- /dev/null +++ b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from "@angular/core/testing"; + +import { StructureInformationComponent } from "./structure-information.component"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; + +describe("StructureInformationComponent", () => { + let component: StructureInformationComponent; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [StructureInformationComponent], + imports: [HttpClientTestingModule], + }); + fixture = TestBed.createComponent(StructureInformationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it("should create", () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.ts b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.ts new file mode 100644 index 0000000000..1eec8ab1d9 --- /dev/null +++ b/packages/portail-usagers/src/app/modules/usager-account/components/structure-information/structure-information.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from "@angular/core"; +import { + STRUCTURE_INFORMATION_TYPES, + StructureInformation, +} from "@domifa/common"; +import { Subscription } from "rxjs"; +import { StructureInformationService } from "../../services/structure-information.service"; +import { addDays, isAfter } from "date-fns"; + +@Component({ + selector: "app-structure-information", + templateUrl: "./structure-information.component.html", + styleUrls: ["./structure-information.component.css"], +}) +export class StructureInformationComponent implements OnInit { + public readonly STRUCTURE_INFORMATION_TYPES = STRUCTURE_INFORMATION_TYPES; + private subscription = new Subscription(); + public structureInformation: StructureInformation[] = []; + + constructor( + private readonly structureInformationService: StructureInformationService, + ) {} + + ngOnInit(): void { + this.getStructureInformation(); + } + + public getStructureInformation() { + this.subscription.add( + this.structureInformationService.getAllStructureInformation().subscribe({ + next: (structureInformation: StructureInformation[]) => { + const today = new Date(); + const futureDate = addDays(today, 15); + + this.structureInformation = structureInformation.filter((info) => { + if (!info.isTemporary) { + return true; + } + if (info.endDate) { + return isAfter(new Date(info.endDate), futureDate); + } + return false; + }); + }, + }), + ); + } +} diff --git a/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.spec.ts b/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.spec.ts new file mode 100644 index 0000000000..ad99c37821 --- /dev/null +++ b/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from "@angular/core/testing"; + +import { StructureInformationService } from "./structure-information.service"; +import { HttpClientTestingModule } from "@angular/common/http/testing"; + +describe("StructureInformationService", () => { + let service: StructureInformationService; + + beforeEach(() => { + TestBed.configureTestingModule({ imports: [HttpClientTestingModule] }); + service = TestBed.inject(StructureInformationService); + }); + + it("should be created", () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.ts b/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.ts new file mode 100644 index 0000000000..5bf3edf9c3 --- /dev/null +++ b/packages/portail-usagers/src/app/modules/usager-account/services/structure-information.service.ts @@ -0,0 +1,22 @@ +import { HttpClient, HttpParams } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { StructureInformation } from "@domifa/common"; +import { Observable } from "rxjs"; +import { environment } from "../../../../environments/environment"; + +@Injectable({ + providedIn: "root", +}) +export class StructureInformationService { + private endPoint = `${environment.apiUrl}portail-usagers/profile/structure-information`; + + constructor(private readonly http: HttpClient) {} + + public getAllStructureInformation( + params?: HttpParams, + ): Observable { + return this.http.get(this.endPoint, { + params, + }); + } +} diff --git a/packages/portail-usagers/src/app/modules/usager-account/usager-account.module.ts b/packages/portail-usagers/src/app/modules/usager-account/usager-account.module.ts index c421ff5687..e0de73c33f 100644 --- a/packages/portail-usagers/src/app/modules/usager-account/usager-account.module.ts +++ b/packages/portail-usagers/src/app/modules/usager-account/usager-account.module.ts @@ -14,6 +14,7 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { HistoriqueCourriersComponent } from "./components/historique-courriers/historique-courriers.component"; import { ReplaceLineBreaks } from "./pipes/nl2br.pipe"; import { NgbPagination } from "@ng-bootstrap/ng-bootstrap"; +import { StructureInformationComponent } from "./components/structure-information/structure-information.component"; @NgModule({ declarations: [ @@ -23,6 +24,7 @@ import { NgbPagination } from "@ng-bootstrap/ng-bootstrap"; SectionOptionsComponent, UsagerAcceptCguComponent, HistoriqueCourriersComponent, + StructureInformationComponent, ], imports: [ CommonModule, diff --git a/packages/portail-usagers/src/assets/css/bootstrap-custom.css b/packages/portail-usagers/src/assets/css/bootstrap-custom.css index 8764afc5da..bad0a56d7c 100644 --- a/packages/portail-usagers/src/assets/css/bootstrap-custom.css +++ b/packages/portail-usagers/src/assets/css/bootstrap-custom.css @@ -3,6 +3,7 @@ display: flex; align-items: left; justify-content: left; + word-break: break-all; } .alert p { diff --git a/yarn.lock b/yarn.lock index 25584a2f88..3c43f3e36c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2827,6 +2827,1530 @@ __metadata: languageName: node linkType: hard +"@ckeditor/ckeditor5-adapter-ckfinder@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-adapter-ckfinder@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-upload": 43.0.0 + ckeditor5: 43.0.0 + checksum: ca418c4d97b95144e80196ee7df672476b3f4026ee87654985b79b138b04514c50c6d31213fdd2aa1eee83b1f80695392c3e06cfdb71770cec7b816659785d3e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-adapter-ckfinder@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-adapter-ckfinder@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-upload": 43.1.0 + ckeditor5: 43.1.0 + checksum: efd7c5072e9fad73fe82d69e37655d337e14b0a6b86c6e248017dd6c7bd3a1693d2fcb6a7a80b9881c7725ef2f294eddaf07ea3dd2ce5fde16a6828d2748f73f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-alignment@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-alignment@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: f960618c96d89759bf50b046ac9b6ccb5b21500bb5033445d9b4fa48898b47a5f99cd0a7ff65d35924e5b403ab541bd56e0d0872b78a0165a49e3be33b06f7d1 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-alignment@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-alignment@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 6ad07d0912c4459f475485342701eac56e4774e31cd3a5ca4fbcd4e67d469136b8e7cc187a16a3c260a9b11ace8fd4f261ee8352323ada5302cbe90103fa3cb5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-angular@npm:^8.0.0": + version: 8.0.0 + resolution: "@ckeditor/ckeditor5-angular@npm:8.0.0" + dependencies: + tslib: ^2.3.0 + peerDependencies: + "@angular/common": ">=13.0.0" + "@angular/core": ">=13.0.0" + "@angular/forms": ">=13.0.0" + ckeditor5: ">=42.0.0 || ^0.0.0-nightly" + rxjs: ">=6.0.0" + checksum: 601c18bea2296d9ac53f07ba62398c0cfa3bb69413011146dde559249d643f14ad641391b86f68dfead1c39668b2df36a485be1cd2263577f93e898518a3bc5d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-autoformat@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-autoformat@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 5f0fe5483300459b818a3a15601653b445f5425d749cd8d7f3df1e46d8b8241d65e097959c6990dc8e685fe680301eebf7d8e41c18cceb99c9392b531b8352ad + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-autoformat@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-autoformat@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 234facf31e1a4605fd10d2f563067d37c90cd2acf073b8561da29430e243a30729ba388c7b3453be7a7f3b9d5bd2da40ee9f39c458212f924969a5821ff692b6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-autosave@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-autosave@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: c634842ef5b9fe85096be0cd6a2a7955384d035590ceec8ceffa49ef7ede9b4ee47907aae8662ccf1937628d52c5589a369b5b98800fd41b5f5e19f42ba22ac5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-autosave@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-autosave@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: b0bf6a743f5055e091a9314040ba5364a840c1aebc36421a5845b09a6a58efe15d81721c858f8648bc027d78cf2de28497b4b20e6753c5848f35fd1e1eb2608a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-basic-styles@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-basic-styles@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + ckeditor5: 43.0.0 + checksum: e5004ceb4048e9db5f8072e11879bcb1e50bae27b5021411a05f702e831686d093b34d06f7726c558488c586b20d1eeac8376380da9f001fb9d5272b429af08a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-basic-styles@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-basic-styles@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + ckeditor5: 43.1.0 + checksum: 26f7ca63374b3eecf52441d1173b8aff9a26e8da8645fca779c5bd8258ead32790625a07cde0687c0e4492c9a5b3909fde62e93583b10442966bbe768d27ff4e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-block-quote@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-block-quote@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 90b7697d27154744aa9dd07507ff3591c4ba01d635540f0db9757bf1f56dd0c56ce9c9d0b014d8bf56843403b7e54232a57b14c4045c6c4a7cc09308699e96ca + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-block-quote@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-block-quote@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: dd98f5e08bdb9645c1b6975242925c50cf164984ecc100ceba466fa33d59a7d6dca13af11019413268b5c338ed4d3d846b9f41ca74affbc4925c0fe4900e2d6c + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-build-classic@npm:^43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-build-classic@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-adapter-ckfinder": 43.1.0 + "@ckeditor/ckeditor5-autoformat": 43.1.0 + "@ckeditor/ckeditor5-basic-styles": 43.1.0 + "@ckeditor/ckeditor5-block-quote": 43.1.0 + "@ckeditor/ckeditor5-ckbox": 43.1.0 + "@ckeditor/ckeditor5-ckfinder": 43.1.0 + "@ckeditor/ckeditor5-cloud-services": 43.1.0 + "@ckeditor/ckeditor5-easy-image": 43.1.0 + "@ckeditor/ckeditor5-editor-classic": 43.1.0 + "@ckeditor/ckeditor5-essentials": 43.1.0 + "@ckeditor/ckeditor5-heading": 43.1.0 + "@ckeditor/ckeditor5-image": 43.1.0 + "@ckeditor/ckeditor5-indent": 43.1.0 + "@ckeditor/ckeditor5-link": 43.1.0 + "@ckeditor/ckeditor5-list": 43.1.0 + "@ckeditor/ckeditor5-media-embed": 43.1.0 + "@ckeditor/ckeditor5-paragraph": 43.1.0 + "@ckeditor/ckeditor5-paste-from-office": 43.1.0 + "@ckeditor/ckeditor5-table": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + checksum: 81b5e68a31d12fd4811beea5a5198a08e2ddc621448285108a400abe367b5f9f596cbf2438dec877f1d3b9fb5dfa9b43781c2002eab531c3f4d4546908ddafd2 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckbox@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-ckbox@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-upload": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + blurhash: 2.0.5 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: ceeb0e9c091f7e2420b3cc81ecf07bcbb165d22ce75dd5c563877a1d3a826087f054a9d143a859d03b050a12b1fcfddc546e2f33d6f591dd4522e73a87704a8a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckbox@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-ckbox@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-upload": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + blurhash: 2.0.5 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: bf7f5f576f40fceba5071b7f7862d1655eae1629d2c7c4f9c67ff222f490663e7d716f85488ebfbb1219d973a421e42adb9d4063e4d83a659961fd409a65b479 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckfinder@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-ckfinder@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: c8108a57394ac91a17c24fdf64340eb03506797c1543fb3c40cb2f7930ac025e09764cd0872e9ddd78f8b2e1834a8b19cbda29056af0b04efe9221d06b2cba3b + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ckfinder@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-ckfinder@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 71380a7b0286ffbf7854b444435b6a193961255ed721102f81bc44cf438e5d3d18221968e30a44e58cdcd793789a919239111851d0b8563df4a37cadc6162694 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-clipboard@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-clipboard@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + lodash-es: 4.17.21 + checksum: e431a7a10b30cb92868f88dd09390b2df2a618174ceac104445b2d5adb5f1b2162744627005b281594ba580bd2a4379b9ddae0d2d696717f4eb9b6fd1453f06b + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-clipboard@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-clipboard@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + lodash-es: 4.17.21 + checksum: 559a9388e24e76a78244584b0b0fa54a46ed6463dadbffb0e1dee333af3012578f9c6e46cda290879b059b967597855ebafc1dc618dd352e5f77e67ef5efa4a8 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-cloud-services@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-cloud-services@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 71e75b46b6c84a9d67c144b4b6494c0bfe968c8917c052e055f75174219e02ef679a0fdbd114f6d9e0e545f87750296ddd48af50c8f71fea4c5079cbc1bb8f70 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-cloud-services@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-cloud-services@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 5a7e787de4b5f81f5cfc9a5420b39a096e6d5fe8acfe520b13ae81878510e62124ee9c7c2f876c37769539f24635be00ecdcb4a59aec8fc9157fef6281ad5287 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-code-block@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-code-block@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 45b0564d8cba2f805c97cd47dffde0f6fcec75cf00163a07e97417597da4a0cb6f073ec47cded4345ca11ef1246bb4cadf98396e94d07f01935dc28f23eea391 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-code-block@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-code-block@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 83d9ba5bb62337252489a943009c1ad6fe132424880356428f6268d79fac39d81a37ba30f907dd66df843f7f1ec52d27f96a2501b4a7910a2afb881d89354e9b + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-core@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-core@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-watchdog": 43.0.0 + lodash-es: 4.17.21 + checksum: fc64c2e8e6fdedb06424097733c29743709a5ed678a026685d56f98c86807c5883d17fd9b1442d904b9cbf146219bc8cb290bcd84298af581a3433692632ea35 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-core@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-core@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-watchdog": 43.1.0 + lodash-es: 4.17.21 + checksum: 4873aa3ba073553df7d10a9e5220e208ecaaa3e1571cbc6d06f2cef5b63711489d9b6b9ca30d2962d1fc2ea51eae95672795c34507ed2b8284de714bef48db3f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-easy-image@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-easy-image@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-upload": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: e3667f7109466947a92fb2fde58f6fbcf850b822f9b729a08ca9999461a41827096b279ac67daa6d41dc5211eeaf57365256fa6d76835c131e1b0dc7809dc425 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-easy-image@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-easy-image@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-upload": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 0103949cdec9e9ccd0036d3c5f5952dd6a46bc2488a42e1ff3cd70ab8ffbeda2255303e05017b05b6700b4da8e91b3ca2dca6ed701c9832016918e562f1eb698 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-balloon@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-editor-balloon@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: a188b3d2569bae9bfcac12e20cc7d2e44ee3916792e2058f303ccb77cbbf6c15f4d30610ff90ba5c2c1a931fe2539bc47839b238e5819ab79b0ef8fb091dd684 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-balloon@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-editor-balloon@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 18029b807dfa9d43ce94927518505e08fe70705bbf967ed2dae2760937e228113a0bf10a475d096d2784ae8d2594d7ba36b399b16c04842fe7850cde7468ad45 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-classic@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-editor-classic@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: d4c9f6753f1e254c401b5354a58b58356c638d683af14e2c90699f3b889c32fa6a30c14ba4c6ef10fcc9ac2b6c31ffce717009b05ce14afbc063a776de6cef71 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-classic@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-editor-classic@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: ffb2948f2ab868be7a09a2ffa2fc6172100a8ff3350152134148e58537c32e6bb261eed65ec776969e484c6f70739ce490fc9ec7e866c3adbf00cfcf2adc0afb + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-decoupled@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-editor-decoupled@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: fc3ddc8c1aec3e3842b237b970302c7bec5d4e83603ff014a37ecd14ee5fc86408b79f9af9e373faccd7e5abf510b3de59a557c1130a8ed00dfec04afa549c9f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-decoupled@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-editor-decoupled@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 4039cd3f5e6e24e7a6fd4d13165fc912a8f0a2dc6f886024b044500a761b47b2c3a7c96c4cdc413b68101cbf411a6555a56636146a55de6db186bde61cdfe2e5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-inline@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-editor-inline@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 313089198d1cd3aa5df90b456a283b5f364933c8a59d0e69f2ddb793263f63037599f9c47add87d2df11836a2481f19359bccb931f215693fe8519675a3e5230 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-inline@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-editor-inline@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: e260571c157c36233a160d93c3609429effdb09f2a3448111bebb54b12e28595918a7639fb3ddf0fc886c2295b1b5a9278cf4c6ec9268e79a393fc427f21c35e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-multi-root@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-editor-multi-root@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 9d01f870a2fb2565b620626ee1c19280412481d1971eb46530d32bf37074bdd1690eae8117bb5d05e4131bded18cb927009dabb1dfb31559bbdf59f240a5e2df + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-editor-multi-root@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-editor-multi-root@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 6e6827e0d92c3f60a0aaa466dfebb14dea0412cd5268b6b2efe7cc1ccb1e6e61ea1804802306412903c3e80d6e5c42f0dd3dc3698e63d98510e36e48f5111a7e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-engine@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-engine@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-utils": 43.0.0 + lodash-es: 4.17.21 + checksum: 6038f9df5cf877a5532c3395ccc7c17f0836e433c5057524d75bd3f4722c34c1b997d32649185c026fca2a5d40903331f23adae3da4c93ec255fad06bfe46725 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-engine@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-engine@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-utils": 43.1.0 + lodash-es: 4.17.21 + checksum: a96161822ad78e5ccdb556f654333916fff7696dd7fbd140ea0d08331612c061eb84a193ead7a95648e9984571827d7caa831370cde9782ffe341494d9028127 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-enter@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-enter@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + checksum: ed502883aa25f401e2b820a82dcec60f4fc1d2cce2ae0e8d69551b0c47eea22a498ad0edd11a11ed688f7bcb12a42aca4abc8b44b090072003dacad8ee99d348 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-enter@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-enter@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + checksum: 067d1d4c9140d9a45926f2b25809e460585c16961aafc5105181048dc855a50e3d3374e9112e18da3a4fd1b84dba1ac22775901808e107ecdbebd2f34cf719f8 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-essentials@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-essentials@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-select-all": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-undo": 43.0.0 + ckeditor5: 43.0.0 + checksum: 3580ba27b1aeea25b0b885685b32e727cb422be119fe996f2f2f30c1641f874ab10feb94d4f2f48e8c604a31753dd9c2c28471e6efc85006f60b111433451c32 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-essentials@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-essentials@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-select-all": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-undo": 43.1.0 + ckeditor5: 43.1.0 + checksum: 3d41c57e8e45e6e471038ac6850d9b577a7f407a0792cfb83d6d6ebabe7938f8dbe6c99ee055f53504abfd4b3adefa882d05abbf1c1c7c57ddbf72124616174a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-find-and-replace@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-find-and-replace@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 8d594f0987cf0db8086ba341e198257b8937bd21e53f5f44e09912712815f495b5948fec4c7f65dbd72f0c63b60fc80accbca01a2475b7dd4f619c69b0a4fe72 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-find-and-replace@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-find-and-replace@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 84e323deb06662b4591d6abef3157c74122dab84add032c59c72eae43da306927eed31d9da964831e66ce0debe7ef62faf27d6b595546e92304f6fdc8b97ee7d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-font@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-font@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: b9d611c207984f114755399e870e73574eb1d080afe77cab9ceb4b288288efaf834b1125819ab20342e2f42f91c10c0200ba1d0a0db19d94d125a5d858ef774e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-font@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-font@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: d4390ff085a83ad3624676ffcf5fb2c9ee55a4fda26cf78090345b86f0c1d00d2cfd1939808b9c7cb169cad540d56ee4f0ec174e32e7f497aa9d8267a4f0a56f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-heading@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-heading@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-paragraph": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: fff807b92d3586b44e24ac67787dc0b0c2785ff296636088e6df69f0f2438ed4cdc08f658c295fb07d06b95854f255cb02a5039d9a66f3ce86ffef5956094efe + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-heading@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-heading@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-paragraph": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 38ef3dc9ec7d2f1ee23b7341c742c79f4481f393ca99a4a1629dbe3199abd514f6c8ae96dc4c9adefd60681bf65f772b07a5bb3231ef8ff7e759389a3f7fe984 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-highlight@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-highlight@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + ckeditor5: 43.0.0 + checksum: 117fb43ca7c219d711a4c4eac329068698fe77562c8e4559e13a5a21d3843fe936cac8c731aa58b78f99df2181c0bada3e4677d708dc2989bb70f39cbcc8fe43 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-highlight@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-highlight@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + ckeditor5: 43.1.0 + checksum: d8d4c69a6f0d91dac9d13d2dbd12c5e5c3a2467457cd609d8ced11e926511edc97994cc59aaba017164bfaf1804e97ca6719f427138b42b1f8ebd7cdf658d6fc + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-horizontal-line@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-horizontal-line@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + checksum: 9200dff3df55edfb04dfc4b491150f43b86903c2c6cceb7eee1cd24449d84f406b444d5eb53fd8e79c0d4b691268e6e57b2b14e5e93ad8ebb0516fedaf565d57 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-horizontal-line@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-horizontal-line@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + checksum: d7043c76ead0011a7fe1b3a91aa1adc0077e0f93b5eb201b25345f11eeba8d931bee8ab80bb4280b94404828e680f16f97b230767dd111196b806a430d9aba18 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-html-embed@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-html-embed@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + checksum: 667db2e512354a521cf0c1811c3c101f9fb5411b90d682469d2ced7b6e9a229aab4238b7a33c34b4e8db53620b1b9ee51d39c1c9f429f817b49a6929d9dfc3c6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-html-embed@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-html-embed@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + checksum: bef546d7215dda738aacc1ef0a2d046240ae7be5a4230fa0a3846782d0d101b0a974a60855958b3a41324ffce44e4f7da2a47b0d675845ebe5402cd8ebb14ea8 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-html-support@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-html-support@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 15c693e7e8c989c0749c1a5a14b355f89f4620aae133a278181fc9449f3f1861219fa96a0376461bea084caee5208f4466495895aa10e76c1bd645415e0455c7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-html-support@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-html-support@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: c1a73c29b01c63da122dc396e77b6b9e8f1dfb73d050735e02989312249e16d15d267c90aae5ae9765225195a92a351111f7a8c8dd24e0e9ed05d99072e2efc5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-image@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-image@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-undo": 43.0.0 + "@ckeditor/ckeditor5-upload": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 67c3ee0ba5ee15cbd24028a2480c72c2e7f5ca5e0ec76649f676deea0810268611afa36e81d57a925bdc81ba3eb2e319b0124b64bb6115449d6a7b70e4cac7fe + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-image@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-image@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-undo": 43.1.0 + "@ckeditor/ckeditor5-upload": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 496243b288a39005e35a9a756818671c7f765d151acdecc80c53baf6bd2e19e2e2e41ce8906abeca1969e2509f21248ed2b7b3937a42a69f27f4bb370306c9a7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-indent@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-indent@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: d10be9ae39e4ae2e62ac04f47b30520edcaa4ae4f4c6950195ecebcabc1496259426f0571dcfacc50419dccf4764450a239cc3e89f139fbd6376e09c41d73d76 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-indent@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-indent@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: b3dafca04a041f63886dfaa8139eed4cbcdfd2003bfac3484547cc00ebca69e40f4635a94f4414323a6d547f79004edd7be2d47153285c9efd97163d6d9234ac + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-language@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-language@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 202e84808f3aad11405efb55b5868cc016684619a81ce2ae1c42ed9d200233770572d6f81ccb86e605bb74fbab8504f1e155ba0a2bf9520694dea2c515bd5a32 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-language@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-language@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 9abba4eecc5f66d121f4da4268e79f00b94e2ba6fe1c8436df79819663e155a9fc032fd454984c5bbf5be72df14d2f20cfb5911f7ff06a844f747d9a332e19ce + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-link@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-link@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 7df396dd9fb1fdb4a7c3bc4dea07e85e77e10f4e06792a2059593441183c58ab46a337c73f3a20e43b01603da1d5a8fa264a3d931bfc6ee695044f8a2cb1a914 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-link@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-link@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: fc0bd3cc2fae9811308c7d08717e3c32522649660c544e9b0f043c154b0d46bdf91b64a76a747d8ab4e42bcde23047008a3c721af5bbac77af15bb2022452e65 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-list@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-list@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: c6da4a76419c39641790326dbeba9efb42094d0be90a3ee0eb9457487ea9221bc6d1df1ee101249b18e0567b67cb35f348c3ecbdb36ad4b50c9409cdc644d6aa + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-list@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-list@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: df9c3c018920a6d4d417ff6d234a3f46800d573d869201391cc4fb465deeba778f1c2e31cae72eaa10b00983618f3e8ad82bc0293886e0d59d213069e0451014 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-markdown-gfm@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-markdown-gfm@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + ckeditor5: 43.0.0 + marked: 4.0.12 + turndown: 7.2.0 + turndown-plugin-gfm: 1.0.2 + checksum: c7f958aaa13091c9e396795ddb1921643109d0d0744f9da72a2ca9609f4b63586b99edbc7d7f428661ea50ff2485b239be60d5a9ef05e5d9b0730aa3343cc115 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-markdown-gfm@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-markdown-gfm@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + ckeditor5: 43.1.0 + marked: 4.0.12 + turndown: 7.2.0 + turndown-plugin-gfm: 1.0.2 + checksum: cd827d57a88a88b7a05d052a762f12cdbe51ceb4c0b0833f0af7265597978bce17cfcfe7af4809f89fd6e77aa4fa644ebadcac5859da26c89ff5321bef0757f3 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-media-embed@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-media-embed@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-undo": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + checksum: 377ae94b48ac1942d8978f4efe7d2ba5531e673221dcf0b1677acf69f4faa87749a15f201e046340d6f641c673340c01d094cc90d901de85c81b7d3e6e3732fa + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-media-embed@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-media-embed@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-undo": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + checksum: 6797bc6433693e4407532f53dc23824617c3bc5c4b9347f3d2dcadc7a20cda90bbb07266a221aa1b1aeefa11f84b27f7bfc46f80097cf656b04ec66dbe468f33 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-mention@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-mention@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 1e437754037d37a67d3fa654b455a172b6ba87d085111149cf9187d025684f4906dde815da40cd393ee9e042adc345244f946eee276557c1fd58b455bfbddb6d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-mention@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-mention@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 6e843dcea42efc9180569b54cb559f44ebcc109f7135d7d46ee1cdce25d06a8976270b085e6a5eb2d8b69bf224ff2fc835a79bf5469f71c8383b6139a0047276 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-minimap@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-minimap@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 21693175dbd66c48dd0c60f340c30b44ddd11137a8dd3c3fecaef8a5f043874705f8f931d52eee189913ecd3a6b299dc013fad695d3849c5f0317085f8ba122a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-minimap@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-minimap@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 614bb128093cce82a5fe298ed535f5da2ba1909af3de3cd9d7b4ea68805ebdb8c7a1035592a37ca9e11df62b954fe68efe18c37768351c14ad494d3e2a6acf8c + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-page-break@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-page-break@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + checksum: 8760be827a9b965ddf9d1c924aceaeb123e5ec7c6de6fc61e4d75d90a3d2f413016729c533a4ba45ec1374be5942faefdc869329db7ec247e4d5f4640d8a94a6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-page-break@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-page-break@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + checksum: 213b63281819178947cc32f0cd8253920de705d95b6b57bbe3b8d539a922600720ecfbb1eaff437adefde8cc2caefa852434f909961bebfcd94bc8a386919b29 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-paragraph@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-paragraph@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + checksum: 4dd4f7d6dc90daa4faf9b089225862de00db4f77583b66056ded0be9ebcb1b6b2da80c7465c827e041293d1b4218d932ec71d924cf6ce708bd18cc41784e45e6 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-paragraph@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-paragraph@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + checksum: b36926f1f1b5dd542e0eba9ea43730f09fb8562e5dc87d8282487da3f9fbdf8f7366cdb685dc4e76c2cbb5ba1286c5630904f17475e27c408cc3b3ab9271e8ac + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-paste-from-office@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-paste-from-office@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + ckeditor5: 43.0.0 + checksum: 92dd3fd3ec606ac41b861a05a793f84dd03ab9cf341a505937736b64f0c585b39c6062e998d54765aaddb4f8048e2300e6df5967dbd79c7a543fd9bec69a65e0 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-paste-from-office@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-paste-from-office@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + ckeditor5: 43.1.0 + checksum: 5c2961537f12f7f8e5e820dbce8ea26d789df7f020cb7014e333a40ea975ac0bd6655e2e7976211aeede96876bcea46e88381b18318b009be56fbd7b83f59a3e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-remove-format@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-remove-format@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: fb296bf8da6e62267cb72cdce059a752f5d7d7bc0f959c3653890761fe2b14f269632ddd24a419c399182b437a4e127dab5d64012707eeb47d80fd7099b412dd + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-remove-format@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-remove-format@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: 53585a1e7a9b8a27dc7e600ce7b2dd7d7b6426692cfd8f8f9ba158cff281fe5b84e26b5ae3e9b35d05f8d5d1e1d632ef79249d65fe1adab7daa4ba9d65ae147b + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-restricted-editing@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-restricted-editing@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 2c8f44eac9286283e7405e866c6aa8efea1eb1abfe401898ef48cdb91b6d844642716a3bbe72236a7eb63a4ea715a78082cce67b8d72fbeec2ff6353b09fff81 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-restricted-editing@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-restricted-editing@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: a2cd16dfe97e2067fea84ca61fab409a43b6ed36547bef0547fe7e5314d6b24858310548086fbf0fcc3ba120687e635df7a19b560130a78f79364fab1655a465 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-select-all@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-select-all@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + checksum: 58e73b65ae5d4a056039b5b3f0935a8593563c627891de1d2326a1581373c6a37ffbf4f359be30db4e0e404b1b544b2b7e1dd9d195a492b7f33414cbd1714404 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-select-all@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-select-all@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + checksum: fd03272716c192b05850197bb883d4fe723a853b47c424804d77dfc3362b3dc1f87003715c3715554855d3a6fbece2f57c4cd52679b4147bb96da81eaaf627c2 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-show-blocks@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-show-blocks@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + ckeditor5: 43.0.0 + checksum: ab60197ca5d2c58812e14f9e6631190dac600aaa2d68344463a739d1e193e0687d4c4395813be860c806eec2c42e5b5303efff2a75ed520d6b1c37a618563ba5 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-show-blocks@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-show-blocks@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + ckeditor5: 43.1.0 + checksum: a64fe8fd9e316fe009b7feada7d2abcb206a30d653d8893041afce7fdcf8ca25f87e7789c9cb9c0ca3186e75689e19ad807b70104832a61556cf10a976673423 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-source-editing@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-source-editing@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-theme-lark": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 12e78f2bfd35a1df69750990715dd3c78e40993331f3d836bf28d392db374d8fad286a6d0464eabc0091b32b04ff5f81e8155ee287ebc9842db37dff006f6481 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-source-editing@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-source-editing@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-theme-lark": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: fb0b8b3ab61e510ed3fee7585c831b6b6d387d0747f3757a04aa3f59dfa755cd0683d649e21a9771892f71d0f19024c1ccde680057fae57981b44673e1dfc04d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-special-characters@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-special-characters@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + checksum: 1e4fdaac7e989adbf32c02e5541ae356b6c7a6a809099de771d781925e8b29934b98272a713b7a22b070061e8e4b2be3bf6f69120168696c8c3097ef8f07ae6d + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-special-characters@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-special-characters@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + checksum: ee8a98c835bdac449bf0f7c6ba72e625647067c60abde8af63b95c3c780e9bf04feba767f4b12d96042bcc113141d6e948d8b63742eefed2846d8e90cf550d09 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-style@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-style@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 0f8a06572a44f180752f7cf5e024814ff1b2b550f8be26d6ce883a4f939a5174f400f9831a005c8f3db425eae9c327a97bbe3bf868ea0c312414e62194a92acd + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-style@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-style@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: c16fcf7a84657715158f04db72899271544281456ef059a93e52638b72fa6e299e2985e26fec08aa5eca8857e4fdae8e370058f643b816a9e8a40f23b7146278 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-table@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-table@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: a0d0544e5b88ed5359d2e74718f79b9f724ba14714565ef621b2e3f97f96c062e254a288cd8bacea7a5cc8b33d6ba2416b0a73abc0eb2d413b005b68e9506548 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-table@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-table@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: 83aa2638b3d35ec2551ebbc47f93e96f9dde66d4475db7d742e43c7cb2eccbfdd90273fc356b3db5b00161b83bda3c4d2eecd1abe262670e3481b00ed5cc09b7 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-theme-lark@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-theme-lark@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-ui": 43.0.0 + checksum: 4920a7ff393677373ee2323e134e2cbf22c353c84d9d69b77589d6691ce751d089e91e5a31dcebad6e71a6dcf75b13b191163a4dcbb554eddcf19f8ade94a5be + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-theme-lark@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-theme-lark@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-ui": 43.1.0 + checksum: c8b2b036c1d0cabf8802a3992676c58d2943a4edeedb8495fe0436987e3bb1eada976b20910508e612aa007de7ae1bb1812bfeb924e144ab3fe4691fd7d7ba6b + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-typing@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-typing@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + lodash-es: 4.17.21 + checksum: fef19e50befc04707c8069a3b44b35a4c07694341d6695a288f527f3c6e552d007ea31baae384ee64a5e0a6681cbe16d686a155171ecad32e3b6323a1a6950ef + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-typing@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-typing@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + lodash-es: 4.17.21 + checksum: 4be3360f83fe02ee5f76997375c0866617a0be6134b8b80764de0e8f7e075b616df89551112513b9da5760d11918f4735d816f9fa163eb5cbbc13960520a83b3 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ui@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-ui@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + color-convert: 2.0.1 + color-parse: 1.4.2 + lodash-es: 4.17.21 + vanilla-colorful: 0.7.2 + checksum: 7e4b4a671666e0c771322fec8aab104f9297706420bd9bde0c34d24338f63a97dbecb4232a4be6da0feb08d7ef1fa1b786e4467fcb665cbdf1448197d83e5bda + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-ui@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-ui@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + color-convert: 2.0.1 + color-parse: 1.4.2 + lodash-es: 4.17.21 + vanilla-colorful: 0.7.2 + checksum: bb6af07f784317e195e338080a13d0f4eedd06025127b603cbe3b901cfb815755efd67fd66472ef4933cf314028751a2cef61e590f7700c530edc09cba7fc88a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-undo@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-undo@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + checksum: dd867c409fc787ffd3f0e5d013fe41bcaa131c8c7ea08a3f1cfc2c689dec6eee8de3e24645344ed01263468088c85389873a6aec702d3e48983b70c281bd08c1 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-undo@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-undo@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + checksum: c168f784e835f1e53163f4f616e7413a4829875c2e1cafd84c1ba7ed485f429a4a1702b252188b6fbe49b3561016c2765b14f0466af116662138608d31886bd0 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-upload@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-upload@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + checksum: cf963c3213a3d19c1526968d8fbc144da82ef98e2631e8ba40c4c4d9bdf0efdd946204ac5cc0d0112bece0245cff8e58de5ec54449d1bdab4767c531b509bdfa + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-upload@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-upload@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + checksum: 6af21fece448bf4a086dc3aa5bbfcd277cc57f013386ec34a64a159a72b4c1adaf06a56ec342f6cfc728958ee9296927101764af6ffee33824458cf36601cb5e + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-utils@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-utils@npm:43.0.0" + dependencies: + lodash-es: 4.17.21 + checksum: e84ee46da60fb5c15bba87479b862d283f3edd2392a69705a2d31923623754592b119a0abdc586dbb3bcac3d3466a5a35e10b77e7303957bd15675113678de57 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-utils@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-utils@npm:43.1.0" + dependencies: + lodash-es: 4.17.21 + checksum: 58c44def44dbceea40b0b3e700d8d70fdfdc1e71d32504e3de81eb23db3a1962421a63fa8d4804ce660ec6adb09bf8609f866c40b08bf0e6a6c21416297b8f91 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-watchdog@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-watchdog@npm:43.0.0" + dependencies: + lodash-es: 4.17.21 + checksum: c2b201b22b1b53bcff9d19bb61e96908d67422d46b1b26a5a11a7fb214b601b306e8cb58e1f59a5f104df0cffd5df93d285dd39ee5e30b67e1df750683a0c68a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-watchdog@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-watchdog@npm:43.1.0" + dependencies: + lodash-es: 4.17.21 + checksum: b7094862b48d2bd4c5ed7575a7e7e9654712f73a155d589827929f56473ce5bfc3f8e3d4eef1b6e7932a63f5b110333bae44a2965bbc81fdf970698a16df4fb0 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-widget@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-widget@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + lodash-es: 4.17.21 + checksum: 30a984a5b42780a86f8c7eb4dd0cc2bd0a56be4108b737f13a8c7bbd41b55ec9292e8153ab85e93fe69c7d995134ec215c2eba60f102b1c4badb79d200df3102 + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-widget@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-widget@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + lodash-es: 4.17.21 + checksum: 39c062dee0af6d4fa6d77961c5802262e634e27b7946eedb0085211c3757ab61463dedf17d0997a93712410fbee4ff012773bea82329bc486a09a318af6ee01a + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-word-count@npm:43.0.0": + version: 43.0.0 + resolution: "@ckeditor/ckeditor5-word-count@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + ckeditor5: 43.0.0 + lodash-es: 4.17.21 + checksum: 794339817e76a57d48bd6bca7cc0f260380cde4cf5a296b8223650edb2f9e753ee8ea9866e94c83ecb73656eae0ab82ef4b83c3e14ce0dfbbf331151d5fca55f + languageName: node + linkType: hard + +"@ckeditor/ckeditor5-word-count@npm:43.1.0": + version: 43.1.0 + resolution: "@ckeditor/ckeditor5-word-count@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + ckeditor5: 43.1.0 + lodash-es: 4.17.21 + checksum: d80fe9c5ecd5517e6fba6a11b8e5f74884756383efdd434c662838a47cf2b3bdd37f809c5d83eb389518ba9f5d8f15b4f3161f57fdea686085165a4dbd3bc0f2 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -3227,6 +4751,8 @@ __metadata: "@angular/platform-browser": ^16.2.12 "@angular/platform-browser-dynamic": ^16.2.12 "@angular/router": ^16.2.12 + "@ckeditor/ckeditor5-angular": ^8.0.0 + "@ckeditor/ckeditor5-build-classic": ^43.1.0 "@domifa/common": "workspace:^" "@fortawesome/angular-fontawesome": 0.12.1 "@fortawesome/fontawesome-svg-core": ^6.5.2 @@ -3250,6 +4776,7 @@ __metadata: "@typescript-eslint/parser": 7.18.0 angular-user-idle: ^4.0.0 bootstrap: ^5.3.3 + ckeditor5: ^43.0.0 date-fns: ^2.30.0 eslint: ^8.57.0 eslint-config-love: ^43.1.0 @@ -4827,6 +6354,13 @@ __metadata: languageName: node linkType: hard +"@mixmark-io/domino@npm:^2.2.0": + version: 2.2.0 + resolution: "@mixmark-io/domino@npm:2.2.0" + checksum: 547af4a8f74cb8e1f2f86e84dc968e7a722522d4748d8a1c9d30c5d1ce6a190ec400866338cc1f717b31beabed6e61c44edf17db5cf380317b63a1e7f253080f + languageName: node + linkType: hard + "@nestjs/axios@npm:^3.0.2": version: 3.0.2 resolution: "@nestjs/axios@npm:3.0.2" @@ -10637,6 +12171,13 @@ __metadata: languageName: node linkType: hard +"blurhash@npm:2.0.5": + version: 2.0.5 + resolution: "blurhash@npm:2.0.5" + checksum: aa4d6855bbaae116065b118a7b1e889648c15047e72048c28bab3db426a042ce1dc032a30c55a52da6140c314534841b984ab11cc68303668dde446d6ca53bc6 + languageName: node + linkType: hard + "body-parser@npm:1.20.2": version: 1.20.2 resolution: "body-parser@npm:1.20.2" @@ -11288,6 +12829,136 @@ __metadata: languageName: node linkType: hard +"ckeditor5@npm:43.0.0, ckeditor5@npm:^43.0.0": + version: 43.0.0 + resolution: "ckeditor5@npm:43.0.0" + dependencies: + "@ckeditor/ckeditor5-adapter-ckfinder": 43.0.0 + "@ckeditor/ckeditor5-alignment": 43.0.0 + "@ckeditor/ckeditor5-autoformat": 43.0.0 + "@ckeditor/ckeditor5-autosave": 43.0.0 + "@ckeditor/ckeditor5-basic-styles": 43.0.0 + "@ckeditor/ckeditor5-block-quote": 43.0.0 + "@ckeditor/ckeditor5-ckbox": 43.0.0 + "@ckeditor/ckeditor5-ckfinder": 43.0.0 + "@ckeditor/ckeditor5-clipboard": 43.0.0 + "@ckeditor/ckeditor5-cloud-services": 43.0.0 + "@ckeditor/ckeditor5-code-block": 43.0.0 + "@ckeditor/ckeditor5-core": 43.0.0 + "@ckeditor/ckeditor5-easy-image": 43.0.0 + "@ckeditor/ckeditor5-editor-balloon": 43.0.0 + "@ckeditor/ckeditor5-editor-classic": 43.0.0 + "@ckeditor/ckeditor5-editor-decoupled": 43.0.0 + "@ckeditor/ckeditor5-editor-inline": 43.0.0 + "@ckeditor/ckeditor5-editor-multi-root": 43.0.0 + "@ckeditor/ckeditor5-engine": 43.0.0 + "@ckeditor/ckeditor5-enter": 43.0.0 + "@ckeditor/ckeditor5-essentials": 43.0.0 + "@ckeditor/ckeditor5-find-and-replace": 43.0.0 + "@ckeditor/ckeditor5-font": 43.0.0 + "@ckeditor/ckeditor5-heading": 43.0.0 + "@ckeditor/ckeditor5-highlight": 43.0.0 + "@ckeditor/ckeditor5-horizontal-line": 43.0.0 + "@ckeditor/ckeditor5-html-embed": 43.0.0 + "@ckeditor/ckeditor5-html-support": 43.0.0 + "@ckeditor/ckeditor5-image": 43.0.0 + "@ckeditor/ckeditor5-indent": 43.0.0 + "@ckeditor/ckeditor5-language": 43.0.0 + "@ckeditor/ckeditor5-link": 43.0.0 + "@ckeditor/ckeditor5-list": 43.0.0 + "@ckeditor/ckeditor5-markdown-gfm": 43.0.0 + "@ckeditor/ckeditor5-media-embed": 43.0.0 + "@ckeditor/ckeditor5-mention": 43.0.0 + "@ckeditor/ckeditor5-minimap": 43.0.0 + "@ckeditor/ckeditor5-page-break": 43.0.0 + "@ckeditor/ckeditor5-paragraph": 43.0.0 + "@ckeditor/ckeditor5-paste-from-office": 43.0.0 + "@ckeditor/ckeditor5-remove-format": 43.0.0 + "@ckeditor/ckeditor5-restricted-editing": 43.0.0 + "@ckeditor/ckeditor5-select-all": 43.0.0 + "@ckeditor/ckeditor5-show-blocks": 43.0.0 + "@ckeditor/ckeditor5-source-editing": 43.0.0 + "@ckeditor/ckeditor5-special-characters": 43.0.0 + "@ckeditor/ckeditor5-style": 43.0.0 + "@ckeditor/ckeditor5-table": 43.0.0 + "@ckeditor/ckeditor5-theme-lark": 43.0.0 + "@ckeditor/ckeditor5-typing": 43.0.0 + "@ckeditor/ckeditor5-ui": 43.0.0 + "@ckeditor/ckeditor5-undo": 43.0.0 + "@ckeditor/ckeditor5-upload": 43.0.0 + "@ckeditor/ckeditor5-utils": 43.0.0 + "@ckeditor/ckeditor5-watchdog": 43.0.0 + "@ckeditor/ckeditor5-widget": 43.0.0 + "@ckeditor/ckeditor5-word-count": 43.0.0 + checksum: 76442f670b12418022836a0265425231b925e602044e9acfeb24b33c15d1457a9ff4c2d5d24ff7e0c79357f3746b0bbb4fadaecba9c955b88ecbf59724a3a69a + languageName: node + linkType: hard + +"ckeditor5@npm:43.1.0": + version: 43.1.0 + resolution: "ckeditor5@npm:43.1.0" + dependencies: + "@ckeditor/ckeditor5-adapter-ckfinder": 43.1.0 + "@ckeditor/ckeditor5-alignment": 43.1.0 + "@ckeditor/ckeditor5-autoformat": 43.1.0 + "@ckeditor/ckeditor5-autosave": 43.1.0 + "@ckeditor/ckeditor5-basic-styles": 43.1.0 + "@ckeditor/ckeditor5-block-quote": 43.1.0 + "@ckeditor/ckeditor5-ckbox": 43.1.0 + "@ckeditor/ckeditor5-ckfinder": 43.1.0 + "@ckeditor/ckeditor5-clipboard": 43.1.0 + "@ckeditor/ckeditor5-cloud-services": 43.1.0 + "@ckeditor/ckeditor5-code-block": 43.1.0 + "@ckeditor/ckeditor5-core": 43.1.0 + "@ckeditor/ckeditor5-easy-image": 43.1.0 + "@ckeditor/ckeditor5-editor-balloon": 43.1.0 + "@ckeditor/ckeditor5-editor-classic": 43.1.0 + "@ckeditor/ckeditor5-editor-decoupled": 43.1.0 + "@ckeditor/ckeditor5-editor-inline": 43.1.0 + "@ckeditor/ckeditor5-editor-multi-root": 43.1.0 + "@ckeditor/ckeditor5-engine": 43.1.0 + "@ckeditor/ckeditor5-enter": 43.1.0 + "@ckeditor/ckeditor5-essentials": 43.1.0 + "@ckeditor/ckeditor5-find-and-replace": 43.1.0 + "@ckeditor/ckeditor5-font": 43.1.0 + "@ckeditor/ckeditor5-heading": 43.1.0 + "@ckeditor/ckeditor5-highlight": 43.1.0 + "@ckeditor/ckeditor5-horizontal-line": 43.1.0 + "@ckeditor/ckeditor5-html-embed": 43.1.0 + "@ckeditor/ckeditor5-html-support": 43.1.0 + "@ckeditor/ckeditor5-image": 43.1.0 + "@ckeditor/ckeditor5-indent": 43.1.0 + "@ckeditor/ckeditor5-language": 43.1.0 + "@ckeditor/ckeditor5-link": 43.1.0 + "@ckeditor/ckeditor5-list": 43.1.0 + "@ckeditor/ckeditor5-markdown-gfm": 43.1.0 + "@ckeditor/ckeditor5-media-embed": 43.1.0 + "@ckeditor/ckeditor5-mention": 43.1.0 + "@ckeditor/ckeditor5-minimap": 43.1.0 + "@ckeditor/ckeditor5-page-break": 43.1.0 + "@ckeditor/ckeditor5-paragraph": 43.1.0 + "@ckeditor/ckeditor5-paste-from-office": 43.1.0 + "@ckeditor/ckeditor5-remove-format": 43.1.0 + "@ckeditor/ckeditor5-restricted-editing": 43.1.0 + "@ckeditor/ckeditor5-select-all": 43.1.0 + "@ckeditor/ckeditor5-show-blocks": 43.1.0 + "@ckeditor/ckeditor5-source-editing": 43.1.0 + "@ckeditor/ckeditor5-special-characters": 43.1.0 + "@ckeditor/ckeditor5-style": 43.1.0 + "@ckeditor/ckeditor5-table": 43.1.0 + "@ckeditor/ckeditor5-theme-lark": 43.1.0 + "@ckeditor/ckeditor5-typing": 43.1.0 + "@ckeditor/ckeditor5-ui": 43.1.0 + "@ckeditor/ckeditor5-undo": 43.1.0 + "@ckeditor/ckeditor5-upload": 43.1.0 + "@ckeditor/ckeditor5-utils": 43.1.0 + "@ckeditor/ckeditor5-watchdog": 43.1.0 + "@ckeditor/ckeditor5-widget": 43.1.0 + "@ckeditor/ckeditor5-word-count": 43.1.0 + checksum: d0597c636edc8bd7ea359118c96a81cd4b9c84f1ffec8c2fceaf0f26ed484cf8da8ea3686d13044018a7e273b40781c6bf146ae19bb7c8d817cfa2546a30a449 + languageName: node + linkType: hard + "class-transformer@npm:0.5.1": version: 0.5.1 resolution: "class-transformer@npm:0.5.1" @@ -11498,6 +13169,15 @@ __metadata: languageName: node linkType: hard +"color-convert@npm:2.0.1, color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -11507,15 +13187,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" @@ -11530,6 +13201,15 @@ __metadata: languageName: node linkType: hard +"color-parse@npm:1.4.2": + version: 1.4.2 + resolution: "color-parse@npm:1.4.2" + dependencies: + color-name: ^1.0.0 + checksum: 3ed5916f873e55637c4c3ccf663de64d125c5a445ec081e08f596c625fb8cee32b9c9fc9437073e88d8565cc7ce542d35bef3a0d16bd922839e0c436c3f6f11a + languageName: node + linkType: hard + "color-string@npm:^1.9.0": version: 1.9.1 resolution: "color-string@npm:1.9.1" @@ -18556,7 +20236,7 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:^4.17.21": +"lodash-es@npm:4.17.21, lodash-es@npm:^4.17.21": version: 4.17.21 resolution: "lodash-es@npm:4.17.21" checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 @@ -19073,6 +20753,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:4.0.12": + version: 4.0.12 + resolution: "marked@npm:4.0.12" + bin: + marked: bin/marked.js + checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192 + languageName: node + linkType: hard + "math-interval-parser@npm:^2.0.1": version: 2.0.1 resolution: "math-interval-parser@npm:2.0.1" @@ -25155,6 +26844,22 @@ __metadata: languageName: node linkType: hard +"turndown-plugin-gfm@npm:1.0.2": + version: 1.0.2 + resolution: "turndown-plugin-gfm@npm:1.0.2" + checksum: 18191dc18d731ec16bb1f1a477af6471ce2acf152b882a7eccef8e0101e09628fec0f8499f352f0a291ce798f1f30d799b5a72bd5d2cde30a2a28070de24495c + languageName: node + linkType: hard + +"turndown@npm:7.2.0": + version: 7.2.0 + resolution: "turndown@npm:7.2.0" + dependencies: + "@mixmark-io/domino": ^2.2.0 + checksum: a0bdf2fcc8cd531c94edbd7c384ae58a13251e7b472f7245fac74a316c08f8d04eb9dddfce6a5e6170ddb09c0494154a0d69312e5d9c2a7223a936a7e369ac7c + languageName: node + linkType: hard + "tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" @@ -25852,6 +27557,13 @@ __metadata: languageName: node linkType: hard +"vanilla-colorful@npm:0.7.2": + version: 0.7.2 + resolution: "vanilla-colorful@npm:0.7.2" + checksum: 02bcdc1c8c316caa4efcf0067938638e6c1c194f45530bbc907c17fd4e689752c7fe2faaa052e7af3e7ac032f196b71e51a0e4eee884bb570efc4fdcab7a912c + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2"