From 035af2a3b760cafa8355d25411dc072174a12a23 Mon Sep 17 00:00:00 2001 From: Kilton937342 Date: Sat, 11 Jun 2022 23:39:03 +0200 Subject: [PATCH] modifs --- .gitignore | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 291 -> 302 bytes .../generateur_csv.cpython-310.pyc | Bin 1682 -> 1693 bytes .../generateur_main.cpython-310.pyc | Bin 1619 -> 1662 bytes backend/api/api/Generateur/generateur_main.py | 4 +- .../api/__pycache__/__init__.cpython-310.pyc | Bin 178 -> 189 bytes .../api/api/__pycache__/asgi.cpython-310.pyc | Bin 921 -> 932 bytes .../api/__pycache__/settings.cpython-310.pyc | Bin 3299 -> 4140 bytes .../api/api/__pycache__/urls.cpython-310.pyc | Bin 1050 -> 1099 bytes backend/api/api/settings.py | 49 +- backend/api/api/urls.py | 1 + backend/api/db.sqlite3 | Bin 557056 -> 557056 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 195 bytes .../__pycache__/admin.cpython-310.pyc | Bin 327 -> 338 bytes .../__pycache__/apps.cpython-310.pyc | Bin 627 -> 638 bytes .../__pycache__/filters.cpython-310.pyc | Bin 0 -> 1763 bytes .../__pycache__/models.cpython-310.pyc | Bin 2383 -> 2680 bytes .../__pycache__/paginations.cpython-310.pyc | Bin 0 -> 962 bytes .../__pycache__/pdfmaker.cpython-310.pyc | Bin 2399 -> 2410 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 2720 -> 3737 bytes .../__pycache__/signals.cpython-310.pyc | Bin 1407 -> 1418 bytes .../__pycache__/urls.cpython-310.pyc | Bin 567 -> 734 bytes .../__pycache__/utils.cpython-310.pyc | Bin 1778 -> 1789 bytes .../__pycache__/views.cpython-310.pyc | Bin 11388 -> 16884 bytes backend/api/exercices/filters.py | 30 + .../0005_exercice_author_exercice_private.py | 25 + .../migrations/0006_alter_exercice_private.py | 18 + .../migrations/0007_exercice_origin.py | 18 + .../migrations/0008_remove_exercice_origin.py | 17 + .../migrations/0009_exercice_origin.py | 19 + .../migrations/0010_alter_exercice_id_code.py | 19 + .../migrations/0011_alter_exercice_id_code.py | 19 + .../migrations/0012_alter_exercice_origin.py | 19 + .../api/exercices/migrations/0013_tag_user.py | 20 + ...0014_remove_exercice_tags_exercice_tags.py | 22 + .../migrations/0015_exercice_original.py | 18 + .../__pycache__/0001_initial.cpython-310.pyc | Bin 1148 -> 1159 bytes ...rcice_ispdf_exercice_isweb.cpython-310.pyc | Bin 726 -> 737 bytes ...3_alter_exercice_exo_model.cpython-310.pyc | Bin 689 -> 700 bytes ...e_alter_exercice_exo_model.cpython-310.pyc | Bin 793 -> 804 bytes ...ce_author_exercice_private.cpython-310.pyc | Bin 0 -> 894 bytes ...006_alter_exercice_private.cpython-310.pyc | Bin 0 -> 666 bytes .../0007_exercice_origin.cpython-310.pyc | Bin 0 -> 672 bytes ...0008_alter_exercice_origin.cpython-310.pyc | Bin 0 -> 762 bytes ...008_remove_exercice_origin.cpython-310.pyc | Bin 0 -> 582 bytes ...0009_alter_exercice_origin.cpython-310.pyc | Bin 0 -> 679 bytes .../0009_exercice_origin.cpython-310.pyc | Bin 0 -> 761 bytes ...009_remove_exercice_origin.cpython-310.pyc | Bin 0 -> 588 bytes ...010_alter_exercice_id_code.cpython-310.pyc | Bin 0 -> 752 bytes ...e_origin_exercice_original.cpython-310.pyc | Bin 0 -> 840 bytes ...011_alter_exercice_id_code.cpython-310.pyc | Bin 0 -> 751 bytes ...1_remove_exercice_original.cpython-310.pyc | Bin 0 -> 611 bytes ...0012_alter_exercice_origin.cpython-310.pyc | Bin 0 -> 770 bytes .../__pycache__/0013_tag_user.cpython-310.pyc | Bin 0 -> 788 bytes ...xercice_tags_exercice_tags.cpython-310.pyc | Bin 0 -> 706 bytes .../0015_exercice_original.cpython-310.pyc | Bin 0 -> 662 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 195 -> 206 bytes backend/api/exercices/models.py | 11 +- backend/api/exercices/paginations.py | 21 + backend/api/exercices/serializers.py | 60 +- backend/api/exercices/urls.py | 7 +- backend/api/exercices/views.py | 288 +- .../room/__pycache__/__init__.cpython-310.pyc | Bin 179 -> 190 bytes .../room/__pycache__/admin.cpython-310.pyc | Bin 362 -> 373 bytes .../api/room/__pycache__/apps.cpython-310.pyc | Bin 454 -> 465 bytes .../__pycache__/consumers.cpython-310.pyc | Bin 8875 -> 11042 bytes .../room/__pycache__/models.cpython-310.pyc | Bin 7193 -> 8207 bytes .../room/__pycache__/routing.cpython-310.pyc | Bin 366 -> 377 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 1015 -> 1030 bytes .../api/room/__pycache__/urls.cpython-310.pyc | Bin 548 -> 559 bytes .../room/__pycache__/utils.cpython-310.pyc | Bin 770 -> 781 bytes .../room/__pycache__/views.cpython-310.pyc | Bin 16089 -> 17134 bytes backend/api/room/consumers.py | 269 +- ...icipants_room_anonymousmembers_and_more.py | 25 + .../migrations/0006_alter_room_usermembers.py | 20 + .../migrations/0007_alter_room_usermembers.py | 20 + .../0008_alter_room_anonymousmembers.py | 18 + .../api/room/migrations/0009_room_online.py | 18 + .../__pycache__/0001_initial.cpython-310.pyc | Bin 1451 -> 1462 bytes .../0002_tempcorrection.cpython-310.pyc | Bin 717 -> 728 bytes ...003_tempcorrection_id_code.cpython-310.pyc | Bin 648 -> 659 bytes ...ter_tempcorrection_id_code.cpython-310.pyc | Bin 726 -> 737 bytes ..._anonymousmembers_and_more.cpython-310.pyc | Bin 0 -> 872 bytes ...006_alter_room_usermembers.cpython-310.pyc | Bin 0 -> 781 bytes ...007_alter_room_usermembers.cpython-310.pyc | Bin 0 -> 744 bytes ...lter_room_anonymousmembers.cpython-310.pyc | Bin 0 -> 666 bytes .../0009_room_online.cpython-310.pyc | Bin 0 -> 634 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 190 -> 201 bytes backend/api/room/models.py | 215 +- backend/api/room/serializers.py | 2 +- backend/api/room/views.py | 97 +- .../__pycache__/main.cpython-310.pyc | Bin 0 -> 375 bytes .../api/uploads/exercices/exo_BCCMKX/main.py | 6 + .../api/uploads/exercices/exo_CPJLYD/main.py | 10 + .../api/uploads/exercices/exo_CYLRGK/main.py | 10 + .../api/uploads/exercices/exo_DAABOY/main.py | 10 + .../api/uploads/exercices/exo_DLILZI/main.py | 10 + .../api/uploads/exercices/exo_DSMBIT/main.py | 10 + .../api/uploads/exercices/exo_EJTHGG/main.py | 10 + .../api/uploads/exercices/exo_ERDIGN/main.py | 10 + .../exo_ERWXNC/__pycache__/sc.cpython-310.pyc | Bin 371 -> 0 bytes .../api/uploads/exercices/exo_FHVTJW/main.py | 10 + .../api/uploads/exercices/exo_HFVALR/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 423 -> 0 bytes .../api/uploads/exercices/exo_ILOXKD/main.py | 7 - .../{exo_ERWXNC => exo_IQBTYC}/main.py | 0 .../api/uploads/exercices/exo_IRMCXW/main.py | 10 + .../api/uploads/exercices/exo_JBSHGQ/main.py | 10 + .../api/uploads/exercices/exo_JMHGZF/main.py | 10 + .../api/uploads/exercices/exo_JWZWEK/main.py | 10 + .../api/uploads/exercices/exo_KSDQGB/main.py | 10 + .../api/uploads/exercices/exo_LIWCTT/main.py | 10 + .../exo_LLJYOU/__pycache__/sc.cpython-310.pyc | Bin 0 -> 382 bytes .../{exo_ERWXNC => exo_LLJYOU}/sc.py | 0 .../exo_LQYJFP/__pycache__/sc.cpython-310.pyc | Bin 368 -> 0 bytes .../api/uploads/exercices/exo_LQYJFP/sc.py | 6 - .../api/uploads/exercices/exo_LWSRGG/main.py | 10 + .../api/uploads/exercices/exo_MIYMCI/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 0 -> 384 bytes .../api/uploads/exercices/exo_NWPRJY/main.py | 6 + .../api/uploads/exercices/exo_OFCURK/main.py | 10 + .../api/uploads/exercices/exo_OVXGUV/main.py | 10 + .../api/uploads/exercices/exo_OXNZFQ/main.py | 10 + .../api/uploads/exercices/exo_PPALJX/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 0 -> 384 bytes .../api/uploads/exercices/exo_PQLBUC/main.py | 6 + .../api/uploads/exercices/exo_QLAFXX/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 311 -> 0 bytes .../api/uploads/exercices/exo_SDYANR/sc.py | 6 - .../api/uploads/exercices/exo_SJVJHE/main.py | 10 + .../api/uploads/exercices/exo_SVIAAH/main.py | 10 + .../api/uploads/exercices/exo_SVXONQ/main.py | 10 + .../api/uploads/exercices/exo_TNRSWU/main.py | 10 + .../api/uploads/exercices/exo_UAEYYI/main.py | 10 + .../api/uploads/exercices/exo_UAXLRP/main.py | 10 + .../api/uploads/exercices/exo_UFSEDX/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 0 -> 357 bytes .../api/uploads/exercices/exo_ULLYHV/main.py | 10 + .../api/uploads/exercices/exo_USMQMO/main.py | 10 + .../api/uploads/exercices/exo_VWWHMG/main.py | 10 + .../api/uploads/exercices/exo_WLNRLB/main.py | 10 + .../api/uploads/exercices/exo_WNILCK/main.py | 10 + .../__pycache__/main.cpython-310.pyc | Bin 0 -> 357 bytes .../api/uploads/exercices/exo_YCBXCU/main.py | 10 + .../api/uploads/exercices/exo_YZPQZN/main.py | 10 + .../api/uploads/exercices/exo_ZFSJTJ/main.py | 10 + .../api/uploads/exercices/exo_ZTCHJJ/main.py | 10 + backend/api/users/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 191 bytes .../users/__pycache__/admin.cpython-310.pyc | Bin 0 -> 762 bytes .../users/__pycache__/apps.cpython-310.pyc | Bin 0 -> 468 bytes .../users/__pycache__/forms.cpython-310.pyc | Bin 0 -> 1027 bytes .../users/__pycache__/models.cpython-310.pyc | Bin 0 -> 1344 bytes .../__pycache__/serializers.cpython-310.pyc | Bin 0 -> 710 bytes .../users/__pycache__/urls.cpython-310.pyc | Bin 0 -> 366 bytes backend/api/users/admin.py | 15 + backend/api/users/apps.py | 6 + backend/api/users/forms.py | 16 + backend/api/users/migrations/0001_initial.py | 44 + .../0002_customuser_registeredexos.py | 19 + .../0003_alter_customuser_registeredexos.py | 19 + .../migrations/0004_customuser_id_code.py | 18 + .../0005_alter_customuser_id_code.py | 19 + .../migrations/0006_customuser_clientid.py | 18 + .../0007_alter_customuser_clientid.py | 18 + .../0008_alter_customuser_clientid.py | 18 + ...muser_clientid_alter_customuser_id_code.py | 24 + .../0010_alter_customuser_id_code.py | 19 + backend/api/users/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-310.pyc | Bin 0 -> 2386 bytes ..._customuser_registeredexos.cpython-310.pyc | Bin 0 -> 725 bytes ..._customuser_registeredexos.cpython-310.pyc | Bin 0 -> 742 bytes .../0004_customuser_id_code.cpython-310.pyc | Bin 0 -> 670 bytes ...5_alter_customuser_id_code.cpython-310.pyc | Bin 0 -> 723 bytes .../0006_customuser_clientid.cpython-310.pyc | Bin 0 -> 701 bytes ..._alter_customuser_clientid.cpython-310.pyc | Bin 0 -> 704 bytes ..._alter_customuser_clientid.cpython-310.pyc | Bin 0 -> 710 bytes ...d_alter_customuser_id_code.cpython-310.pyc | Bin 0 -> 826 bytes ..._alter_customuser_clientid.cpython-310.pyc | Bin 0 -> 757 bytes ...0_alter_customuser_id_code.cpython-310.pyc | Bin 0 -> 766 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 202 bytes backend/api/users/models.py | 36 + backend/api/users/serializers.py | 7 + backend/api/users/tests.py | 3 + backend/api/users/urls.py | 5 + backend/api/users/views.py | 3 + frontend/apis/exoInstance.instance.js | 9 +- frontend/apis/roomInstance.intance.js | 7 +- frontend/apis/users.instance.js | 17 + frontend/components/Input.jsx | 15 + frontend/components/Layout.js | 25 +- frontend/components/NavBar.jsx | 8 +- frontend/components/Notifications.jsx | 8 - frontend/components/exos/Card.jsx | 133 +- frontend/components/exos/ExoCreateForm.jsx | 101 +- frontend/components/exos/ExoEditForm.jsx | 64 +- frontend/components/exos/ExoPrinterForm.jsx | 34 +- frontend/components/exos/ModalCard.jsx | 116 +- frontend/components/exos/Pagination.jsx | 94 +- frontend/components/exos/modelInput.jsx | 49 +- frontend/components/room/CreateParcours.jsx | 12 +- frontend/components/room/HomePage.jsx | 16 + frontend/components/room/Join.jsx | 29 + frontend/components/room/Parcours.jsx | 4 +- frontend/components/room/ParcoursEdit.jsx | 77 +- frontend/components/room/RoomPage.jsx | 8 +- frontend/components/room/RoomView.jsx | 24 +- frontend/context/session.context.js | 42 + frontend/context/websocket.context.js | 39 +- frontend/package-lock.json | 37 +- frontend/package.json | 1 + frontend/pages/_app.js | 5 +- frontend/pages/dashboard.jsx | 32 + frontend/pages/exercices/[[...exo]].jsx | 496 ++- frontend/pages/fiches.jsx | 2 - frontend/pages/login.jsx | 64 + frontend/pages/register.jsx | 77 + frontend/pages/room/[[...mode]].jsx | 11 +- frontend/requests/requests.exos.js | 114 +- frontend/requests/requests.room.js | 10 +- frontend/requests/requests.users.js | 41 + frontend/styles/Home.module.css | 51 + frontend/styles/Home.module.css.map | 10 + frontend/styles/NavBar.module.css | 75 + frontend/styles/NavBar.module.css.map | 10 + frontend/styles/exos/Alert.module.css | 152 + frontend/styles/exos/Alert.module.css.map | 14 + frontend/styles/exos/Alert.module.scss | 2 +- frontend/styles/exos/Card.module.css | 281 ++ frontend/styles/exos/Card.module.css.map | 12 + frontend/styles/exos/Card.module.scss | 74 +- frontend/styles/exos/Editor.module.css | 116 + frontend/styles/exos/Editor.module.css.map | 12 + frontend/styles/exos/ExercicesPage.module.css | 294 ++ .../styles/exos/ExercicesPage.module.css.map | 14 + .../styles/exos/ExercicesPage.module.scss | 25 +- frontend/styles/exos/ExoCreateForm.module.css | 467 +++ .../styles/exos/ExoCreateForm.module.css.map | 18 + frontend/styles/exos/ExoEditForm.module.css | 522 +++ .../styles/exos/ExoEditForm.module.css.map | 18 + .../styles/exos/ExoPrinterForm.module.css | 51 + .../styles/exos/ExoPrinterForm.module.css.map | 10 + .../styles/exos/ExoPrinterForm.module.scss | 2 + frontend/styles/exos/Modal.module.css | 54 + frontend/styles/exos/Modal.module.css.map | 12 + frontend/styles/exos/Modal.module.scss | 4 +- frontend/styles/exos/ModalCard.module.css | 451 +++ frontend/styles/exos/ModalCard.module.css.map | 16 + frontend/styles/exos/ModalCard.module.scss | 77 +- frontend/styles/exos/ModelInput.module.css | 160 + .../styles/exos/ModelInput.module.css.map | 10 + frontend/styles/exos/ModelInput.module.scss | 135 +- frontend/styles/exos/Notifications.module.css | 116 + .../styles/exos/Notifications.module.css.map | 10 + frontend/styles/exos/Paginaton.module.css | 23 + frontend/styles/exos/Paginaton.module.css.map | 10 + frontend/styles/exos/StepExemple.module.css | 37 + .../styles/exos/StepExemple.module.css.map | 10 + frontend/styles/exos/StepOptions.module.css | 27 + .../styles/exos/StepOptions.module.css.map | 10 + frontend/styles/exos/Tag.module.css | 44 + frontend/styles/exos/Tag.module.css.map | 10 + frontend/styles/functions.css | 1 + frontend/styles/functions.css.map | 9 + frontend/styles/global_components.css | 120 + frontend/styles/global_components.css.map | 10 + frontend/styles/globals.css | 3214 +++++++++++++++++ frontend/styles/globals.css.map | 12 + frontend/styles/input.module.css | 104 + frontend/styles/input.module.css.map | 10 + frontend/styles/input.module.scss | 98 + frontend/styles/login.module.css | 19 + frontend/styles/login.module.css.map | 9 + frontend/styles/login.module.scss | 7 + frontend/styles/mixins.css | 1 + frontend/styles/mixins.css.map | 10 + frontend/styles/pdf_gen/fiche.module.css | 39 + frontend/styles/pdf_gen/fiche.module.css.map | 12 + frontend/styles/pdf_gen/paramItem.module.css | 58 + .../styles/pdf_gen/paramItem.module.css.map | 10 + frontend/styles/pdf_gen/pdfForm.module.css | 23 + .../styles/pdf_gen/pdfForm.module.css.map | 9 + frontend/styles/pdf_gen/selectExo.module.css | 183 + .../styles/pdf_gen/selectExo.module.css.map | 12 + .../styles/pdf_gen/tagContainer.module.css | 10 + .../pdf_gen/tagContainer.module.css.map | 9 + frontend/styles/room/create.module.css | 28 + frontend/styles/room/create.module.css.map | 9 + frontend/styles/room/input.module.css | 79 + frontend/styles/room/input.module.css.map | 10 + frontend/styles/room/join.module.css | 30 + frontend/styles/room/join.module.css.map | 9 + frontend/styles/room/note.module.css | 33 + frontend/styles/room/note.module.css.map | 10 + frontend/styles/room/parcours.module.css | 42 + frontend/styles/room/parcours.module.css.map | 10 + frontend/styles/room/parcoursView.module.css | 1 + .../styles/room/parcoursView.module.css.map | 10 + frontend/styles/room/roomView.module.css | 113 + frontend/styles/room/roomView.module.css.map | 10 + frontend/styles/variables.css | 1 + frontend/styles/variables.css.map | 9 + frontend/styles/variables.scss | 4 +- 303 files changed, 10913 insertions(+), 846 deletions(-) create mode 100644 backend/api/exercices/__pycache__/filters.cpython-310.pyc create mode 100644 backend/api/exercices/__pycache__/paginations.cpython-310.pyc create mode 100644 backend/api/exercices/filters.py create mode 100644 backend/api/exercices/migrations/0005_exercice_author_exercice_private.py create mode 100644 backend/api/exercices/migrations/0006_alter_exercice_private.py create mode 100644 backend/api/exercices/migrations/0007_exercice_origin.py create mode 100644 backend/api/exercices/migrations/0008_remove_exercice_origin.py create mode 100644 backend/api/exercices/migrations/0009_exercice_origin.py create mode 100644 backend/api/exercices/migrations/0010_alter_exercice_id_code.py create mode 100644 backend/api/exercices/migrations/0011_alter_exercice_id_code.py create mode 100644 backend/api/exercices/migrations/0012_alter_exercice_origin.py create mode 100644 backend/api/exercices/migrations/0013_tag_user.py create mode 100644 backend/api/exercices/migrations/0014_remove_exercice_tags_exercice_tags.py create mode 100644 backend/api/exercices/migrations/0015_exercice_original.py create mode 100644 backend/api/exercices/migrations/__pycache__/0005_exercice_author_exercice_private.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0006_alter_exercice_private.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0007_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0008_alter_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0008_remove_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0009_alter_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0009_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0009_remove_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0010_alter_exercice_id_code.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0010_remove_exercice_origin_exercice_original.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0011_alter_exercice_id_code.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0011_remove_exercice_original.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0012_alter_exercice_origin.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0013_tag_user.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0014_remove_exercice_tags_exercice_tags.cpython-310.pyc create mode 100644 backend/api/exercices/migrations/__pycache__/0015_exercice_original.cpython-310.pyc create mode 100644 backend/api/exercices/paginations.py create mode 100644 backend/api/room/migrations/0005_rename_participants_room_anonymousmembers_and_more.py create mode 100644 backend/api/room/migrations/0006_alter_room_usermembers.py create mode 100644 backend/api/room/migrations/0007_alter_room_usermembers.py create mode 100644 backend/api/room/migrations/0008_alter_room_anonymousmembers.py create mode 100644 backend/api/room/migrations/0009_room_online.py create mode 100644 backend/api/room/migrations/__pycache__/0005_rename_participants_room_anonymousmembers_and_more.cpython-310.pyc create mode 100644 backend/api/room/migrations/__pycache__/0006_alter_room_usermembers.cpython-310.pyc create mode 100644 backend/api/room/migrations/__pycache__/0007_alter_room_usermembers.cpython-310.pyc create mode 100644 backend/api/room/migrations/__pycache__/0008_alter_room_anonymousmembers.cpython-310.pyc create mode 100644 backend/api/room/migrations/__pycache__/0009_room_online.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_BCCMKX/__pycache__/main.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_BCCMKX/main.py create mode 100644 backend/api/uploads/exercices/exo_CPJLYD/main.py create mode 100644 backend/api/uploads/exercices/exo_CYLRGK/main.py create mode 100644 backend/api/uploads/exercices/exo_DAABOY/main.py create mode 100644 backend/api/uploads/exercices/exo_DLILZI/main.py create mode 100644 backend/api/uploads/exercices/exo_DSMBIT/main.py create mode 100644 backend/api/uploads/exercices/exo_EJTHGG/main.py create mode 100644 backend/api/uploads/exercices/exo_ERDIGN/main.py delete mode 100644 backend/api/uploads/exercices/exo_ERWXNC/__pycache__/sc.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_FHVTJW/main.py create mode 100644 backend/api/uploads/exercices/exo_HFVALR/main.py delete mode 100644 backend/api/uploads/exercices/exo_ILOXKD/__pycache__/main.cpython-310.pyc delete mode 100644 backend/api/uploads/exercices/exo_ILOXKD/main.py rename backend/api/uploads/exercices/{exo_ERWXNC => exo_IQBTYC}/main.py (100%) create mode 100644 backend/api/uploads/exercices/exo_IRMCXW/main.py create mode 100644 backend/api/uploads/exercices/exo_JBSHGQ/main.py create mode 100644 backend/api/uploads/exercices/exo_JMHGZF/main.py create mode 100644 backend/api/uploads/exercices/exo_JWZWEK/main.py create mode 100644 backend/api/uploads/exercices/exo_KSDQGB/main.py create mode 100644 backend/api/uploads/exercices/exo_LIWCTT/main.py create mode 100644 backend/api/uploads/exercices/exo_LLJYOU/__pycache__/sc.cpython-310.pyc rename backend/api/uploads/exercices/{exo_ERWXNC => exo_LLJYOU}/sc.py (100%) delete mode 100644 backend/api/uploads/exercices/exo_LQYJFP/__pycache__/sc.cpython-310.pyc delete mode 100644 backend/api/uploads/exercices/exo_LQYJFP/sc.py create mode 100644 backend/api/uploads/exercices/exo_LWSRGG/main.py create mode 100644 backend/api/uploads/exercices/exo_MIYMCI/main.py create mode 100644 backend/api/uploads/exercices/exo_NWPRJY/__pycache__/main.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_NWPRJY/main.py create mode 100644 backend/api/uploads/exercices/exo_OFCURK/main.py create mode 100644 backend/api/uploads/exercices/exo_OVXGUV/main.py create mode 100644 backend/api/uploads/exercices/exo_OXNZFQ/main.py create mode 100644 backend/api/uploads/exercices/exo_PPALJX/main.py create mode 100644 backend/api/uploads/exercices/exo_PQLBUC/__pycache__/main.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_PQLBUC/main.py create mode 100644 backend/api/uploads/exercices/exo_QLAFXX/main.py delete mode 100644 backend/api/uploads/exercices/exo_SDYANR/__pycache__/main.cpython-310.pyc delete mode 100644 backend/api/uploads/exercices/exo_SDYANR/sc.py create mode 100644 backend/api/uploads/exercices/exo_SJVJHE/main.py create mode 100644 backend/api/uploads/exercices/exo_SVIAAH/main.py create mode 100644 backend/api/uploads/exercices/exo_SVXONQ/main.py create mode 100644 backend/api/uploads/exercices/exo_TNRSWU/main.py create mode 100644 backend/api/uploads/exercices/exo_UAEYYI/main.py create mode 100644 backend/api/uploads/exercices/exo_UAXLRP/main.py create mode 100644 backend/api/uploads/exercices/exo_UFSEDX/main.py create mode 100644 backend/api/uploads/exercices/exo_ULLYHV/__pycache__/main.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_ULLYHV/main.py create mode 100644 backend/api/uploads/exercices/exo_USMQMO/main.py create mode 100644 backend/api/uploads/exercices/exo_VWWHMG/main.py create mode 100644 backend/api/uploads/exercices/exo_WLNRLB/main.py create mode 100644 backend/api/uploads/exercices/exo_WNILCK/main.py create mode 100644 backend/api/uploads/exercices/exo_YCBXCU/__pycache__/main.cpython-310.pyc create mode 100644 backend/api/uploads/exercices/exo_YCBXCU/main.py create mode 100644 backend/api/uploads/exercices/exo_YZPQZN/main.py create mode 100644 backend/api/uploads/exercices/exo_ZFSJTJ/main.py create mode 100644 backend/api/uploads/exercices/exo_ZTCHJJ/main.py create mode 100644 backend/api/users/__init__.py create mode 100644 backend/api/users/__pycache__/__init__.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/admin.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/apps.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/forms.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/models.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/serializers.cpython-310.pyc create mode 100644 backend/api/users/__pycache__/urls.cpython-310.pyc create mode 100644 backend/api/users/admin.py create mode 100644 backend/api/users/apps.py create mode 100644 backend/api/users/forms.py create mode 100644 backend/api/users/migrations/0001_initial.py create mode 100644 backend/api/users/migrations/0002_customuser_registeredexos.py create mode 100644 backend/api/users/migrations/0003_alter_customuser_registeredexos.py create mode 100644 backend/api/users/migrations/0004_customuser_id_code.py create mode 100644 backend/api/users/migrations/0005_alter_customuser_id_code.py create mode 100644 backend/api/users/migrations/0006_customuser_clientid.py create mode 100644 backend/api/users/migrations/0007_alter_customuser_clientid.py create mode 100644 backend/api/users/migrations/0008_alter_customuser_clientid.py create mode 100644 backend/api/users/migrations/0009_alter_customuser_clientid_alter_customuser_id_code.py create mode 100644 backend/api/users/migrations/0010_alter_customuser_id_code.py create mode 100644 backend/api/users/migrations/__init__.py create mode 100644 backend/api/users/migrations/__pycache__/0001_initial.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0002_customuser_registeredexos.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0003_alter_customuser_registeredexos.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0004_customuser_id_code.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0005_alter_customuser_id_code.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0006_customuser_clientid.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0007_alter_customuser_clientid.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0008_alter_customuser_clientid.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0009_alter_customuser_clientid_alter_customuser_id_code.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0010_alter_customuser_clientid.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/0010_alter_customuser_id_code.cpython-310.pyc create mode 100644 backend/api/users/migrations/__pycache__/__init__.cpython-310.pyc create mode 100644 backend/api/users/models.py create mode 100644 backend/api/users/serializers.py create mode 100644 backend/api/users/tests.py create mode 100644 backend/api/users/urls.py create mode 100644 backend/api/users/views.py create mode 100644 frontend/apis/users.instance.js create mode 100644 frontend/components/Input.jsx create mode 100644 frontend/components/room/HomePage.jsx create mode 100644 frontend/context/session.context.js create mode 100644 frontend/pages/dashboard.jsx create mode 100644 frontend/pages/login.jsx create mode 100644 frontend/pages/register.jsx create mode 100644 frontend/requests/requests.users.js create mode 100644 frontend/styles/Home.module.css create mode 100644 frontend/styles/Home.module.css.map create mode 100644 frontend/styles/NavBar.module.css create mode 100644 frontend/styles/NavBar.module.css.map create mode 100644 frontend/styles/exos/Alert.module.css create mode 100644 frontend/styles/exos/Alert.module.css.map create mode 100644 frontend/styles/exos/Card.module.css create mode 100644 frontend/styles/exos/Card.module.css.map create mode 100644 frontend/styles/exos/Editor.module.css create mode 100644 frontend/styles/exos/Editor.module.css.map create mode 100644 frontend/styles/exos/ExercicesPage.module.css create mode 100644 frontend/styles/exos/ExercicesPage.module.css.map create mode 100644 frontend/styles/exos/ExoCreateForm.module.css create mode 100644 frontend/styles/exos/ExoCreateForm.module.css.map create mode 100644 frontend/styles/exos/ExoEditForm.module.css create mode 100644 frontend/styles/exos/ExoEditForm.module.css.map create mode 100644 frontend/styles/exos/ExoPrinterForm.module.css create mode 100644 frontend/styles/exos/ExoPrinterForm.module.css.map create mode 100644 frontend/styles/exos/Modal.module.css create mode 100644 frontend/styles/exos/Modal.module.css.map create mode 100644 frontend/styles/exos/ModalCard.module.css create mode 100644 frontend/styles/exos/ModalCard.module.css.map create mode 100644 frontend/styles/exos/ModelInput.module.css create mode 100644 frontend/styles/exos/ModelInput.module.css.map create mode 100644 frontend/styles/exos/Notifications.module.css create mode 100644 frontend/styles/exos/Notifications.module.css.map create mode 100644 frontend/styles/exos/Paginaton.module.css create mode 100644 frontend/styles/exos/Paginaton.module.css.map create mode 100644 frontend/styles/exos/StepExemple.module.css create mode 100644 frontend/styles/exos/StepExemple.module.css.map create mode 100644 frontend/styles/exos/StepOptions.module.css create mode 100644 frontend/styles/exos/StepOptions.module.css.map create mode 100644 frontend/styles/exos/Tag.module.css create mode 100644 frontend/styles/exos/Tag.module.css.map create mode 100644 frontend/styles/functions.css create mode 100644 frontend/styles/functions.css.map create mode 100644 frontend/styles/global_components.css create mode 100644 frontend/styles/global_components.css.map create mode 100644 frontend/styles/globals.css create mode 100644 frontend/styles/globals.css.map create mode 100644 frontend/styles/input.module.css create mode 100644 frontend/styles/input.module.css.map create mode 100644 frontend/styles/input.module.scss create mode 100644 frontend/styles/login.module.css create mode 100644 frontend/styles/login.module.css.map create mode 100644 frontend/styles/login.module.scss create mode 100644 frontend/styles/mixins.css create mode 100644 frontend/styles/mixins.css.map create mode 100644 frontend/styles/pdf_gen/fiche.module.css create mode 100644 frontend/styles/pdf_gen/fiche.module.css.map create mode 100644 frontend/styles/pdf_gen/paramItem.module.css create mode 100644 frontend/styles/pdf_gen/paramItem.module.css.map create mode 100644 frontend/styles/pdf_gen/pdfForm.module.css create mode 100644 frontend/styles/pdf_gen/pdfForm.module.css.map create mode 100644 frontend/styles/pdf_gen/selectExo.module.css create mode 100644 frontend/styles/pdf_gen/selectExo.module.css.map create mode 100644 frontend/styles/pdf_gen/tagContainer.module.css create mode 100644 frontend/styles/pdf_gen/tagContainer.module.css.map create mode 100644 frontend/styles/room/create.module.css create mode 100644 frontend/styles/room/create.module.css.map create mode 100644 frontend/styles/room/input.module.css create mode 100644 frontend/styles/room/input.module.css.map create mode 100644 frontend/styles/room/join.module.css create mode 100644 frontend/styles/room/join.module.css.map create mode 100644 frontend/styles/room/note.module.css create mode 100644 frontend/styles/room/note.module.css.map create mode 100644 frontend/styles/room/parcours.module.css create mode 100644 frontend/styles/room/parcours.module.css.map create mode 100644 frontend/styles/room/parcoursView.module.css create mode 100644 frontend/styles/room/parcoursView.module.css.map create mode 100644 frontend/styles/room/roomView.module.css create mode 100644 frontend/styles/room/roomView.module.css.map create mode 100644 frontend/styles/variables.css create mode 100644 frontend/styles/variables.css.map diff --git a/.gitignore b/.gitignore index a1e8c730..19f2eeda 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -/backend/env +/backend/venv /frontend/node_modules \ No newline at end of file diff --git a/backend/api/api/Generateur/__pycache__/__init__.cpython-310.pyc b/backend/api/api/Generateur/__pycache__/__init__.cpython-310.pyc index c53c915940e598921ddd3bed94497a830e1c4762..8ef790dd890fcff83accc030cbd7ea5b74476113 100644 GIT binary patch delta 50 zcmZ3?w2p~8pO=@50SGRxY?;WtfH8aG8Z)u@G9!KW)V$Q9#FEs~BK@Sqi@n>3L0VRHij4)Pbh delta 73 zcmbQsJBgP&pO=@50SG?J#%|=^#>|*D`4F=iw|-J$a&~H7N_?5oW2#N<7@>wuvVTKof7bk!wW>KL;{?572dUsaPYy5_ev1g&qjI29 z%rR;aTuy6RdGjL2*fs=b)V=5EF(zh_-GU{v$v)h5cUo&s*`Tcsr{U3YyHXwXO1eYs zHJ|lmQHqVelx3kh{c6gFgR+ndCgO*%Vut)GY@2udKBGW?na_MNTXk|E;~8w3?|f;Y VWw{Jpa=$L!Lb+;|{W~-Zegls=0la(hm`S%;w2G>~tLXlU?*6O(sPwpAkHOi+%bnJ}?5DH1 z)PMVWD$${i&ao+UO~>cZlo~gnq520F_xpEC$wF(l-P_Cb=WmNY7x4UTDp(dwkBXFHw;{Y{{w`lWQBpSe zJDe&v`48!zs4-Snd@{P_rzd-DGf~cq1AI|lidXod{3Vt@N@P`xvSLmd@=9S`ac1WH sQ8bB{(4^Mripy=ziRw2Ggq$5_e_QV03=Uu0ssI2 diff --git a/backend/api/api/Generateur/generateur_main.py b/backend/api/api/Generateur/generateur_main.py index 90343cc5..2d6e7115 100644 --- a/backend/api/api/Generateur/generateur_main.py +++ b/backend/api/api/Generateur/generateur_main.py @@ -18,7 +18,7 @@ def parseCorrection(calc, replacer='...'): return calc -def Generateur(path, quantity, key): +def Generateur(path, quantity, key, forcedCorrection = False): spec = importlib.util.spec_from_file_location( "tmp", path) tmp = importlib.util.module_from_spec(spec) @@ -47,5 +47,5 @@ def Generateur(path, quantity, key): main_result = main_func() main = {**default_object, **main_result} op_list.append({'calcul': parseCorrection(main[ - object_key], replacer) if (key != 'web' and main['correction'] == False) else main[object_key], 'correction': main[correction_key]}) + object_key], replacer) if (forcedCorrection or (key != 'web' and main['correction'] == False)) else main[object_key], 'correction': main[correction_key]}) return op_list diff --git a/backend/api/api/__pycache__/__init__.cpython-310.pyc b/backend/api/api/__pycache__/__init__.cpython-310.pyc index a035e6f3daf75780fd8ddc10f0fa40154048c7b1..b3ca327b7aa6eb569a051282ec45b63e3cbffc71 100644 GIT binary patch delta 50 zcmdnQxR;STpO=@50SGRxY?;Vy!pF diff --git a/backend/api/api/__pycache__/settings.cpython-310.pyc b/backend/api/api/__pycache__/settings.cpython-310.pyc index f986b2bd15d62132685145d9508616085c854d93..b12137fbefb485009b2bf00c21e353a7862c6ae4 100644 GIT binary patch delta 971 zcmZWn%Wl&^6pbC1q*0n?5&Dn{RFt&1ElwX260C6JNn`+ZBsNtgcI;X31=+HpzW@suyGc}9TVs#Uxjy&InfW>YWijVYO=S}F`tki^ zvpM@dx4=lJYkB4o5AWhtxP;f>J-iN!cmgidv4S7K`}EDzv5Ey;YB6{NZ{n>F99+Y! zmf*L~o-m&nrqKVze(QyE9`OToZYG)PCz z9GYgBFLp{rTq-_WEXt3IN^w8jyqKHMAp^_ds15%wFj-#5I`GWE~(`g7adz z+%W2TEK(P#Q575*vI-c}g|{vkd~Fp9(5npz7Dj&>b@{*mC^iLW zub`3bs3Xj&K+{o0rSqo^b?t<8 delta 141 zcmZ3Z@K};BpO=@50SHzk$0o%IPvnzf6xgUOz{tuJ%%G{cxrA{!BO~`@8Ror$QJkq2 zsYS_|$*ILrEJgYGxtlv!Ca^JSDs7(5vyqW+B}0)8&=@fBD|E6pzZtiFQetv;YF1ve*016M)0178lNn;vfSyAjbiSi+v_)yK|*8M{%TZ1~X`KZR|M9 xG&z?!jxliZ8D=wX{iMX??9{xJ_%fr(5-jpUd_XNM3_Sb-j6BRdj694Se*vBt6-595 diff --git a/backend/api/api/settings.py b/backend/api/api/settings.py index 9fcc95f0..492a918a 100644 --- a/backend/api/api/settings.py +++ b/backend/api/api/settings.py @@ -38,17 +38,28 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - - #3rd party + + # 3rd party 'rest_framework', 'corsheaders', 'channels', + "rest_framework.authtoken", + + 'dj_rest_auth', # new + 'django.contrib.sites', # new + 'allauth', # new + 'allauth.account', # new + 'allauth.socialaccount', # new + 'rest_auth.registration', # new - - #local + "django_filters", + + + # local 'exercices', 'room', - + "users" + ] ''' REST_FRAMEWORK = { @@ -70,7 +81,7 @@ MIDDLEWARE = [ SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" -#CORS +# CORS CORS_ALLOWED_ORIGINS = ['http://localhost:8000', 'http://141.136.42.178:8001', 'http://141.136.42.178:8002', 'http://141.136.42.178:80', 'http://lilandco42.com', 'http://127.0.0.1:8002', 'http://localhost:8001', 'http://192.168.1.18:8000'] CSRF_TRUSTED_ORIGINS = ['http://localhost:8000', 'http://141.136.42.178:8001', 'http://141.136.42.178:8002', 'http://141.136.42.178:80', 'http://lilandco42.com', @@ -169,7 +180,7 @@ STATIC_URL = 'static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') -MEDIA_ROOT= os.path.join(BASE_DIR) +MEDIA_ROOT = os.path.join(BASE_DIR) # Default primary key field type @@ -186,3 +197,27 @@ CHANNEL_LAYERS = { }, }, } + + +AUTH_USER_MODEL = 'users.CustomUser' + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +AUTHENTICATION_BACKENDS = ("django.contrib.auth.backends.ModelBackend", "allauth.account.auth_backends.AuthenticationBackend", + ) + +SITE_ID = 1 +ACCOUNT_USERNAME_REQUIRED = True +ACCOUNT_SESSION_REMEMBER = True +ACCOUNT_AUTHENTICATION_METHOD = 'username' +ACCOUNT_UNIQUE_EMAIL = True +ACCOUNT_UNIQUE_USERNAME = True + + +REST_FRAMEWORK = { + 'DATETIME_FORMAT': "%m/%d/%Y %I:%M%P", 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication', + ], + + 'DEFAULT_PAGINATION_CLASS': 'exercices.paginations.CustomPagination', + 'PAGE_SIZE': 20 + +} diff --git a/backend/api/api/urls.py b/backend/api/api/urls.py index 7942e487..26fd39a6 100644 --- a/backend/api/api/urls.py +++ b/backend/api/api/urls.py @@ -20,5 +20,6 @@ urlpatterns = [ path('api/admin/', admin.site.urls), path('api/exos/', include('exercices.urls')), path('api/room/', include('room.urls')), + path('api/users/', include("users.urls")) #path('api/users/', include('users.urls')) ] diff --git a/backend/api/db.sqlite3 b/backend/api/db.sqlite3 index 55133adb7a7b722a9f6620ca84390e3ded45899a..b2263fa53ba7b6ae196e2e7a070cfce0908df377 100644 GIT binary patch literal 557056 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 N&~6)ZODt-i{ug{%;q?Fj diff --git a/backend/api/exercices/__pycache__/__init__.cpython-310.pyc b/backend/api/exercices/__pycache__/__init__.cpython-310.pyc index bda91033f3a88f61ad86774dfe3a190b4ceb9d36..20d06fd4e5853a839a6d6ce9a1963ee3dc96f7a4 100644 GIT binary patch delta 50 zcmdnNc$kqppO=@50SGRxY?;Vy!_fmKqL`KpeOx;*@`Bubg`3#wE-=$BhH35Nqvtc6N7uGqb-p{YIk(IDY-@_nl8X zfIn!lJbYZ-!)b1#5FnU>7z7udVm%&n29H4aBA9^)By_#07yE*3Lo49}+K(ecRD{K#y#OZ#ZGJ{!VG3P#$R^O`CmxmjlppePzwpFn* z38u)ONze@^T-1+=HH|G78ky>B&%rpfX~%r`M9(P{U#De~-Pqm zZ<9NU@dk`PU1I9cv^G>fOO@F~CGG8ql$3>q$aOH#WLkLILO7pF=)6>^Cf8Ib$MQ3# zUq@{oLkVBqSX_S#H%x?r|KP(-Ry!Zx{r@pEnZ8K?lnR2qxzOjiMvLf6EMjOKIE&85 zxBdg^mDShR2%-E0ucP)dQ~8fF>o;)s9Xd;F8GrCfyhR0@EM8e+UmSe<#n+$TN9)?W z8RS{NuxVbHX3Yg=G?3cyp>Y*0ha>#Lo!61pRZ!5II8VufS_ZW)7YQ^Wp{?`F&0wJO z!eS5dja0iX9Hd$nR%4}xapOuYniWm&qAMhb4P|F>5q2`n(LO63yT%1% zCY3_imn~4=p&MlY^m)=ODHQ=ihU-j|1v~kw=%z)dpIme`7nV)c%sXs#-r~2VEsrmG WFL6rRMjP`Uy-A(mq7T;DI{zEd`J$iz literal 0 HcmV?d00001 diff --git a/backend/api/exercices/__pycache__/models.cpython-310.pyc b/backend/api/exercices/__pycache__/models.cpython-310.pyc index b41f921adcb7cd1a9ddab535c6e2bcc36bb07e8f..cb8d30286356da83dcf88e15d0626af058813ce4 100644 GIT binary patch delta 1438 zcmZuxzi-<{6y}i>e@N6XN|qhRPGq++pro+t6mgNXup8KMhB^jPJ43k;wC*BHp-A^A z21yqW36RNyaYMJD9fP8C*P{PGI^WXSDB3y5(!O^}Z8s>1`}p|2cgJ_{d&k%Qn`R{~ zmx~%)KY#sl?>pzXGDBV-U)u;ZT8K+SFYt&)Eowj4f--fe3(v}3jTUL?xkgKj464tJ zphi7f2Br>7g;s&70^t8S`M|z7SHPRN|$Dm$FX$NB&5uX*@&HB(%T(R{Aeskb71o- z0v1FTH&f2~z2r;wRNCvech+xj+>s`(3hP8ec5bg~*RwdY4KNQQs{lBfM=YWf>u+DL z5#AOT&96vBB98kh*i9+BhI8@rKH)dSPv)!Ue?aei45bRuAp(Jy!mK1Qk|gHR>Lbpw4`1D64U5HBYUH zQ>z8aO+rH(@SLJ0Q1Ak9o|-w09J{Ev8O6=AOV706GOfMP9un2;ZqRky?Ts(J-|D6Ntd+TP6%;xwY+C_SO*R$VbxUxmoRUK}NlUV<5IEg5$)Jgttlo=~r@JZQIH(Q0G)GY{<2IP$FS~Onos{=`{UnO{BGS&z zo!xNz!Pb_v#)PyFc>gh+Z0-QhQP;qV^3i_EISM^Kl$gFOhhaC4vaHMEI1JCV#sVNPjsO#Cd)x@0}qltR&)BqYMd1vn2bKbmj@7(#8eeb4Pj?<;U)i-u; zqt7@@<;nBI$?Gc#rtc}`Br})^cl(CIEY`KBur5wEon5t@Vo7ELlLp3NDPU5-WPs_0 zOqyjNllh}{8C_Al?!$Mtkr#poJMj0 zVA(UJp6vuM8C<@`ZMXIP!}&ICjD_ z$Rd+JZdIx+#y#9g0bC+Vax(EM`?pe{*OL5{n7A?ykvNNR4k0e$SbS_~8rUgVp$344 z#5A;}K%UBmKL5n#4zmtOImK+7p&hS0-L$&sp1Ug@FDJ~M3T z7g%1D&x{3fUVbnJvvHLZkc|>ydz%Z`HYm?|%D1LBC$O=dfy5&tr&6f~ zei&AH5L7BBW@8R@@oZpoF2V})a@`sl)oG5#4fA>;i*5SNTC2o1Vn>}nz?Cnpl}5*G z5%xuiC76*Qp0U_yWGwkjzs5z!Ox*nc%s^yb-D2`jz5U4nA9Zw)F!58Cf%fI Ix?0Zo4VmrDbN~PV diff --git a/backend/api/exercices/__pycache__/paginations.cpython-310.pyc b/backend/api/exercices/__pycache__/paginations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19887e1e993f33007f151580c18629ed8fddc1b4 GIT binary patch literal 962 zcmZuw&2H2%5VjL1O}ATAq*8uP+|XV&5=T@aq$2gUs^FH3mB!O0yZOU*mbU7xeFbin zphsSXNAQ(Xp8$yiVkX%_KuqNE%vkgJn;ECx-X1ZO^6RJLj~-*+$Qg=2=M^q9MWvYH z1uJ>NIoV#}m44!LcF2^k#1&Hl_(ELzNuYwaY!cpL4x4Z{YSMXLr8ciC^rAOlnz}NO z(eY4_K!4d&G=L>svBXn6@s*bdMX*8zS1buti0~V3=b$yVE{}erJ8m3rZg(*~Bd|Lm zJHmB<%e+8k*#-N|Z%BJLSk<+6!502PEQ0kOuJ?^@k1n|KuER@?*ZQ-G=R^gk){jX z#oZ_O4!aKtO7CE)k+s%alovIiWq*Rmon>6uUqUPm6emuo)TUpUeuNo6^7vg{LR{oU zo>uW|SjCO57m(R_4i)IsLaU_(WAkbrAN~ogo)5hEIL($&sW@%&7*0WFc?Kp%BI_xe zX>;cGx+?k@D2XL^Q>XW4XhI$jy^xEak%)N2L+_pK$_&RJNm->ONa;pW zmbGdNvd2=sZ_{FZ@}O%w4FaQ}&#*^2E!|ER9z^sQ8R;jas80j+m|Xe|LR^N}M@(?~ z#=MKqaQgSKIx9~Q8a~u|sp-MFhkpmBcOB?wzI%idoptX4t##u%z`^Am7h>R|{l3DN NoM;f2F%sDGe*xfr5XS%j literal 0 HcmV?d00001 diff --git a/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc b/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc index 09433c1360fa53f5d658dc34766c34be9b45fa39..3ca0f1700bbb03b5ae12b9c745d264844ce94153 100644 GIT binary patch delta 78 zcmcaF^h$_3pO=@50SIPt%-+bYz|5F7S%=w7EWXT0-#s-iwJ5P9wX{e-DKR-aH7{jz eE^{gi;Bg)wUKJ@z~x T>C4f@=rH*PM=X#u<1_&Pd4v;6 diff --git a/backend/api/exercices/__pycache__/serializers.cpython-310.pyc b/backend/api/exercices/__pycache__/serializers.cpython-310.pyc index 74c4406ff30be04dcc1de728370e6db0806a1d48..1eef24a713f9aae6014220a008b4d46d298f05fb 100644 GIT binary patch literal 3737 zcmaJ@-ESPX5huAHxA&oweEv?HMs0$$*AzO}Xwd*Q47al5ht_HVr7^r{dsr>0^Pcx^ z&)hvrKAcdXGSCko4e}lo5>P+5e?$KgzP2xU&RZYi{)T&}lPtNr;E)`W!{Kn|H_Von zY7F1M;=gZQZZP(5>Ky-EbZ(>M{{)dt@|1;T%|nj9NX5Vj9Zozabq8MP*|wYdgGyMj zZ7&T5)v$`TFDq$nP!H>aM%b`pLAo?(hE3b%>2kP&Io0&spcS?_yT@cr)}J$3S6=`8 zz7t*mry-ZXS(fFWYEyv;1k4CNe6LYZd0|MKc(t{+A@`q zPM*SQx&ZhvguG_^}$w zPBcn7IFY^eyaTV8`^?(tnQ_S|=dttGK1je^9&o*iW-LJFAGN8hqvVJ$Ruw&i=*jxX-2K5if(D_E9mDWx*;a-oN;H1nWq#Y zg~=83pMy-U7OW3-rmXKseiiQa8JEsg_80aiw#}t0z2^Z`b`QKmc8Bfr2W*pZ`}dg7 z9-`OwH%w&=^K=v0=DG=?nmjEgGXF?Z+LtVr-vH^cDf`{UJr3FI&+M_#B4Gu3WSSSm zb!b<~zC`Z}@x+=7Vdy=L(y=mL8f~ex?HQLgHcJS}h2QJ%Kz^ym5?WX#)~*{~yyW`( zG-CawwCBw<$%{A}jBdS$5o^yIY|?pyJ;|%rZl+lrrTHy1=4;!&CY&@CTp64#C*Mrr z;--QSDb#LJI=d64siu8O4c4e-)d=XaNH}ShQ(y@0!=Kz&0_81-+LO2ck5Z?un9OZ` z?iw0oVo4^Zi^PRVYxF)(2q?vdwNzW^%a~ePZK2~aQ<08kw0;*8t*Nf@H@e;|uGs@ly61y!mqp}(Oi-p@S!Dh7T)gWo1Xy%XL*TUSxm zQS$51s9*>DkbVBwJyD3lp}?LB$qxnPna?lmA?yzPLv~P+&LQ7(r_Mnzbq_gb58y*C z{(U6-Vemtif3O2C{SQ%!YQJ_+m+oLK<{pBtd5fDX>JBQxh4?O^t=QLyie`#ffz0g-?k8qL@!Hy zS>Rz7gW9e&uxZY>mR)*F82|B3q9@6ATc><^f2+fXi;Ecb844b(6Lrgfe{B^i(op=?@ zFxH4fTAVdroTUgv${c5$jI`BsJNg|WXXTw$41_dzguEM2?JNtOwVICb5XIU*U@dMB z)xNCnk;pqBVMF$#VJ}Vqf zt@fd5{MjUWNozWzY2ul?ws;F`N*1Ph1QTn768b(dJ!}7(RC1%{Bi^}PaDOoqlU#y^}Udw4+yVUs~uH}Ex delta 1123 zcmZ`%y>HV%6!-ZfcH%fG?gzBA5K$^>8nprhL!k%>K>(={QYnM^sGQstT%00#Fj7!O!;uXH&=~a)&;>{omY0wJe<&Cd>;s}|a zJ_IhN_=GCHN{O$5hDtTi(AHI7r#kF6qF0l05+`TkDRNfoVY`Vgl1A=i~Hu-w8kBbE+QNT zsPcX^yNPaDsUjwmCW6J`Bd@)fD?F{^!vD^+OwO`a0D0xX znf5^%^*D+-$2q8anSc7uv6Xxf0SmKdHrS-w=-g@&SXDS+;4)I(0s8;c%tG8PScwi` zDK6p2c)ffIKD;cRJLR=ZI(bQ28ob=P{Xa>n9~9XQ$?+#FrUu-o{^c3+w;@ diff --git a/backend/api/exercices/__pycache__/urls.cpython-310.pyc b/backend/api/exercices/__pycache__/urls.cpython-310.pyc index 5bbab18792d79dc0d96a942a764df1f98334dcf6..f6833e11de0764fe05375862e63f427c89b3889d 100644 GIT binary patch delta 441 zcmdnaa*tIzpO=@50SFH4ou3rS#K7+!HUjn%!bfODwy^pPpLc zT9NOYpOTv6mYI`!ix(&mP@0sJne3BUTmqI4Elw>0swoBuOcrIdGGYPh)URU81!>Z+ z5=gB`ElSQzPA%3i0Bfw`Lx_|D_4;WFOpau4QDRAIX_0R delta 262 zcmcb|x}8NkpO=@50SI(-Qj)eXGB7*_agYH>)&Yo%dnRfd)-y7sGN!PkvMu0R$k5CL zWV5ES!`W=9tZ+7aDhHg+k;(#RbEY!G*<7id5Oz9y6n6@DFoPz~OOVx?jJH?{5=$~( z0^P%)$$pDDz{TwruXAu%{KWrOlk*v^xY%;@Q&MyE{WN(d-)6L#tj#3J%@0&t1R{Qg oPxfar$HW*h`4p2Gw|-J$a&~H7N_?5oW-;dH%m5jB4OjpG diff --git a/backend/api/exercices/__pycache__/views.cpython-310.pyc b/backend/api/exercices/__pycache__/views.cpython-310.pyc index 845ea5289a6e8c45e24d33631d531284310571ed..26aab4e2d2c4d3de39a85690bfc036c62165d109 100644 GIT binary patch literal 16884 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 Wga2_kqh%H{Ph_&0$;{Gt{Qm*sz+}Gw diff --git a/backend/api/exercices/filters.py b/backend/api/exercices/filters.py new file mode 100644 index 00000000..01bb5bfa --- /dev/null +++ b/backend/api/exercices/filters.py @@ -0,0 +1,30 @@ +import django_filters +from .models import Exercice + +class ExosFilter(django_filters.FilterSet): + + class Meta: + model = Exercice + fields = ['name'] + + + + @property + def qs(self): + parent = super().qs + + search = self.request.get('search', '') + tags = self.request.getlist('tags[]', []) + if len(tags) == 0: + withT = [] + withAllTags = [] + withAllTagsQ = parent + else: + withT = parent.filter(tags__id_code__in=tags).distinct() #les exos possedants au moins un des tags + + withAllTags = list(filter(lambda t: all( + i in [t.id_code for t in t.tags.all()] for i in tags ), withT)) + withAllTagsQ = parent.filter(id_code__in = [e.id_code for e in withAllTags]) + print('WIRHA', withAllTagsQ) + return withAllTagsQ.filter(name__icontains=search) + \ No newline at end of file diff --git a/backend/api/exercices/migrations/0005_exercice_author_exercice_private.py b/backend/api/exercices/migrations/0005_exercice_author_exercice_private.py new file mode 100644 index 00000000..9f13ad3d --- /dev/null +++ b/backend/api/exercices/migrations/0005_exercice_author_exercice_private.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0 on 2022-05-20 13:52 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ('exercices', '0004_alter_exercice_exemple_alter_exercice_exo_model'), + ] + + operations = [ + migrations.AddField( + model_name='exercice', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.customuser'), + ), + migrations.AddField( + model_name='exercice', + name='private', + field=models.BooleanField(default=True), + ), + ] diff --git a/backend/api/exercices/migrations/0006_alter_exercice_private.py b/backend/api/exercices/migrations/0006_alter_exercice_private.py new file mode 100644 index 00000000..8e84f0fd --- /dev/null +++ b/backend/api/exercices/migrations/0006_alter_exercice_private.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-21 08:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0005_exercice_author_exercice_private'), + ] + + operations = [ + migrations.AlterField( + model_name='exercice', + name='private', + field=models.BooleanField(default=False), + ), + ] diff --git a/backend/api/exercices/migrations/0007_exercice_origin.py b/backend/api/exercices/migrations/0007_exercice_origin.py new file mode 100644 index 00000000..de4cafa5 --- /dev/null +++ b/backend/api/exercices/migrations/0007_exercice_origin.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-30 15:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0006_alter_exercice_private'), + ] + + operations = [ + migrations.AddField( + model_name='exercice', + name='origin', + field=models.CharField(default='', max_length=20, null=True), + ), + ] diff --git a/backend/api/exercices/migrations/0008_remove_exercice_origin.py b/backend/api/exercices/migrations/0008_remove_exercice_origin.py new file mode 100644 index 00000000..8a68d1f1 --- /dev/null +++ b/backend/api/exercices/migrations/0008_remove_exercice_origin.py @@ -0,0 +1,17 @@ +# Generated by Django 4.0 on 2022-05-30 16:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0007_exercice_origin'), + ] + + operations = [ + migrations.RemoveField( + model_name='exercice', + name='origin', + ), + ] diff --git a/backend/api/exercices/migrations/0009_exercice_origin.py b/backend/api/exercices/migrations/0009_exercice_origin.py new file mode 100644 index 00000000..c6543b54 --- /dev/null +++ b/backend/api/exercices/migrations/0009_exercice_origin.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-30 16:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0008_remove_exercice_origin'), + ] + + operations = [ + migrations.AddField( + model_name='exercice', + name='origin', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='exercices.exercice'), + ), + ] diff --git a/backend/api/exercices/migrations/0010_alter_exercice_id_code.py b/backend/api/exercices/migrations/0010_alter_exercice_id_code.py new file mode 100644 index 00000000..2317a80c --- /dev/null +++ b/backend/api/exercices/migrations/0010_alter_exercice_id_code.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-30 16:25 + +from django.db import migrations, models +import exercices.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0009_exercice_origin'), + ] + + operations = [ + migrations.AlterField( + model_name='exercice', + name='id_code', + field=models.CharField(default=exercices.models.generate_unique_code_step, max_length=50, null=True, unique=True), + ), + ] diff --git a/backend/api/exercices/migrations/0011_alter_exercice_id_code.py b/backend/api/exercices/migrations/0011_alter_exercice_id_code.py new file mode 100644 index 00000000..c589272e --- /dev/null +++ b/backend/api/exercices/migrations/0011_alter_exercice_id_code.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-30 16:30 + +from django.db import migrations, models +import exercices.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0010_alter_exercice_id_code'), + ] + + operations = [ + migrations.AlterField( + model_name='exercice', + name='id_code', + field=models.CharField(default=exercices.models.generate_unique_code_step, max_length=50, unique=True), + ), + ] diff --git a/backend/api/exercices/migrations/0012_alter_exercice_origin.py b/backend/api/exercices/migrations/0012_alter_exercice_origin.py new file mode 100644 index 00000000..370889f8 --- /dev/null +++ b/backend/api/exercices/migrations/0012_alter_exercice_origin.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-30 16:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0011_alter_exercice_id_code'), + ] + + operations = [ + migrations.AlterField( + model_name='exercice', + name='origin', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='exercices.exercice'), + ), + ] diff --git a/backend/api/exercices/migrations/0013_tag_user.py b/backend/api/exercices/migrations/0013_tag_user.py new file mode 100644 index 00000000..066ca847 --- /dev/null +++ b/backend/api/exercices/migrations/0013_tag_user.py @@ -0,0 +1,20 @@ +# Generated by Django 4.0 on 2022-06-04 06:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0010_alter_customuser_id_code'), + ('exercices', '0012_alter_exercice_origin'), + ] + + operations = [ + migrations.AddField( + model_name='tag', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.customuser'), + ), + ] diff --git a/backend/api/exercices/migrations/0014_remove_exercice_tags_exercice_tags.py b/backend/api/exercices/migrations/0014_remove_exercice_tags_exercice_tags.py new file mode 100644 index 00000000..fd6d324b --- /dev/null +++ b/backend/api/exercices/migrations/0014_remove_exercice_tags_exercice_tags.py @@ -0,0 +1,22 @@ +# Generated by Django 4.0 on 2022-06-04 07:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0013_tag_user'), + ] + + operations = [ + migrations.RemoveField( + model_name='exercice', + name='tags', + ), + migrations.AddField( + model_name='exercice', + name='tags', + field=models.ManyToManyField(to='exercices.Tag'), + ), + ] diff --git a/backend/api/exercices/migrations/0015_exercice_original.py b/backend/api/exercices/migrations/0015_exercice_original.py new file mode 100644 index 00000000..c0f284c4 --- /dev/null +++ b/backend/api/exercices/migrations/0015_exercice_original.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-06-06 19:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0014_remove_exercice_tags_exercice_tags'), + ] + + operations = [ + migrations.AddField( + model_name='exercice', + name='original', + field=models.BooleanField(default=True), + ), + ] diff --git a/backend/api/exercices/migrations/__pycache__/0001_initial.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0001_initial.cpython-310.pyc index 58dc96a2f63705c7e1f2198653e6f299e795379b..b76e63d285b77b187b7b682cfcdd2d2adecf6ba0 100644 GIT binary patch delta 53 zcmeyv(ay=8&&$ij00b9Twru21Wo9g$T*z!D7GGwh@1B~MT9jClT3V!^l$e~InwK(p H6Z0tmpRy5e delta 42 wcmZqY{KLVW&&$ij00biEqBnA9wHMsNKz4QDRAI wX_0L(eo|s`c4}Tqe3{W? lQKnigxI9=ub2f$2r!8;0{~1w7oPwC diff --git a/backend/api/exercices/migrations/__pycache__/0004_alter_exercice_exemple_alter_exercice_exo_model.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0004_alter_exercice_exemple_alter_exercice_exo_model.cpython-310.pyc index bfba0c52d9da35c38098b93873d77d79f9d86147..165e618dcb7ee822413850b027f750b54ed62ffc 100644 GIT binary patch delta 53 zcmbQqwuFs4pO=@50SGRxY}v^DhLLgZ+J%<*MLlUX3jF{8 diff --git a/backend/api/exercices/migrations/__pycache__/0005_exercice_author_exercice_private.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0005_exercice_author_exercice_private.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cda1e24bcea6f84b789e0cf1285966376bfff80 GIT binary patch literal 894 zcmZWn&2H2%5VoD4&8Az_Qw0||aoEeIpmIZ~rKLR}Dx`AC#mdIht%DP%c2ZHUAaN>h zzyt6WJcqBGc!f$J#@Q}g2}>T$_hrWZ@{RT8W=e29{`O`5gAwx6gS#t4u!q~uFbE>3 zA~nrv&2mOPW-7?TVu^3$kBDr2wjIm-OB9UHG z&tmVU*g!24H-57cfr_Hug0XJ0v$OMr%SLvxP)LvA1DH~lVDnx4w95u_janlwiw>sLjRc$(z3NV;_guni!SJjAnxaPu`g*EM8HDp@qyAzWsy(G`?kwt&WWKyP>lwv){wJ6=u` literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0006_alter_exercice_private.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0006_alter_exercice_private.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82f8ca4bdc52c8075082015bc4b7cb7531b89de1 GIT binary patch literal 666 zcmZWn&2H2%5VqrFHygDQ0>m3oDH5tzNN_@^Ak?1dgrP8{s)3eNPvrB`l< zGq2<;Ctd*wm2ukDuGEn{@;CE&{yg^ZuplTue|%egr-b~DU|&)MCwTl3Dn%4Eq@xw> zk}9F(jHpDhE20?CmVIRvQ|Sj%W`B@N$|Mw>Zk!yo?R}VaR)O(#bnVLw!3iG!3>A=y zDpDniHnd`pwpmO7vv#ghm0eRcyJqOg)g060Vex(&ACoQMGq_sU;H#(0_UV>2;{8| z;Qc^|Pitu+HzEZC^a}b~gLerw7>YM$1a}&vI2H{DZ>=>T`^gjvJHXw6K+-Rd^&)>m@56-qwkGz3CzJRq8BluDG4L{qNHqZAEU&;C-*2CqX`L=h@cb~*@ zZZCz572ccH@$kjPWr+XfAEL@h!qS^GOK3t1n*PggCjWVvhJ|Wn-`Hcdnwp*(ot(Rl YZf}ny5-{MFHN50a zQYM_8GDtvtWgw8R#1~NtNZ+yf=x;{*s7SQ%pqz+d`;Dn-IP(oI6 zU}XZl=B2=NHHiW^UCkhc2~1&jB_O*J#Ac9_R1xyGI}H-d@e+MyD(u6f#bWVPX*-}- zyQ=EE+2{d7wyT6`>rHK3VAuCZ|NUHq8Q{5I+ktMcFO@}C4;LYIYio%t#wnE34N@)U z$++#~aE0DBImbIwxe$x0b!2SIGLPaVNPi{sA*uy@CJ$ literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0008_alter_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0008_alter_exercice_origin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0381e063abbf599c4642c5590ffdaf440f58c69d GIT binary patch literal 762 zcmZ8f&2H2%5VoD4O+r^fRaL3HK`zOP3q2szRZDw7^ioc_SlM_84vDik*%jqluD$UR zyppeo1L6&kP#GtLT`|&({CysKW_Pr!pg6r>XGn-fA5Idy@Oc?BEXuV313geuyP0= zK^L-sE<0K*7SH&Ed8=h9l?f)o_#^Y?)8RyQ$+U_cszFwVH~dV z1~A1&@2!MdT*q@0@PX&tM4V&ZrUqOeaQyN16?ebOUHYzVAgyIB zbCq7eHeKtsf}&4LQ1%3DH1DD7r7F{_9kqSBhtgGEyvJtKd@a*Snl9ZvZi*70^4zxn zztGA0R@=WcL+=hT1cW*6gX=NM=rMJF2M@!3?3-{LF%hdlk5Pk@e`GR#pkx|eAK5AG c-Me|m)f41Q@O)JM1^#Z*`4}FvfF3)404~bhI{*Lx literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0008_remove_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0008_remove_exercice_origin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70bad47a2367d7fa896b2ebe17bc487aa25bd208 GIT binary patch literal 582 zcmZ8fu};G<5Vf7OqyYp2;se;S;EDwXgcuN==m1+5D~(UVC9#9kRxrcL#!oQtLtdE} z_yGpsoKm%Ll23lmcQ1Yyo6XIbV7z`jj|P;GHxE`LL~x3$*~27>q$R0nN+}r-$z%=+ zeg4m3zrMEt-lvPJ*~SzR7KGnnhfzkuujsoy9VUV6$#JF&voA-j!IocIneV)Si;m}0 PI>EO>8vh?R*lzFxF|eSZ literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0009_alter_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0009_alter_exercice_origin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..631dc5f3f5dfbf81ef2c56bd7e75a278bd742283 GIT binary patch literal 679 zcmZuvO>fjN5Vhm%ZW2+15CX&xK+2_FaRLdUB2asx7dYi&c{9_j7spxhQMKoC?Ts_{ z{v}^IRpJ*Qp)$^PwR>Qs8F}8D_{~h*92{hfZ1(%d;wNY9S4j3PrsRmcdr1KpaLa05 z@H#3Y&Q2IaAigsY$XDV@6awPUET7y`Ez2XH)uw87ZyMM6Y25(Yt_;+^C6pYIcXJBJ z3J$D@fLFW_7_TNl0H>=N#4v#=%&r9_*MistQj*Gi`e~~{f+=2LTbdHP;>CPEf339b zu~l1CHLaxOhg(_^fb_#sZ*reC zYrNmz4QrnfJBB}3a@o`qYA!CsOTry?QLRZDw7^ioc_SlM_84vD=u*;R|g39h~I z61)PB;wvYRcmX6-#v8(}u;h`y&ts3j&!hME6N2OG&(Dh=l#p)@><%Bn3C=FXAc&w1 zX=zSdmNV)wYrNdQAi@*=Cn9{Hb@0*41HrDyH298Z$duWnm6a)asa0pgRtspl%hK)b zjtIdC&h8ikkemvVGeIkwd*Ii2qwpZCCs-q@<2tO9`kn|xcNW6@=Gw?gDjSW24F~4c`-73{(s4EQtglv0V`Hs2s(>CW z>owBJMio~@3z*_!@LED6E~oo8;v1fGn{bYKs|Ikr$N9Te(YRcP1S~-bP^E;lr4(#Ej~3XmNFZS>9Xw) zXXx{j{|!!;H^#Nn1ZQ`EAtKE4@BDyKMh~g~JG$HKPeU6I;!?5L_%Nt{_>WA7{z*sK g=7H1a?%paLR!7L$=;`42Gi+|sg&6L$h#q=>09;Ajl>h($ literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0009_remove_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0009_remove_exercice_origin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be1be92e1f154a7c937fc881116f16ed267fa4a3 GIT binary patch literal 588 zcmZ8fu};G<5Vf7OqyYpI10!1&Trq)!5Cej#46tRf()biy5<56)1v9K{`~<(`l?m|& z48S?1YT+cG{GRV#{4O?|n=!!{eY}iEl#n+MRwG1kimTbfB#ERYsc1?mxge6s;EBip z=!886DU;zfNqX;CM-uAdN)sL^j8JsI9rHf4szjj}V-NN%OeLnFU zQvokksWQ#aV8&}}CXlzh0PQ(ynu_2 R=Tkbt7egBVH#gW$@B;>4qQd|H literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0010_alter_exercice_id_code.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0010_alter_exercice_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4201b7103dbb0791824d3f9c1c9df14980fd497 GIT binary patch literal 752 zcmYjP!EV$r5VaF0n*=IVs6zA;a@m9)kdP2+1)?W z`HFrrzhLJ?_=4RL!GJcwH@^sk_lcyz1KuI2XOmXeLpjP$8ymKr0A(&J7u%N@!6~YF zg$77L1t~m1Yg+ig8muUM2%7~&P1wYOi2%Rwo{7c1k2#5muw!iFkK0z*H-=jnDp`Rk zj`BQz&9|6$gRG^t(bi!XQt%2VdpN=FpHpTR0xru*jW~RH%N6K)ys}JBO4)GI@_K^Q z$C!Hz*JTSBb2hk?pu|P`#72Dfb8ZvPF>g|U=ck-sPo;9X4hiT%3(%DWGkDnACTD7d z;e)F(_|6f(yDB$0aQL_e4ag?&^%(Qm+>FrMr0ZS8@%)1fFED#Hf9|rYu7ylVB}<*X zhnuV)x(2E-+t!)}K7tvguCwz^d34>J?4fK`R$p+~tn6jB<;`TfUz_Fm%bb^P{2kF7 zT9^IT!L8B))jUHJ5zl9jEbypDk0|>aJc literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0010_remove_exercice_origin_exercice_original.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0010_remove_exercice_origin_exercice_original.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab6371a8215d54a277d9337ae9937121693563a2 GIT binary patch literal 840 zcmZ8fy>8S%5Z+z?ob5{xq6i{_2e`&IbVvy0lp`q+DM%_eE1!2THf#G>`%Z)w+UpSS zz$CwSWsg&=}TQqhD~ zEMe4OCauIiC&Ci;M#YZb|RFN08_C|wt2TMPIX`0t*1={YVH~3O{_5RKn z(1xQnv+%dIl-h4y?> zsu?6;1+{=WE1*@lDWaz@p=vg8X3}VHE<~>>%lLw`MnRF+&*56TqD`F!Ob5*h{w?PVQTI)MM*R33y>2RqWFd>Rjux>!KWL69H?*J7~M2 z&ZG04Y4d0gMawjMgMCNos)$B*+GzJ4qBwpSbJb6Ba}_snD#O*aGB0w1w>?JT5oXzc zY===s?ccU-zDLyl<^Amco4MK_rVqukXKkS8-hX2_JjZb4Mcu`$ee8~kL3@A>?L8Ux P^OTwnTokvNM~|$(dC2q$ literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0011_alter_exercice_id_code.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0011_alter_exercice_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..051463330085eb47f8ed82c50152a28b0c0028f2 GIT binary patch literal 751 zcmZ`%&2H2%5Vqqan*=IVJs>KcU@z-!#RUnWRv>z!7dYi&dE;s7;QTaBs&b~+-gpUK z$wxT#$Q22dadwyP1xqvXH#44}&(rShWdzTwU*A?gC?P*R*gYYF6BN5ZrHG=2)HJ7c zkO$P`z_2_#BZ{f;mZ%VD6@6uSq=JuR9^K;`G7nr<>#~=FZX4_3x>aE8dEtG#CqZz6 zVqc;Hl2b+UK+%%s48jUCDh6>igQSY9RD~*1@f}mMJBAUNO0Zt)(hu80ST%(k=nGwd zbuX67qot5$fL?5^LMu^VFD}_y+-zgIKgJe5&6%4ixR9e6Z~}QF3^e6%>Ef}`S0kW1 zn`RM>tigqojxID9bv}RM5;56@aG4MoHyXhEQz5QKX?(0l3OZ;MG=&D+2Uyf)r@qPe zK1F9a-zkJKL7Av>We4flR3)c%4>snm{`5MPZdb zFvNY;L(zU1eBG!OEDYcpe5p%l!{KN&9tjV%TY=b=h4Z@7_FpVb$TpOatvS-5US2x| zMp#)xNMoK9A3`R&f)F7W0trh4xE~5}wUj23B2v(RRbWdEt!Fr5_;}g%a<0Lskh=!n zJorWYKAv~!_dWmaYT!m2EiFHT6>q$oL%HA;*mwh$UM!$pXj}1%ZE5vo2l1IKf8f`- zY&74@)$*BM}1svY%L=!Nng_*ql~71ve)i(QY2xZ=F(Q~NX@zt byZUyR_3jf2gzR|j(+NH#(#D@WWS^72(2uPa literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0012_alter_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0012_alter_exercice_origin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc619dd82658ce7ca4a8d7e64ddca7bb65ff48fd GIT binary patch literal 770 zcmZ8fO>fjN5Vf6;O+qW7N>qaWg1sbdPaF^`60`@(URo}>SlM_84vD=u*+RLNYj6As z{*tepIB?~FgvvM}>WSBXI zk6=n!LT3*S508#`(ez;W#BwQkiS^iMVr;05tfad9v^P;*I-Ta8_0_s*Y^)W>E}#d? zdX024bj4NC0=hUGyphm|#eCOBeBe2^3FqjyZUE0aoWEZejq`O#zzUQARZ8d#Lj`Q| z%$0iTUNPQ4oN5EIQZM1!hN3Q1r7aUn8x579xHh_Yamg32&(Ce5SMXQyuf#mU@WK4L z$=>P~vPL$tP}y_1%2r0#Q1)2`%09Wly zXDIdY|5A^-rmJh?W@?7J+d~r(=J|Jiz$l~p)c+mb4fpfV#$%7ESPp`WB0T&@rsE)` iQ}^b9>(afw>32LGAZMc|qx4U4%1IZZxz8fH@BIO(h2Sgz literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0013_tag_user.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0013_tag_user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51c8d646ca2b4380a7b481aeef603283002ea1c4 GIT binary patch literal 788 zcmYjP%Wl*#6t$hlB%zhMD3vJU17?#9WrtAJQA@i(bW>K@Sef_|91>@+lM!VL+kOFG zz(?>S-m>Bska%2YI?Pz|mCwn2_?)=g-%kjx@AT{9kP-63f!*aJIKypH41x&Ske24O zWjUh`v&PH)D%T5^^ww-{+T$k?K?urnc z;Wp1P0LiH!ITKW{isc^ob>L<|SWiR%Q61M|ozxFRC?sfmqWZ^q&5 zU@)Lf{$w_LI^#vtgXZO6`mS|6mx7mgAIyv4Bj{3=VDe+kJ-N@_u)Ncus%QaITnyeyXvFn&-$s1oIkyStm^U;M1& literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0014_remove_exercice_tags_exercice_tags.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0014_remove_exercice_tags_exercice_tags.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c464d43c68b94f6fa69836aa3e391e6b0dfbca09 GIT binary patch literal 706 zcmY*XJCD;q5Z+f3+Ymv+75o4sODKCh3JP>OB*ayB1zhE3<#-0;;78bXB90c?Nc8*y z{?fKI@E1TlW*tJpNb`BVo!NPLyXiDxBzM)P`B%=^mp~3h5jiDwcL;z1uUW%0-iS;TYedEvf>YpB^9Idtmy! zG%JVJM>~&KbmoR8Lu01R8}usRyXh{*%`WpYNt=6(Pa3=h$>>d=}F9=n24JSs8pc&hz%_vJ1HN zC*2bNZt*j-w?Y>IzJJuOx(0P!)m7f=r?}Qj+byu@b%|}bfh%izbbZy9`fPu+zJI{< zJTG2TcRF8I`rq7o|Kl|6@1e0nzh)N@_UZm-v*ncyk7Z2iZWBaINcCHd1Q%TWQYw5C vu6{;8hPaDV`4|>?TXr*;4{I6bADsIsx7HEm^U>q&f=}q3G8byy6i4z8kPE{9 literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/0015_exercice_original.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0015_exercice_original.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42e8430dd52cae71d632d87a40ef53a99f58774c GIT binary patch literal 662 zcmY*Xv5wR*5VhlEHyhna2oRqDiiFMwf)1erA+F*YXh>suGjqWqi9?)S9Tf$%*HY5+ z8T^J@Dt-Y89pfC)E+cv5H*Y-SH?}=I%oy2^x8K%ZIb%Nq*teL#2`zV*95CPwYk9%j zsE9Z_We|b*!ayLe#b;3nh+nfj`9--bk9^jeYS5#xo%4&<0yeG;)V?hUoX~Rj$ssE^ zup$Cp@j_r+C!ql@>LtXGTyj`k3Sv@NQk>Ud{EX*$OXkC{2m3xOaT~;E@`zwOdqk zSdF@J|0AEyq)+W&D%0uaP0sxi@LX@2F&88uTw8UzMITQ-IXBqAS-$eAn&L|NOexCS zG)Vgcr9NzQ6LJFr?6CvvN`r2QNTW}m0lW+~1`*)Fb88#a-4ybf?eX8pzO&&LB~0%3 zC;85{C>zrl-N_fYmHl9AEJs;k7f#@2P$Rn0bd@~ag|-j(kX-BXJ>5p?-pEOT(QBZRkdH_4?e67f}>L_FddkN>1s6MvS+eg(DeDtiR$N$sR@B6ni0 XcekmIPoG@R?J4~|=0cAf(H-#@(Zado literal 0 HcmV?d00001 diff --git a/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc index 8be4812e9fb9f1b3df836a27b63598967a6c158e..72ae908b7588845ed10a91c825f39cdc1cb47cf2 100644 GIT binary patch delta 50 zcmX@ic#e@fpO=@50SGRxY?;Vy!&o@c!%Qr`%t+roH7~U&u_U#$NIxktIXg8kWn!ll E0CFA>G5`Po delta 34 ocmX@dc$kqppO=@50SE%lMo;9nVN9FoVK%XcgE_v;XyOzr0GG}Qh5!Hn diff --git a/backend/api/exercices/models.py b/backend/api/exercices/models.py index 753e28e8..ddac28f1 100644 --- a/backend/api/exercices/models.py +++ b/backend/api/exercices/models.py @@ -5,6 +5,7 @@ import string from django.db.models.fields import CharField, IntegerField, TextField, BooleanField from django.db.models.fields.json import JSONField +from users.models import CustomUser # Create your models here. @@ -34,6 +35,7 @@ class Tag(models.Model): color = CharField(max_length=50, default='') id_code = CharField(max_length=50, unique=True, default=generate_unique_code_tag) + user = models.ForeignKey('users.CustomUser', null=True, on_delete=models.CASCADE) name = CharField(max_length=25, default='') @@ -55,13 +57,20 @@ class Exercice(models.Model): unique=True, max_length=50, default=generate_unique_code_step) exo_model = models.FileField(upload_to=exo_code) consigne = CharField(max_length=100, default='', blank=True) - tags = JSONField(default=list) + tags = models.ManyToManyField(Tag) exemple = JSONField(default=dict) isPdf = BooleanField(default=True) isCsv = BooleanField(default=True) isWeb = BooleanField(default=True) + original = BooleanField(default=True) + origin = models.ForeignKey('self', null=True, on_delete = models.SET_NULL) + + private = BooleanField(default=False) + + author = models.ForeignKey(CustomUser, null=True, on_delete=models.CASCADE) + objects = ExerciceManager() def delete(self, using=None, keep_parents=False): diff --git a/backend/api/exercices/paginations.py b/backend/api/exercices/paginations.py new file mode 100644 index 00000000..da59598a --- /dev/null +++ b/backend/api/exercices/paginations.py @@ -0,0 +1,21 @@ + +from rest_framework import pagination +from rest_framework.response import Response + + +class CustomPagination(pagination.PageNumberPagination): + page_size_query_param='s' + page_query_param='p' + page_size=20 + def get_paginated_response(self, data): + return Response({ + 'links': { + 'next': self.get_next_link(), + 'previous': self.get_previous_link() + }, + 'count': self.page.paginator.count, + 'page_size': self.page.paginator.per_page, + 'pages': self.page.paginator.num_pages, + 'page_number': self.page.number, + 'results': data + }) diff --git a/backend/api/exercices/serializers.py b/backend/api/exercices/serializers.py index 1d5be07c..351b23cd 100644 --- a/backend/api/exercices/serializers.py +++ b/backend/api/exercices/serializers.py @@ -2,6 +2,9 @@ import os import tempfile from django.forms import ValidationError from rest_framework import serializers +from users.models import CustomUser + +from users.serializers import UserSerializer from .models import Exercice, Tag from api.Generateur import Generateur import importlib.util @@ -9,19 +12,38 @@ from .utils import checkExoModelObject class ExerciceSerializer(serializers.ModelSerializer): - exo_model = '' + tags = serializers.SerializerMethodField() + author = serializers.SerializerMethodField() + origin = serializers.SerializerMethodField() class Meta: model = Exercice - fields = ('id', 'name', 'id_code', 'consigne', - 'exemple', 'tags', 'isPdf', 'isCsv', 'isWeb') + fields = ('name', 'id_code', 'consigne', 'author', + 'exemple', 'tags', 'isPdf', 'isCsv', 'isWeb', "private", 'tags', 'origin') + def get_author(self, obj): + + return UserSerializer(obj.author).data + ''' def get_exo_model(self,obj): + pass ''' + + def get_tags(self, obj): + try: + user = CustomUser.objects.filter( + id_code=self.context['user_id'])[0] + + return [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in obj.tags.all() if t.user == user] + except: + return [] + + def get_origin(self,obj): + return obj.origin if obj.origin == None else {'id_code': obj.origin.id_code} class ExerciceCreateSerializer(serializers.ModelSerializer): class Meta: model = Exercice - fields = ('name', 'consigne', 'exo_model') + fields = ('name', 'consigne', 'exo_model', 'private') def validate_exo_model(self, value): @@ -50,37 +72,13 @@ class ExerciceCreateSerializer(serializers.ModelSerializer): exoCategory = checkExoModelObject(result_object) if not exoCategory['isPdf'] and not exoCategory['isCsv'] and not exoCategory['isWeb']: - raise serializers.ValidationError('object invalid', code= 'invalid') - + raise serializers.ValidationError( + 'object invalid', code='invalid') + return { **exoCategory, 'file': value } - - ''' code = value.split(CODE_SEPARATOR) - - - if(len(code) == 1 or code[1] == ""): - raise serializers.ValidationError('This field may not be blank', code="blank") - - if(len(code) == 2 and code[0] == 'python'): - # Generateur(value, 1) - try: - Generateur(value, 1) - except KeyError as e: - if e.args[0] == 'calcul' or e.args[0] == "result": - raise serializers.ValidationError( - f'Verifiez que l\'objet correspond à ce qui ai demandé ({e} manquant)', code="invalid") - if e.args[0] == 'main': - raise serializers.ValidationError( - 'Code non conforme (fonction "main" requise)', code="invalid") - else: - raise serializers.ValidationError( - 'Code non conforme', code="invalid") - except TypeError: - raise serializers.ValidationError('Il y a eu une erreur (vérifiez que la fontion main renvoie l\'objet demandé)') - - return value ''' def create(self, validated_data, **kwargs): exo_model = validated_data.pop('exo_model') diff --git a/backend/api/exercices/urls.py b/backend/api/exercices/urls.py index d7d8b3e3..a4bfe24c 100644 --- a/backend/api/exercices/urls.py +++ b/backend/api/exercices/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from .views import PDF, CSV_Generator, Editor, ExerciceAPI, TagsAPI, Test, ExoModelApi +from .views import PDF, CSV_Generator, Editor, ExerciceAPI, TagsAPI, Test, ExoModelApi, fav, getExoModelFile, getPublicList, getUserExosList urlpatterns = [ @@ -9,5 +9,8 @@ urlpatterns = [ path('test/', Test.as_view()), path('csv/', CSV_Generator.as_view()), path('pdf/', PDF.as_view()), - path('model/', ExoModelApi.as_view()), + path('fav/', fav), + path('model/', getExoModelFile), + path('exercices/public', getPublicList), + path('exercices/user', getUserExosList), ] diff --git a/backend/api/exercices/views.py b/backend/api/exercices/views.py index 5e6e792e..f681b57c 100644 --- a/backend/api/exercices/views.py +++ b/backend/api/exercices/views.py @@ -1,3 +1,9 @@ +from django.db.models import Q +from rest_framework.pagination import PageNumberPagination +from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator +from django.core.files.base import ContentFile +from rest_framework.decorators import api_view, permission_classes import base64 from cmath import inf import csv @@ -16,8 +22,14 @@ from rest_framework import status from django.template.loader import get_template import sympy +from .filters import ExosFilter + +from .paginations import CustomPagination + from .pdfmaker import pdf_settings +from .models import generate_unique_code_step + from .utils import TexError, checkExoModelObject import requests @@ -26,60 +38,97 @@ from api.Generateur import Csv_generator, Generateur from .models import Exercice, Tag from .serializers import ExerciceCreateSerializer, ExerciceSerializer, TagSerializer +from users.serializers import UserSerializer + +from rest_framework import permissions # Create your views here. + + class ExerciceAPI(APIView): + pagination_class = CustomPagination def get(self, request, format=None): - steps = Exercice.objects.all() - code_separ = '<@!code>\r\n' + steps = Exercice.objects.filter(private=False) + userExos = [] + if request.user.is_authenticated: + steps = [s for s in steps if s.author.id != request.user.id] + userExos = request.user.exercice_set.all() + code = request.GET.get('code') - nb_in_page = 24 + if code == 'pdf': + stepsListSorted = [s for s in steps if s.isPdf == True] + userExosListSorted = [s for s in userExos if s.isPdf == True] + elif code == 'web': + stepsListSorted = [s for s in steps if s.isWeb == True] + userExosListSorted = [s for s in userExos if s.isWeb == True] if code == 'all': - return Response({"data": list(map(lambda ex: {**ExerciceSerializer(ex).data, 'exo_model': {'filename': ex.exo_model.name.split('/')[-1], "data": open(ex.exo_model.name, 'r').read()}, "tags": list(map(lambda t: {**TagSerializer(Tag.objects.filter(id_code=t)[0]).data, 'value': Tag.objects.filter(id_code=t)[0].id_code, 'label': Tag.objects.filter(id_code=t)[0].name}, ex.tags))}, steps))}, status=status.HTTP_200_OK) - elif code == "pdf": - return Response({"data": list(map(lambda ex: {**ExerciceSerializer(ex).data, 'exo_model': {'filename': ex.exo_model.name.split('/')[-1], "data": open(ex.exo_model.name, 'r').read()}, "tags": list(map(lambda t: {**TagSerializer(Tag.objects.filter(id_code=t)[0]).data, 'value': Tag.objects.filter(id_code=t)[0].id_code, 'label': Tag.objects.filter(id_code=t)[0].name}, ex.tags))}, list(filter(lambda s:s.isPdf == True, steps))))}, status=status.HTTP_200_OK) - elif code == "web": - return Response({"data": list(map(lambda ex: {**ExerciceSerializer(ex).data, 'exo_model': {'filename': ex.exo_model.name.split('/')[-1], "data": open(ex.exo_model.name, 'r').read()}, "tags": list(map(lambda t: {**TagSerializer(Tag.objects.filter(id_code=t)[0]).data, 'value': Tag.objects.filter(id_code=t)[0].id_code, 'label': Tag.objects.filter(id_code=t)[0].name}, ex.tags))}, list(filter(lambda s:s.isWeb == True, steps))))}, status=status.HTTP_200_OK) - - elif code != 'all' and code != 'pdf' and code != "web": - exo = Exercice.objects.filter(id_code=code)[0] - print(open(exo.exo_model.name, 'r').read()) - return Response({"data": {**ExerciceSerializer(exo).data, 'exo_model': {'filename': exo.exo_model.name.split('/')[-1], "data": open(exo.exo_model.name, 'r').read()}, "tags": list(map(lambda t: {**TagSerializer(Tag.objects.filter(id_code=t)[0]).data, 'value': Tag.objects.filter(id_code=t)[0].id_code, 'label': Tag.objects.filter(id_code=t)[0].name}, exo.tags))}}, status=status.HTTP_200_OK) + stepsListSorted = steps + userExosListSorted = userExos else: - return Response({"data": list(map(lambda ex: {**ExerciceSerializer(ex).data, 'exo_model': {'filename': ex.exo_model.name.split('/')[-1], "data": open(ex.exo_model.name, 'r').read()}, "tags": list(map(lambda t: {**TagSerializer(Tag.objects.filter(id_code=t)[0]).data, 'value': Tag.objects.filter(id_code=t)[0].id_code, 'label': Tag.objects.filter(id_code=t)[0].name}, ex.tags))}, steps))}, status=status.HTTP_200_OK) + stepsListSorted = steps + userExosListSorted = userExos + + if code != 'all' and code != 'pdf' and code != "web": + exo = Exercice.objects.filter(id_code=code)[0] + isUser = False + if request.user == exo.author: + isUser = True + return Response({"data": {**ExerciceSerializer(exo).data, "isUser": isUser, "original": exo.origin.id_code if exo.origin != None else None, "author": UserSerializer(exo.author).data if exo.author != None else None, 'exo_model': { 'filename': exo.exo_model.name.split('/')[-1], "data": open(exo.exo_model.name, 'r').read()}, "tags": [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in [tt for tt in exo.tags.all() if tt.user == request.user]]}}, status=status.HTTP_200_OK) + else: + return Response({"data": { + "userExos": [{**ExerciceSerializer(ex).data,'isUser': True ,"original": ex.origin.id_code if ex.origin != None else None, "author": UserSerializer(ex.author).data if ex.author != None else None, "exo_model": {"filename": ex.exo_model.name.split('/')[-1], "data": open( + ex.exo_model.name, 'r').read()}, "tags": [{**TagSerializer(t).data, 'value': t.id_code, 'label':t.name} for t in ex.tags.all()]} for ex in userExosListSorted], + "publicList": [{**ExerciceSerializer(ex).data,'isUser': False, 'isRegistered': len(request.user.registeredExos.filter(id_code=ex.id_code)) != 0 if request.user.is_authenticated else None, "author": UserSerializer(ex.author).data if ex.author != None else None, "exo_model": {"filename": ex.exo_model.name.split('/')[-1], "data": open( + ex.exo_model.name, 'r').read()}, "original": ex.origin.id_code if ex.origin != None else None, + "tags": [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in [tt for tt in ex.tags.all() if tt.user == request.user]]} for ex in stepsListSorted], + }}, status=status.HTTP_200_OK) def post(self, request, format=None): file = request.FILES['file'] name = request.data.get('name') + private = request.data.get('private') consigne = request.data.get('consigne') create_serializer = ExerciceCreateSerializer( - data={'exo_model': file, "consigne": consigne, "name": name}, context={'request': request}) - + data={'exo_model': file, "consigne": consigne, "name": name, 'private': private}, context={'request': request}) if create_serializer.is_valid(): - print(create_serializer.validated_data['exo_model']) + author = request.user if request.user.is_authenticated else None new_exo = Exercice(consigne=consigne, - exo_model=create_serializer.validated_data['exo_model']['file'], name=name) - new_exo.exemple = [] # Generateur(exo_model, 5) + exo_model=create_serializer.validated_data['exo_model']['file'], name=name, author=author, private=create_serializer.validated_data['private']) + # Generateur(exo_model, 5) + new_exo.isPdf = create_serializer.validated_data['exo_model']['isPdf'] new_exo.isCsv = create_serializer.validated_data['exo_model']['isCsv'] new_exo.isWeb = create_serializer.validated_data['exo_model']['isWeb'] new_exo.save() + new_exo.exemple = { + # f'{"Csv" if new_exo.isCsv == True else ""}{"Web" if new_exo.isWeb == True else ""}', + 'type': 'Csv' if new_exo.isCsv == True else 'Web' if new_exo.isWeb == True else None, + 'data': Generateur(new_exo.exo_model.name, 5, 'csv' if new_exo.isCsv == True else 'web' if new_exo.isWeb == True else None, True) if new_exo.isCsv == True or new_exo.isWeb == True else None + } + new_exo.save() # sleep(2) - return Response({"status": "200", "errors": {}, "data": ExerciceSerializer(new_exo).data}, status=status.HTTP_200_OK) + return Response({"status": "200", "errors": {}, "data": {**ExerciceSerializer(new_exo).data, "author": UserSerializer(new_exo.author).data if new_exo.author != None else None, 'exo_model': {'filename': new_exo.exo_model.name.split('/')[-1], "data": open(new_exo.exo_model.name, 'r').read()}, "tags": [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in new_exo.tags.all()]}}, status=status.HTTP_200_OK) print(create_serializer.errors, 'errs') return Response({"status": "400", "errors": create_serializer.errors}, status=status.HTTP_400_BAD_REQUEST) + @method_decorator(login_required) def put(self, request, format=None): file = request.FILES['file'] name = request.data.get('name') consigne = request.data.get('consigne') - exo_model = request.data.get('exo_model') id_code = request.data.get('id_code') - exo = Exercice.objects.filter(id_code=id_code)[0] + exo = Exercice.objects.filter(id_code=id_code) + if len(exo) == 0: + return Response({'status': "404", "data": {}}, + status=status.HTTP_404_NOT_FOUND) + exo = exo[0] + if request.user != exo.author: + return Response({'status': "401", "data": {}}, + status=status.HTTP_401_UNAUTHORIZED) serializer = ExerciceCreateSerializer( data={'exo_model': file, "consigne": consigne, "name": name}) @@ -89,61 +138,207 @@ class ExerciceAPI(APIView): exo.name = name exo.consigne = consigne exo.exo_model = serializer.validated_data['exo_model']['file'] - exo.exemple =[] + exo.isPdf = serializer.validated_data['exo_model']['isPdf'] exo.isCsv = serializer.validated_data['exo_model']['isCsv'] exo.isWeb = serializer.validated_data['exo_model']['isWeb'] exo.save() + exo.exemple = { + # f'{"Csv" if new_exo.isCsv == True else ""}{"Web" if new_exo.isWeb == True else ""}', + 'type': 'Csv' if exo.isCsv == True else 'Web' if exo.isWeb == True else None, + 'data': Generateur(exo.exo_model.name, 5, 'csv' if exo.isCsv == True else 'web' if exo.isWeb == True else None, True) if exo.isCsv == True or exo.isWeb == True else None + } + exo.save() return Response({"status": "200", "errors": {}, "data": ExerciceSerializer(exo).data}, status=status.HTTP_200_OK) return Response({"status": "400", "errors": serializer.errors}, status=status.HTTP_400_BAD_REQUEST) - + + @method_decorator(login_required) def delete(self, request, format=None): + id_code = request.data.get('id_code') - exo = Exercice.objects.filter(id_code=id_code)[0] + exo = Exercice.objects.filter(id_code=id_code) + if len(exo) == 0: + return Response({'status': "404", "data": {}}, + status=status.HTTP_404_NOT_FOUND) + exo = exo[0] + if request.user != exo.author: + return Response({'status': "401", "data": {}}, + status=status.HTTP_401_UNAUTHORIZED) + exo.delete() - # sleep(2) return Response({'status': "200", "data": id_code}, status=status.HTTP_200_OK) + +@api_view(['GET']) +def getPublicList(request): + ''' paginator = PageNumberPagination() + paginator.page_size = 10 + person_objects = Exercice.objects.all() + result_page = paginator.paginate_queryset(person_objects, request) ''' + #exos = Exercice.objects.all() + #return Response({'data': ExerciceSerializer(exos[8], context={'user_id': request.user.id_code if not request.user.is_anonymous else ''}).data}, status=status.HTTP_200_OK) + + paginator = CustomPagination() + paginator.page_size = 22 + + exos = Exercice.objects.filter(private=False).filter(original=True) + + if not request.user.is_anonymous: + # [ex for ex in exos if ex.author.id != request.user.id] + exos = exos.filter(~Q(author__id=request.user.id)) + + code = request.query_params.get('code') + + if code == 'pdf': + exos = exos.filter(isPdf = True)#[s for s in exos if s.isPdf == True] + elif code == 'web': + exos = exos.filter(isWeb = True)#[s for s in exos if s.isWeb == True] + elif code == 'csv': + exos = exos.filter(isCsv = True)#[s for s in exos if s.isCsv == True] + exos = ExosFilter(request=request.GET, queryset=exos).qs + + + result_page = paginator.paginate_queryset(exos, request) + serializer = ExerciceSerializer(result_page, many=True, context={ + 'user_id': request.user.id_code if not request.user.is_anonymous else ''}) + return paginator.get_paginated_response(serializer.data) + +@api_view(['GET']) +@permission_classes([permissions.IsAuthenticated]) +def getUserExosList(request): + paginator = CustomPagination() + paginator.page_size = 22 + + + exos = request.user.exercice_set.all()# Exercice.objects.filter(private=False).filter(original=True) + code = request.query_params.get('code') + + if code == 'pdf': + exos = exos.filter(isPdf = True)#[s for s in exos if s.isPdf == True] + elif code == 'web': + exos = exos.filter(isWeb = True)#[s for s in exos if s.isWeb == True] + elif code == 'csv': + exos = exos.filter(isCsv = True)#[s for s in exos if s.isCsv == True] + exos = ExosFilter(request=request.GET, queryset=exos).qs + + result_page = paginator.paginate_queryset(exos, request) + serializer = ExerciceSerializer(result_page, many=True, context={ + 'user_id': request.user.id_code if not request.user.is_anonymous else ''}) + return paginator.get_paginated_response(serializer.data) + + + + +@api_view(['GET']) +def getExoModelFile(request): + + + id_code = request.query_params['id_code'] + exo = Exercice.objects.filter(id_code=id_code) + if len(exo) == 0: + return Response({'errors': 'Not found'}, status=status.HTTP_404_NOT_FOUND) + exo = exo[0] + model = exo.exo_model + print(model.name) + with open(model.name, 'r') as f: + + response = HttpResponse(f.read(), content_type='text/x-python') + response['Content-Disposition'] = f'attachment;filename={model.name.split("/")[-1]}' + return response + + + +@api_view(['POST']) +@permission_classes([permissions.IsAuthenticated]) +def fav(request): + code = request.data.get('code') + exo = Exercice.objects.filter(id_code=code) + if len(exo) == 0: + return Response({'data': {'msg': 'Not found'}}, status=status.HTTP_404_NOT_FOUND) + originExo = exo[0] + exo = exo[0] + with open(exo.exo_model.path, 'r') as f: + print(f.name.split('/')[-1]) + exo.pk = None + exo.id = None + exo.id_code = generate_unique_code_step() + exo.author = request.user + exo.original = False + exo.origin = Exercice.objects.filter(id_code=code)[0] + exo.exo_model.save(f.name.split('/')[-1], ContentFile(f.read())) + exo._state.adding = True + exo.save() + + + return Response({'data': {'isRegistered': False}}, status=status.HTTP_200_OK) + + class TagsAPI(APIView): + @method_decorator(login_required) def get(self, request, format=None): - tags = Tag.objects.all() + tags = request.user.tag_set.all() return Response({"data": list(map(lambda tag: {**TagSerializer(tag).data, 'label': tag.name, "value": tag.id_code}, tags))}, status=status.HTTP_200_OK) + @method_decorator(login_required) def post(self, request, format=None): options = request.data.get('tags') - step = request.data.get('step') - step = Exercice.objects.filter(id_code=step)[0] + id_code = request.data.get('step') + exo = Exercice.objects.filter(id_code=id_code) + if len(exo) == 0: + return Response({'status': "404", "data": {}}, + status=status.HTTP_404_NOT_FOUND) + exo = exo[0] + ''' if request.user != exo.author: + return Response({'status': "401", "data": {}}, + status=status.HTTP_401_UNAUTHORIZED) ''' tagsList = [] + for o in options: # print(o) if o['value'].startswith('new_opt'): - newTag = Tag(name=o['label'], color=o['color']) + newTag = Tag(name=o['label'], color=o['color'], user = request.user) newTag.save() - oldTags = step.tags - step.tags = [*oldTags, newTag.id_code] - step.save() + exo.tags.add(newTag) + exo.save() tagsList.append( {'name': o['label'], 'color': o['color'], 'id_code': newTag.id_code}) else: tagId = o['value'] - tag = Tag.objects.filter(id_code=tagId)[0] - oldTags = step.tags - step.tags = [*oldTags, tag.id_code] - step.save() + tag = request.user.tag_set.filter(id_code=tagId) + if len(tag) == 0: + return Response({'errors': ''}, status=status.HTTP_400_BAD_REQUEST) + tag= tag[0] + exo.tags.add(tag) + exo.save() tagsList.append( {'name': o['label'], 'color': o['color'], 'id_code': tag.id_code}) - return Response({'tags': tagsList}, status=status.HTTP_200_OK) + return Response({'id_code': exo.id_code, 'tags': [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in exo.tags.all() if t.user == request.user]}, status=status.HTTP_200_OK) + @method_decorator(login_required) def delete(self, request, format=None): - tag = request.data.get('tag') - step = Exercice.objects.filter(id_code=request.data.get('step'))[0] - step.tags = list(filter(lambda t: t != tag, step.tags)) - step.save() - tagObj = Tag.objects.filter(id_code=tag)[0] - return Response({"data": {"name": tagObj.name}}, status=status.HTTP_200_OK) + tagId = request.data.get('tag') + id_code = request.data.get('step') + exo = Exercice.objects.filter(id_code=id_code) + if len(exo) == 0: + return Response({'status': "404", "data": {}}, + status=status.HTTP_404_NOT_FOUND) + tag = request.user.tag_set.filter(id_code=tagId) + if len(tag) == 0: + return Response({'errors': ''}, status=status.HTTP_400_BAD_REQUEST) + tag = tag[0] + exo = exo[0] + if request.user != exo.author: + if tag.user != request.user: + return Response({'status': "401", "data": {}}, + status=status.HTTP_401_UNAUTHORIZED) + + + exo.tags.remove(tag) + exo.save() + return Response({'id_code': exo.id_code,'name': tag.name, 'tagId': tag.id_code,'tags': [{**TagSerializer(t).data, 'value': t.id_code, 'label': t.name} for t in exo.tags.all() if t.user == request.user]}, status=status.HTTP_200_OK) class Editor(APIView): @@ -170,8 +365,7 @@ class CSV_Generator(APIView): ex = Exercice.objects.filter(id_code=code)[0] if ex.isCsv == False: return Response({'error': "Bah non en fait"}, status=status.HTTP_401_UNAUTHORIZED) - - + model = ex.exo_model.name consigne = ex.consigne @@ -296,7 +490,7 @@ class Test(APIView): class ExoModelApi(APIView): def get(self, request, format=None): - code = request.GET.get('code') + code = request.GET.get('id_code') exo = Exercice.objects.filter(id_code=code)[0] print(exo.exo_model.name) model = open(exo.exo_model.name, 'rb') diff --git a/backend/api/room/__pycache__/__init__.cpython-310.pyc b/backend/api/room/__pycache__/__init__.cpython-310.pyc index 315af0c24594bf38b736647d3eca0595bf2a9bf1..4f2d88d244a5be3333ce6a17600c0d92a337ecc6 100644 GIT binary patch delta 50 zcmdnYxQ~%LpO=@50SGRxY?;Vy!pF diff --git a/backend/api/room/__pycache__/admin.cpython-310.pyc b/backend/api/room/__pycache__/admin.cpython-310.pyc index 2b3d62c94d7fef3a74b2a5bcc7fde91d5f97d35e..afdfddab9f2ea4c7e466d4e8a85344f806e6d9d1 100644 GIT binary patch delta 51 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 literal 8875 zcmbtaU5p!76`ngYwr9QGzwBnSyZPI0lQd3~-Ly^96hdg!HvOSBAxQ~!DaPwNNxbpe z?w#4BF%Goa2+{{6-bp1#0>L7IDj^|(gb<2&00|)^9?-mkgo==my5a#O2;Vs~W6$_! z3E>4 z^SYq6Q88A{yvc2|l2}dVlV~SovXWZ0@|MtE&}2$lw=`+l=DLv|lH$CU9r_RywOm$s ziM6$|Jch>fY3D|@bkSaRYNe~T`)sZ1tgYIL-pHa`TrN6xfiMbgtx%-KhXN$<+B{dQ zt(J&h^k?AV8C=d^0BkKUq?XsEkoqkxZ%9L$xSJ#=?g?MQd{Pd{G@es(SY~jywom`G`D-`wp3vhj5>fkIKWi&&nfm5%)Q{ zB#+|0Q$7aWKJH~mBcTFIq^9sk?G&zixSa0-yepd83M@MdtKu?dwWd~pt^jq{aLskh z5$%LDsfYWM3{#E$O|50!)n0-Zyh!*%ZdxYRg+RMC9QN~5#vN&m$|N{J(|7c{;;!&V z3GE_ApVtKcVZ0TLAM1>NoiVaQId5o9RSK%M=GtEJ>h+?!?06}KnHI|OOnwOSt=c8m zmR_plH?z8Dx;N^!XO${tyXw9qy=19Ub8ML%_YzL2R<{)efS0^pEW5Vy498VUM~@nz z?qR>XP^wAWGuIqoSeI=VBGgtrlVPH+%2n4(7E2|&?s}$USEXmJIJK&mkZY@T$4fBB z4Y;XeS1xU6Y7a>Ne6%ewWYeMtw8*x%XZaPMb}go12D#F_@ zpyQ%K1jcg(1c&^y|ipm%bnnLuh9k#lnAokU2JbW9kL z*#vma6zMCD%QG_MF1Gb^fpvlPo`_mn&a%EWlHc9#PE#@o`C$%PYsc+KDhT*b+!n0M z-6U(kdryxx4Y`+jUy1SFnxZb}%WeL&V8Lq)`4H&nDwNxwL(F$?3-;HAs87Pf@1u9- zYvPhXvQFNzd~cQe;Ncd}WL5?hUz+B?*v zy^daj79x9&bj5t%^rgf6sTXnvy?(5=V==DvDm2$$$H)nmeDox&LAr)d?hLb5B@6mD_(fw_Wz4ft} zz74f{8+e6D*186teSDDCBf2)!jy}3ZFYNn-pLa;7os5B*Mm)Vb4!mO>JiP77Y!9US zCrNUQ+{(`fX!L*5{BhzYpNf|$f%Z?Z_J0!de18@6S2nG+t2d)Dy{8cmU8_QmbbWA$ zFJ0M>?JC-%jK$PR?DTUJ@p+e;OB8|S^!P1?apf(dQL6inadAUBcjeN zAMC{o&pKHtt}e^ssRJ~Yh*(%}(^QtdTq{>mXqqe# z*OTfnVOwR1Qnc*eXrxzwvS?q!;~7ueNcfmcGQo_!WUX2O6-B)A6Ml_(w!_F9_Pe+s z-SDT*O#A`clzjBa5Hc)YCMkO?5*=*tA{bbs9hRq8rP;7Nc$URyTC5MKVq#dnGgz2g!2OfakG z$+7c8ZPcyjMV6wiOh>2vruJ3Bcz~&WGDZnIZ|tUMU)43g_Xv&V*T^7j=F8RjqFgOk z+fQUFCqLYtf-Uo-?FXJ;HkdgDOx{>7R=qKRsLy71t699HL|BxLqKx2;)7~s<#)x7>4Br6c?`nboxvn=NK{UuSa@k8>DpzO&I^xrjWv5hB zQXM1I$-pV1G`%qzA7PRmQo9Lx$hF^g3$#$=N88N;?MHoI`UFWpDaM~E4t=oAjnH9J zLjBJW3dcCF4Tveu{KUig6@dOu8v9C1r1eqUr*(e1zo2If>@l(DOpAH^9Tp4vj4_4X zr-fbTf;bBN4DUy0#JGM~Pa7HB7X;l$#f(lnRQpJb4~soUNGU1iK;ME4mOcaSgtLG@lE{}~T;HP~6z1Q%cEQ0! zW4mCo7`X!-nrxl`phJ_E=86{9{w9u;P{j*AIuTU;p`Ad@oy6X%tA5)^<-8SOiH z%)$sh4myNJY-ZYu;m=MQ@qIB@BxX(>#|U5Yr_jP$7nhu4NWD%-oB=y&kOqDSm*b0j zP&8&@;zriB9(hAcsMm<_X9;|cKp#GcZeG@cNc$e4eIB4O*N>YYjy?QB{cKV;is>g} zd1?01P$H+6h$Y7x1yi_2w>t((&I7-XA%Q^;bsMykwt55(&-XT|kn0r~#*Cf71;)%% zvZj<$s;w!$^zaD7UDGC z{)jNX2+-IS6QFB#>sizd40#rpGY#NsD`JICq6{g%&OW$eqQEzBn(kMBR25|tinNIm zcA1V99hJkAACSBT?4rl6s3ZLguwBFbqld*es9W3M&X!Ht+^6nB|AWM*7>N0_j zQ2pc~IzPqbPy(LP8{2#2Q7E)aq@3_aZSwz^vRbUHCLi%g{cZx=DI<60LQIlZFo@NI z`kvFR0Z;Yxvg}q8A^x0@uK;wJv1{e;@gd4~B-tjF8Kj|5vb!jLH$*Nb(Px0e5(NuD zq!#WZQbPI#Q6v?O>s|766$u07QCEpq1t2B?Cof93$N{7iRVL8oG%uj);gv`+gixcZ*+aLk$eV-FNs)rrp208#Py@PBK$)LD%A zU0aBF8thYO_86_5qW=XVl%nb55zgG7M+={gaLSHWOOKwRtr#tQJX)a>_GIi-%xK{Z z7@veFJh^_tDjGjG1BRq=2|f`XfJX}$a8PkUjxV8Qu^cxc#}GY*-vRi9J5G`KThi*` zYDyj%ocKqiCSKu{P3O)u#yghtcWwS^e~MJR2yj8w01?6&>fvSL2wK^+Ux2g!D0=lG zflm{lh*K{U_!I%&jgX%QQJ7Ej7bQNc=nlrWfcAS_yiVZj4^`D%^-k&A1XbYHKf4OU zj`%&M4(kY2B<3jhSWd28czOeifrw80n)8n!pd>)olG0&5pf>FmA-}!7QH(}aMCSvA z>g=w4UVm!K6km!v47jNN&srh-`i6C=HAn#VgFm;K#>?|gs_Nkv2HfU6#&&9=GPW7t z7Tp^R&fx<^@U~&oTB+F8%XYia`zuLg12p!=5>hYbK*`iKqCu<2V9vB(wcQTekJ@bG z+V4X9zj%(=vdjkpT$KK;%`sm5$B=T_U7l4a(4L-7{R)NEnp~?;J5wmUwN|Y7Z~R1i zfhfK~;5dOd2`mvP5ja8MGyz)m6)iQ23K~TPgyO}WmQF>H?MD`+Wumxz2y~V}Zt=kw1qywrb)EyTG)q{M+E*;gGCF^{kro3lY`1}#VeEuuWDG?Vk)>vF z!?$nzj|LxHI#oXG0S<7WiZd7BO64$BoH)6Pn>hg~^Zh+~jASWx3aRFw zo}TWWp8xs%|AbRhj)LD`<6o}*<`G5t2VG=;Ixddjh&}<~3TM93R4NLiw(7H{T2W2XRbSD9zFAX0X+-d zF$?I~%lDyYU$_j@ z$D8Y3yc}M@4d+-pio@pHktb@jSnsEzVd6N3&?>Y93k zZL`>Dm<_ALxN(i`*f$hzo>RqvoYG+{%7(UUE#IQ0Rucu=W9LAuIg5z+!n>t5gqaIh_^ zu@}X7532`%PEiwM8WMQQv+d4-k2f z2)%ep9!4v9XzUJK-4$r=?U7wF^}pg#^#7l`oL=>stz)4OV0S$X?q{##xmm*+U!<3k zLnO1G|Zaw%JQmGkOq4%@U zAT>CKBl-!*ICb92$7(}^io?#jDsH@^1dgu6`sTw7O2?ERK&e-h3kV7gW5?_mHyBjW zK-e%EHjW%AF4v&8Ce)TS94IdCNY!-k`6`WGvN9HHpOX8dg zxOee{5TQu&Z3MWU3aqrtdF>vY z*Cgjz!=g~Vt#|a}%DeO12FYOCjGdVMOgY1(Q?gU{(lM&Jj*&`WPgWsJCQweQeO@*xFf>+vkJ0BIzb?{*&J6+wza zdOQwQ5dHwL*9F2jpZTtO|H9-M*f70i5g=Jp%LhZ zL?Z_}nm9m?n{=g*Sd0wzK#Z05b*=#Qp8{&JcFfpn*m17maGU2OYJr=PsKv?5Wa5>L zQyb3#wdfs9<_vG~e832RUDvj)E_$(K2!PIZLx2UhGkq_OBlIE>f_Q>jlI@e=K}aJA z9&A04bu;A5FSvE&6?ZG!SUvkZ&lJ69em=aDv7bqAbD_7gkgh7%$1PXGD_z}?;*mX1QoPl&k?~8!*i5j}Gop~(m-k0pjx$*PJxq@r5MuVe zF-#o{9b#&ap^~X2^D#`-IvO$@Jp&~GGZ29^{Is$m1t9UG9Ceoz`j7c3?TAtxl7geE%)Vo* zqv}1_)mTX!!}Qx^zmp{a_UVAsD!ge{20&xGSwOuiCMy`Qu?H%(N8c}A;B?L_{Kx8np%tkSz&KAIA*}7SSAt4JERR z_OxAeigwAi?0mr%G=ioN{YaIM;D~+>(kn`MsG?C};u@~^S?a11l&IX)U{}c*@^cIMxdk|9Ue~TtamtSKmz3>XTtJ41xd49e zW38!e2SCo+uW%bjZcgc5Is26dm5y`H5S30205897^TN(_Jkuz~vrtx4%Lyc2WpGm1 z?Z>RHTv2XmF6&`KSXN@{!-M;>wELuA6;>uo!5 z?`u~#d%NncRYHj_4WyjdrBWoWv_^@yt5wE=Weo)A8)=hzOIQfFH=g5rHa5ZpnPeZl- zfFngFPmO5fVn0pJhR3vaHx?C3Ky;DT8$4cO*G=jhe(WE6kIiCLS(>TnK^S|9ao+XY z-Yv48#E8S#^-qq}3(G28X~2)h5`O{_=-$OJN^DH5(?=5VK0V_-kk$L%?g^SQCRP0# z^%H)(Yb7#I30$bg+N*p}8Fje&A(P-T%hV5Kh#?7lf+He#Q3R|>H%*A5JePqVvP|(h zdeb`93)JeDzr<0xB%hkrwkQ!yGraFALfHfA_7m#77pFW^3!kgQg!?yNMRQ%<#J{r{s!;M7?l#Tt4c1=N);)S4| zyW&D09gv~);sWCJJg+UehfQM)+{Itth^WEUwErNo}<-Makp-3+R zA~L~#lv+|9Th!|7ZsME_g;!q>Uh_6(&`hjjM^}y=J$@q9YC)qTkfd-bh&`0&(nxR6 z=T4F2yo)HC($_-q0gWW~P7dGnet*Xy6N*9jE}+uV3*HFbG-|Sl2;OBykrw#EX43->Bxk?OOE<0mc)n`k^p^seM4`q^pkI^cUchX-Dh;$e9jDO;g zX-)5?oICQ_0AS=ql7iQC>;7UZ1n$|CNUmbFHoc22Hx`61QsbYep*h}ggY|Hcuccs3 zZ*9g~iP4Vhek7z9DWvEx{qUK3oP)H66fx~JvAWnrqN&6$#djZ8P_hgy4~%4;w&%;Nk}KehLErh!z8nWB*Y1^DL^bj?x(TUR!i+Cc|2p} z1LagP2{px1T&T*yld2qCRB@o-&XM9Dph{OxbDkSZ4ZrWH)!lA)lL>I3UHbIt?eBZP zZ+niXrfdnnzdZKijdvfCq`%U~@K3|X1w6^0L72qkQ0hpIBonWMaz}9#!Kb1~t47~Nw>{yP~tE)H_W-v3fJ5{HOGK*E-mYf>1SrzXoR%26m*I$-coi*N; zSi`s4jYHL$M#(grLCFkCW>7MVl36x~lDS@+Ih4$^1(YoG+RUS5k)1)wnO?~P)7GTs z19z|=sVV0c^HM(zI{vYoo6NuJ?S?6e^-j$Ea21>(xa5vpv^O^WbT!^o;*GZ7O406W5T-uQ^;WzarN>HcgnqP{Zsi(HaxC#jF#X@wSGMAg zzY+#v;6*E!{A(*+9@79Tn||bT$ZVIpsh^~na^>ZI(aMI`+V&&nUVCoE>joP zT<+e;m&(rWZWQe7`eI)$HL79Kqz z=7`J_SpdncH$9HM@`RtEvImGP5qXdZ?Y1Bv1D8KCc7@&E2sFUmkyXmdKlr04|1Vcr zU-vuRi!tYraS%uMv)1v_Y+;PESPy@U$m63c!?#3uy?`e<2jWYP%p^x)GE<;c&GW@d_B z6~Ov%hl&9qEs_Ivt)wTb%o<;?m8=5v)yKC*Aaf@KyqP+jE>tWD@v zixjN<5l?bj!*kaHfdvS?5Bpv%$Rc%hZ`hv84THhXl3k zG3EkPY0wI~UX(7M3*(j-Cg;HvJ=ZyD1g{dA0-3lr{v>L#CjKxr6=-huIq^xj=Ffn9 zmY7e0GN!w^g6?=GRIKCWHPKy7)AlA(l8R30Hnfj>cRwSJ;V8Q&v5E6 zoaT{{nr$nsv~3Esgy972gyFP@ddd9K&gGqFVK{YGeGeuXCR2mSG=#|ngpaDiWEucq z?ZW`LhCKte*2W_2qs;k@a?X!tWQVXjX*b_0 zM{X(u3)`%X!!dszZF95OWHQlwo(A$4Xbu77OT-CdX_K)mhAPC}SE<}4J6Tk{hW5#0 zAf<`y8A@efC~d6{WWz`n7en?Dz|sgm{fOiKAIu>Qvv2dXk!jSgiC*qC(yBK#ALDGt&2=VS|9ls*Nfw7uC1_Tpl4$GO> zkB5)8?@Ywe9vk9loeG5}MW!X3g>W0x)Ty3|L&PqHyRcb*8$R0J?RyIN2IU^In0prV zYhLgM_)*;&bpJnq0coLiKQQ25Bgyt-iiro1mItu^#IQk`c<$@}n{(eQr{%8@_bQPQ zRW*BS=u+L+LH6gytZ)^9tL2JN)pc{*b&<>NhCcY3i^$juDTsAl{zV#v96G;Dq5aCaNJdH;ry_RIj)-?X+EVEV>buHAL_>r}}fF~iDmPwnBs|8BjZpn^b z@V>#+TZ&`i%kq&Mp~fEKtKe&t+M#?(l-EU@2KZ^@R@8n*@CYiv&-!zRk~7bQf#8dn z`VOfC(jL3xU3ZJCgJXpY|4U2cn7ar)!YIA`LU;hTRd6NiPxx8|5 z%i~u9KV(R%C?TMPpHGXbSJ&QH6;)iA;l9tyr!L|CVI6liMMt~EeH1X)OLL6{tyClw zdF`b*4t*~Yjhw0O?nW52T<#~h;mJ)zk=M{k$ht_j2L~iLaZ0q|3{Nr-Vo5c*F4qQs zimeEdoH{Ftp)Zu(%Cj0I*w8X9Z@k$HV9Vs0q*wmPaZvg}!c6{zTy%^V&{73Shtf|v zw6=&45A=RH#f4U;wKYmW4n@lS4yDvaY8)c5PLX0zDej-zXk{J1F*9QcQ6nB}Ug~{S zmZXP}EN|=la%M&{vkwebJ*uR3yPDS8;=+#N%6DXn8Qbdnavzb%S=0} zivVXjGXmW3H5dL9^GZ1gRI0L@_`L8?1Bg=M`!hU+hka%QRm=UH=(Lla>|V!N_aD+6 zC#U^oIjy5baq8##H80%t?~tzKdK#x*cxB`oqp847MeM~?#H~#w*Zk{ol3VB)&_yi2 zN<)$(UBB%hjD4iL{Esh=lA+nI+Th&dE$!q^M1KC`%MJfdu{=>P=ccEj1fM zL8CBKFQL3hI)%xy@R_Tyl=)1u+rm|Cf+LJrAg=i)-C7nwr(HxQQRB7_};H1kS-B4;WN8EkEtAJaiL)naQR+7awm5azMM+FrC7FSCsz4$`_e(*0cDO@lDuWHE|B zNSq}tDmQy!f(Tf0{dM~HlsLuWAkI=3A%igs&#iMs+)hSvG_70efQM7)S|?a)Y2mTq{QUx)V!3* H?-t*B4=jG*M0D_AvTQ+iQGBL(YHf1ssi!U?McTderElMm&EiKYdN=(j9%}beF H#?%7ISqf`55IfqzrUzy|AjA;e->U&;t4M5n&xSq z-qE^xUDp{mI!4#5n-VuWR@bUq61O^b-A2CMak`m$CQWneF4CM%wwtTxBrVg)cMJ7G znqRCJk?(d&-MRXlq-8th?tFb-;Rc-|{?D&2kcech${Qg?rSzoZpA2fEAk zc=F$(D_XFk@_PNU+g^E zeXRZ%;(4#qdA$4C`e$|RYnr#uTY5+Hmi+nKX1(T{-u^54ZQVQIEx)7P*6UAcQ=E&m4N zUNiK=R@Yy}%aZc1w1UuAjg8)VbM0#5a$j|uA#&`Ejh1%;5l8tw&sVJZq93gHdx4L5 z=F|)4Uk1VZC=i6ra3lC37FDa6vGroV-;LcDnrf}Tp@O({(eJLG?knZ5h3t(HmssM0 zuUgGcYtvWp!m#W(jV)a8gS7j(ulYS+q1zkMjk7m>wboi=Hx`ERsjBl={IIe1R`M z+1vTB&@P6h_8j|s7i9)cSPtiJgWU$Uw3&&V$YwiH#&ac}-LkIeUhb|rZZ%x+@@NSq zBgZRjnJqnBY*)PET?6ATt;SZb+4XCtI)u^1)>_~5V|T67@_XTVuVy64cK-&J6GdBV zS7Ysm4vK<}^s5(ZmU;*;>L`Q542~d3sYz;FZua`UTiyOf@GZZ42@D=v;O8dzF4OWF zY)|SWwW*G3`_!ZOiA}6_Y;6Q+xZDaF&5iIabgH!muJTloC0u5*`|2^g3Ypjnn%Dg} z&zxaRpNFn!#GD)!0~H2d6dzKQ@t}I8ep) zS9!LV|N6y?FEpNd^2x^Y->A80%I{o`Gs?fV;Rj*tB$Aj;qyjrl42-jMUsHbtKOgX*GMt&-mAmud99=!gl=1NNO4(NTOrM$AZ+j{?x?V@kmsVd)Ec?tyE#x~rG<0^Uoy^&n>)L*8M1vyk%s3M=m5 z|15}5CW4otFH#;A{`a)^jLm!q8E8WSJmaqJnafCfMe8kET4>*b66JsBQ2sn;%Lp@V zm%Qv~uWA>x8$)U?c-y*Tw6g;nVQxErPXn(PhVk1pIN3o4Z5P`m^?W!dv2vSr=GiV3 zv3b=*2}*eW9WAoYKuWIb%8N3AhxQ9zF>QZ=?Oy=B_q2%h7d>}byK1PuS9(vwd*wYH z<>$O|OAGhiF>dSarT6tanpZ-ZpF;lro_N(*@c(^1;bbc2Ki!Am)W+II&#wl}PRFl?s=sml zgZqALop|!ZiTg%u`$|Dgi`-Figx}7svG(xKK!jHO0-g^m2(D<6_J%XiBPhvb?K{Rb zssTOWRB|WC8Y@r6`nvFH5_}oyaqig;?9N)hyZ+o+5+mh`w)xPIcOb1R&vyE2%}($f zBEzy9l+@LJuL}9?t5)#A{knPL$uC?K8CO4s%pLuuz%Akl&LNQgJ~ZqvdaW;WI)O#F zYUI`MRj8h{oBGa;n*5O%^--UZ(|(Co@aY z#|(*z`zqr1&Dd^w-BwS19d9y(@iZyU&A0FboS$aOk zB?l-j_w+cP+c}OQQw2*XE#t@x^bli!#OTSS3pKPbPkL18iqn_0u}4Eo#3Pv-%@zPo z5Es^)3JSlq-t2`z?BY!TO6_25e(mf<^*E`CA;|PEQGY_6Uv70!HO`#}0=jut#AB?# z7es$Ucp9tEUu>Lv{-xD3>Jbw8Jc8JSkj3^o%t4sUYfVx+elK>ZU>kuSig?ERQaWE~ zytI1irHfyG{>Ah4vuBc76`m-QsEqiVq``4W&xHg*O3hVYVwtBI{3wHw@l@m!JX3iHt2D61@llq$(uvWGpp?dXV^qHiIx|w=6a5xi%g=`)UzO>sFjjA zsWK*(KAR+r7E-;ytRF`ZJD%V1v6Q3LQ!;P%uJguT&hpjkNP8YnKnevIKo`%ZAX&h? zm4y7%z-jGSSO)%gXN+As34~#mrw!~0!)LH_qmbbgV{@`WWwwLtm*A6 z%+rrTa1is{XSH4>P1V#l!dz&1SuY1eCb`SnZ5X0q$;fW!QKEqT$xI1Q{I_0VTR>x2 zhG{H%B>|3RWJ--WsbRMlNbkC)?)+s+2iMSB)cu|gGh2qipWiaSqepgQVY4zE$Fhc8 z^e-*3uw|h{Izr4&IhmK~5?4kgUIqQ_#gv&Ay$Z{vhO#m;l(D%E)hnoT%vUF|Y@3YMcp@y=H6? zX(Vdd>^9fc3Tq!{@FW9jNJR}PYE^xXF;OJWu8KrPv5Pi=UEq4Xgz5oxQ~{dS(hZ#& zcL^FdXBMDo4T0H5%>-T_NMZJY2d-%#&(L#!ZrBSFTlfnHI+|(azi`b1#%6J-jisIY z`f4o`yNw1nH;qP|Yc#rjZ==I_q0zXu(d;BS>KP75^yll0br^_k9S5>rm0JhX(Rr@0v$-vegFPzw1|qURuikI9OEf&eonN(gwDG0fw8 zNsJq-p_+oVxvOIqtq5A&vjGkt4Pj@z4Cc~lV+Lt_IlEW|BXmRaUH!5y_QZ{_$)fJZ z>R`*3);=S(p=nVYZV{<%vbI+M1xqMspiqSMa3f3V(*a?p^*yOynrhva)@|g>wV>7C z$7;9pcXY43WpML@mI_HrwfWUJKf*^XFU}J3h+iNstR+sU#7i*J!RjPt>Z8RMnnBg` ztHZk0PQN3ZFg3$e_T=nEJRcSiBr5a{_6`>`br}hXxKNj2_Z5y3L~7o|>(Aj4En3hv zKZ8xq*fDm#ce%e)ga0XY$jfkdRC|wq@O^CK(Zis+(PKx4U^ce=oBd$Vj;b3VG432) zEpUIS4W^1*k2?2{m~;!lN7>bWSiKAu_l7bOFpmSO72^V26zWz3U1)X#RbtKvY9)d& zW`A9Ko^*tdWM04l`0T_hH*bozlDMa%aaPbrfglJj< z7vUGA$Ae(+U5Xd|k?yUsa;ewj5}nQrjrsBP*!##OM1v?FrkL9W$^6VCRos!MVYbF z+n}#BHgEWsYK~e2EmdJKlG->66+%?tcf{jJCE-t){*j9KZFYtd?`jT&37F#nu*-v~ zj%Sd~M>_roh$LEa8y3hj?-}@oH|3r|FU+cIxNRgI_RN`&lhA zx9ubq4sE#mwoJBm?FsBbm;iegG#k$~1dH6+Sn(v(`2`v6K9Mq`$UlRA2i@e`C{lqdGN(G&EE} zGKE~KNW-+jPukBS2HU88)LL{|N*)-ljd- ztbOX~np#pW=SZ9n<3-$Dxz`~F1A{KR7EsOmsk00A`Dal?*6qHTc-71ntnqup)CpyC z7HR(pPe9w^KrYJ!`P*uOkWOTuWaUlfDYphPT%P8^QoUrk4{} zw1pjf;sLg0Wu{0HHnD%g(bXZz!n7-v3SvaWQr|(bq=&44ZQ(fK?=XuDeLwX%Vs>Vo z%;I(Y&nS~lOa-p1&EubDVkSJ!!b)gbCW_oE3CZmL!(k_87DL+1A(M+ydcX&0P`dmm zQZenE@p?9u5uA)2l3i1>^`dqiYvx_?lx!SCOo(#E{zdf)Ums&Yghj2M9F+#@DieP$ zNrX9&<5czcm^jBkwzBh#v4_c~wmiG36~e2`mk!XisAMC<;i!Lrpgu<^`pQ`N)!#>I zZ1@n)5a+N?;7`=dhNUngJ2TvA0PxGS=LBZuydnTt(#z|h#8?@< z%Cx0lLf0JRk&{c?csI%i?@Bw|gXQ4&OL}N}a|Cfww!QEkj;sJN%ijDu?g0M5a4{;T zu&xBiwg|0IBA^@0c@=q^leaQ%Jut5jvfE1n1NYz72KxX5_qCTXrh^>o&uhP6 zc!whR33$jJ{0X2VX04aZOuBlKcgQ;onicN|>Erk4vKAh`4V1tZy@$3euexR5HsGMn zdJm%~i{7!+>u@BQr`l&$MYk`k5)#=fUhwQ=ULj-uDPLI^k5~iD604(S8+F2}On5Xan3kCV7o^V1VPy zfq|Vla2de=SFn{~NpcIW7Jx4$XH*)VWZ_;bG(1R(%&UpBH>?ddFt9G1)AxYdyc`Zs zG3z)c)p=`&o&(_<8wk;A;k@pB@JeL2^!EXhfZrC8hB!P!@Cm(7uvA=~8qyG9En+ku za$`2!$|vV#@Ycd_IkLejLJ9a~O#rzGW&b8paVII+(U-N&6CX3p)QPPt{?2(%&N6n` z;K>fEe~O0G`wRrcrM=OcGkwARCr$k`79#)xGD=x%*O7}Qrj;6EOSmxD1h5BnFn*}J zlNP3-Bd$>;Cz3gtldJx%&ADMytseezxv3Uu`{@zjTn8^B5IFJpK!-C2i*pAdkB$D>A`uz(upZOi+o%Y(}D#=9L>-x4|4hv>^YCX3J*4){>v@*@DLm4 zs$#o;oPBr+0q%`(E8&Sf#s=*dkybAaXSClt3!7RO_Z1k(`zGkrbFj1NXzInZq;x+> zDzaemuISYPfcYi1M#}1!8PL|^;!47lHU~+Z2M;oKbUfd)i~<}cmGsRuX<-W(I3X}? z?E#}~%xr9@)k;cw2O|tIusVhIuo8kD$X{5e)9jS#-<&=D5G02ScR&M7-Y|8BO^%>*;@3O6 z6G;z892^|Bn@!ub*zT~+2}%2xd$fXkhni|4b82i9uVEX*S^fTyLOQE^ZX6yW$#W>p zy<6B1n;nrBy2CH34O~RBc~?+@f&K|eQu*WNRzLLX8M(&QXw(l|Sn7n{HquO7-_5Padk#w_OJ;z`dt6$ntzK@+e{{ zh88NdqX}rG)|$Y=B=KpSlRw6C0)oegT5$BYnIU>a!1Fb}{uG1P84xe3{RraR6ghe?&;3ThEB z{tRgUS3JR+2nfb;{|o;D$^pg+vjNW~mUvfpf^$Off>ElJ%o2ckNp}Fop-BGRu@6Aa zxP}9->^a?qLfM?(A=gs~y@Wnw@d!fyZ{S-XwogLn!!m-%)ADwT+*#KFQioRw=))vN zElk#mvTWU3 zL=SR8fjFx|R1P$cu>jXQQ9iA|JyCzyd+a_?Hy_RcF&EHkc~HEfjry`rD5ZV*9*woM z2gj=8Eur206%8@q;zL?gylSgIiV85v%P9r+<>0t4Qa_Kn7U~=lqpbsL(|GGqrcsJA z+w+3nGv1MwCZmLlnR8q_x~fE2sDR?qh=nI^dkVu+p={<}IQ8P`=U;m9!k4S#gFbZ< zS!2)c=ECW3oF2+N3TMAujrH7SiDy6^9I<$+-wHqVfy$l^;IC4(-eRw& z9l!t?yP&|o!9G$mOzC!z7@auH!u|+(_i;&s6{i8(`C-d@(waWKg4=j}K(yz0UK~;t z3-QAW+x-;;=k{zx{X3Sq%s@KG9xJ+#XZky$3=Je^hHHuVud}FVOVRm@6MCMw=~HWW z8vNwUNmTsXe5HPl=Yx$kT-*)7OW1nxe)`0rerZ;3kGL?=@a&`-DQ_iI|0dIDB;;PQ zkJGCW;S}S@atXr<1T(=6$1$%FaAPY1OME$>m4B|$)^@MYNJ@-uM8;YrGc&7fS zluzPO%Ls4-KL0`r1$LZ*aVJ11b{bFcy9oAD<4~vAAktYMaRV=kbflc=8nL0?cx+6k z%IBfpa9Eux=fq`!lQO6`8>d`3ajoRJbBHXc;L}o?juaP1$5J{hLJ4LFLP(=?%0&T}60vN4D<)Ng`X;z{`5B>*GXqJC>c`*p@nAlP}4P(T#NG{NZqhOaZ6LK3f%jjM=| zfh)!k7yu%Gc^$mFV(^!Y&CwShd)%F)A1;GOSmb{ovKNb_>F~wLhY&;G8$X(09F~5N z8QrY|JK%0z1}x#?_EH;9Yr4dMJ$cNjx?)7GZp8^bgt8j1v0+((aJMRuGxs zFkFQuhe3sjBBRZ9gwuFUFXgnkDNfs%{_thUXf%?+_t3)bjQ0QI#SdHvSsY~Hro;6U zd2s=MD2 z!6M-EQ1ufi0O#XA{LI|{NCfr{GiGGsO{D#6$^@^w4KIDbJ*Z2S9mto@>K;j~EZ!oybK&VBG-5k9NOn(!v9}F33=WcAcChCt+uJ%bYuKqnsP0cB%GjY#N z&gm%i801>tu6zZ4AYbtou$=c`1l8Rr4LNIi zoHCeSW8cU?L*AKA{rGYI{`5G>)mUJmAhz^l2hPd?m;4c}w)}tOE`V@Zatq*Xw38q? zF`+csg8t*;`o^VBYps!-0M>RuH!-GT6Z$Pye2oDISf3ktW>kaUFLYC(=DY84hyuB4}#`|a5z^iGv%+ActUbNE6w!D_FlQ=8KmTgFEM~W`CVrT7G>ljaBCZp-rYDRNe zpYFA!VU{?o!7`KplL8X5Nv#ZWP>L5QcmVDDmmWoz1&ScS(Gvad-2c z(mjYzc(aXroA;IO)3qlxZ;v9-Yt^y zQIxsWyA5S-lQQ??{eX8n-fx%pk9pQ`y-Sn_#4SZ%igAMw=D z=T3bd6<$Y%AgqLI!FyO#t!PHp^X+ysa-XZHYI{uuQGVHPt{!VEs6e8;Dz; zxn+cA-3slx!`7}a)ecjky8(EtJ7KzOcCD`6bv$PiF)t-?chg$Yz4R4xJ=INZWv*(v z7EXAXZmOQ`I$hhF*feW;n5*Z#>=gt3%q>M$tJ3rl)~e?t?L7y5!iwtWi>A5-@yM#S zJwI}*jhf#IPkGBlOWn$JyL|yGqV7Ok9Ym1iS9kJbcD16yTD7)XX@x;#0dE!HB31Ls ztWEOAB`Ge7lj?33GO-$wRd3f?KwPEe0Yj7t7~e&cMEQvNGzeh@}Z40su> z3~ex`$WmCu>zX1CZk#@JuHEzxHENAorFH1I|LUPt)vg26hgSOFEQhEP9X&L_>!CB) zRoFn~S06ltO?Ze^9(olUCsWblLFKMT>3%%N0;;w7e)9b)bm;sv7UgmYJ>ueYs`m4G+ff^u0lNz$D;k4%E-qe6c ztDf`RdF{NRp7Zi=vaLz4P}9PE*V@qQlh^dinwQ7dFCk~4rLSnL{|)V|?oFW$H*Q1P zoR&7N`qb9+RgEosGn?i$y@vnj_e|Vsadt`8?z$c?KE=`Z_aHdBR$XiP3qhsP@E1bW zUVHW3>wx^>2M!;;ZbUX<4B;e5CLRTzRTl33W8A=V8qfO#R~M>l9F+wkrug+H7daOCjl>x|!6JgVcLjsU~9D_*nK8jM<&XkZ~q(s16~$m{Jcg z!W(ZqxQG-E`RjD_O~4j_QIFbsVTVq>3f+{~JeK4;7#4I)JUlF^wM z0@{e|AYMqujv1KQeHt z3TBpp{|fp$Jn#_(tgYKa0@Q>6wID!k2+(N}pdalEP}_5oDH#%0P@#-I?u;V_w5o^e@RVy=fsw zGD6HwA)c4f94q}CFQNXenFLHT-YoMaVth6c<9n7Oa~1N0YHcLKu=vh=Rl6}9{xxKgHRx4rk+;-W%t&=^qq6lNE6QM0Vb)t4^kDyma7|1507*Mw( z_~5#)qi&HdeZjp`-OH@(2!fN~b29(b3Q`byK>9YC8gFiXDDK&HqpQ!blKw7_W<_#7 z{J?|dPai#Ae)8z@i5HK)6s3Zg?yF~*TiW_8WA`yAGWZCCk21KQfk;OxyjW~FJBkhI zu1HiFxCEk^ZCN79)!;bv&{JrU#2EG}3<_Cs7 zEwSkzI*`6hEBw$k_Zgks2o%(Dv{6h&Zn;dpT`otNa=F>|)*6gw%jH+rDvkJydW1s~ zc_~Z%MZOL?-yeY@uF25@%2`*-=$VPkp1dRJ>Pe(kiLTy1#`_}w2wp<1jxEuJ@o`1p zGOvOzoVU~*q>|}b-I!X@_<-qgT0<)6g6D!J+VxbNR!lDq?M_noc+uD!MV+F4oB?@2 z(H+}Nkqvd&3I~{wB~(u{uMz9R{ziz$E^C(NoSwJ{6s?d;~4l6xM?gMAmp#;>qcmG$uVtkrn^IkcP|A2?_l6AC!=eS zMIo0Pns4Y}t7OD(*Qlo{a@S3iHj~oFr8EQ_O2a~w(xz~*EZMl!K)#!k8Z0Sqqr9Dz z_oRG&q;*?bxAA4N24Q+lN6QnJb+52#kP)M$Y}`_DYAKrNGmn}VrPl)3`C`yztFb*E z8)SXarzm7^%sf{K7Ce8US9YP%Ziv7gnPDn>f@%iO`&k6BY`qM=e_B&7At7G5m?Wxd zKS5MCDIyJEk(^nrb0@g)z(;VZb+)}-dVZf`?(^-nV4-#IyWfGSg&qbAYb|!PXKqH8 zf3Y3x+EI0u-RO6YoV{AqmB-Y<&SK|&mPzLj+(<9A!-ccJt0xi;06oKR98fVAWno6D zOJ#JS(hL*{?LcR!WxnTasH-{YytiD>S+$5Y6|M>_sjh{U3A3p&&@ zuNwFZm)%tZsz%?^uToXOnHTF&;K?AKfCZNr?iyRRmnIf~D>HOLgQ`bxb!Z)Gs4G@S z*WOBbZ~>~95W{v$Vr(yyw1>azj)#`0e7=DmeA8s<$F#1wWyh&-7G~%IWNWW{1a?8X zOSd9=38tUhgxD_T*N$K~Ct*!5_^pMYtwNug08R)9IA1L^Dhr9`fG2lhRlR#XfL{=K zDy?7v-W9kqs%wqNiT~cvztAxjzHmc-xnsP%FfxVI9+WFGgD7gG^;SUPz%pRE_`YdQx}*+7IAbXuOnU5%dFP<5=<7hV>^4R3?pR`6m%hWCBik^O3=vF6{<7a)=^q20)-wN}@{pqQbjakWvY`jH*1 zHfmw46NKXmE}aUTnJq7};q!zx=yEXY4DLe!4*_c{x$%6SxL9(flF;|m20lc3O*NPS zZdx^NEku)JL%W8Y!2*JPhO6&~GO+XlRKcwLkEyNk8r4Ln_@Sq3WKp@G{SAF9USKn7 zFK51pov?0ruw!c=E7$b5j8}*?U40o@WaX}#k+JwdWY(Z#FZL1#!Y0Z*M!!q7-CTX* z5Aj);pM(8bxY@aD_pS~KVO6B9Itp*=aepV%mXIFL#68BoK(8To07vdy3L}x?7OdiU z47RM#NRMO_=_mDOnY_CDWYy3oDUpLe*;14Hh z+|8)2;KTRuBoi~MJ2yLrKFq`b?Y)T=K%r@wD56dh;zjs*zK(6New!rxT#WopKJdQ2 z#@u%!z_fG5OX*~%obrnM#4?G^n-4*j9%5CpSx8}oDn*dw@$pZf#6WxlUyukDAV);% z=a`f9LUBQde2G*sF~^!5w-x2nNq(0Wr7?D0y@{YSNly9VV7sf!NR131+cCu1R&e5C z5Sd|fHGVzT--;`&LFn$ii2X92;0Xk@HG4eFf&Z?@#2jor154+c))Y5p9*+b2Gh@22 zEergs-=}v9;|n|D;hIAOToLZY;BR;3RnRT*(G#=*452s$byqk)A9+sdGHCMjK)(m822m$YkodGf7px{iYd&son3&%^P;>+X6EbxwA32@A`E zVNGNA=DBm%C%qYYo0PYLH!E)id7HwSEOSoD+cbJGy`gufw+i0e)%dS=RmS7(-89!{ zI8Wel)@8k$hyL7$tv%z-L%W*mvtW2QsKD{c%!anU2YhW$eGf*nALE<*hW1Uvy9I}L zI6Op|S?^Ys4EJt8Q?nNDwoTJJuxW1?ay)Z8YM=2IHVqm7zIgn_JC_dw3kZ59GF1T0WP0WLN>H6g4!9Xj zaH)arlhclWWCdK9g4Q|w0kcdIRa^0Qn09tWAhT-+)vqzjuQL!ypY%qrjP>O`=J+~; z4FsSj39@#q_%yPJf2v3C;2K~PQ2rE&_(M@Tu3A2Yw12@9aL5^%lk@(i&SbBtS_}U& znUNNm)x{(5`8*<`$?sj);UvN0T&CiM`lU7(B@71;9l+|Y5DPo}Z9~U-6d(r(>F13W zme;dsUnLsfi5KiEXdzZ~)Yv?;VoH>*1<6js&_2dIzlZ>fnhU};4^%lgMP4{GrBtK; ziboEB9nH{ZZ)Ws4s8R>ENA_mtk^kOu_q2J@j@71cOnVil=Q!#XKJSTwgq8F)v|7sd z=Cs{90VP)w#}FXoJ%gG`87RJFJf&QcQw9*k1(`8^SJZA`55IvwQnUIdW8#!Zu_Uto zJyOJn04FKTDg$PfWn|%sm`&bXGXpM4HwD$;KBHia8J43mC8>5B40;sw{aG|9FmQV8 zt4}>exfADDxtLb@7q_|hxiTM=`wU;^uoc}<&$b|#jX>D&7g8j%O?WU7(eW_2erFJ$#UnUS-)OnWM9hn0qGpi-(9EUPt~ zvD&<$q=2YjW!85P;F3x^^h+tZc~UNyrmH>Y61{KnT_YEESdI6aQ1II^(igV+HRXTfy-#rE=89aobG?8pm*yqV^j@AD0Ps@Qx zDW3?UGPKMEUzKR6;-A`LVG-us)RED65YJ&e594`6=AtxJ@jTpa;mxYVc^TypAKbF) zt^I4LEcW;c`+Wqje~G7m(vmP>IkAP&03k5slcawVeAj|!GCz|y^WedG-LYJ-X6FYE z&ReXTuHhipg6={{bf&iL%Mn7%MN8x1UJU*TdN3io(BY$Zu7(J4FOLx7B;6h&$_~oH zRRca@lFn_wp~Bl*@Kc%az3ZUD4&8%Z8sztAn4;SS^v%UFu-v=qro1%hEAD93Ga$-_ zm+QLq39=SAZt`6lb;8LB_h6FRwV|kdsb^B^$;S1BxzHAdRPd&RJm-Zxr_p*kY5g@R zH9cGkPDQlt&7cPvse#OCR%*yd`3aPtNXl;wmGAW)Zc&o&a1!J;i!l_|bGW&u?u zzPwHKEA7Eq>3DN!cke8250U8JqIGlUZS~jPER^hgQUm+4f6x~xKY_9q%G@GqSody? z|8`U5JZ`y73DHh@x79Qm<#ckl?Z8s(r>Fdg@_on-T|ukjivYWmdG6@*$DV!R`O}|R z7&_D9VaUK++L=D~%&8Mg%cqVn9DDY&C~)Ev3z44bakruT~N8 z?@=c!dZJG5+KT!E<{4NX?6LZN2BM}!q_DsJnxVtF%CW#U#-;hpkOco0vwc`GekU_8 zF%VhaW{e^^nhMscxRw|IOR%MQsWo;rh^Wqwi)xY5(!YbOfof?WujO<{tul=&K`u-B zIOpkCoM=;7E&(iuj|&oOA?`YB!EwA%n)d$ZarY;drVdp0~q;d z;_V0?HID$-W+$FYH2JpkB653DsbhG8zd*2?7>788$wv=(*Xjw~hz|txqR*d_FnKxB~;~xXA_C$2-m^c}n~E?y@LNp(8}7 zG#OuW>T@7$hVP)Zm_Z1g`Cr%oeUhSnr(d_Q7lFJx4tZfO9Mcfcf0wUgNMRKZ6UGaO z5W=%Yj|_ko0K5*~T~YXRMyG#Ge3#2z6R0GGMtQl>#JOTyM(9*PC$q4o4P%z*_;C-mO{aYj_l3UJ@)%4duZN0l7wz!L4mLxuDA? zu2}17xQQl2du0J4=;Cgso+pUBEF4(S;JC4XV;S*S#5rspD8lJg5EwbQ{w4Jm3rq3+ zWlnjN=B=n$%?V3<2Z`fIqR}d6fVkFk3*+RD!jjcnh?TM}|3V*8*Aqku$t0o#TgB-i zxte3@Qw(Tujvsm7$utq9B6=73I)Vu{+Kxj1Cx%kXOS%z{l_6j z?)fw!#>xRPa83R<%sI%wIRP1ct@OQSz$YC8jIuB!g|=V39)TIn!~YAI0X!CfkS5#! zwx@@{mWe?Dlg}+f5+MXhLzu%)09;TecWY8WR}j!m0d(|prg4pW0-j3vYyrDOdWCTw z8y8eiPkknV-JS$?kY0mzk;NOV%cGc>_(G`As6OCIIUg#sk1h3G<`XeBH-sm_$*y>k zH6MVg%_^iL?=VIH$NG2-W70zb+Kq_F%9GPWp7w9^_b+cuBBu*jA|FAInrFQNRQJ^# z>z$H%;S3|BNS4^_sVeAeBP;xt@#>3lfpkL!+{1yt|c<4ti#&)|5DpPC*arnH* ze(W%pY(l(u2kC_rDMs0~Z2}A=&ajR#9En}D1CBP?^>Zk&-NfpxiTYD~F8-()SKni< zkvZjb#@@8yIqj!@@SJ{&9pjv;KV$Ic40f9w$@?yHY@3eW801#lj=1U_|A^l{Mg{fH zwwij#8Xcz$=G*KW0o23JXzB-#b8B>*L^T#zYGC|>2hPHB@NpOKR6oi5_c9n$iOWoL z8IX^}R|`c&3GVJ<+7biNh5|zYm}pJWfwIl12&3HU+L=bJT8|k zOfN3t2Zomd#SK`R$Ml5dv$*EzUudiI_;m?9trh%4D^OI>%3@GNfOD2}YhkUS2rs#> z9$EY?t^7_gDtL8V^l2{!=Ww~IiYr1Y#WL3FrLYt29cu%x@_SoZ=xBEAtNe;krCB^b z`YHb5qa)Ydg81&Wz-N+qCvXcm`Q>e(cq%DZBuWR8j=}YSA6uSTOs?Yxi%Bih(hh#Y zxH$N6qujJB75W!4dU diff --git a/backend/api/room/consumers.py b/backend/api/room/consumers.py index b1c40496..191fdea8 100644 --- a/backend/api/room/consumers.py +++ b/backend/api/room/consumers.py @@ -3,12 +3,12 @@ import json from uuid import uuid4 from channels.generic.websocket import AsyncWebsocketConsumer from channels.db import database_sync_to_async - from .models import Room + class RoomConsumer(AsyncWebsocketConsumer): async def connect(self): - + self.room_id = self.scope['url_route']['kwargs']['room_id'] self.waiter = None self.clientId = str(uuid4()) @@ -20,71 +20,93 @@ class RoomConsumer(AsyncWebsocketConsumer): print('Connected') await self.accept() await self.send(json.dumps({'type': 'connect', "clientId": self.clientId})) - + except: print('closed') await self.close() - async def receive(self, text_data): text_data_json = json.loads(text_data) type = text_data_json['data']['type'] print(text_data_json) - + if type == "login": + print('LOF', self.scope['user']) participants = await self.get_participants() - nick = text_data_json['data']['nick'] - - if nick in list(map(lambda p: p['nick'], participants)): - print('Nooope', nick, nick in list( - map(lambda p: p['nick'], participants))) + if self.scope['user'].is_anonymous: + nick = text_data_json['data']['nick'] + else: + nick = self.scope['user'].username + + if nick in list(map(lambda p: p['nick'], participants)) and self.scope['user'].is_anonymous: await self.send(json.dumps({'type': 'loginResponse', "error": "USER_INPUT", "description": "Pseudo déjà utilisé"})) - + else: if self.room.private == True: - waiter = await self.add_waiter_db(nick) - + waiter = await self.add_waiter_db(nick, self.scope['user'].is_anonymous == False, None if self.scope['user'].is_anonymous else self.scope['user'].id_code) + if waiter != None: self.waiter = True self.waiter_code = waiter['code'] await self.send(json.dumps({'type': "waitingRoom", "nick": nick, 'id_code': self.room_id})) await self.channel_layer.group_add(f'waiter__{waiter["code"]}', self.channel_name) - await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "add_waiter", "code": waiter['code'], "nick": nick,}) + await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "add_waiter", "code": waiter['code'], "nick": waiter['nick'], "status": waiter['status']}) else: await self.send(json.dumps({'type': 'loginResponse', "error": "USER_INPUT", "description": "Pseudo déjà utilisé"})) - + else: await self.channel_layer.group_add(self.room_id, self.channel_name) - new_participant = await self.add_participant(nick, self.clientId) - self.user = new_participant - print('new_participant') + if self.scope['user'].is_anonymous: + new_participant = await self.add_participant(nick, self.clientId) + self.user = new_participant + else: + new_participant = await self.add_user(nick, self.scope['user']) + self.user = new_participant + await self.send(json.dumps({'type': "roomJoined", "clientId": new_participant.clientId, 'id_code': self.room_id, 'identity': new_participant})) await self.channel_layer.group_send(self.room_id, {'type': 'join.event', "nick": nick, "owner": False, "online": True, "code": ""}) await self.channel_layer.group_send(f'owner__{self.room_id}', {'type': 'join.event', "nick": nick, "owner": False, "online": True, "code": new_participant['code']}) - + elif type == "acceptParticipant": code = text_data_json['data']['code'] nick = text_data_json['data']['nick'] + status = text_data_json['data']['status'] self.waiter = False - new_participant = await self.add_participant(nick, str(uuid4())) - + if status == 'anonymous': + new_participant = await self.add_participant(nick, str(uuid4())) + else: + new_participant = await self.add_user(code) + print(new_participant) await self.del_waiter_db(code) - + await self.channel_layer.group_send(f'waiter__{code}', {"type": "accept_room", 'id_code': self.room_id, 'code': new_participant['code']}) - - + elif type == "refusedParticipant": code = text_data_json['data']['code'] - + await self.del_waiter_db(code) await self.channel_layer.group_send(f'waiter__{code}', {"type": "refused_participant"}) - elif type == "logAcceptedWaiter": code = text_data_json['data']['code'] participants = await self.get_participants() - - if code in list(map(lambda p: p['code'], participants)): + if not self.scope['user'].is_anonymous: + await self.channel_layer.group_discard(f'waiter__{code}', self.channel_name) + await self.channel_layer.group_add(self.room_id, self.channel_name) + self.clientId = self.scope['user'].clientId + + self.user = { + 'nick': self.scope['user'].username, 'code': self.scope['user'].id_code, 'clientId':self.scope['user'].clientId, "owner": False} #à continuer dsl + self.waiter = False + self.waiter_code = None + + await self.send(json.dumps({'type': "roomJoined", "clientId": self.clientId, 'id_code': self.room_id, 'identity': self.user})) + + await self.channel_layer.group_send(self.room_id, {"type": "join.event", "nick": self.user['nick'], "owner": False, "online": True, "code": ''}) + await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "join.event", "nick": self.user['nick'], "owner": False, "online": True, "code": self.user['code']}) + + + elif code in list(map(lambda p: p['code'], participants)): participant = list( filter(lambda p: p['code'] == code, participants))[0] await self.channel_layer.group_discard(f'waiter__{code}', self.channel_name) @@ -100,151 +122,210 @@ class RoomConsumer(AsyncWebsocketConsumer): await self.channel_layer.group_send(self.room_id, {"type": "join.event", "nick": participant['nick'], "owner": False, "online": True, "code": ''}) await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "join.event", "nick": participant['nick'], "owner": False, "online": True, "code": participant['code']}) - elif type == 'relogin': + if not self.scope['user'].is_anonymous: + userInRoom = await self.userInRoom() + if not userInRoom: + await self.send(json.dumps({"type": "reloginError"})) + else: + isOwner = self.scope['user'].clientId == self.room.owner[ + 'clientId'] and self.scope['user'].id_code == self.room.owner['code'] + self.clientId = self.scope['user'].clientId + if isOwner: + await self.channel_layer.group_add(f'owner__{self.room_id}', self.channel_name) + else: + await self.channel_layer.group_add(self.room_id, self.channel_name) + + self.user = { + 'nick': self.scope['user'].username, 'code': self.scope['user'].id_code, 'clientId': self.scope['user'].clientId, "owner": False} + + await self.connect_participant() + + await self.channel_layer.group_send(self.room_id, {"type": "reconnect.event", 'nick': self.user['nick']}) + await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "reconnect.event", 'nick': self.user['nick']}) + code = text_data_json['data']['code'] participants = await self.get_participants() - print('participants', code, participants) if code in list(map(lambda p: p['code'], participants)): - participant = list(filter(lambda p: p['code'] == code, participants))[0] + participant = list( + filter(lambda p: p['code'] == code, participants))[0] self.clientId = participant['clientId'] - + if participant['clientId'] == self.room.owner['clientId'] and participant['code'] == self.room.owner['code']: await self.channel_layer.group_add(f'owner__{self.room_id}', self.channel_name) else: await self.channel_layer.group_add(self.room_id, self.channel_name) - + participant['online'] = True self.user = participant await self.connect_participant() await self.send(json.dumps({'type': "reloged", "clientId": self.clientId, 'id_code': self.room_id, 'identity': participant})) - + await self.channel_layer.group_send(self.room_id, {"type": "reconnect.event", 'nick': self.user['nick']}) await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "reconnect.event", 'nick': self.user['nick']}) - + else: await self.send(json.dumps({"type": "reloginError"})) - - + elif type == "reconnect": client = text_data_json['data']['clientId'] - participants = await self.get_participants() - - if client in list(map(lambda p: p['clientId'], participants)): - self.clientId = client - - participant = list(filter(lambda p: p['clientId'] == client, participants))[0] - - if participant['clientId'] == self.room.owner['clientId'] and participant['code'] == self.room.owner['code']: - print('add in admin') - await self.channel_layer.group_add(f'owner__{self.room_id}', self.channel_name) + print(self.scope['user'].is_anonymous) + if not self.scope['user'].is_anonymous: + userInRoom = await self.userInRoom() + if not userInRoom: + await self.send(json.dumps({"type": "reconnectError", 'id_code': self.room_id})) else: - print('add in users') - await self.channel_layer.group_add(self.room_id, self.channel_name) - participant['online'] = True - self.user = participant - await self.connect_participant() - await self.send(json.dumps({'type': "reconnected", "clientId": client, 'id_code': self.room_id, 'identity': participant})) - await self.channel_layer.group_send(self.room_id, {"type": "reconnect.event", 'nick': self.user['nick']}) - await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "reconnect.event", 'nick': self.user['nick']}) + isOwner = self.scope['user'].clientId == self.room.owner[ + 'clientId'] and self.scope['user'].id_code == self.room.owner['code'] + if isOwner: + await self.channel_layer.group_add(f'owner__{self.room_id}', self.channel_name) + else: + await self.channel_layer.group_add(self.room_id, self.channel_name) + + self.user = { + 'code': self.scope['user'].id_code, 'nick': self.scope['user'].username, "clientId": self.scope['user'].clientId, 'online': True, 'owner': self.scope['user'].clientId == self.room.owner['clientId'] and self.scope['user'].id_code == self.room.owner['code']} + + await self.connect_participant() + + self.clientId = self.scope['user'].clientId + await self.send(json.dumps({'type': "reconnected", "clientId": self.scope['user'].clientId, 'id_code': self.room_id, 'identity': self.user})) + await self.channel_layer.group_send(self.room_id, {"type": "reconnect.event", 'nick': self.user['nick']}) + await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "reconnect.event", 'nick': self.user['nick']}) + else: - await self.send(json.dumps({"type": "reconnectError", 'id_code': self.room_id})) - + participants = await self.get_participants() + + if client in list(map(lambda p: p['clientId'], participants)): + self.clientId = client + + participant = list( + filter(lambda p: p['clientId'] == client, participants))[0] + + if participant['clientId'] == self.room.owner['clientId'] and participant['code'] == self.room.owner['code']: + print('add in admin') + await self.channel_layer.group_add(f'owner__{self.room_id}', self.channel_name) + else: + print('add in users') + await self.channel_layer.group_add(self.room_id, self.channel_name) + participant['online'] = True + self.user = participant + await self.connect_participant() + await self.send(json.dumps({'type': "reconnected", "clientId": client, 'id_code': self.room_id, 'identity': participant})) + await self.channel_layer.group_send(self.room_id, {"type": "reconnect.event", 'nick': self.user['nick']}) + await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "reconnect.event", 'nick': self.user['nick']}) + else: + await self.send(json.dumps({"type": "reconnectError", 'id_code': self.room_id})) + elif type == 'ban': code = text_data_json['data']["code"] nick = text_data_json['data']["nick"] - - await self.del_participant(code) - + status = text_data_json['data']["status"] + if status == 'anonymous': + await self.del_participant(code) + else: + await self.del_user(code) + await self.channel_layer.group_send(self.room_id, {'type': "ban_participant", "code": code, "nick": nick}) await self.channel_layer.group_send(f'owner__{self.room_id}', {'type': "ban_participant", "code": code, "nick": nick}) - - + async def join_event(self, event): await self.send(json.dumps({'type': 'joined', 'nick': event['nick'], "owner": event['owner'], "online": event['online'], "code": event["code"]})) - + async def accept_room(self, event): - await self.send(json.dumps({'type': 'accept_room', 'id_code': self.room_id, 'code':event["code"]})) - + await self.send(json.dumps({'type': 'accept_room', 'id_code': self.room_id, 'code': event["code"]})) + async def accept_waiter(self, event): await self.send(json.dumps({'type': 'joined', 'nick': event['nick'], "owner": event['owner'], "online": event['online'], "code": event["code"]})) - + async def add_waiter(self, event): - await self.send(json.dumps({'type': 'add_waiter', 'nick': event['nick'], "code": event["code"], })) - + await self.send(json.dumps({'type': 'add_waiter', 'nick': event['nick'], "code": event["code"], "status": event['status']})) + async def new_parcours(self, event): await self.send(json.dumps({'type': "add_parcours", "parcours": event['parcours']})) - + async def refused_participant(self, event): await self.send(json.dumps({"type": "refused"})) - + async def ban_participant(self, event): await self.send(json.dumps({"type": "banned", 'nick': event['nick'], "code": event["code"]})) - + @database_sync_to_async def get_participants(self): - return Room.objects.filter(id_code = self.room_id)[0].participants - + return Room.objects.filter(id_code=self.room_id)[0].anonymousMembers + @database_sync_to_async def get_room(self): - return Room.objects.filter(id_code = self.room_id)[0] + return Room.objects.filter(id_code=self.room_id)[0] @database_sync_to_async def add_participant(self, new, id): return Room.objects.add_participant(self.room_id, new, id, False, True) + @database_sync_to_async + def add_user(self, code): + return Room.objects.add_user(self.room_id, code, False, True) + @database_sync_to_async def del_participant(self, code): return Room.objects.del_participant(self.room_id, code) - @database_sync_to_async - def add_waiter_db(self, new): - return Room.objects.add_waiter(self.room_id, new) - + def del_user(self, code): + return Room.objects.del_user(self.room_id, code) + + @database_sync_to_async + def add_waiter_db(self, new, isUser, code): + return Room.objects.add_waiter(self.room_id, new, isUser, code) + @database_sync_to_async def del_waiter_db(self, code): return Room.objects.del_waiter(self.room_id, code) - + @database_sync_to_async def disconnect_participant(self): - return Room.objects.disconnect(self.room_id, self.user['code']) + if self.scope['user'].is_anonymous: + return Room.objects.disconnect(self.room_id, self.user['code']) + else: + return Room.objects.disconnect(self.room_id, self.scope['user'].id_code) + @database_sync_to_async def connect_participant(self): return Room.objects.connect(self.room_id, self.user['code']) - + + + @database_sync_to_async + def userInRoom(self): + if self.scope['user'].is_anonymous: + return None + return len(self.scope['user'].room_set.filter( + id_code=self.room.id_code)) != 0 + async def disconnect(self, close_code): if self.waiter == False and self.user != None: await self.disconnect_participant() await self.channel_layer.group_discard(self.room_id, self.channel_name) await self.channel_layer.group_send(self.room_id, {"type": "disconnect.event", "nick": self.user['nick']}) await self.channel_layer.group_send(f'owner__{self.room_id}', {"type": "disconnect.event", "nick": self.user['nick']}) - + elif self.waiter == True and self.waiter_code != None: await self.del_waiter_db(self.waiter_code) await self.channel_layer.group_send(f'owner__{self.room_id}', {'type': "del_waiter", "code": self.waiter_code}) await self.channel_layer.group_discard(f'waiter__{self.waiter_code}', self.channel_name) - + async def disconnect_event(self, event): await self.send(json.dumps({'type': 'disconnect_participant', "nick": event['nick']})) - + async def reconnect_event(self, event): await self.send(json.dumps({'type': 'reconnect_participant', "nick": event['nick']})) - + async def del_waiter(self, event): await self.send(json.dumps({"type": 'del_waiter', "code": event['code']})) - - - + async def challenge_parcours(self, event): await self.send(json.dumps({**event})) - + async def delete_parcours(self, event): await self.send(json.dumps({**event})) - + async def edit_parcours(self, event): await self.send(json.dumps({**event})) - - - - \ No newline at end of file diff --git a/backend/api/room/migrations/0005_rename_participants_room_anonymousmembers_and_more.py b/backend/api/room/migrations/0005_rename_participants_room_anonymousmembers_and_more.py new file mode 100644 index 00000000..7d8f4018 --- /dev/null +++ b/backend/api/room/migrations/0005_rename_participants_room_anonymousmembers_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0 on 2022-05-21 15:35 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('room', '0004_alter_tempcorrection_id_code'), + ] + + operations = [ + migrations.RenameField( + model_name='room', + old_name='participants', + new_name='anonymousMembers', + ), + migrations.AddField( + model_name='room', + name='userMembers', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/backend/api/room/migrations/0006_alter_room_usermembers.py b/backend/api/room/migrations/0006_alter_room_usermembers.py new file mode 100644 index 00000000..ec46e9dd --- /dev/null +++ b/backend/api/room/migrations/0006_alter_room_usermembers.py @@ -0,0 +1,20 @@ +# Generated by Django 4.0 on 2022-05-21 15:44 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('room', '0005_rename_participants_room_anonymousmembers_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='room', + name='userMembers', + field=models.ManyToManyField(null=True, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/backend/api/room/migrations/0007_alter_room_usermembers.py b/backend/api/room/migrations/0007_alter_room_usermembers.py new file mode 100644 index 00000000..81c49388 --- /dev/null +++ b/backend/api/room/migrations/0007_alter_room_usermembers.py @@ -0,0 +1,20 @@ +# Generated by Django 4.0 on 2022-05-21 15:44 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('room', '0006_alter_room_usermembers'), + ] + + operations = [ + migrations.AlterField( + model_name='room', + name='userMembers', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/backend/api/room/migrations/0008_alter_room_anonymousmembers.py b/backend/api/room/migrations/0008_alter_room_anonymousmembers.py new file mode 100644 index 00000000..fefa5040 --- /dev/null +++ b/backend/api/room/migrations/0008_alter_room_anonymousmembers.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-21 15:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('room', '0007_alter_room_usermembers'), + ] + + operations = [ + migrations.AlterField( + model_name='room', + name='anonymousMembers', + field=models.JSONField(default=list, null=True), + ), + ] diff --git a/backend/api/room/migrations/0009_room_online.py b/backend/api/room/migrations/0009_room_online.py new file mode 100644 index 00000000..705e9e97 --- /dev/null +++ b/backend/api/room/migrations/0009_room_online.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-21 17:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('room', '0008_alter_room_anonymousmembers'), + ] + + operations = [ + migrations.AddField( + model_name='room', + name='online', + field=models.JSONField(default=list), + ), + ] diff --git a/backend/api/room/migrations/__pycache__/0001_initial.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0001_initial.cpython-310.pyc index 658a5d32d9a9badb2ee96af94fc0911d8840bac2..3e884a43a9a0d353ee727b8eccd9b0436576cc7c 100644 GIT binary patch delta 53 zcmZ3@y^WhYpO=@50SGRxY}v@2$HG`Jxr)V1EWXT0-#s-iwJ5P9wX{e-DKR-aH7{lI HZk7)Kn{^S9 delta 42 wcmdnSy_%alpO=@50SMlnkKV|g$HJI8xr)V%TR$l=IXg8kCBDpP@-dbV0QxiyUH||9 diff --git a/backend/api/room/migrations/__pycache__/0002_tempcorrection.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0002_tempcorrection.cpython-310.pyc index 2c7c879515948bfb02962e49ecc0829e53125e8b..d77f0852c6f6c7eb919d859d913e1e89082c7151 100644 GIT binary patch delta 53 zcmX@hdV`fapO=@50SGRxY}v^DjFGW?@+U?!vG_70efQM7)S|?a)Y2mTq{QUx)V!3* H#!RyS!-^5w delta 42 wcmcb?dX|+tpO=@50SF=&HEiU5#>kj6`4giVw|-J$a&~H7N_?5oWILu=00Ybo3jhEB diff --git a/backend/api/room/migrations/__pycache__/0003_tempcorrection_id_code.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0003_tempcorrection_id_code.cpython-310.pyc index eade6991b8a4644c4eb482e6907dbe9d94af50ba..3aaf0fae2c08166479dfeb80d25c0d8bd6a67c5a 100644 GIT binary patch delta 88 zcmeBRoy^Le&&$ij00b9TwoK%{!+2}ri!I#ZKz4QDRAI dX_0ub2f$2r!8;0{|pY7li-- diff --git a/backend/api/room/migrations/__pycache__/0004_alter_tempcorrection_id_code.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0004_alter_tempcorrection_id_code.cpython-310.pyc index dd03e1f9500e86af6b35d964ead770d54792cbe8..5775b98fea30aa86c262437db6377998243260bd 100644 GIT binary patch delta 53 zcmcb{`jC}7pO=@50SGRxY}v?tfswIw@*PGqvG_70efQM7)S|?a)Y2mTq{QUx)V!3* HvP?Sx!#NSx delta 42 wcmaFJdX1GkpO=@50SI<2ZrI3ufswIl@*PGqZvCXhHYo6u09f&E>9Y2gCpp5@VL8s$fH?mHNTJ6{#Of7RwjE9yt;_*tu3W!@|%V zi3LXfAqKBZ{0o&pJm>mxj{NeT{d;~tzn}H`dP;EoioZ<0288_f!RiPx*u`mg&`2U_ zO&VHI>iwV&8dk6-EJ8|-h-5PSOk@ab7JXtxB%@Q3#eXo5WYi@Vx~@`Fn*}ays;LoO zrImGYqb1a~^sv>jhQTgQdx!=|K_w{yVBbTCX7LXy=`<+Tuv8)gUsy)h45I-?F{HDh zN6EEoDwAu5$dMc%nbZx&ca@PwXtZvM=iA%cFSw{XFua4NEwwRFdUCvyyhL^;Mhb4! z3e#0()e6;Fw<(lXi$>4w7@7$fn=!nWzY15P0hj1n-g*kImfmn~!Q8>A3p$-KGw^4J zeNJ>yK`oE7b(ioygL9X1j;GFRK!3#f$GNCImUF{=;v;({+Ez?(UqTB?f+`mVg(Plc z@BHiyKR-P<;p2Dv2XEcz9#MgH!xQia9r}_k*^{#OjMv+3jD=d9X>XVNsczv`u%E;{ zK}>IMzUA+A19@H5l~DOUT;{FOGwfbI1?4kf?we}8@cGfh(&f%dlutzY0jcMrt#U6( z{_s3<6z3&3JypIc0QW$CFG8~v0T(3p%fME&YxaJwQWeaHI-_3(!_EWM{##U-znYQ3huuzxqBV3R&( F{{cwu{4f9j literal 0 HcmV?d00001 diff --git a/backend/api/room/migrations/__pycache__/0006_alter_room_usermembers.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0006_alter_room_usermembers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4204f684305dcb921f487ca1de61aa4fb45ba221 GIT binary patch literal 781 zcmYjOJ8u&~5Z>K;_Q6uq~Jsa$ib~LY@Z{{1lyPFb}AIYcbeMZPP?`%tm&JjL)h)NPkOH$FC zQg5@8RY4w9VIER)Mr0tvk3@zLETRuV9?9r}4CC+kj|{0xEHq7_=61+jS`~96nnEk< z;z~;>?aY^LOAnnReD*OaAUTyJXApc2AzH*=sHAh2_Yf+POa{n65ho*cPYnqvMmAa0q1X9 zQFfzn6L^4q`%cugm||W+4N8KVEe)QBxV_`c$#Z^rar%mnU!I)4aD)F91z49JmkpR_ z9?|&IxxKMa%Zc{7i@H?Tu;%_NF?X@1Q$OEluXP1kS(JrP*$G@{wb2WhHQ5}L{{gMx z4OoA}>}(UdKHT!MshGXNc{5QLnWr+_TslL}A9CU6Te0j}ToZgyFHMA__@mo>R0&A~ zM#JA>%qXL`X!tAn(^Z@gW49w0Le2HTOslIEEB$puPCEj-)w}Y|f-CDD_IAmW75Pu8 Nhw~>Lu-o)b@E2};-ciqr5Z0d^pYJlE$b^C?a1-C801AdlW)ecdg&C4GZZy8r#`v%;Bl*HyMF9;( z-T_KpNi7wx!2ik@xNFeN?(Ba0q+NY0y}cb1T;HP)(;t+OFFx5^0+T~Ddw@<6MJrO% zj8Y%7iq$;hwa5e|r$lij-V-H&&x3b73si7UlJF~@BMEhpg{~``!Y0hcby=9aD|KUC zSZf89oq5{k3NblEvk%b$$*3Y31O8D!Fb_XbMGKZ~VW~(l#bGdyJ+8zJRlyA}Xf{+K zmfv!N$=_O7SQxEqcW*o%-K`;wu_I6}L0Vo8^V}zDHfGTey|=GckL}>D{-t z=}TQhT9s9qH|a54r>)U*n009ZjXwbkBRjBuJn88gx<1&*(rG?>h5e>^Tc%#MbUnlr z1%2=zLHFCG39ywdG`ou~A~9!F{1PFfjE<=I8U5}VXG!RWYMwWR-k<5_YNg8H7E#k) g!2anyef_{ybQkY-(W904kMS=P>t{J)cjzAf1AOt&82|tP literal 0 HcmV?d00001 diff --git a/backend/api/room/migrations/__pycache__/0008_alter_room_anonymousmembers.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0008_alter_room_anonymousmembers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d13789029d1eba46c10c05e17ddee01a426e19c2 GIT binary patch literal 666 zcmYjPJ#Q2-5cSvI?XD6LA(4h2>6-J21`33NgouQcqX^YD*4}xt?BTT!dpA;Q(om%0 zSMZnIQt=m%P#Et8?kvs7^JeTf^K5r~ToPQ5if^m$l#rh(I9vjQGqmswohF(Z($R`` ztYVa$6U{WgC7J`>@UOh$T3nJ@_6uvtjK#8R8(;UWvms78r@@4EN*%5#24`qtjt)pg zHK~}U4XrqcO_m5?vYA4zh0gAnp4@TF6?%$9c`PpeF(94r&UNwWVzGFkYSV*P2~a}- z-$AzmAAE)+@uarS-gIsV7d!YP9-eBrst40YVFzPo9Gg!KD_eJfSn}Cb3q~(zWz5xx zD-}znux>Db`y-{k47EwMDblb7tHG{Y2%aV4@=faMUAo2d1QhQtKP<;M3e$!@mTn6V ziv1w|3D%76_pSWoI*_I{ZEfXSxRzV*Hn8qx12&z2!K)rZ-`Yl=@1g7G2a#OW>(AJd zthcR9(#ZY$NL20Rp=$p%dXR3uz47TYOwht(bU9&M+>4A+MvtiYli!c|#){BSz zA^xRYJ^2>|StotUdjlEr%}nQ;`BHmyR1ma}Prh%yQbK-4aA+LC2_F9pog#{A($k9e zNtIA?PE?}UH=-EOj@__|DSko9^cU8WG6_ZBHm)99YkbIht3dm0OdVQ=-~^9>lTnJeoIw)%P_N48PY7m^8Nq*NXDJDef4y;TD_FD9>K{NkhQVq zy0??>q2GY>E=8V@S)*G6B@GJ&m-VE_lHs^CqGr{ZS3J#gv)mqAJ#JtT(^DEZLC-T literal 0 HcmV?d00001 diff --git a/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc b/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc index 0f73d887b8f4bcdd5529d1d746843df09a1d0a25..d2027e75b41cc5c276ba6fede369247b4c6beb22 100644 GIT binary patch delta 50 zcmdnTc#@GjpO=@50SGRxY?;Vy!= condition else False + code = ''.join(random.choices(string.ascii_uppercase, k=6)) + parcours.challenger = [*parcours.challenger, + {**challenger, 'exos': [{**result, 'endAt': date, 'code': code}], "validate": validate}] - date = getNow() - if len(challengers) == 0: - condition = parcours.success_condition - validate = date if result['note']['value'] * 20 / \ - result['note']['total'] >= condition else False - code = ''.join(random.choices(string.ascii_uppercase, k=6)) - parcours.challenger = [*parcours.challenger, - {**challenger, 'exos': [{**result, 'endAt': date, 'code':code}], "validate": validate}] + else: + validate = False + if challengers[0]['validate'] != False: + validate = challenger[0]['validate'] + else: + condition = parcours.success_condition + validate = date if result['note']['value'] * 20 / \ + result['note']['total'] >= condition else False + oldChallenger = challengers[0]['exos'] + while True: + code = ''.join(random.choices(string.ascii_uppercase, k=6)) + if len(list(filter(lambda c: c['code'] == code, oldChallenger))) == 0: + break + parcours.challenger = [*list(filter(lambda c: c['code'] != challenger['code'], parcours.challenger)), + {**challenger, 'exos': [*challengers[0]['exos'], {**result, 'endAt': date, "code": code}], "validate": validate}] - else: - validate = False - if challengers[0]['validate'] != False: - validate = challenger[0]['validate'] - else: - condition = parcours.success_condition - validate = date if result['note']['value'] * 20 / \ - result['note']['total'] >= condition else False - oldChallenger = challengers[0]['exos'] - while True: - code = ''.join(random.choices(string.ascii_uppercase, k=6)) - if len(list(filter(lambda c:c['code'] == code, oldChallenger))) == 0: - break - parcours.challenger = [*list(filter(lambda c: c['code'] != challenger['code'], parcours.challenger)), - {**challenger, 'exos': [*challengers[0]['exos'], {**result, 'endAt': date, "code": code}], "validate": validate}] - - parcours.save() - return {'validate': validate} + parcours.save() + return {'validate': validate, 'code': code} class Parcours(models.Model): - name = models.CharField(max_length=50) - id_code = models.CharField( - max_length=50, default=generate_unique_code_parcours) - challenger = models.JSONField(default=list) - room = models.ForeignKey(Room, on_delete=models.CASCADE) - created_at = models.DateTimeField(auto_now_add=True) - timer = models.IntegerField(blank=True) - exercices = models.JSONField(default=list) - # https://docs.djangoproject.com/fr/4.0/ref/validators/ - success_condition = models.IntegerField(default=10) + name = models.CharField(max_length=50) + id_code = models.CharField( + max_length=50, default=generate_unique_code_parcours) + challenger = models.JSONField(default=list) + room = models.ForeignKey(Room, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + timer = models.IntegerField(blank=True) + exercices = models.JSONField(default=list) + # https://docs.djangoproject.com/fr/4.0/ref/validators/ + success_condition = models.IntegerField(default=10) + + objects = ParcoursManager() + - objects = ParcoursManager() - class TempCorrection(models.Model): correction = models.JSONField(default=list) - id_code = models.CharField(max_length=50, default = generate_unique_code_corr) \ No newline at end of file + id_code = models.CharField( + max_length=50, default=generate_unique_code_corr) diff --git a/backend/api/room/serializers.py b/backend/api/room/serializers.py index c89a7eb0..35f1c2a5 100644 --- a/backend/api/room/serializers.py +++ b/backend/api/room/serializers.py @@ -6,7 +6,7 @@ class RoomSerializer(serializers.ModelSerializer): class Meta: model = Room - fields = ('id', 'name', 'id_code', 'participants') + fields = ('id', 'name', 'id_code', 'anonymousMembers') class ParcoursSerializer(serializers.ModelSerializer): diff --git a/backend/api/room/views.py b/backend/api/room/views.py index 8ce1a9f0..0b31308d 100644 --- a/backend/api/room/views.py +++ b/backend/api/room/views.py @@ -25,37 +25,56 @@ from .utils import getNow class RoomAPI(APIView): + def post(self, request, format=None): name = request.data.get('name') - nick = request.data.get('nick') - code = ''.join( - random.choices(string.ascii_uppercase, k=6)) - clientId = str(uuid4()) - room = Room(name=name, owner={'name': nick, 'code': code, "clientId": clientId}, participants=[{'nick': nick, 'owner': True, 'code': code, "clientId": clientId}] - ) - room.save() + + if request.user.is_authenticated: + room = Room(name=name, owner={ + "name": request.user.username, 'code': request.user.id_code, 'clientId': request.user.clientId}) + room.save() + clientId = request.user.clientId + code = request.user.id_code + room.userMembers.add(request.user) + else: + nick = request.data.get('nick') + code = ''.join( + random.choices(string.ascii_uppercase, k=6)) + clientId = str(uuid4()) + room = Room(name=name, owner={'name': nick, 'code': code, "clientId": clientId}, anonymousMembers=[{'nick': nick, 'owner': True, 'code': code, "clientId": clientId}] + ) + room.save() return Response({"data": {'id_code': room.id_code, "clientId": clientId, "code": code}}, status=status.HTTP_200_OK) def get(self, request, format=None): code = request.GET.get('code') room = None + try: room = Room.objects.filter(id_code=code)[0] except IndexError: return Response({'error': 'Aucune salle trouvée', 'code': '4044'}, status=status.HTTP_404_NOT_FOUND) clientId = request.GET.get('clientId') - participants = room.participants + participants = room.anonymousMembers + users = room.userMembers.all() + print(room.userMembers.all()) - if clientId not in list(map(lambda p: p['clientId'], participants)): + userInRoom = False + if request.user.is_authenticated: + userInRoom = len(request.user.room_set.filter( + id_code=room.id_code)) != 0 + + if clientId not in [p['clientId'] for p in participants] and not userInRoom: return Response({'error': 'Non autorisé', 'code': '401'}, status=status.HTTP_401_UNAUTHORIZED) admin = False if clientId == room.owner['clientId']: admin = True + online = room.online # "challenger": list(map(lambda c: {'nick': p['nick'], "validate": c['validate'], 'exos': list(map(lambda e: {'endAt': e['endAt'], 'note': e['note']}, p['exos']))}, p.challenger)) - return Response({"data": {"room": {**RoomSerializer(room).data, "waiters": room.waiters if admin == True else [], "participants": list(map(lambda p: {'nick': p['nick'], 'owner': p['owner'], 'online': p['online'], "code": p['code'] if admin == True else ""}, participants)), 'parcours': list(map(lambda p: {**ParcoursSerializer(p).data}, room.parcours_set.all()))}}}, status=status.HTTP_200_OK) + return Response({"data": {"room": {**RoomSerializer(room).data, "waiters": room.waiters if admin == True else [], "participants": [{'nick': p['nick'], 'owner': p['clientId'] == room.owner['clientId'], 'online': p['code'] in online, "code": p['code'] if admin == True else "", 'status': "anonymous"} for p in participants] + [{"status": "user", 'nick': u.username, 'owner': u.clientId == room.owner['clientId'], 'online': u.id_code in online, 'code': u.id_code if admin == True else ""} for u in users], 'parcours': [ParcoursSerializer(p).data for p in room.parcours_set.all()]}}}, status=status.HTTP_200_OK) def delete(self, request, format=None): code = request.data.get('code') @@ -105,7 +124,13 @@ class RoomAPI(APIView): @api_view(['GET']) def RoomExist(request, id_code): if Room.objects.filter(id_code=id_code).count() > 0: - return Response({'data': {"id_code": id_code}}, status=status.HTTP_200_OK) + userInRoom = False + if request.user.is_authenticated: + room = Room.objects.filter(id_code=id_code)[0] + userInRoom = len(request.user.room_set.filter( + id_code=room.id_code)) != 0 + + return Response({'data': {"id_code": id_code, 'is_auth': userInRoom}}, status=status.HTTP_200_OK) else: return Response({'error': 'Aucune salle trouvée', 'code': '4044'}, status=status.HTTP_404_NOT_FOUND) @@ -153,9 +178,13 @@ class ChallengeAPI(APIView): room = parcours.room participants = list( - filter(lambda p: p['code'] == user_code, room.participants)) + filter(lambda p: p['code'] == user_code, room.anonymousMembers)) + userInRoom = True + if request.user.is_authenticated: + userInRoom = len(request.user.room_set.filter( + id_code=room.id_code)) != 0 - if(len(participants) == 0): + if len(participants) == 0 and not userInRoom: return Response({'error': 'Vous n\'êtes pas un participant'}, status=status.HTTP_401_UNAUTHORIZED) exos = parcours.exercices @@ -200,6 +229,8 @@ class ChallengeAPI(APIView): exos = request.data.get('exos') parcours_id = request.data.get('id_code') user_code = request.data.get('user_code') + if request.user.is_authenticated: + user_code = request.user.id_code correct_code = request.data.get('correct_code') parcours = Parcours.objects.filter(id_code=parcours_id) @@ -214,14 +245,18 @@ class ChallengeAPI(APIView): correctionDB = corrections[0] participants = list( - filter(lambda p: p['code'] == user_code, room.participants)) - if(len(participants) == 0): + filter(lambda p: p['code'] == user_code, room.anonymousMembers)) + userInRoom = True + if request.user.is_authenticated: + userInRoom = len(request.user.room_set.filter( + id_code=room.id_code)) != 0 + + if len(participants) == 0 and not userInRoom: return Response({'error': 'Vous n\'êtes pas un participant'}, status=status.HTTP_401_UNAUTHORIZED) # Corriger selon la correction les exos envoyé dans exos.exos student_answer = exos['result'] correction = correctionDB.correction - inpppp = 0 def corrige(ans): correctionExos = list( @@ -234,7 +269,8 @@ class ChallengeAPI(APIView): correctInputs = exoCorrect['inputs'] print('correcti', correctInputs) - studentsInput = sorted(a['inputs'], key=lambda i: i.get('order')) + studentsInput = sorted( + a['inputs'], key=lambda i: i.get('order')) print('correctiinnnn\n\n', studentsInput) corrigedInputs = [{**inp, "value": studentsInput[inp['order']]['value'], "isCorrect": (str(studentsInput[inp['order']]['value']) == str( inp['correction'])) if inp['correction'] != "" else None} for inp in correctInputs] @@ -243,26 +279,25 @@ class ChallengeAPI(APIView): return {**ans, "exos": corrigedList} corriged = list((map(corrige, student_answer))) - - #l6 = uniquement les isCorrect + + # l6 = uniquement les isCorrect l2 = [exs['exos'] for exs in corriged] l4 = [ex['inputs'] for exs in l2 for ex in exs] l5 = [ex for exs in l4 for ex in exs] l6 = [e['isCorrect'] for e in l5] - - + note = { "total": len(l6), "value": l6.count(True), "isTrust": l6.count(None) == 0 } adding_challenger = Parcours.objects.challenge( - parcours_id, user_code, {"result": corriged, "timer": exos['timer'], "note": note}) + parcours_id, user_code, {"result": corriged, "timer": exos['timer'], "note": note}, request.user.is_authenticated) correctionDB.delete() - + channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)(f"owner__{room.id_code}", { - 'type': "challenge_parcours", 'id_code': parcours_id, "participant": participants[0], "validate": adding_challenger['validate'], 'exos': {'note': note, 'endAt': getNow(), "timer": exos['timer']}}) + 'type': "challenge_parcours", 'id_code': parcours_id, "participant": participants[0] if not request.user.is_authenticated else {'nick': request.user.username,'code': request.user.id_code,'clientId': request.user.clientId}, "validate": adding_challenger['validate'], 'exos': {'note': note,"code": adding_challenger['code'], 'endAt': getNow(), "timer": exos['timer']}}) return Response({"data": {"exos": corriged, "note": note}}, status=status.HTTP_200_OK) def put(self, request, format=None): @@ -272,7 +307,7 @@ class ChallengeAPI(APIView): clientId = request.data.get('clientId') user_code = request.data.get('user_code') note = request.data.get('note') - + print(f'PARCOURS: {parcours_id}') parcours = Parcours.objects.filter(id_code=parcours_id) if len(parcours) == 0: @@ -282,7 +317,7 @@ class ChallengeAPI(APIView): print(f'CLIENTID COMPARE: {room.owner["clientId"]}\n{clientId}') if room.owner['clientId'] != clientId: return Response({'error': 'Pas les droits'}, status=status.HTTP_401_UNAUTHORIZED) - + challenger = list( filter(lambda p: p['code'] == user_code, parcours.challenger)) @@ -300,10 +335,11 @@ class ChallengeAPI(APIView): date = getNow() condition = parcours.success_condition parcours.challenger = [ - *list(filter(lambda p: p['code'] != user_code, parcours.challenger)), {**challenger[0], "validate": date if note['value'] * 20 / note['total'] >= condition else False ,"exos": [*list(filter(lambda c: c['code'] != challenge_code, trys)), {**challenge, "result": result, "note": note}]}] + *list(filter(lambda p: p['code'] != user_code, parcours.challenger)), {**challenger[0], "validate": date if note['value'] * 20 / note['total'] >= condition else False, "exos": [*list(filter(lambda c: c['code'] != challenge_code, trys)), {**challenge, "result": result, "note": note}]}] parcours.save() return Response({"data": {}}, status=status.HTTP_200_OK) + class ParcoursAPI(APIView): def delete(self, request, format=None): @@ -394,9 +430,12 @@ class ParcoursAPI(APIView): room = parcours.room participants = list( - filter(lambda p: p['code'] == user_code, room.participants)) + filter(lambda p: p['code'] == user_code, room.anonymousMembers)) + userInRoom = True + if request.user.is_authenticated: + userInRoom = len(request.user.room_set.filter(id_code = room.id_code)) != 0 - if(len(participants) == 0): + if len(participants) == 0 and not userInRoom: return Response({'error': 'Vous n\'êtes pas un participant'}, status=status.HTTP_401_UNAUTHORIZED) exos = parcours.exercices diff --git a/backend/api/uploads/exercices/exo_BCCMKX/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_BCCMKX/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3abe6766c21b56bcf376b1584c871bb4585bf0f5 GIT binary patch literal 375 zcmYjLOG?B*5be%q24tpkBQy9#zkc$6G95_xp1>4gH6PA)+u`gsS%f0RwK>oIwQf2b*(@AbICJ zY;V~l{S6K_Q^Z5ig(6g)1p*F{CU-pRMoJphnz!x4d_TWGe#p=AlP~7uVC(6x6_2h& zVYJcGiYr`;%DX32jaZ>YFB@$AqQSb+b|tR+)%s{KiKSG}XhFzIi?%XOLM`wGz0wLv zxy5BsOmFT)DYZSQUb}<@MX4!&#(f%Em(Zh0+>N}n;L6Q1t-Q8PA9 mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_CYLRGK/main.py b/backend/api/uploads/exercices/exo_CYLRGK/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_CYLRGK/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_DAABOY/main.py b/backend/api/uploads/exercices/exo_DAABOY/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_DAABOY/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_DLILZI/main.py b/backend/api/uploads/exercices/exo_DLILZI/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_DLILZI/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_DSMBIT/main.py b/backend/api/uploads/exercices/exo_DSMBIT/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_DSMBIT/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_EJTHGG/main.py b/backend/api/uploads/exercices/exo_EJTHGG/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_EJTHGG/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ERDIGN/main.py b/backend/api/uploads/exercices/exo_ERDIGN/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_ERDIGN/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ERWXNC/__pycache__/sc.cpython-310.pyc b/backend/api/uploads/exercices/exo_ERWXNC/__pycache__/sc.cpython-310.pyc deleted file mode 100644 index 6a2fab24b6298aa5b556552c6b45a0e90affa29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmYjM%Sr<=6wPC%lxqLL#cYdU@Uc`8s<`Vy7fOqiG`Y0VOfn=hLv^d4;ScyrvvuV! zxblXA?S*^pJ%_`|jUNsN1dFd>F~j+t$ZjztSJ?3YK@&|anG(%3{~%KeOlR+uqIyq8 z`42kCL?zrUj%17-(?gnK2K!{_=aaX+zevc?zlGnG zSoso!HP%QcuAvoG@Xw%Xu>=P}*3g7`4Y4+EDQ^EIv5@KooSwHQLRLmJmGx3b0c!}# zC`g;1-`qVsPR1gtqw2NGN@-j=JEq?cXz1bSvXnjIT`x$deYp|yDi~L9uiR{T^7qe6 RuNw=OG$o~oKIyZ4{s&v?RNepp diff --git a/backend/api/uploads/exercices/exo_FHVTJW/main.py b/backend/api/uploads/exercices/exo_FHVTJW/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_FHVTJW/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_HFVALR/main.py b/backend/api/uploads/exercices/exo_HFVALR/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_HFVALR/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ILOXKD/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_ILOXKD/__pycache__/main.cpython-310.pyc deleted file mode 100644 index 19e99958ff0788a07c6afe1a710f2b2ed830fce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmYjN!Ab)$5KXe%T6B98yvbgRV6cKG6+uBnsRu7ok&-5%re-%wk}X=+gWwm4Hx=~g zFYVP+f5DTJg3^I`^WID*Gl^-pml4?W_T%sc;&%{>MnD{ZyHx;z1lFjJ1QF2_>SKW~ zP$!;21@(BqKMP$=@I!F71K`mIoEGGhJS=itp;siL3IoO!s_+`<_Xf;qyb-v&*_&bL zo`oH!ak`OSP2=lyFYS=J$(iP*t|RUyL0XmzlhsQhs@y}0_$~167qX%KXH0KQCaG3h zv78>s2`#J{OYZ4N=F&1ROFQt=d6kdo@qdaA8NZde7)-j96^fRHHcU7w@1*65%fQUw z mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_JBSHGQ/main.py b/backend/api/uploads/exercices/exo_JBSHGQ/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_JBSHGQ/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_JMHGZF/main.py b/backend/api/uploads/exercices/exo_JMHGZF/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_JMHGZF/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_JWZWEK/main.py b/backend/api/uploads/exercices/exo_JWZWEK/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_JWZWEK/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_KSDQGB/main.py b/backend/api/uploads/exercices/exo_KSDQGB/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_KSDQGB/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_LIWCTT/main.py b/backend/api/uploads/exercices/exo_LIWCTT/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_LIWCTT/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_LLJYOU/__pycache__/sc.cpython-310.pyc b/backend/api/uploads/exercices/exo_LLJYOU/__pycache__/sc.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..182661cb25f268c17c05c47465723b62d0bbc5b4 GIT binary patch literal 382 zcmYjN%Sr<=6iqS@O0|FBVzxyv_*kk43WAin5Er&cNs~*BW|AS9DeBgKfFGbA;3xPi zvvuV!xblWBrU&lh91i#1#0>_0f_VS_oKLa-M6wBnXsF+IF5PKu);YjY`#Y)qTTu>2xE zMSqw60)KENaHEYDmS4btoZ^gcu_;+XElUc+XcVuq~*Z|<8vXOz$z{(&6~LA|O7ih@X~co2IjX)?CaY_cS~#d_7p@CAGgA7ihc zd<9QVDA*3nH}idbe3`i6a6quWRxrEA`5no2F(hZ$VHZIWMGct{#Z>Z6CKQ-T-zY`( zj#SwXI><;y+^z)4Id+H-DT*2FgP}hey%q=MUU^iWloji9DU9q)pET<6llT mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_MIYMCI/main.py b/backend/api/uploads/exercices/exo_MIYMCI/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_MIYMCI/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_NWPRJY/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_NWPRJY/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..496f9a2043aed9af252b07fb0cad63b8743046df GIT binary patch literal 384 zcmYjNOG*SW5KYn_+R?dzi{1``!Ov1fP!L=Uq6={b88S&RM$<`?{-AF47J30szvxHp{($kNkWXM07p3M+X`E0M zhiC9oO9-7?OmDBQFYkCEwB0RVx;Ql94ORGx5%npSE)I((QI~pQl`Gc6r1aX>{mJVt V3Ht1)aH=tILW5JV$VkSvqJN}STA=^{ literal 0 HcmV?d00001 diff --git a/backend/api/uploads/exercices/exo_NWPRJY/main.py b/backend/api/uploads/exercices/exo_NWPRJY/main.py new file mode 100644 index 00000000..fcc4aeb6 --- /dev/null +++ b/backend/api/uploads/exercices/exo_NWPRJY/main.py @@ -0,0 +1,6 @@ +import random + +def main(): + return {'calcul': f'1 + [3] = 4', 'csv': None} + +print('test') \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_OFCURK/main.py b/backend/api/uploads/exercices/exo_OFCURK/main.py new file mode 100644 index 00000000..8e7a4444 --- /dev/null +++ b/backend/api/uploads/exercices/exo_OFCURK/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_OVXGUV/main.py b/backend/api/uploads/exercices/exo_OVXGUV/main.py new file mode 100644 index 00000000..8e7a4444 --- /dev/null +++ b/backend/api/uploads/exercices/exo_OVXGUV/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_OXNZFQ/main.py b/backend/api/uploads/exercices/exo_OXNZFQ/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_OXNZFQ/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_PPALJX/main.py b/backend/api/uploads/exercices/exo_PPALJX/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_PPALJX/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_PQLBUC/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_PQLBUC/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba29a5452e7d69c6a076db2cc091df0b39b4d5eb GIT binary patch literal 384 zcmYjN%}N6?5KgkYWvLclz{6e_!QjtPMXcbZ6h*wWNJ*2SMzhJ1{XxCzTj&e;0zS-M zJ^2croY2E|V7{4e`1ocLHyRBI#`n(0a*p*Ukj-F7&M~W91Vt1zWJVNI(L0$@U@Cs2 z6sNZ&PkvEBrZV7WL`cS%Ram4bdazH1`e^#Pb&&04^P~IhG&{~&H;}@}#&nUa+Arc` z)c5e$@CR1_H`-`n`6aZx^zIR4%~xQ-iy9igsG+L0UGb}a)E;gyz7+Batm2~7yeW+n zs^ahrUTO)UbBpVn$;I867ed?p@}-MI6W&mTuNYE4z|zHGQ66;zFRXIKdYF`6+qyq_ X-6cVvo)k_s2F_@33Kl6z*>>~~dH`B$ literal 0 HcmV?d00001 diff --git a/backend/api/uploads/exercices/exo_PQLBUC/main.py b/backend/api/uploads/exercices/exo_PQLBUC/main.py new file mode 100644 index 00000000..fcc4aeb6 --- /dev/null +++ b/backend/api/uploads/exercices/exo_PQLBUC/main.py @@ -0,0 +1,6 @@ +import random + +def main(): + return {'calcul': f'1 + [3] = 4', 'csv': None} + +print('test') \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_QLAFXX/main.py b/backend/api/uploads/exercices/exo_QLAFXX/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_QLAFXX/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_SDYANR/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_SDYANR/__pycache__/main.cpython-310.pyc deleted file mode 100644 index 7b4af6d14100959b17e6417caae95865f2cb3891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmY*T%W48K6isFnis%>g3ue;`-3d}E3f;}3uIgrp$;HNIl90)WUAG_MFZfHd?O$}| zje?H@_n!MW2aX$!28^&DtJNd%Us`UF(eg^w45=xm_%B;Bl`UA2OS;@4X=hX?Z6xgv z=j0)6Rxb01O~Jdq58B293rT!x{~P#pHGoS)BPA S>OAH2>mDZLX$`(yUF-;%9YqWP diff --git a/backend/api/uploads/exercices/exo_SDYANR/sc.py b/backend/api/uploads/exercices/exo_SDYANR/sc.py deleted file mode 100644 index 81624407..00000000 --- a/backend/api/uploads/exercices/exo_SDYANR/sc.py +++ /dev/null @@ -1,6 +0,0 @@ -import random - -def main(): - return {'calcul': f'1 + [3] = 4', 'web': None} - -print('test') \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_SJVJHE/main.py b/backend/api/uploads/exercices/exo_SJVJHE/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_SJVJHE/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_SVIAAH/main.py b/backend/api/uploads/exercices/exo_SVIAAH/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_SVIAAH/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_SVXONQ/main.py b/backend/api/uploads/exercices/exo_SVXONQ/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_SVXONQ/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_TNRSWU/main.py b/backend/api/uploads/exercices/exo_TNRSWU/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_TNRSWU/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_UAEYYI/main.py b/backend/api/uploads/exercices/exo_UAEYYI/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_UAEYYI/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_UAXLRP/main.py b/backend/api/uploads/exercices/exo_UAXLRP/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_UAXLRP/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_UFSEDX/main.py b/backend/api/uploads/exercices/exo_UFSEDX/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_UFSEDX/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ULLYHV/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_ULLYHV/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65ab44b798a0da9cbb8e56b3157b005890e6cbb4 GIT binary patch literal 357 zcmYjMu}%Xq40Y0Sv=v?Xhb~xRMhFQc7^*G^B)U{-VwFHHIpr=D?0g0z3%_&{3rsBi z045w5?kxHFJ^NX4!gM+Tj?dlO`h)9N7X6Sc&N%Bs1_MSoSi%^LG=mpd3L~yzHvHxp zEOf?x3|O3V*7*q|cw4?o_74^<%w$_=<#cjw5vfkDd55^iz7Bp8-iMOVS!b2U3)*58 z!vpCCH{>a*hEiNLR5#Xd@Um-dk9!K&N4~DYnlcNkoB90i>K037 w{ZaMY4l^0&yYuHKBJOj^_eSMSDF0-4qCpa1{> literal 0 HcmV?d00001 diff --git a/backend/api/uploads/exercices/exo_ULLYHV/main.py b/backend/api/uploads/exercices/exo_ULLYHV/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_ULLYHV/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_USMQMO/main.py b/backend/api/uploads/exercices/exo_USMQMO/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_USMQMO/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_VWWHMG/main.py b/backend/api/uploads/exercices/exo_VWWHMG/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_VWWHMG/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_WLNRLB/main.py b/backend/api/uploads/exercices/exo_WLNRLB/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_WLNRLB/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_WNILCK/main.py b/backend/api/uploads/exercices/exo_WNILCK/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_WNILCK/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_YCBXCU/__pycache__/main.cpython-310.pyc b/backend/api/uploads/exercices/exo_YCBXCU/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f7fa8cccd300616e9511653308bba58ef3abb4c GIT binary patch literal 357 zcmYjMu}%Xq40UqlXe+w%4_&atj1ZzoY+Vo%l%Yx!s|0e%DR-%0=QH2~_!{Xemamfi#j=CB>`JYiPOd8>HOaN_5ck;E!%xEdP!T%otnzq4JFH`P zAl>4YJVn(~itCn|*7_}8_O0FVK;cH|NAd<$Z86m@DAOQ4QPfsbW?_B1IKNq3W2LM= vs-L@2CX;-3{`^$LeJ=UlsJsc)pX{&vXC+&@@ktd-a&#*4a&C=5%7gM3)0 mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_YZPQZN/main.py b/backend/api/uploads/exercices/exo_YZPQZN/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_YZPQZN/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ZFSJTJ/main.py b/backend/api/uploads/exercices/exo_ZFSJTJ/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_ZFSJTJ/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_ZTCHJJ/main.py b/backend/api/uploads/exercices/exo_ZTCHJJ/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_ZTCHJJ/main.py @@ -0,0 +1,10 @@ +import random + +""" +Fonction main() qui doit renvoyer un objet avec: + calcul: le calcul a afficher + result: la correction du calcul (pas de correction -> mettre None) +""" + +def main(): + return {"calcul": "", "result": None} \ No newline at end of file diff --git a/backend/api/users/__init__.py b/backend/api/users/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/api/users/__pycache__/__init__.cpython-310.pyc b/backend/api/users/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4abfba38cbaf0867ee8884c6557004cec22522ab GIT binary patch literal 191 zcmd1j<>g`k0~vm6}|lpPrhRT9jClT3Qrel3HAnnU}8bju0v{LgMKsB_?O5=B4N- q7G&y|7N-^!>&M4u=4F<|$LkeT-r}&y%}*)KNwovnUCaa|SQr3?Trw;G literal 0 HcmV?d00001 diff --git a/backend/api/users/__pycache__/admin.cpython-310.pyc b/backend/api/users/__pycache__/admin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..236fe1f61030c8f51bc54b55cee686f343bc7c33 GIT binary patch literal 762 zcmZuvJ&zMH5ViLsyV*+uxYau0A^c1a$B- zkoXmDsqQaOG2;{o5?*=q=8ZM;{MP+^UNKxhzkgZ(;*9;K7rOk+bP4%=D$aoKW?$z}!P&P2 zPfp*lW%Yn_*pi1_Y1?)P77Yw?^x&lJH5g>3?=gE#and8dn7UgGx8F#r=>Gm$_lGRVaQ3Q=m_a52>hs!hYAW2dMn zlq9uN7H*bRD5WGQWvC>{9}VG|l%Gar4i#76m{2OMo7B|AEa*m z-l)4D%$;K`hCj02_7-Z>npSo78@R3auHV6Cs2k|OsR2eO2k=ANHTCt8x_xny)oZo+ z2%WCgzOCs7zK;H{_IGZIqezOUmr}Bf(^v7x-z*nmp?7F`zuNTO;M%oI@L0I`mt3iF z*t!%e;@N*Ht2oTjV+%Rm-A5k|-b|tc-jRklG-SRVAe0UoGzHwzj03u$Hs#BM->>L@ P`UQp=r|&WC8QER=x%i^<$0dj6Q!*j9X9U228$sKYMsn=^aNB4=wKlle O{_@i8)H=Z-8;gH^uy|Gg literal 0 HcmV?d00001 diff --git a/backend/api/users/__pycache__/forms.cpython-310.pyc b/backend/api/users/__pycache__/forms.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6813d49a64156c992857a2c9bfee232c1d381f2d GIT binary patch literal 1027 zcmZ`%JCD;q5Z;Hq*$c@LjtFt^3*5vKH9{u^aSfzFG}~BCb}w=8BdqO{xc08&k8po! zTdJ$+5Ct)Hov2U{6Nrs9)Jt@<$DmCXqu9YDoRmj zDa*LxnWsF!TzjdX2_-1GB-+>Fj%Z=LTdsP5ds+gPh69%R0CtE9-$@&F7mqCc(6s>sm2z$D$r0bIcU`2vI?ifW=55TKd? z0d~t2*Br`w?%6)ev{U3DBNoMs<+zj4aOG*Le9a&izj=8)*W`n#VjwJQpqj^-nFYeh zC_*)gTtAAkLf0wkgDCn^$7$=a0!ld_oF;YRDlw@p?}>d3)<*n_!c~!(Fip}V&cnCn zI^5V|Z5CCyG`X>HWojE$rmT{D8D8#9*RMJ#oX3mLCf8xSNkU{;hRrG_o3GA8<~{5h zsYv2cN$nF*XZN1Pld+Fb3{aqX&#l!)XpS#X0aYDX51O(?ivoF zc58VKQQJl1T8zII>z?Xq3aeo^=f|=&i zBeG}z3wa6-oY{6F%%Wu$oH(J^aQKB~fZcfuCW|7kY%-t3b+wu_yJ>mhJe_FHqik-a c8Elj57*i)-w|DjihgRbH24qABbi~Kv56IHnasU7T literal 0 HcmV?d00001 diff --git a/backend/api/users/__pycache__/models.cpython-310.pyc b/backend/api/users/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21455270fbcf56970f0c941837c0586858980bda GIT binary patch literal 1344 zcmZuxyKdY@6rBg(T1$?iC`cj%0aDS$5-?I3hT%YdAVt(fY1lAa&S;kuAFCPCkPW$# zTXp^bsmw3rQ>IO&UvQe7AtlImGK+h7@8xjj&beo{yLT@l7<-c~^MvNE!%V1bBuoi3mmXj)+M5 z=RA!B{f)#M*Vu_1#MHRMP>P@6cugl{t>MjnUg%!sMgO~&s<0Dp2ZQ6m_F?)FK+v}& zL{XQdrxojY<(v`WT(B$pmiBJtRsIfuLGvdD{L*@`4zm&t%CbTV-|U%xgxw+m%MTb>MZJn07Z z)|&u_GPX;1DWeW!|EOK0J|W&R!eJxv58#BP2j%DF91ZAMH4)E1vMYDBssr%eGtz~kY#P&$SgBa zmO&#!ZT(r6oeX(By-^&?n5|#)_VrhTlm4kT@y#oc5-CzdpO$O!GJ{UKHa1|fec(OAqVvHz*V1dpfVKe43iZ9qT*6oMb0(SQfxPV_IC CMm#nE literal 0 HcmV?d00001 diff --git a/backend/api/users/__pycache__/serializers.cpython-310.pyc b/backend/api/users/__pycache__/serializers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0004f6ebcdd4dfbc6efe7fc9e12283a74228ae3e GIT binary patch literal 710 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 Mzf63ra+mG#e~h5oF#rGn literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0004_customuser_id_code.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0004_customuser_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fce177ec2c85890b3d27af69708d4ffc7002516 GIT binary patch literal 670 zcmYjPy>8S%5Z)jA?6VRHQG^#jNY~t+0wqF0AX1Tr&dqAiGx6E@k6k+o5*;)Yc>&%a zue2>yUI7V(Stsajr5Wuv-*~>6@%G2Z8KZNX{M`QHjQtMa@I(a8$lMEZz<@Wb7f%kY%b#yHo0r-&BU)WdZtU9- z*A~mlQ49gEd*`z~<&z3@LG5{VcS>DQsRZ!SOwC9mm}}i&SB|@tBov0wooUfWvyU$; zY~X@gN%b7p+Gko*-qax7kF@?WnI_~01UO&^*cBBzD@eswS!)l{Za@9|0vwy&`mRf%2r0w=3SbYs<(>UHW-KtRlaJ+H_^V hhV4A(Jl#z0CwaI%qdGo){jjk&^ahy=8c)QD{09yUykh_W literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0005_alter_customuser_id_code.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0005_alter_customuser_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..378587eb4b116aa6150c22602c2e8e112a32dde2 GIT binary patch literal 723 zcmZuv&2H2%5VoD)4Xsom)IP&r)~gC`2o-_oiC(znVtF&uY=V<)Z5oeFY>`#@VfQ4_NZZ-#6o#@#pD|k26N=XYzgZi!=7ygToaPxS(wpWPkxTtl>Ft zL@v0;!UTDE$smC68-oye9eoY*2*d|AkM8LXn+umURoUyI>RRjKrUNwgs_?$Ul@Pd~ zZO_Rd%Q>)I055qSU|3T|2r#Y_OzXIwK?u>EfcP#Te+CIvOWo}KV;QO$jTU>GpDmZm z=c*X(&^4Y>6{vzbaM_-7$&S4DrRi=0c&$e>P~-ZOGT4^GdL9t+t*cfy=)%cH*A*JL znm=)=ns}vLrWD1E2I+jH)Xk`kkM#&}gDqfNRA_rawOsbv4A{T(S^B^evo~wK!;#0& zN^Fs|Lp8S5&4|0^yNxHkpg&lDN`aI4^F^+^2BoP?rCa$HZ{?=%YAgo%m}czNfOe?b zQeN&d6LoujfaFRSAE{5NH7gaq~{Bzeb@g{b+P%}`-$;?X`hlwnFzv%FcMtw z6CVCeA141ib~C7TTXqXrO-gKEe>9a_Y)7Q`0!-oi7j92yJ9zC1kT}7G zLqCK+;9K^}slR}P%B%xQMw-#Sneo1v=dF*ABSyA}zAt}r#(p_)Xg+~Ua`Th|FyNY% zJmsZG1!q?b1bE*Vc*r;2S1D5 zI@8vr%gX{}MkCm0pR-}63#{5V@cGFKPF1$VWO6o77L)l!GM`+m5}2HyW{X8Kn`3sK z-OXr5A{qj&RHs{7P<@mdtGr#0Jwk3pS*a4O-^XB8poVK2G?aZ_N*hT@eVs-+A4&P4 zQ`+@91h~Ztu*wQFjUX-?z5sab?r1y*M=#f^>9LLKE&kK?2Ww8K+K1m?;&okOtP5SJ zDt?7G@wTZqn6+_^mHPs_Mz(0$qRQi|ed=a*fa0af-qR?t+7@xIYP|oIG3mQFRCXs~ z0n_cL#=VyTxp_z-WWw|B{XlTRkGTIQyzlGRW8aQoqpG}~!m?kqU#~CjSJ|B&(LFYN Rwv+5RJyB*H#{+TV{RQ+o!-@a^ literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0007_alter_customuser_clientid.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0007_alter_customuser_clientid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb4094fe88f5a5a04fa9008164084a513efcc72b GIT binary patch literal 704 zcmZuv&2G~`5Z+zeiDR`ALZU+AijZ_BRhA?zJV`~;Ut#Cr*fTPXZO)rC78k`_2{aeSE}=rqPjLkIv*(YvDK-m zH3+c8959a(tSdoUo%bSbuzGE7sVqZ`Uas{PcV1EA-^G4s)dR}*;n%fX7a7VlNfVvR zS9m4Ms@P!E$QX0;1-6xHux^q(mKQtf>Ua;yrH(#OGg6m{>{lvx|54I%&y+T;{cpw7 z@^fXL%z(VUPr+rvvhQq1aKR6_{oB3k^Os}08^K2BaWREuKX5-}pWF?!Jsr_Ko%?LN Py65ytS#31#i6iR|fDObx literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0008_alter_customuser_clientid.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0008_alter_customuser_clientid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6957a4ec823a852f6139366e96a83c9167c52568 GIT binary patch literal 710 zcmZ`%J#W-N5ZztdcRnkT5Jl*y5YiQQdr5F|NC*Xih$u)y=VrC%o%8uvf5dA?KpWb0 z)b#uY{>ip9(4KX@05@q4(ytb;0)b7#-NCz zniMpl1xpwu=R`5(eJ08Sy7sQU#8dt|G7fIBmW-K=iacv%n^&c=gQ8NPP3ls+HbiiS zZl)N3Bvg@vDVov51AiSj0T`@@%2$CJ+%Pq~@h}&v5QRo|^!A?u$_1T)#@L6m+3ZwE z-9jVM&a_qGc#-NH$~IRv+LAWhuy53-N3o0#(^Sd{oX+QyC&wqtiHzgpi9C6_lyiW? zIF`3Z*d!_q6)a_^TbxjS5E{y?U5!0NZbnhc0<7Q1V3~tf7uabidR_<{34wK;20ZTx zaoI`jY8_HgL#d!lb1)44XHdE?pld`6rp?QYpKqzFqaDN-GJTKDa9QWPUo7ALO^z#`|9{2P z`eWlB&H&xq#}E?c`FDQ6D5HDS{~g}-`HQh{M`|t0teUDtKX5-}pWF_#IX%F8Z1`-m Py65;-iE$eD*n#&4tscof literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0009_alter_customuser_clientid_alter_customuser_id_code.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0009_alter_customuser_clientid_alter_customuser_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aed55f20439d9e56b29af161ce0614a46b4e0416 GIT binary patch literal 826 zcmZ`%yN(kv6tz8%Ooptq1wtSp`ZRI06-Wpz0 z?Sc%lgab%#qkpmZ5X(h!4eBgDW;9lv1{)uoHrjgM!RCzUQI8SeW!jsLE|-2%2CKYV zO+7;Hda6oGwEkd&ON|EXNQ25KwwO+Aq=p2gY^)R&^ag1^QR=EsjVp2paE%pUm1%4n zdKzZqmyYTi*RJuLWBh8B?r`An{TwSKp;7gfzUpb|=^A&uj)slvwM%tx@{=_WseCZE zKjf+|Q5tP@TFKXVE!Rz5VAjcf^S)6XwwT-RquNG{XtBe9q1TFXIfdH4d7 zWPkR5+3!Yn%FWiF8}}VYG~35yA|^clj~@sw_$l{)A9m60kU0(Q7>cyY>lrKu4Y#^Y k21>K-Pi&lYL;695?d}l;Z1jBlKrgsEHY9T@BL2Yp3m-!7E&u=k literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0010_alter_customuser_clientid.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0010_alter_customuser_clientid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477b358bdf9d05cd44f1e55051afbe9b6812a455 GIT binary patch literal 757 zcmZWny>8S%5Z+z?oX;dugit7{uQ{7E2nnGe5D^7w=-jM)o{4YG+P--02e`&ph-i$_O5Y)eNI5tmfcDa3>(V^T;2=jH*R;{&iP|Y6gSB&SY=WG<_>` z-D4+=TOIs~}E2Cyj882`h%Qwki_-`ix})|hCeRo*0@@Fv-G zZG}aj?9vRK?9ue9DU*xG%w)PbJ3z@QFTPWsNxo6ZNOQ7(;3Q37r%!3!5x(5~?A%Vd z*EY{dMND}9gC7Vk_zCy_MGvEY5!yLac~iDaSdCOn;~$OnmeUe-j)5_JKjL(INe&ym Sn|OXti_J_(>O@5R)cX%(K-%~K literal 0 HcmV?d00001 diff --git a/backend/api/users/migrations/__pycache__/0010_alter_customuser_id_code.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0010_alter_customuser_id_code.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3de67cb6e59261adf9b6046a36a76dd5cb2382c2 GIT binary patch literal 766 zcmZ`%O^eh(5bf@KOeXGvEFyaIn#&|Ef(RljihFV|ddj8gN!4Z&JIQQ1S@f!2_vWAQ zFZI>a;=#KhYjtLp84w$~==Z8pA1~D%9>$E$qo3cFzc^z*9N0fTffKrBK?WFb%^IHb zM&yD!EVP&VrwlyszcTQV*TEMr4?w(QNpMZyuteCnsmfjrRo5CDHXWcgXNB|apNPN- zUGsztvYZ3U1@MyR9{M$91P{Y{hEW~XbMPU6@XCYPl}8aVL{x8X=WlNdQPp5H*cdCLjArN>$IC)j*bWu^>mjb79&NmfwzDmHeN4^0PdqyVJXfP0Xg2jxYHZ74 zWy7(pE=DAGJWVNE)u8n!8=P0D;VijhBRTO>+E_}88#U7VK+20zX&37d;2K-Nwy4nb zf{NPsr5oXm%hG#}n7>-7Ee;&MS7M7KGs;aH+bO!WBc1l&S^t0nC-eJry6PHCb)_rS zrmyibUH4s$#gN{n8GAXP8LGBSPq&$gx;)-P=~5LRsLxcbt8|h(-Tmq`%N}R{m3OiJ z)Vt-H(KSb8A|^cl#t#G+{D}L1qMON|gmwg`k0~vm6}|lpPrhRT9jClT3Qrel3HAnnU}8bju0v{LgMKsB_?O5=B4N- z7G&y|7N-^!>*r>s12t#n=N0S6$7kkcmc+;F6;$5hu*uC&Da}c>139CZ2}rOo008~{ BHlqLl literal 0 HcmV?d00001 diff --git a/backend/api/users/models.py b/backend/api/users/models.py new file mode 100644 index 00000000..18803e9e --- /dev/null +++ b/backend/api/users/models.py @@ -0,0 +1,36 @@ +import random +import string +from uuid import uuid4 +from django.db import models + +# Create your models here. +from django.contrib.auth.models import AbstractUser +from django.db import models + + +def generate_unique_code(): + length = 10 + + while True: + code = ''.join(random.choices(string.ascii_uppercase, k=length)) + if CustomUser.objects.filter(id_code=code).count() == 0: + break + + return code +def generate_unique_uuid(): + + while True: + code = str(uuid4()) + if CustomUser.objects.filter(clientId=code).count() == 0: + break + + return code + + +class CustomUser(AbstractUser): + # Any extra fields would go here + registeredExos = models.ManyToManyField("exercices.Exercice") + id_code = models.CharField(default=generate_unique_code, max_length=50, unique = True) + clientId = models.CharField(default=generate_unique_uuid, max_length=50, ) + def __str__(self): + return self.email \ No newline at end of file diff --git a/backend/api/users/serializers.py b/backend/api/users/serializers.py new file mode 100644 index 00000000..20a2508c --- /dev/null +++ b/backend/api/users/serializers.py @@ -0,0 +1,7 @@ +from rest_framework.serializers import ModelSerializer +from .models import CustomUser + +class UserSerializer(ModelSerializer): + class Meta: + model = CustomUser + fields = ('email', 'last_login', 'date_joined', 'is_staff', 'username', "id_code") diff --git a/backend/api/users/tests.py b/backend/api/users/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/backend/api/users/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/api/users/urls.py b/backend/api/users/urls.py new file mode 100644 index 00000000..30ef29c8 --- /dev/null +++ b/backend/api/users/urls.py @@ -0,0 +1,5 @@ +from django.urls import include, path +urlpatterns = [ + path('auth/', include('dj_rest_auth.urls')), + path('auth/register/', include('dj_rest_auth.registration.urls')) +] diff --git a/backend/api/users/views.py b/backend/api/users/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/backend/api/users/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/frontend/apis/exoInstance.instance.js b/frontend/apis/exoInstance.instance.js index eb320394..638b0461 100644 --- a/frontend/apis/exoInstance.instance.js +++ b/frontend/apis/exoInstance.instance.js @@ -1,5 +1,5 @@ import axios from "axios"; -import { csrftoken } from "../utils/utils.js"; +import { csrftoken, isBrowser } from "../utils/utils.js"; export const exoInstance = axios.create({ baseURL: `${process.env.NEXT_PUBLIC_HOST}/api/exos/`, @@ -7,6 +7,11 @@ export const exoInstance = axios.create({ "Content-Type": "application/json", Accept: "application/json", "Access-Control-Allow-Origin": "*", - "X-CSRFToken": csrftoken != undefined ? csrftoken: '', + "X-CSRFToken": csrftoken != undefined ? csrftoken : "", + Authorization: isBrowser + ? localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null + : null, }, }); \ No newline at end of file diff --git a/frontend/apis/roomInstance.intance.js b/frontend/apis/roomInstance.intance.js index 808276a7..61a8b87c 100644 --- a/frontend/apis/roomInstance.intance.js +++ b/frontend/apis/roomInstance.intance.js @@ -1,5 +1,5 @@ import axios from "axios"; -import { csrftoken } from "../utils/utils.js"; +import { csrftoken, isBrowser } from "../utils/utils.js"; export const roomInstance = axios.create({ baseURL: `${process.env.NEXT_PUBLIC_HOST}/api/room/`, @@ -8,5 +8,10 @@ export const roomInstance = axios.create({ Accept: "application/json", "Access-Control-Allow-Origin": "*", "X-CSRFToken": csrftoken != undefined ? csrftoken : "", + Authorization: isBrowser + ? localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null + : null, }, }); diff --git a/frontend/apis/users.instance.js b/frontend/apis/users.instance.js new file mode 100644 index 00000000..fce255b8 --- /dev/null +++ b/frontend/apis/users.instance.js @@ -0,0 +1,17 @@ +import axios from "axios"; +import { csrftoken, isBrowser } from "../utils/utils.js"; + +export const usersInstance = axios.create({ + baseURL: `${process.env.NEXT_PUBLIC_HOST}/api/users/auth`, + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + "X-CSRFToken": csrftoken != undefined ? csrftoken : "", + Authorization: isBrowser + ? localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null + : null, + }, +}); diff --git a/frontend/components/Input.jsx b/frontend/components/Input.jsx new file mode 100644 index 00000000..f4cf8813 --- /dev/null +++ b/frontend/components/Input.jsx @@ -0,0 +1,15 @@ +import styles from '../styles/input.module.scss'; +import { parseClassName } from '../utils/utils.js'; + +export default function Input(props) { + const id = Math.random() + return ( + + + + + + ); +} \ No newline at end of file diff --git a/frontend/components/Layout.js b/frontend/components/Layout.js index 89de4204..63c4cf69 100644 --- a/frontend/components/Layout.js +++ b/frontend/components/Layout.js @@ -1,15 +1,16 @@ import Head from "next/head"; import NavBar from "./NavBar.jsx"; -export default function Layout({children, page}){ - return (<> - - {page} - -
- -
- {children} - - ) -} \ No newline at end of file +export default function Layout({ children, page }) { + return ( + <> + + {page} + +
+ +
+
{children}
+ + ); +} diff --git a/frontend/components/NavBar.jsx b/frontend/components/NavBar.jsx index 13d7b020..4fc2c87d 100644 --- a/frontend/components/NavBar.jsx +++ b/frontend/components/NavBar.jsx @@ -35,15 +35,15 @@ export default function NavBar() { Fiches PDF
- {/* + - Home + Room - */} + ); } diff --git a/frontend/components/Notifications.jsx b/frontend/components/Notifications.jsx index 308c0bcb..15f18950 100644 --- a/frontend/components/Notifications.jsx +++ b/frontend/components/Notifications.jsx @@ -55,12 +55,6 @@ export default function Notifications({ id = "default-notif", fade = true }) { } else { // add alert to array with unique id notif.itemId = Math.random(); - /* console.log(notification.length, 'poupiuoiuoiu', notification) - if (notification.length > 5) { - console.log('trop cest trop', notification) - removeAlert(notification[0]) - } - setNotif((alerts) => [...alerts, notif]); */ addNotif(notif) @@ -97,7 +91,6 @@ export default function Notifications({ id = "default-notif", fade = true }) { function addNotif(notif) { if (notification.length > 5) { - console.log("trop cest trop", notification); removeAlert(notification[0]); } setNotif((alerts) => [...alerts, notif]); @@ -134,7 +127,6 @@ export default function Notifications({ id = "default-notif", fade = true }) { [NotificationType.Info]: styles["notif-info"], [NotificationType.Warning]: styles["notif-warning"], }; - console.log('class', notifTypeClass[notif.type], notif.type) classes.push(notifTypeClass[notif.type]); if (notif.fade) { diff --git a/frontend/components/exos/Card.jsx b/frontend/components/exos/Card.jsx index 60259068..029fcde3 100644 --- a/frontend/components/exos/Card.jsx +++ b/frontend/components/exos/Card.jsx @@ -2,15 +2,17 @@ import Link from "next/link"; import { useRouter } from "next/router"; import React, { useEffect, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; -import { delTag, setTags } from "../../requests/requests.exos.js"; +import { delTag, favExo, setTags } from "../../requests/requests.exos.js"; import { notificationService } from "../../services/notification.service.js"; import styles from "../../styles/exos/Card.module.scss"; -import { parseClassName } from "../../utils/utils.js"; +import { isBrowser, parseClassName } from "../../utils/utils.js"; import Delete from "../icon_component/delete.jsx"; import Tag from "../Tag.jsx"; import { TagCreatable } from "./TagCreate.jsx"; +import { BsBookmark, BsBookmarkFill } from "react-icons/bs"; +import { HiOutlineDuplicate } from "react-icons/hi"; -function CardComp({ step, setActive, deleted, tags }) { +function CardComp({ step, setActive, deleted, setRegistered, tags, queryKey }) { const [tagMode, setTagMode] = useState(false); const router = useRouter(); const [selected, setSelected] = useState([]); @@ -19,8 +21,23 @@ function CardComp({ step, setActive, deleted, tags }) { const { mutate } = useMutation( async () => await setTags({ step: step.id_code, tags: [...selected] }), { - onSuccess: () => { - queryClient.invalidateQueries("exo-data"); + onSuccess: (data, variables, context) => { + queryClient.setQueryData(queryKey, (old) => { + console.log("test old", old); + return { + ...old, + results: [ + ...old.results.map((r) => { + if (r.id_code === data.data.id_code) { + return { ...r, tags: data.data.tags }; + } + return r; + }), + ], + }; + }); + queryClient.invalidateQueries(queryKey[0], { inactive: true }); + queryClient.invalidateQueries("tags"); setSelected([]); notificationService.success("Tags", `Tags de ${step.name} modifiés !`, { @@ -28,7 +45,8 @@ function CardComp({ step, setActive, deleted, tags }) { }); setTagMode(false); }, - onError: () => { + onError: (data) => { + console.log("ERROR", data); notificationService.error( "Erreur", `Les tags de ${step.name} n'ont pu être modifiés !` @@ -43,12 +61,54 @@ function CardComp({ step, setActive, deleted, tags }) { }, { onSuccess: (data) => { - console.log("aouyeaoiuyfea", data); - queryClient.invalidateQueries("exo-data"); - queryClient.invalidateQueries("tags"); + var tagsSelected = queryKey[2].tags || null; + if (tagsSelected && tagsSelected.includes(data.data.tagId)) { + queryClient.invalidateQueries(queryKey); + } + queryClient.setQueriesData(queryKey, (old) => { + console.log("test old", old); + return { + ...old, + results: [ + ...old.results.map((r) => { + if (r.id_code === data.data.id_code) { + return { ...r, tags: data.data.tags }; + } + return r; + }), + ], + }; + }); + queryClient.invalidateQueries(queryKey[0], { inactive: true }); notificationService.success( "Tags", - `Tag ${data.name} retiré à ${step.name} !`, + `Tag ${data.data.name} retiré à ${step.name} !`, + { + autoClose: true, + } + ); + setTagMode(false); + }, + onError: (e) => { + console.log(e); + notificationService.error( + "Erreur", + `Le tag n'a pu être retiré de ${step.name} !` + ); + }, + } + ); + const { mutate: favMutation } = useMutation( + async (tag) => { + return await favExo(step.id_code); + }, + { + onSuccess: (data) => { + console.log("aouyeaoiuyfea", data); + queryClient.invalidateQueries("exo-data"); + notificationService.success( + "Enregistré", + `Exercice ${step.name} enregistré !`, { autoClose: true, } @@ -139,21 +199,45 @@ function CardComp({ step, setActive, deleted, tags }) { deleted ? styles["no_hover"] : undefined, ])} > -

Exemples

- {step.exemple.slice(0, 3).map((ex, i) => { - return ( -

- {ex.calcul} -

- ); - })} -

...

+ {step.exemple.data && ( +

+ Exemples ({step.exemple.type && step.exemple.type}) +

+ )} + {step.exemple.data && + step.exemple.data.slice(0, 3).map((ex, i) => { + return ( +

+ {ex.calcul} +

+ ); + })} + + {step.exemple.data &&

...

} + {!step.exemple.data &&

Exemples indisponibles

} {/* {modal == false &&
} */} + {isBrowser && localStorage.getItem("token") != null && !step.isUser && ( +
{ + favExo(step.id_code).then((res) => { + console.log("REGISTERED", res.isRegistered); + setRegistered(res.isRegistered); + }); + }} + > + +
+ )}
@@ -166,7 +250,7 @@ function CardComp({ step, setActive, deleted, tags }) { : styles["ex_card--footer-not-tag"], ])} > - {tagMode == false && ( + {tagMode == false && localStorage.getItem("token") != null && ( <>
{step.tags.map((t, i) => { @@ -221,6 +305,7 @@ const StepsCardCompar = (prv, nxt) => { prv.step.name == nxt.step.name && prv.step.exo_model == nxt.step.exo_model && prv.step.model_type == nxt.step.model_type && + prv.step.isRegistered == nxt.step.isRegistered && prv.step.consigne == nxt.step.consigne ); }; diff --git a/frontend/components/exos/ExoCreateForm.jsx b/frontend/components/exos/ExoCreateForm.jsx index 2b444c37..9fda57dc 100644 --- a/frontend/components/exos/ExoCreateForm.jsx +++ b/frontend/components/exos/ExoCreateForm.jsx @@ -6,39 +6,45 @@ import { notificationService } from "../../services/notification.service.js"; import styles from "../../styles/exos/ExoCreateForm.module.scss"; import { CODE_SEPARATOR, PYTHON_DEFAULT } from "../../utils/constant.js"; import { csrftoken, isEmpty, parseClassName } from "../../utils/utils.js"; +import Input from "../Input.jsx"; import ModelInput from "./modelInput.jsx"; -export default function ExoCreateForm({ cancel }) { +export default function ExoCreateForm({ cancel, addExo }) { const [newExo, setNewExo] = useState({ name: "", consigne: "", - exo_model: {data: PYTHON_DEFAULT, filename: null}, + exo_model: { data: PYTHON_DEFAULT, filename: null, download: false }, + private: false }); const queryClient = useQueryClient(); const [errors, setErrors] = useState({ - name: null, + name: null, consigne: null, - exo_model: null - }) - const[test, setTest] = useState() + exo_model: null, + }); + const [test, setTest] = useState(); + const { mutate, isLoading, data } = useMutation( () => { var data_sent = new FormData(); var blob = new Blob([newExo.exo_model.data], { type: "text/x-python", }); - var file = new File([blob], "main.py", { + var file = new File([blob], newExo.exo_model.filename ? newExo.exo_model.filename: 'main.py', { type: "text/x-python", }); data_sent.append("file", file); - data_sent.append('name', newExo.name) - data_sent.append('consigne', newExo.consigne) + data_sent.append("name", newExo.name); + data_sent.append("consigne", newExo.consigne); + data_sent.append("private", newExo.private); return createExo(data_sent); }, { onSuccess: (data) => { - queryClient.invalidateQueries("exo-data"); + console.log("SUUUUCESS", data) + //queryClient.invalidateQueries("exo-data"); + addExo(data.data) notificationService.success( "Nouvel exercice", `Exercice ${newExo.name} crée !`, @@ -47,14 +53,14 @@ export default function ExoCreateForm({ cancel }) { cancel(); }, onError: (err) => { - var resetErrors = { - name: null, - exo_model: null, - consigne: null, - }; + var resetErrors = { + name: null, + exo_model: null, + consigne: null, + }; var newError = { ...resetErrors, ...err.response.data.errors }; - console.log(err, err.response, 'errs') + console.log(err, err.response, "errs"); setErrors({ ...newError }); notificationService.error( "Erreur", @@ -66,6 +72,7 @@ export default function ExoCreateForm({ cancel }) { ); const [full, setFull] = useState({ state: false, fade: false }); + const fadeFull = (state) => { setFull({ state: !state, fade: state }); setTimeout(() => { @@ -74,10 +81,7 @@ export default function ExoCreateForm({ cancel }) { }; return ( -
+
Nouvel exercice
- { + //setErrors({ ...errors, name: null }); setNewExo({ ...newExo, name: e.target.value, @@ -116,15 +116,19 @@ export default function ExoCreateForm({ cancel }) {

); })} - { + //setErrors({...errors, consigne: null}) + setNewExo({ + ...newExo, + consigne: e.target.value, + }); + }} + placeholder="Consigne" + /> {errors.consigne !== null && errors.consigne.map((err, i) => { @@ -134,13 +138,27 @@ export default function ExoCreateForm({ cancel }) {

); })} + +
+ + { + console.log(e.target); + setNewExo({ ...newExo, private: !newExo.private }); + }} + /> +
)} {setNewExo({...newExo, exo_model: n})}} + setModel={(n) => { + setNewExo({ ...newExo, exo_model: n }); + }} step={{ ...newExo, name: newExo.name == "" ? "Nouveau" : newExo.name, @@ -149,7 +167,7 @@ export default function ExoCreateForm({ cancel }) { setNewExo({ ...newExo, exo_model: new_model }); }} tempSpec={newExo} - /> + /> {errors.exo_model !== null && errors.exo_model.map((err, i) => { return ( @@ -160,12 +178,7 @@ export default function ExoCreateForm({ cancel }) { })} {full.state == false && (
-
-

Exemples

- +
+ {step.exemple.data && ( +

+ Exemples ({step.exemple.type && step.exemple.type}) +

+ )} + {step.exemple.data && + step.exemple.data.slice(0, 3).map((ex, i) => { + return ( +

+ {ex.calcul} +

+ ); + })} + + {step.exemple.data &&

...

} + {!step.exemple.data &&

Exemples indisponibles

} +
diff --git a/frontend/components/exos/ModalCard.jsx b/frontend/components/exos/ModalCard.jsx index 5da8c647..9ba6366c 100644 --- a/frontend/components/exos/ModalCard.jsx +++ b/frontend/components/exos/ModalCard.jsx @@ -18,15 +18,15 @@ import { } from "../../requests/requests.exos.js"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { TagCreatable } from "./TagCreate.jsx"; +import Link from "next/link"; -export default function ModalCard({ step, onClose, onDelete, tags }) { +export default function ModalCard({ step, onClose, onDelete, tags, queryKey }) { + const [tagMode, setTagMode] = useState(false); const alert = useAlert(); const [edit, setEdit] = useState(false); const queryClient = useQueryClient(); - - const { isLoading: isUpdating, @@ -38,7 +38,6 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { { initialData: step, refetchOnWindowFocus: !edit } ); const [selected, setSelected] = useState([]); - console.log(step_data); const [tagOptions, setTagOptions] = useState( tags.map((tag) => { return { @@ -48,7 +47,6 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { }) ); - useEffect(() => { setTagOptions( tags.map((tag) => { @@ -68,17 +66,37 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { const { mutate: setTagMutate } = useMutation( async () => await setTags({ step: step.id_code, tags: [...selected] }), { - onSuccess: () => { - queryClient.invalidateQueries("exo-data"); - queryClient.invalidateQueries(step.id_code); + onSuccess: (data) => { + //queryClient.invalidateQueries(step.id_code); + queryClient.setQueryData(['exo-data', step.id_code],(old) => { + return {...old, tags: data.data.tags} + }) + console.log(queryKey) + queryClient.setQueryData(queryKey, (old) => { + console.log('TEST OLD', old) + return { + ...old, + results: [ + ...old.results.map((r) => { + if (r.id_code === data.data.id_code) { + return { ...r, tags: data.data.tags }; + } + return r; + }), + ], + }; + }); queryClient.invalidateQueries("tags"); + queryClient.invalidateQueries(queryKey[0], { inactive: true }); + setSelected([]); notificationService.success("Tags", `Tags de ${step.name} modifiés !`, { autoClose: true, }); setTagMode(false); }, - onError: () => { + onError: (e) => { + console.log('error', e) notificationService.error( "Erreur", `Les tags de ${step.name} n'ont pu être modifiés !` @@ -93,11 +111,33 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { }, { onSuccess: (data) => { - queryClient.invalidateQueries("exo-data"); + var tagsSelected = queryKey[2].tags || null; + if (tagsSelected && tagsSelected.includes(data.data.tagId)) { + queryClient.invalidateQueries(queryKey); + } + queryClient.setQueryData(["exo-data", step.id_code], (old) => { + return { ...old, tags: data.data.tags }; + }); + queryClient.setQueryData(queryKey, (old) => { + console.log("test old", old); + return { + ...old, + results: [ + ...old.results.map((r) => { + if (r.id_code === data.data.id_code) { + return { ...r, tags: data.data.tags }; + } + return r; + }), + ], + }; + }); + queryClient.invalidateQueries(queryKey[0], { inactive: true }); + queryClient.invalidateQueries("tags"); notificationService.success( "Tags", - `Tag ${data.name} retiré à ${step.name} !`, + `Tag ${data.data.name} retiré à ${step.name} !`, { autoClose: true, } @@ -113,34 +153,7 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { } ); - const { mutate, isLoading } = useMutation( - async () => { - onDelete(step_data.id_code); - await delExo(step_data.id_code); - }, - { - onMutate: () => { - onClose(); - }, - onSuccess: (data, variables, context) => { - onDelete(step_data.id_code); - queryClient.invalidateQueries("exo-data"); - notificationService.success( - "Suppression", - `Exercice ${step_data.name} supprimé !`, - { autoClose: true, keepAfterRouteChange: true } - ); - }, - onError: (err) => { - notificationService.error( - "Erreur", - "La suppression n'a pu être effectuée ! Réessayez plus tard !", - { autoClose: true, keepAfterRouteChange: true } - ); - }, - } - ); - + const [full, setFull] = useState({ state: false, fade: false }); const fadeFull = (state) => { setFull({ state: !state, fade: state }); @@ -175,10 +188,15 @@ export default function ModalCard({ step, onClose, onDelete, tags }) {
)} - {!(isFetching || isUpdating) && ( + {!(isFetching || isUpdating) && ( <> {!edit && full.state == false && ( -
{step_data.name}
+
+ {step_data.name} + {step_data.original != null && + Exercice original + } +
)} {!edit && full.state == false && } @@ -257,7 +275,7 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { className={parseClassName([styles["icon"]])} onClick={onClose} /> -
+ {step_data.isUser == true &&
{ @@ -266,7 +284,17 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { active: true, message: `Vous allez supprimer l'exercice ${step_data.name} ! Cette action est irréversible !`, type: AlertType.Warning, - validate: mutate, + validate: () => { + delExo(step.id_code).then(() => { + notificationService.success( + "Suppression", + `Exercice ${step_data.name} supprimé !`, + { autoClose: true, keepAfterRouteChange: true } + ); + onDelete(step.id_code) + onClose() + }) + }, }); }} /> @@ -276,7 +304,7 @@ export default function ModalCard({ step, onClose, onDelete, tags }) { setEdit(true); }} /> -
+
}
)}
diff --git a/frontend/components/exos/Pagination.jsx b/frontend/components/exos/Pagination.jsx index 94e3ec0a..b52f364e 100644 --- a/frontend/components/exos/Pagination.jsx +++ b/frontend/components/exos/Pagination.jsx @@ -1,22 +1,33 @@ +import { useRouter } from "next/router"; import React, { useState } from "react"; import { useEffect } from "react"; import styles from "../../styles/exos/Paginaton.module.scss"; import { parseClassName } from "../../utils/utils.js"; -export function Pagination({ pages, setPage, page }) { +export function Pagination({ setPage, page, pages }) { var pages = new Array(pages - 1).fill(0).reduce( (p, n, i) => { return [...p, i + 2]; }, [1] - ) + ); + const router = useRouter(); return (
- {page != 0 && ( + {page != 1 && (

{ setPage(page - 1); + var exo = router.query.exo || []; + router.push( + { + pathname: + "/exercices/" + exo.join("/"), + query: { page: page - 1 }, + }, + undefined, + { shallow: true } + ); }} className={styles["pagination-page"]} > @@ -30,12 +41,22 @@ export function Pagination({ pages, setPage, page }) {

{ - setPage && setPage(p - 1); + setPage && setPage(p); + var exo = router.query.exo || []; + router.push( + { + pathname: + "/exercices/" + exo.join("/"), + query: { page: p }, + }, + undefined, + { shallow: true } + ); }} className={parseClassName([ styles["pagination-page"], - (page == p - 1 ? styles["pagination-page-active"] : undefined)]) - } + page == p ? styles["pagination-page-active"] : undefined, + ])} > {p}

@@ -47,7 +68,17 @@ export function Pagination({ pages, setPage, page }) { <>

{ - setPage(pages[0] - 1); + setPage(pages[0]); + var exo = router.query.exo || []; + router.push( + { + pathname: + "/exercices/" + exo.join("/"), + query: { page: pages[0] }, + }, + undefined, + { shallow: true } + ); }} className={styles["pagination-page"]} > @@ -70,13 +101,21 @@ export function Pagination({ pages, setPage, page }) { return (

{ - setPage(p - 1); + setPage(p); + var exo = router.query.exo || []; + router.push( + { + pathname: + "/exercices/" + exo.join("/"), + query: { page: p }, + }, + undefined, + { shallow: true } + ); }} className={parseClassName([ styles["pagination-page"], - page == p - 1 - ? styles["pagination-page-active"] - : undefined, + page == p ? styles["pagination-page-active"] : undefined, ])} > {p} @@ -89,12 +128,23 @@ export function Pagination({ pages, setPage, page }) {

{ - setPage(pages[pages.length - 1] - 1); + setPage(pages[pages.length - 1]); + var exo = router.query.exo || []; + router.push( + { + pathname: + "/exercices/" + router.query.exo && + router.query.exo.join("/"), + query: { page: pages[pages.length - 1] }, + }, + undefined, + { shallow: true } + ); }} > {pages[pages.length - 1]} @@ -103,10 +153,20 @@ export function Pagination({ pages, setPage, page }) { )} )} - {page != pages.length - 1 && ( + {page != pages.length && (

{ setPage(page + 1); + var exo = router.query.exo || []; + console.log("PATHNAME", "/exercices/" + exo.join("/")); + router.push( + { + pathname: "/exercices/" + exo.join("/"), + query: { page: parseInt(page) + 1 }, + }, + undefined, + { shallow: true } + ); }} className={styles["pagination-page"]} > diff --git a/frontend/components/exos/modelInput.jsx b/frontend/components/exos/modelInput.jsx index 44a070ef..94fb5156 100644 --- a/frontend/components/exos/modelInput.jsx +++ b/frontend/components/exos/modelInput.jsx @@ -6,7 +6,9 @@ import { parseClassName } from "../../utils/utils.js"; import { MdOutlineOpenInNew } from "react-icons/md"; import { RiErrorWarningFill } from "react-icons/ri"; - +import { FiUpload } from "react-icons/fi"; +import { FaDownload } from "react-icons/fa"; +import { getExoModelFile } from "../../requests/requests.exos.js"; let CustomEditor; if (typeof window !== "undefined") { @@ -25,12 +27,13 @@ export default function ModelInput({ const [python, setPython] = useState(""); useEffect(() => { if (full) { - setPython(model.data ? model.data: PYTHON_DEFAULT); + setPython(model.data ? model.data : PYTHON_DEFAULT); } return () => { setPython(""); }; }, [full]); + return ( <> {!full && ( @@ -56,15 +59,36 @@ export default function ModelInput({ Ouvrir l'éditeur - {python !== model.model && } - - { - let text = await e.target.files[0].text().then((res) => res); - setModel({ filename: e.target.files[0].name, data: text }); - }} - /> + {/* {python !== model.model && } */} +

ou

+
+ { + let text = await e.target.files[0].text().then((res) => res); + var filename = e.target.files[0].name; + var splitting = filename.split("."); + if (splitting[splitting.length - 1] != "py") { + console.log("nope"); + } else { + setModel({ filename: e.target.files[0].name, data: text }); + } + }} + className={styles["inputfile"]} + /> + +
+ {model.filename == "" || !model.filename + ? "..." + : model.filename} + {model.download && { + getExoModelFile(step.id_code) + }}/>} +
+
)} @@ -97,7 +121,8 @@ export default function ModelInput({ showPrintMargin={false} validate={(e) => { e.preventDefault(); - onChange && onChange({data: python, filename: model.filename}); + onChange && + onChange({ data: python, filename: model.filename }); setFull(false); }} diff --git a/frontend/components/room/CreateParcours.jsx b/frontend/components/room/CreateParcours.jsx index f43f4527..bcec1b2b 100644 --- a/frontend/components/room/CreateParcours.jsx +++ b/frontend/components/room/CreateParcours.jsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; import { getExos, getTags } from "../../requests/requests.exos.js"; import { createParcours } from "../../requests/requests.room.js"; import { isBrowser } from "../../utils/utils.js"; +import Layout from "../Layout.js"; import SelectExo from "../pdf_gen/selectExo.jsx"; export default function CreateParcours({ roomCode, user }) { @@ -13,9 +14,12 @@ export default function CreateParcours({ roomCode, user }) { useEffect(() => { getExos("web").then((exos) => { setExos([ - ...exos.map((d) => { + ...exos.publicList.map((d) => { return { ...d, numberInExo: 10, numberOfExo: 1 }; - }), + }), + ...exos.userExos.map((d) => { + return { ...d, numberInExo: 10, numberOfExo: 1 }; + }), ]); }); return () => { @@ -38,6 +42,7 @@ export default function CreateParcours({ roomCode, user }) { }); return ( +
{exosList && tags && ( <> @@ -94,6 +99,7 @@ export default function CreateParcours({ roomCode, user }) { )} -
+
+ ); } diff --git a/frontend/components/room/HomePage.jsx b/frontend/components/room/HomePage.jsx new file mode 100644 index 00000000..cda17384 --- /dev/null +++ b/frontend/components/room/HomePage.jsx @@ -0,0 +1,16 @@ +import Link from "next/link"; +import Layout from "../../components/Layout.js"; + +export default function RoomHome() { + console.log('test') + return ( + + + Rejoindre + + + Creer + + + ); +} diff --git a/frontend/components/room/Join.jsx b/frontend/components/room/Join.jsx index d23668e2..191cec22 100644 --- a/frontend/components/room/Join.jsx +++ b/frontend/components/room/Join.jsx @@ -24,14 +24,34 @@ export default function Join() { .then((res) => { console.log("SerInfos"); connect(`ws://192.168.1.18:8000/ws/room/${res.id_code}`); + if (res.is_auth) { + router.push({ pathname: "/room/" + res.id_code }, undefined, { + shallow: true, + }); + } setInfos({ ...infos, pin: res.id_code, joined: false }); }) .catch((err) => { router.push({ pathname: "/room/join" }, undefined, { shallow: true }); }); } + return () => { + setInfos({ nick: "", pin: "", reconnectCode: "", joined: null }); + } }, []); const [errorRoom, setErrorRoom] = useState({ message: "" }); + useEffect(() => { + if (localStorage.getItem('token') != null && infos.joined == false) { + if (isConnected != false) { + send({ + data: { + type: "login", + nick: "", + }, + }); + } + } + }, [infos.joined]) return (
@@ -57,6 +77,15 @@ export default function Join() { setErrorRoom({ message: "" }); console.log(res, "errrrrrr", res.id_code); connect(`ws://192.168.1.18:8000/ws/room/${res.id_code}`); + if (res.is_auth) { + router.push( + { pathname: "/room/" + res.id_code }, + undefined, + { + shallow: true, + } + ); + } setInfos({ ...infos, joined: false }); }) .catch((err) => { diff --git a/frontend/components/room/Parcours.jsx b/frontend/components/room/Parcours.jsx index 0fd1c362..3a36a390 100644 --- a/frontend/components/room/Parcours.jsx +++ b/frontend/components/room/Parcours.jsx @@ -9,6 +9,7 @@ import { countOccurences, parseTimer } from "../../utils/utils.js"; import Input from "./InputExo.jsx"; import styles from "../../styles/room/parcours.module.scss"; import ParcoursExo from "./ParcoursExo.jsx"; +import Layout from "../Layout.js"; export default function Parcours({ parcours_id, user, roomCode }) { const router = useRouter(); @@ -150,6 +151,7 @@ export default function Parcours({ parcours_id, user, roomCode }) { return () => {}; }, [isCorr]); return ( +
{data && ( <> @@ -248,6 +250,6 @@ export default function Parcours({ parcours_id, user, roomCode }) { )} )} -
+
); } diff --git a/frontend/components/room/ParcoursEdit.jsx b/frontend/components/room/ParcoursEdit.jsx index 4dbdc292..46a294ef 100644 --- a/frontend/components/room/ParcoursEdit.jsx +++ b/frontend/components/room/ParcoursEdit.jsx @@ -1,21 +1,18 @@ import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { getExos, getTags } from "../../requests/requests.exos.js"; -import { editParcours, getParcoursInfos } from "../../requests/requests.room.js"; +import { + editParcours, + getParcoursInfos, +} from "../../requests/requests.room.js"; import { isBrowser } from "../../utils/utils.js"; import SelectExo from "../pdf_gen/selectExo.jsx"; -export default function ParcoursEdit({ - parcours_id, - room_code, - user -}) { +export default function ParcoursEdit({ parcours_id, room_code, user }) { const [parcours, setParcours] = useState(); - const router = useRouter() - - - const [options, setOptions] = useState({name: '', timer: 0}) + const router = useRouter(); + const [options, setOptions] = useState({ name: "", timer: 0 }); const [selected, setSelected] = useState([]); const [empty, setEmpty] = useState(false); @@ -26,10 +23,12 @@ export default function ParcoursEdit({ console.log("parcours", parcours); getParcoursInfos(parcours_id, user.code) .then((res) => { - setSelected([...res.exercices.map((ex)=>{ - return ex.id_code - })]) - setOptions({name: res.name, timer: res.timer}) + setSelected([ + ...res.exercices.map((ex) => { + return ex.id_code; + }), + ]); + setOptions({ name: res.name, timer: res.timer }); }) .catch((err) => { router.push({ pathname: "/room/" + room_code }); @@ -39,7 +38,10 @@ export default function ParcoursEdit({ useEffect(() => { getExos().then((exos) => { setExos([ - ...exos.map((d) => { + ...exos.publicList.map((d) => { + return { ...d, numberInExo: 10, numberOfExo: 1 }; + }), + ...exos.userExos.map((d) => { return { ...d, numberInExo: 10, numberOfExo: 1 }; }), ]); @@ -59,7 +61,6 @@ export default function ParcoursEdit({ }; }, []); - return (
- + } + }} + > + Save +
); -} \ No newline at end of file +} diff --git a/frontend/components/room/RoomPage.jsx b/frontend/components/room/RoomPage.jsx index 3e509f52..d5d10eaf 100644 --- a/frontend/components/room/RoomPage.jsx +++ b/frontend/components/room/RoomPage.jsx @@ -127,7 +127,7 @@ export default function RoomPage({ id_code, user }) { if (dataRoom) { let nick = data.nick; let code = data.code; - let chanName = data.chanName; + let status = data.status; let oldWaiters = dataRoom.room.waiters; setData({ @@ -135,7 +135,7 @@ export default function RoomPage({ id_code, user }) { ...dataRoom.room, waiters: [ ...oldWaiters, - { nick: nick, code: code, chanName: chanName }, + { nick: nick, code: code, status: status }, ], }, }); @@ -269,7 +269,7 @@ export default function RoomPage({ id_code, user }) { console.log("route", router); return ( -
+ <> {ws == null && user == undefined && ( <>
@@ -329,6 +329,6 @@ export default function RoomPage({ id_code, user }) { )} )} -
+ ); } diff --git a/frontend/components/room/RoomView.jsx b/frontend/components/room/RoomView.jsx index e0985dfb..dab05488 100644 --- a/frontend/components/room/RoomView.jsx +++ b/frontend/components/room/RoomView.jsx @@ -11,7 +11,6 @@ export default function RoomView({ room, user, id_code, setData }) { const { isConnected, connect, send } = useWebsocketContext() return ( -

{room.name} #{room.id_code} @@ -105,7 +104,12 @@ export default function RoomView({ room, user, id_code, setData }) { + )}

); })} @@ -152,7 +167,7 @@ export default function RoomView({ room, user, id_code, setData }) { type: "acceptParticipant", code: p.code, nick: p.nick, - chanName: p.chanName, + status: p.status }, }); setData({ @@ -190,7 +205,6 @@ export default function RoomView({ room, user, id_code, setData }) { )}

- -
+ ); } diff --git a/frontend/context/session.context.js b/frontend/context/session.context.js new file mode 100644 index 00000000..4660fe42 --- /dev/null +++ b/frontend/context/session.context.js @@ -0,0 +1,42 @@ +import { useRouter } from "next/router"; +import { createContext, useContext, useRef, useState } from "react"; +import ReconnectingWebSocket from "reconnecting-websocket"; +import { loginRequest, logoutRequest } from "../requests/requests.users.js"; +import { isBrowser } from "../utils/utils.js"; + +export const SessionContext = createContext({isLogin: false, login: ()=>{}, logout: ()=>{ + +}}); + +export const useSessionContext = () => { + return useContext(SessionContext); +}; + +export const SessionProvider = ({ children }) => { + const[authData, setAuthData] = useState() + + const isLogin = () => { + return localStorage.getItem('token') !== null + } + const router = useRouter() + const login = (token) => {//data = {username: "", password1: "", password2: ""} + localStorage.clear(); + localStorage.setItem("token", token); + } + const logout = () => { + if (localStorage.getItem('token') !== null) { + logoutRequest(localStorage.getItem('token')) + } + } + return ( + + {children} + + ); +}; diff --git a/frontend/context/websocket.context.js b/frontend/context/websocket.context.js index 9684e5aa..ca1a0f9c 100644 --- a/frontend/context/websocket.context.js +++ b/frontend/context/websocket.context.js @@ -4,7 +4,8 @@ import ReconnectingWebSocket from "reconnecting-websocket"; import { isBrowser } from "../utils/utils.js"; export const WebsocketContext = createContext({}); -export const useWebsocketContext = ()=>{return useContext(WebsocketContext)} +export const useWebsocketContext = () => { return useContext(WebsocketContext) } + export const WebsocketProvider = ({ children }) => { const ws = useRef(null); const [isConnected, setConnected] = useState(false); @@ -32,32 +33,6 @@ export const WebsocketProvider = ({ children }) => { } } }; - - /* const reconnect = (id_code, clientId) => { - if (ws.current == null && isBrowser) { - let tmpWs = new ReconnectingWebSocket( - `ws://192.168.1.18:8000/ws/room/${id_code}` - ); - tmpWs.send( - JSON.stringify({ - data: { - type: "reconnect", - clientId: clientId, - }, - }) - ); - //setWs(tmpWs); - ws.current = tmpWs; - ws.current.onmessage = (e) => { - messageHandlers.forEach((handler) => { - handler(e); - }); - }; - tmpWs = null; - } - }; - */ - const [messageHandlers, setMessageHandlers] = useState(new Set()); const addMessageHandler = (handler) => { @@ -76,16 +51,6 @@ export const WebsocketProvider = ({ children }) => { ws.current.send(JSON.stringify(data)); } }; - /* useEffect(() => { - if (isBrowser && ws != null) { - ws.onmessage = (e) => { - console.log("Handler principal", e); - messageHandlers.forEach((handler) => { - handler(e); - }); - }; - } - }, [ws, messageHandlers]); */ return ( {}, }); return ( + @@ -89,7 +91,8 @@ function MyApp({ Component, pageProps }) { - + + ); } diff --git a/frontend/pages/dashboard.jsx b/frontend/pages/dashboard.jsx new file mode 100644 index 00000000..4bd6ce62 --- /dev/null +++ b/frontend/pages/dashboard.jsx @@ -0,0 +1,32 @@ +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import Layout from "../components/Layout.js"; +import { useSessionContext } from "../context/session.context.js"; +import { getUser, logout, logoutRequest } from "../requests/requests.users.js"; + +export default function Dashboard() { + const router = useRouter() + const [user, setUser] = useState() + const {isLogin} = useSessionContext() + useEffect(() => { + if (!isLogin) { + router.push({pathname: '/login'}, undefined, {shallow: true}) + } else { + getUser(localStorage.getItem('token')).then((res) => { + setUser({...res}) + }) + } + return () => { + setUser() + } + }, []) + return + logged as {user && user.username} + + +} \ No newline at end of file diff --git a/frontend/pages/exercices/[[...exo]].jsx b/frontend/pages/exercices/[[...exo]].jsx index cf92d943..5f7597fd 100644 --- a/frontend/pages/exercices/[[...exo]].jsx +++ b/frontend/pages/exercices/[[...exo]].jsx @@ -1,9 +1,14 @@ import axios from "axios"; import Layout from "../../components/Layout.js"; -import { useState, useEffect, useCallback } from "react"; +import { useState, useEffect, useCallback, useRef } from "react"; import { Card } from "../../components/exos/Card.jsx"; -import { getExos, getTags } from "../../requests/requests.exos.js"; -import { useQuery } from "react-query"; +import { + getExos, + getPublicExos, + getTags, + getUserExos, +} from "../../requests/requests.exos.js"; +import { useQuery, useQueryClient } from "react-query"; import styles from "../../styles/exos/ExercicesPage.module.scss"; import Modal from "../../components/Modal.jsx"; import ModalCard from "../../components/exos/ModalCard.jsx"; @@ -11,61 +16,238 @@ import { useRouter } from "next/router"; import ExoCreateForm from "../../components/exos/ExoCreateForm.jsx"; import TagSelect from "../../components/exos/TagSelect.jsx"; import { FiLink } from "react-icons/fi"; -import { parseClassName } from "../../utils/utils.js"; +import { isBrowser, parseClassName } from "../../utils/utils.js"; import useFilter from "../../hooks/useFilter.hook.jsx"; import { Pagination } from "../../components/exos/Pagination.jsx"; -export default function ExercicesPage({ exos, tags }) { - //console.log("render"); - const [page, setPage] = useState(0); //correspond à l'index - const { isLoading, isError, data, isFetching } = useQuery( - ["exo-data"], - async () => await getExos(), +export default function ExercicesPage() { + const isAuth = isBrowser ? localStorage.getItem("token") != null : false; + + const router = useRouter(); + const { exo } = router.query; + const [page, setPage] = useState(1); //correspond à l'index + const [paginationData, setPagination] = useState({ + publicPages: null, + userExosPages: null, + }); + const [publicDataS, setPublicData] = useState([]); + const [userExosDataS, setUserExosData] = useState([]); + + const [selectFilter, setSelectFilter] = useState( + null + /* router.query.exo == "user" + ? "user" + : router.query.exo == "public" + ? "all" + : !isAuth + ? "user" + : "all" */ + ); + const queryClient = useQueryClient() + + const [search, setSearch] = useState(""); + const [tmpSearch, setTmpSearch] = useState(""); + + useEffect(() => { + const timeOutId = setTimeout(() => setSearch(tmpSearch), 500); + return () => { + clearInterval(timeOutId); + }; + }, [tmpSearch]); + + const [selectedOption, setSelectedOption] = useState([]); + + const { + isLoading, + isError, + data: publicData, + isFetching, + } = useQuery( + ["public-data", parseInt(page), { search, tags: selectedOption.map((t) => t.value) }], + async () => + await getPublicExos("all", page, { + search, + tags: selectedOption.map((t) => t.value), + }), + { - initialData: exos, refetchOnWindowFocus: false, + enabled: selectFilter == "all", + staleTime: 60000, keepPreviousData: true, } ); + + const { + isLoading: userLoading, + isError: userError, + data: userExosData, + isFetching: userFetching, + } = useQuery( + ["user-data", parseInt(page), { search, tags: selectedOption.map((t) => t.value) }], + async () => + await getUserExos("all", page, { + search, + tags: selectedOption.map((t) => t.value), + }), + { + refetchOnWindowFocus: false, + enabled: selectFilter == "user", + staleTime: 60000, + keepPreviousData: true, + } + ); + const { data: tagsData } = useQuery( ["tags"], async () => { return await getTags(); }, { - initialData: tags, + initialData: [], + staleTime: 2 * 60 * 1000, + initialDataUpdatedAt: 10 * 1000 * 60, } ); - const router = useRouter(); - const { exo } = router.query; const [activeData, setActiveData] = useState({ - active: exo != undefined, - data: exo == undefined ? null : data.filter((e) => e.id_code == exo)[0], + active: false, + data: null /* + exo == undefined || !publicData + ? null + : [...publicData.publicList, ...publicData.userExos].filter( + (e) => e.id_code == exo + )[0], */, }); - const [search, setSearch] = useState(""); - const [create, setCreate] = useState(false); - useEffect(() => { - setActiveData({ - active: exo != undefined, - data: exo == undefined ? null : data.filter((e) => e.id_code == exo)[0], - }); - return () => { - setActiveData({ active: false, data: {} }); - }; - }, [exo, data]); - const [deleted, setDeleted] = useState([]); - const [selectedOption, setSelectedOption] = useState(null); const [sortMode, setSortMode] = useState(false); // false == au moins 1 / true = tous - const [exData, setExData] = useState([]); + const [create, setCreate] = useState(false); - useFilter(data, selectedOption, search, setExData, sortMode); useEffect(() => { - if (exData.length != 0) { - setExData([ - ...exData.sort(function (a, b) { + if (publicData && router.query.page && selectFilter == "all") { + if (publicData.pages && parseInt(router.query.page) <= publicData.pages) { + setPage(parseInt(router.query.page)); + } else if ( + publicData.pages && + parseInt(router.query.page) > publicData.pages + ) { + var exo = router.query.exo || []; + router.push( + { + pathname: "/exercices/" + exo.join("/"), + query: { page: publicData.pages }, + }, + undefined, + { shallow: true } + ); + } else if (parseInt(router.query.page) == 0) { + var exo = router.query.exo || []; + router.push( + { + pathname: "/exercices/" + exo.join("/"), + query: { page: 1 }, + }, + undefined, + { shallow: true } + ); + } + } + if (userExosData && router.query.page && selectFilter == "user") { + if ( + userExosData.pages && + parseInt(router.query.page) <= userExosData.pages + ) { + setPage(parseInt(router.query.page)); + } else if ( + userExosData.pages && + parseInt(router.query.page) > userExosData.pages + ) { + var exo = router.query.exo || []; + router.push( + { + pathname: "/exercices/" + exo.join("/"), + query: { page: userExosData.pages }, + }, + undefined, + { shallow: true } + ); + } + } + }, [router.query.page, publicData, userExosData]); + const isLoad = useRef(false) + useEffect(() => { + if (exo !== undefined) { + if (exo[0] == "public") { + setSelectFilter("all"); + } else if (exo[0] == "user") { + if (isAuth) { + setSelectFilter("user"); + } else { + router.push({ pathname: "/exercices/public", query: { page: 1 } }); + } + } else { + + if (selectFilter === null) { + setSelectFilter(isAuth ? "user" : "public"); + } + getExos(exo[0]).then((res) => { + setActiveData({ active: true, data: { ...res } }); + }); + } + } else if (exo === undefined && isLoad) { + router.push({ + pathname: "/exercices/" + (isAuth ? "user" : "public"), + query: { page: 1 }, + }); + }/* + if (isLoad) { + setActiveData({ + active: exo != undefined, + data: + exo == undefined + ? null + : [...publicDataS, ...userExosData].filter( + (e) => e.id_code == exo + )[0], + }); + } */ + isLoad.current = true + return () => { + setActiveData({ active: false, data: null }); + }; + }, [exo]); + const inPage = 22; + + const filterData = (dataToFilter) => { + return dataToFilter + .filter((s) => { + if (!sortMode) { + return selectedOption.length != 0 + ? s.tags + .map((t) => t.id_code) + .some((r) => selectedOption.map((tt) => tt.value).includes(r)) + : s; + } else { + return selectedOption + .map((opt) => opt.value) + .every((r) => s.tags.map((tt) => tt.id_code).includes(r)); + } + }) + .filter((s) => { + return search + .toLowerCase() + .sansAccent() + .split(" ") + .every((n) => s.name.toLowerCase().sansAccent().includes(n)); + }); + }; + const [deleted, setDeleted] = useState([]); + + useEffect(() => { + if (publicDataS.length != 0) { + setPublicData([ + ...publicDataS.sort(function (a, b) { if (a.tags.length == 0 || b.tags.length == 0) { return 1; } @@ -77,10 +259,33 @@ export default function ExercicesPage({ exos, tags }) { ]); } return () => { - setExData([]); + setPublicData([]); }; - }, [exData.length]); - const inPage = 22; + }, [publicDataS.length]); + + + + const onClose = () => { + if (activeData.active == true) { + setActiveData({ active: false, data: { ...activeData.data } }); + queryClient.invalidateQueries( + selectFilter == "all" ? "public-data" : "user-data" + ); + router.push( + { + pathname: "/exercices/" + (selectFilter == "all" ? "public" : "user"), + query: { page: page }, + }, + undefined, + { shallow: true } + ); + setTimeout(() => { + setActiveData({ active: false, data: null }); + }, 300); // le temps de la transition + } else if (create == true) { + setCreate(false); + } + }; return (
- {(isLoading || isFetching) && ( -

- -

- )} + {isLoading || + isFetching || + ((userLoading || userFetching) && ( +

+ +

+ ))}
+ {isAuth && ( + + )}
-

- Tous les exercices -

+ {selectFilter == "all" && ( +

+ Tous les exercices +

+ )} + + {selectFilter == "user" && ( +

+ Tous vos exercices +

+ )} + {selectFilter == "user" && ( +

+ Vous retrouverez ici tous les exercices que vous avez créé ou + copié depuis les exercices publics +

+ )} + {selectFilter == "all" && ( +

+ Vous retrouverez ici tous les exercices crées par les autres + utilisateurs +

+ )}
- {exData.slice(page * inPage, (page + 1) * inPage).map((step) => { - return ( - - ); - })} - {exData.length == 0 &&

Aucun résultat

} + {selectFilter == "all" && + publicData && + publicData.results + //.sort((a, b) => a.id - b.id) + //.slice(page * inPage, (page + 1) * inPage) + .map((step) => { + return ( + e.value), + }, + ]} + key={step.id} + step={step} + setActive={setActiveData} + deleted={deleted.includes(step.id_code)} + tags={tagsData} + setRegistered={(reg) => { + console.log("SETREFI", reg); + setPublicData((t) => [ + ...t.filter((p) => p.id_code != step.id_code), + { ...step, isRegistered: reg }, + ]); + }} + /> + ); + })} + + {selectFilter == "user" && + userExosData && + userExosData.results.map((step) => { + return ( + e.value), + }, + ]} + key={step.id} + step={step} + setActive={setActiveData} + deleted={deleted.includes(step.id_code)} + tags={tagsData} + setRegistered={(reg) => {}} + /> + ); + })} + + {publicData && + publicData.results.length == 0 && + selectFilter == "all" &&

Aucun résultat

} + {userExosData && + userExosData.results.length == 0 && + selectFilter == "user" &&

Aucun résultat

}
- {exData.length > inPage && ( + + {selectFilter == "all" && publicData && publicData.pages != 1 && ( + + )} + + {selectFilter == "user" && userExosData && userExosData.pages != 1 && ( )}
- { - if (activeData.active == true) { - setActiveData({ active: false, data: { ...activeData.data } }); - router.push("/exercices", undefined, { shallow: true }); - setTimeout(() => { - setActiveData({ active: false, data: null }); - }, 300); // le temps de la transition} - } else if (create == true) { - setCreate(false); - } - }} - > + {activeData.data != null && create == false && ( e.value), + }, + ]} step={activeData.data} setActive={setActiveData} modal={true} - onClose={() => { - setActiveData({ active: false, data: { ...activeData.data } }); - router.push("/exercices", undefined, { shallow: true }); - setTimeout(() => { - setActiveData({ active: false, data: null }); - }, 300); - }} + onClose={onClose} onDelete={(id) => { if (!deleted.includes(id)) { setDeleted([...deleted, id]); @@ -216,6 +523,9 @@ export default function ExercicesPage({ exos, tags }) { cancel={() => { setCreate(false); }} + addExo={(newExo) => { + setUserExosData((s) => [...s, newExo]); + }} /> )} @@ -223,7 +533,7 @@ export default function ExercicesPage({ exos, tags }) { ); } -export async function getStaticProps() { +/* export async function getStaticProps() { const exos = await getExos(); const tags = await getTags(); return { @@ -233,11 +543,11 @@ export async function getStaticProps() { }, revalidate: 60, }; -} +} */ -export const getStaticPaths = async () => { +/* export const getStaticPaths = async () => { return { paths: [], //indicates that no page needs be created at build time fallback: "blocking", //indicates the type of fallback }; -}; +}; */ diff --git a/frontend/pages/fiches.jsx b/frontend/pages/fiches.jsx index b4afa602..f9d7bd0e 100644 --- a/frontend/pages/fiches.jsx +++ b/frontend/pages/fiches.jsx @@ -61,7 +61,6 @@ export default function Fiche({ exos, tags }) { const[empty, setEmpty] = useState(false) return ( -
{" "}
-
{charging && ( <>
diff --git a/frontend/pages/login.jsx b/frontend/pages/login.jsx new file mode 100644 index 00000000..67e0cfa9 --- /dev/null +++ b/frontend/pages/login.jsx @@ -0,0 +1,64 @@ +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import Input from "../components/Input.jsx"; +import Layout from "../components/Layout.js"; +import { useSessionContext } from "../context/session.context.js"; +import { loginRequest } from "../requests/requests.users.js"; +import styles from '../styles/login.module.scss' + +export default function Login() { + const [entry, setEntry] = useState({ username: "", password: "" }) + const [error, setError] = useState({ username: "", password: "" }) + const router = useRouter() + const {isLogin, login} = useSessionContext() + useEffect(() => { + console.log('LOCALSTORAGE', localStorage.getItem('token')) + if (localStorage.getItem('token') !== null) { + router.push({ pathname: "/dashboard" }, undefined, { shallow: true }); + } + }, []) + return ( + +
{ + e.preventDefault(); + loginRequest({ ...entry }) + .then((r) => { + console.log(r); + login(r.key); + router.push({ pathname: "/dashboard" }); + }) + .catch((err) => { + console.log(err.response.data); + setError({ ...err.response.data }); + }); + }} + > +
+ { + setEntry({ ...entry, username: e.target.value }); + }} + placeholder="Username" + error={error.username != "" && error.username != null} + /> + {error.username} + { + setEntry({ ...entry, password: e.target.value }); + }} + placeholder="Password" + error={error.password != "" && error.password != null} + /> + {error.password} +
+ + {error.non_field_errors} +
+
+ ); +} \ No newline at end of file diff --git a/frontend/pages/register.jsx b/frontend/pages/register.jsx new file mode 100644 index 00000000..ed9ad772 --- /dev/null +++ b/frontend/pages/register.jsx @@ -0,0 +1,77 @@ +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import Layout from "../components/Layout.js"; +import { useSessionContext } from "../context/session.context.js"; +import { registerNewUser } from "../requests/requests.users.js"; +import styles from "../styles/login.module.scss"; +export default function Register() { + const [entry, setEntry] = useState({ + username: "", + password1: "", + password2: "", + }); + const [error, setError] = useState({ + username: "", + password1: "", + password2: "", + non_field_errors: "", + }); + const router = useRouter(); + const { login, isLogin } = useSessionContext(); + + useEffect(() => { + if (localStorage.getItem('token') !== null) { + router.push({ pathname: "/dashboard" }, undefined, { shallow: true }); + } + }, []); + return ( + +
{ + e.preventDefault(); + registerNewUser({ ...entry }) + .then((r) => { + login(r.key); + router.push({ pathname: "/dashboard" }); + }) + .catch((err) => { + console.log(err.response.data); + setError({ ...err.response.data }); + }); + }} + > +
+ { + setEntry({ ...entry, username: e.target.value }); + }} + placeholder="Username..." + /> + {error.username} + { + setEntry({ ...entry, password1: e.target.value }); + }} + placeholder="Password..." + /> + {error.password1} + { + setEntry({ ...entry, password2: e.target.value }); + }} + placeholder="Confirmez le mdp..." + /> + {error.password2} +
+ + {error.non_field_errors} +
+
+ ); +} diff --git a/frontend/pages/room/[[...mode]].jsx b/frontend/pages/room/[[...mode]].jsx index 1b70f4dd..687a6379 100644 --- a/frontend/pages/room/[[...mode]].jsx +++ b/frontend/pages/room/[[...mode]].jsx @@ -17,6 +17,7 @@ import { WebsocketContext, WebsocketProvider, } from "../../context/websocket.context.js"; +import RoomHome from "../../components/room/HomePage.jsx"; export default function Room() { const router = useRouter(); @@ -106,8 +107,9 @@ export default function Room() { } case "accept_room": { let code = data.code; + let nick = data.nick; send({ - data: { type: "logAcceptedWaiter", code: code }, + data: { type: "logAcceptedWaiter", code: code , nick: nick}, }); break; } @@ -132,6 +134,7 @@ export default function Room() { } case "reconnected": { setUser({ clientId: data.clientId, user: data.identity }); + sessionStorage.setItem('clientId', data.clientId) break; } case "reconnectError": { @@ -148,10 +151,10 @@ export default function Room() { }; }); return ( - <> + {isEmpty(action ) && } {!isEmpty(action) && ( -
+ <> {action.mode[0] == "create" ? ( ) : action.mode[0] == "join" ? ( @@ -174,7 +177,7 @@ export default function Room() { user={user} /> )} -
+ )} ); diff --git a/frontend/requests/requests.exos.js b/frontend/requests/requests.exos.js index b50d8a53..d6644b71 100644 --- a/frontend/requests/requests.exos.js +++ b/frontend/requests/requests.exos.js @@ -1,27 +1,80 @@ import { exoInstance } from "../apis/exoInstance.instance.js"; -import { csvExtParse } from "../utils/utils.js"; +import { csvExtParse, isBrowser } from "../utils/utils.js"; export const getExos = async (code='all') => { - return await exoInstance.request({ - method: "GET", - url: "exercices/", - params: { code: code}, - }).then(res=>res.data.data) + return await exoInstance + .request({ + method: "GET", + url: "exercices/", + params: { code: code }, + headers: { + Authorization: + isBrowser ? + localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null: null + }, + }) + .then((res) => res.data.data); }; +export const getPublicExos = async (code='all', page=1, filter) => { + + return await exoInstance + .request({ + method: "GET", + url: "exercices/public", + params: { code: code, p : page == 0 ? 1: page, ...filter }, + headers: { + Authorization: + isBrowser ? + localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null: null + }, + }) + .then((res) => res.data); +}; +export const getUserExos = async (code='all', page=1, filters) => { + + return await exoInstance + .request({ + method: "GET", + url: "exercices/user", + params: { code: code, p : page == 0 ? 1: page, ...filters }, + headers: { + Authorization: + isBrowser ? + localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null: null + }, + }) + .then((res) => res.data); +}; + + + export const createExo = async (data) => { - return await exoInstance.request({ - url: `exercices/`, - data: data, - method: "POST", - }) + return await exoInstance + .request({ + url: `exercices/`, + data: data, + method: "POST", + headers: { + Authorization: + localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null, + }, + }) .then((res) => { - return res.data + return res.data; }) .catch((err) => { - throw err + throw err; }); //return response.data.data; }; @@ -75,7 +128,7 @@ export const delTag = async (data) => { method: 'DELETE', url: '/tags/', data: {...data} - }).then(res=>res.data.data) + }) } @@ -121,13 +174,38 @@ export const pdfGen = async (data) => { }) } -export const getModelFile = async (code) => { + + +export const favExo = async (code) => { return await exoInstance .request({ - method: "get", - url: `model/`, - params:{code: code} + method: "POST", + url: `fav/`, + data: { code: code }, }) + .then((res) => res.data.data); +} +export const getExoModelFile = async (code) => { + return await exoInstance + .request({ + method: "GET", + url: `model/`, + params: { id_code: code }, + }) + .then((res) => { + var name = res.headers['content-disposition'].split('filename=')[1] + let blob = new Blob([res.data], { + type: "text/x-python", + }); + const downloadUrl = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = downloadUrl; + link.setAttribute("download", name); + document.body.appendChild(link); + link.click(); + link.remove(); + }); } + diff --git a/frontend/requests/requests.room.js b/frontend/requests/requests.room.js index 3d752051..407adb9d 100644 --- a/frontend/requests/requests.room.js +++ b/frontend/requests/requests.room.js @@ -1,11 +1,19 @@ import { roomInstance } from "../apis/roomInstance.intance.js"; +import { isBrowser } from "../utils/utils.js"; export const createRoom = async (data) => { return await roomInstance .request({ method: "POST", url: "room/", - data: {...data} + data: { ...data }, + headers: { + Authorization: + isBrowser ? + localStorage.getItem("token") !== null + ? `Token ${localStorage.getItem("token")}` + : null: null + }, }) .then((res) => res.data.data); }; diff --git a/frontend/requests/requests.users.js b/frontend/requests/requests.users.js new file mode 100644 index 00000000..d86ff46a --- /dev/null +++ b/frontend/requests/requests.users.js @@ -0,0 +1,41 @@ +import { usersInstance } from "../apis/users.instance.js"; + +export const registerNewUser = async (data) => { + return await usersInstance + .request({ + method: "POST", + url: "register/", + data: { ...data }, + }) + .then((res) => res.data); +}; +export const loginRequest = async (data) => { + return await usersInstance + .request({ + method: "POST", + url: "login/", + data: { ...data }, + headers: {Authorization: null} + }) + .then((res) => res.data); +}; +export const getUser = async (token) => { + return await usersInstance + .request({ + method: "GET", + url: "user/", + headers: {Authorization: `Token ${token}`} + }) + .then((res) => res.data); +}; + +export const logoutRequest = async (token) => { + return await usersInstance + .request({ + method: "POST", + url: "logout/", + headers: {Authorization: `Token ${token}`} + }) + .then((res) => res.data); +}; + diff --git a/frontend/styles/Home.module.css b/frontend/styles/Home.module.css new file mode 100644 index 00000000..e7342d9a --- /dev/null +++ b/frontend/styles/Home.module.css @@ -0,0 +1,51 @@ +.btn { + padding: 25px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 250px; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + color: black; +} + +.icon { + -webkit-transition: 0.3s; + transition: 0.3s; + margin-left: 2%; +} + +.btn { + background: -webkit-gradient(linear, right top, left top, color-stop(50%, #FCBF49), color-stop(50%, #c28103)); + background: linear-gradient(to left, #FCBF49 50%, #c28103 50%); + background-size: 200% 100%; + background-position: right bottom; +} + +.btn:hover { + background-position: left bottom; +} + +.btn:hover > .icon { + margin-left: 15%; +} + +.btn-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + gap: 15%; +} + +.title { + text-align: center; + font-size: 5em; +} +/*# sourceMappingURL=Home.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/Home.module.css.map b/frontend/styles/Home.module.css.map new file mode 100644 index 00000000..c35f3584 --- /dev/null +++ b/frontend/styles/Home.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,IAAI,CAAC;EACH,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,KAAK;EACZ,eAAe,EAAE,MAAM;EACvB,KAAK,EAAE,KAAK;CACb;;AAED,AAAA,KAAK,CAAC;EACJ,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,EAAE;CAChB;;AAED,AAAA,IAAI,CAAC;EACH,UAAU,EAAE,kDAAiF;EAC7F,eAAe,EAAE,SAAS;EAC1B,mBAAmB,EAAE,YAAY;CAClC;;AACD,AAAA,IAAI,AAAA,MAAM,CAAC;EACT,mBAAmB,EAAE,WAAW;CAIjC;;AALD,AAEE,IAFE,AAAA,MAAM,GAEJ,KAAK,CAAC;EACR,WAAW,EAAE,GAAG;CACjB;;AAGH,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;EACvB,GAAG,EAAE,GAAG;CACT;;AAED,AAAA,MAAM,CAAA;EACJ,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,GAAG;CACf", + "sources": [ + "Home.module.scss", + "variables.scss" + ], + "names": [], + "file": "Home.module.css" +} \ No newline at end of file diff --git a/frontend/styles/NavBar.module.css b/frontend/styles/NavBar.module.css new file mode 100644 index 00000000..779326f4 --- /dev/null +++ b/frontend/styles/NavBar.module.css @@ -0,0 +1,75 @@ +.link { + cursor: pointer; + margin: 0 10px; + color: #f08336; + text-decoration: none; + position: relative; + font-weight: 600; + -webkit-transition: color .3s; + transition: color .3s; + font-size: 16px; +} + +.link::before { + content: ""; + position: absolute; + width: 100%; + height: 2px; + background: currentColor; + top: 100%; + left: 0; + pointer-events: none; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale3d(0, 1, 1); + transform: scale3d(0, 1, 1); + -webkit-transition: -webkit-transform 0.3s; + transition: -webkit-transform 0.3s; + transition: transform 0.3s; + transition: transform 0.3s, -webkit-transform 0.3s; +} + +.link:hover { + color: #FCBF49; + -webkit-transform: scale(1.05); + transform: scale(1.05); +} + +.link:hover::before { + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); +} + +.selected { + font-weight: bolder; + color: #FCBF49; + -webkit-transform: scale(1.05); + transform: scale(1.05); +} + +.selected::before { + content: none; +} + +.navbar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 10px; + padding: 0 10px; + margin-left: 30px; + height: 60px; + border-bottom: 1px #181553 solid; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; +} +/*# sourceMappingURL=NavBar.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/NavBar.module.css.map b/frontend/styles/NavBar.module.css.map new file mode 100644 index 00000000..574ef4a0 --- /dev/null +++ b/frontend/styles/NavBar.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,KAAK,CAAC;EACF,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,MAAM;EACd,KAAK,ECJM,OAAO;EDKlB,eAAe,EAAE,IAAI;EACrB,QAAQ,EAAE,QAAQ;EAClB,WAAW,EAAE,GAAG;EAChB,UAAU,EAAE,SAAS;EACrB,SAAS,EAAE,IAAI;CAyBlB;;AAjCD,AAUI,KAVC,AAUA,QAAQ,CAAC;EACN,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,GAAG;EACX,UAAU,EAAE,YAAY;EACxB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,CAAC;EACP,cAAc,EAAE,IAAI;EAEpB,gBAAgB,EAAE,QAAQ;EAC1B,SAAS,EAAE,gBAAgB;EAC3B,UAAU,EAAE,cAAc;CAC7B;;AAvBL,AAyBI,KAzBC,AAyBA,MAAM,CAAC;EACJ,KAAK,EC5BH,OAAO;ED6BT,SAAS,EAAE,WAAW;CAKzB;;AAhCL,AA4BQ,KA5BH,AAyBA,MAAM,AAGF,QAAQ,CAAC;EACN,gBAAgB,EAAE,MAAM;EACxB,SAAS,EAAE,gBAAgB;CAC9B;;AAMT,AAAA,SAAS,CAAC;EACN,WAAW,EAAE,MAAM;EACnB,KAAK,ECzCC,OAAO;ED0Cb,SAAS,EAAE,WAAW;CAIzB;;AAPD,AAII,SAJK,AAIJ,QAAQ,CAAA;EACL,OAAO,EAAE,IAAI;CAChB;;AAGL,AAAA,OAAO,CAAC;EACJ,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,UAAU;EAC3B,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,MAAM;EACf,WAAW,EAAE,IAAI;EACjB,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG,CC3Cb,OAAO,CD2Ce,KAAK;EAChC,KAAK,EAAE,WAAW;CACrB", + "sources": [ + "NavBar.module.scss", + "variables.scss" + ], + "names": [], + "file": "NavBar.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Alert.module.css b/frontend/styles/exos/Alert.module.css new file mode 100644 index 00000000..028b7acf --- /dev/null +++ b/frontend/styles/exos/Alert.module.css @@ -0,0 +1,152 @@ +@media (max-width: 840px) { + .ex_card--body { + max-height: 200%; + } +} + +.modal { + z-index: 2000; + position: fixed; + visibility: hidden; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} + +@media (max-width: 840px) { + .modal { + top: 0; + width: 100%; + height: 100%; + right: 0; + left: 0; + bottom: 0; + } +} + +@media (min-width: 840px) { + .modal { + top: 50% !important; + left: 50% !important; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } +} + +.visible { + visibility: visible; +} + +.md-effect .md-content { + min-width: 30vw; + min-height: 1px; + -webkit-transform: scale(0.7); + transform: scale(0.7); + opacity: 0; + -webkit-transition: all 0.1s; + transition: all 0.1s; +} + +.visible.md-effect .md-content { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; +} + +.modal { + z-index: 10000; +} + +.md-content { + min-width: 30vw; +} + +.alert-warning > .alert-title { + background-color: #ff4f64; +} + +.alert { + z-index: 4000; + width: 100%; +} + +.alert-overlay { + position: absolute; + top: 50%; + z-index: 3000; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + height: 100vh; + width: 100vw; + background-color: black; + opacity: 0.8; + -webkit-transition: 0.2s; + transition: 0.2s; +} + +.alert-msg { + width: 100%; + padding: 24px; + background-color: #1d1a5a; + font-size: 0.9em; +} + +.alert-options-container { + background-color: #1d1a5a; + width: 100%; + padding: 0 24px 24px; + border-radius: 0 0 5px 5px; +} + +.alert-options { + border-top: 1px solid grey; + padding-top: 24px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.alert-options > button { + min-height: 36px; + padding-inline: 16px; + margin-left: 2%; + border: none; + border-radius: 8px; + -webkit-transition: ease-in-out 0.3s; + transition: ease-in-out 0.3s; +} + +.alert-title { + width: 100%; + padding: 26px 24px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + font-size: 1.1em; + border-radius: 5px 5px 0 0; +} + +.alert-title a { + cursor: pointer; +} + +.title-label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.title-label svg { + -webkit-margin-end: 8px; + margin-inline-end: 8px; +} +/*# sourceMappingURL=Alert.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Alert.module.css.map b/frontend/styles/exos/Alert.module.css.map new file mode 100644 index 00000000..6334691c --- /dev/null +++ b/frontend/styles/exos/Alert.module.css.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "Alert.module.scss", + "../variables.scss", + "Modal.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "Alert.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Alert.module.scss b/frontend/styles/exos/Alert.module.scss index 1550578b..11122d8d 100644 --- a/frontend/styles/exos/Alert.module.scss +++ b/frontend/styles/exos/Alert.module.scss @@ -30,7 +30,7 @@ width: 100vw; background-color: black; opacity: 0.8; - transition: 0.4s; + transition: 0.2s; } .alert-msg { diff --git a/frontend/styles/exos/Card.module.css b/frontend/styles/exos/Card.module.css new file mode 100644 index 00000000..a6f437ee --- /dev/null +++ b/frontend/styles/exos/Card.module.css @@ -0,0 +1,281 @@ +.ex_card--full { + z-index: 1; + background-color: #1d1a5a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + border-radius: 2px; + cursor: pointer; + position: relative; + -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--full:not(.card-deleted):hover { + /* border: 1px solid $primary; + */ + -webkit-box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(5px, -8px); + transform: translate(5px, -8px); + -webkit-transition: -webkit-transform 0.4s; + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; +} + +.ex_card--full:hover .card_icons { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.no_hover:hover { + border: none; + -webkit-transform: none; + transform: none; +} + +.ex_card--content:not(.no_hover):hover ~ .card-hover, .card-hover:not(.no_hover):hover { + border: 1px solid #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--content { + color: grey; + font-size: 0.95em; + margin-top: 0; + z-index: 3; +} + +.ex_card--title { + font-size: 1.3em; + margin: 5%; + font-weight: 900; + cursor: pointer; + margin: 0; + max-width: 90%; +} + +.ex_card--title p, +.ex_card--title a { + position: relative; + margin: 0; + z-index: 15; +} + +.ex_card--title p:not(.no_hover):hover, +.ex_card--title a:not(.no_hover):hover { + color: #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + padding: 8%; + grid-gap: calc(1 * 8px); + margin-bottom: 10%; +} + +.exemple { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 80%; +} + +.card-hover { + border: 1px solid #181553; + width: 100%; + height: 100%; + z-index: 10; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover:not(.no_hover):hover ~ .ex_card--footer { + border: 1px solid #FCBF49; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover.no_hover span { + position: absolute; + top: 50%; + right: 50%; + width: 30px; + height: 30px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + -webkit-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; +} + +@-webkit-keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +@keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +.ex_card--footer-not-tag { + display: -ms-grid; + display: grid; + -ms-grid-columns: 85% auto; + grid-template-columns: 85% auto; + grid-gap: 8px; +} + +.ex_card--footer { + background-color: #171446; + min-height: 0; + position: absolute; + bottom: 0; + width: 100%; + -webkit-transition: 0.8s; + transition: 0.8s; + border: 1px solid #171446; + margin: 0; + z-index: 100; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; + -webkit-transition: min-height 0.7s border 0.4s; + transition: min-height 0.7s border 0.4s; +} + +.footer-size { + opacity: 0; + width: 100%; +} + +.tag_card { + position: absolute; + min-height: 100%; + -webkit-transition: 0.7s; + transition: 0.7s; + bottom: 0; + z-index: 100; + padding: 2%; +} + +.tag--container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: #5396e7 #1a0f7a; + scrollbar-color: #5396e7 #1a0f7a; +} + +.tag--container::-webkit-scrollbar { + height: 5px; +} + +.tag--container::-webkit-scrollbar-track { + background-color: #1a0f7a; +} + +.tag--container::-webkit-scrollbar-thumb { + background-color: #5396e7; +} + +.ex_card--add-tag { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 4; +} + +.ex_card--add-tag hr { + width: 2%; + height: 70%; + border: none; + background-color: black; +} + +.ex_card--add-tag p { + margin: auto; + font-size: 1.2em; + font-weight: 900; + width: 100%; + text-align: center; + -webkit-transition: 0.5s; + transition: 0.5s; +} + +.ex_card--add-tag p:hover { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +.card-progress { + margin-top: auto; +} + +.card-deleted { + opacity: 0.5; +} + +.icon-container { + position: absolute; + right: 0; + top: 0; + margin: 5%; + z-index: 100; +} + +.icon-container svg { + opacity: .5; + -webkit-transition: .3s; + transition: .3s; +} + +.icon-container svg:hover { + opacity: 1; +} + +.registered svg { + opacity: 1; + fill: red; +} +/*# sourceMappingURL=Card.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Card.module.css.map b/frontend/styles/exos/Card.module.css.map new file mode 100644 index 00000000..476e35f5 --- /dev/null +++ b/frontend/styles/exos/Card.module.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "Card.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "Card.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Card.module.scss b/frontend/styles/exos/Card.module.scss index d34292e5..c690fc74 100644 --- a/frontend/styles/exos/Card.module.scss +++ b/frontend/styles/exos/Card.module.scss @@ -1,6 +1,6 @@ @import "../variables"; -@import '../mixins'; -.ex_card--full { +@import "../mixins"; +.ex_card--full { z-index: 1; background-color: $background; display: flex; @@ -22,17 +22,15 @@ opacity: 1; transition: 0.4s; } - } -.no_hover:hover{ +.no_hover:hover { border: none; transform: none; //box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); } - -%card-hover-effect{ +%card-hover-effect { border: 1px solid $primary; transition: 0.4s; } @@ -44,7 +42,7 @@ margin-top: 0; z-index: 3; // padding: 1% 5%; - &:not(.no_hover):hover ~ .card-hover{ + &:not(.no_hover):hover ~ .card-hover { @extend %card-hover-effect; } } @@ -57,11 +55,12 @@ cursor: pointer; margin: 0; max-width: 90%; - & p, a { + & p, + a { position: relative; margin: 0; z-index: 15; - &:not(.no_hover):hover{ + &:not(.no_hover):hover { color: $primary; transition: 0.4s; } @@ -86,15 +85,13 @@ .card-hover { &:not(.no_hover):hover { @extend %card-hover-effect; - & ~ .ex_card--footer{ + & ~ .ex_card--footer { border: 1px solid $primary; border-top: none; - transition: .4s; + transition: 0.4s; } } - - border: 1px solid $border; width: 100%; height: 100%; @@ -105,7 +102,7 @@ right: 0; bottom: 0; transition: 0.4s; - &.no_hover span{ + &.no_hover span { position: absolute; top: 50%; right: 50%; @@ -117,21 +114,19 @@ } @keyframes rotation { - 0% { - transform: translate(0%, -50%) rotate(0deg); - } - 100% { - transform: translate(0%, -50%) rotate(360deg); - } + 0% { + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + transform: translate(0%, -50%) rotate(360deg); + } } .ex_card--footer-not-tag { display: grid; grid-template-columns: 85% auto; grid-gap: 8px; - } - .ex_card--footer { background-color: darken($color: $background, $amount: 5); //min-width: 0; @@ -139,16 +134,15 @@ position: absolute; bottom: 0; width: 100%; - transition: .8s; + transition: 0.8s; border: 1px solid darken($color: $background, $amount: 5); margin: 0; z-index: 100; border-top: none; - transition: .4s; - transition: min-height .7s border .4s; + transition: 0.4s; + transition: min-height 0.7s border 0.4s; } - .footer-size { opacity: 0; width: 100%; @@ -156,7 +150,7 @@ .tag_card { position: absolute; min-height: 100%; - transition: .7s; + transition: 0.7s; bottom: 0; z-index: 100; padding: 2%; @@ -168,7 +162,7 @@ overflow-y: hidden; scrollbar-width: thin; scrollbar-color: $contrast $background-light; - @include color-scroll($background-light, $contrast) + @include color-scroll($background-light, $contrast); } .ex_card--add-tag { @@ -193,15 +187,31 @@ } } } - - .card-progress { margin-top: auto; } +.card-deleted { + opacity: 0.5; +} +.icon-container { + position: absolute; + right: 0; + top: 0; + margin: 5%; + z-index: 100; + & svg{ + opacity: .5; + transition: .3s; + &:hover{ + opacity: 1; + } + } +} -.card-deleted{ - opacity: .5; +.registered svg{ + opacity: 1; + fill: red; } \ No newline at end of file diff --git a/frontend/styles/exos/Editor.module.css b/frontend/styles/exos/Editor.module.css new file mode 100644 index 00000000..362c2cc8 --- /dev/null +++ b/frontend/styles/exos/Editor.module.css @@ -0,0 +1,116 @@ +.full-editor { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + gap: 1%; +} + +@media (max-width: 1000px) { + .full-editor { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + gap: 5%; + overflow: scroll; + scrollbar-width: none; + } + .full-editor > div { + width: 100%; + height: 1000px; + } + .full-editor::-webkit-scrollbar { + display: none; + } +} + +.editor { + width: 50%; + height: 100%; +} + +.console-container { + width: 50%; +} + +/* .onglet-container{ + height: 5%; +} */ +.onglet { + background-color: #312e79; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + height: 100%; + padding: 1%; + border-radius: 5px 5px 0 0; +} + +.console { + background-color: #0D0221; + height: 95%; + padding: 1%; + -webkit-transition: .8s; + transition: .8s; +} + +.run-icon { + color: #00712c; + height: 100%; + width: 40%; + -webkit-transition: .3s; + transition: .3s; +} + +.btn { + padding: 0 2%; +} + +.run-btn { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 1.05em; + background-color: #00be4a; + color: #00712c; + padding: 0 2%; +} + +.run-btn:hover { + background-color: #00712c; + color: white; +} + +.run-btn:hover .run-icon { + color: white; +} + +.btn-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.loader { + border-color: #00712c; + border-bottom-color: transparent; +} + +.error_lines { + color: #ff4f64; +} + +.warn { + -webkit-transition: .3s; + transition: .3s; + border: 1px solid #ff4f64; +} +/*# sourceMappingURL=Editor.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Editor.module.css.map b/frontend/styles/exos/Editor.module.css.map new file mode 100644 index 00000000..8434e4c7 --- /dev/null +++ b/frontend/styles/exos/Editor.module.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "AAGA,AAAA,YAAY,CAAA;EACV,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,GAAG,EAAE,EAAE;CAWR;;AENC,MAAM,EAAE,SAAS,EAAE,MAAM;EFT3B,AAAA,YAAY,CAAA;IAMR,cAAc,EAAE,MAAM;IACtB,GAAG,EAAE,EAAE;IAKP,QAAQ,EAAE,MAAM;IEwBlB,eAAe,EAAE,IAAI;GFrBtB;EAfD,AAQI,YARQ,GAQJ,GAAG,CAAC;IACN,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,MAAM;GACf;EAXL,AEqCE,YFrCU,AEqCT,mBAAmB,CAAC;IACnB,OAAO,EAAE,IAAI;GACd;;;AFrBH,AAAA,OAAO,CAAA;EACL,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,IAAI;CACb;;AAGD,AAAA,kBAAkB,CAAA;EAChB,KAAK,EAAE,GAAG;CACX;;AAED;;IAEI;AAEJ,AAAA,OAAO,CAAA;EACL,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,WAAW;EAClB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,aAAa,EAAE,WAAW;CAC3B;;AAGD,AAAA,QAAQ,CAAA;EACJ,gBAAgB,EC9BF,OAAO;ED+BrB,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,EAAE;EACX,UAAU,EAAE,GAAG;CAClB;;AAED,AAAA,SAAS,CAAA;EACP,KAAK,ECzBM,OAAO;ED0BlB,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,GAAG;EACV,UAAU,EAAE,GAAG;CAChB;;AAED,AAAA,IAAI,CAAA;EACF,OAAO,EAAE,IAAI;CACd;;AAED,AAAA,QAAQ,CAAA;EACN,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,MAAM;EACjB,gBAAgB,EAAC,OAAyC;EAC1D,KAAK,ECxCM,OAAO;EDgDlB,OAAO,EAAE,IAAI;CACd;;AAdD,AAME,QANM,AAML,MAAM,CAAA;EACL,gBAAgB,EC1CP,OAAO;ED2ChB,KAAK,EAAE,KAAK;CAIb;;AAZH,AASI,QATI,AAML,MAAM,CAGH,SAAS,CAAA;EACT,KAAK,EAAE,KAAK;CACb;;AAKL,AAAA,cAAc,CAAA;EACZ,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;CACxB;;AAED,AAAA,OAAO,CAAA;EACL,YAAY,ECzDD,OAAO;ED0DlB,mBAAmB,EAAE,WAAW;CACjC;;AAED,AAAA,YAAY,CAAA;EAAC,KAAK,ECtEZ,OAAiB;CDsEG;;AAE1B,AAAA,KAAK,CAAA;EACH,UAAU,EAAE,GAAG;EACf,MAAM,EAAE,GAAG,CAAC,KAAK,CC1Eb,OAAiB;CD2EtB", + "sources": [ + "Editor.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "Editor.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ExercicesPage.module.css b/frontend/styles/exos/ExercicesPage.module.css new file mode 100644 index 00000000..60537fcc --- /dev/null +++ b/frontend/styles/exos/ExercicesPage.module.css @@ -0,0 +1,294 @@ +.exo-input { + background-color: inherit; + color: white; + height: 30px; + padding: 5px 10px; + width: 95%; + border-radius: 5px; + font-size: 16px; + font-weight: 450; + border: none; + margin: 10px 0; + float: left; + -webkit-transition: 0.3s; + transition: 0.3s; + border-bottom: 1px solid #181553; + border-radius: 0; +} + +.exo-input:focus { + border: none; + outline: none; + border-radius: 0; + border-bottom: 1.5px solid #5396e7; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.exo-input::-webkit-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input:-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-btn, .cancel-btn, .new-container button { + border: none; + border-radius: 5px; + height: 38px; + font-weight: 700; + background-color: #FCBF49; + -webkit-transition: 0.3s; + transition: 0.3s; + margin-bottom: 10px; + margin-right: 7px; + padding: 0 10%; +} + +.exo-btn:hover, .cancel-btn:hover, .new-container button:hover { + background-color: #c28103; +} + +.cancel-btn { + background-color: #ff4f64; +} + +.cancel-btn:hover { + background-color: #cf0019; +} + +.search-container { + z-index: 10; +} + +.search__control, .card-select__control { + background-color: transparent !important; + border: none !important; + border-bottom: 1px solid #181553 !important; + border-radius: 0 !important; +} + +.search__control--is-focused, .card-select--is-focused { + border: none !important; + border-bottom: 1px solid #5396e7 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.search-container { + color: white; + width: 90%; +} + +.search__menu, .card-select__menu { + background-color: #1a0f7a !important; + z-index: 100 !important; + scrollbar-color: #5396e7 #1d1a5a; +} + +.search__input-container { + color: white !important; +} + +.card-select__menu-list { + z-index: 10000 !important; + max-height: 250px !important; +} + +.model_input-code_input { + border-radius: 3px; + width: 100% !important; + height: 95% !important; +} + +.red { + color: #ff4f64; +} + +.all_exos--full_container { + /* width: 70vw; + height: 92vh; + margin: 0 auto; + overflow: scroll; + //scrollbar-width: none; + position: relative; */ + overflow: scroll; + height: 92vh; + scrollbar-width: none; +} + +.all_exos--full_container::-webkit-scrollbar { + display: none; +} + +.all_exos--container { + width: 98%; + display: -ms-grid; + display: grid; + -ms-grid-columns: (minmax(250px, 1fr))[auto-fill]; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + grid-auto-flow: dense; + grid-gap: calc(4 * 8px); + margin: 0 auto; +} + +.all_exos--title { + grid-column: 1/-1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + text-align: center; +} + +.all_exos--title h1 { + font-size: 3.5rem; + font-weight: bolder; + margin: 0; + width: 100%; +} + +.all_exos--title p { + font-size: 1.1em; + width: 100%; +} + +@media (min-width: 840px) { + .all_exos--title { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / 3; + text-align: left; + /* &.is-paginated { + grid-column: -3 / -1; + } */ + } +} + +.all_exos--head { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + height: -webkit-max-content; + height: -moz-max-content; + height: max-content; +} + +@media (max-width: 840px) { + .all_exos--head { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + } + .all_exos--head > * { + width: 100% !important; + } +} + +.new-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 50%; +} + +@media (max-width: 840px) { + .new-container > button { + width: 100%; + } +} + +.new-container button { + background-color: transparent; + border: 1px solid #FCBF49; + color: #FCBF49; + font-size: 0.9em; +} + +.new-container button:hover { + color: #0D0221; + background-color: #FCBF49; +} + +.search-full-container { + width: 40%; + float: right; + margin-bottom: 2%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.loader-btn-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.toggler-sort { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + padding: 0.8%; + -webkit-transition: 0.3s; + transition: 0.3s; + border: 1px solid #181553; + border-radius: 4px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0 1%; +} + +.toggler-sort:hover { + background-color: rgba(26, 15, 122, 0.6); +} + +.toggler-active { + background-color: rgba(26, 15, 122, 0.6); +} +/*# sourceMappingURL=ExercicesPage.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ExercicesPage.module.css.map b/frontend/styles/exos/ExercicesPage.module.css.map new file mode 100644 index 00000000..ac2e86c0 --- /dev/null +++ b/frontend/styles/exos/ExercicesPage.module.css.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "ExercicesPage.module.scss", + "../variables.scss", + "../global_components.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "ExercicesPage.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ExercicesPage.module.scss b/frontend/styles/exos/ExercicesPage.module.scss index 052597a7..f790eaf7 100644 --- a/frontend/styles/exos/ExercicesPage.module.scss +++ b/frontend/styles/exos/ExercicesPage.module.scss @@ -25,10 +25,21 @@ //position: relative; } .all_exos--title { - font-size: 2.4em; - font-weight: bolder; + & h1 { + font-size: 3.5rem; + font-weight: bolder; + margin: 0; + width: 100%; + } + + & p { + font-size: 1.1em; + width: 100%; + } + grid-column: 1/-1; display: flex; + flex-direction: column; justify-content: center; align-items: center; text-align: center; @@ -48,8 +59,8 @@ justify-content: space-between; @include down(840) { flex-direction: column; - & > *{ - width: 100%!important; + & > * { + width: 100% !important; } } // margin-bottom: 5%; @@ -60,8 +71,10 @@ display: flex; align-items: center; width: 50%; - @include down(840){ - & > button {width: 100%} + @include down(840) { + & > button { + width: 100%; + } } & button { diff --git a/frontend/styles/exos/ExoCreateForm.module.css b/frontend/styles/exos/ExoCreateForm.module.css new file mode 100644 index 00000000..f09b4fe0 --- /dev/null +++ b/frontend/styles/exos/ExoCreateForm.module.css @@ -0,0 +1,467 @@ +.ex_card--full { + z-index: 1; + background-color: #1d1a5a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + border-radius: 2px; + cursor: pointer; + position: relative; + -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--full:not(.card-deleted):hover { + /* border: 1px solid $primary; + */ + -webkit-box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(5px, -8px); + transform: translate(5px, -8px); + -webkit-transition: -webkit-transform 0.4s; + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; +} + +.ex_card--full:hover .card_icons { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.no_hover:hover { + border: none; + -webkit-transform: none; + transform: none; +} + +.ex_card--content:not(.no_hover):hover ~ .card-hover, .card-hover:not(.no_hover):hover { + border: 1px solid #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--content { + color: grey; + font-size: 0.95em; + margin-top: 0; + z-index: 3; +} + +.ex_card--title { + font-size: 1.3em; + margin: 5%; + font-weight: 900; + cursor: pointer; + margin: 0; + max-width: 90%; +} + +.ex_card--title p, +.ex_card--title a { + position: relative; + margin: 0; + z-index: 15; +} + +.ex_card--title p:not(.no_hover):hover, +.ex_card--title a:not(.no_hover):hover { + color: #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + padding: 8%; + grid-gap: calc(1 * 8px); + margin-bottom: 10%; +} + +.exemple { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 80%; +} + +.card-hover { + border: 1px solid #181553; + width: 100%; + height: 100%; + z-index: 10; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover:not(.no_hover):hover ~ .ex_card--footer { + border: 1px solid #FCBF49; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover.no_hover span { + position: absolute; + top: 50%; + right: 50%; + width: 30px; + height: 30px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + -webkit-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; +} + +@-webkit-keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +@keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +.ex_card--footer-not-tag { + display: -ms-grid; + display: grid; + -ms-grid-columns: 85% auto; + grid-template-columns: 85% auto; + grid-gap: 8px; +} + +.ex_card--footer { + background-color: #171446; + min-height: 0; + position: absolute; + bottom: 0; + width: 100%; + -webkit-transition: 0.8s; + transition: 0.8s; + border: 1px solid #171446; + margin: 0; + z-index: 100; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; + -webkit-transition: min-height 0.7s border 0.4s; + transition: min-height 0.7s border 0.4s; +} + +.footer-size { + opacity: 0; + width: 100%; +} + +.tag_card { + position: absolute; + min-height: 100%; + -webkit-transition: 0.7s; + transition: 0.7s; + bottom: 0; + z-index: 100; + padding: 2%; +} + +.tag--container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: #5396e7 #1a0f7a; + scrollbar-color: #5396e7 #1a0f7a; +} + +.tag--container::-webkit-scrollbar { + height: 5px; +} + +.tag--container::-webkit-scrollbar-track { + background-color: #1a0f7a; +} + +.tag--container::-webkit-scrollbar-thumb { + background-color: #5396e7; +} + +.ex_card--add-tag { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 4; +} + +.ex_card--add-tag hr { + width: 2%; + height: 70%; + border: none; + background-color: black; +} + +.ex_card--add-tag p { + margin: auto; + font-size: 1.2em; + font-weight: 900; + width: 100%; + text-align: center; + -webkit-transition: 0.5s; + transition: 0.5s; +} + +.ex_card--add-tag p:hover { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +.card-progress { + margin-top: auto; +} + +.card-deleted { + opacity: 0.5; +} + +.icon-container { + position: absolute; + right: 0; + top: 0; + margin: 5%; + z-index: 100; +} + +.icon-container svg { + opacity: .5; + -webkit-transition: .3s; + transition: .3s; +} + +.icon-container svg:hover { + opacity: 1; +} + +.registered svg { + opacity: 1; + fill: red; +} + +.ex_card--full:hover { + -webkit-transform: none; + transform: none; +} + +.ex_card--full { + background-color: #1a0f7a; +} + +@media (max-width: 840px) { + .ex_card--full { + height: 100%; + } +} + +.ex_card--full:not(.card-deleted):hover { + -webkit-transform: none; + transform: none; +} + +.updating { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.updating span { + width: 30px; + height: 30px; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + -ms-grid-rows: (auto)[5]; + grid-template-rows: repeat(5, auto); + background-color: #1a0f7a; + min-width: 820px; + max-width: 40vw; + min-height: 1px; + -webkit-transition: 0.3s; + transition: 0.3s; + max-height: 80vh; + overflow: scroll; + scrollbar-width: none; +} + +.ex_card--body::-webkit-scrollbar { + display: none; +} + +@media (max-width: 840px) { + .ex_card--body { + width: 100%; + height: 100%; + display: block; + max-width: 200%; + min-width: 1px; + padding: 8vmin; + } +} + +.ex_card--title { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / 3; + -ms-grid-row: 1; + grid-row: 1; + cursor: default; +} + +.ex_card--title a { + font-size: 0.6em; + font-weight: 300; + z-index: 1000; + color: grey; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s; + -webkit-text-decoration: underline transparent; + text-decoration: underline transparent; + margin-left: 10px; +} + +.ex_card--title a:hover { + color: #5396e7 !important; + font-weight: 600; + text-decoration: underline; +} + +.icon-container { + position: absolute; + width: 100%; + margin: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + top: 0; + right: 0; + padding: 3%; + z-index: 70; +} + +.icon-container > * > .icon:hover, +.icon-container > .icon:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.icon-container > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.icon { + -webkit-transition: 0.3s; + transition: 0.3s; + width: 20px; + height: 20px; + margin: 0.5%; +} + +.delete { + color: red; +} + +.edit { + color: green; +} + +.ex_card-fade { + -webkit-transition: 0.3s; + transition: 0.3s; + opacity: 0; +} + +.ex_card--big { + width: 100vw; + min-width: 100vw; + min-height: 100vh; + -webkit-transition: 0.5s; + transition: 0.5s; + padding: 1% 2% 3% 2%; + display: block; +} + +.edit-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.ex_card--body__little { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.btn-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +/*# sourceMappingURL=ExoCreateForm.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ExoCreateForm.module.css.map b/frontend/styles/exos/ExoCreateForm.module.css.map new file mode 100644 index 00000000..06a11116 --- /dev/null +++ b/frontend/styles/exos/ExoCreateForm.module.css.map @@ -0,0 +1,18 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "ExoCreateForm.module.scss", + "../variables.scss", + "ModalCard.module.scss", + "../variables.scss", + "Card.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "ExoCreateForm.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ExoEditForm.module.css b/frontend/styles/exos/ExoEditForm.module.css new file mode 100644 index 00000000..0099abc0 --- /dev/null +++ b/frontend/styles/exos/ExoEditForm.module.css @@ -0,0 +1,522 @@ +.ex_card--full { + z-index: 1; + background-color: #1d1a5a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + border-radius: 2px; + cursor: pointer; + position: relative; + -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--full:not(.card-deleted):hover { + /* border: 1px solid $primary; + */ + -webkit-box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(5px, -8px); + transform: translate(5px, -8px); + -webkit-transition: -webkit-transform 0.4s; + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; +} + +.ex_card--full:hover .card_icons { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.no_hover:hover { + border: none; + -webkit-transform: none; + transform: none; +} + +.ex_card--content:not(.no_hover):hover ~ .card-hover, .card-hover:not(.no_hover):hover { + border: 1px solid #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--content { + color: grey; + font-size: 0.95em; + margin-top: 0; + z-index: 3; +} + +.ex_card--title { + font-size: 1.3em; + margin: 5%; + font-weight: 900; + cursor: pointer; + margin: 0; + max-width: 90%; +} + +.ex_card--title p, +.ex_card--title a { + position: relative; + margin: 0; + z-index: 15; +} + +.ex_card--title p:not(.no_hover):hover, +.ex_card--title a:not(.no_hover):hover { + color: #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + padding: 8%; + grid-gap: calc(1 * 8px); + margin-bottom: 10%; +} + +.exemple { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 80%; +} + +.card-hover { + border: 1px solid #181553; + width: 100%; + height: 100%; + z-index: 10; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover:not(.no_hover):hover ~ .ex_card--footer { + border: 1px solid #FCBF49; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover.no_hover span { + position: absolute; + top: 50%; + right: 50%; + width: 30px; + height: 30px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + -webkit-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; +} + +@-webkit-keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +@keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +.ex_card--footer-not-tag { + display: -ms-grid; + display: grid; + -ms-grid-columns: 85% auto; + grid-template-columns: 85% auto; + grid-gap: 8px; +} + +.ex_card--footer { + background-color: #171446; + min-height: 0; + position: absolute; + bottom: 0; + width: 100%; + -webkit-transition: 0.8s; + transition: 0.8s; + border: 1px solid #171446; + margin: 0; + z-index: 100; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; + -webkit-transition: min-height 0.7s border 0.4s; + transition: min-height 0.7s border 0.4s; +} + +.footer-size { + opacity: 0; + width: 100%; +} + +.tag_card { + position: absolute; + min-height: 100%; + -webkit-transition: 0.7s; + transition: 0.7s; + bottom: 0; + z-index: 100; + padding: 2%; +} + +.tag--container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: #5396e7 #1a0f7a; + scrollbar-color: #5396e7 #1a0f7a; +} + +.tag--container::-webkit-scrollbar { + height: 5px; +} + +.tag--container::-webkit-scrollbar-track { + background-color: #1a0f7a; +} + +.tag--container::-webkit-scrollbar-thumb { + background-color: #5396e7; +} + +.ex_card--add-tag { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 4; +} + +.ex_card--add-tag hr { + width: 2%; + height: 70%; + border: none; + background-color: black; +} + +.ex_card--add-tag p { + margin: auto; + font-size: 1.2em; + font-weight: 900; + width: 100%; + text-align: center; + -webkit-transition: 0.5s; + transition: 0.5s; +} + +.ex_card--add-tag p:hover { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +.card-progress { + margin-top: auto; +} + +.card-deleted { + opacity: 0.5; +} + +.icon-container { + position: absolute; + right: 0; + top: 0; + margin: 5%; + z-index: 100; +} + +.icon-container svg { + opacity: .5; + -webkit-transition: .3s; + transition: .3s; +} + +.icon-container svg:hover { + opacity: 1; +} + +.registered svg { + opacity: 1; + fill: red; +} + +.ex_card--full:hover { + -webkit-transform: none; + transform: none; +} + +.ex_card--full { + background-color: #1a0f7a; +} + +@media (max-width: 840px) { + .ex_card--full { + height: 100%; + } +} + +.ex_card--full:not(.card-deleted):hover { + -webkit-transform: none; + transform: none; +} + +.updating { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.updating span { + width: 30px; + height: 30px; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + -ms-grid-rows: (auto)[5]; + grid-template-rows: repeat(5, auto); + background-color: #1a0f7a; + min-width: 820px; + max-width: 40vw; + min-height: 1px; + -webkit-transition: 0.3s; + transition: 0.3s; + max-height: 80vh; + overflow: scroll; + scrollbar-width: none; +} + +.ex_card--body::-webkit-scrollbar { + display: none; +} + +@media (max-width: 840px) { + .ex_card--body { + width: 100%; + height: 100%; + display: block; + max-width: 200%; + min-width: 1px; + padding: 8vmin; + } +} + +.ex_card--title { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / 3; + -ms-grid-row: 1; + grid-row: 1; + cursor: default; +} + +.ex_card--title a { + font-size: 0.6em; + font-weight: 300; + z-index: 1000; + color: grey; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s; + -webkit-text-decoration: underline transparent; + text-decoration: underline transparent; + margin-left: 10px; +} + +.ex_card--title a:hover { + color: #5396e7 !important; + font-weight: 600; + text-decoration: underline; +} + +.icon-container { + position: absolute; + width: 100%; + margin: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + top: 0; + right: 0; + padding: 3%; + z-index: 70; +} + +.icon-container > * > .icon:hover, +.icon-container > .icon:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.icon-container > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.icon { + -webkit-transition: 0.3s; + transition: 0.3s; + width: 20px; + height: 20px; + margin: 0.5%; +} + +.delete { + color: red; +} + +.edit { + color: green; +} + +.ex_card-fade { + -webkit-transition: 0.3s; + transition: 0.3s; + opacity: 0; +} + +.ex_card--big { + width: 100vw; + min-width: 100vw; + min-height: 100vh; + -webkit-transition: 0.5s; + transition: 0.5s; + padding: 1% 2% 3% 2%; + display: block; +} + +.edit-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.ex_card--title { + font-weight: normal; + font-size: 1em; + margin-bottom: 3%; + max-width: 100%; +} + +.input { + margin-bottom: 3%; +} + +.loader-btn-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +/* .btn{ + width: 30%; +} */ +.inpt-modif::after { + content: "!"; +} + +.input-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.input-container > svg { + height: 100%; + width: 5%; +} + +.input-container > span { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.input-container > span > svg { + height: 50%; + width: auto; +} + +/* .modelinput-container { + height: 100%; + display: flex; + align-items: center; +} + */ +/*# sourceMappingURL=ExoEditForm.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ExoEditForm.module.css.map b/frontend/styles/exos/ExoEditForm.module.css.map new file mode 100644 index 00000000..2d193221 --- /dev/null +++ b/frontend/styles/exos/ExoEditForm.module.css.map @@ -0,0 +1,18 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "ExoEditForm.module.scss", + "../variables.scss", + "ModalCard.module.scss", + "../variables.scss", + "Card.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "ExoEditForm.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ExoPrinterForm.module.css b/frontend/styles/exos/ExoPrinterForm.module.css new file mode 100644 index 00000000..b8dc15ed --- /dev/null +++ b/frontend/styles/exos/ExoPrinterForm.module.css @@ -0,0 +1,51 @@ +.exo-input-container { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1/3; + -ms-grid-row: 2; + grid-row: 2; +} + +.exo-input-container ~ h2 { + font-size: 1.25em; + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1/3; + -ms-grid-row: 3; + grid-row: 3; +} + +.btn-disabled { + background-color: grey; + color: black; +} + +.btn-disabled:hover { + background-color: grey; +} + +.option--ex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1/3; + -ms-grid-row: 4; + grid-row: 4; + gap: 10%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-container { + text-align: center; + -ms-grid-row: 5; + grid-row: 5; +} +/*# sourceMappingURL=ExoPrinterForm.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ExoPrinterForm.module.css.map b/frontend/styles/exos/ExoPrinterForm.module.css.map new file mode 100644 index 00000000..8c4d191d --- /dev/null +++ b/frontend/styles/exos/ExoPrinterForm.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,oBAAoB,CAAA;EAChB,WAAW,EAAE,GAAG;EAChB,QAAQ,EAAE,CAAC;CAOd;;AATD,AAII,oBAJgB,GAIZ,EAAE,CAAA;EACF,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,GAAG;EAChB,QAAQ,EAAE,CAAC;CACd;;AAIL,AAAA,aAAa,CAAA;EACX,gBAAgB,EAAE,IAAI;EAItB,KAAK,EAAC,KAAK;CACZ;;AAND,AAEE,aAFW,AAEV,MAAM,CAAA;EACL,gBAAgB,EAAE,IAAI;CACvB;;AAIH,AAAA,WAAW,CAAA;EACP,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,WAAW,EAAE,GAAG;EAChB,QAAQ,EAAE,CAAC;EACX,GAAG,EAAE,GAAG;EACR,eAAe,EAAE,MAAM;CAC1B;;AAED,AAAA,cAAc,CAAA;EACV,UAAU,EAAE,MAAM;EAClB,QAAQ,EAAE,CAAC;CACd", + "sources": [ + "ExoPrinterForm.module.scss", + "../variables.scss" + ], + "names": [], + "file": "ExoPrinterForm.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ExoPrinterForm.module.scss b/frontend/styles/exos/ExoPrinterForm.module.scss index f258bbac..4183e25a 100644 --- a/frontend/styles/exos/ExoPrinterForm.module.scss +++ b/frontend/styles/exos/ExoPrinterForm.module.scss @@ -22,6 +22,7 @@ .option--ex{ display: flex; + flex-direction: column; grid-column: 1/3; grid-row: 4; gap: 10%; @@ -30,4 +31,5 @@ .btn-container{ text-align: center; + grid-row: 5; } diff --git a/frontend/styles/exos/Modal.module.css b/frontend/styles/exos/Modal.module.css new file mode 100644 index 00000000..adb8450d --- /dev/null +++ b/frontend/styles/exos/Modal.module.css @@ -0,0 +1,54 @@ +@media (max-width: 840px) { + .ex_card--body { + max-height: 200%; + } +} + +.modal { + z-index: 2000; + position: fixed; + visibility: hidden; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} + +@media (max-width: 840px) { + .modal { + top: 0; + width: 100%; + height: 100%; + right: 0; + left: 0; + bottom: 0; + } +} + +@media (min-width: 840px) { + .modal { + top: 50% !important; + left: 50% !important; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } +} + +.visible { + visibility: visible; +} + +.md-effect .md-content { + min-width: 30vw; + min-height: 1px; + -webkit-transform: scale(0.7); + transform: scale(0.7); + opacity: 0; + -webkit-transition: all 0.1s; + transition: all 0.1s; +} + +.visible.md-effect .md-content { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; +} +/*# sourceMappingURL=Modal.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Modal.module.css.map b/frontend/styles/exos/Modal.module.css.map new file mode 100644 index 00000000..75ea0a43 --- /dev/null +++ b/frontend/styles/exos/Modal.module.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "AEYE,MAAM,EAAE,SAAS,EAAE,KAAK;EFT1B,AAAA,cAAc,CAAA;IAEV,UAAU,EAAE,IAAI;GAEnB;;;AAED,AAAA,MAAM,CAAC;EACL,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,KAAK;EAiBf,UAAU,EAAE,MAAM;EAClB,mBAAmB,EAAE,MAAM;CAC5B;;AElBC,MAAM,EAAE,SAAS,EAAE,KAAK;EFH1B,AAAA,MAAM,CAAC;IAIH,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;GAYZ;;;AExBC,MAAM,EAAE,SAAS,EAAE,KAAK;EFG1B,AAAA,MAAM,CAAC;IAaH,GAAG,EAAE,cAAc;IACnB,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,qBAAqB;GAMnC;;;AAED,AAAA,QAAQ,CAAC;EACP,UAAU,EAAE,OAAO;CACpB;;AAED,AAAA,UAAU,CAAC,WAAW,CAAC;EACrB,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,GAAG;EAEf,SAAS,EAAE,UAAU;EACrB,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,QAAQ;CACrB;;AAED,AAAA,QAAQ,AAAA,UAAU,CAAC,WAAW,CAAC;EAC7B,SAAS,EAAE,QAAQ;EACnB,OAAO,EAAE,CAAC;CACX", + "sources": [ + "Modal.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "Modal.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Modal.module.scss b/frontend/styles/exos/Modal.module.scss index 55667465..c9909cd9 100644 --- a/frontend/styles/exos/Modal.module.scss +++ b/frontend/styles/exos/Modal.module.scss @@ -37,10 +37,10 @@ .md-effect .md-content { min-width: 30vw; min-height: 1px; - transition: 1s; + //transition: 1s; transform: scale(0.7); opacity: 0; - transition: all 0.3s; + transition: all 0.1s; } .visible.md-effect .md-content { diff --git a/frontend/styles/exos/ModalCard.module.css b/frontend/styles/exos/ModalCard.module.css new file mode 100644 index 00000000..f8051c01 --- /dev/null +++ b/frontend/styles/exos/ModalCard.module.css @@ -0,0 +1,451 @@ +.ex_card--full { + z-index: 1; + background-color: #1d1a5a; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + border-radius: 2px; + cursor: pointer; + position: relative; + -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--full:not(.card-deleted):hover { + /* border: 1px solid $primary; + */ + -webkit-box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.75); + -webkit-transform: translate(5px, -8px); + transform: translate(5px, -8px); + -webkit-transition: -webkit-transform 0.4s; + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; +} + +.ex_card--full:hover .card_icons { + opacity: 1; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.no_hover:hover { + border: none; + -webkit-transform: none; + transform: none; +} + +.ex_card--content:not(.no_hover):hover ~ .card-hover, .card-hover:not(.no_hover):hover { + border: 1px solid #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--content { + color: grey; + font-size: 0.95em; + margin-top: 0; + z-index: 3; +} + +.ex_card--title { + font-size: 1.3em; + margin: 5%; + font-weight: 900; + cursor: pointer; + margin: 0; + max-width: 90%; +} + +.ex_card--title p, +.ex_card--title a { + position: relative; + margin: 0; + z-index: 15; +} + +.ex_card--title p:not(.no_hover):hover, +.ex_card--title a:not(.no_hover):hover { + color: #FCBF49; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + padding: 8%; + grid-gap: calc(1 * 8px); + margin-bottom: 10%; +} + +.exemple { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 80%; +} + +.card-hover { + border: 1px solid #181553; + width: 100%; + height: 100%; + z-index: 10; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover:not(.no_hover):hover ~ .ex_card--footer { + border: 1px solid #FCBF49; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; +} + +.card-hover.no_hover span { + position: absolute; + top: 50%; + right: 50%; + width: 30px; + height: 30px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + -webkit-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; +} + +@-webkit-keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +@keyframes rotation { + 0% { + -webkit-transform: translate(0%, -50%) rotate(0deg); + transform: translate(0%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(0%, -50%) rotate(360deg); + transform: translate(0%, -50%) rotate(360deg); + } +} + +.ex_card--footer-not-tag { + display: -ms-grid; + display: grid; + -ms-grid-columns: 85% auto; + grid-template-columns: 85% auto; + grid-gap: 8px; +} + +.ex_card--footer { + background-color: #171446; + min-height: 0; + position: absolute; + bottom: 0; + width: 100%; + -webkit-transition: 0.8s; + transition: 0.8s; + border: 1px solid #171446; + margin: 0; + z-index: 100; + border-top: none; + -webkit-transition: 0.4s; + transition: 0.4s; + -webkit-transition: min-height 0.7s border 0.4s; + transition: min-height 0.7s border 0.4s; +} + +.footer-size { + opacity: 0; + width: 100%; +} + +.tag_card { + position: absolute; + min-height: 100%; + -webkit-transition: 0.7s; + transition: 0.7s; + bottom: 0; + z-index: 100; + padding: 2%; +} + +.tag--container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: auto; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: #5396e7 #1a0f7a; + scrollbar-color: #5396e7 #1a0f7a; +} + +.tag--container::-webkit-scrollbar { + height: 5px; +} + +.tag--container::-webkit-scrollbar-track { + background-color: #1a0f7a; +} + +.tag--container::-webkit-scrollbar-thumb { + background-color: #5396e7; +} + +.ex_card--add-tag { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 4; +} + +.ex_card--add-tag hr { + width: 2%; + height: 70%; + border: none; + background-color: black; +} + +.ex_card--add-tag p { + margin: auto; + font-size: 1.2em; + font-weight: 900; + width: 100%; + text-align: center; + -webkit-transition: 0.5s; + transition: 0.5s; +} + +.ex_card--add-tag p:hover { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); +} + +.card-progress { + margin-top: auto; +} + +.card-deleted { + opacity: 0.5; +} + +.icon-container { + position: absolute; + right: 0; + top: 0; + margin: 5%; + z-index: 100; +} + +.icon-container svg { + opacity: .5; + -webkit-transition: .3s; + transition: .3s; +} + +.icon-container svg:hover { + opacity: 1; +} + +.registered svg { + opacity: 1; + fill: red; +} + +.ex_card--full:hover { + -webkit-transform: none; + transform: none; +} + +.ex_card--full { + background-color: #1a0f7a; +} + +@media (max-width: 840px) { + .ex_card--full { + height: 100%; + } +} + +.ex_card--full:not(.card-deleted):hover { + -webkit-transform: none; + transform: none; +} + +.updating { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.updating span { + width: 30px; + height: 30px; +} + +.ex_card--body { + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr; + grid-template-columns: 1fr; + -ms-grid-rows: (auto)[5]; + grid-template-rows: repeat(5, auto); + background-color: #1a0f7a; + min-width: 820px; + max-width: 40vw; + min-height: 1px; + -webkit-transition: 0.3s; + transition: 0.3s; + max-height: 80vh; + overflow: scroll; + scrollbar-width: none; +} + +.ex_card--body::-webkit-scrollbar { + display: none; +} + +@media (max-width: 840px) { + .ex_card--body { + width: 100%; + height: 100%; + display: block; + max-width: 200%; + min-width: 1px; + padding: 8vmin; + } +} + +.ex_card--title { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1 / 3; + -ms-grid-row: 1; + grid-row: 1; + cursor: default; +} + +.ex_card--title a { + font-size: 0.6em; + font-weight: 300; + z-index: 1000; + color: grey; + cursor: pointer; + -webkit-transition: .3s; + transition: .3s; + -webkit-text-decoration: underline transparent; + text-decoration: underline transparent; + margin-left: 10px; +} + +.ex_card--title a:hover { + color: #5396e7 !important; + font-weight: 600; + text-decoration: underline; +} + +.icon-container { + position: absolute; + width: 100%; + margin: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + top: 0; + right: 0; + padding: 3%; + z-index: 70; +} + +.icon-container > * > .icon:hover, +.icon-container > .icon:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.icon-container > div { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.icon { + -webkit-transition: 0.3s; + transition: 0.3s; + width: 20px; + height: 20px; + margin: 0.5%; +} + +.delete { + color: red; +} + +.edit { + color: green; +} + +.ex_card-fade { + -webkit-transition: 0.3s; + transition: 0.3s; + opacity: 0; +} + +.ex_card--big { + width: 100vw; + min-width: 100vw; + min-height: 100vh; + -webkit-transition: 0.5s; + transition: 0.5s; + padding: 1% 2% 3% 2%; + display: block; +} + +.edit-card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +/*# sourceMappingURL=ModalCard.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ModalCard.module.css.map b/frontend/styles/exos/ModalCard.module.css.map new file mode 100644 index 00000000..fc6456fa --- /dev/null +++ b/frontend/styles/exos/ModalCard.module.css.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "ModalCard.module.scss", + "../variables.scss", + "Card.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "ModalCard.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ModalCard.module.scss b/frontend/styles/exos/ModalCard.module.scss index 73d3b0ab..7c506505 100644 --- a/frontend/styles/exos/ModalCard.module.scss +++ b/frontend/styles/exos/ModalCard.module.scss @@ -1,28 +1,28 @@ @import "../variables"; @import "./Card.module.scss"; -@import '../mixins'; +@import "../mixins"; .ex_card--full:hover { - transform: none; - + transform: none; } -.ex_card--full{ - @include down(840){ +.ex_card--full { + background-color: $background-light; + @include down(840) { height: 100%; } } -.ex_card--full:not(.card-deleted):hover{ +.ex_card--full:not(.card-deleted):hover { transform: none; } -.updating{ +.updating { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; - & span{ + & span { width: 30px; height: 30px; } @@ -37,11 +37,11 @@ min-width: 820px; max-width: 40vw; min-height: 1px; - transition: .3s; + transition: 0.3s; max-height: 80vh; overflow: scroll; @include no-scroll(); - @include down(840){ + @include down(840) { width: 100%; height: 100%; display: block; @@ -54,60 +54,73 @@ .ex_card--title { grid-column: 1 / 3; grid-row: 1; + cursor: default; + & a { + font-size: 0.6em; + font-weight: 300; + //z-index: 1000; + color: grey; + cursor: pointer; + transition: .3s; + text-decoration: underline transparent; + margin-left: 10px; + &:hover { + color: $contrast!important; + font-weight: 600; + text-decoration: underline; + } + } } .icon-container { - //width: max-content; position: absolute; width: 100%; - //text-align: right; + margin: 0; display: flex; justify-content: space-between; top: 0; right: 0; - padding: 2%; - & > * > .icon:hover, & > .icon:hover{ + padding: 3%; + z-index: 70; + & > * > .icon:hover, + & > .icon:hover { transform: scale(1.1); } - & > div{ + & > div { display: flex; } } -.icon{ - transition: .3s; +.icon { + transition: 0.3s; width: 20px; height: 20px; - margin: .5%; + margin: 0.5%; } - -.delete{ +.delete { color: red; } -.edit{ +.edit { color: green; } - -.ex_card-fade{ - transition: .3s; +.ex_card-fade { + transition: 0.3s; opacity: 0; } -.ex_card--big{ +.ex_card--big { width: 100vw; - min-width: 100vw; + min-width: 100vw; min-height: 100vh; - // height: 100vh; - transition: .5s; + // height: 100vh; + transition: 0.5s; padding: 1% 2% 3% 2%; display: block; } - - -.edit-card{ +.edit-card { display: flex; flex-direction: column; -} \ No newline at end of file +} diff --git a/frontend/styles/exos/ModelInput.module.css b/frontend/styles/exos/ModelInput.module.css new file mode 100644 index 00000000..e76c0fcf --- /dev/null +++ b/frontend/styles/exos/ModelInput.module.css @@ -0,0 +1,160 @@ +.open-btn { + height: -webkit-max-content; + height: -moz-max-content; + height: max-content; +} + +.button-lang { + width: 5%; + min-width: -webkit-max-content; + min-width: -moz-max-content; + min-width: max-content; + border: none; + border-radius: 5px; + color: white; + font-weight: bolder; + margin: 2%; + margin-left: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 10px; + margin-right: 0; + gap: 5px; +} + +.button-lang > svg { + height: 120%; +} + +.button-lang-python { + background-color: #045aff; + -webkit-transition: .3s; + transition: .3s; + border: 1px solid #045aff; + -webkit-box-shadow: 0px 0px 10px 1px rgba(11, 2, 72, 0.72); + box-shadow: 0px 0px 10px 1px rgba(11, 2, 72, 0.72); +} + +.button-lang-python:hover { + background-color: #003fb7; + -webkit-box-shadow: 0px 0px 10px 1px rgba(11, 2, 65, 0.72); + box-shadow: 0px 0px 10px 1px rgba(11, 2, 65, 0.72); + border: 1px solid #003fb7; +} + +.btn-disabled { + background-color: grey; +} + +.btn-disabled:hover { + background-color: grey; +} + +.input-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.input-container > svg { + height: 100%; + width: 5%; +} + +.input-container > p { + margin: 1%; + font-weight: 600; +} + +.inputfile { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; +} + +.inputfile + label { + font-size: 1; + font-weight: 700; + color: black; + background-color: #FCBF49; + display: inline-block; + padding: 10px; + border-radius: 5px; + white-space: nowrap; + -webkit-transition: .3s; + transition: .3s; +} + +.inputfile + label:hover { + background-color: #f08336; +} + +.fileinput-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + border: #FCBF49 1px solid; + border-radius: 5px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.filename { + max-width: 200px; + text-align: center; + min-width: 100px; + color: #FCBF49; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; + padding: 10px; + white-space: nowrap; + cursor: default; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + gap: 5%; +} + +.filename svg { + cursor: pointer; +} + +.inputfile + label { + cursor: pointer; + /* "hand" cursor */ +} + +/* .inputfile:focus + label, +.inputfile + label:hover { + background-color: $primary-dark; +} + */ +.inputfile + label svg { + width: 1em; + height: 1em; + vertical-align: middle; + fill: currentColor; + margin-top: -0.25em; + /* 4px */ + margin-right: 0.25em; + /* 4px */ +} +/*# sourceMappingURL=ModelInput.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/ModelInput.module.css.map b/frontend/styles/exos/ModelInput.module.css.map new file mode 100644 index 00000000..b3e1a16c --- /dev/null +++ b/frontend/styles/exos/ModelInput.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "ModelInput.module.scss", + "../variables.scss" + ], + "names": [], + "file": "ModelInput.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/ModelInput.module.scss b/frontend/styles/exos/ModelInput.module.scss index 22bffe96..28a4d61a 100644 --- a/frontend/styles/exos/ModelInput.module.scss +++ b/frontend/styles/exos/ModelInput.module.scss @@ -1,41 +1,45 @@ - - -.open-btn{ +@import "../variables"; +.open-btn { height: max-content; } .button-lang { - //height: 3.5vh; - width: 5%; - min-width: max-content; - border: none; - border-radius: 5px; - color: white; - font-weight: bolder; - margin: 2%; - margin-left: 0; - display: flex; - align-items: center; - padding: 2%; - - & > svg{ - height: 120%; - } + //height: 3.5vh; + width: 5%; + min-width: max-content; + border: none; + border-radius: 5px; + color: white; + font-weight: bolder; + margin: 2%; + margin-left: 0; + display: flex; + align-items: center; + padding: 10px; + margin-right: 0; + gap: 5px; + & > svg { + height: 120%; + } } .button-lang-python { - background-color: #045aff; - box-shadow: 0px 0px 10px 1px rgba(11, 2, 72, 0.72); - &:hover{ - background-color: #0e45ac; - box-shadow: 0px 0px 10px 1px rgba(11, 2, 65, 0.72); - } + background-color: $bleu; + + transition:.3s; + border: 1px solid $bleu; + box-shadow: 0px 0px 10px 1px rgba(11, 2, 72, 0.72); + &:hover { + background-color: darken($color: $bleu, $amount: 15); + box-shadow: 0px 0px 10px 1px rgba(11, 2, 65, 0.72); + + border: 1px solid darken($color: $bleu, $amount: 15); + } } - -.btn-disabled{ +.btn-disabled { background-color: grey; - &:hover{ + &:hover { background-color: grey; } } @@ -47,4 +51,79 @@ height: 100%; width: 5%; } + & > p { + margin: 1%; + font-weight: 600; + } +} + +.inputfile { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; + + & + label { + font-size: 1; + font-weight: 700; + color: black; + background-color: $primary; + display: inline-block; + padding: 10px; + border-radius: 5px; + white-space: nowrap; + transition:.3s; + &:hover { + background-color: $primary-dark; + } + } +} + +.fileinput-container { + display: flex; + border: $primary 1px solid; + border-radius: 5px; + align-items: center; +} + +.filename { + max-width: 200px; + text-align: center; + min-width: 100px; + color: $primary; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; + padding: 10px; + white-space: nowrap; + cursor: default; + + display: flex; + align-items: center; + justify-content: center; + gap: 5%; + & svg { + cursor: pointer; + } +} + +.inputfile + label { + cursor: pointer; /* "hand" cursor */ +} +/* .inputfile:focus + label, +.inputfile + label:hover { + background-color: $primary-dark; +} + */ +.inputfile + label svg { + width: 1em; + height: 1em; + vertical-align: middle; + fill: currentColor; + margin-top: -0.25em; + /* 4px */ + margin-right: 0.25em; + /* 4px */ } diff --git a/frontend/styles/exos/Notifications.module.css b/frontend/styles/exos/Notifications.module.css new file mode 100644 index 00000000..15aa6f8b --- /dev/null +++ b/frontend/styles/exos/Notifications.module.css @@ -0,0 +1,116 @@ +.notifications-container { + position: fixed; + top: 0; + right: 0; + margin: 1.5%; + width: 20%; + z-index: 100000000; +} + +@-webkit-keyframes pop { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes pop { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation: fadeOut 0.3s forwards !important; + animation: fadeOut 0.3s forwards !important; +} + +.notif-title { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-weight: bold; +} + +.notif-title svg { + -webkit-margin-end: 8px; + margin-inline-end: 8px; +} + +.notif { + width: 100%; + -webkit-animation: pop .3s forwards; + animation: pop .3s forwards; + margin: 2% 0; + min-height: 50px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding: 2%; +} + +.notif-msg { + margin-left: 8%; + font-size: .9em; +} + +.notif-msg svg { + -webkit-margin-end: 8px; + margin-inline-end: 8px; + opacity: 0; +} + +.notif-success { + background-color: #41cf7c; + opacity: 1; + -webkit-transition: .3s; + transition: .3s; +} + +.notif-success:hover { + background-color: #92e4b4; + opacity: 0.8 !important; +} + +.notif-danger { + background-color: #ff4f64; + opacity: 1; + -webkit-transition: .3s; + transition: .3s; +} + +.notif-danger:hover { + background-color: #ffb5be; + opacity: 0.8 !important; +} +/*# sourceMappingURL=Notifications.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Notifications.module.css.map b/frontend/styles/exos/Notifications.module.css.map new file mode 100644 index 00000000..14b89a33 --- /dev/null +++ b/frontend/styles/exos/Notifications.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,wBAAwB,CAAA;EACtB,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,GAAG;EACV,OAAO,EAAE,SAAS;CACnB;;AAED,UAAU,CAAV,GAAU;EACR,IAAI;IACF,OAAO,EAAE,CAAC;;EACX,EAAE;IACD,OAAO,EAAE,CAAC;;;;AAId,UAAU,CAAV,OAAU;EACR,IAAI;IAAC,OAAO,EAAE,CAAC;;EACf,EAAE;IAAC,OAAO,EAAE,CAAC;;;;AAEf,AAAA,QAAQ,CAAA;EACN,SAAS,EAAE,OAAO,CAAC,IAAG,CAAC,QAAQ,CAAA,UAAU;CAC1C;;AAGD,AAAA,YAAY,CAAA;EACV,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,IAAI;CAIlB;;AAPD,AAIE,YAJU,CAIR,GAAG,CAAA;EACH,iBAAiB,EAAE,GAAG;CACvB;;AAGH,AAAA,MAAM,CAAA;EACJ,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,gBAAgB;EAC3B,MAAM,EAAG,IAAI;EACb,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,OAAO,EAAE,EAAE;CACZ;;AAED,AAAA,UAAU,CAAA;EACR,WAAW,EAAE,EAAE;EACf,SAAS,EAAE,IAAI;CAKhB;;AAPD,AAGE,UAHQ,CAGN,GAAG,CAAA;EACH,iBAAiB,EAAE,GAAG;EACtB,OAAO,EAAE,CAAC;CACX;;AAGH,AAAA,cAAc,CAAA;EACZ,gBAAgB,ECtCV,OAAO;EDuCb,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,GAAG;CAKhB;;AARD,AAIE,cAJY,AAIX,MAAM,CAAA;EACL,gBAAgB,EAAE,OAAoC;EACtD,OAAO,EAAE,GAAG,CAAA,UAAU;CACvB;;AAGH,AAAA,aAAa,CAAA;EACX,gBAAgB,ECjDZ,OAAiB;EDkDrB,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,GAAG;CAKhB;;AARD,AAIE,aAJW,AAIV,MAAM,CAAA;EACL,gBAAgB,EAAE,OAAkC;EACpD,OAAO,EAAE,GAAG,CAAA,UAAU;CACvB", + "sources": [ + "Notifications.module.scss", + "../variables.scss" + ], + "names": [], + "file": "Notifications.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Paginaton.module.css b/frontend/styles/exos/Paginaton.module.css new file mode 100644 index 00000000..86e092ef --- /dev/null +++ b/frontend/styles/exos/Paginaton.module.css @@ -0,0 +1,23 @@ +.pagination { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 10%; + margin-top: 5%; +} + +.pagination-page { + border: 1px solid #181553; + padding: 7px; + margin: 7px; + cursor: pointer; +} + +.pagination-page-active { + background-color: #FCBF49; + color: #080808; +} +/*# sourceMappingURL=Paginaton.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Paginaton.module.css.map b/frontend/styles/exos/Paginaton.module.css.map new file mode 100644 index 00000000..3b4543ab --- /dev/null +++ b/frontend/styles/exos/Paginaton.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,WAAW,CAAA;EACP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;EACvB,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,EAAE;CACjB;;AAED,AAAA,gBAAgB,CAAA;EACZ,MAAM,EAAE,GAAG,CAAC,KAAK,CCGZ,OAAO;EDFZ,OAAO,EAAE,GAAG;EACZ,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,OAAO;CAClB;;AAED,AAAA,uBAAuB,CAAA;EACnB,gBAAgB,ECjBV,OAAO;EDkBb,KAAK,EChBI,OAAO;CDiBnB", + "sources": [ + "Paginaton.module.scss", + "../variables.scss" + ], + "names": [], + "file": "Paginaton.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/StepExemple.module.css b/frontend/styles/exos/StepExemple.module.css new file mode 100644 index 00000000..c6722a22 --- /dev/null +++ b/frontend/styles/exos/StepExemple.module.css @@ -0,0 +1,37 @@ +.step-exemple-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + /* grid-area: 'ex'; + grid-column: 1/2; + grid-row: 4; */ + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; + display: block; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; + margin: 0 30px; + max-width: 80%; +} + +.step-exemple { + background-color: #171446; + padding: 10px 50px; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + border-radius: 10px; + padding-left: 10px; + font-size: 14px; + min-width: 60%; +} + +.step-exemple p { + text-align: left; +} +/*# sourceMappingURL=StepExemple.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/StepExemple.module.css.map b/frontend/styles/exos/StepExemple.module.css.map new file mode 100644 index 00000000..a139aead --- /dev/null +++ b/frontend/styles/exos/StepExemple.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AACA,AAAA,uBAAuB,CAAA;EACnB,OAAO,EAAE,IAAI;EAEb,eAAe,EAAE,MAAM;EACxB;;mBAEgB;EAEf,MAAM,EAAE,WAAW;EACnB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,WAAW;EAElB,MAAM,EAAE,MAAM;EACd,SAAS,EAAE,GAAG;CACjB;;AAED,AAAA,aAAa,CAAA;EACT,gBAAgB,EAAE,OAAuC;EACzD,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE,WAAW;EAClB,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,IAAK;EACnB,SAAS,EAAE,IAAI;EACf,SAAS,EAAE,GAAG;CAKjB;;AAZD,AASI,aATS,CASP,CAAC,CAAC;EACF,UAAU,EAAE,IAAI;CACjB", + "sources": [ + "StepExemple.module.scss", + "../variables.scss" + ], + "names": [], + "file": "StepExemple.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/StepOptions.module.css b/frontend/styles/exos/StepOptions.module.css new file mode 100644 index 00000000..f2480a12 --- /dev/null +++ b/frontend/styles/exos/StepOptions.module.css @@ -0,0 +1,27 @@ +.options { + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; +} + +.options > input { + display: block; + margin: 20px 0; + margin-left: 30px; + margin-top: 10px; + background-color: #1a0f7a; + color: white; + border: none; + padding: 10px; + border-radius: 10px; +} + +.options > label { + text-align: left; + margin: 10px; + margin-top: 10px; + margin-bottom: 0; + margin-left: 30px; + font-weight: 800; +} +/*# sourceMappingURL=StepOptions.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/StepOptions.module.css.map b/frontend/styles/exos/StepOptions.module.css.map new file mode 100644 index 00000000..c941888b --- /dev/null +++ b/frontend/styles/exos/StepOptions.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,QAAQ,CAAA;EAEJ,MAAM,EAAE,WAAW;CAwBtB;;AA1BD,AAMI,QANI,GAMA,KAAK,CAAA;EACL,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,MAAM;EACd,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;EAChB,gBAAgB,ECCL,OAAO;EDAlB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,IAAI;CACtB;;AAhBL,AAkBI,QAlBI,GAkBA,KAAK,CAAA;EACL,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,CAAC;EAChB,WAAW,EAAE,IAAI;EACjB,WAAW,EAAE,GAAG;CACnB", + "sources": [ + "StepOptions.module.scss", + "../variables.scss" + ], + "names": [], + "file": "StepOptions.module.css" +} \ No newline at end of file diff --git a/frontend/styles/exos/Tag.module.css b/frontend/styles/exos/Tag.module.css new file mode 100644 index 00000000..aa9d6cb9 --- /dev/null +++ b/frontend/styles/exos/Tag.module.css @@ -0,0 +1,44 @@ +.tag { + border-radius: 5px; + font-size: 0.9em; + margin: 3%; + display: inline-block; + height: -webkit-max-content; + height: -moz-max-content; + height: max-content; + z-index: 4; +} + +.tag-remove { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-radius: 2px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-left: 4px; + padding-right: 4px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.tag-remove svg { + display: inline-block; + fill: currentcolor; + line-height: 1; + stroke: currentcolor; + stroke-width: 0px; +} + +.tag-label { + border-radius: 2px; + font-size: 85%; + overflow: hidden; + padding: 3px 3px 3px 6px; + text-overflow: ellipsis; + white-space: nowrap; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +/*# sourceMappingURL=Tag.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/exos/Tag.module.css.map b/frontend/styles/exos/Tag.module.css.map new file mode 100644 index 00000000..3fc7bfcb --- /dev/null +++ b/frontend/styles/exos/Tag.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,IAAI,CAAC;EAGD,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,EAAE;EACV,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,WAAW;EACnB,OAAO,EAAE,CAAC;CAEb;;AAED,AAAA,WAAW,CAAC;EACR,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,IAAI;EACb,YAAY,EAAE,GAAG;EACjB,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,UAAU;CAQzB;;AAdD,AAOI,WAPO,CAOL,GAAG,CAAC;EACF,OAAO,EAAE,YAAY;EACrB,IAAI,EAAE,YAAY;EAClB,WAAW,EAAE,CAAC;EACd,MAAM,EAAE,YAAY;EACpB,YAAY,EAAE,GAAG;CACpB;;AAGL,AAAA,UAAU,CAAA;EACN,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,GAAG;EACd,QAAQ,EAAE,MAAM;EAChB,OAAO,EAAE,eAAe;EACxB,aAAa,EAAE,QAAQ;EACvB,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,UAAU;CACzB", + "sources": [ + "Tag.module.scss", + "../variables.scss" + ], + "names": [], + "file": "Tag.module.css" +} \ No newline at end of file diff --git a/frontend/styles/functions.css b/frontend/styles/functions.css new file mode 100644 index 00000000..fabd7325 --- /dev/null +++ b/frontend/styles/functions.css @@ -0,0 +1 @@ +/* No CSS *//*# sourceMappingURL=functions.css.map */ \ No newline at end of file diff --git a/frontend/styles/functions.css.map b/frontend/styles/functions.css.map new file mode 100644 index 00000000..f9428d88 --- /dev/null +++ b/frontend/styles/functions.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "", + "sources": [ + "functions.scss" + ], + "names": [], + "file": "functions.css" +} \ No newline at end of file diff --git a/frontend/styles/global_components.css b/frontend/styles/global_components.css new file mode 100644 index 00000000..1a68db30 --- /dev/null +++ b/frontend/styles/global_components.css @@ -0,0 +1,120 @@ +.exo-input { + background-color: inherit; + color: white; + height: 30px; + padding: 5px 10px; + width: 95%; + border-radius: 5px; + font-size: 16px; + font-weight: 450; + border: none; + margin: 10px 0; + float: left; + -webkit-transition: 0.3s; + transition: 0.3s; + border-bottom: 1px solid #181553; + border-radius: 0; +} + +.exo-input:focus { + border: none; + outline: none; + border-radius: 0; + border-bottom: 1.5px solid #5396e7; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.exo-input::-webkit-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input:-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-btn, .cancel-btn { + border: none; + border-radius: 5px; + height: 38px; + font-weight: 700; + background-color: #FCBF49; + -webkit-transition: 0.3s; + transition: 0.3s; + margin-bottom: 10px; + margin-right: 7px; + padding: 0 10%; +} + +.exo-btn:hover, .cancel-btn:hover { + background-color: #c28103; +} + +.cancel-btn { + background-color: #ff4f64; +} + +.cancel-btn:hover { + background-color: #cf0019; +} + +.search-container { + z-index: 10; +} + +.search__control, .card-select__control { + background-color: transparent !important; + border: none !important; + border-bottom: 1px solid #181553 !important; + border-radius: 0 !important; +} + +.search__control--is-focused, .card-select--is-focused { + border: none !important; + border-bottom: 1px solid #5396e7 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.search-container { + color: white; + width: 90%; +} + +.search__menu, .card-select__menu { + background-color: #1a0f7a !important; + z-index: 100 !important; + scrollbar-color: #5396e7 #1d1a5a; +} + +.search__input-container { + color: white !important; +} + +.card-select__menu-list { + z-index: 10000 !important; + max-height: 250px !important; +} + +.model_input-code_input { + border-radius: 3px; + width: 100% !important; + height: 95% !important; +} + +.red { + color: #ff4f64; +} +/*# sourceMappingURL=global_components.css.map */ \ No newline at end of file diff --git a/frontend/styles/global_components.css.map b/frontend/styles/global_components.css.map new file mode 100644 index 00000000..e6317bad --- /dev/null +++ b/frontend/styles/global_components.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,UAAU,CAAC;EACP,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAE,GAAG;EACV,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAEhB,aAAa,EAAE,GAAG,CAAC,KAAK,CCHnB,OAAO;EDIZ,aAAa,EAAE,CAAC;CAcnB;;AA7BD,AAgBI,UAhBM,AAgBL,MAAM,CAAC;EACJ,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,CAAC;EAChB,aAAa,EAAE,KAAK,CAAC,KAAK,CCLvB,OAAO;EDMV,UAAU,EAAE,IAAI;CAGnB;;AAxBL,AAyBI,UAzBM,AAyBL,aAAa,CAAC;EACX,KAAK,EAAE,OAAqC;EAC5C,SAAS,EAAE,IAAI;CAClB;;AAGL,AAAA,QAAQ,EAiBR,WAAW,CAjBF;EACL,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG;EAElB,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,GAAG;EAChB,gBAAgB,ECvCV,OAAO;EDwCb,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,GAAG;EACjB,OAAO,EAAE,KAAK;CAKjB;;AAfD,AAYI,QAZI,AAYH,MAAM,EAKX,WAAW,AALN,MAAM,CAAC;EACJ,gBAAgB,EAAE,OAAqC;CAC1D;;AAGL,AAAA,WAAW,CAAC;EAER,gBAAgB,EClCd,OAAiB;CDsCtB;;AAND,AAGI,WAHO,AAGN,MAAM,CAAC;EACJ,gBAAgB,EAAE,OAAiC;CACtD;;AAGL,AAAA,iBAAiB,CAAA;EACb,OAAO,EAAE,EAAE;CACd;;AAED,AAAA,gBAAgB,EAAE,qBAAqB,CAAA;EAEnC,gBAAgB,EAAE,WAAW,CAAA,UAAU;EACvC,MAAM,EAAE,IAAI,CAAA,UAAU;EACtB,aAAa,EAAE,GAAG,CAAC,KAAK,CCrDnB,OAAO,CDqDoB,UAAU;EAC1C,aAAa,EAAE,CAAC,CAAA,UAAU;CAC7B;;AAED,AAAA,4BAA4B,EAAE,wBAAwB,CAAA;EAClD,MAAM,EAAE,IAAI,CAAA,UAAU;EACtB,aAAa,EAAE,GAAG,CAAC,KAAK,CCvDjB,OAAO,CDuDoB,UAAU;EAC5C,UAAU,EAAE,IAAI,CAAA,UAAU;CAC7B;;AAhBD,AAAA,iBAAiB,CAiBA;EACb,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,GAAG;CACb;;AACD,AAAA,aAAa,EAAE,kBAAkB,CAAA;EAC7B,gBAAgB,EClED,OAAO,CDkEa,UAAU;EAC7C,OAAO,EAAE,GAAG,CAAA,UAAU;EACtB,eAAe,ECjER,OAAO,CALL,OAAO;CDuEnB;;AACD,AAAA,wBAAwB,CAAA;EACpB,KAAK,EAAE,KAAK,CAAA,UAAU;CACzB;;AAED,AAAA,uBAAuB,CAAA;EACnB,OAAO,EAAE,KAAK,CAAA,UAAU;EACxB,UAAU,EAAE,KAAK,CAAA,UAAU;CAC9B;;AAID,AAAA,uBAAuB,CAAA;EACnB,aAAa,EAAE,GAAG;EAClB,KAAK,EAAE,IAAI,CAAA,UAAU;EACrB,MAAM,EAAC,GAAG,CAAA,UAAU;CACvB;;AAGD,AAAA,IAAI,CAAA;EACA,KAAK,ECrFH,OAAiB;CDsFtB", + "sources": [ + "global_components.scss", + "variables.scss" + ], + "names": [], + "file": "global_components.css" +} \ No newline at end of file diff --git a/frontend/styles/globals.css b/frontend/styles/globals.css new file mode 100644 index 00000000..a83b8856 --- /dev/null +++ b/frontend/styles/globals.css @@ -0,0 +1,3214 @@ +.exo-input { + background-color: inherit; + color: white; + height: 30px; + padding: 5px 10px; + width: 95%; + border-radius: 5px; + font-size: 16px; + font-weight: 450; + border: none; + margin: 10px 0; + float: left; + -webkit-transition: 0.3s; + transition: 0.3s; + border-bottom: 1px solid #181553; + border-radius: 0; +} + +.exo-input:focus { + border: none; + outline: none; + border-radius: 0; + border-bottom: 1.5px solid #5396e7; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.exo-input::-webkit-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input:-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::-ms-input-placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-input::placeholder { + color: #302aa4; + font-size: 14px; +} + +.exo-btn, .cancel-btn { + border: none; + border-radius: 5px; + height: 38px; + font-weight: 700; + background-color: #FCBF49; + -webkit-transition: 0.3s; + transition: 0.3s; + margin-bottom: 10px; + margin-right: 7px; + padding: 0 10%; +} + +.exo-btn:hover, .cancel-btn:hover { + background-color: #c28103; +} + +.cancel-btn { + background-color: #ff4f64; +} + +.cancel-btn:hover { + background-color: #cf0019; +} + +.search-container { + z-index: 10; +} + +.search__control, .card-select__control { + background-color: transparent !important; + border: none !important; + border-bottom: 1px solid #181553 !important; + border-radius: 0 !important; +} + +.search__control--is-focused, .card-select--is-focused { + border: none !important; + border-bottom: 1px solid #5396e7 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.search-container { + color: white; + width: 90%; +} + +.search__menu, .card-select__menu { + background-color: #1a0f7a !important; + z-index: 100 !important; + scrollbar-color: #5396e7 #1d1a5a; +} + +.search__input-container { + color: white !important; +} + +.card-select__menu-list { + z-index: 10000 !important; + max-height: 250px !important; +} + +.model_input-code_input { + border-radius: 3px; + width: 100% !important; + height: 95% !important; +} + +.red { + color: #ff4f64; +} + +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + overflow: hidden; + background-color: #1d1a5a; + color: #d9d9d9; + background: -webkit-gradient(linear, right top, left bottom, color-stop(30%, #0D0221), to(#1a0f7a)); + background: linear-gradient(to bottom left, #0D0221 30%, #1a0f7a); + width: 100vw; + height: 100vh; +} + +:root { + --container-padding: 20px; + --container-width: calc(100vw - var(--container-padding) * 2); + --navbar-height: 60px; +} + +@media only screen and (min-width: 900px) { + :root { + --container-padding: 32px; + } +} + +@media only screen and (min-width: 1370px) { + :root { + --container-padding: 20px; + --container-width: 1330px; + } +} + +* { + scrollbar-width: thin !important; + scrollbar-color: #5396e7 transparent; +} + + +.container { + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + padding-left: calc(50% - var(--container-width) / 2); + padding-right: calc(50% - var(--container-width) / 2); + height: calc(100vh - var(--navbar-height) - 10px); + overflow: auto; +} + +*::-webkit-scrollbar { + z-index: 100000; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.small-text { + color: grey; + font-size: 0.95rem; + font-weight: normal; +} + +.margin-0 { + margin: 0% !important; +} + +.marginl-p0 { + margin-left: 0% !important; +} + +.marginr-p0 { + margin-right: 0% !important; +} + +.marginb-p0 { + margin-bottom: 0% !important; +} + +.margint-p0 { + margin-top: 0% !important; +} + +.vh-0 { + height: 0vh !important; +} + +.vw-0 { + width: 0vw !important; +} + +.margin-1 { + margin: 1% !important; +} + +.marginl-p1 { + margin-left: 1% !important; +} + +.marginr-p1 { + margin-right: 1% !important; +} + +.marginb-p1 { + margin-bottom: 1% !important; +} + +.margint-p1 { + margin-top: 1% !important; +} + +.vh-1 { + height: 1vh !important; +} + +.vw-1 { + width: 1vw !important; +} + +.margin-2 { + margin: 2% !important; +} + +.marginl-p2 { + margin-left: 2% !important; +} + +.marginr-p2 { + margin-right: 2% !important; +} + +.marginb-p2 { + margin-bottom: 2% !important; +} + +.margint-p2 { + margin-top: 2% !important; +} + +.vh-2 { + height: 2vh !important; +} + +.vw-2 { + width: 2vw !important; +} + +.margin-3 { + margin: 3% !important; +} + +.marginl-p3 { + margin-left: 3% !important; +} + +.marginr-p3 { + margin-right: 3% !important; +} + +.marginb-p3 { + margin-bottom: 3% !important; +} + +.margint-p3 { + margin-top: 3% !important; +} + +.vh-3 { + height: 3vh !important; +} + +.vw-3 { + width: 3vw !important; +} + +.margin-4 { + margin: 4% !important; +} + +.marginl-p4 { + margin-left: 4% !important; +} + +.marginr-p4 { + margin-right: 4% !important; +} + +.marginb-p4 { + margin-bottom: 4% !important; +} + +.margint-p4 { + margin-top: 4% !important; +} + +.vh-4 { + height: 4vh !important; +} + +.vw-4 { + width: 4vw !important; +} + +.margin-5 { + margin: 5% !important; +} + +.marginl-p5 { + margin-left: 5% !important; +} + +.marginr-p5 { + margin-right: 5% !important; +} + +.marginb-p5 { + margin-bottom: 5% !important; +} + +.margint-p5 { + margin-top: 5% !important; +} + +.vh-5 { + height: 5vh !important; +} + +.vw-5 { + width: 5vw !important; +} + +.margin-6 { + margin: 6% !important; +} + +.marginl-p6 { + margin-left: 6% !important; +} + +.marginr-p6 { + margin-right: 6% !important; +} + +.marginb-p6 { + margin-bottom: 6% !important; +} + +.margint-p6 { + margin-top: 6% !important; +} + +.vh-6 { + height: 6vh !important; +} + +.vw-6 { + width: 6vw !important; +} + +.margin-7 { + margin: 7% !important; +} + +.marginl-p7 { + margin-left: 7% !important; +} + +.marginr-p7 { + margin-right: 7% !important; +} + +.marginb-p7 { + margin-bottom: 7% !important; +} + +.margint-p7 { + margin-top: 7% !important; +} + +.vh-7 { + height: 7vh !important; +} + +.vw-7 { + width: 7vw !important; +} + +.margin-8 { + margin: 8% !important; +} + +.marginl-p8 { + margin-left: 8% !important; +} + +.marginr-p8 { + margin-right: 8% !important; +} + +.marginb-p8 { + margin-bottom: 8% !important; +} + +.margint-p8 { + margin-top: 8% !important; +} + +.vh-8 { + height: 8vh !important; +} + +.vw-8 { + width: 8vw !important; +} + +.margin-9 { + margin: 9% !important; +} + +.marginl-p9 { + margin-left: 9% !important; +} + +.marginr-p9 { + margin-right: 9% !important; +} + +.marginb-p9 { + margin-bottom: 9% !important; +} + +.margint-p9 { + margin-top: 9% !important; +} + +.vh-9 { + height: 9vh !important; +} + +.vw-9 { + width: 9vw !important; +} + +.margin-10 { + margin: 10% !important; +} + +.marginl-p10 { + margin-left: 10% !important; +} + +.marginr-p10 { + margin-right: 10% !important; +} + +.marginb-p10 { + margin-bottom: 10% !important; +} + +.margint-p10 { + margin-top: 10% !important; +} + +.vh-10 { + height: 10vh !important; +} + +.vw-10 { + width: 10vw !important; +} + +.margin-11 { + margin: 11% !important; +} + +.marginl-p11 { + margin-left: 11% !important; +} + +.marginr-p11 { + margin-right: 11% !important; +} + +.marginb-p11 { + margin-bottom: 11% !important; +} + +.margint-p11 { + margin-top: 11% !important; +} + +.vh-11 { + height: 11vh !important; +} + +.vw-11 { + width: 11vw !important; +} + +.margin-12 { + margin: 12% !important; +} + +.marginl-p12 { + margin-left: 12% !important; +} + +.marginr-p12 { + margin-right: 12% !important; +} + +.marginb-p12 { + margin-bottom: 12% !important; +} + +.margint-p12 { + margin-top: 12% !important; +} + +.vh-12 { + height: 12vh !important; +} + +.vw-12 { + width: 12vw !important; +} + +.margin-13 { + margin: 13% !important; +} + +.marginl-p13 { + margin-left: 13% !important; +} + +.marginr-p13 { + margin-right: 13% !important; +} + +.marginb-p13 { + margin-bottom: 13% !important; +} + +.margint-p13 { + margin-top: 13% !important; +} + +.vh-13 { + height: 13vh !important; +} + +.vw-13 { + width: 13vw !important; +} + +.margin-14 { + margin: 14% !important; +} + +.marginl-p14 { + margin-left: 14% !important; +} + +.marginr-p14 { + margin-right: 14% !important; +} + +.marginb-p14 { + margin-bottom: 14% !important; +} + +.margint-p14 { + margin-top: 14% !important; +} + +.vh-14 { + height: 14vh !important; +} + +.vw-14 { + width: 14vw !important; +} + +.margin-15 { + margin: 15% !important; +} + +.marginl-p15 { + margin-left: 15% !important; +} + +.marginr-p15 { + margin-right: 15% !important; +} + +.marginb-p15 { + margin-bottom: 15% !important; +} + +.margint-p15 { + margin-top: 15% !important; +} + +.vh-15 { + height: 15vh !important; +} + +.vw-15 { + width: 15vw !important; +} + +.margin-16 { + margin: 16% !important; +} + +.marginl-p16 { + margin-left: 16% !important; +} + +.marginr-p16 { + margin-right: 16% !important; +} + +.marginb-p16 { + margin-bottom: 16% !important; +} + +.margint-p16 { + margin-top: 16% !important; +} + +.vh-16 { + height: 16vh !important; +} + +.vw-16 { + width: 16vw !important; +} + +.margin-17 { + margin: 17% !important; +} + +.marginl-p17 { + margin-left: 17% !important; +} + +.marginr-p17 { + margin-right: 17% !important; +} + +.marginb-p17 { + margin-bottom: 17% !important; +} + +.margint-p17 { + margin-top: 17% !important; +} + +.vh-17 { + height: 17vh !important; +} + +.vw-17 { + width: 17vw !important; +} + +.margin-18 { + margin: 18% !important; +} + +.marginl-p18 { + margin-left: 18% !important; +} + +.marginr-p18 { + margin-right: 18% !important; +} + +.marginb-p18 { + margin-bottom: 18% !important; +} + +.margint-p18 { + margin-top: 18% !important; +} + +.vh-18 { + height: 18vh !important; +} + +.vw-18 { + width: 18vw !important; +} + +.margin-19 { + margin: 19% !important; +} + +.marginl-p19 { + margin-left: 19% !important; +} + +.marginr-p19 { + margin-right: 19% !important; +} + +.marginb-p19 { + margin-bottom: 19% !important; +} + +.margint-p19 { + margin-top: 19% !important; +} + +.vh-19 { + height: 19vh !important; +} + +.vw-19 { + width: 19vw !important; +} + +.margin-20 { + margin: 20% !important; +} + +.marginl-p20 { + margin-left: 20% !important; +} + +.marginr-p20 { + margin-right: 20% !important; +} + +.marginb-p20 { + margin-bottom: 20% !important; +} + +.margint-p20 { + margin-top: 20% !important; +} + +.vh-20 { + height: 20vh !important; +} + +.vw-20 { + width: 20vw !important; +} + +.margin-21 { + margin: 21% !important; +} + +.marginl-p21 { + margin-left: 21% !important; +} + +.marginr-p21 { + margin-right: 21% !important; +} + +.marginb-p21 { + margin-bottom: 21% !important; +} + +.margint-p21 { + margin-top: 21% !important; +} + +.vh-21 { + height: 21vh !important; +} + +.vw-21 { + width: 21vw !important; +} + +.margin-22 { + margin: 22% !important; +} + +.marginl-p22 { + margin-left: 22% !important; +} + +.marginr-p22 { + margin-right: 22% !important; +} + +.marginb-p22 { + margin-bottom: 22% !important; +} + +.margint-p22 { + margin-top: 22% !important; +} + +.vh-22 { + height: 22vh !important; +} + +.vw-22 { + width: 22vw !important; +} + +.margin-23 { + margin: 23% !important; +} + +.marginl-p23 { + margin-left: 23% !important; +} + +.marginr-p23 { + margin-right: 23% !important; +} + +.marginb-p23 { + margin-bottom: 23% !important; +} + +.margint-p23 { + margin-top: 23% !important; +} + +.vh-23 { + height: 23vh !important; +} + +.vw-23 { + width: 23vw !important; +} + +.margin-24 { + margin: 24% !important; +} + +.marginl-p24 { + margin-left: 24% !important; +} + +.marginr-p24 { + margin-right: 24% !important; +} + +.marginb-p24 { + margin-bottom: 24% !important; +} + +.margint-p24 { + margin-top: 24% !important; +} + +.vh-24 { + height: 24vh !important; +} + +.vw-24 { + width: 24vw !important; +} + +.margin-25 { + margin: 25% !important; +} + +.marginl-p25 { + margin-left: 25% !important; +} + +.marginr-p25 { + margin-right: 25% !important; +} + +.marginb-p25 { + margin-bottom: 25% !important; +} + +.margint-p25 { + margin-top: 25% !important; +} + +.vh-25 { + height: 25vh !important; +} + +.vw-25 { + width: 25vw !important; +} + +.margin-26 { + margin: 26% !important; +} + +.marginl-p26 { + margin-left: 26% !important; +} + +.marginr-p26 { + margin-right: 26% !important; +} + +.marginb-p26 { + margin-bottom: 26% !important; +} + +.margint-p26 { + margin-top: 26% !important; +} + +.vh-26 { + height: 26vh !important; +} + +.vw-26 { + width: 26vw !important; +} + +.margin-27 { + margin: 27% !important; +} + +.marginl-p27 { + margin-left: 27% !important; +} + +.marginr-p27 { + margin-right: 27% !important; +} + +.marginb-p27 { + margin-bottom: 27% !important; +} + +.margint-p27 { + margin-top: 27% !important; +} + +.vh-27 { + height: 27vh !important; +} + +.vw-27 { + width: 27vw !important; +} + +.margin-28 { + margin: 28% !important; +} + +.marginl-p28 { + margin-left: 28% !important; +} + +.marginr-p28 { + margin-right: 28% !important; +} + +.marginb-p28 { + margin-bottom: 28% !important; +} + +.margint-p28 { + margin-top: 28% !important; +} + +.vh-28 { + height: 28vh !important; +} + +.vw-28 { + width: 28vw !important; +} + +.margin-29 { + margin: 29% !important; +} + +.marginl-p29 { + margin-left: 29% !important; +} + +.marginr-p29 { + margin-right: 29% !important; +} + +.marginb-p29 { + margin-bottom: 29% !important; +} + +.margint-p29 { + margin-top: 29% !important; +} + +.vh-29 { + height: 29vh !important; +} + +.vw-29 { + width: 29vw !important; +} + +.margin-30 { + margin: 30% !important; +} + +.marginl-p30 { + margin-left: 30% !important; +} + +.marginr-p30 { + margin-right: 30% !important; +} + +.marginb-p30 { + margin-bottom: 30% !important; +} + +.margint-p30 { + margin-top: 30% !important; +} + +.vh-30 { + height: 30vh !important; +} + +.vw-30 { + width: 30vw !important; +} + +.margin-31 { + margin: 31% !important; +} + +.marginl-p31 { + margin-left: 31% !important; +} + +.marginr-p31 { + margin-right: 31% !important; +} + +.marginb-p31 { + margin-bottom: 31% !important; +} + +.margint-p31 { + margin-top: 31% !important; +} + +.vh-31 { + height: 31vh !important; +} + +.vw-31 { + width: 31vw !important; +} + +.margin-32 { + margin: 32% !important; +} + +.marginl-p32 { + margin-left: 32% !important; +} + +.marginr-p32 { + margin-right: 32% !important; +} + +.marginb-p32 { + margin-bottom: 32% !important; +} + +.margint-p32 { + margin-top: 32% !important; +} + +.vh-32 { + height: 32vh !important; +} + +.vw-32 { + width: 32vw !important; +} + +.margin-33 { + margin: 33% !important; +} + +.marginl-p33 { + margin-left: 33% !important; +} + +.marginr-p33 { + margin-right: 33% !important; +} + +.marginb-p33 { + margin-bottom: 33% !important; +} + +.margint-p33 { + margin-top: 33% !important; +} + +.vh-33 { + height: 33vh !important; +} + +.vw-33 { + width: 33vw !important; +} + +.margin-34 { + margin: 34% !important; +} + +.marginl-p34 { + margin-left: 34% !important; +} + +.marginr-p34 { + margin-right: 34% !important; +} + +.marginb-p34 { + margin-bottom: 34% !important; +} + +.margint-p34 { + margin-top: 34% !important; +} + +.vh-34 { + height: 34vh !important; +} + +.vw-34 { + width: 34vw !important; +} + +.margin-35 { + margin: 35% !important; +} + +.marginl-p35 { + margin-left: 35% !important; +} + +.marginr-p35 { + margin-right: 35% !important; +} + +.marginb-p35 { + margin-bottom: 35% !important; +} + +.margint-p35 { + margin-top: 35% !important; +} + +.vh-35 { + height: 35vh !important; +} + +.vw-35 { + width: 35vw !important; +} + +.margin-36 { + margin: 36% !important; +} + +.marginl-p36 { + margin-left: 36% !important; +} + +.marginr-p36 { + margin-right: 36% !important; +} + +.marginb-p36 { + margin-bottom: 36% !important; +} + +.margint-p36 { + margin-top: 36% !important; +} + +.vh-36 { + height: 36vh !important; +} + +.vw-36 { + width: 36vw !important; +} + +.margin-37 { + margin: 37% !important; +} + +.marginl-p37 { + margin-left: 37% !important; +} + +.marginr-p37 { + margin-right: 37% !important; +} + +.marginb-p37 { + margin-bottom: 37% !important; +} + +.margint-p37 { + margin-top: 37% !important; +} + +.vh-37 { + height: 37vh !important; +} + +.vw-37 { + width: 37vw !important; +} + +.margin-38 { + margin: 38% !important; +} + +.marginl-p38 { + margin-left: 38% !important; +} + +.marginr-p38 { + margin-right: 38% !important; +} + +.marginb-p38 { + margin-bottom: 38% !important; +} + +.margint-p38 { + margin-top: 38% !important; +} + +.vh-38 { + height: 38vh !important; +} + +.vw-38 { + width: 38vw !important; +} + +.margin-39 { + margin: 39% !important; +} + +.marginl-p39 { + margin-left: 39% !important; +} + +.marginr-p39 { + margin-right: 39% !important; +} + +.marginb-p39 { + margin-bottom: 39% !important; +} + +.margint-p39 { + margin-top: 39% !important; +} + +.vh-39 { + height: 39vh !important; +} + +.vw-39 { + width: 39vw !important; +} + +.margin-40 { + margin: 40% !important; +} + +.marginl-p40 { + margin-left: 40% !important; +} + +.marginr-p40 { + margin-right: 40% !important; +} + +.marginb-p40 { + margin-bottom: 40% !important; +} + +.margint-p40 { + margin-top: 40% !important; +} + +.vh-40 { + height: 40vh !important; +} + +.vw-40 { + width: 40vw !important; +} + +.margin-41 { + margin: 41% !important; +} + +.marginl-p41 { + margin-left: 41% !important; +} + +.marginr-p41 { + margin-right: 41% !important; +} + +.marginb-p41 { + margin-bottom: 41% !important; +} + +.margint-p41 { + margin-top: 41% !important; +} + +.vh-41 { + height: 41vh !important; +} + +.vw-41 { + width: 41vw !important; +} + +.margin-42 { + margin: 42% !important; +} + +.marginl-p42 { + margin-left: 42% !important; +} + +.marginr-p42 { + margin-right: 42% !important; +} + +.marginb-p42 { + margin-bottom: 42% !important; +} + +.margint-p42 { + margin-top: 42% !important; +} + +.vh-42 { + height: 42vh !important; +} + +.vw-42 { + width: 42vw !important; +} + +.margin-43 { + margin: 43% !important; +} + +.marginl-p43 { + margin-left: 43% !important; +} + +.marginr-p43 { + margin-right: 43% !important; +} + +.marginb-p43 { + margin-bottom: 43% !important; +} + +.margint-p43 { + margin-top: 43% !important; +} + +.vh-43 { + height: 43vh !important; +} + +.vw-43 { + width: 43vw !important; +} + +.margin-44 { + margin: 44% !important; +} + +.marginl-p44 { + margin-left: 44% !important; +} + +.marginr-p44 { + margin-right: 44% !important; +} + +.marginb-p44 { + margin-bottom: 44% !important; +} + +.margint-p44 { + margin-top: 44% !important; +} + +.vh-44 { + height: 44vh !important; +} + +.vw-44 { + width: 44vw !important; +} + +.margin-45 { + margin: 45% !important; +} + +.marginl-p45 { + margin-left: 45% !important; +} + +.marginr-p45 { + margin-right: 45% !important; +} + +.marginb-p45 { + margin-bottom: 45% !important; +} + +.margint-p45 { + margin-top: 45% !important; +} + +.vh-45 { + height: 45vh !important; +} + +.vw-45 { + width: 45vw !important; +} + +.margin-46 { + margin: 46% !important; +} + +.marginl-p46 { + margin-left: 46% !important; +} + +.marginr-p46 { + margin-right: 46% !important; +} + +.marginb-p46 { + margin-bottom: 46% !important; +} + +.margint-p46 { + margin-top: 46% !important; +} + +.vh-46 { + height: 46vh !important; +} + +.vw-46 { + width: 46vw !important; +} + +.margin-47 { + margin: 47% !important; +} + +.marginl-p47 { + margin-left: 47% !important; +} + +.marginr-p47 { + margin-right: 47% !important; +} + +.marginb-p47 { + margin-bottom: 47% !important; +} + +.margint-p47 { + margin-top: 47% !important; +} + +.vh-47 { + height: 47vh !important; +} + +.vw-47 { + width: 47vw !important; +} + +.margin-48 { + margin: 48% !important; +} + +.marginl-p48 { + margin-left: 48% !important; +} + +.marginr-p48 { + margin-right: 48% !important; +} + +.marginb-p48 { + margin-bottom: 48% !important; +} + +.margint-p48 { + margin-top: 48% !important; +} + +.vh-48 { + height: 48vh !important; +} + +.vw-48 { + width: 48vw !important; +} + +.margin-49 { + margin: 49% !important; +} + +.marginl-p49 { + margin-left: 49% !important; +} + +.marginr-p49 { + margin-right: 49% !important; +} + +.marginb-p49 { + margin-bottom: 49% !important; +} + +.margint-p49 { + margin-top: 49% !important; +} + +.vh-49 { + height: 49vh !important; +} + +.vw-49 { + width: 49vw !important; +} + +.margin-50 { + margin: 50% !important; +} + +.marginl-p50 { + margin-left: 50% !important; +} + +.marginr-p50 { + margin-right: 50% !important; +} + +.marginb-p50 { + margin-bottom: 50% !important; +} + +.margint-p50 { + margin-top: 50% !important; +} + +.vh-50 { + height: 50vh !important; +} + +.vw-50 { + width: 50vw !important; +} + +.margin-51 { + margin: 51% !important; +} + +.marginl-p51 { + margin-left: 51% !important; +} + +.marginr-p51 { + margin-right: 51% !important; +} + +.marginb-p51 { + margin-bottom: 51% !important; +} + +.margint-p51 { + margin-top: 51% !important; +} + +.vh-51 { + height: 51vh !important; +} + +.vw-51 { + width: 51vw !important; +} + +.margin-52 { + margin: 52% !important; +} + +.marginl-p52 { + margin-left: 52% !important; +} + +.marginr-p52 { + margin-right: 52% !important; +} + +.marginb-p52 { + margin-bottom: 52% !important; +} + +.margint-p52 { + margin-top: 52% !important; +} + +.vh-52 { + height: 52vh !important; +} + +.vw-52 { + width: 52vw !important; +} + +.margin-53 { + margin: 53% !important; +} + +.marginl-p53 { + margin-left: 53% !important; +} + +.marginr-p53 { + margin-right: 53% !important; +} + +.marginb-p53 { + margin-bottom: 53% !important; +} + +.margint-p53 { + margin-top: 53% !important; +} + +.vh-53 { + height: 53vh !important; +} + +.vw-53 { + width: 53vw !important; +} + +.margin-54 { + margin: 54% !important; +} + +.marginl-p54 { + margin-left: 54% !important; +} + +.marginr-p54 { + margin-right: 54% !important; +} + +.marginb-p54 { + margin-bottom: 54% !important; +} + +.margint-p54 { + margin-top: 54% !important; +} + +.vh-54 { + height: 54vh !important; +} + +.vw-54 { + width: 54vw !important; +} + +.margin-55 { + margin: 55% !important; +} + +.marginl-p55 { + margin-left: 55% !important; +} + +.marginr-p55 { + margin-right: 55% !important; +} + +.marginb-p55 { + margin-bottom: 55% !important; +} + +.margint-p55 { + margin-top: 55% !important; +} + +.vh-55 { + height: 55vh !important; +} + +.vw-55 { + width: 55vw !important; +} + +.margin-56 { + margin: 56% !important; +} + +.marginl-p56 { + margin-left: 56% !important; +} + +.marginr-p56 { + margin-right: 56% !important; +} + +.marginb-p56 { + margin-bottom: 56% !important; +} + +.margint-p56 { + margin-top: 56% !important; +} + +.vh-56 { + height: 56vh !important; +} + +.vw-56 { + width: 56vw !important; +} + +.margin-57 { + margin: 57% !important; +} + +.marginl-p57 { + margin-left: 57% !important; +} + +.marginr-p57 { + margin-right: 57% !important; +} + +.marginb-p57 { + margin-bottom: 57% !important; +} + +.margint-p57 { + margin-top: 57% !important; +} + +.vh-57 { + height: 57vh !important; +} + +.vw-57 { + width: 57vw !important; +} + +.margin-58 { + margin: 58% !important; +} + +.marginl-p58 { + margin-left: 58% !important; +} + +.marginr-p58 { + margin-right: 58% !important; +} + +.marginb-p58 { + margin-bottom: 58% !important; +} + +.margint-p58 { + margin-top: 58% !important; +} + +.vh-58 { + height: 58vh !important; +} + +.vw-58 { + width: 58vw !important; +} + +.margin-59 { + margin: 59% !important; +} + +.marginl-p59 { + margin-left: 59% !important; +} + +.marginr-p59 { + margin-right: 59% !important; +} + +.marginb-p59 { + margin-bottom: 59% !important; +} + +.margint-p59 { + margin-top: 59% !important; +} + +.vh-59 { + height: 59vh !important; +} + +.vw-59 { + width: 59vw !important; +} + +.margin-60 { + margin: 60% !important; +} + +.marginl-p60 { + margin-left: 60% !important; +} + +.marginr-p60 { + margin-right: 60% !important; +} + +.marginb-p60 { + margin-bottom: 60% !important; +} + +.margint-p60 { + margin-top: 60% !important; +} + +.vh-60 { + height: 60vh !important; +} + +.vw-60 { + width: 60vw !important; +} + +.margin-61 { + margin: 61% !important; +} + +.marginl-p61 { + margin-left: 61% !important; +} + +.marginr-p61 { + margin-right: 61% !important; +} + +.marginb-p61 { + margin-bottom: 61% !important; +} + +.margint-p61 { + margin-top: 61% !important; +} + +.vh-61 { + height: 61vh !important; +} + +.vw-61 { + width: 61vw !important; +} + +.margin-62 { + margin: 62% !important; +} + +.marginl-p62 { + margin-left: 62% !important; +} + +.marginr-p62 { + margin-right: 62% !important; +} + +.marginb-p62 { + margin-bottom: 62% !important; +} + +.margint-p62 { + margin-top: 62% !important; +} + +.vh-62 { + height: 62vh !important; +} + +.vw-62 { + width: 62vw !important; +} + +.margin-63 { + margin: 63% !important; +} + +.marginl-p63 { + margin-left: 63% !important; +} + +.marginr-p63 { + margin-right: 63% !important; +} + +.marginb-p63 { + margin-bottom: 63% !important; +} + +.margint-p63 { + margin-top: 63% !important; +} + +.vh-63 { + height: 63vh !important; +} + +.vw-63 { + width: 63vw !important; +} + +.margin-64 { + margin: 64% !important; +} + +.marginl-p64 { + margin-left: 64% !important; +} + +.marginr-p64 { + margin-right: 64% !important; +} + +.marginb-p64 { + margin-bottom: 64% !important; +} + +.margint-p64 { + margin-top: 64% !important; +} + +.vh-64 { + height: 64vh !important; +} + +.vw-64 { + width: 64vw !important; +} + +.margin-65 { + margin: 65% !important; +} + +.marginl-p65 { + margin-left: 65% !important; +} + +.marginr-p65 { + margin-right: 65% !important; +} + +.marginb-p65 { + margin-bottom: 65% !important; +} + +.margint-p65 { + margin-top: 65% !important; +} + +.vh-65 { + height: 65vh !important; +} + +.vw-65 { + width: 65vw !important; +} + +.margin-66 { + margin: 66% !important; +} + +.marginl-p66 { + margin-left: 66% !important; +} + +.marginr-p66 { + margin-right: 66% !important; +} + +.marginb-p66 { + margin-bottom: 66% !important; +} + +.margint-p66 { + margin-top: 66% !important; +} + +.vh-66 { + height: 66vh !important; +} + +.vw-66 { + width: 66vw !important; +} + +.margin-67 { + margin: 67% !important; +} + +.marginl-p67 { + margin-left: 67% !important; +} + +.marginr-p67 { + margin-right: 67% !important; +} + +.marginb-p67 { + margin-bottom: 67% !important; +} + +.margint-p67 { + margin-top: 67% !important; +} + +.vh-67 { + height: 67vh !important; +} + +.vw-67 { + width: 67vw !important; +} + +.margin-68 { + margin: 68% !important; +} + +.marginl-p68 { + margin-left: 68% !important; +} + +.marginr-p68 { + margin-right: 68% !important; +} + +.marginb-p68 { + margin-bottom: 68% !important; +} + +.margint-p68 { + margin-top: 68% !important; +} + +.vh-68 { + height: 68vh !important; +} + +.vw-68 { + width: 68vw !important; +} + +.margin-69 { + margin: 69% !important; +} + +.marginl-p69 { + margin-left: 69% !important; +} + +.marginr-p69 { + margin-right: 69% !important; +} + +.marginb-p69 { + margin-bottom: 69% !important; +} + +.margint-p69 { + margin-top: 69% !important; +} + +.vh-69 { + height: 69vh !important; +} + +.vw-69 { + width: 69vw !important; +} + +.margin-70 { + margin: 70% !important; +} + +.marginl-p70 { + margin-left: 70% !important; +} + +.marginr-p70 { + margin-right: 70% !important; +} + +.marginb-p70 { + margin-bottom: 70% !important; +} + +.margint-p70 { + margin-top: 70% !important; +} + +.vh-70 { + height: 70vh !important; +} + +.vw-70 { + width: 70vw !important; +} + +.margin-71 { + margin: 71% !important; +} + +.marginl-p71 { + margin-left: 71% !important; +} + +.marginr-p71 { + margin-right: 71% !important; +} + +.marginb-p71 { + margin-bottom: 71% !important; +} + +.margint-p71 { + margin-top: 71% !important; +} + +.vh-71 { + height: 71vh !important; +} + +.vw-71 { + width: 71vw !important; +} + +.margin-72 { + margin: 72% !important; +} + +.marginl-p72 { + margin-left: 72% !important; +} + +.marginr-p72 { + margin-right: 72% !important; +} + +.marginb-p72 { + margin-bottom: 72% !important; +} + +.margint-p72 { + margin-top: 72% !important; +} + +.vh-72 { + height: 72vh !important; +} + +.vw-72 { + width: 72vw !important; +} + +.margin-73 { + margin: 73% !important; +} + +.marginl-p73 { + margin-left: 73% !important; +} + +.marginr-p73 { + margin-right: 73% !important; +} + +.marginb-p73 { + margin-bottom: 73% !important; +} + +.margint-p73 { + margin-top: 73% !important; +} + +.vh-73 { + height: 73vh !important; +} + +.vw-73 { + width: 73vw !important; +} + +.margin-74 { + margin: 74% !important; +} + +.marginl-p74 { + margin-left: 74% !important; +} + +.marginr-p74 { + margin-right: 74% !important; +} + +.marginb-p74 { + margin-bottom: 74% !important; +} + +.margint-p74 { + margin-top: 74% !important; +} + +.vh-74 { + height: 74vh !important; +} + +.vw-74 { + width: 74vw !important; +} + +.margin-75 { + margin: 75% !important; +} + +.marginl-p75 { + margin-left: 75% !important; +} + +.marginr-p75 { + margin-right: 75% !important; +} + +.marginb-p75 { + margin-bottom: 75% !important; +} + +.margint-p75 { + margin-top: 75% !important; +} + +.vh-75 { + height: 75vh !important; +} + +.vw-75 { + width: 75vw !important; +} + +.margin-76 { + margin: 76% !important; +} + +.marginl-p76 { + margin-left: 76% !important; +} + +.marginr-p76 { + margin-right: 76% !important; +} + +.marginb-p76 { + margin-bottom: 76% !important; +} + +.margint-p76 { + margin-top: 76% !important; +} + +.vh-76 { + height: 76vh !important; +} + +.vw-76 { + width: 76vw !important; +} + +.margin-77 { + margin: 77% !important; +} + +.marginl-p77 { + margin-left: 77% !important; +} + +.marginr-p77 { + margin-right: 77% !important; +} + +.marginb-p77 { + margin-bottom: 77% !important; +} + +.margint-p77 { + margin-top: 77% !important; +} + +.vh-77 { + height: 77vh !important; +} + +.vw-77 { + width: 77vw !important; +} + +.margin-78 { + margin: 78% !important; +} + +.marginl-p78 { + margin-left: 78% !important; +} + +.marginr-p78 { + margin-right: 78% !important; +} + +.marginb-p78 { + margin-bottom: 78% !important; +} + +.margint-p78 { + margin-top: 78% !important; +} + +.vh-78 { + height: 78vh !important; +} + +.vw-78 { + width: 78vw !important; +} + +.margin-79 { + margin: 79% !important; +} + +.marginl-p79 { + margin-left: 79% !important; +} + +.marginr-p79 { + margin-right: 79% !important; +} + +.marginb-p79 { + margin-bottom: 79% !important; +} + +.margint-p79 { + margin-top: 79% !important; +} + +.vh-79 { + height: 79vh !important; +} + +.vw-79 { + width: 79vw !important; +} + +.margin-80 { + margin: 80% !important; +} + +.marginl-p80 { + margin-left: 80% !important; +} + +.marginr-p80 { + margin-right: 80% !important; +} + +.marginb-p80 { + margin-bottom: 80% !important; +} + +.margint-p80 { + margin-top: 80% !important; +} + +.vh-80 { + height: 80vh !important; +} + +.vw-80 { + width: 80vw !important; +} + +.margin-81 { + margin: 81% !important; +} + +.marginl-p81 { + margin-left: 81% !important; +} + +.marginr-p81 { + margin-right: 81% !important; +} + +.marginb-p81 { + margin-bottom: 81% !important; +} + +.margint-p81 { + margin-top: 81% !important; +} + +.vh-81 { + height: 81vh !important; +} + +.vw-81 { + width: 81vw !important; +} + +.margin-82 { + margin: 82% !important; +} + +.marginl-p82 { + margin-left: 82% !important; +} + +.marginr-p82 { + margin-right: 82% !important; +} + +.marginb-p82 { + margin-bottom: 82% !important; +} + +.margint-p82 { + margin-top: 82% !important; +} + +.vh-82 { + height: 82vh !important; +} + +.vw-82 { + width: 82vw !important; +} + +.margin-83 { + margin: 83% !important; +} + +.marginl-p83 { + margin-left: 83% !important; +} + +.marginr-p83 { + margin-right: 83% !important; +} + +.marginb-p83 { + margin-bottom: 83% !important; +} + +.margint-p83 { + margin-top: 83% !important; +} + +.vh-83 { + height: 83vh !important; +} + +.vw-83 { + width: 83vw !important; +} + +.margin-84 { + margin: 84% !important; +} + +.marginl-p84 { + margin-left: 84% !important; +} + +.marginr-p84 { + margin-right: 84% !important; +} + +.marginb-p84 { + margin-bottom: 84% !important; +} + +.margint-p84 { + margin-top: 84% !important; +} + +.vh-84 { + height: 84vh !important; +} + +.vw-84 { + width: 84vw !important; +} + +.margin-85 { + margin: 85% !important; +} + +.marginl-p85 { + margin-left: 85% !important; +} + +.marginr-p85 { + margin-right: 85% !important; +} + +.marginb-p85 { + margin-bottom: 85% !important; +} + +.margint-p85 { + margin-top: 85% !important; +} + +.vh-85 { + height: 85vh !important; +} + +.vw-85 { + width: 85vw !important; +} + +.margin-86 { + margin: 86% !important; +} + +.marginl-p86 { + margin-left: 86% !important; +} + +.marginr-p86 { + margin-right: 86% !important; +} + +.marginb-p86 { + margin-bottom: 86% !important; +} + +.margint-p86 { + margin-top: 86% !important; +} + +.vh-86 { + height: 86vh !important; +} + +.vw-86 { + width: 86vw !important; +} + +.margin-87 { + margin: 87% !important; +} + +.marginl-p87 { + margin-left: 87% !important; +} + +.marginr-p87 { + margin-right: 87% !important; +} + +.marginb-p87 { + margin-bottom: 87% !important; +} + +.margint-p87 { + margin-top: 87% !important; +} + +.vh-87 { + height: 87vh !important; +} + +.vw-87 { + width: 87vw !important; +} + +.margin-88 { + margin: 88% !important; +} + +.marginl-p88 { + margin-left: 88% !important; +} + +.marginr-p88 { + margin-right: 88% !important; +} + +.marginb-p88 { + margin-bottom: 88% !important; +} + +.margint-p88 { + margin-top: 88% !important; +} + +.vh-88 { + height: 88vh !important; +} + +.vw-88 { + width: 88vw !important; +} + +.margin-89 { + margin: 89% !important; +} + +.marginl-p89 { + margin-left: 89% !important; +} + +.marginr-p89 { + margin-right: 89% !important; +} + +.marginb-p89 { + margin-bottom: 89% !important; +} + +.margint-p89 { + margin-top: 89% !important; +} + +.vh-89 { + height: 89vh !important; +} + +.vw-89 { + width: 89vw !important; +} + +.margin-90 { + margin: 90% !important; +} + +.marginl-p90 { + margin-left: 90% !important; +} + +.marginr-p90 { + margin-right: 90% !important; +} + +.marginb-p90 { + margin-bottom: 90% !important; +} + +.margint-p90 { + margin-top: 90% !important; +} + +.vh-90 { + height: 90vh !important; +} + +.vw-90 { + width: 90vw !important; +} + +.margin-91 { + margin: 91% !important; +} + +.marginl-p91 { + margin-left: 91% !important; +} + +.marginr-p91 { + margin-right: 91% !important; +} + +.marginb-p91 { + margin-bottom: 91% !important; +} + +.margint-p91 { + margin-top: 91% !important; +} + +.vh-91 { + height: 91vh !important; +} + +.vw-91 { + width: 91vw !important; +} + +.margin-92 { + margin: 92% !important; +} + +.marginl-p92 { + margin-left: 92% !important; +} + +.marginr-p92 { + margin-right: 92% !important; +} + +.marginb-p92 { + margin-bottom: 92% !important; +} + +.margint-p92 { + margin-top: 92% !important; +} + +.vh-92 { + height: 92vh !important; +} + +.vw-92 { + width: 92vw !important; +} + +.margin-93 { + margin: 93% !important; +} + +.marginl-p93 { + margin-left: 93% !important; +} + +.marginr-p93 { + margin-right: 93% !important; +} + +.marginb-p93 { + margin-bottom: 93% !important; +} + +.margint-p93 { + margin-top: 93% !important; +} + +.vh-93 { + height: 93vh !important; +} + +.vw-93 { + width: 93vw !important; +} + +.margin-94 { + margin: 94% !important; +} + +.marginl-p94 { + margin-left: 94% !important; +} + +.marginr-p94 { + margin-right: 94% !important; +} + +.marginb-p94 { + margin-bottom: 94% !important; +} + +.margint-p94 { + margin-top: 94% !important; +} + +.vh-94 { + height: 94vh !important; +} + +.vw-94 { + width: 94vw !important; +} + +.margin-95 { + margin: 95% !important; +} + +.marginl-p95 { + margin-left: 95% !important; +} + +.marginr-p95 { + margin-right: 95% !important; +} + +.marginb-p95 { + margin-bottom: 95% !important; +} + +.margint-p95 { + margin-top: 95% !important; +} + +.vh-95 { + height: 95vh !important; +} + +.vw-95 { + width: 95vw !important; +} + +.margin-96 { + margin: 96% !important; +} + +.marginl-p96 { + margin-left: 96% !important; +} + +.marginr-p96 { + margin-right: 96% !important; +} + +.marginb-p96 { + margin-bottom: 96% !important; +} + +.margint-p96 { + margin-top: 96% !important; +} + +.vh-96 { + height: 96vh !important; +} + +.vw-96 { + width: 96vw !important; +} + +.margin-97 { + margin: 97% !important; +} + +.marginl-p97 { + margin-left: 97% !important; +} + +.marginr-p97 { + margin-right: 97% !important; +} + +.marginb-p97 { + margin-bottom: 97% !important; +} + +.margint-p97 { + margin-top: 97% !important; +} + +.vh-97 { + height: 97vh !important; +} + +.vw-97 { + width: 97vw !important; +} + +.margin-98 { + margin: 98% !important; +} + +.marginl-p98 { + margin-left: 98% !important; +} + +.marginr-p98 { + margin-right: 98% !important; +} + +.marginb-p98 { + margin-bottom: 98% !important; +} + +.margint-p98 { + margin-top: 98% !important; +} + +.vh-98 { + height: 98vh !important; +} + +.vw-98 { + width: 98vw !important; +} + +.margin-99 { + margin: 99% !important; +} + +.marginl-p99 { + margin-left: 99% !important; +} + +.marginr-p99 { + margin-right: 99% !important; +} + +.marginb-p99 { + margin-bottom: 99% !important; +} + +.margint-p99 { + margin-top: 99% !important; +} + +.vh-99 { + height: 99vh !important; +} + +.vw-99 { + width: 99vw !important; +} + +.margin-100 { + margin: 100% !important; +} + +.marginl-p100 { + margin-left: 100% !important; +} + +.marginr-p100 { + margin-right: 100% !important; +} + +.marginb-p100 { + margin-bottom: 100% !important; +} + +.margint-p100 { + margin-top: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.fontw-0 { + font-weight: 0; +} + +.fontw-100 { + font-weight: 100; +} + +.fontw-200 { + font-weight: 200; +} + +.fontw-300 { + font-weight: 300; +} + +.fontw-400 { + font-weight: 400; +} + +.fontw-500 { + font-weight: 500; +} + +.fontw-600 { + font-weight: 600; +} + +.fontw-700 { + font-weight: 700; +} + +.fontw-800 { + font-weight: 800; +} + +.fontw-900 { + font-weight: 900; +} + +.primary { + color: #FCBF49; +} + +.secondary { + color: #DF2935; +} + +p { + margin-bottom: 1%; +} + +.overlay { + position: absolute; + top: 50%; + z-index: 1000; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + height: 100vh; + width: 100vw; + background-color: black; + opacity: 0.8; + -webkit-transition: opacity 0.4s; + transition: opacity 0.4s; + z-index: 10; +} + +.invisible { + opacity: 0 !important; + z-index: -1 !important; + -webkit-transition: 0.5s; + transition: 0.5s; +} + +.icon { + width: 20px; + height: 20px; + -webkit-transition: 0.3s; + transition: 0.3s; + color: blue; +} + +.icon:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.loader { + width: 20px; + height: 20px; + border: 3px solid grey; + border-bottom-color: transparent; + border-radius: 50%; + -webkit-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +@-webkit-keyframes rotation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes rotation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.pointer { + cursor: pointer; +} + +.loader-big { + border: 14px solid #1a0f7a; + /* Light grey */ + border-top: 16px solid #5396e7; + /* Blue */ + border-radius: 50%; + width: 120px; + height: 120px; + -webkit-animation: spin 1.5s linear infinite; + animation: spin 1.5s linear infinite; + position: absolute; + top: 50%; + right: 50%; + -webkit-transform: translate(50%, -50%); + transform: translate(50%, -50%); + z-index: 20; +} + +@-webkit-keyframes spin { + 0% { + -webkit-transform: translate(50%, -50%) rotate(0deg); + transform: translate(50%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(50%, -50%) rotate(360deg); + transform: translate(50%, -50%) rotate(360deg); + } +} + +@keyframes spin { + 0% { + -webkit-transform: translate(50%, -50%) rotate(0deg); + transform: translate(50%, -50%) rotate(0deg); + } + 100% { + -webkit-transform: translate(50%, -50%) rotate(360deg); + transform: translate(50%, -50%) rotate(360deg); + } +} + +.error-msg { + color: #ff4f64; + font-weight: 800; + font-size: .9em; + width: 100%; +} + +.error-msg:hover { + color: #ff4f64 !important; +} + +.exo-input-error { + border-bottom: 1px solid #ff4f64; + margin-bottom: 1.5%; +} + +.exo-input-error:focus { + border-bottom: 1px solid #ff4f64 !important; +} + +.flex-column { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +/*# sourceMappingURL=globals.css.map */ \ No newline at end of file diff --git a/frontend/styles/globals.css.map b/frontend/styles/globals.css.map new file mode 100644 index 00000000..fe7b710a --- /dev/null +++ b/frontend/styles/globals.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "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", + "sources": [ + "globals.scss", + "variables.scss", + "global_components.scss", + "variables.scss" + ], + "names": [], + "file": "globals.css" +} \ No newline at end of file diff --git a/frontend/styles/input.module.css b/frontend/styles/input.module.css new file mode 100644 index 00000000..7fb79abc --- /dev/null +++ b/frontend/styles/input.module.css @@ -0,0 +1,104 @@ +/* .input { + //padding: 0.4em 0.25em; + width: 100%; + background: transparent; + color: #afb5bb; + //font-size: 1.55em; + &:focus + label span { + transform: translate3d(0, -90%, 0); + } + + & + label { + position: absolute; + width: 100%; + text-align: left; + pointer-events: none; + left: 0; + & span{ + transition: transform .3s; + } + } +} */ +.input-container { + position: relative; + margin-top: 10px; + width: 100%; +} + +.input { + background-color: transparent; + border: none; + padding: 10px 10px 10px 5px; + border-bottom: 1px solid #64619f; + width: 100%; + font-size: .9em; + font-weight: 500; + color: white; +} + +.input ~ label { + font-size: 1em; + font-weight: normal; + position: absolute; + pointer-events: none; + left: 5px; + top: 10px; + -webkit-transition: 0.3s ease all; + transition: 0.3s ease all; + font-weight: 400; + color: #8e8e8e; + opacity: .4; +} + +.input:focus { + outline: none; +} + +.input:focus ~ label, +.input:valid ~ label { + top: -.8em; + font-size: 12px; + color: #5396e7; + opacity: 1; + font-weight: 600; +} + +.input:focus ~ .bar:before { + width: 100%; +} + +.bar { + position: relative; + display: block; + width: 100%; +} + +.bar:before { + content: ""; + height: 2px; + width: 0; + bottom: 0px; + position: absolute; + background: #5396e7; + -webkit-transition: 0.3s ease all; + transition: 0.3s ease all; + left: 0%; +} + +.error { + color: #ff4f64; +} + +.error input { + color: #ff4f64; + border-bottom: 1px solid #ff4f64; +} + +.error input:focus ~ label, .error input:valid ~ label { + color: #ff4f64; +} + +.error input:focus ~ .bar::before { + background-color: #ff4f64; +} +/*# sourceMappingURL=input.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/input.module.css.map b/frontend/styles/input.module.css.map new file mode 100644 index 00000000..cf09d672 --- /dev/null +++ b/frontend/styles/input.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AACA;;;;;;;;;;;;;;;;;;;;IAoBI;AAEJ,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAG,IAAI;EACjB,KAAK,EAAE,IAAI;CACZ;;AAGD,AAAA,MAAM,CAAC;EACL,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,kBAAkB;EAC3B,aAAa,EAAE,GAAG,CAAC,KAAK,CCvBX,OAAO;EDwBpB,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;CA4Bb;;AApCD,AASE,MATI,GASA,KAAK,CAAC;EACR,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,IAAI;EACpB,IAAI,EAAE,GAAG;EACT,GAAG,EAAE,IAAI;EACT,UAAU,EAAE,aAAa;EACzB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,OAAO;EACd,OAAO,EAAE,EAAE;CACZ;;AApBH,AAqBE,MArBI,AAqBH,MAAM,CAAC;EACN,OAAO,EAAE,IAAI;CACd;;AAvBH,AAyBE,MAzBI,AAyBH,MAAM,GAAG,KAAK;AAzBjB,MAAM,AA0BH,MAAM,GAAG,KAAK,CAAC;EACd,GAAG,EAAE,KAAK;EACV,SAAS,EAAE,IAAI;EACf,KAAK,EC1CE,OAAO;ED2Cd,OAAO,EAAE,CAAC;EACV,WAAW,EAAE,GAAG;CACjB;;AAhCH,AAiCE,MAjCI,AAiCH,MAAM,GAAG,IAAI,AAAA,OAAO,CAAC;EACpB,KAAK,EAAE,IAAI;CACZ;;AAGH,AAAA,IAAI,CAAC;EACH,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,KAAK;EACd,KAAK,EAAE,IAAI;CAWZ;;AAdD,AAIE,IAJE,AAID,OAAO,CAAC;EACP,OAAO,EAAE,EAAE;EACX,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,GAAG;EACX,QAAQ,EAAE,QAAQ;EAClB,UAAU,EC7DH,OAAO;ED8Dd,UAAU,EAAE,aAAa;EACzB,IAAI,EAAE,EAAE;CACT;;AAIH,AAAA,MAAM,CAAA;EACJ,KAAK,ECpED,OAAiB;CD+EtB;;AAZD,AAEE,MAFI,CAEF,KAAK,CAAA;EACL,KAAK,ECtEH,OAAiB;EDuEnB,aAAa,EAAE,GAAG,CAAC,KAAK,CCvEtB,OAAiB;CD8EpB;;AAXH,AAKI,MALE,CAEF,KAAK,AAGJ,MAAM,GAAG,KAAK,EALnB,MAAM,CAEF,KAAK,AAGa,MAAM,GAAE,KAAK,CAAA;EAC7B,KAAK,ECzEL,OAAiB;CD0ElB;;AAPL,AAQI,MARE,CAEF,KAAK,AAMJ,MAAM,GAAG,IAAI,AAAA,QAAQ,CAAA;EACpB,gBAAgB,EC5EhB,OAAiB;CD6ElB", + "sources": [ + "input.module.scss", + "variables.scss" + ], + "names": [], + "file": "input.module.css" +} \ No newline at end of file diff --git a/frontend/styles/input.module.scss b/frontend/styles/input.module.scss new file mode 100644 index 00000000..cd8d11be --- /dev/null +++ b/frontend/styles/input.module.scss @@ -0,0 +1,98 @@ +@import "./variables"; +/* .input { + //padding: 0.4em 0.25em; + width: 100%; + background: transparent; + color: #afb5bb; + //font-size: 1.55em; + &:focus + label span { + transform: translate3d(0, -90%, 0); + } + + & + label { + position: absolute; + width: 100%; + text-align: left; + pointer-events: none; + left: 0; + & span{ + transition: transform .3s; + } + } +} */ + +.input-container { + position: relative; + margin-top: 10px; + width: 100%; +} + + +.input { + background-color: transparent; + border: none; + padding: 10px 10px 10px 5px; + border-bottom: 1px solid $input-border; + width: 100%; + font-size: .9em; + font-weight: 500; + color: white; + & ~ label { + font-size: 1em; + font-weight: normal; + position: absolute; + pointer-events: none; + left: 5px; + top: 10px; + transition: 0.3s ease all; + font-weight: 400; + color: #8e8e8e; + opacity: .4; + } + &:focus { + outline: none; + } + + &:focus ~ label, + &:valid ~ label { + top: -.8em; + font-size: 12px; + color: $contrast; + opacity: 1; + font-weight: 600; + } + &:focus ~ .bar:before { + width: 100%; + } +} + +.bar { + position: relative; + display: block; + width: 100%; + &:before { + content: ""; + height: 2px; + width: 0; + bottom: 0px; + position: absolute; + background: $contrast; + transition: 0.3s ease all; + left: 0%; + } +} + + +.error{ + color: $red; + & input{ + color: $red; + border-bottom: 1px solid $red; + &:focus ~ label, &:valid ~label{ + color: $red; + } + &:focus ~ .bar::before{ + background-color: $red; + } + } +} \ No newline at end of file diff --git a/frontend/styles/login.module.css b/frontend/styles/login.module.css new file mode 100644 index 00000000..08cf78fb --- /dev/null +++ b/frontend/styles/login.module.css @@ -0,0 +1,19 @@ +.main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} +/*# sourceMappingURL=login.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/login.module.css.map b/frontend/styles/login.module.css.map new file mode 100644 index 00000000..7c603045 --- /dev/null +++ b/frontend/styles/login.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,KAAK,EAAE,WAAW;EAClB,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,MAAM;CACxB", + "sources": [ + "login.module.scss" + ], + "names": [], + "file": "login.module.css" +} \ No newline at end of file diff --git a/frontend/styles/login.module.scss b/frontend/styles/login.module.scss new file mode 100644 index 00000000..f3bc77f3 --- /dev/null +++ b/frontend/styles/login.module.scss @@ -0,0 +1,7 @@ +.main{ + display: flex; + flex-direction: column; + width: max-content; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/frontend/styles/mixins.css b/frontend/styles/mixins.css new file mode 100644 index 00000000..72272fdb --- /dev/null +++ b/frontend/styles/mixins.css @@ -0,0 +1 @@ +/* No CSS *//*# sourceMappingURL=mixins.css.map */ \ No newline at end of file diff --git a/frontend/styles/mixins.css.map b/frontend/styles/mixins.css.map new file mode 100644 index 00000000..75ae4f83 --- /dev/null +++ b/frontend/styles/mixins.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "", + "sources": [ + "mixins.scss", + "functions.scss" + ], + "names": [], + "file": "mixins.css" +} \ No newline at end of file diff --git a/frontend/styles/pdf_gen/fiche.module.css b/frontend/styles/pdf_gen/fiche.module.css new file mode 100644 index 00000000..11007553 --- /dev/null +++ b/frontend/styles/pdf_gen/fiche.module.css @@ -0,0 +1,39 @@ +.main-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: scroll; + height: 100%; + scrollbar-width: none; +} + +.main-container::-webkit-scrollbar { + display: none; +} + +@media (max-width: 840px) { + .main-container { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + height: -webkit-max-content; + height: -moz-max-content; + height: max-content; + margin-bottom: 10%; + } +} + +.form { + width: 60%; +} + +@media (max-width: 840px) { + .form { + width: 100%; + } +} +/*# sourceMappingURL=fiche.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/pdf_gen/fiche.module.css.map b/frontend/styles/pdf_gen/fiche.module.css.map new file mode 100644 index 00000000..c1e0235a --- /dev/null +++ b/frontend/styles/pdf_gen/fiche.module.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "AAGA,AAAA,eAAe,CAAA;EACb,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,IAAI;EEiCZ,eAAe,EAAE,IAAI;CFxBtB;;AAZD,AEqCE,eFrCa,AEqCZ,mBAAmB,CAAC;EACnB,OAAO,EAAE,IAAI;CACd;;AA9BD,MAAM,EAAE,SAAS,EAAE,KAAK;EFT1B,AAAA,eAAe,CAAA;IAOX,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,GAAG;GAErB;;;AAED,AAAA,KAAK,CAAA;EACH,KAAK,EAAE,GAAG;CAIX;;AEVC,MAAM,EAAE,SAAS,EAAE,KAAK;EFK1B,AAAA,KAAK,CAAA;IAGD,KAAK,EAAE,IAAI;GAEd", + "sources": [ + "fiche.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "fiche.module.css" +} \ No newline at end of file diff --git a/frontend/styles/pdf_gen/paramItem.module.css b/frontend/styles/pdf_gen/paramItem.module.css new file mode 100644 index 00000000..5feffb13 --- /dev/null +++ b/frontend/styles/pdf_gen/paramItem.module.css @@ -0,0 +1,58 @@ +.name-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 50%; +} + +.name-container > p { + margin: 0; +} + +.name-container > svg { + width: 15%; + height: 15%; + opacity: 0; + -webkit-transition: .3s; + transition: .3s; + cursor: pointer; +} + +.name-container:hover > svg { + opacity: 1; +} + +.param-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.param-container > input { + width: 50px; + background-color: rgba(255, 255, 255, 0.8); +} + +.param-container > label { + font-size: .8em; +} + +.item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin: 3%; + padding: 2%; + border-bottom: 1px solid #1d1a5a; +} +/*# sourceMappingURL=paramItem.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/pdf_gen/paramItem.module.css.map b/frontend/styles/pdf_gen/paramItem.module.css.map new file mode 100644 index 00000000..44c64b26 --- /dev/null +++ b/frontend/styles/pdf_gen/paramItem.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,eAAe,CAAA;EACb,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,KAAK,EAAE,GAAG;CAeX;;AAlBD,AAIE,eAJa,GAIT,CAAC,CAAC;EACJ,MAAM,EAAE,CAAC;CAEV;;AAPH,AAQE,eARa,GAQT,GAAG,CAAA;EACL,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,GAAG;EACX,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,GAAG;EACf,MAAM,EAAE,OAAO;CAChB;;AAdH,AAeE,eAfa,AAeZ,MAAM,GAAG,GAAG,CAAA;EACX,OAAO,EAAE,CAAC;CACX;;AAIH,AAAA,gBAAgB,CAAA;EASd,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AAXD,AACE,gBADc,GACV,KAAK,CAAA;EACP,KAAK,EAAE,IAAI;EACX,gBAAgB,EAAO,wBAAK;CAC7B;;AAJH,AAME,gBANc,GAMV,KAAK,CAAA;EACP,SAAS,EAAE,IAAI;CAChB;;AAKH,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,MAAM,EAAE,EAAE;EACV,OAAO,EAAE,EAAE;EACX,aAAa,EAAE,GAAG,CAAC,KAAK,CC7Bb,OAAO;CD8BnB", + "sources": [ + "paramItem.module.scss", + "../variables.scss" + ], + "names": [], + "file": "paramItem.module.css" +} \ No newline at end of file diff --git a/frontend/styles/pdf_gen/pdfForm.module.css b/frontend/styles/pdf_gen/pdfForm.module.css new file mode 100644 index 00000000..b7946907 --- /dev/null +++ b/frontend/styles/pdf_gen/pdfForm.module.css @@ -0,0 +1,23 @@ +.main { + margin: 0 auto; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + height: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.main > div { + text-align: center; +} +/*# sourceMappingURL=pdfForm.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/pdf_gen/pdfForm.module.css.map b/frontend/styles/pdf_gen/pdfForm.module.css.map new file mode 100644 index 00000000..99d2b50b --- /dev/null +++ b/frontend/styles/pdf_gen/pdfForm.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,KAAK,CAAC;EAEJ,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,MAAM;CAIxB;;AAZD,AASE,KATG,GASC,GAAG,CAAA;EACL,UAAU,EAAE,MAAM;CACnB", + "sources": [ + "pdfForm.module.scss" + ], + "names": [], + "file": "pdfForm.module.css" +} \ No newline at end of file diff --git a/frontend/styles/pdf_gen/selectExo.module.css b/frontend/styles/pdf_gen/selectExo.module.css new file mode 100644 index 00000000..4a84791f --- /dev/null +++ b/frontend/styles/pdf_gen/selectExo.module.css @@ -0,0 +1,183 @@ +.exo-select { + border: 1px solid #181553; + width: 35%; + height: 100%; + background-color: rgba(29, 26, 90, 0.5); + overflow-y: auto; +} + +@media (max-width: 840px) { + .exo-select { + width: 100%; + max-height: 80vh; + height: auto; + } +} + +.head { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + font-weight: 900; + margin: 3%; + border-bottom: 1px solid #1d1a5a; + padding-bottom: 1%; +} + +.head > p { + margin-top: 0; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.head > .add:hover { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); + -webkit-transition: 0.3s ease; + transition: 0.3s ease; + cursor: pointer; +} + +.head > .add { + font-size: 1.5em; +} + +.modal-list-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 40vw; + min-height: 1px; + max-height: 70vh; + background-color: #1a0f7a; + overflow-y: scroll; + scrollbar-width: thin; + scrollbar-color: #5396e7 #1d1a5a; + padding: 2%; + min-width: 820px; +} + +.modal-list-container > p { + cursor: pointer; +} + +@media (max-width: 840px) { + .modal-list-container { + width: 100%; + height: 100%; + max-width: 200%; + max-height: 200%; + min-width: 1px; + } +} + +.selected { + color: grey; + -webkit-transition: 0.3s; + transition: 0.3s; +} + +.item-in-modal { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + overflow: hidden; + width: 100%; +} + +.item-in-modal > div { + margin-right: 0; +} + +.item-in-modal:hover { + background-color: #170d6c; +} + +.modal-name { + min-width: -webkit-max-content; + min-width: -moz-max-content; + min-width: max-content; + margin: 1.5%; +} + +.tag-container > div { + margin-right: 0; +} + +.no-select { + text-align: center; + font-style: italic; + margin-bottom: 5%; +} + +.error { + width: 100%; + text-align: center; +} + +.error-empty { + text-decoration: underline; + font-weight: 700; +} + +.search-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.toggler-sort { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + padding: 0.8%; + -webkit-transition: 0.3s; + transition: 0.3s; + border: 1px solid #181553; + border-radius: 4px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 0 1%; +} + +.toggler-sort:hover { + background-color: #171446; +} + +.toggler-active { + background-color: #171446; +} + +.icon-container { + position: absolute; + top: 0; + float: right; + -webkit-transition: 0.3s; + transition: 0.3s; + width: 100%; + text-align: end; +} + +.icon-container > .icon { + margin: 2%; +} + +.icon-container > .icon:hover { + -webkit-transform: scale(1.2); + transform: scale(1.2); +} +/*# sourceMappingURL=selectExo.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/pdf_gen/selectExo.module.css.map b/frontend/styles/pdf_gen/selectExo.module.css.map new file mode 100644 index 00000000..11f0ecd1 --- /dev/null +++ b/frontend/styles/pdf_gen/selectExo.module.css.map @@ -0,0 +1,12 @@ +{ + "version": 3, + "mappings": "AAGA,AAAA,WAAW,CAAC;EACV,MAAM,EAAE,GAAG,CAAC,KAAK,CCSV,OAAO;EDRd,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,IAAI;EACZ,gBAAgB,ECKL,qBAAO;EDJlB,UAAU,EAAE,IAAI;CAUjB;;AENC,MAAM,EAAE,SAAS,EAAE,KAAK;EFT1B,AAAA,WAAW,CAAC;IAQR,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAM;GAKjB;;;AAED,AAAA,KAAK,CAAC;EACJ,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,EAAE;EACV,aAAa,EAAE,GAAG,CAAC,KAAK,CCbb,OAAO;EDclB,cAAc,EAAE,EAAE;CAcnB;;AApBD,AAQE,KARG,GAQC,CAAC,CAAC;EACJ,UAAU,EAAE,CAAC;EACb,UAAU,EAAE,IAAI;CACjB;;AAXH,AAYE,KAZG,GAYC,IAAI,AAAA,MAAM,CAAC;EACb,SAAS,EAAE,cAAc;EACzB,UAAU,EAAE,SAAS;EACrB,MAAM,EAAE,OAAO;CAChB;;AAhBH,AAiBE,KAjBG,GAiBC,IAAI,CAAC;EACP,SAAS,EAAE,KAAK;CACjB;;AAGH,AAAA,qBAAqB,CAAC;EACpB,KAAK,EAAE,WAAW;EAElB,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,GAAG;EACf,UAAU,EAAE,IAAI;EAChB,gBAAgB,EClCC,OAAO;EDmCxB,UAAU,EAAE,MAAM;EAClB,eAAe,EAAE,IAAI;EACrB,eAAe,EClCN,OAAO,CALL,OAAO;EDwClB,OAAO,EAAE,EAAE;EACX,SAAS,EAAE,KAAK;CAWjB;;AAtBD,AAYE,qBAZmB,GAYf,CAAC,CAAC;EACJ,MAAM,EAAE,OAAO;CAChB;;AE5CD,MAAM,EAAE,SAAS,EAAE,KAAK;EF8B1B,AAAA,qBAAqB,CAAC;IAgBlB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,GAAG;GAEjB;;;AACD,AAAA,SAAS,CAAC;EACR,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;CACjB;;AAED,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EAKnB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,IAAI;CAIZ;;AAZD,AAGE,cAHY,GAGR,GAAG,CAAC;EACN,YAAY,EAAE,CAAC;CAChB;;AALH,AASE,cATY,AASX,MAAM,CAAC;EACN,gBAAgB,EAAE,OAA6C;CAChE;;AAGH,AAAA,WAAW,CAAC;EACV,SAAS,EAAE,WAAW;EACtB,MAAM,EAAE,IAAI;CACb;;AACD,AACE,cADY,GACR,GAAG,CAAC;EACN,YAAY,EAAE,CAAC;CAChB;;AAGH,AAAA,UAAU,CAAC;EACT,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,EAAE;CAClB;;AAED,AAAA,MAAM,CAAC;EACL,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;CACnB;;AAED,AAAA,YAAY,CAAC;EACX,eAAe,EAAE,SAAS;EAC1B,WAAW,EAAE,GAAG;CACjB;;AAED,AAAA,iBAAiB,CAAC;EAChB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AAED,AAAA,aAAa,CAAC;EACZ,KAAK,EAAE,WAAW;EAClB,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CC1GV,OAAO;ED2Gd,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,MAAM,EAAE,IAAI;CAIb;;AAZD,AASE,aATW,AASV,MAAM,CAAC;EACN,gBAAgB,EAAE,OAAuC;CAC1D;;AAGH,AAAA,eAAe,CAAC;EACd,gBAAgB,EAAE,OAAuC;CAC1D;;AAED,AAAA,eAAe,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,GAAG;CAOhB;;AAbD,AAOE,eAPa,GAOT,KAAK,CAAC;EACR,MAAM,EAAE,EAAE;CAIX;;AAZH,AASI,eATW,GAOT,KAAK,AAEN,MAAM,CAAC;EACN,SAAS,EAAE,UAAU;CACtB", + "sources": [ + "selectExo.module.scss", + "../variables.scss", + "../mixins.scss", + "../functions.scss" + ], + "names": [], + "file": "selectExo.module.css" +} \ No newline at end of file diff --git a/frontend/styles/pdf_gen/tagContainer.module.css b/frontend/styles/pdf_gen/tagContainer.module.css new file mode 100644 index 00000000..d9618ed0 --- /dev/null +++ b/frontend/styles/pdf_gen/tagContainer.module.css @@ -0,0 +1,10 @@ +.main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + overflow: hidden; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} +/*# sourceMappingURL=tagContainer.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/pdf_gen/tagContainer.module.css.map b/frontend/styles/pdf_gen/tagContainer.module.css.map new file mode 100644 index 00000000..9e20ed8b --- /dev/null +++ b/frontend/styles/pdf_gen/tagContainer.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EAGb,QAAQ,EAAE,MAAM;EAGhB,SAAS,EAAE,CAAC;CACb", + "sources": [ + "tagContainer.module.scss" + ], + "names": [], + "file": "tagContainer.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/create.module.css b/frontend/styles/room/create.module.css new file mode 100644 index 00000000..08d245b9 --- /dev/null +++ b/frontend/styles/room/create.module.css @@ -0,0 +1,28 @@ +.main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.form { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + height: 80%; + width: 30%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.title { + font-size: 2.5em; +} +/*# sourceMappingURL=create.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/create.module.css.map b/frontend/styles/room/create.module.css.map new file mode 100644 index 00000000..4291f731 --- /dev/null +++ b/frontend/styles/room/create.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;CACxB;;AAED,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,GAAG;EACV,eAAe,EAAE,MAAM;CACxB;;AAED,AAAA,MAAM,CAAA;EACJ,SAAS,EAAE,KAAK;CACjB", + "sources": [ + "create.module.scss" + ], + "names": [], + "file": "create.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/input.module.css b/frontend/styles/room/input.module.css new file mode 100644 index 00000000..abddbe11 --- /dev/null +++ b/frontend/styles/room/input.module.css @@ -0,0 +1,79 @@ +/* .input-challenge { + background-color: transparent; + border: none; + border-bottom: 1px solid $border; + color: whitesmoke; + width: 50px; + padding: 5px; + &:focus { + border: none; + outline: none; + border-bottom: 1px solid $border; + background-color: rgba($background, 0.3); + } +} */ +.span { + border: 2px solid #666; + /* box-sizing: border-box; */ + /* padding: 0.5em 1em; */ + outline: 0; + background-color: transparent; + border: none; + border-bottom: 1px solid #181553; + color: whitesmoke; + padding: 5px; +} + +.input { + width: 6em; + font-size: 1em; + outline: 0; + background-color: transparent; + border: none; + border-bottom: 1.5px solid #241f7c; + color: whitesmoke; + min-width: 50px; + padding: 5px; + max-width: 200px; +} + +.input:focus { + border: none; + outline: none; + border-bottom: 1px solid #181553; + background-color: rgba(29, 26, 90, 0.3); +} + +.span { + position: absolute; + left: -9999px; + display: inline-block; +} + +.valid { + border-bottom: 2px solid #41cf7c; + color: #41cf7c; + font-weight: 600; +} + +.invalid { + border-bottom: 2px solid #ff4f64; + color: #ff4f64; + font-weight: 900; +} + +/* .disabled{ + background: rgba($background, 0.2); +} */ +.withoutCorrection { + border-bottom: 2px solid grey; + color: grey; + font-weight: 600; +} + +.correction-menu { + position: absolute; + top: -80%; + background-color: blue; +} +/*# sourceMappingURL=input.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/input.module.css.map b/frontend/styles/room/input.module.css.map new file mode 100644 index 00000000..8e367265 --- /dev/null +++ b/frontend/styles/room/input.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA;;;;;;;;;;;;;IAaI;AACJ,AAAA,KAAK,CAAC;EACJ,MAAM,EAAE,cAAc;EACtB,6BAA6B;EAC7B,yBAAyB;EAGzB,OAAO,EAAE,CAAC;EACV,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,CCZjB,OAAO;EDad,KAAK,EAAE,UAAU;EACjB,OAAO,EAAE,GAAG;CACb;;AAED,AAAA,MAAM,CAAC;EACL,KAAK,EAAE,GAAG;EAEV,SAAS,EAAE,GAAG;EACd,OAAO,EAAE,CAAC;EACV,gBAAgB,EAAE,WAAW;EAC7B,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,OAAqC;EAChE,KAAK,EAAE,UAAU;EACjB,SAAS,EAAE,IAAI;EACf,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,KAAK;CAOjB;;AAlBD,AAYE,MAZI,AAYH,MAAM,CAAC;EACN,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,GAAG,CAAC,KAAK,CChCnB,OAAO;EDiCZ,gBAAgB,EClCP,qBAAO;CDmCjB;;AAGH,AAAA,KAAK,CAAC;EACJ,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,OAAO;EACb,OAAO,EAAE,YAAY;CAEtB;;AAED,AAAA,MAAM,CAAC;EACL,aAAa,EAAE,GAAG,CAAC,KAAK,CCvClB,OAAO;EDwCb,KAAK,ECxCC,OAAO;EDyCb,WAAW,EAAE,GAAG;CACjB;;AAED,AAAA,QAAQ,CAAC;EACP,aAAa,EAAE,GAAG,CAAC,KAAK,CC9CpB,OAAiB;ED+CrB,KAAK,EC/CD,OAAiB;EDgDrB,WAAW,EAAE,GAAG;CACjB;;AAED;;IAEI;AAEJ,AAAA,kBAAkB,CAAC;EACjB,aAAa,EAAE,cAAc;EAC7B,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,GAAG;CACjB;;AAED,AAAA,gBAAgB,CAAC;EACf,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,gBAAgB,EAAE,IAAI;CACvB", + "sources": [ + "input.module.scss", + "../variables.scss" + ], + "names": [], + "file": "input.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/join.module.css b/frontend/styles/room/join.module.css new file mode 100644 index 00000000..ba8c30aa --- /dev/null +++ b/frontend/styles/room/join.module.css @@ -0,0 +1,30 @@ +.main { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.form { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + height: 80%; + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.title { + font-size: 2.5em; +} +/*# sourceMappingURL=join.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/join.module.css.map b/frontend/styles/room/join.module.css.map new file mode 100644 index 00000000..3ae1bba3 --- /dev/null +++ b/frontend/styles/room/join.module.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "AAAA,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;CACxB;;AAED,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,WAAW;EAClB,eAAe,EAAE,MAAM;CACxB;;AAED,AAAA,MAAM,CAAA;EACJ,SAAS,EAAE,KAAK;CACjB", + "sources": [ + "join.module.scss" + ], + "names": [], + "file": "join.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/note.module.css b/frontend/styles/room/note.module.css new file mode 100644 index 00000000..2c6ed1c1 --- /dev/null +++ b/frontend/styles/room/note.module.css @@ -0,0 +1,33 @@ +.main { + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; + color: white; + text-align: center; + font-weight: 900; +} + +.main > hr { + border: 1px solid white; +} + +.main > * { + margin: 2%; +} + +.fail { + color: #ff4f64; +} + +.fail > hr { + border-color: #ff4f64; +} + +.success { + color: #41cf7c; +} + +.success > hr { + border-color: #41cf7c; +} +/*# sourceMappingURL=note.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/note.module.css.map b/frontend/styles/room/note.module.css.map new file mode 100644 index 00000000..48336e3d --- /dev/null +++ b/frontend/styles/room/note.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,KAAK,CAAA;EACH,KAAK,EAAE,WAAW;EAClB,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;CAQjB;;AAZD,AAME,KANG,GAMC,EAAE,CAAA;EACJ,MAAM,EAAE,eAAe;CACxB;;AARH,AASE,KATG,GASC,CAAC,CAAA;EACH,MAAM,EAAE,EAAE;CACX;;AAGH,AAAA,KAAK,CAAA;EACH,KAAK,ECCD,OAAiB;CDGtB;;AALD,AAEE,KAFG,GAEC,EAAE,CAAA;EACJ,YAAY,ECDV,OAAiB;CDEpB;;AAEH,AAAA,QAAQ,CAAA;EACN,KAAK,ECJC,OAAO;CDQd;;AALD,AAEE,QAFM,GAEF,EAAE,CAAA;EACJ,YAAY,ECNR,OAAO;CDOZ", + "sources": [ + "note.module.scss", + "../variables.scss" + ], + "names": [], + "file": "note.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/parcours.module.css b/frontend/styles/room/parcours.module.css new file mode 100644 index 00000000..647acf9f --- /dev/null +++ b/frontend/styles/room/parcours.module.css @@ -0,0 +1,42 @@ +.exo-container { + display: -ms-grid; + display: grid; + -ms-grid-columns: (minmax(245px, 1fr))[auto-fill]; + grid-template-columns: repeat(auto-fill, minmax(245px, 1fr)); + grid-auto-flow: dense; +} + +.exo-container > div { + margin: 2% 0; +} + +.exo-full > p { + font-weight: 700; +} + +.head { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.head > p { + font-size: 2em; + font-weight: 800; + margin-right: 20px; +} + +.red { + color: #ff4f64; +} + +.green { + color: #41cf7c; +} +/*# sourceMappingURL=parcours.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/parcours.module.css.map b/frontend/styles/room/parcours.module.css.map new file mode 100644 index 00000000..2fb35867 --- /dev/null +++ b/frontend/styles/room/parcours.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,IAAI;EACb,qBAAqB,EAAE,qCAAqC;EAC5D,cAAc,EAAE,KAAK;CAItB;;AAPD,AAIE,cAJY,GAIR,GAAG,CAAA;EACL,MAAM,EAAE,IAAI;CACb;;AAGH,AACE,SADO,GACH,CAAC,CAAA;EACH,WAAW,EAAE,GAAI;CAClB;;AAGH,AAAA,KAAK,CAAA;EACH,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,aAAa;CAM/B;;AATD,AAIE,KAJG,GAIC,CAAC,CAAC;EACJ,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,IAAI;CACnB;;AAGH,AAAA,IAAI,CAAA;EACF,KAAK,ECXD,OAAiB;CDYtB;;AAED,AAAA,MAAM,CAAA;EACJ,KAAK,ECdC,OAAO;CDed", + "sources": [ + "parcours.module.scss", + "../variables.scss" + ], + "names": [], + "file": "parcours.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/parcoursView.module.css b/frontend/styles/room/parcoursView.module.css new file mode 100644 index 00000000..23a208ed --- /dev/null +++ b/frontend/styles/room/parcoursView.module.css @@ -0,0 +1 @@ +/* No CSS *//*# sourceMappingURL=parcoursView.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/parcoursView.module.css.map b/frontend/styles/room/parcoursView.module.css.map new file mode 100644 index 00000000..31060c98 --- /dev/null +++ b/frontend/styles/room/parcoursView.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "", + "sources": [ + "parcoursView.module.scss", + "../variables.scss" + ], + "names": [], + "file": "parcoursView.module.css" +} \ No newline at end of file diff --git a/frontend/styles/room/roomView.module.css b/frontend/styles/room/roomView.module.css new file mode 100644 index 00000000..0228eeb8 --- /dev/null +++ b/frontend/styles/room/roomView.module.css @@ -0,0 +1,113 @@ +.parcours-container { + background-color: rgba(29, 26, 90, 0.5); + -ms-grid-column: 2; + grid-column: 2; + -ms-grid-row: 2; + grid-row: 2; + margin: 5%; + border: 1.5px solid #181553; + border-radius: 3px; + margin-top: 20px; +} + +.participants-container { + background-color: rgba(29, 26, 90, 0.5); + -ms-grid-column: 1; + grid-column: 1; + -ms-grid-row: 2; + grid-row: 2; + margin: 2%; + margin-top: 20px; + height: -webkit-max-content; + height: -moz-max-content; + height: max-content; + min-height: 40%; + border: 1.5px solid #181553; + margin-left: 0; +} + +.participants-container > p:not(.cat-title) { + margin-left: 3%; + margin-bottom: 2%; + margin-top: 2%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.participants-container > p:not(.cat-title).owner { + font-weight: 600; +} + +.participants-container > p:not(.cat-title) span { + background-color: #2364aa; + padding: 1%; + border-radius: 8px; + font-size: 0.8em; + font-weight: 700; + margin-left: 3%; +} + +.full-container { + height: 100%; + display: -ms-grid; + display: grid; + -ms-grid-columns: 1fr 3fr; + grid-template-columns: 1fr 3fr; + -ms-grid-rows: 1fr 5fr; + grid-template-rows: 1fr 5fr; +} + +.full-container > h1 { + -ms-grid-column: 1; + -ms-grid-column-span: 2; + grid-column: 1/3; +} + +.cat-title { + font-size: 1.1em; + font-weight: 900; + border-bottom: 1px solid #1d1a5a; + margin: 4%; + padding-bottom: 2%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.cat-title > * { + margin: 0; +} + +.cat-title > button { + padding: 0 5%; +} + +.parcours-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin: 3%; + border-bottom: 1px solid #1d1a5a; + padding: 1.5%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.parcours-item > * { + margin: 0; +} +/*# sourceMappingURL=roomView.module.css.map */ \ No newline at end of file diff --git a/frontend/styles/room/roomView.module.css.map b/frontend/styles/room/roomView.module.css.map new file mode 100644 index 00000000..658497e5 --- /dev/null +++ b/frontend/styles/room/roomView.module.css.map @@ -0,0 +1,10 @@ +{ + "version": 3, + "mappings": "AAEA,AAAA,mBAAmB,CAAC;EAClB,gBAAgB,ECSL,qBAAO;EDRlB,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,CAAC;EACX,MAAM,EAAE,EAAE;EACV,MAAM,EAAE,KAAK,CAAC,KAAK,CCMZ,OAAO;EDLd,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,IAAI;CACjB;;AAED,AAAA,uBAAuB,CAAC;EACtB,gBAAgB,ECDL,qBAAO;EDElB,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,CAAC;EACX,MAAM,EAAE,EAAE;EACV,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,WAAW;EACnB,UAAU,EAAE,GAAG;EACf,MAAM,EAAE,KAAK,CAAC,KAAK,CCPZ,OAAO;EDQd,WAAW,EAAE,CAAC;CAmBf;;AA5BD,AAUE,uBAVqB,GAUjB,CAAC,AAAA,IAAK,CAAA,UAAU,EAAE;EAIpB,WAAW,EAAE,EAAE;EACf,aAAa,EAAE,EAAE;EACjB,UAAU,EAAE,EAAE;EACd,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;CASpB;;AA3BH,AAWI,uBAXmB,GAUjB,CAAC,AAAA,IAAK,CAAA,UAAU,CACjB,MAAM,CAAC;EACN,WAAW,EAAE,GAAG;CACjB;;AAbL,AAmBI,uBAnBmB,GAUjB,CAAC,AAAA,IAAK,CAAA,UAAU,EAShB,IAAI,CAAC;EACL,gBAAgB,EAAE,OAAO;EACzB,OAAO,EAAE,EAAE;EACX,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,EAAE;CAChB;;AAIL,AAAA,eAAe,CAAC;EACd,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,qBAAqB,EAAE,OAAO;EAC9B,kBAAkB,EAAE,OAAO;CAI5B;;AARD,AAKE,eALa,GAKT,EAAE,CAAA;EACJ,WAAW,EAAE,GAAG;CACjB;;AAGH,AAAA,UAAU,CAAC;EACT,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG,CAAC,KAAK,CC3Cb,OAAO;ED4ClB,MAAM,EAAE,EAAE;EACV,cAAc,EAAE,EAAE;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,aAAa;CAO/B;;AAfD,AASE,UATQ,GASJ,CAAC,CAAA;EACH,MAAM,EAAE,CAAC;CACV;;AAXH,AAYE,UAZQ,GAYJ,MAAM,CAAA;EACR,OAAO,EAAE,IAAI;CACd;;AAGH,AAAA,cAAc,CAAC;EACb,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,MAAM,EAAE,EAAE;EACV,aAAa,EAAE,GAAG,CAAC,KAAK,CC7Db,OAAO;ED8DlB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;CAIpB;;AAVD,AAOE,cAPY,GAOR,CAAC,CAAC;EACJ,MAAM,EAAE,CAAC;CACV", + "sources": [ + "roomView.module.scss", + "../variables.scss" + ], + "names": [], + "file": "roomView.module.css" +} \ No newline at end of file diff --git a/frontend/styles/variables.css b/frontend/styles/variables.css new file mode 100644 index 00000000..f3e2dc35 --- /dev/null +++ b/frontend/styles/variables.css @@ -0,0 +1 @@ +/* No CSS *//*# sourceMappingURL=variables.css.map */ \ No newline at end of file diff --git a/frontend/styles/variables.css.map b/frontend/styles/variables.css.map new file mode 100644 index 00000000..cb2d3ce4 --- /dev/null +++ b/frontend/styles/variables.css.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "mappings": "", + "sources": [ + "variables.scss" + ], + "names": [], + "file": "variables.css" +} \ No newline at end of file diff --git a/frontend/styles/variables.scss b/frontend/styles/variables.scss index b39bbedb..f6ba8fa4 100644 --- a/frontend/styles/variables.scss +++ b/frontend/styles/variables.scss @@ -9,7 +9,7 @@ $on-secondary: #080808; $contrast: #5396e7; - +$input-border: #64619f; $background: #1d1a5a; $border: #181553; $background-light: #1a0f7a; @@ -20,7 +20,7 @@ $red: rgb(255, 79, 100); $green: #41cf7c; $rouge: #a6333f; $vert: #41cf7c; -$bleu: blue; +$bleu: #045aff; $blanc: white; $orange: orange; $marron: brown;