diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/__init__.py b/Elearning/bhs_elearning_certification_template/__init__.py
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/__init__.py
rename to Elearning/bhs_elearning_certification_template/__init__.py
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/__manifest__.py b/Elearning/bhs_elearning_certification_template/__manifest__.py
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/__manifest__.py
rename to Elearning/bhs_elearning_certification_template/__manifest__.py
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/models/__init__.py b/Elearning/bhs_elearning_certification_template/models/__init__.py
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/models/__init__.py
rename to Elearning/bhs_elearning_certification_template/models/__init__.py
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/models/survey_survey.py b/Elearning/bhs_elearning_certification_template/models/survey_survey.py
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/models/survey_survey.py
rename to Elearning/bhs_elearning_certification_template/models/survey_survey.py
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/banner.png b/Elearning/bhs_elearning_certification_template/static/description/banner.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/banner.png
rename to Elearning/bhs_elearning_certification_template/static/description/banner.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/icon.png b/Elearning/bhs_elearning_certification_template/static/description/icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Customization_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Customization_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Customization_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Customization_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Development_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Development_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Development_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Development_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Implementation_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Implementation_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Implementation_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Implementation_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Migration_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Migration_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Migration_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Migration_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Support_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Support_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Support_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Support_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Training_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/Training_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/Training_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/Training_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/call.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/call.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/call.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/call.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/call.svg b/Elearning/bhs_elearning_certification_template/static/description/imgs/call.svg
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/call.svg
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/call.svg
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/facebook_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/facebook_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/facebook_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/facebook_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/instagram_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/instagram_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/instagram_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/instagram_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/linkedin_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/linkedin_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/linkedin_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/linkedin_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/logo.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/logo.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/logo.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/logo.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/mail.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/mail.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail.svg b/Elearning/bhs_elearning_certification_template/static/description/imgs/mail.svg
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail.svg
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/mail.svg
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail_footer.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/mail_footer.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/mail_footer.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/mail_footer.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/advance_marketing_automation.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/advance_marketing_automation.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/advance_marketing_automation.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/advance_marketing_automation.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/auto_create_user_from_employee.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/auto_create_user_from_employee.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/auto_create_user_from_employee.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/auto_create_user_from_employee.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/aws_ses_mail_tracking.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/aws_ses_mail_tracking.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/aws_ses_mail_tracking.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/aws_ses_mail_tracking.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/groups_access_management.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/groups_access_management.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/groups_access_management.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/groups_access_management.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/hr_attendance_management.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/hr_attendance_management.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/hr_attendance_management.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/hr_attendance_management.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/hr_resignation_management.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/hr_resignation_management.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/hr_resignation_management.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/hr_resignation_management.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/project_task_check_list.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/project_task_check_list.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/other_module/project_task_check_list.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/other_module/project_task_check_list.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/screen/template.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/screen/template.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/screen/template.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/screen/template.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/skype_footer.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/skype_footer.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/skype_footer.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/skype_footer.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/twitter_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/twitter_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/twitter_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/twitter_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/whatsapp_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/whatsapp_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/whatsapp_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/whatsapp_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/youtube_icon.png b/Elearning/bhs_elearning_certification_template/static/description/imgs/youtube_icon.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/imgs/youtube_icon.png
rename to Elearning/bhs_elearning_certification_template/static/description/imgs/youtube_icon.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/index.html b/Elearning/bhs_elearning_certification_template/static/description/index.html
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/description/index.html
rename to Elearning/bhs_elearning_certification_template/static/description/index.html
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/GreatVibes-Regular.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/GreatVibes-Regular.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/GreatVibes-Regular.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/GreatVibes-Regular.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular-ofl.txt b/Elearning/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular-ofl.txt
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular-ofl.txt
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular-ofl.txt
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Lobster-Regular.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Merriweather-Italic.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/Merriweather-Italic.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Merriweather-Italic.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Merriweather-Italic.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Merriweather-Regular.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/Merriweather-Regular.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Merriweather-Regular.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Merriweather-Regular.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Poppins-Italic.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/Poppins-Italic.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Poppins-Italic.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Poppins-Italic.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Poppins-Regular.ttf b/Elearning/bhs_elearning_certification_template/static/src/fonts/Poppins-Regular.ttf
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/fonts/Poppins-Regular.ttf
rename to Elearning/bhs_elearning_certification_template/static/src/fonts/Poppins-Regular.ttf
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/img/certification_bg_bhs.png b/Elearning/bhs_elearning_certification_template/static/src/img/certification_bg_bhs.png
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/img/certification_bg_bhs.png
rename to Elearning/bhs_elearning_certification_template/static/src/img/certification_bg_bhs.png
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/scss/survey_reports.scss b/Elearning/bhs_elearning_certification_template/static/src/scss/survey_reports.scss
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/static/src/scss/survey_reports.scss
rename to Elearning/bhs_elearning_certification_template/static/src/scss/survey_reports.scss
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/views/survey_report_templates.xml b/Elearning/bhs_elearning_certification_template/views/survey_report_templates.xml
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/views/survey_report_templates.xml
rename to Elearning/bhs_elearning_certification_template/views/survey_report_templates.xml
diff --git a/website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/views/survey_reports.xml b/Elearning/bhs_elearning_certification_template/views/survey_reports.xml
similarity index 100%
rename from website_scorm_elearning/static/media/scorm/NewId_0x2029bd71900/bhs_elearning_certification_template/views/survey_reports.xml
rename to Elearning/bhs_elearning_certification_template/views/survey_reports.xml
diff --git a/Elearning/bhs_elearning_required_slide/__init__.py b/Elearning/bhs_elearning_required_slide/__init__.py
new file mode 100644
index 0000000..511a0ca
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
+from . import models
\ No newline at end of file
diff --git a/Elearning/bhs_elearning_required_slide/__manifest__.py b/Elearning/bhs_elearning_required_slide/__manifest__.py
new file mode 100644
index 0000000..662411c
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/__manifest__.py
@@ -0,0 +1,31 @@
+# -*- encoding: utf-8 -*-
+{
+ 'name': "Elearning Slide Requirement",
+ 'version': '1.0',
+ 'summary': 'Requirement on specific slide',
+ 'category': 'elearning',
+ 'description': """
+ A product of Bac Ha Software allows to require user to learn specific slide
+ before able to learn next slides.
+ """,
+ "depends": ['website_slides', 'website_slides_survey'],
+ 'data': [
+ 'views/slides_templates.xml',
+ 'views/slide_slide_view.xml',
+ ],
+ 'license': 'LGPL-3',
+ # Author
+ 'author': 'Bac Ha Software',
+ 'website': 'https://bachasoftware.com',
+ 'maintainer': 'Bac Ha Software',
+ 'images': ['static/description/banner.png'],
+ 'installable': True,
+ 'auto_install': False,
+ 'assets': {
+ 'web.assets_frontend': [
+ 'bhs_elearning_required_slide/static/src/scss/required_slide.scss',
+ 'bhs_elearning_required_slide/static/src/js/slides_slide_toggle_is_required.js',
+ 'bhs_elearning_required_slide/static/src/js/slides_slide_prevent_learning.js',
+ ]
+ }
+}
diff --git a/Elearning/bhs_elearning_required_slide/controllers/__init__.py b/Elearning/bhs_elearning_required_slide/controllers/__init__.py
new file mode 100644
index 0000000..6920e20
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/controllers/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import main
\ No newline at end of file
diff --git a/Elearning/bhs_elearning_required_slide/controllers/main.py b/Elearning/bhs_elearning_required_slide/controllers/main.py
new file mode 100644
index 0000000..00fd06c
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/controllers/main.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from ast import literal_eval
+from collections import defaultdict
+
+import base64
+import json
+import logging
+import math
+import werkzeug
+
+from odoo import http, tools, _
+# from odoo.addons.http_routing.models.ir_http import slug, unslug
+# from odoo.tools import slugify
+from odoo.addons.website.controllers.main import QueryURL
+from odoo.addons.website.models.ir_http import sitemap_qs2dom
+from odoo.addons.website_profile.controllers.main import WebsiteProfile
+from odoo.exceptions import AccessError, UserError
+from odoo.http import request
+from odoo.osv import expression
+
+_logger = logging.getLogger(__name__)
+
+
+class WebsiteSlides(WebsiteProfile):
+
+ @http.route('/slides/slide/toggle_is_required', type='json', auth='user', website=True)
+ def toggle_slide_required(self, slide_id):
+ slide = request.env['slide.slide'].browse(int(slide_id))
+ if slide.channel_id.can_publish:
+ slide.is_required = not slide.is_required
+ return slide.is_required
+
+ @http.route('/slides/slide/required_slide', type='json', auth='public', website=True)
+ def get_required_slide(self, slide_id):
+ slide = request.env['slide.slide'].sudo().browse(int(slide_id))
+ channel_id = slide.channel_id
+ required_slide = channel_id.current_req_slide if slide.sequence > channel_id.current_req_slide.sequence else False
+ if not required_slide:
+ return False
+
+ return {'id': required_slide.id,
+ 'name': required_slide.name,
+ 'url': required_slide.website_url,
+ 'can_skip': slide.is_preview}
+
+
diff --git a/Elearning/bhs_elearning_required_slide/i18n/vi.po b/Elearning/bhs_elearning_required_slide/i18n/vi.po
new file mode 100644
index 0000000..29ec638
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/i18n/vi.po
@@ -0,0 +1,94 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * bhs_elearning_required_slide
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 15.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-11-17 09:33+0000\n"
+"PO-Revision-Date: 2022-11-17 09:33+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.missing_requirement_modal
+msgid ""
+"
\n"
+" before learning this slide."
+msgstr ""
+"
\n"
+" trước khi học bài học này."
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.slide_fullscreen_sidebar_category
+msgid "Quiz"
+msgstr "Đố vui"
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.course_slides_required_slide
+msgid ""
+"Required"
+msgstr ""
+"Bắt buộc"
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.slide_content_detailed_required
+msgid ""
+"Next "
+msgstr ""
+"Tiếp "
+
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.course_slides_required_slide
+msgid "Required"
+msgstr "Bắt buộc"
+
+#. module: bhs_elearning_required_slide
+#: model:ir.model,name:bhs_elearning_required_slide.model_slide_channel
+msgid "Course"
+msgstr "Khóa học"
+
+#. module: bhs_elearning_required_slide
+#: model:ir.model.fields,field_description:bhs_elearning_required_slide.field_slide_channel__current_req_slide
+msgid "Current Req Slide"
+msgstr "Bài học bắt buộc"
+
+#. module: bhs_elearning_required_slide
+#: model:ir.model.fields,field_description:bhs_elearning_required_slide.field_slide_slide__missing_requirement
+msgid "Missing requirement"
+msgstr "Thiếu điều kiện"
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.missing_requirement_modal
+msgid ""
+"Please complete the Required Slide:\n"
+"
"
+msgstr ""
+"Vui lòng hoàn thành Bài học Bắt buộc:\n"
+"
"
+
+#. module: bhs_elearning_required_slide
+#: model:ir.model.fields,field_description:bhs_elearning_required_slide.field_slide_slide__is_required
+msgid "Required"
+msgstr "Bắt buộc"
+
+#. module: bhs_elearning_required_slide
+#: model_terms:ir.ui.view,arch_db:bhs_elearning_required_slide.missing_requirement_modal
+msgid "Understood"
+msgstr "Đã hiểu"
+
+#. module: bhs_elearning_required_slide
+#: code:addons/bhs_elearning_required_slide/models/slide.py:0
+#, python-format
+msgid "You need to learn required slide first."
+msgstr "Bạn cần học bài học bắt buộc trước."
diff --git a/Elearning/bhs_elearning_required_slide/models/__init__.py b/Elearning/bhs_elearning_required_slide/models/__init__.py
new file mode 100644
index 0000000..62488b6
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import slide
\ No newline at end of file
diff --git a/Elearning/bhs_elearning_required_slide/models/slide.py b/Elearning/bhs_elearning_required_slide/models/slide.py
new file mode 100644
index 0000000..89e66a1
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/models/slide.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import logging
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import UserError
+
+_logger = logging.getLogger(__name__)
+
+
+class Channel(models.Model):
+ _inherit = 'slide.channel'
+
+ current_req_slide = fields.Many2one('slide.slide', compute='_get_current_required_slide')
+
+ @api.depends('slide_ids.sequence', 'slide_ids.is_required')
+ @api.depends_context('uid')
+ def _get_current_required_slide(self):
+ for channel in self:
+ required_slides = channel.slide_ids.filtered('is_required')
+ required_slides_learned = self.env['slide.slide.partner'].sudo().search([('slide_id', 'in', required_slides.ids),
+ ('partner_id', '=', self.env.user.partner_id.id),
+ ('completed', '=', True)])
+ required_slides_not_learned = required_slides - required_slides_learned.mapped('slide_id')
+ channel.current_req_slide = required_slides_not_learned[0] if required_slides_not_learned else False
+
+
+class Slide(models.Model):
+ _inherit = 'slide.slide'
+
+ is_required = fields.Boolean('Required', default=False)
+ missing_requirement = fields.Boolean('Missing requirement', compute='_get_missing_requirement')
+
+ @api.depends('sequence', 'channel_id.current_req_slide')
+ @api.depends_context('uid')
+ def _get_missing_requirement(self):
+ for slide in self:
+ req_slide = slide.channel_id.current_req_slide
+ slide.missing_requirement = req_slide and not slide.is_preview and slide.sequence > req_slide.sequence
+
+
+class SlidePartner(models.Model):
+ _inherit = 'slide.slide.partner'
+
+ @api.constrains('slide_id', 'partner_id')
+ def required_slide_constrain(self):
+ for record in self:
+ slide = record.slide_id
+ if slide.missing_requirement:
+ raise UserError(_("You need to learn required slide first."))
diff --git a/Elearning/bhs_elearning_required_slide/static/description/banner.gif b/Elearning/bhs_elearning_required_slide/static/description/banner.gif
new file mode 100644
index 0000000..1525f1d
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/banner.gif differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/banner.png b/Elearning/bhs_elearning_required_slide/static/description/banner.png
new file mode 100644
index 0000000..29815a2
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/banner.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/icon.png b/Elearning/bhs_elearning_required_slide/static/description/icon.png
new file mode 100644
index 0000000..3104816
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Customization_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Customization_icon.png
new file mode 100644
index 0000000..75f003b
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Customization_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Development_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Development_icon.png
new file mode 100644
index 0000000..0c645a0
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Development_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Implementation_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Implementation_icon.png
new file mode 100644
index 0000000..fb364d9
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Implementation_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Migration_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Migration_icon.png
new file mode 100644
index 0000000..02328bc
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Migration_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Support_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Support_icon.png
new file mode 100644
index 0000000..fa132c1
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Support_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/Training_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/Training_icon.png
new file mode 100644
index 0000000..606d527
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/Training_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/call.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/call.png
new file mode 100644
index 0000000..0e2ba5a
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/call.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/call.svg b/Elearning/bhs_elearning_required_slide/static/description/imgs/call.svg
new file mode 100644
index 0000000..760aaeb
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/static/description/imgs/call.svg
@@ -0,0 +1,3 @@
+
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/facebook_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/facebook_icon.png
new file mode 100644
index 0000000..5a9de22
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/facebook_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/instagram_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/instagram_icon.png
new file mode 100644
index 0000000..f50d6cf
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/instagram_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/linkedin_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/linkedin_icon.png
new file mode 100644
index 0000000..2170049
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/linkedin_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/logo.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/logo.png
new file mode 100644
index 0000000..5e4e0f2
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/logo.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.png
new file mode 100644
index 0000000..1f28305
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.svg b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.svg
new file mode 100644
index 0000000..c5962a8
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail.svg
@@ -0,0 +1,3 @@
+
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/mail_footer.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail_footer.png
new file mode 100644
index 0000000..24cb5e4
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/mail_footer.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/advance_marketing_automation.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/advance_marketing_automation.png
new file mode 100644
index 0000000..a49ec79
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/advance_marketing_automation.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/auto_create_user_from_employee.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/auto_create_user_from_employee.png
new file mode 100644
index 0000000..9b114eb
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/auto_create_user_from_employee.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/aws_ses_mail_tracking.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/aws_ses_mail_tracking.png
new file mode 100644
index 0000000..eafc991
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/aws_ses_mail_tracking.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/custom_invoice_report.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/custom_invoice_report.png
new file mode 100644
index 0000000..02e50dc
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/custom_invoice_report.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/customer_code.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/customer_code.png
new file mode 100644
index 0000000..4ba1ce6
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/customer_code.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/email_invoice.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/email_invoice.png
new file mode 100644
index 0000000..19a3adb
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/email_invoice.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/groups_access_management.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/groups_access_management.png
new file mode 100644
index 0000000..9c8cdc2
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/groups_access_management.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_attendance_management.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_attendance_management.png
new file mode 100644
index 0000000..b7716fa
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_attendance_management.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_resignation_management.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_resignation_management.png
new file mode 100644
index 0000000..c7d88fa
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/hr_resignation_management.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/invoice_currency_customer.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/invoice_currency_customer.png
new file mode 100644
index 0000000..7a17e4a
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/invoice_currency_customer.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/project_task_check_list.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/project_task_check_list.png
new file mode 100644
index 0000000..5e9f9f0
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/other_module/project_task_check_list.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/screen/require.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/screen/require.png
new file mode 100644
index 0000000..a5ab55a
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/screen/require.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/skype_footer.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/skype_footer.png
new file mode 100644
index 0000000..eb926af
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/skype_footer.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/twitter_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/twitter_icon.png
new file mode 100644
index 0000000..6f88638
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/twitter_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/whatsapp_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/whatsapp_icon.png
new file mode 100644
index 0000000..302237d
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/whatsapp_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/imgs/youtube_icon.png b/Elearning/bhs_elearning_required_slide/static/description/imgs/youtube_icon.png
new file mode 100644
index 0000000..0c14467
Binary files /dev/null and b/Elearning/bhs_elearning_required_slide/static/description/imgs/youtube_icon.png differ
diff --git a/Elearning/bhs_elearning_required_slide/static/description/index.html b/Elearning/bhs_elearning_required_slide/static/description/index.html
new file mode 100644
index 0000000..b702e04
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/static/description/index.html
@@ -0,0 +1,216 @@
+
+
+
+
+
+

