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 c53c9159..8ef790dd 100644 Binary files a/backend/api/api/Generateur/__pycache__/__init__.cpython-310.pyc and b/backend/api/api/Generateur/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/api/api/Generateur/__pycache__/generateur_csv.cpython-310.pyc b/backend/api/api/Generateur/__pycache__/generateur_csv.cpython-310.pyc index 7acb4e06..651701b7 100644 Binary files a/backend/api/api/Generateur/__pycache__/generateur_csv.cpython-310.pyc and b/backend/api/api/Generateur/__pycache__/generateur_csv.cpython-310.pyc differ diff --git a/backend/api/api/Generateur/__pycache__/generateur_main.cpython-310.pyc b/backend/api/api/Generateur/__pycache__/generateur_main.cpython-310.pyc index 12847e0c..ecd37087 100644 Binary files a/backend/api/api/Generateur/__pycache__/generateur_main.cpython-310.pyc and b/backend/api/api/Generateur/__pycache__/generateur_main.cpython-310.pyc differ 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 a035e6f3..b3ca327b 100644 Binary files a/backend/api/api/__pycache__/__init__.cpython-310.pyc and b/backend/api/api/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/api/api/__pycache__/asgi.cpython-310.pyc b/backend/api/api/__pycache__/asgi.cpython-310.pyc index a1ea55e9..a5686e0f 100644 Binary files a/backend/api/api/__pycache__/asgi.cpython-310.pyc and b/backend/api/api/__pycache__/asgi.cpython-310.pyc differ diff --git a/backend/api/api/__pycache__/settings.cpython-310.pyc b/backend/api/api/__pycache__/settings.cpython-310.pyc index f986b2bd..b12137fb 100644 Binary files a/backend/api/api/__pycache__/settings.cpython-310.pyc and b/backend/api/api/__pycache__/settings.cpython-310.pyc differ diff --git a/backend/api/api/__pycache__/urls.cpython-310.pyc b/backend/api/api/__pycache__/urls.cpython-310.pyc index 1c665d07..825d04ff 100644 Binary files a/backend/api/api/__pycache__/urls.cpython-310.pyc and b/backend/api/api/__pycache__/urls.cpython-310.pyc differ 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 55133adb..b2263fa5 100644 Binary files a/backend/api/db.sqlite3 and b/backend/api/db.sqlite3 differ diff --git a/backend/api/exercices/__pycache__/__init__.cpython-310.pyc b/backend/api/exercices/__pycache__/__init__.cpython-310.pyc index bda91033..20d06fd4 100644 Binary files a/backend/api/exercices/__pycache__/__init__.cpython-310.pyc and b/backend/api/exercices/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/admin.cpython-310.pyc b/backend/api/exercices/__pycache__/admin.cpython-310.pyc index be310e10..cd92fd98 100644 Binary files a/backend/api/exercices/__pycache__/admin.cpython-310.pyc and b/backend/api/exercices/__pycache__/admin.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/apps.cpython-310.pyc b/backend/api/exercices/__pycache__/apps.cpython-310.pyc index 688fdaf1..0639237c 100644 Binary files a/backend/api/exercices/__pycache__/apps.cpython-310.pyc and b/backend/api/exercices/__pycache__/apps.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/filters.cpython-310.pyc b/backend/api/exercices/__pycache__/filters.cpython-310.pyc new file mode 100644 index 00000000..d7490800 Binary files /dev/null and b/backend/api/exercices/__pycache__/filters.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/models.cpython-310.pyc b/backend/api/exercices/__pycache__/models.cpython-310.pyc index b41f921a..cb8d3028 100644 Binary files a/backend/api/exercices/__pycache__/models.cpython-310.pyc and b/backend/api/exercices/__pycache__/models.cpython-310.pyc differ 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 00000000..19887e1e Binary files /dev/null and b/backend/api/exercices/__pycache__/paginations.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc b/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc index 09433c13..3ca0f170 100644 Binary files a/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc and b/backend/api/exercices/__pycache__/pdfmaker.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/serializers.cpython-310.pyc b/backend/api/exercices/__pycache__/serializers.cpython-310.pyc index 74c4406f..1eef24a7 100644 Binary files a/backend/api/exercices/__pycache__/serializers.cpython-310.pyc and b/backend/api/exercices/__pycache__/serializers.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/signals.cpython-310.pyc b/backend/api/exercices/__pycache__/signals.cpython-310.pyc index a7511bf8..dab5e5b0 100644 Binary files a/backend/api/exercices/__pycache__/signals.cpython-310.pyc and b/backend/api/exercices/__pycache__/signals.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/urls.cpython-310.pyc b/backend/api/exercices/__pycache__/urls.cpython-310.pyc index 5bbab187..f6833e11 100644 Binary files a/backend/api/exercices/__pycache__/urls.cpython-310.pyc and b/backend/api/exercices/__pycache__/urls.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/utils.cpython-310.pyc b/backend/api/exercices/__pycache__/utils.cpython-310.pyc index de9403b0..b3c14763 100644 Binary files a/backend/api/exercices/__pycache__/utils.cpython-310.pyc and b/backend/api/exercices/__pycache__/utils.cpython-310.pyc differ diff --git a/backend/api/exercices/__pycache__/views.cpython-310.pyc b/backend/api/exercices/__pycache__/views.cpython-310.pyc index 845ea528..26aab4e2 100644 Binary files a/backend/api/exercices/__pycache__/views.cpython-310.pyc and b/backend/api/exercices/__pycache__/views.cpython-310.pyc differ 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 58dc96a2..b76e63d2 100644 Binary files a/backend/api/exercices/migrations/__pycache__/0001_initial.cpython-310.pyc and b/backend/api/exercices/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/0002_exercice_iscsv_exercice_ispdf_exercice_isweb.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0002_exercice_iscsv_exercice_ispdf_exercice_isweb.cpython-310.pyc index 4dd1be5a..5e4be8c3 100644 Binary files a/backend/api/exercices/migrations/__pycache__/0002_exercice_iscsv_exercice_ispdf_exercice_isweb.cpython-310.pyc and b/backend/api/exercices/migrations/__pycache__/0002_exercice_iscsv_exercice_ispdf_exercice_isweb.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/0003_alter_exercice_exo_model.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0003_alter_exercice_exo_model.cpython-310.pyc index e6e2df90..68f8acb2 100644 Binary files a/backend/api/exercices/migrations/__pycache__/0003_alter_exercice_exo_model.cpython-310.pyc and b/backend/api/exercices/migrations/__pycache__/0003_alter_exercice_exo_model.cpython-310.pyc differ 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 bfba0c52..165e618d 100644 Binary files a/backend/api/exercices/migrations/__pycache__/0004_alter_exercice_exemple_alter_exercice_exo_model.cpython-310.pyc and b/backend/api/exercices/migrations/__pycache__/0004_alter_exercice_exemple_alter_exercice_exo_model.cpython-310.pyc differ 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 00000000..0cda1e24 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0005_exercice_author_exercice_private.cpython-310.pyc differ 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 00000000..82f8ca4b Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0006_alter_exercice_private.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/0007_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0007_exercice_origin.cpython-310.pyc new file mode 100644 index 00000000..27f07879 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0007_exercice_origin.cpython-310.pyc differ 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 00000000..0381e063 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0008_alter_exercice_origin.cpython-310.pyc differ 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 00000000..70bad47a Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0008_remove_exercice_origin.cpython-310.pyc differ 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 00000000..631dc5f3 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0009_alter_exercice_origin.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/0009_exercice_origin.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0009_exercice_origin.cpython-310.pyc new file mode 100644 index 00000000..04eefb57 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0009_exercice_origin.cpython-310.pyc differ 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 00000000..be1be92e Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0009_remove_exercice_origin.cpython-310.pyc differ 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 00000000..d4201b71 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0010_alter_exercice_id_code.cpython-310.pyc differ 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 00000000..ab6371a8 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0010_remove_exercice_origin_exercice_original.cpython-310.pyc differ 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 00000000..05146333 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0011_alter_exercice_id_code.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/0011_remove_exercice_original.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/0011_remove_exercice_original.cpython-310.pyc new file mode 100644 index 00000000..a50ad350 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0011_remove_exercice_original.cpython-310.pyc differ 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 00000000..dc619dd8 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0012_alter_exercice_origin.cpython-310.pyc differ 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 00000000..51c8d646 Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0013_tag_user.cpython-310.pyc differ 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 00000000..c464d43c Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0014_remove_exercice_tags_exercice_tags.cpython-310.pyc differ 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 00000000..42e8430d Binary files /dev/null and b/backend/api/exercices/migrations/__pycache__/0015_exercice_original.cpython-310.pyc differ diff --git a/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc b/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc index 8be4812e..72ae908b 100644 Binary files a/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc and b/backend/api/exercices/migrations/__pycache__/__init__.cpython-310.pyc differ 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 315af0c2..4f2d88d2 100644 Binary files a/backend/api/room/__pycache__/__init__.cpython-310.pyc and b/backend/api/room/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/admin.cpython-310.pyc b/backend/api/room/__pycache__/admin.cpython-310.pyc index 2b3d62c9..afdfddab 100644 Binary files a/backend/api/room/__pycache__/admin.cpython-310.pyc and b/backend/api/room/__pycache__/admin.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/apps.cpython-310.pyc b/backend/api/room/__pycache__/apps.cpython-310.pyc index 2ba13007..65a00e47 100644 Binary files a/backend/api/room/__pycache__/apps.cpython-310.pyc and b/backend/api/room/__pycache__/apps.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/consumers.cpython-310.pyc b/backend/api/room/__pycache__/consumers.cpython-310.pyc index f8194395..2097eb88 100644 Binary files a/backend/api/room/__pycache__/consumers.cpython-310.pyc and b/backend/api/room/__pycache__/consumers.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/models.cpython-310.pyc b/backend/api/room/__pycache__/models.cpython-310.pyc index 93328a69..97a983a4 100644 Binary files a/backend/api/room/__pycache__/models.cpython-310.pyc and b/backend/api/room/__pycache__/models.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/routing.cpython-310.pyc b/backend/api/room/__pycache__/routing.cpython-310.pyc index e6f901c3..63e3cebb 100644 Binary files a/backend/api/room/__pycache__/routing.cpython-310.pyc and b/backend/api/room/__pycache__/routing.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/serializers.cpython-310.pyc b/backend/api/room/__pycache__/serializers.cpython-310.pyc index 291f9224..56ea4ada 100644 Binary files a/backend/api/room/__pycache__/serializers.cpython-310.pyc and b/backend/api/room/__pycache__/serializers.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/urls.cpython-310.pyc b/backend/api/room/__pycache__/urls.cpython-310.pyc index d17034fd..599eeb1d 100644 Binary files a/backend/api/room/__pycache__/urls.cpython-310.pyc and b/backend/api/room/__pycache__/urls.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/utils.cpython-310.pyc b/backend/api/room/__pycache__/utils.cpython-310.pyc index 029d5053..1a6905ae 100644 Binary files a/backend/api/room/__pycache__/utils.cpython-310.pyc and b/backend/api/room/__pycache__/utils.cpython-310.pyc differ diff --git a/backend/api/room/__pycache__/views.cpython-310.pyc b/backend/api/room/__pycache__/views.cpython-310.pyc index 7774a9bc..5144373d 100644 Binary files a/backend/api/room/__pycache__/views.cpython-310.pyc and b/backend/api/room/__pycache__/views.cpython-310.pyc differ 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 658a5d32..3e884a43 100644 Binary files a/backend/api/room/migrations/__pycache__/0001_initial.cpython-310.pyc and b/backend/api/room/migrations/__pycache__/0001_initial.cpython-310.pyc differ 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 2c7c8795..d77f0852 100644 Binary files a/backend/api/room/migrations/__pycache__/0002_tempcorrection.cpython-310.pyc and b/backend/api/room/migrations/__pycache__/0002_tempcorrection.cpython-310.pyc differ 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 eade6991..3aaf0fae 100644 Binary files a/backend/api/room/migrations/__pycache__/0003_tempcorrection_id_code.cpython-310.pyc and b/backend/api/room/migrations/__pycache__/0003_tempcorrection_id_code.cpython-310.pyc differ 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 dd03e1f9..5775b98f 100644 Binary files a/backend/api/room/migrations/__pycache__/0004_alter_tempcorrection_id_code.cpython-310.pyc and b/backend/api/room/migrations/__pycache__/0004_alter_tempcorrection_id_code.cpython-310.pyc differ diff --git a/backend/api/room/migrations/__pycache__/0005_rename_participants_room_anonymousmembers_and_more.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0005_rename_participants_room_anonymousmembers_and_more.cpython-310.pyc new file mode 100644 index 00000000..c6e51e4c Binary files /dev/null and b/backend/api/room/migrations/__pycache__/0005_rename_participants_room_anonymousmembers_and_more.cpython-310.pyc differ 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 00000000..4204f684 Binary files /dev/null and b/backend/api/room/migrations/__pycache__/0006_alter_room_usermembers.cpython-310.pyc differ diff --git a/backend/api/room/migrations/__pycache__/0007_alter_room_usermembers.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0007_alter_room_usermembers.cpython-310.pyc new file mode 100644 index 00000000..e05ca3b7 Binary files /dev/null and b/backend/api/room/migrations/__pycache__/0007_alter_room_usermembers.cpython-310.pyc differ 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 00000000..d1378902 Binary files /dev/null and b/backend/api/room/migrations/__pycache__/0008_alter_room_anonymousmembers.cpython-310.pyc differ diff --git a/backend/api/room/migrations/__pycache__/0009_room_online.cpython-310.pyc b/backend/api/room/migrations/__pycache__/0009_room_online.cpython-310.pyc new file mode 100644 index 00000000..029b1672 Binary files /dev/null and b/backend/api/room/migrations/__pycache__/0009_room_online.cpython-310.pyc differ diff --git a/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc b/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc index 0f73d887..d2027e75 100644 Binary files a/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc and b/backend/api/room/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/backend/api/room/models.py b/backend/api/room/models.py index 5fe5d25f..5d19c4c9 100644 --- a/backend/api/room/models.py +++ b/backend/api/room/models.py @@ -6,6 +6,8 @@ import string from django.db import models import pytz from .utils import getNow + +from users.models import CustomUser # Create your models here. @@ -29,6 +31,7 @@ def generate_unique_code_parcours(): break return code + def generate_unique_code_corr(): length = 6 @@ -42,25 +45,55 @@ def generate_unique_code_corr(): class RoomManager(models.Manager): def add_participant(self, room, new_name, clientId, owner, online): room = self.get_queryset().filter(id_code=room)[0] - participants = room.participants + participants = room.anonymousMembers if new_name in list(map(lambda p: p['nick'], participants)): return None code = None while True: - code = ''.join(random.choices(string.ascii_uppercase, k=6)) - if code not in list(map(lambda p: p['code'], participants)): - break + code = ''.join(random.choices(string.ascii_uppercase, k=6)) + if code not in list(map(lambda p: p['code'], participants)): + break new_participant = {'nick': new_name, 'code': code, 'clientId': clientId, "owner": owner, "online": online} - room.participants = [*participants, new_participant] + room.anonymousMembers = [*participants, new_participant] + room.save() + return new_participant + + def add_user(self, room, code, owner, online): + room = self.get_queryset().filter(id_code=room)[0] + try: + user = CustomUser.objects.filter(id_code = code)[0] + except IndexError: + return None + + room.userMembers.add(user) + new_participant = {'nick': user.username, 'code': user.id_code, + 'clientId': user.clientId, "owner": owner, "online": online} + room.online = [*room.online, user.id_code] room.save() return new_participant + def del_user(self, room, code): + room = self.get_queryset().filter(id_code=room)[0] + try: + user = CustomUser.objects.filter(id_code=code)[0] + except IndexError: + return None + room.userMembers.remove(user) + parcours = room.parcours_set.all() + for parc in parcours: + challenger = parc.challenger + parc.challenger = list( + filter(lambda c: c['code'] != code, challenger)) + parc.save() + room.save() + return code + def del_participant(self, room, code): room = self.get_queryset().filter(id_code=room)[0] - participants = room.participants + participants = room.anonymousMembers - room.participants = list( + room.anonymousMembers = list( filter(lambda c: c['code'] != code, participants)) print('parcours', room.parcours_set) parcours = room.parcours_set.all() @@ -72,21 +105,20 @@ class RoomManager(models.Manager): room.save() return code - def add_waiter(self, room, new_name): + def add_waiter(self, room, new_name, isUser, code = None): room = self.get_queryset().filter(id_code=room)[0] - participants = room.participants - if new_name in list(map(lambda p: p['nick'], participants)): - return None + participants = room.anonymousMembers + if new_name in list(map(lambda p: p['nick'], participants)) and isUser: + return None waiters = room.waiters if new_name in list(map(lambda p: p['nick'], waiters)): return None - - code = None - while True: - code = ''.join(random.choices(string.ascii_uppercase, k=6)) - if code not in list(map(lambda p: p['code'], waiters)): - break - new_waiter = {'nick': new_name, 'code': code, } + if code == None: + while True: + code = ''.join(random.choices(string.ascii_uppercase, k=6)) + if code not in list(map(lambda p: p['code'], waiters)): + break + new_waiter = {'nick': new_name, 'code': code, "status": 'user' if isUser == True else 'anonymous'} room.waiters = [*waiters, new_waiter] room.save() return new_waiter @@ -100,95 +132,108 @@ class RoomManager(models.Manager): def disconnect(self, room_code, code): room = self.get_queryset().filter(id_code=room_code)[0] - participants = room.participants - participant = list( - filter(lambda p: p['code'] == code, participants))[0] - participant['online'] = False - room.participants = [ - *list(filter(lambda p: p['code'] != code, participants)), participant] + online = room.online + + room.online = [ + o for o in online if o != code] room.save() return True + + def connect(self, room_code, code): room = self.get_queryset().filter(id_code=room_code)[0] - participants = room.participants - participant = list( - filter(lambda p: p['code'] == code, participants))[0] - participant['online'] = True - room.participants = [ - *list(filter(lambda p: p['code'] != code, participants)), participant] + online = room.online + + room.online = [*online, code] + room.save() + return True + + def connectUser(self, room_code, code): + room = self.get_queryset().filter(id_code=room_code)[0] + online = room.online + + room.online = [*online, code] room.save() return True class Room(models.Model): - name = models.CharField(max_length=50) - id_code = models.CharField(max_length=50, default=generate_unique_code_room) - participants = models.JSONField(default=list) - waiters = models.JSONField(default=list) - created_at = models.DateTimeField(auto_now_add=True) - owner = models.JSONField(default=dict) - public_result = models.BooleanField(default=False) + name = models.CharField(max_length=50) + id_code = models.CharField( + max_length=50, default=generate_unique_code_room) + anonymousMembers = models.JSONField(default=list, null=True) + userMembers = models.ManyToManyField("users.CustomUser") + waiters = models.JSONField(default=list) + created_at = models.DateTimeField(auto_now_add=True) + owner = models.JSONField(default=dict) + public_result = models.BooleanField(default=False) - private = models.BooleanField(default=True) + online = models.JSONField(default=list) + private = models.BooleanField(default=True) - objects = RoomManager() + objects = RoomManager() class ParcoursManager(models.Manager): - def challenge(self, parcours_code, user_code, result): - parcours = self.get_queryset().filter(id_code=parcours_code)[0] + def challenge(self, parcours_code, user_code, result, isUser): + parcours = self.get_queryset().filter(id_code=parcours_code)[0] - challengers = list( - filter(lambda c: c['code'] == user_code, parcours.challenger)) + challengers = list( + filter(lambda c: c['code'] == user_code, parcours.challenger)) + if not isUser: + challenger = list( + filter(lambda p: p['code'] == user_code, parcours.room.anonymousMembers))[0] + else: + user = CustomUser.objects.filter(id_code = user_code)[0] + challenger = {'nick': user.username, "code": user.id_code, 'clientId': user.clientId} + validate = None - challenger = list( - filter(lambda p: p['code'] == user_code, parcours.room.participants))[0] - validate = None + 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}] - 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 00000000..3abe6766 Binary files /dev/null and b/backend/api/uploads/exercices/exo_BCCMKX/__pycache__/main.cpython-310.pyc differ diff --git a/backend/api/uploads/exercices/exo_BCCMKX/main.py b/backend/api/uploads/exercices/exo_BCCMKX/main.py new file mode 100644 index 00000000..66c76943 --- /dev/null +++ b/backend/api/uploads/exercices/exo_BCCMKX/main.py @@ -0,0 +1,6 @@ +import random + +def main(): + return {'calcul': f'1 + [3] = 4'} + +print('test') \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_CPJLYD/main.py b/backend/api/uploads/exercices/exo_CPJLYD/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_CPJLYD/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_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 6a2fab24..00000000 Binary files a/backend/api/uploads/exercices/exo_ERWXNC/__pycache__/sc.cpython-310.pyc and /dev/null differ 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 19e99958..00000000 Binary files a/backend/api/uploads/exercices/exo_ILOXKD/__pycache__/main.cpython-310.pyc and /dev/null differ diff --git a/backend/api/uploads/exercices/exo_ILOXKD/main.py b/backend/api/uploads/exercices/exo_ILOXKD/main.py deleted file mode 100644 index e84d3252..00000000 --- a/backend/api/uploads/exercices/exo_ILOXKD/main.py +++ /dev/null @@ -1,7 +0,0 @@ -import random - -def main(): - t1 = random.randint(1,10) - t2 = random.randint(1,10) - return {'calcul': f'{t1} + [{t2}] = {t1 + t2}', 'csv': None} - diff --git a/backend/api/uploads/exercices/exo_ERWXNC/main.py b/backend/api/uploads/exercices/exo_IQBTYC/main.py similarity index 100% rename from backend/api/uploads/exercices/exo_ERWXNC/main.py rename to backend/api/uploads/exercices/exo_IQBTYC/main.py diff --git a/backend/api/uploads/exercices/exo_IRMCXW/main.py b/backend/api/uploads/exercices/exo_IRMCXW/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_IRMCXW/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_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 00000000..182661cb Binary files /dev/null and b/backend/api/uploads/exercices/exo_LLJYOU/__pycache__/sc.cpython-310.pyc differ diff --git a/backend/api/uploads/exercices/exo_ERWXNC/sc.py b/backend/api/uploads/exercices/exo_LLJYOU/sc.py similarity index 100% rename from backend/api/uploads/exercices/exo_ERWXNC/sc.py rename to backend/api/uploads/exercices/exo_LLJYOU/sc.py diff --git a/backend/api/uploads/exercices/exo_LQYJFP/__pycache__/sc.cpython-310.pyc b/backend/api/uploads/exercices/exo_LQYJFP/__pycache__/sc.cpython-310.pyc deleted file mode 100644 index 7a484b2f..00000000 Binary files a/backend/api/uploads/exercices/exo_LQYJFP/__pycache__/sc.cpython-310.pyc and /dev/null differ diff --git a/backend/api/uploads/exercices/exo_LQYJFP/sc.py b/backend/api/uploads/exercices/exo_LQYJFP/sc.py deleted file mode 100644 index 17d374ed..00000000 --- a/backend/api/uploads/exercices/exo_LQYJFP/sc.py +++ /dev/null @@ -1,6 +0,0 @@ -import random - -def main(): - return {'calcul': f'1 + 3 = ', 'pdf': None} - -print('test') \ No newline at end of file diff --git a/backend/api/uploads/exercices/exo_LWSRGG/main.py b/backend/api/uploads/exercices/exo_LWSRGG/main.py new file mode 100644 index 00000000..4018422c --- /dev/null +++ b/backend/api/uploads/exercices/exo_LWSRGG/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_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 00000000..496f9a20 Binary files /dev/null and b/backend/api/uploads/exercices/exo_NWPRJY/__pycache__/main.cpython-310.pyc differ 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 00000000..ba29a545 Binary files /dev/null and b/backend/api/uploads/exercices/exo_PQLBUC/__pycache__/main.cpython-310.pyc differ 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 7b4af6d1..00000000 Binary files a/backend/api/uploads/exercices/exo_SDYANR/__pycache__/main.cpython-310.pyc and /dev/null differ 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 00000000..65ab44b7 Binary files /dev/null and b/backend/api/uploads/exercices/exo_ULLYHV/__pycache__/main.cpython-310.pyc differ 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 00000000..5f7fa8cc Binary files /dev/null and b/backend/api/uploads/exercices/exo_YCBXCU/__pycache__/main.cpython-310.pyc differ diff --git a/backend/api/uploads/exercices/exo_YCBXCU/main.py b/backend/api/uploads/exercices/exo_YCBXCU/main.py new file mode 100644 index 00000000..8e7a4444 --- /dev/null +++ b/backend/api/uploads/exercices/exo_YCBXCU/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_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 00000000..4abfba38 Binary files /dev/null and b/backend/api/users/__pycache__/__init__.cpython-310.pyc differ 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 00000000..236fe1f6 Binary files /dev/null and b/backend/api/users/__pycache__/admin.cpython-310.pyc differ diff --git a/backend/api/users/__pycache__/apps.cpython-310.pyc b/backend/api/users/__pycache__/apps.cpython-310.pyc new file mode 100644 index 00000000..b125b578 Binary files /dev/null and b/backend/api/users/__pycache__/apps.cpython-310.pyc differ 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 00000000..6813d49a Binary files /dev/null and b/backend/api/users/__pycache__/forms.cpython-310.pyc differ 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 00000000..21455270 Binary files /dev/null and b/backend/api/users/__pycache__/models.cpython-310.pyc differ 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 00000000..0004f6eb Binary files /dev/null and b/backend/api/users/__pycache__/serializers.cpython-310.pyc differ diff --git a/backend/api/users/__pycache__/urls.cpython-310.pyc b/backend/api/users/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..43370d89 Binary files /dev/null and b/backend/api/users/__pycache__/urls.cpython-310.pyc differ diff --git a/backend/api/users/admin.py b/backend/api/users/admin.py new file mode 100644 index 00000000..df4130a4 --- /dev/null +++ b/backend/api/users/admin.py @@ -0,0 +1,15 @@ +# users/admin.py +from django.contrib import admin +from django.contrib.auth import get_user_model +from django.contrib.auth.admin import UserAdmin +from .forms import CustomUserChangeForm, CustomUserCreationForm +from .models import CustomUser + +class CustomUserAdmin(UserAdmin): + add_form = CustomUserCreationForm + form = CustomUserChangeForm + model = CustomUser + list_display = ['username'] + + +admin.site.register(CustomUser, CustomUserAdmin) diff --git a/backend/api/users/apps.py b/backend/api/users/apps.py new file mode 100644 index 00000000..72b14010 --- /dev/null +++ b/backend/api/users/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'users' diff --git a/backend/api/users/forms.py b/backend/api/users/forms.py new file mode 100644 index 00000000..f27ed75a --- /dev/null +++ b/backend/api/users/forms.py @@ -0,0 +1,16 @@ +from django import forms +from django.contrib.auth.forms import UserChangeForm, UserCreationForm +from .models import CustomUser + + +class CustomUserCreationForm(UserCreationForm): + class Meta: + model = CustomUser + fields = ('username', ) + + +class CustomUserChangeForm(UserChangeForm): + + class Meta: + model = CustomUser + fields = UserChangeForm.Meta.fields diff --git a/backend/api/users/migrations/0001_initial.py b/backend/api/users/migrations/0001_initial.py new file mode 100644 index 00000000..ea7206d9 --- /dev/null +++ b/backend/api/users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.0 on 2022-05-19 16:47 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/backend/api/users/migrations/0002_customuser_registeredexos.py b/backend/api/users/migrations/0002_customuser_registeredexos.py new file mode 100644 index 00000000..4a4c755e --- /dev/null +++ b/backend/api/users/migrations/0002_customuser_registeredexos.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-20 13:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0005_exercice_author_exercice_private'), + ('users', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='registeredExos', + field=models.ManyToManyField(null=True, to='exercices.Exercice'), + ), + ] diff --git a/backend/api/users/migrations/0003_alter_customuser_registeredexos.py b/backend/api/users/migrations/0003_alter_customuser_registeredexos.py new file mode 100644 index 00000000..daa8161d --- /dev/null +++ b/backend/api/users/migrations/0003_alter_customuser_registeredexos.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-20 13:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exercices', '0005_exercice_author_exercice_private'), + ('users', '0002_customuser_registeredexos'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='registeredExos', + field=models.ManyToManyField(to='exercices.Exercice'), + ), + ] diff --git a/backend/api/users/migrations/0004_customuser_id_code.py b/backend/api/users/migrations/0004_customuser_id_code.py new file mode 100644 index 00000000..72be744f --- /dev/null +++ b/backend/api/users/migrations/0004_customuser_id_code.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-21 15:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_alter_customuser_registeredexos'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='id_code', + field=models.CharField(default='', max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0005_alter_customuser_id_code.py b/backend/api/users/migrations/0005_alter_customuser_id_code.py new file mode 100644 index 00000000..553fd512 --- /dev/null +++ b/backend/api/users/migrations/0005_alter_customuser_id_code.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-21 15:39 + +from django.db import migrations, models +import users.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0004_customuser_id_code'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='id_code', + field=models.CharField(default=users.models.generate_unique_code, max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0006_customuser_clientid.py b/backend/api/users/migrations/0006_customuser_clientid.py new file mode 100644 index 00000000..f304ffda --- /dev/null +++ b/backend/api/users/migrations/0006_customuser_clientid.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0 on 2022-05-21 15:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0005_alter_customuser_id_code'), + ] + + operations = [ + migrations.AddField( + model_name='customuser', + name='clientId', + field=models.CharField(default='fd3acbe0-5406-4904-9f0d-83c66024ec8c', max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0007_alter_customuser_clientid.py b/backend/api/users/migrations/0007_alter_customuser_clientid.py new file mode 100644 index 00000000..b6f01ac6 --- /dev/null +++ b/backend/api/users/migrations/0007_alter_customuser_clientid.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 = [ + ('users', '0006_customuser_clientid'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='clientId', + field=models.CharField(default='d5c3c8ee-de15-40fd-9988-910330888187', max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0008_alter_customuser_clientid.py b/backend/api/users/migrations/0008_alter_customuser_clientid.py new file mode 100644 index 00000000..fd1a5029 --- /dev/null +++ b/backend/api/users/migrations/0008_alter_customuser_clientid.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 = [ + ('users', '0007_alter_customuser_clientid'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='clientId', + field=models.CharField(default='5a51ccaa-e788-436f-a553-a69fa8ee155a', max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0009_alter_customuser_clientid_alter_customuser_id_code.py b/backend/api/users/migrations/0009_alter_customuser_clientid_alter_customuser_id_code.py new file mode 100644 index 00000000..e4292570 --- /dev/null +++ b/backend/api/users/migrations/0009_alter_customuser_clientid_alter_customuser_id_code.py @@ -0,0 +1,24 @@ +# Generated by Django 4.0 on 2022-05-30 15:55 + +from django.db import migrations, models +import users.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0008_alter_customuser_clientid'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='clientId', + field=models.CharField(default=users.models.generate_unique_uuid, max_length=50), + ), + migrations.AlterField( + model_name='customuser', + name='id_code', + field=models.CharField(default=users.models.generate_unique_code, max_length=50), + ), + ] diff --git a/backend/api/users/migrations/0010_alter_customuser_id_code.py b/backend/api/users/migrations/0010_alter_customuser_id_code.py new file mode 100644 index 00000000..1d350a67 --- /dev/null +++ b/backend/api/users/migrations/0010_alter_customuser_id_code.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2022-05-30 16:04 + +from django.db import migrations, models +import users.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0009_alter_customuser_clientid_alter_customuser_id_code'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='id_code', + field=models.CharField(default=users.models.generate_unique_code, max_length=50, unique=True), + ), + ] diff --git a/backend/api/users/migrations/__init__.py b/backend/api/users/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/api/users/migrations/__pycache__/0001_initial.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0001_initial.cpython-310.pyc new file mode 100644 index 00000000..b5e305da Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0001_initial.cpython-310.pyc differ diff --git a/backend/api/users/migrations/__pycache__/0002_customuser_registeredexos.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0002_customuser_registeredexos.cpython-310.pyc new file mode 100644 index 00000000..a81d5346 Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0002_customuser_registeredexos.cpython-310.pyc differ diff --git a/backend/api/users/migrations/__pycache__/0003_alter_customuser_registeredexos.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0003_alter_customuser_registeredexos.cpython-310.pyc new file mode 100644 index 00000000..a40162f8 Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0003_alter_customuser_registeredexos.cpython-310.pyc differ 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 00000000..5fce177e Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0004_customuser_id_code.cpython-310.pyc differ 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 00000000..378587eb Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0005_alter_customuser_id_code.cpython-310.pyc differ diff --git a/backend/api/users/migrations/__pycache__/0006_customuser_clientid.cpython-310.pyc b/backend/api/users/migrations/__pycache__/0006_customuser_clientid.cpython-310.pyc new file mode 100644 index 00000000..dfc0e9b4 Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0006_customuser_clientid.cpython-310.pyc differ 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 00000000..bb4094fe Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0007_alter_customuser_clientid.cpython-310.pyc differ 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 00000000..6957a4ec Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0008_alter_customuser_clientid.cpython-310.pyc differ 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 00000000..aed55f20 Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0009_alter_customuser_clientid_alter_customuser_id_code.cpython-310.pyc differ 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 00000000..477b358b Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0010_alter_customuser_clientid.cpython-310.pyc differ 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 00000000..3de67cb6 Binary files /dev/null and b/backend/api/users/migrations/__pycache__/0010_alter_customuser_id_code.cpython-310.pyc differ diff --git a/backend/api/users/migrations/__pycache__/__init__.cpython-310.pyc b/backend/api/users/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..faa5dbbc Binary files /dev/null and b/backend/api/users/migrations/__pycache__/__init__.cpython-310.pyc differ 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": "AIEA,AAAA,cAAc,CAAC;EACX,OAAO,EAAE,CAAC;EACV,gBAAgB,EHQP,OAAO;EGPhB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,OAAO;EACf,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB;EAC/C,SAAS,EAAE,eAAe;EAC1B,UAAU,EAAE,IAAI;CAYnB;;AAtBD,AAWI,cAXU,AAWT,IAAK,CAAA,aAAa,CAAC,MAAM,CAAC;EACvB;GACL;EACK,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB;EAChD,SAAS,EAAE,oBAAoB;EAC/B,UAAU,EAAE,cAAc;CAC7B;;AAjBL,AAkBI,cAlBU,AAkBT,MAAM,CAAC,WAAW,CAAC;EAChB,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,IAAI;CACnB;;AAGL,AAAA,SAAS,AAAA,MAAM,CAAC;EACZ,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,IAAI;CAElB;;AAOD,AALA,iBAKiB,AAOZ,IAAK,CAAA,SAAS,CAAC,MAAM,GAAG,WAAW,EAwCxC,WAAW,AACN,IAAK,CAzCA,SAAS,CAyCC,MAAM,CArDP;EACf,MAAM,EAAE,GAAG,CAAC,KAAK,CHjCX,OAAO;EGkCb,UAAU,EAAE,IAAI;CACnB;;AAED,AAAA,iBAAiB,CAAC;EACd,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,MAAM;EAEjB,UAAU,EAAE,CAAC;EACb,OAAO,EAAE,CAAC;CAKb;;AAED,AAAA,eAAe,CAAC;EACZ,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,EAAE;EAEV,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,MAAM,EAAE,CAAC;EACT,SAAS,EAAE,GAAG;CAWjB;;AAlBD,AAQI,eARW,CAQT,CAAC;AARP,eAAe,CASX,CAAC,CAAC;EACE,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,EAAE;CAKd;;AAjBL,AAaQ,eAbO,CAQT,CAAC,AAKE,IAAK,CAlBJ,SAAS,CAkBK,MAAM;AAb9B,eAAe,CASX,CAAC,AAII,IAAK,CAlBJ,SAAS,CAkBK,MAAM,CAAC;EACnB,KAAK,EH/DP,OAAO;EGgEL,UAAU,EAAE,IAAI;CACnB;;AAIT,AAAA,cAAc,CAAC;EACX,OAAO,EAAE,IAAI;EACb,qBAAqB,EAAE,GAAG;EAC1B,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,aAAa;EACvB,aAAa,EAAE,GAAG;CACrB;;AAED,AAAA,QAAQ,CAAC;EACL,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,MAAM;EAChB,aAAa,EAAE,QAAQ;EACvB,SAAS,EAAE,GAAG;CACjB;;AAED,AAAA,WAAW,CAAC;EAUR,MAAM,EAAE,GAAG,CAAC,KAAK,CHjFZ,OAAO;EGkFZ,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,UAAU,EAAE,IAAI;CAUnB;;AA7BD,AAGQ,WAHG,AACN,IAAK,CAzCA,SAAS,CAyCC,MAAM,GAEd,gBAAgB,CAAC;EACjB,MAAM,EAAE,GAAG,CAAC,KAAK,CHxFnB,OAAO;EGyFL,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;CACnB;;AAPT,AAoBI,WApBO,AAoBN,SAAS,CAAC,IAAI,CAAC;EACZ,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,GAAG;EACV,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,qBAAqB;EAChC,SAAS,EAAE,2BAA2B;CACzC;;AAGL,UAAU,CAAV,QAAU;EACN,EAAE;IACE,SAAS,EAAE,mBAAmB,CAAC,YAAY;;EAE/C,IAAI;IACA,SAAS,EAAE,mBAAmB,CAAC,cAAc;;;;AAGrD,AAAA,wBAAwB,CAAC;EACrB,OAAO,EAAE,IAAI;EACb,qBAAqB,EAAE,QAAQ;EAC/B,QAAQ,EAAE,GAAG;CAChB;;AAED,AAAA,gBAAgB,CAAC;EACb,gBAAgB,EAAE,OAAuC;EAEzD,UAAU,EAAE,CAAC;EACb,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAuC;EACzD,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,GAAG;EACZ,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,2BAA2B;CAC1C;;AAED,AAAA,YAAY,CAAC;EACT,OAAO,EAAE,CAAC;EACV,KAAK,EAAE,IAAI;CACd;;AACD,AAAA,SAAS,CAAC;EACN,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,EAAE;CAEd;;AACD,AAAA,eAAe,CAAC;EACZ,OAAO,EAAE,IAAI;EACb,QAAQ,EAAE,IAAI;EACd,UAAU,EAAE,MAAM;EAClB,eAAe,EAAE,IAAI;EACrB,eAAe,EHlJR,OAAO,CAHC,OAAO;EKgCxB,eAAe,EL7BN,OAAO,CAHC,OAAO;CGuJzB;;AAPD,AE/GE,eF+Ga,AE/GZ,mBAAmB,CAAC;EACnB,MAAM,EAAE,GAAG;CAGZ;;AF2GH,AE1GE,eF0Ga,AE1GZ,yBAAyB,CAAC;EACzB,gBAAgB,ELvCD,OAAO;CKwCvB;;AFwGH,AEvGE,eFuGa,AEvGZ,yBAAyB,CAAC;EACzB,gBAAgB,ELvCT,OAAO;CKwCf;;AF8GH,AAAA,iBAAiB,CAAC;EACd,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,CAAC;CAkBb;;AArBD,AAII,iBAJa,CAIX,EAAE,CAAC;EACD,KAAK,EAAE,EAAE;EACT,MAAM,EAAE,GAAG;EACX,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,KAAK;CAC1B;;AATL,AAUI,iBAVa,CAUX,CAAC,CAAC;EACA,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,UAAU,EAAE,IAAI;CAInB;;AApBL,AAiBQ,iBAjBS,CAUX,CAAC,AAOE,MAAM,CAAC;EACJ,SAAS,EAAE,cAAc;CAC5B;;AAIT,AAAA,cAAc,CAAC;EACX,UAAU,EAAE,IAAI;CACnB;;AAnLS,AAAL,aAAkB,CAqLT;EACV,OAAO,EAAE,GAAG;CACf;;AAED,AAAA,eAAe,CAAC;EACZ,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,MAAM,EAAE,EAAE;EACV,OAAO,EAAE,GAAG;CAQf;;AAbD,AAMI,eANW,CAMT,GAAG,CAAA;EACD,OAAO,EAAE,EAAE;EACX,UAAU,EAAE,GAAG;CAIlB;;AAZL,AASS,eATM,CAMT,GAAG,AAGC,MAAM,CAAA;EACH,OAAO,EAAE,CAAC;CACb;;AAIV,AAAA,WAAW,CAAC,GAAG,CAAA;EACX,OAAO,EAAE,CAAC;EACV,IAAI,EAAE,GAAG;CACZ;;AFpND,AAAA,cAAc,AAAA,MAAM,CAAC;EACnB,SAAS,EAAE,IAAI;CAChB;;AEJD,AAAA,cAAc,CFKC;EACb,gBAAgB,EDMC,OAAO;CCFzB;;AIAC,MAAM,EAAE,SAAS,EAAE,KAAK;EFV1B,AAAA,cAAc,CFKC;IAGX,MAAM,EAAE,IAAI;GAEf;;;AEVD,AAWI,cAXU,AAWT,IAAK,CAAA,aAAa,CAAC,MAAM,CFCU;EACtC,SAAS,EAAE,IAAI;CAChB;;AAED,AAAA,SAAS,CAAC;EACR,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,MAAM;CAKxB;;AAVD,AAME,SANO,CAML,IAAI,CAAC;EACL,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;CACb;;AE0CH,AAAA,cAAc,CFvCC;EACb,OAAO,EAAE,IAAI;EACb,qBAAqB,EAAE,GAAG;EAC1B,kBAAkB,EAAE,eAAe;EACnC,gBAAgB,EDpBC,OAAO;ECsBxB,SAAS,EAAE,KAAK;EAChB,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,GAAG;EACf,UAAU,EAAE,IAAI;EAChB,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,MAAM;EIFhB,eAAe,EAAE,IAAI;CJYtB;;AArBD,AIUE,cJVY,AIUX,mBAAmB,CAAC;EACnB,OAAO,EAAE,IAAI;CACd;;AA9BD,MAAM,EAAE,SAAS,EAAE,KAAK;EFyD1B,AAAA,cAAc,CFvCC;IAcX,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,KAAK;GAEjB;;;AEFD,AAAA,eAAe,CFIC;EACd,WAAW,EAAE,KAAK;EAClB,QAAQ,EAAE,CAAC;EACX,MAAM,EAAE,OAAO;CAgBhB;;AAnBD,AAIE,eAJa,CAIX,CAAC,CAAC;EACF,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,GAAG;EAChB,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,GAAG;EACf,eAAe,EAAE,qBAAqB;EACtC,WAAW,EAAE,IAAI;CAMlB;;AAlBH,AAaI,eAbW,CAIX,CAAC,AASA,MAAM,CAAC;EACN,KAAK,EDlDA,OAAO,CCkDI,UAAU;EAC1B,WAAW,EAAE,GAAG;EAChB,eAAe,EAAE,SAAS;CAC3B;;AEgIL,AAAA,eAAe,CF5HC;EACd,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,CAAC;EACR,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;CAQZ;;AAjBD,AAUE,eAVa,GAUT,CAAC,GAAG,KAAK,AAAA,MAAM;AAVrB,eAAe,GAWT,KAAK,AAAA,MAAM,CAAC;EACd,SAAS,EAAE,UAAU;CACtB;;AAbH,AAcE,eAda,GAcT,GAAG,CAAC;EACN,OAAO,EAAE,IAAI;CACd;;AAGH,AAAA,KAAK,CAAC;EACJ,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,IAAI;CACb;;AAED,AAAA,OAAO,CAAC;EACN,KAAK,EAAE,GAAG;CACX;;AACD,AAAA,KAAK,CAAC;EACJ,KAAK,EAAE,KAAK;CACb;;AAED,AAAA,aAAa,CAAC;EACZ,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,CAAC;CACX;;AAED,AAAA,aAAa,CAAC;EACZ,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EAEjB,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,WAAW;EACpB,OAAO,EAAE,KAAK;CACf;;AAED,AAAA,UAAU,CAAC;EACT,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AF1HD,AAAA,sBAAsB,CAAA;EACpB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;CACvB;;AAID,AAAA,cAAc,CAAA;EACZ,OAAO,EAAE,IAAI;CACd", + "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": "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", + "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;