+
+
+
+
+
TOP SOFTWARE COMPANY IN VIETNAM
+
hello@bachasoftware.com
+
+
+
+
+
+
+
+
+
+ Elearning Slide Requirement
+
+
+ A product of Bac Ha Software allows to require user to learn specific slide
+ before able to learn next slides.
+
+

+
+
+
+ Featured Highlight
+
+
+
+
+
Simple Setup
+
You can easily configure required slides in each course.
+
+
+
+
+
+
+ Key Features
+
+
+
+
+

+
+
+
Slide Requirement
+
+ Require user to learn specific slide before able to learn next slides.
+
+
+
+
+
+
+
+ Other Modules
+
+
+
+
+
+
+
+
+ Need Help?
+
+
+ Need assistance with setup or have any concerns?
+ Contact Bac Ha Software directly for prompt and dedicated support:
+
+
+
+
+
+

+
Set up a quick call:
+
+84 88 616 0880 / +84 88 636 0880
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
bachasoftware
+
+84 88 616 0880/ +84 88 636 0880
+
+
+
+
+
Odoo Implementation
+
Odoo Customization
+
Odoo Development
+
Odoo Training
+
Odoo Migration
+
Odoo Support
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Elearning/bhs_elearning_required_slide/static/src/js/slides_slide_prevent_learning.js b/Elearning/bhs_elearning_required_slide/static/src/js/slides_slide_prevent_learning.js
new file mode 100644
index 0000000..c47e13d
--- /dev/null
+++ b/Elearning/bhs_elearning_required_slide/static/src/js/slides_slide_prevent_learning.js
@@ -0,0 +1,339 @@
+/** @odoo-module **/
+
+import { _t } from "@web/core/l10n/translation";
+import publicWidget from '@web/legacy/js/public/public_widget';
+import Fullscreen from '@website_slides/js/slides_course_fullscreen_player';
+import { useService } from "@web/core/utils/hooks";
+
+var getReqSlide = function (obj, slideId){
+ return obj.rpc('/slides/slide/required_slide',{slide_id: slideId});
+};
+
+publicWidget.registry.websiteSlidesSlidePreventLearningAdmin = publicWidget.Widget.extend({
+ selector: '.o_wslides_js_slides_list_slide_link,.o_wslides_lesson_aside_list_link a,.next-slide-link',
+ xmlDependencies: ['/website_slides/static/src/xml/website_slides_upload.xml'],
+ events: {
+ 'click': '_onMissingRequirementSlideClick',
+ },
+
+ init() {
+ this._super(...arguments);
+ this.rpc = this.bindService("rpc");
+ },
+
+ _onMissingRequirementSlideClick: async function (ev) {
+ console.log('_onMissingRequirementSlideClick');
+ ev.stopPropagation();
+ ev.preventDefault();
+ var dataId = $(ev.currentTarget).data('id');
+ var slideHref = $(ev.currentTarget).attr('href')
+ if (dataId) {
+ var slideId = parseInt(dataId)
+ }else {
+ var slideLink = slideHref.replace('?fullscreen=1', '');
+ if(slideLink.includes('-')) {
+ var slideSplit = slideLink.split('-');
+ }else{
+ var slideSplit = slideLink.split('/');
+ }
+// var slideSplit = slideLink.split('-');
+ console.log(slideSplit);
+ var slideId = parseInt(slideSplit[slideSplit.length - 1]);
+ console.log(slideId);
+ }
+ const reqSlide = await getReqSlide(this, slideId);
+ console.log('reqSlide: ', reqSlide);
+ if (reqSlide && !reqSlide.can_skip) {
+ console.log('cant skip');
+ var url = reqSlide.url;
+ if (slideHref.includes('?fullscreen=1')) {url = url + '?fullscreen=1'}
+ $("#modal_required_slide").attr('href', url);
+ $("#modal_required_slide").html(reqSlide.name);
+ $("#missing_requirement_modal").modal('show');
+ }
+ else if (slideHref) {location.href = slideHref;}
+ },
+});
+
+var BHSidebar = publicWidget.Widget.extend({
+ events: {
+ "click .o_wslides_fs_sidebar_list_item": '_onClickTab',
+ "click .o_wslides_fs_slide_link": '_onClickLink',
+// "click #modal_required_slide": '_onClickModalLink',
+ },
+ init: function (parent, slideList, defaultSlide) {
+ var result = this._super.apply(this, arguments);
+ this.slideEntries = slideList;
+ this.set('slideEntry', defaultSlide);
+ this.rpc = this.bindService("rpc");
+ return result;
+ },
+ start: function (){
+ var self = this;
+ this.on('change:slideEntry', this, this._onChangeCurrentSlide);
+ return this._super.apply(this, arguments).then(function (){
+ $(document).keydown(self._onKeyDown.bind(self));
+ });
+ },
+ destroy: function () {
+ $(document).unbind('keydown', this._onKeyDown.bind(this));
+ return this._super.apply(this, arguments);
+ },
+ //--------------------------------------------------------------------------
+ // Public
+ //--------------------------------------------------------------------------
+
+ openRequiredSlideModal: function (reqSlide) {
+ var self = this;
+ $("#modal_required_slide").attr('data-id', reqSlide.id);
+ $("#modal_required_slide span").html(reqSlide.name);
+ $("#missing_requirement_modal").modal('show');
+ $("#modal_required_slide").click(function () {
+ var slide = findSlide(self.slideEntries, {id: reqSlide.id, isQuiz: false});
+ self.set('slideEntry', slide);
+ $("#missing_requirement_modal").modal('hide');
+ });
+ },
+
+ /**
+ * Change the current slide with the next one (if there is one).
+ *
+ * @public
+ */
+ goNext: async function () {
+ var currentIndex = this._getCurrentIndex();
+ if (currentIndex < this.slideEntries.length-1) {
+ var nextSlide = this.slideEntries[currentIndex+1];
+ const reqSlide = await getReqSlide(this, nextSlide.id);
+ if (reqSlide && !reqSlide.can_skip) {this.openRequiredSlideModal(reqSlide)}
+ else {this.set('slideEntry', nextSlide);}
+ }
+ },
+ /**
+ * Change the current slide with the previous one (if there is one).
+ *
+ * @public
+ */
+ goPrevious: function () {
+ var currentIndex = this._getCurrentIndex();
+ if (currentIndex >= 1) {
+ this.set('slideEntry', this.slideEntries[currentIndex-1]);
+ }
+ },
+ /**
+ * Greens up the bullet when the slide is completed
+ *
+ * @public
+ * @param {Integer} slideId
+ */
+ setSlideCompleted: async function (slideId) {
+ var $elem = this.$('.fa-circle-thin[data-slide-id="'+slideId+'"],.fa-lock[data-slide-id="'+slideId+'"]');
+ $elem.removeClass('fa-circle-thin').removeClass('fa-lock').addClass('fa-check text-success o_wslides_slide_completed');
+
+ const reqSlide = await getReqSlide(this, slideId);
+ if (!reqSlide) {this.updateRequirement()}
+ },
+ /**
+ * Updates the progressbar whenever a lesson is completed
+ *
+ * @public
+ * @param {*} channelCompletion
+ */
+ updateProgressbar: function (channelCompletion) {
+ var completion = Math.min(100, channelCompletion);
+ this.$('.progress-bar').css('width', completion + "%" );
+ this.$('.o_wslides_progress_percentage').text(completion);
+ },
+
+ updateRequirement: function () {
+ var self = this;
+ var allSlides = this.slideEntries;
+ var nextSlides = allSlides.slice(this._getCurrentIndex() + 1, allSlides.length - 1);
+ for (const slide of nextSlides) {
+ var slideId = slide.id;
+ var $slideName = self.$('li[data-id="'+slideId+'"] div.o_wslides_fs_slide_name');
+ var $slideLink = self.$('li[data-id="'+slideId+'"] a.o_wslides_fs_slide_link');
+ $slideName.removeClass('text-600');
+ $slideLink.removeClass('text-600');
+ if (slide.hasQuestion && !slide.isQuiz) {
+ var $slideQuiz = self.$('li[data-id="'+slideId+'"] a.o_wslides_fs_slide_quiz');
+ $slideQuiz.removeClass('text-600');
+ };
+ if (slide.required === 'True') {break}
+ };
+ },
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+ /**
+ * Get the index of the current slide entry (slide and/or quiz)
+ */
+ _getCurrentIndex: function () {
+ var slide = this.get('slideEntry');
+ var currentIndex = this.slideEntries.findIndex(entry =>{
+ return entry.id === slide.id && entry.isQuiz === slide.isQuiz;
+ });
+ return currentIndex;
+ },
+ //--------------------------------------------------------------------------
+ // Handler
+ //--------------------------------------------------------------------------
+ /**
+ * Handler called whenever the user clicks on a sub-quiz which is linked to a slide.
+ * This does NOT handle the case of a slide of type "quiz".
+ * By going through this handler, the widget will be able to determine that it has to render
+ * the associated quiz and not the main content.
+ *
+ * @private
+ * @param {*} ev
+ */
+ _onClickMiniQuiz: function (ev){
+ var slideID = parseInt($(ev.currentTarget).data().slide_id);
+ this.set('slideEntry',{
+ slideID: slideID,
+ isMiniQuiz: true
+ });
+ this.trigger_up('change_slide', this.get('slideEntry'));
+ },
+
+ /**
+ * Handler called when the user clicks on a normal slide tab
+ *
+ * @private
+ * @param {*} ev
+ */
+ _onClickTab: async function (ev) {
+ ev.stopPropagation();
+ var self = this;
+ var $elem = $(ev.currentTarget);
+ var slideID = parseInt($elem.data('id'));
+ console.log('aaaa');
+ const reqSlide = await getReqSlide(this, slideID);
+ if ($elem.data('canAccess') === 'True') {
+ if (!reqSlide || (reqSlide && reqSlide.can_skip)) {
+ var isQuiz = $elem.data('isQuiz');
+ var slide = findSlide(this.slideEntries, {id: slideID, isQuiz: isQuiz});
+ this.set('slideEntry', slide);
+ }
+ else {this.openRequiredSlideModal(reqSlide)};
+ }
+ },
+
+ _onClickLink: async function (ev) {
+ ev.preventDefault();
+ var self = this;
+ var $elem = $(ev.currentTarget);
+ var $slideElem = $elem.closest('li.o_wslides_fs_sidebar_list_item');
+ var slideID = parseInt($slideElem.data('id'));
+ const reqSlide = await getReqSlide(this, slideID);
+ if ($slideElem.data('canAccess') === 'True') {
+ if (!reqSlide || (reqSlide && reqSlide.can_skip)) {
+ window.open($elem.attr('href'), '_blank').focus();
+ }
+ else {this.openRequiredSlideModal(reqSlide)};
+ }
+ },
+
+ /**
+ * Actively changes the active tab in the sidebar so that it corresponds
+ * the slide currently displayed
+ *
+ * @private
+ */
+ _onChangeCurrentSlide: function () {
+ var slide = this.get('slideEntry');
+ this.$('.o_wslides_fs_sidebar_list_item.active').removeClass('active');
+ var selector = '.o_wslides_fs_sidebar_list_item[data-id='+slide.id+'][data-is-quiz!="1"]';
+
+ this.$(selector).addClass('active');
+ this.trigger_up('change_slide', this.get('slideEntry'));
+ },
+
+ /**
+ * Binds left and right arrow to allow the user to navigate between slides
+ *
+ * @param {*} ev
+ * @private
+ */
+ _onKeyDown: function (ev){
+ switch (ev.key){
+ case "ArrowLeft":
+ this.goPrevious();
+ break;
+ case "ArrowRight":
+ this.goNext();
+ break;
+ }
+ },
+});
+
+//var findSlide = function (slideList, matcher) {
+// var slideMatch = _.matcher(matcher);
+// return _.find(slideList, slideMatch);
+//};
+
+/**
+ * Helper: Get the slide dict matching the given criteria
+ *
+ * @private
+ * @param {Array