From 195ea4480bf3532b6e5b5f8572c0c14880ed4be1 Mon Sep 17 00:00:00 2001 From: Ryan Wyllie Date: Wed, 11 Jul 2018 15:59:06 +0800 Subject: [PATCH] MDL-62497 javascript: build AMD modules with new transpiler --- admin/tool/analytics/amd/build/log_info.min.js | 3 ++- admin/tool/analytics/amd/build/log_info.min.js.map | 1 + admin/tool/analytics/amd/build/model.min.js | 3 ++- admin/tool/analytics/amd/build/model.min.js.map | 1 + admin/tool/dataprivacy/amd/build/add_category.min.js | 3 ++- admin/tool/dataprivacy/amd/build/add_category.min.js.map | 1 + admin/tool/dataprivacy/amd/build/add_purpose.min.js | 3 ++- admin/tool/dataprivacy/amd/build/add_purpose.min.js.map | 1 + .../tool/dataprivacy/amd/build/categoriesactions.min.js | 3 ++- .../dataprivacy/amd/build/categoriesactions.min.js.map | 1 + admin/tool/dataprivacy/amd/build/data_deletion.min.js | 3 ++- .../tool/dataprivacy/amd/build/data_deletion.min.js.map | 1 + admin/tool/dataprivacy/amd/build/data_registry.min.js | 3 ++- .../tool/dataprivacy/amd/build/data_registry.min.js.map | 1 + .../tool/dataprivacy/amd/build/data_request_modal.min.js | 3 ++- .../dataprivacy/amd/build/data_request_modal.min.js.map | 1 + admin/tool/dataprivacy/amd/build/defaultsactions.min.js | 3 ++- .../dataprivacy/amd/build/defaultsactions.min.js.map | 1 + .../amd/build/effective_retention_period.min.js | 3 ++- .../amd/build/effective_retention_period.min.js.map | 1 + admin/tool/dataprivacy/amd/build/events.min.js | 3 ++- admin/tool/dataprivacy/amd/build/events.min.js.map | 1 + admin/tool/dataprivacy/amd/build/expand_contract.min.js | 3 ++- .../dataprivacy/amd/build/expand_contract.min.js.map | 1 + .../tool/dataprivacy/amd/build/form-user-selector.min.js | 3 ++- .../dataprivacy/amd/build/form-user-selector.min.js.map | 1 + admin/tool/dataprivacy/amd/build/myrequestactions.min.js | 3 ++- .../dataprivacy/amd/build/myrequestactions.min.js.map | 1 + admin/tool/dataprivacy/amd/build/purposesactions.min.js | 3 ++- .../dataprivacy/amd/build/purposesactions.min.js.map | 1 + admin/tool/dataprivacy/amd/build/request_filter.min.js | 3 ++- .../tool/dataprivacy/amd/build/request_filter.min.js.map | 1 + admin/tool/dataprivacy/amd/build/requestactions.min.js | 3 ++- .../tool/dataprivacy/amd/build/requestactions.min.js.map | 1 + admin/tool/lp/amd/build/actionselector.min.js | 3 ++- admin/tool/lp/amd/build/actionselector.min.js.map | 1 + admin/tool/lp/amd/build/competencies.min.js | 3 ++- admin/tool/lp/amd/build/competencies.min.js.map | 1 + admin/tool/lp/amd/build/competency_outcomes.min.js | 3 ++- admin/tool/lp/amd/build/competency_outcomes.min.js.map | 1 + .../tool/lp/amd/build/competency_plan_navigation.min.js | 3 ++- .../lp/amd/build/competency_plan_navigation.min.js.map | 1 + admin/tool/lp/amd/build/competency_rule.min.js | 3 ++- admin/tool/lp/amd/build/competency_rule.min.js.map | 1 + admin/tool/lp/amd/build/competency_rule_all.min.js | 3 ++- admin/tool/lp/amd/build/competency_rule_all.min.js.map | 1 + admin/tool/lp/amd/build/competency_rule_points.min.js | 3 ++- .../tool/lp/amd/build/competency_rule_points.min.js.map | 1 + admin/tool/lp/amd/build/competencyactions.min.js | 3 ++- admin/tool/lp/amd/build/competencyactions.min.js.map | 1 + admin/tool/lp/amd/build/competencydialogue.min.js | 3 ++- admin/tool/lp/amd/build/competencydialogue.min.js.map | 1 + admin/tool/lp/amd/build/competencypicker.min.js | 3 ++- admin/tool/lp/amd/build/competencypicker.min.js.map | 1 + .../tool/lp/amd/build/competencypicker_user_plans.min.js | 3 ++- .../lp/amd/build/competencypicker_user_plans.min.js.map | 1 + admin/tool/lp/amd/build/competencyruleconfig.min.js | 3 ++- admin/tool/lp/amd/build/competencyruleconfig.min.js.map | 1 + admin/tool/lp/amd/build/competencytree.min.js | 3 ++- admin/tool/lp/amd/build/competencytree.min.js.map | 1 + .../tool/lp/amd/build/course_competency_settings.min.js | 3 ++- .../lp/amd/build/course_competency_settings.min.js.map | 1 + admin/tool/lp/amd/build/dialogue.min.js | 3 ++- admin/tool/lp/amd/build/dialogue.min.js.map | 1 + admin/tool/lp/amd/build/dragdrop-reorder.min.js | 3 ++- admin/tool/lp/amd/build/dragdrop-reorder.min.js.map | 1 + admin/tool/lp/amd/build/event_base.min.js | 3 ++- admin/tool/lp/amd/build/event_base.min.js.map | 1 + admin/tool/lp/amd/build/evidence_delete.min.js | 3 ++- admin/tool/lp/amd/build/evidence_delete.min.js.map | 1 + admin/tool/lp/amd/build/form-cohort-selector.min.js | 3 ++- admin/tool/lp/amd/build/form-cohort-selector.min.js.map | 1 + admin/tool/lp/amd/build/form-user-selector.min.js | 3 ++- admin/tool/lp/amd/build/form-user-selector.min.js.map | 1 + admin/tool/lp/amd/build/form_competency_element.min.js | 3 ++- .../tool/lp/amd/build/form_competency_element.min.js.map | 1 + admin/tool/lp/amd/build/frameworkactions.min.js | 3 ++- admin/tool/lp/amd/build/frameworkactions.min.js.map | 1 + admin/tool/lp/amd/build/frameworks_datasource.min.js | 3 ++- admin/tool/lp/amd/build/frameworks_datasource.min.js.map | 1 + admin/tool/lp/amd/build/grade_dialogue.min.js | 3 ++- admin/tool/lp/amd/build/grade_dialogue.min.js.map | 1 + .../lp/amd/build/grade_user_competency_inline.min.js | 3 ++- .../lp/amd/build/grade_user_competency_inline.min.js.map | 1 + admin/tool/lp/amd/build/menubar.min.js | 3 ++- admin/tool/lp/amd/build/menubar.min.js.map | 1 + admin/tool/lp/amd/build/module_navigation.min.js | 3 ++- admin/tool/lp/amd/build/module_navigation.min.js.map | 1 + admin/tool/lp/amd/build/parentcompetency_form.min.js | 3 ++- admin/tool/lp/amd/build/parentcompetency_form.min.js.map | 1 + admin/tool/lp/amd/build/planactions.min.js | 3 ++- admin/tool/lp/amd/build/planactions.min.js.map | 1 + admin/tool/lp/amd/build/scaleconfig.min.js | 3 ++- admin/tool/lp/amd/build/scaleconfig.min.js.map | 1 + admin/tool/lp/amd/build/scalevalues.min.js | 3 ++- admin/tool/lp/amd/build/scalevalues.min.js.map | 1 + admin/tool/lp/amd/build/templateactions.min.js | 3 ++- admin/tool/lp/amd/build/templateactions.min.js.map | 1 + admin/tool/lp/amd/build/tree.min.js | 3 ++- admin/tool/lp/amd/build/tree.min.js.map | 1 + .../amd/build/user_competency_course_navigation.min.js | 3 ++- .../build/user_competency_course_navigation.min.js.map | 1 + admin/tool/lp/amd/build/user_competency_info.min.js | 3 ++- admin/tool/lp/amd/build/user_competency_info.min.js.map | 1 + .../tool/lp/amd/build/user_competency_plan_popup.min.js | 3 ++- .../lp/amd/build/user_competency_plan_popup.min.js.map | 1 + admin/tool/lp/amd/build/user_competency_workflow.min.js | 3 ++- .../lp/amd/build/user_competency_workflow.min.js.map | 1 + admin/tool/lp/amd/build/user_evidence_actions.min.js | 3 ++- admin/tool/lp/amd/build/user_evidence_actions.min.js.map | 1 + admin/tool/policy/amd/build/acceptances_filter.min.js | 3 ++- .../tool/policy/amd/build/acceptances_filter.min.js.map | 1 + .../amd/build/acceptances_filter_datasource.min.js | 3 ++- .../amd/build/acceptances_filter_datasource.min.js.map | 1 + admin/tool/policy/amd/build/acceptmodal.min.js | 3 ++- admin/tool/policy/amd/build/acceptmodal.min.js.map | 1 + .../policy/amd/build/jquery-eu-cookie-law-popup.min.js | 3 ++- .../amd/build/jquery-eu-cookie-law-popup.min.js.map | 1 + admin/tool/policy/amd/build/managedocsactions.min.js | 3 ++- admin/tool/policy/amd/build/managedocsactions.min.js.map | 1 + admin/tool/policy/amd/build/policyactions.min.js | 3 ++- admin/tool/policy/amd/build/policyactions.min.js.map | 1 + admin/tool/templatelibrary/amd/build/display.min.js | 3 ++- admin/tool/templatelibrary/amd/build/display.min.js.map | 1 + admin/tool/templatelibrary/amd/build/search.min.js | 3 ++- admin/tool/templatelibrary/amd/build/search.min.js.map | 1 + admin/tool/usertours/amd/build/managesteps.min.js | 3 ++- admin/tool/usertours/amd/build/managesteps.min.js.map | 1 + admin/tool/usertours/amd/build/managetours.min.js | 3 ++- admin/tool/usertours/amd/build/managetours.min.js.map | 1 + admin/tool/usertours/amd/build/tour.min.js | 3 ++- admin/tool/usertours/amd/build/tour.min.js.map | 1 + admin/tool/usertours/amd/build/usertours.min.js | 3 ++- admin/tool/usertours/amd/build/usertours.min.js.map | 1 + admin/tool/xmldb/amd/build/move.min.js | 3 ++- admin/tool/xmldb/amd/build/move.min.js.map | 1 + backup/util/ui/amd/build/async_backup.min.js | 3 ++- backup/util/ui/amd/build/async_backup.min.js.map | 1 + blocks/myoverview/amd/build/main.min.js | 3 ++- blocks/myoverview/amd/build/main.min.js.map | 1 + blocks/myoverview/amd/build/repository.min.js | 3 ++- blocks/myoverview/amd/build/repository.min.js.map | 1 + blocks/myoverview/amd/build/selectors.min.js | 3 ++- blocks/myoverview/amd/build/selectors.min.js.map | 1 + blocks/myoverview/amd/build/view.min.js | 3 ++- blocks/myoverview/amd/build/view.min.js.map | 1 + blocks/myoverview/amd/build/view_nav.min.js | 3 ++- blocks/myoverview/amd/build/view_nav.min.js.map | 1 + .../navigation/amd/build/ajax_response_renderer.min.js | 3 ++- .../amd/build/ajax_response_renderer.min.js.map | 1 + blocks/navigation/amd/build/nav_loader.min.js | 3 ++- blocks/navigation/amd/build/nav_loader.min.js.map | 1 + blocks/navigation/amd/build/navblock.min.js | 3 ++- blocks/navigation/amd/build/navblock.min.js.map | 1 + blocks/navigation/amd/build/site_admin_loader.min.js | 3 ++- blocks/navigation/amd/build/site_admin_loader.min.js.map | 1 + .../online_users/amd/build/change_user_visibility.min.js | 3 ++- .../amd/build/change_user_visibility.min.js.map | 1 + blocks/recentlyaccessedcourses/amd/build/main.min.js | 3 ++- blocks/recentlyaccessedcourses/amd/build/main.min.js.map | 1 + blocks/recentlyaccesseditems/amd/build/main.min.js | 3 ++- blocks/recentlyaccesseditems/amd/build/main.min.js.map | 1 + blocks/recentlyaccesseditems/amd/build/repository.min.js | 3 ++- .../amd/build/repository.min.js.map | 1 + blocks/settings/amd/build/settingsblock.min.js | 3 ++- blocks/settings/amd/build/settingsblock.min.js.map | 1 + blocks/starredcourses/amd/build/main.min.js | 3 ++- blocks/starredcourses/amd/build/main.min.js.map | 1 + blocks/starredcourses/amd/build/repository.min.js | 3 ++- blocks/starredcourses/amd/build/repository.min.js.map | 1 + .../timeline/amd/build/calendar_events_repository.min.js | 3 ++- .../amd/build/calendar_events_repository.min.js.map | 1 + blocks/timeline/amd/build/event_list.min.js | 3 ++- blocks/timeline/amd/build/event_list.min.js.map | 1 + blocks/timeline/amd/build/main.min.js | 3 ++- blocks/timeline/amd/build/main.min.js.map | 1 + blocks/timeline/amd/build/view.min.js | 3 ++- blocks/timeline/amd/build/view.min.js.map | 1 + blocks/timeline/amd/build/view_courses.min.js | 3 ++- blocks/timeline/amd/build/view_courses.min.js.map | 1 + blocks/timeline/amd/build/view_dates.min.js | 3 ++- blocks/timeline/amd/build/view_dates.min.js.map | 1 + blocks/timeline/amd/build/view_nav.min.js | 3 ++- blocks/timeline/amd/build/view_nav.min.js.map | 1 + calendar/amd/build/calendar.min.js | 3 ++- calendar/amd/build/calendar.min.js.map | 1 + calendar/amd/build/calendar_filter.min.js | 3 ++- calendar/amd/build/calendar_filter.min.js.map | 1 + calendar/amd/build/calendar_mini.min.js | 3 ++- calendar/amd/build/calendar_mini.min.js.map | 1 + calendar/amd/build/calendar_threemonth.min.js | 3 ++- calendar/amd/build/calendar_threemonth.min.js.map | 1 + calendar/amd/build/calendar_view.min.js | 3 ++- calendar/amd/build/calendar_view.min.js.map | 1 + calendar/amd/build/crud.min.js | 3 ++- calendar/amd/build/crud.min.js.map | 1 + calendar/amd/build/drag_drop_data_store.min.js | 3 ++- calendar/amd/build/drag_drop_data_store.min.js.map | 1 + calendar/amd/build/event_form.min.js | 3 ++- calendar/amd/build/event_form.min.js.map | 1 + calendar/amd/build/events.min.js | 3 ++- calendar/amd/build/events.min.js.map | 1 + calendar/amd/build/modal_delete.min.js | 3 ++- calendar/amd/build/modal_delete.min.js.map | 1 + calendar/amd/build/modal_event_form.min.js | 3 ++- calendar/amd/build/modal_event_form.min.js.map | 1 + calendar/amd/build/month_navigation_drag_drop.min.js | 3 ++- calendar/amd/build/month_navigation_drag_drop.min.js.map | 1 + calendar/amd/build/month_view_drag_drop.min.js | 3 ++- calendar/amd/build/month_view_drag_drop.min.js.map | 1 + calendar/amd/build/repository.min.js | 3 ++- calendar/amd/build/repository.min.js.map | 1 + calendar/amd/build/selectors.min.js | 3 ++- calendar/amd/build/selectors.min.js.map | 1 + calendar/amd/build/summary_modal.min.js | 3 ++- calendar/amd/build/summary_modal.min.js.map | 1 + calendar/amd/build/view_manager.min.js | 3 ++- calendar/amd/build/view_manager.min.js.map | 1 + course/amd/build/actions.min.js | 3 ++- course/amd/build/actions.min.js.map | 1 + course/amd/build/events.min.js | 3 ++- course/amd/build/events.min.js.map | 1 + course/amd/build/repository.min.js | 3 ++- course/amd/build/repository.min.js.map | 1 + customfield/amd/build/form.min.js | 3 ++- customfield/amd/build/form.min.js.map | 1 + .../manual/amd/build/form-potential-user-selector.min.js | 3 ++- .../amd/build/form-potential-user-selector.min.js.map | 1 + enrol/manual/amd/build/quickenrolment.min.js | 3 ++- enrol/manual/amd/build/quickenrolment.min.js.map | 1 + grade/amd/build/edittree_index.min.js | 3 ++- grade/amd/build/edittree_index.min.js.map | 1 + .../grading/form/guide/amd/build/comment_chooser.min.js | 3 ++- .../form/guide/amd/build/comment_chooser.min.js.map | 1 + lib/amd/build/adapter.min.js | 5 ++--- lib/amd/build/adapter.min.js.map | 1 + lib/amd/build/addblockmodal.min.js | 3 ++- lib/amd/build/addblockmodal.min.js.map | 1 + lib/amd/build/ajax.min.js | 3 ++- lib/amd/build/ajax.min.js.map | 1 + lib/amd/build/auto_rows.min.js | 3 ++- lib/amd/build/auto_rows.min.js.map | 1 + lib/amd/build/autoscroll.min.js | 3 ++- lib/amd/build/autoscroll.min.js.map | 1 + lib/amd/build/backoff_timer.min.js | 3 ++- lib/amd/build/backoff_timer.min.js.map | 1 + lib/amd/build/chart_axis.min.js | 3 ++- lib/amd/build/chart_axis.min.js.map | 1 + lib/amd/build/chart_bar.min.js | 3 ++- lib/amd/build/chart_bar.min.js.map | 1 + lib/amd/build/chart_base.min.js | 3 ++- lib/amd/build/chart_base.min.js.map | 1 + lib/amd/build/chart_builder.min.js | 3 ++- lib/amd/build/chart_builder.min.js.map | 1 + lib/amd/build/chart_line.min.js | 3 ++- lib/amd/build/chart_line.min.js.map | 1 + lib/amd/build/chart_output.min.js | 3 ++- lib/amd/build/chart_output.min.js.map | 1 + lib/amd/build/chart_output_base.min.js | 3 ++- lib/amd/build/chart_output_base.min.js.map | 1 + lib/amd/build/chart_output_chartjs.min.js | 3 ++- lib/amd/build/chart_output_chartjs.min.js.map | 1 + lib/amd/build/chart_output_htmltable.min.js | 3 ++- lib/amd/build/chart_output_htmltable.min.js.map | 1 + lib/amd/build/chart_pie.min.js | 3 ++- lib/amd/build/chart_pie.min.js.map | 1 + lib/amd/build/chart_series.min.js | 3 ++- lib/amd/build/chart_series.min.js.map | 1 + lib/amd/build/chartjs-lazy.min.js | 9 ++------- lib/amd/build/chartjs-lazy.min.js.map | 1 + lib/amd/build/chartjs.min.js | 3 ++- lib/amd/build/chartjs.min.js.map | 1 + lib/amd/build/checkbox-toggleall.min.js | 3 ++- lib/amd/build/checkbox-toggleall.min.js.map | 1 + lib/amd/build/config.min.js | 3 ++- lib/amd/build/config.min.js.map | 1 + lib/amd/build/custom_interaction_events.min.js | 3 ++- lib/amd/build/custom_interaction_events.min.js.map | 1 + lib/amd/build/dragdrop.min.js | 3 ++- lib/amd/build/dragdrop.min.js.map | 1 + lib/amd/build/event.min.js | 3 ++- lib/amd/build/event.min.js.map | 1 + lib/amd/build/first.min.js | 3 ++- lib/amd/build/first.min.js.map | 1 + lib/amd/build/form-autocomplete.min.js | 3 ++- lib/amd/build/form-autocomplete.min.js.map | 1 + lib/amd/build/form-cohort-selector.min.js | 3 ++- lib/amd/build/form-cohort-selector.min.js.map | 1 + lib/amd/build/form-course-selector.min.js | 3 ++- lib/amd/build/form-course-selector.min.js.map | 1 + lib/amd/build/fragment.min.js | 3 ++- lib/amd/build/fragment.min.js.map | 1 + lib/amd/build/icon_system.min.js | 3 ++- lib/amd/build/icon_system.min.js.map | 1 + lib/amd/build/icon_system_fontawesome.min.js | 3 ++- lib/amd/build/icon_system_fontawesome.min.js.map | 1 + lib/amd/build/icon_system_standard.min.js | 3 ++- lib/amd/build/icon_system_standard.min.js.map | 1 + lib/amd/build/inplace_editable.min.js | 3 ++- lib/amd/build/inplace_editable.min.js.map | 1 + lib/amd/build/key_codes.min.js | 3 ++- lib/amd/build/key_codes.min.js.map | 1 + lib/amd/build/loadingicon.min.js | 3 ++- lib/amd/build/loadingicon.min.js.map | 1 + lib/amd/build/localstorage.min.js | 3 ++- lib/amd/build/localstorage.min.js.map | 1 + lib/amd/build/log.min.js | 3 ++- lib/amd/build/log.min.js.map | 1 + lib/amd/build/loglevel.min.js | 3 ++- lib/amd/build/loglevel.min.js.map | 1 + lib/amd/build/modal.min.js | 3 ++- lib/amd/build/modal.min.js.map | 1 + lib/amd/build/modal_backdrop.min.js | 3 ++- lib/amd/build/modal_backdrop.min.js.map | 1 + lib/amd/build/modal_cancel.min.js | 3 ++- lib/amd/build/modal_cancel.min.js.map | 1 + lib/amd/build/modal_events.min.js | 3 ++- lib/amd/build/modal_events.min.js.map | 1 + lib/amd/build/modal_factory.min.js | 3 ++- lib/amd/build/modal_factory.min.js.map | 1 + lib/amd/build/modal_registry.min.js | 3 ++- lib/amd/build/modal_registry.min.js.map | 1 + lib/amd/build/modal_save_cancel.min.js | 3 ++- lib/amd/build/modal_save_cancel.min.js.map | 1 + lib/amd/build/mustache.min.js | 3 ++- lib/amd/build/mustache.min.js.map | 1 + lib/amd/build/network.min.js | 3 ++- lib/amd/build/network.min.js.map | 1 + lib/amd/build/notification.min.js | 3 ++- lib/amd/build/notification.min.js.map | 1 + lib/amd/build/page_global.min.js | 3 ++- lib/amd/build/page_global.min.js.map | 1 + lib/amd/build/paged_content.min.js | 3 ++- lib/amd/build/paged_content.min.js.map | 1 + lib/amd/build/paged_content_events.min.js | 3 ++- lib/amd/build/paged_content_events.min.js.map | 1 + lib/amd/build/paged_content_factory.min.js | 3 ++- lib/amd/build/paged_content_factory.min.js.map | 1 + lib/amd/build/paged_content_pages.min.js | 3 ++- lib/amd/build/paged_content_pages.min.js.map | 1 + lib/amd/build/paged_content_paging_bar.min.js | 3 ++- lib/amd/build/paged_content_paging_bar.min.js.map | 1 + .../build/paged_content_paging_bar_limit_selector.min.js | 3 ++- .../paged_content_paging_bar_limit_selector.min.js.map | 1 + lib/amd/build/paged_content_paging_dropdown.min.js | 3 ++- lib/amd/build/paged_content_paging_dropdown.min.js.map | 1 + lib/amd/build/pending.min.js | 3 ++- lib/amd/build/pending.min.js.map | 1 + lib/amd/build/permissionmanager.min.js | 3 ++- lib/amd/build/permissionmanager.min.js.map | 1 + lib/amd/build/popover_region_controller.min.js | 3 ++- lib/amd/build/popover_region_controller.min.js.map | 1 + lib/amd/build/popper.min.js | 3 ++- lib/amd/build/popper.min.js.map | 1 + lib/amd/build/pubsub.min.js | 3 ++- lib/amd/build/pubsub.min.js.map | 1 + lib/amd/build/search-input.min.js | 3 ++- lib/amd/build/search-input.min.js.map | 1 + lib/amd/build/sessionstorage.min.js | 3 ++- lib/amd/build/sessionstorage.min.js.map | 1 + lib/amd/build/showhidesettings.min.js | 3 ++- lib/amd/build/showhidesettings.min.js.map | 1 + lib/amd/build/sortable_list.min.js | 3 ++- lib/amd/build/sortable_list.min.js.map | 1 + lib/amd/build/storagewrapper.min.js | 3 ++- lib/amd/build/storagewrapper.min.js.map | 1 + lib/amd/build/str.min.js | 3 ++- lib/amd/build/str.min.js.map | 1 + lib/amd/build/tag.min.js | 3 ++- lib/amd/build/tag.min.js.map | 1 + lib/amd/build/templates.min.js | 3 ++- lib/amd/build/templates.min.js.map | 1 + lib/amd/build/tooltip.min.js | 3 ++- lib/amd/build/tooltip.min.js.map | 1 + lib/amd/build/tree.min.js | 3 ++- lib/amd/build/tree.min.js.map | 1 + lib/amd/build/truncate.min.js | 3 ++- lib/amd/build/truncate.min.js.map | 1 + lib/amd/build/url.min.js | 3 ++- lib/amd/build/url.min.js.map | 1 + lib/amd/build/user_date.min.js | 3 ++- lib/amd/build/user_date.min.js.map | 1 + lib/amd/build/yui.min.js | 3 ++- lib/amd/build/yui.min.js.map | 1 + lib/form/amd/build/defaultcustom.min.js | 3 ++- lib/form/amd/build/defaultcustom.min.js.map | 1 + lib/form/amd/build/filetypes.min.js | 3 ++- lib/form/amd/build/filetypes.min.js.map | 1 + lib/form/amd/build/passwordunmask.min.js | 3 ++- lib/form/amd/build/passwordunmask.min.js.map | 1 + lib/form/amd/build/showadvanced.min.js | 3 ++- lib/form/amd/build/showadvanced.min.js.map | 1 + media/player/videojs/amd/build/Youtube-lazy.min.js | 3 ++- media/player/videojs/amd/build/Youtube-lazy.min.js.map | 1 + media/player/videojs/amd/build/loader.min.js | 3 ++- media/player/videojs/amd/build/loader.min.js.map | 1 + media/player/videojs/amd/build/video-lazy.min.js | 8 ++------ media/player/videojs/amd/build/video-lazy.min.js.map | 1 + media/player/videojs/amd/build/videojs-flash-lazy.min.js | 3 ++- .../videojs/amd/build/videojs-flash-lazy.min.js.map | 1 + message/amd/build/message_drawer.min.js | 3 ++- message/amd/build/message_drawer.min.js.map | 1 + message/amd/build/message_drawer_events.min.js | 3 ++- message/amd/build/message_drawer_events.min.js.map | 1 + message/amd/build/message_drawer_helper.min.js | 3 ++- message/amd/build/message_drawer_helper.min.js.map | 1 + message/amd/build/message_drawer_lazy_load_list.min.js | 3 ++- .../amd/build/message_drawer_lazy_load_list.min.js.map | 1 + message/amd/build/message_drawer_router.min.js | 3 ++- message/amd/build/message_drawer_router.min.js.map | 1 + message/amd/build/message_drawer_routes.min.js | 3 ++- message/amd/build/message_drawer_routes.min.js.map | 1 + message/amd/build/message_drawer_view_contact.min.js | 3 ++- message/amd/build/message_drawer_view_contact.min.js.map | 1 + message/amd/build/message_drawer_view_contacts.min.js | 3 ++- .../amd/build/message_drawer_view_contacts.min.js.map | 1 + .../message_drawer_view_contacts_section_contacts.min.js | 3 ++- ...sage_drawer_view_contacts_section_contacts.min.js.map | 1 + .../message_drawer_view_contacts_section_requests.min.js | 3 ++- ...sage_drawer_view_contacts_section_requests.min.js.map | 1 + .../amd/build/message_drawer_view_conversation.min.js | 3 ++- .../build/message_drawer_view_conversation.min.js.map | 1 + .../message_drawer_view_conversation_constants.min.js | 3 ++- ...message_drawer_view_conversation_constants.min.js.map | 1 + .../message_drawer_view_conversation_patcher.min.js | 3 ++- .../message_drawer_view_conversation_patcher.min.js.map | 1 + .../message_drawer_view_conversation_renderer.min.js | 3 ++- .../message_drawer_view_conversation_renderer.min.js.map | 1 + ...message_drawer_view_conversation_state_manager.min.js | 3 ++- ...age_drawer_view_conversation_state_manager.min.js.map | 1 + message/amd/build/message_drawer_view_group_info.min.js | 3 ++- .../amd/build/message_drawer_view_group_info.min.js.map | 1 + message/amd/build/message_drawer_view_overview.min.js | 3 ++- .../amd/build/message_drawer_view_overview.min.js.map | 1 + .../build/message_drawer_view_overview_section.min.js | 3 ++- .../message_drawer_view_overview_section.min.js.map | 1 + message/amd/build/message_drawer_view_search.min.js | 3 ++- message/amd/build/message_drawer_view_search.min.js.map | 1 + message/amd/build/message_drawer_view_settings.min.js | 3 ++- .../amd/build/message_drawer_view_settings.min.js.map | 1 + message/amd/build/message_notification_preference.min.js | 3 ++- .../amd/build/message_notification_preference.min.js.map | 1 + message/amd/build/message_popover.min.js | 3 ++- message/amd/build/message_popover.min.js.map | 1 + message/amd/build/message_repository.min.js | 3 ++- message/amd/build/message_repository.min.js.map | 1 + message/amd/build/message_user_button.min.js | 3 ++- message/amd/build/message_user_button.min.js.map | 1 + message/amd/build/notification_preference.min.js | 3 ++- message/amd/build/notification_preference.min.js.map | 1 + message/amd/build/notification_processor.min.js | 3 ++- message/amd/build/notification_processor.min.js.map | 1 + message/amd/build/notification_processor_settings.min.js | 3 ++- .../amd/build/notification_processor_settings.min.js.map | 1 + .../preferences_notifications_list_controller.min.js | 3 ++- .../preferences_notifications_list_controller.min.js.map | 1 + message/amd/build/preferences_processor_form.min.js | 3 ++- message/amd/build/preferences_processor_form.min.js.map | 1 + message/amd/build/toggle_contact_button.min.js | 3 ++- message/amd/build/toggle_contact_button.min.js.map | 1 + .../amd/build/notification_area_content_area.min.js | 3 ++- .../amd/build/notification_area_content_area.min.js.map | 1 + .../amd/build/notification_area_control_area.min.js | 3 ++- .../amd/build/notification_area_control_area.min.js.map | 1 + .../popup/amd/build/notification_area_events.min.js | 3 ++- .../popup/amd/build/notification_area_events.min.js.map | 1 + .../amd/build/notification_popover_controller.min.js | 3 ++- .../amd/build/notification_popover_controller.min.js.map | 1 + .../popup/amd/build/notification_repository.min.js | 3 ++- .../popup/amd/build/notification_repository.min.js.map | 1 + mod/assign/amd/build/grading_actions.min.js | 3 ++- mod/assign/amd/build/grading_actions.min.js.map | 1 + mod/assign/amd/build/grading_events.min.js | 3 ++- mod/assign/amd/build/grading_events.min.js.map | 1 + mod/assign/amd/build/grading_form_change_checker.min.js | 3 ++- .../amd/build/grading_form_change_checker.min.js.map | 1 + mod/assign/amd/build/grading_navigation.min.js | 3 ++- mod/assign/amd/build/grading_navigation.min.js.map | 1 + mod/assign/amd/build/grading_navigation_user_info.min.js | 3 ++- .../amd/build/grading_navigation_user_info.min.js.map | 1 + mod/assign/amd/build/grading_panel.min.js | 3 ++- mod/assign/amd/build/grading_panel.min.js.map | 1 + mod/assign/amd/build/grading_review_panel.min.js | 3 ++- mod/assign/amd/build/grading_review_panel.min.js.map | 1 + mod/assign/amd/build/participant_selector.min.js | 3 ++- mod/assign/amd/build/participant_selector.min.js.map | 1 + mod/feedback/amd/build/edit.min.js | 3 ++- mod/feedback/amd/build/edit.min.js.map | 1 + mod/forum/amd/build/discussion.min.js | 3 ++- mod/forum/amd/build/discussion.min.js.map | 1 + mod/forum/amd/build/discussion_list.min.js | 3 ++- mod/forum/amd/build/discussion_list.min.js.map | 1 + mod/forum/amd/build/favourite_toggle.min.js | 3 ++- mod/forum/amd/build/favourite_toggle.min.js.map | 1 + mod/forum/amd/build/inpage_reply.min.js | 3 ++- mod/forum/amd/build/inpage_reply.min.js.map | 1 + mod/forum/amd/build/lock_toggle.min.js | 3 ++- mod/forum/amd/build/lock_toggle.min.js.map | 1 + mod/forum/amd/build/pin_toggle.min.js | 3 ++- mod/forum/amd/build/pin_toggle.min.js.map | 1 + mod/forum/amd/build/posts_list.min.js | 3 ++- mod/forum/amd/build/posts_list.min.js.map | 1 + mod/forum/amd/build/repository.min.js | 3 ++- mod/forum/amd/build/repository.min.js.map | 1 + mod/forum/amd/build/selectors.min.js | 3 ++- mod/forum/amd/build/selectors.min.js.map | 1 + mod/forum/amd/build/subscription_toggle.min.js | 3 ++- mod/forum/amd/build/subscription_toggle.min.js.map | 1 + mod/lti/amd/build/cartridge_registration_form.min.js | 3 ++- mod/lti/amd/build/cartridge_registration_form.min.js.map | 1 + mod/lti/amd/build/contentitem.min.js | 3 ++- mod/lti/amd/build/contentitem.min.js.map | 1 + mod/lti/amd/build/contentitem_return.min.js | 3 ++- mod/lti/amd/build/contentitem_return.min.js.map | 1 + mod/lti/amd/build/events.min.js | 3 ++- mod/lti/amd/build/events.min.js.map | 1 + mod/lti/amd/build/external_registration.min.js | 3 ++- mod/lti/amd/build/external_registration.min.js.map | 1 + mod/lti/amd/build/external_registration_return.min.js | 3 ++- .../amd/build/external_registration_return.min.js.map | 1 + mod/lti/amd/build/form-field.min.js | 3 ++- mod/lti/amd/build/form-field.min.js.map | 1 + mod/lti/amd/build/keys.min.js | 3 ++- mod/lti/amd/build/keys.min.js.map | 1 + mod/lti/amd/build/tool_card_controller.min.js | 3 ++- mod/lti/amd/build/tool_card_controller.min.js.map | 1 + mod/lti/amd/build/tool_configure_controller.min.js | 3 ++- mod/lti/amd/build/tool_configure_controller.min.js.map | 1 + mod/lti/amd/build/tool_proxy.min.js | 3 ++- mod/lti/amd/build/tool_proxy.min.js.map | 1 + mod/lti/amd/build/tool_proxy_card_controller.min.js | 3 ++- mod/lti/amd/build/tool_proxy_card_controller.min.js.map | 1 + mod/lti/amd/build/tool_type.min.js | 3 ++- mod/lti/amd/build/tool_type.min.js.map | 1 + mod/quiz/amd/build/add_question_modal_launcher.min.js | 3 ++- .../amd/build/add_question_modal_launcher.min.js.map | 1 + mod/quiz/amd/build/add_random_form.min.js | 3 ++- mod/quiz/amd/build/add_random_form.min.js.map | 1 + mod/quiz/amd/build/add_random_question.min.js | 3 ++- mod/quiz/amd/build/add_random_question.min.js.map | 1 + mod/quiz/amd/build/modal_add_random_question.min.js | 3 ++- mod/quiz/amd/build/modal_add_random_question.min.js.map | 1 + mod/quiz/amd/build/modal_quiz_question_bank.min.js | 3 ++- mod/quiz/amd/build/modal_quiz_question_bank.min.js.map | 1 + mod/quiz/amd/build/preflightcheck.min.js | 3 ++- mod/quiz/amd/build/preflightcheck.min.js.map | 1 + mod/quiz/amd/build/quizquestionbank.min.js | 3 ++- mod/quiz/amd/build/quizquestionbank.min.js.map | 1 + mod/quiz/amd/build/random_question_form_preview.min.js | 3 ++- .../amd/build/random_question_form_preview.min.js.map | 1 + mod/quiz/amd/build/repaginate.min.js | 3 ++- mod/quiz/amd/build/repaginate.min.js.map | 1 + mod/survey/amd/build/validation.min.js | 3 ++- mod/survey/amd/build/validation.min.js.map | 1 + mod/workshop/amd/build/modform.min.js | 3 ++- mod/workshop/amd/build/modform.min.js.map | 1 + mod/workshop/amd/build/workshopview.min.js | 3 ++- mod/workshop/amd/build/workshopview.min.js.map | 1 + question/amd/build/edit_tags.min.js | 3 ++- question/amd/build/edit_tags.min.js.map | 1 + question/amd/build/qbankmanager.min.js | 3 ++- question/amd/build/qbankmanager.min.js.map | 1 + question/amd/build/repository.min.js | 3 ++- question/amd/build/repository.min.js.map | 1 + question/amd/build/selectors.min.js | 3 ++- question/amd/build/selectors.min.js.map | 1 + question/type/ddimageortext/amd/build/form.min.js | 3 ++- question/type/ddimageortext/amd/build/form.min.js.map | 1 + question/type/ddimageortext/amd/build/question.min.js | 3 ++- .../type/ddimageortext/amd/build/question.min.js.map | 1 + question/type/ddmarker/amd/build/form.min.js | 3 ++- question/type/ddmarker/amd/build/form.min.js.map | 1 + question/type/ddmarker/amd/build/question.min.js | 3 ++- question/type/ddmarker/amd/build/question.min.js.map | 1 + question/type/ddmarker/amd/build/shapes.min.js | 3 ++- question/type/ddmarker/amd/build/shapes.min.js.map | 1 + question/type/ddwtos/amd/build/ddwtos.min.js | 3 ++- question/type/ddwtos/amd/build/ddwtos.min.js.map | 1 + question/type/multichoice/amd/build/clearchoice.min.js | 3 ++- .../type/multichoice/amd/build/clearchoice.min.js.map | 1 + report/competency/amd/build/grading_popup.min.js | 3 ++- report/competency/amd/build/grading_popup.min.js.map | 1 + .../competency/amd/build/user_course_navigation.min.js | 3 ++- .../amd/build/user_course_navigation.min.js.map | 1 + report/insights/amd/build/actions.min.js | 3 ++- report/insights/amd/build/actions.min.js.map | 1 + report/progress/amd/build/completion_override.min.js | 3 ++- report/progress/amd/build/completion_override.min.js.map | 1 + search/amd/build/form-search-user-selector.min.js | 3 ++- search/amd/build/form-search-user-selector.min.js.map | 1 + theme/boost/amd/build/alert.min.js | 3 ++- theme/boost/amd/build/alert.min.js.map | 1 + theme/boost/amd/build/aria.min.js | 3 ++- theme/boost/amd/build/aria.min.js.map | 1 + theme/boost/amd/build/button.min.js | 3 ++- theme/boost/amd/build/button.min.js.map | 1 + theme/boost/amd/build/carousel.min.js | 3 ++- theme/boost/amd/build/carousel.min.js.map | 1 + theme/boost/amd/build/collapse.min.js | 3 ++- theme/boost/amd/build/collapse.min.js.map | 1 + theme/boost/amd/build/drawer.min.js | 3 ++- theme/boost/amd/build/drawer.min.js.map | 1 + theme/boost/amd/build/dropdown.min.js | 3 ++- theme/boost/amd/build/dropdown.min.js.map | 1 + theme/boost/amd/build/form-display-errors.min.js | 3 ++- theme/boost/amd/build/form-display-errors.min.js.map | 1 + theme/boost/amd/build/loader.min.js | 3 ++- theme/boost/amd/build/loader.min.js.map | 1 + theme/boost/amd/build/modal.min.js | 3 ++- theme/boost/amd/build/modal.min.js.map | 1 + theme/boost/amd/build/pending.min.js | 3 ++- theme/boost/amd/build/pending.min.js.map | 1 + theme/boost/amd/build/popover.min.js | 3 ++- theme/boost/amd/build/popover.min.js.map | 1 + theme/boost/amd/build/scrollspy.min.js | 3 ++- theme/boost/amd/build/scrollspy.min.js.map | 1 + theme/boost/amd/build/tab.min.js | 3 ++- theme/boost/amd/build/tab.min.js.map | 1 + theme/boost/amd/build/tether.min.js | 3 ++- theme/boost/amd/build/tether.min.js.map | 1 + theme/boost/amd/build/tooltip.min.js | 3 ++- theme/boost/amd/build/tooltip.min.js.map | 1 + theme/boost/amd/build/util.min.js | 3 ++- theme/boost/amd/build/util.min.js.map | 1 + user/amd/build/participants.min.js | 3 ++- user/amd/build/participants.min.js.map | 1 + user/amd/build/status_field.min.js | 3 ++- user/amd/build/status_field.min.js.map | 1 + user/amd/build/unified_filter.min.js | 3 ++- user/amd/build/unified_filter.min.js.map | 1 + user/amd/build/unified_filter_datasource.min.js | 3 ++- user/amd/build/unified_filter_datasource.min.js.map | 1 + 632 files changed, 948 insertions(+), 329 deletions(-) create mode 100644 admin/tool/analytics/amd/build/log_info.min.js.map create mode 100644 admin/tool/analytics/amd/build/model.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/add_category.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/add_purpose.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/data_deletion.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/data_registry.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/events.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/expand_contract.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/purposesactions.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/request_filter.min.js.map create mode 100644 admin/tool/dataprivacy/amd/build/requestactions.min.js.map create mode 100644 admin/tool/lp/amd/build/actionselector.min.js.map create mode 100644 admin/tool/lp/amd/build/competencies.min.js.map create mode 100644 admin/tool/lp/amd/build/competency_outcomes.min.js.map create mode 100644 admin/tool/lp/amd/build/competency_plan_navigation.min.js.map create mode 100644 admin/tool/lp/amd/build/competency_rule.min.js.map create mode 100644 admin/tool/lp/amd/build/competency_rule_all.min.js.map create mode 100644 admin/tool/lp/amd/build/competency_rule_points.min.js.map create mode 100644 admin/tool/lp/amd/build/competencyactions.min.js.map create mode 100644 admin/tool/lp/amd/build/competencydialogue.min.js.map create mode 100644 admin/tool/lp/amd/build/competencypicker.min.js.map create mode 100644 admin/tool/lp/amd/build/competencypicker_user_plans.min.js.map create mode 100644 admin/tool/lp/amd/build/competencyruleconfig.min.js.map create mode 100644 admin/tool/lp/amd/build/competencytree.min.js.map create mode 100644 admin/tool/lp/amd/build/course_competency_settings.min.js.map create mode 100644 admin/tool/lp/amd/build/dialogue.min.js.map create mode 100644 admin/tool/lp/amd/build/dragdrop-reorder.min.js.map create mode 100644 admin/tool/lp/amd/build/event_base.min.js.map create mode 100644 admin/tool/lp/amd/build/evidence_delete.min.js.map create mode 100644 admin/tool/lp/amd/build/form-cohort-selector.min.js.map create mode 100644 admin/tool/lp/amd/build/form-user-selector.min.js.map create mode 100644 admin/tool/lp/amd/build/form_competency_element.min.js.map create mode 100644 admin/tool/lp/amd/build/frameworkactions.min.js.map create mode 100644 admin/tool/lp/amd/build/frameworks_datasource.min.js.map create mode 100644 admin/tool/lp/amd/build/grade_dialogue.min.js.map create mode 100644 admin/tool/lp/amd/build/grade_user_competency_inline.min.js.map create mode 100644 admin/tool/lp/amd/build/menubar.min.js.map create mode 100644 admin/tool/lp/amd/build/module_navigation.min.js.map create mode 100644 admin/tool/lp/amd/build/parentcompetency_form.min.js.map create mode 100644 admin/tool/lp/amd/build/planactions.min.js.map create mode 100644 admin/tool/lp/amd/build/scaleconfig.min.js.map create mode 100644 admin/tool/lp/amd/build/scalevalues.min.js.map create mode 100644 admin/tool/lp/amd/build/templateactions.min.js.map create mode 100644 admin/tool/lp/amd/build/tree.min.js.map create mode 100644 admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map create mode 100644 admin/tool/lp/amd/build/user_competency_info.min.js.map create mode 100644 admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map create mode 100644 admin/tool/lp/amd/build/user_competency_workflow.min.js.map create mode 100644 admin/tool/lp/amd/build/user_evidence_actions.min.js.map create mode 100644 admin/tool/policy/amd/build/acceptances_filter.min.js.map create mode 100644 admin/tool/policy/amd/build/acceptances_filter_datasource.min.js.map create mode 100644 admin/tool/policy/amd/build/acceptmodal.min.js.map create mode 100644 admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js.map create mode 100644 admin/tool/policy/amd/build/managedocsactions.min.js.map create mode 100644 admin/tool/policy/amd/build/policyactions.min.js.map create mode 100644 admin/tool/templatelibrary/amd/build/display.min.js.map create mode 100644 admin/tool/templatelibrary/amd/build/search.min.js.map create mode 100644 admin/tool/usertours/amd/build/managesteps.min.js.map create mode 100644 admin/tool/usertours/amd/build/managetours.min.js.map create mode 100644 admin/tool/usertours/amd/build/tour.min.js.map create mode 100644 admin/tool/usertours/amd/build/usertours.min.js.map create mode 100644 admin/tool/xmldb/amd/build/move.min.js.map create mode 100644 backup/util/ui/amd/build/async_backup.min.js.map create mode 100644 blocks/myoverview/amd/build/main.min.js.map create mode 100644 blocks/myoverview/amd/build/repository.min.js.map create mode 100644 blocks/myoverview/amd/build/selectors.min.js.map create mode 100644 blocks/myoverview/amd/build/view.min.js.map create mode 100644 blocks/myoverview/amd/build/view_nav.min.js.map create mode 100644 blocks/navigation/amd/build/ajax_response_renderer.min.js.map create mode 100644 blocks/navigation/amd/build/nav_loader.min.js.map create mode 100644 blocks/navigation/amd/build/navblock.min.js.map create mode 100644 blocks/navigation/amd/build/site_admin_loader.min.js.map create mode 100644 blocks/online_users/amd/build/change_user_visibility.min.js.map create mode 100644 blocks/recentlyaccessedcourses/amd/build/main.min.js.map create mode 100644 blocks/recentlyaccesseditems/amd/build/main.min.js.map create mode 100644 blocks/recentlyaccesseditems/amd/build/repository.min.js.map create mode 100644 blocks/settings/amd/build/settingsblock.min.js.map create mode 100644 blocks/starredcourses/amd/build/main.min.js.map create mode 100644 blocks/starredcourses/amd/build/repository.min.js.map create mode 100644 blocks/timeline/amd/build/calendar_events_repository.min.js.map create mode 100644 blocks/timeline/amd/build/event_list.min.js.map create mode 100644 blocks/timeline/amd/build/main.min.js.map create mode 100644 blocks/timeline/amd/build/view.min.js.map create mode 100644 blocks/timeline/amd/build/view_courses.min.js.map create mode 100644 blocks/timeline/amd/build/view_dates.min.js.map create mode 100644 blocks/timeline/amd/build/view_nav.min.js.map create mode 100644 calendar/amd/build/calendar.min.js.map create mode 100644 calendar/amd/build/calendar_filter.min.js.map create mode 100644 calendar/amd/build/calendar_mini.min.js.map create mode 100644 calendar/amd/build/calendar_threemonth.min.js.map create mode 100644 calendar/amd/build/calendar_view.min.js.map create mode 100644 calendar/amd/build/crud.min.js.map create mode 100644 calendar/amd/build/drag_drop_data_store.min.js.map create mode 100644 calendar/amd/build/event_form.min.js.map create mode 100644 calendar/amd/build/events.min.js.map create mode 100644 calendar/amd/build/modal_delete.min.js.map create mode 100644 calendar/amd/build/modal_event_form.min.js.map create mode 100644 calendar/amd/build/month_navigation_drag_drop.min.js.map create mode 100644 calendar/amd/build/month_view_drag_drop.min.js.map create mode 100644 calendar/amd/build/repository.min.js.map create mode 100644 calendar/amd/build/selectors.min.js.map create mode 100644 calendar/amd/build/summary_modal.min.js.map create mode 100644 calendar/amd/build/view_manager.min.js.map create mode 100644 course/amd/build/actions.min.js.map create mode 100644 course/amd/build/events.min.js.map create mode 100644 course/amd/build/repository.min.js.map create mode 100644 customfield/amd/build/form.min.js.map create mode 100644 enrol/manual/amd/build/form-potential-user-selector.min.js.map create mode 100644 enrol/manual/amd/build/quickenrolment.min.js.map create mode 100644 grade/amd/build/edittree_index.min.js.map create mode 100644 grade/grading/form/guide/amd/build/comment_chooser.min.js.map create mode 100644 lib/amd/build/adapter.min.js.map create mode 100644 lib/amd/build/addblockmodal.min.js.map create mode 100644 lib/amd/build/ajax.min.js.map create mode 100644 lib/amd/build/auto_rows.min.js.map create mode 100644 lib/amd/build/autoscroll.min.js.map create mode 100644 lib/amd/build/backoff_timer.min.js.map create mode 100644 lib/amd/build/chart_axis.min.js.map create mode 100644 lib/amd/build/chart_bar.min.js.map create mode 100644 lib/amd/build/chart_base.min.js.map create mode 100644 lib/amd/build/chart_builder.min.js.map create mode 100644 lib/amd/build/chart_line.min.js.map create mode 100644 lib/amd/build/chart_output.min.js.map create mode 100644 lib/amd/build/chart_output_base.min.js.map create mode 100644 lib/amd/build/chart_output_chartjs.min.js.map create mode 100644 lib/amd/build/chart_output_htmltable.min.js.map create mode 100644 lib/amd/build/chart_pie.min.js.map create mode 100644 lib/amd/build/chart_series.min.js.map create mode 100644 lib/amd/build/chartjs-lazy.min.js.map create mode 100644 lib/amd/build/chartjs.min.js.map create mode 100644 lib/amd/build/checkbox-toggleall.min.js.map create mode 100644 lib/amd/build/config.min.js.map create mode 100644 lib/amd/build/custom_interaction_events.min.js.map create mode 100644 lib/amd/build/dragdrop.min.js.map create mode 100644 lib/amd/build/event.min.js.map create mode 100644 lib/amd/build/first.min.js.map create mode 100644 lib/amd/build/form-autocomplete.min.js.map create mode 100644 lib/amd/build/form-cohort-selector.min.js.map create mode 100644 lib/amd/build/form-course-selector.min.js.map create mode 100644 lib/amd/build/fragment.min.js.map create mode 100644 lib/amd/build/icon_system.min.js.map create mode 100644 lib/amd/build/icon_system_fontawesome.min.js.map create mode 100644 lib/amd/build/icon_system_standard.min.js.map create mode 100644 lib/amd/build/inplace_editable.min.js.map create mode 100644 lib/amd/build/key_codes.min.js.map create mode 100644 lib/amd/build/loadingicon.min.js.map create mode 100644 lib/amd/build/localstorage.min.js.map create mode 100644 lib/amd/build/log.min.js.map create mode 100644 lib/amd/build/loglevel.min.js.map create mode 100644 lib/amd/build/modal.min.js.map create mode 100644 lib/amd/build/modal_backdrop.min.js.map create mode 100644 lib/amd/build/modal_cancel.min.js.map create mode 100644 lib/amd/build/modal_events.min.js.map create mode 100644 lib/amd/build/modal_factory.min.js.map create mode 100644 lib/amd/build/modal_registry.min.js.map create mode 100644 lib/amd/build/modal_save_cancel.min.js.map create mode 100644 lib/amd/build/mustache.min.js.map create mode 100644 lib/amd/build/network.min.js.map create mode 100644 lib/amd/build/notification.min.js.map create mode 100644 lib/amd/build/page_global.min.js.map create mode 100644 lib/amd/build/paged_content.min.js.map create mode 100644 lib/amd/build/paged_content_events.min.js.map create mode 100644 lib/amd/build/paged_content_factory.min.js.map create mode 100644 lib/amd/build/paged_content_pages.min.js.map create mode 100644 lib/amd/build/paged_content_paging_bar.min.js.map create mode 100644 lib/amd/build/paged_content_paging_bar_limit_selector.min.js.map create mode 100644 lib/amd/build/paged_content_paging_dropdown.min.js.map create mode 100644 lib/amd/build/pending.min.js.map create mode 100644 lib/amd/build/permissionmanager.min.js.map create mode 100644 lib/amd/build/popover_region_controller.min.js.map create mode 100644 lib/amd/build/popper.min.js.map create mode 100644 lib/amd/build/pubsub.min.js.map create mode 100644 lib/amd/build/search-input.min.js.map create mode 100644 lib/amd/build/sessionstorage.min.js.map create mode 100644 lib/amd/build/showhidesettings.min.js.map create mode 100644 lib/amd/build/sortable_list.min.js.map create mode 100644 lib/amd/build/storagewrapper.min.js.map create mode 100644 lib/amd/build/str.min.js.map create mode 100644 lib/amd/build/tag.min.js.map create mode 100644 lib/amd/build/templates.min.js.map create mode 100644 lib/amd/build/tooltip.min.js.map create mode 100644 lib/amd/build/tree.min.js.map create mode 100644 lib/amd/build/truncate.min.js.map create mode 100644 lib/amd/build/url.min.js.map create mode 100644 lib/amd/build/user_date.min.js.map create mode 100644 lib/amd/build/yui.min.js.map create mode 100644 lib/form/amd/build/defaultcustom.min.js.map create mode 100644 lib/form/amd/build/filetypes.min.js.map create mode 100644 lib/form/amd/build/passwordunmask.min.js.map create mode 100644 lib/form/amd/build/showadvanced.min.js.map create mode 100644 media/player/videojs/amd/build/Youtube-lazy.min.js.map create mode 100644 media/player/videojs/amd/build/loader.min.js.map create mode 100644 media/player/videojs/amd/build/video-lazy.min.js.map create mode 100644 media/player/videojs/amd/build/videojs-flash-lazy.min.js.map create mode 100644 message/amd/build/message_drawer.min.js.map create mode 100644 message/amd/build/message_drawer_events.min.js.map create mode 100644 message/amd/build/message_drawer_helper.min.js.map create mode 100644 message/amd/build/message_drawer_lazy_load_list.min.js.map create mode 100644 message/amd/build/message_drawer_router.min.js.map create mode 100644 message/amd/build/message_drawer_routes.min.js.map create mode 100644 message/amd/build/message_drawer_view_contact.min.js.map create mode 100644 message/amd/build/message_drawer_view_contacts.min.js.map create mode 100644 message/amd/build/message_drawer_view_contacts_section_contacts.min.js.map create mode 100644 message/amd/build/message_drawer_view_contacts_section_requests.min.js.map create mode 100644 message/amd/build/message_drawer_view_conversation.min.js.map create mode 100644 message/amd/build/message_drawer_view_conversation_constants.min.js.map create mode 100644 message/amd/build/message_drawer_view_conversation_patcher.min.js.map create mode 100644 message/amd/build/message_drawer_view_conversation_renderer.min.js.map create mode 100644 message/amd/build/message_drawer_view_conversation_state_manager.min.js.map create mode 100644 message/amd/build/message_drawer_view_group_info.min.js.map create mode 100644 message/amd/build/message_drawer_view_overview.min.js.map create mode 100644 message/amd/build/message_drawer_view_overview_section.min.js.map create mode 100644 message/amd/build/message_drawer_view_search.min.js.map create mode 100644 message/amd/build/message_drawer_view_settings.min.js.map create mode 100644 message/amd/build/message_notification_preference.min.js.map create mode 100644 message/amd/build/message_popover.min.js.map create mode 100644 message/amd/build/message_repository.min.js.map create mode 100644 message/amd/build/message_user_button.min.js.map create mode 100644 message/amd/build/notification_preference.min.js.map create mode 100644 message/amd/build/notification_processor.min.js.map create mode 100644 message/amd/build/notification_processor_settings.min.js.map create mode 100644 message/amd/build/preferences_notifications_list_controller.min.js.map create mode 100644 message/amd/build/preferences_processor_form.min.js.map create mode 100644 message/amd/build/toggle_contact_button.min.js.map create mode 100644 message/output/popup/amd/build/notification_area_content_area.min.js.map create mode 100644 message/output/popup/amd/build/notification_area_control_area.min.js.map create mode 100644 message/output/popup/amd/build/notification_area_events.min.js.map create mode 100644 message/output/popup/amd/build/notification_popover_controller.min.js.map create mode 100644 message/output/popup/amd/build/notification_repository.min.js.map create mode 100644 mod/assign/amd/build/grading_actions.min.js.map create mode 100644 mod/assign/amd/build/grading_events.min.js.map create mode 100644 mod/assign/amd/build/grading_form_change_checker.min.js.map create mode 100644 mod/assign/amd/build/grading_navigation.min.js.map create mode 100644 mod/assign/amd/build/grading_navigation_user_info.min.js.map create mode 100644 mod/assign/amd/build/grading_panel.min.js.map create mode 100644 mod/assign/amd/build/grading_review_panel.min.js.map create mode 100644 mod/assign/amd/build/participant_selector.min.js.map create mode 100644 mod/feedback/amd/build/edit.min.js.map create mode 100644 mod/forum/amd/build/discussion.min.js.map create mode 100644 mod/forum/amd/build/discussion_list.min.js.map create mode 100644 mod/forum/amd/build/favourite_toggle.min.js.map create mode 100644 mod/forum/amd/build/inpage_reply.min.js.map create mode 100644 mod/forum/amd/build/lock_toggle.min.js.map create mode 100644 mod/forum/amd/build/pin_toggle.min.js.map create mode 100644 mod/forum/amd/build/posts_list.min.js.map create mode 100644 mod/forum/amd/build/repository.min.js.map create mode 100644 mod/forum/amd/build/selectors.min.js.map create mode 100644 mod/forum/amd/build/subscription_toggle.min.js.map create mode 100644 mod/lti/amd/build/cartridge_registration_form.min.js.map create mode 100644 mod/lti/amd/build/contentitem.min.js.map create mode 100644 mod/lti/amd/build/contentitem_return.min.js.map create mode 100644 mod/lti/amd/build/events.min.js.map create mode 100644 mod/lti/amd/build/external_registration.min.js.map create mode 100644 mod/lti/amd/build/external_registration_return.min.js.map create mode 100644 mod/lti/amd/build/form-field.min.js.map create mode 100644 mod/lti/amd/build/keys.min.js.map create mode 100644 mod/lti/amd/build/tool_card_controller.min.js.map create mode 100644 mod/lti/amd/build/tool_configure_controller.min.js.map create mode 100644 mod/lti/amd/build/tool_proxy.min.js.map create mode 100644 mod/lti/amd/build/tool_proxy_card_controller.min.js.map create mode 100644 mod/lti/amd/build/tool_type.min.js.map create mode 100644 mod/quiz/amd/build/add_question_modal_launcher.min.js.map create mode 100644 mod/quiz/amd/build/add_random_form.min.js.map create mode 100644 mod/quiz/amd/build/add_random_question.min.js.map create mode 100644 mod/quiz/amd/build/modal_add_random_question.min.js.map create mode 100644 mod/quiz/amd/build/modal_quiz_question_bank.min.js.map create mode 100644 mod/quiz/amd/build/preflightcheck.min.js.map create mode 100644 mod/quiz/amd/build/quizquestionbank.min.js.map create mode 100644 mod/quiz/amd/build/random_question_form_preview.min.js.map create mode 100644 mod/quiz/amd/build/repaginate.min.js.map create mode 100644 mod/survey/amd/build/validation.min.js.map create mode 100644 mod/workshop/amd/build/modform.min.js.map create mode 100644 mod/workshop/amd/build/workshopview.min.js.map create mode 100644 question/amd/build/edit_tags.min.js.map create mode 100644 question/amd/build/qbankmanager.min.js.map create mode 100644 question/amd/build/repository.min.js.map create mode 100644 question/amd/build/selectors.min.js.map create mode 100644 question/type/ddimageortext/amd/build/form.min.js.map create mode 100644 question/type/ddimageortext/amd/build/question.min.js.map create mode 100644 question/type/ddmarker/amd/build/form.min.js.map create mode 100644 question/type/ddmarker/amd/build/question.min.js.map create mode 100644 question/type/ddmarker/amd/build/shapes.min.js.map create mode 100644 question/type/ddwtos/amd/build/ddwtos.min.js.map create mode 100644 question/type/multichoice/amd/build/clearchoice.min.js.map create mode 100644 report/competency/amd/build/grading_popup.min.js.map create mode 100644 report/competency/amd/build/user_course_navigation.min.js.map create mode 100644 report/insights/amd/build/actions.min.js.map create mode 100644 report/progress/amd/build/completion_override.min.js.map create mode 100644 search/amd/build/form-search-user-selector.min.js.map create mode 100644 theme/boost/amd/build/alert.min.js.map create mode 100644 theme/boost/amd/build/aria.min.js.map create mode 100644 theme/boost/amd/build/button.min.js.map create mode 100644 theme/boost/amd/build/carousel.min.js.map create mode 100644 theme/boost/amd/build/collapse.min.js.map create mode 100644 theme/boost/amd/build/drawer.min.js.map create mode 100644 theme/boost/amd/build/dropdown.min.js.map create mode 100644 theme/boost/amd/build/form-display-errors.min.js.map create mode 100644 theme/boost/amd/build/loader.min.js.map create mode 100644 theme/boost/amd/build/modal.min.js.map create mode 100644 theme/boost/amd/build/pending.min.js.map create mode 100644 theme/boost/amd/build/popover.min.js.map create mode 100644 theme/boost/amd/build/scrollspy.min.js.map create mode 100644 theme/boost/amd/build/tab.min.js.map create mode 100644 theme/boost/amd/build/tether.min.js.map create mode 100644 theme/boost/amd/build/tooltip.min.js.map create mode 100644 theme/boost/amd/build/util.min.js.map create mode 100644 user/amd/build/participants.min.js.map create mode 100644 user/amd/build/status_field.min.js.map create mode 100644 user/amd/build/unified_filter.min.js.map create mode 100644 user/amd/build/unified_filter_datasource.min.js.map diff --git a/admin/tool/analytics/amd/build/log_info.min.js b/admin/tool/analytics/amd/build/log_info.min.js index c2715aa7fcd5c..9b48cc9f4e72c 100644 --- a/admin/tool/analytics/amd/build/log_info.min.js +++ b/admin/tool/analytics/amd/build/log_info.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/modal_factory","core/notification"],function(a,b,c,d){return{loadInfo:function(e,f){var g=a('[data-model-log-id="'+e+'"]');b.get_string("loginfo","tool_analytics").then(function(b){var d=a(""),c.create({title:b,body:d.html(),large:!0},g)})["catch"](d.exception)}}}); \ No newline at end of file +define ("tool_analytics/log_info",["jquery","core/str","core/modal_factory","core/notification"],function(a,b,c,d){return{loadInfo:function loadInfo(e,f){var g=a("[data-model-log-id=\""+e+"\"]");b.get_string("loginfo","tool_analytics").then(function(b){var d=a("");return c.create({title:b,body:d.html(),large:!0},g)}).catch(d.exception)}}}); +//# sourceMappingURL=log_info.min.js.map diff --git a/admin/tool/analytics/amd/build/log_info.min.js.map b/admin/tool/analytics/amd/build/log_info.min.js.map new file mode 100644 index 0000000000000..643ee195028fa --- /dev/null +++ b/admin/tool/analytics/amd/build/log_info.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/log_info.js"],"names":["define","$","str","ModalFactory","Notification","loadInfo","id","info","link","get_string","then","langString","bodyInfo","forEach","item","append","create","title","body","html","large","catch","exception"],"mappings":"AAwBAA,OAAM,2BAAC,CAAC,QAAD,CAAW,UAAX,CAAuB,oBAAvB,CAA6C,mBAA7C,CAAD,CAAoE,SAASC,CAAT,CAAYC,CAAZ,CAAiBC,CAAjB,CAA+BC,CAA/B,CAA6C,CAEnH,MAAoD,CAShDC,QAAQ,CAAE,kBAASC,CAAT,CAAaC,CAAb,CAAmB,CAEzB,GAAIC,CAAAA,CAAI,CAAGP,CAAC,CAAC,wBAAyBK,CAAzB,CAA8B,KAA/B,CAAZ,CACAJ,CAAG,CAACO,UAAJ,CAAe,SAAf,CAA0B,gBAA1B,EAA4CC,IAA5C,CAAiD,SAASC,CAAT,CAAqB,CAElE,GAAIC,CAAAA,CAAQ,CAAGX,CAAC,CAAC,MAAD,CAAhB,CACAM,CAAI,CAACM,OAAL,CAAa,SAASC,CAAT,CAAe,CACxBF,CAAQ,CAACG,MAAT,CAAgB,OAASD,CAAT,CAAgB,OAAhC,CACH,CAFD,EAGAF,CAAQ,CAACG,MAAT,CAAgB,OAAhB,EAEA,MAAOZ,CAAAA,CAAY,CAACa,MAAb,CAAoB,CACvBC,KAAK,CAAEN,CADgB,CAEvBO,IAAI,CAAEN,CAAQ,CAACO,IAAT,EAFiB,CAGvBC,KAAK,GAHkB,CAApB,CAIJZ,CAJI,CAMV,CAdD,EAcGa,KAdH,CAcSjB,CAAY,CAACkB,SAdtB,CAeH,CA3B+C,CA6BvD,CA/BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Shows a dialogue with info about this logs.\n *\n * @module tool_analytics/log_info\n * @class log_info\n * @package tool_analytics\n * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, str, ModalFactory, Notification) {\n\n return /** @alias module:tool_analytics/log_info */ {\n\n /**\n * Prepares a modal info for a log's results.\n *\n * @method loadInfo\n * @param {int} id\n * @param {string[]} info\n */\n loadInfo: function(id, info) {\n\n var link = $('[data-model-log-id=\"' + id + '\"]');\n str.get_string('loginfo', 'tool_analytics').then(function(langString) {\n\n var bodyInfo = $(\"\");\n\n return ModalFactory.create({\n title: langString,\n body: bodyInfo.html(),\n large: true,\n }, link);\n\n }).catch(Notification.exception);\n }\n };\n});\n"],"file":"log_info.min.js"} \ No newline at end of file diff --git a/admin/tool/analytics/amd/build/model.min.js b/admin/tool/analytics/amd/build/model.min.js index 15a5501ef80b3..9cdfe5e6d644d 100644 --- a/admin/tool/analytics/amd/build/model.min.js +++ b/admin/tool/analytics/amd/build/model.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/log","core/notification","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,e,f,g){var h={clear:{title:{key:"clearpredictions",component:"tool_analytics"},body:{key:"clearmodelpredictions",component:"tool_analytics"}},"delete":{title:{key:"delete",component:"tool_analytics"},body:{key:"deletemodelconfirmation",component:"tool_analytics"}}},i=function(b){var d=a(b).closest("[data-model-name]");return d.length?d.attr("data-model-name"):(c.error("Unexpected DOM error - unable to obtain the model name"),"")};return{confirmAction:function(g,j){a('[data-action-id="'+g+'"]').on("click",function(g){g.preventDefault();var k=a(g.currentTarget);if("undefined"==typeof h[j])return void c.error('Action "'+j+'" is not allowed.');var l=[h[j].title,h[j].body];l[1].param=i(k);var m=b.get_strings(l),n=e.create({type:e.types.SAVE_CANCEL});a.when(m,n).then(function(a,b){return b.setTitle(a[0]),b.setBody(a[1]),b.setSaveButtonText(a[0]),b.getRoot().on(f.save,function(){window.location.href=k.attr("href")}),b.show(),b}).fail(d.exception)})},selectEvaluationOptions:function(c,h,i){a('[data-action-id="'+c+'"]').on("click",function(c){c.preventDefault();var j=a(c.currentTarget),k=b.get_strings([{key:"evaluatemodel",component:"tool_analytics"},{key:"evaluate",component:"tool_analytics"}]),l=e.create({type:e.types.SAVE_CANCEL}),m=g.render("tool_analytics/evaluation_options",{trainedexternally:h,timesplittingmethods:i});a.when(k,l).then(function(b,c){return c.getRoot().on(f.hidden,c.destroy.bind(c)),c.setTitle(b[0]),c.setSaveButtonText(b[1]),c.setBody(m),c.getRoot().on(f.save,function(){var b=a("input[name='evaluationmode']:checked").val();"trainedmodel"==b&&j.attr("href",j.attr("href")+"&mode=trainedmodel");var c=a("#id-evaluation-timesplitting").val();j.attr("href",j.attr("href")+"×plitting="+c),window.location.href=j.attr("href")}),c.show(),c}).fail(d.exception)})},selectExportOptions:function(c,h){a('[data-action-id="'+c+'"]').on("click",function(c){c.preventDefault();var i=a(c.currentTarget);if(!h)return i.attr("href",i.attr("href")+"&action=exportmodel&includeweights=0"),void(window.location.href=i.attr("href"));var j=b.get_strings([{key:"export",component:"tool_analytics"}]),k=e.create({type:e.types.SAVE_CANCEL}),l=g.render("tool_analytics/export_options",{});a.when(j,k).then(function(b,c){return c.getRoot().on(f.hidden,c.destroy.bind(c)),c.setTitle(b[0]),c.setSaveButtonText(b[0]),c.setBody(l),c.getRoot().on(f.save,function(){var b=a("input[name='exportoption']:checked").val();"exportdata"==b?i.attr("href",i.attr("href")+"&action=exportdata"):(i.attr("href",i.attr("href")+"&action=exportmodel"),a("#id-includeweights").is(":checked")?i.attr("href",i.attr("href")+"&includeweights=1"):i.attr("href",i.attr("href")+"&includeweights=0")),window.location.href=i.attr("href")}),c.show(),c}).fail(d.exception)})}}}); \ No newline at end of file +define ("tool_analytics/model",["jquery","core/str","core/log","core/notification","core/modal_factory","core/modal_events","core/templates"],function(b,c,d,e,f,g,h){var i={clear:{title:{key:"clearpredictions",component:"tool_analytics"},body:{key:"clearmodelpredictions",component:"tool_analytics"}},delete:{title:{key:"delete",component:"tool_analytics"},body:{key:"deletemodelconfirmation",component:"tool_analytics"}}},j=function(a){var c=b(a).closest("[data-model-name]");if(c.length){return c.attr("data-model-name")}else{d.error("Unexpected DOM error - unable to obtain the model name");return""}};return{confirmAction:function confirmAction(a,h){b("[data-action-id=\""+a+"\"]").on("click",function(k){k.preventDefault();var l=b(k.currentTarget);if("undefined"==typeof i[h]){d.error("Action \""+h+"\" is not allowed.");return}var a=[i[h].title,i[h].body];a[1].param=j(l);var m=c.get_strings(a),n=f.create({type:f.types.SAVE_CANCEL});b.when(m,n).then(function(a,b){b.setTitle(a[0]);b.setBody(a[1]);b.setSaveButtonText(a[0]);b.getRoot().on(g.save,function(){window.location.href=l.attr("href")});b.show();return b}).fail(e.exception)})},selectEvaluationOptions:function selectEvaluationOptions(a,d,i){b("[data-action-id=\""+a+"\"]").on("click",function(j){j.preventDefault();var k=b(j.currentTarget),a=c.get_strings([{key:"evaluatemodel",component:"tool_analytics"},{key:"evaluate",component:"tool_analytics"}]),l=f.create({type:f.types.SAVE_CANCEL}),m=h.render("tool_analytics/evaluation_options",{trainedexternally:d,timesplittingmethods:i});b.when(a,l).then(function(a,c){c.getRoot().on(g.hidden,c.destroy.bind(c));c.setTitle(a[0]);c.setSaveButtonText(a[1]);c.setBody(m);c.getRoot().on(g.save,function(){var a=b("input[name='evaluationmode']:checked").val();if("trainedmodel"==a){k.attr("href",k.attr("href")+"&mode=trainedmodel")}var c=b("#id-evaluation-timesplitting").val();k.attr("href",k.attr("href")+"×plitting="+c);window.location.href=k.attr("href")});c.show();return c}).fail(e.exception)})},selectExportOptions:function selectExportOptions(a,d){b("[data-action-id=\""+a+"\"]").on("click",function(i){i.preventDefault();var j=b(i.currentTarget);if(!d){j.attr("href",j.attr("href")+"&action=exportmodel&includeweights=0");window.location.href=j.attr("href");return}var a=c.get_strings([{key:"export",component:"tool_analytics"}]),k=f.create({type:f.types.SAVE_CANCEL}),l=h.render("tool_analytics/export_options",{});b.when(a,k).then(function(a,c){c.getRoot().on(g.hidden,c.destroy.bind(c));c.setTitle(a[0]);c.setSaveButtonText(a[0]);c.setBody(l);c.getRoot().on(g.save,function(){var a=b("input[name='exportoption']:checked").val();if("exportdata"==a){j.attr("href",j.attr("href")+"&action=exportdata")}else{j.attr("href",j.attr("href")+"&action=exportmodel");if(b("#id-includeweights").is(":checked")){j.attr("href",j.attr("href")+"&includeweights=1")}else{j.attr("href",j.attr("href")+"&includeweights=0")}}window.location.href=j.attr("href")});c.show();return c}).fail(e.exception)})}}}); +//# sourceMappingURL=model.min.js.map diff --git a/admin/tool/analytics/amd/build/model.min.js.map b/admin/tool/analytics/amd/build/model.min.js.map new file mode 100644 index 0000000000000..fab51a0a77dfa --- /dev/null +++ b/admin/tool/analytics/amd/build/model.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/model.js"],"names":["define","$","Str","log","Notification","ModalFactory","ModalEvents","Templates","actionsList","clear","title","key","component","body","getModelName","actionItem","wrap","closest","length","attr","error","confirmAction","actionId","actionType","on","ev","preventDefault","a","currentTarget","reqStrings","param","stringsPromise","get_strings","modalPromise","create","type","types","SAVE_CANCEL","when","then","strings","modal","setTitle","setBody","setSaveButtonText","getRoot","save","window","location","href","show","fail","exception","selectEvaluationOptions","trainedOnlyExternally","timeSplittingMethods","bodyPromise","render","trainedexternally","timesplittingmethods","hidden","destroy","bind","evaluationMode","val","timeSplittingMethod","selectExportOptions","isTrained","exportOption","is"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD module for model actions confirmation.\n *\n * @module tool_analytics/model\n * @copyright 2017 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/log', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/templates'],\n function($, Str, log, Notification, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of actions that require confirmation and confirmation message.\n */\n var actionsList = {\n clear: {\n title: {\n key: 'clearpredictions',\n component: 'tool_analytics'\n }, body: {\n key: 'clearmodelpredictions',\n component: 'tool_analytics'\n }\n\n },\n 'delete': {\n title: {\n key: 'delete',\n component: 'tool_analytics'\n }, body: {\n key: 'deletemodelconfirmation',\n component: 'tool_analytics'\n }\n }\n };\n\n /**\n * Returns the model name.\n *\n * @param {Object} actionItem The action item DOM node.\n * @return {String}\n */\n var getModelName = function(actionItem) {\n var wrap = $(actionItem).closest('[data-model-name]');\n\n if (wrap.length) {\n return wrap.attr('data-model-name');\n\n } else {\n log.error('Unexpected DOM error - unable to obtain the model name');\n return '';\n }\n };\n\n /** @alias module:tool_analytics/model */\n return {\n\n /**\n * Displays a confirm modal window before executing the action.\n *\n * @param {String} actionId\n * @param {String} actionType\n */\n confirmAction: function(actionId, actionType) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (typeof actionsList[actionType] === \"undefined\") {\n log.error('Action \"' + actionType + '\" is not allowed.');\n return;\n }\n\n var reqStrings = [\n actionsList[actionType].title,\n actionsList[actionType].body\n ];\n reqStrings[1].param = getModelName(a);\n\n var stringsPromise = Str.get_strings(reqStrings);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n modal.setTitle(strings[0]);\n modal.setBody(strings[1]);\n modal.setSaveButtonText(strings[0]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = a.attr('href');\n });\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays evaluation mode and time-splitting method choices.\n *\n * @param {String} actionId\n * @param {Boolean} trainedOnlyExternally\n */\n selectEvaluationOptions: function(actionId, trainedOnlyExternally, timeSplittingMethods) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n var stringsPromise = Str.get_strings([\n {\n key: 'evaluatemodel',\n component: 'tool_analytics'\n }, {\n key: 'evaluate',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/evaluation_options', {\n trainedexternally: trainedOnlyExternally,\n timesplittingmethods: timeSplittingMethods\n });\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[1]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n // Evaluation mode.\n var evaluationMode = $(\"input[name='evaluationmode']:checked\").val();\n if (evaluationMode == 'trainedmodel') {\n a.attr('href', a.attr('href') + '&mode=trainedmodel');\n }\n\n // Selected time-splitting id.\n var timeSplittingMethod = $(\"#id-evaluation-timesplitting\").val();\n a.attr('href', a.attr('href') + '×plitting=' + timeSplittingMethod);\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n },\n\n /**\n * Displays export options.\n *\n * We have two main options: export training data and export configuration.\n * The 2nd option has an extra option: include the trained algorithm weights.\n *\n * @param {String} actionId\n * @param {Boolean} isTrained\n */\n selectExportOptions: function(actionId, isTrained) {\n $('[data-action-id=\"' + actionId + '\"]').on('click', function(ev) {\n ev.preventDefault();\n\n var a = $(ev.currentTarget);\n\n if (!isTrained) {\n // Export the model configuration if the model is not trained. We can't export anything else.\n a.attr('href', a.attr('href') + '&action=exportmodel&includeweights=0');\n window.location.href = a.attr('href');\n return;\n }\n\n var stringsPromise = Str.get_strings([\n {\n key: 'export',\n component: 'tool_analytics'\n }\n ]);\n var modalPromise = ModalFactory.create({type: ModalFactory.types.SAVE_CANCEL});\n var bodyPromise = Templates.render('tool_analytics/export_options', {});\n\n $.when(stringsPromise, modalPromise).then(function(strings, modal) {\n\n modal.getRoot().on(ModalEvents.hidden, modal.destroy.bind(modal));\n\n modal.setTitle(strings[0]);\n modal.setSaveButtonText(strings[0]);\n modal.setBody(bodyPromise);\n\n modal.getRoot().on(ModalEvents.save, function() {\n\n var exportOption = $(\"input[name='exportoption']:checked\").val();\n\n if (exportOption == 'exportdata') {\n a.attr('href', a.attr('href') + '&action=exportdata');\n\n } else {\n a.attr('href', a.attr('href') + '&action=exportmodel');\n if ($(\"#id-includeweights\").is(':checked')) {\n a.attr('href', a.attr('href') + '&includeweights=1');\n } else {\n a.attr('href', a.attr('href') + '&includeweights=0');\n }\n }\n\n window.location.href = a.attr('href');\n return;\n });\n\n modal.show();\n return modal;\n }).fail(Notification.exception);\n });\n }\n };\n});\n"],"file":"model.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/add_category.min.js b/admin/tool/dataprivacy/amd/build/add_category.min.js index 92cd4ee84550f..52f6aeb8fb0b3 100644 --- a/admin/tool/dataprivacy/amd/build/add_category.min.js +++ b/admin/tool/dataprivacy/amd/build/add_category.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={CATEGORY_LINK:'[data-add-element="category"]'},i=function(a){this.contextId=a;var c=[{key:"addcategory",component:"tool_dataprivacy"},{key:"save",component:"admin"}];this.strings=b.get_strings(c),this.registerEventListeners()};return i.prototype.contextId=0,i.prototype.strings=0,i.prototype.registerEventListeners=function(){var b=a(h.CATEGORY_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))},i.prototype.getBody=function(a){var b=null;return"undefined"!=typeof a&&(b={jsonformdata:JSON.stringify(a)}),g.loadFragment("tool_dataprivacy","addcategory_form",this.contextId,b)},i.prototype.setupFormModal=function(a,b){a.setLarge(),a.setSaveButtonText(b),a.getRoot().on(f.hidden,this.destroy.bind(this)),a.setBody(this.getBody()),a.getRoot().on(f.save,this.submitForm.bind(this)),a.getRoot().on("submit","form",this.submitFormAjax.bind(this)),this.modal=a,a.show()},i.prototype.submitForm=function(a){a.preventDefault(),this.modal.getRoot().find("form").submit()},i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_category_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){a.validationerrors?this.modal.setBody(this.getBody(b)):this.close()}.bind(this),fail:d.exception}])},i.prototype.close=function(){this.destroy(),document.location.reload()},i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()}),this.modal.destroy()},i.prototype.removeListeners=function(){a(h.CATEGORY_LINK).off("click")},{getInstance:function(a){return new i(a)}}}); \ No newline at end of file +define ("tool_dataprivacy/add_category",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={CATEGORY_LINK:"[data-add-element=\"category\"]"},i=function(a){this.contextId=a;this.strings=b.get_strings([{key:"addcategory",component:"tool_dataprivacy"},{key:"save",component:"admin"}]);this.registerEventListeners()};i.prototype.contextId=0;i.prototype.strings=0;i.prototype.registerEventListeners=function(){var b=a(h.CATEGORY_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))};i.prototype.getBody=function(a){var b=null;if("undefined"!=typeof a){b={jsonformdata:JSON.stringify(a)}}return g.loadFragment("tool_dataprivacy","addcategory_form",this.contextId,b)};i.prototype.setupFormModal=function(a,b){a.setLarge();a.setSaveButtonText(b);a.getRoot().on(f.hidden,this.destroy.bind(this));a.setBody(this.getBody());a.getRoot().on(f.save,this.submitForm.bind(this));a.getRoot().on("submit","form",this.submitFormAjax.bind(this));this.modal=a;a.show()};i.prototype.submitForm=function(a){a.preventDefault();this.modal.getRoot().find("form").submit()};i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_category_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){if(a.validationerrors){this.modal.setBody(this.getBody(b))}else{this.close()}}.bind(this),fail:d.exception}])};i.prototype.close=function(){this.destroy();document.location.reload()};i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()});this.modal.destroy()};i.prototype.removeListeners=function(){a(h.CATEGORY_LINK).off("click")};return{getInstance:function getInstance(a){return new i(a)}}}); +//# sourceMappingURL=add_category.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/add_category.min.js.map b/admin/tool/dataprivacy/amd/build/add_category.min.js.map new file mode 100644 index 0000000000000..718f655441242 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/add_category.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/add_category.js"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","CATEGORY_LINK","AddCategory","contextId","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to add categories.\n *\n * @module tool_dataprivacy/add_category\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n CATEGORY_LINK: '[data-add-element=\"category\"]',\n };\n\n var AddCategory = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addcategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddCategory.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddCategory.prototype.strings = 0;\n\n AddCategory.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.CATEGORY_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddCategory.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addcategory_form', this.contextId, params);\n };\n\n AddCategory.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddCategory.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddCategory.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_category_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n AddCategory.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddCategory.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddCategory.prototype.removeListeners = function() {\n $(SELECTORS.CATEGORY_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_category */ {\n getInstance: function(contextId) {\n return new AddCategory(contextId);\n }\n };\n }\n);\n\n"],"file":"add_category.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/add_purpose.min.js b/admin/tool/dataprivacy/amd/build/add_purpose.min.js index dec27cc14aa17..d3bcb8b901b6a 100644 --- a/admin/tool/dataprivacy/amd/build/add_purpose.min.js +++ b/admin/tool/dataprivacy/amd/build/add_purpose.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={PURPOSE_LINK:'[data-add-element="purpose"]'},i=function(a){this.contextId=a;var c=[{key:"addpurpose",component:"tool_dataprivacy"},{key:"save",component:"admin"}];this.strings=b.get_strings(c),this.registerEventListeners()};return i.prototype.contextId=0,i.prototype.strings=0,i.prototype.registerEventListeners=function(){var b=a(h.PURPOSE_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))},i.prototype.getBody=function(a){var b=null;return"undefined"!=typeof a&&(b={jsonformdata:JSON.stringify(a)}),g.loadFragment("tool_dataprivacy","addpurpose_form",this.contextId,b)},i.prototype.setupFormModal=function(a,b){a.setLarge(),a.setSaveButtonText(b),a.getRoot().on(f.hidden,this.destroy.bind(this)),a.setBody(this.getBody()),a.getRoot().on(f.save,this.submitForm.bind(this)),a.getRoot().on("submit","form",this.submitFormAjax.bind(this)),this.modal=a,a.show()},i.prototype.submitForm=function(a){a.preventDefault(),this.modal.getRoot().find("form").submit()},i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_purpose_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){a.validationerrors?this.modal.setBody(this.getBody(b)):this.close()}.bind(this),fail:d.exception}])},i.prototype.close=function(){this.destroy(),document.location.reload()},i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()}),this.modal.destroy()},i.prototype.removeListeners=function(){a(h.PURPOSE_LINK).off("click")},{getInstance:function(a){return new i(a)}}}); \ No newline at end of file +define ("tool_dataprivacy/add_purpose",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={PURPOSE_LINK:"[data-add-element=\"purpose\"]"},i=function(a){this.contextId=a;this.strings=b.get_strings([{key:"addpurpose",component:"tool_dataprivacy"},{key:"save",component:"admin"}]);this.registerEventListeners()};i.prototype.contextId=0;i.prototype.strings=0;i.prototype.registerEventListeners=function(){var b=a(h.PURPOSE_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))};i.prototype.getBody=function(a){var b=null;if("undefined"!=typeof a){b={jsonformdata:JSON.stringify(a)}}return g.loadFragment("tool_dataprivacy","addpurpose_form",this.contextId,b)};i.prototype.setupFormModal=function(a,b){a.setLarge();a.setSaveButtonText(b);a.getRoot().on(f.hidden,this.destroy.bind(this));a.setBody(this.getBody());a.getRoot().on(f.save,this.submitForm.bind(this));a.getRoot().on("submit","form",this.submitFormAjax.bind(this));this.modal=a;a.show()};i.prototype.submitForm=function(a){a.preventDefault();this.modal.getRoot().find("form").submit()};i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_purpose_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){if(a.validationerrors){this.modal.setBody(this.getBody(b))}else{this.close()}}.bind(this),fail:d.exception}])};i.prototype.close=function(){this.destroy();document.location.reload()};i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()});this.modal.destroy()};i.prototype.removeListeners=function(){a(h.PURPOSE_LINK).off("click")};return{getInstance:function getInstance(a){return new i(a)}}}); +//# sourceMappingURL=add_purpose.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map b/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map new file mode 100644 index 0000000000000..aabef23b184f4 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/add_purpose.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/add_purpose.js"],"names":["define","$","Str","Ajax","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","PURPOSE_LINK","AddPurpose","contextId","strings","get_strings","key","component","registerEventListeners","prototype","trigger","on","then","create","type","types","SAVE_CANCEL","title","body","done","modal","setupFormModal","bind","fail","exception","getBody","formdata","params","jsonformdata","JSON","stringify","loadFragment","saveText","setLarge","setSaveButtonText","getRoot","hidden","destroy","setBody","save","submitForm","submitFormAjax","show","e","preventDefault","find","submit","formData","serialize","call","methodname","args","data","validationerrors","close","document","location","reload","Y","use","M","core_formchangechecker","reset_form_dirty_state","removeListeners","off","getInstance"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to add purposes.\n *\n * @module tool_dataprivacy/add_purpose\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/modal_factory', 'core/modal_events', 'core/fragment'],\n function($, Str, Ajax, Notification, ModalFactory, ModalEvents, Fragment) {\n\n var SELECTORS = {\n PURPOSE_LINK: '[data-add-element=\"purpose\"]',\n };\n\n var AddPurpose = function(contextId) {\n this.contextId = contextId;\n\n var stringKeys = [\n {\n key: 'addpurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'save',\n component: 'admin'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n };\n\n /**\n * @var {int} contextId\n * @private\n */\n AddPurpose.prototype.contextId = 0;\n\n /**\n * @var {Promise}\n * @private\n */\n AddPurpose.prototype.strings = 0;\n\n AddPurpose.prototype.registerEventListeners = function() {\n\n var trigger = $(SELECTORS.PURPOSE_LINK);\n trigger.on('click', function() {\n return this.strings.then(function(strings) {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: strings[0],\n body: '',\n }, trigger).done(function(modal) {\n this.setupFormModal(modal, strings[1]);\n }.bind(this));\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this));\n\n };\n\n /**\n * @method getBody\n * @param {Object} formdata\n * @private\n * @return {Promise}\n */\n AddPurpose.prototype.getBody = function(formdata) {\n\n var params = null;\n if (typeof formdata !== \"undefined\") {\n params = {jsonformdata: JSON.stringify(formdata)};\n }\n // Get the content of the modal.\n return Fragment.loadFragment('tool_dataprivacy', 'addpurpose_form', this.contextId, params);\n };\n\n AddPurpose.prototype.setupFormModal = function(modal, saveText) {\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody());\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n this.modal = modal;\n\n modal.show();\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AddPurpose.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n AddPurpose.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_create_purpose_form',\n args: {jsonformdata: JSON.stringify(formData)},\n done: function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this),\n\n fail: Notification.exception\n }]);\n };\n\n AddPurpose.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n AddPurpose.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n };\n\n AddPurpose.prototype.removeListeners = function() {\n $(SELECTORS.PURPOSE_LINK).off('click');\n };\n\n return /** @alias module:tool_dataprivacy/add_purpose */ {\n getInstance: function(contextId) {\n return new AddPurpose(contextId);\n }\n };\n }\n);\n\n"],"file":"add_purpose.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js index cac33a4329791..0b47fca7d372f 100644 --- a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js +++ b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:'[data-action="deletecategory"]'},h=function(){this.registerEvents()};return h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name"),j=[{key:"deletecategory",component:"tool_dataprivacy"},{key:"deletecategorytext",component:"tool_dataprivacy",param:i},{key:"delete"}];d.get_strings(j).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){return d.setSaveButtonText(j),d.getRoot().on(f.save,function(){var d={methodname:"tool_dataprivacy_delete_category",args:{id:h}};b.call([d])[0].done(function(b){b.result?a('tr[data-categoryid="'+h+'"]').remove():c.addNotification({message:b.warnings[0].message,type:"error"})}).fail(c.exception)}),d.getRoot().on(f.hidden,function(){d.destroy()}),d})}).done(function(a){a.show()}).fail(c.exception)})},{init:function(){return new h}}}); \ No newline at end of file +define ("tool_dataprivacy/categoriesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:"[data-action=\"deletecategory\"]"},h=function(){this.registerEvents()};h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name");d.get_strings([{key:"deletecategory",component:"tool_dataprivacy"},{key:"deletecategorytext",component:"tool_dataprivacy",param:i},{key:"delete"}]).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){d.setSaveButtonText(j);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_delete_category",args:{id:h}}])[0].done(function(b){if(b.result){a("tr[data-categoryid=\""+h+"\"]").remove()}else{c.addNotification({message:b.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d})}).done(function(a){a.show()}).fail(c.exception)})};return{init:function init(){return new h}}}); +//# sourceMappingURL=categoriesactions.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map new file mode 100644 index 0000000000000..b88fd11935e88 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/categoriesactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/categoriesactions.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","DELETE","CategoriesActions","registerEvents","prototype","click","e","preventDefault","id","data","categoryname","get_strings","key","component","param","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","call","methodname","args","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD module for categories actions.\n *\n * @module tool_dataprivacy/categoriesactions\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletecategory\"]',\n };\n\n /**\n * CategoriesActions class.\n */\n var CategoriesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n CategoriesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var categoryname = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletecategory',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletecategorytext',\n component: 'tool_dataprivacy',\n param: categoryname\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_category',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-categoryid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/categoriesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {CategoriesActions}\n */\n 'init': function() {\n return new CategoriesActions();\n }\n };\n});\n"],"file":"categoriesactions.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_deletion.min.js b/admin/tool/dataprivacy/amd/build/data_deletion.min.js index 5aa1e48e6a0c5..88f9f42ce4178 100644 --- a/admin/tool/dataprivacy/amd/build/data_deletion.min.js +++ b/admin/tool/dataprivacy/amd/build/data_deletion.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){function g(a){var g=[{key:"confirm",component:"moodle"},{key:"confirmcontextdeletion",component:"tool_dataprivacy"}],h="tool_dataprivacy_confirm_contexts_for_deletion",i="";d.get_strings(g).then(function(a){i=a[0];var b=a[1];return e.create({title:i,body:b,type:e.types.SAVE_CANCEL})}).then(function(d){return d.setSaveButtonText(i),d.getRoot().on(f.save,function(){var d={ids:a},e={methodname:h,args:d};b.call([e])[0].done(function(a){a.result?window.location.reload():c.addNotification({message:a.warnings[0].message,type:"error"})}).fail(c.exception)}),d.getRoot().on(f.hidden,function(){d.destroy()}),d}).done(function(a){a.show()}).fail(c.exception)}var h={MARK_FOR_DELETION:'[data-action="markfordeletion"]',SELECT_ALL:'[data-action="selectall"]'},i={SELECTCONTEXT:".selectcontext"},j=function(){this.registerEvents()};return j.prototype.registerEvents=function(){a(h.MARK_FOR_DELETION).click(function(b){b.preventDefault();var c=[];a(i.SELECTCONTEXT).each(function(){var b=a(this);b.is(":checked")&&c.push(b.val())}),g(c)}),a(h.SELECT_ALL).change(function(b){b.preventDefault();var c=a(this);c.is(":checked")?a(i.SELECTCONTEXT).attr("checked","checked"):a(i.SELECTCONTEXT).removeAttr("checked")})},j}); \ No newline at end of file +define ("tool_dataprivacy/data_deletion",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var h={MARK_FOR_DELETION:"[data-action=\"markfordeletion\"]",SELECT_ALL:"[data-action=\"selectall\"]"},i={SELECTCONTEXT:".selectcontext"},j=function(){this.registerEvents()};j.prototype.registerEvents=function(){a(h.MARK_FOR_DELETION).click(function(b){b.preventDefault();var c=[];a(i.SELECTCONTEXT).each(function(){var b=a(this);if(b.is(":checked")){c.push(b.val())}});g(c)});a(h.SELECT_ALL).change(function(b){b.preventDefault();var c=a(this);if(c.is(":checked")){a(i.SELECTCONTEXT).attr("checked","checked")}else{a(i.SELECTCONTEXT).removeAttr("checked")}})};function g(a){var g="";d.get_strings([{key:"confirm",component:"moodle"},{key:"confirmcontextdeletion",component:"tool_dataprivacy"}]).then(function(a){g=a[0];var b=a[1];return e.create({title:g,body:b,type:e.types.SAVE_CANCEL})}).then(function(d){d.setSaveButtonText(g);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_confirm_contexts_for_deletion",args:{ids:a}}])[0].done(function(a){if(a.result){window.location.reload()}else{c.addNotification({message:a.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d}).done(function(a){a.show()}).fail(c.exception)}return j}); +//# sourceMappingURL=data_deletion.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map b/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map new file mode 100644 index 0000000000000..6933bcc4cf99c --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/data_deletion.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/data_deletion.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","MARK_FOR_DELETION","SELECT_ALL","SELECTORS","SELECTCONTEXT","DataDeletionActions","registerEvents","prototype","click","e","preventDefault","selectedIds","each","checkbox","is","push","val","showConfirmation","change","selectallnone","attr","removeAttr","ids","modalTitle","get_strings","key","component","then","langStrings","confirmMessage","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","call","methodname","args","done","data","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show"],"mappings":"AAuBAA,OAAM,kCAAC,CACH,QADG,CAEH,WAFG,CAGH,mBAHG,CAIH,UAJG,CAKH,oBALG,CAMH,mBANG,CAAD,CAON,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgCC,CAAhC,CAAqCC,CAArC,CAAmDC,CAAnD,CAAgE,IAQxDC,CAAAA,CAAO,CAAG,CACVC,iBAAiB,CAAE,mCADT,CAEVC,UAAU,CAAE,6BAFF,CAR8C,CAkBxDC,CAAS,CAAG,CACZC,aAAa,CAAE,gBADH,CAlB4C,CAyBxDC,CAAmB,CAAG,UAAW,CACjC,KAAKC,cAAL,EACH,CA3B2D,CAgC5DD,CAAmB,CAACE,SAApB,CAA8BD,cAA9B,CAA+C,UAAW,CACtDZ,CAAC,CAACM,CAAO,CAACC,iBAAT,CAAD,CAA6BO,KAA7B,CAAmC,SAASC,CAAT,CAAY,CAC3CA,CAAC,CAACC,cAAF,GAEA,GAAIC,CAAAA,CAAW,CAAG,EAAlB,CACAjB,CAAC,CAACS,CAAS,CAACC,aAAX,CAAD,CAA2BQ,IAA3B,CAAgC,UAAW,CACvC,GAAIC,CAAAA,CAAQ,CAAGnB,CAAC,CAAC,IAAD,CAAhB,CACA,GAAImB,CAAQ,CAACC,EAAT,CAAY,UAAZ,CAAJ,CAA6B,CACzBH,CAAW,CAACI,IAAZ,CAAiBF,CAAQ,CAACG,GAAT,EAAjB,CACH,CACJ,CALD,EAMAC,CAAgB,CAACN,CAAD,CACnB,CAXD,EAaAjB,CAAC,CAACM,CAAO,CAACE,UAAT,CAAD,CAAsBgB,MAAtB,CAA6B,SAAST,CAAT,CAAY,CACrCA,CAAC,CAACC,cAAF,GAEA,GAAIS,CAAAA,CAAa,CAAGzB,CAAC,CAAC,IAAD,CAArB,CACA,GAAIyB,CAAa,CAACL,EAAd,CAAiB,UAAjB,CAAJ,CAAkC,CAC9BpB,CAAC,CAACS,CAAS,CAACC,aAAX,CAAD,CAA2BgB,IAA3B,CAAgC,SAAhC,CAA2C,SAA3C,CACH,CAFD,IAEO,CACH1B,CAAC,CAACS,CAAS,CAACC,aAAX,CAAD,CAA2BiB,UAA3B,CAAsC,SAAtC,CACH,CACJ,CATD,CAUH,CAxBD,CA+BA,QAASJ,CAAAA,CAAT,CAA0BK,CAA1B,CAA+B,IAavBC,CAAAA,CAAU,CAAG,EAbU,CAc3B1B,CAAG,CAAC2B,WAAJ,CAbW,CACP,CACIC,GAAG,CAAE,SADT,CAEIC,SAAS,CAAE,QAFf,CADO,CAKP,CACID,GAAG,CAAE,wBADT,CAEIC,SAAS,CAAE,kBAFf,CALO,CAaX,EAAsBC,IAAtB,CAA2B,SAASC,CAAT,CAAsB,CAC7CL,CAAU,CAAGK,CAAW,CAAC,CAAD,CAAxB,CACA,GAAIC,CAAAA,CAAc,CAAGD,CAAW,CAAC,CAAD,CAAhC,CACA,MAAO9B,CAAAA,CAAY,CAACgC,MAAb,CAAoB,CACvBC,KAAK,CAAER,CADgB,CAEvBS,IAAI,CAAEH,CAFiB,CAGvBI,IAAI,CAAEnC,CAAY,CAACoC,KAAb,CAAmBC,WAHF,CAApB,CAKV,CARD,EAQGR,IARH,CAQQ,SAASS,CAAT,CAAgB,CACpBA,CAAK,CAACC,iBAAN,CAAwBd,CAAxB,EAGAa,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBxC,CAAW,CAACyC,IAA/B,CAAqC,UAAW,CAW5C7C,CAAI,CAAC8C,IAAL,CAAU,CALI,CACVC,UAAU,CAtBL,gDAqBK,CAEVC,IAAI,CANK,CACT,IAAOrB,CADE,CAIC,CAKJ,CAAV,EAAqB,CAArB,EAAwBsB,IAAxB,CAA6B,SAASC,CAAT,CAAe,CACxC,GAAIA,CAAI,CAACC,MAAT,CAAiB,CACbC,MAAM,CAACC,QAAP,CAAgBC,MAAhB,EACH,CAFD,IAEO,CACHrD,CAAY,CAACsD,eAAb,CAA6B,CACzBC,OAAO,CAAEN,CAAI,CAACO,QAAL,CAAc,CAAd,EAAiBD,OADD,CAEzBlB,IAAI,CAAE,OAFmB,CAA7B,CAIH,CACJ,CATD,EASGoB,IATH,CASQzD,CAAY,CAAC0D,SATrB,CAUH,CArBD,EAwBAlB,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBxC,CAAW,CAACwD,MAA/B,CAAuC,UAAW,CAE9CnB,CAAK,CAACoB,OAAN,EACH,CAHD,EAKA,MAAOpB,CAAAA,CACV,CA1CD,EA0CGQ,IA1CH,CA0CQ,SAASR,CAAT,CAAgB,CACpBA,CAAK,CAACqB,IAAN,EACH,CA5CD,EA4CGJ,IA5CH,CA4CQzD,CAAY,CAAC0D,SA5CrB,CA6CH,CAED,MAAOjD,CAAAA,CACV,CApIK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Request actions.\n *\n * @module tool_dataprivacy/data_deletion\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{MARK_FOR_DELETION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n MARK_FOR_DELETION: '[data-action=\"markfordeletion\"]',\n SELECT_ALL: '[data-action=\"selectall\"]',\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECTCONTEXT: string}}\n */\n var SELECTORS = {\n SELECTCONTEXT: '.selectcontext',\n };\n\n /**\n * DataDeletionActions class.\n */\n var DataDeletionActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DataDeletionActions.prototype.registerEvents = function() {\n $(ACTIONS.MARK_FOR_DELETION).click(function(e) {\n e.preventDefault();\n\n var selectedIds = [];\n $(SELECTORS.SELECTCONTEXT).each(function() {\n var checkbox = $(this);\n if (checkbox.is(':checked')) {\n selectedIds.push(checkbox.val());\n }\n });\n showConfirmation(selectedIds);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectallnone = $(this);\n if (selectallnone.is(':checked')) {\n $(SELECTORS.SELECTCONTEXT).attr('checked', 'checked');\n } else {\n $(SELECTORS.SELECTCONTEXT).removeAttr('checked');\n }\n });\n };\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {Array} ids The array of expired context record IDs.\n */\n function showConfirmation(ids) {\n var keys = [\n {\n key: 'confirm',\n component: 'moodle'\n },\n {\n key: 'confirmcontextdeletion',\n component: 'tool_dataprivacy'\n }\n ];\n var wsfunction = 'tool_dataprivacy_confirm_contexts_for_deletion';\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Confirm the request.\n var params = {\n 'ids': ids\n };\n\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n }).done(function(modal) {\n modal.show();\n }).fail(Notification.exception);\n }\n\n return DataDeletionActions;\n});\n"],"file":"data_deletion.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_registry.min.js b/admin/tool/dataprivacy/amd/build/data_registry.min.js index f2964fe3284ad..85868edb04a06 100644 --- a/admin/tool/dataprivacy/amd/build/data_registry.min.js +++ b/admin/tool/dataprivacy/amd/build/data_registry.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/ajax","core/notification","core/templates","core/modal_factory","core/modal_events","core/fragment","tool_dataprivacy/add_purpose","tool_dataprivacy/add_category"],function(a,b,c,d,e,f,g,h,i,j){var k={TREE_NODES:"[data-context-tree-node=1]",FORM_CONTAINER:"#context-form-container"},l=function(a,b,c){this.systemContextId=a,this.currentContextLevel=b,this.currentContextId=c,this.init()};return l.prototype.systemContextId=0,l.prototype.currentContextLevel=0,l.prototype.currentContextId=0,l.prototype.addpurpose=null,l.prototype.addcategory=null,l.prototype.init=function(){this.addpurpose=i.getInstance(this.systemContextId),this.addcategory=j.getInstance(this.systemContextId);var a=[{key:"changessaved",component:"moodle"},{key:"contextpurposecategorysaved",component:"tool_dataprivacy"},{key:"noblockstoload",component:"tool_dataprivacy"},{key:"noactivitiestoload",component:"tool_dataprivacy"},{key:"nocoursestoload",component:"tool_dataprivacy"}];this.strings=b.get_strings(a),this.registerEventListeners(),this.currentContextId?this.loadForm("context_form",[this.currentContextId],this.submitContextFormAjax.bind(this)):this.loadForm("contextlevel_form",[this.currentContextLevel],this.submitContextLevelFormAjax.bind(this))},l.prototype.registerEventListeners=function(){a(k.TREE_NODES).on("click",function(b){b.preventDefault();var c=a(b.currentTarget);a(k.TREE_NODES).removeClass("active"),c.addClass("active");var d=c.data("contextlevel"),e=c.data("contextid");if(d)window.history.pushState({},null,"?contextlevel="+d),this.addpurpose.removeListeners(),this.addcategory.removeListeners(),this.currentContextLevel=d,this.loadForm("contextlevel_form",[this.currentContextLevel],this.submitContextLevelFormAjax.bind(this));else if(e)window.history.pushState({},null,"?contextid="+e),this.addpurpose.removeListeners(),this.addcategory.removeListeners(),this.currentContextId=e,this.loadForm("context_form",[this.currentContextId],this.submitContextFormAjax.bind(this));else{var f=c.data("expandcontextid"),g=c.data("expandelement"),h=c.data("expanded");g&&(h?this.collapse(c):!c.data("loaded")&&f&&g?(c.find("> i").removeClass("fa-plus"),c.find("> i").addClass("fa-circle-o-notch fa-spin"),this.loadExtra(c,f,g)):this.expand(c))}}.bind(this))},l.prototype.removeListeners=function(){a(k.TREE_NODES).off("click")},l.prototype.loadForm=function(b,c,f){this.clearForm();var g=h.loadFragment("tool_dataprivacy",b,this.systemContextId,c);g.done(function(b,c){a(k.FORM_CONTAINER).html(b),e.runTemplateJS(c),this.addpurpose.registerEventListeners(),this.addcategory.registerEventListeners(),a(k.FORM_CONTAINER).on("submit","form",f)}.bind(this)).fail(d.exception)},l.prototype.clearForm=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()}),a(k.FORM_CONTAINER).off("submit","form")},l.prototype.submitForm=function(b){b.preventDefault(),a(k.FORM_CONTAINER).find("form").submit()},l.prototype.submitContextLevelFormAjax=function(a){this.submitFormAjax(a,"tool_dataprivacy_set_contextlevel_form")},l.prototype.submitContextFormAjax=function(a){this.submitFormAjax(a,"tool_dataprivacy_set_context_form")},l.prototype.submitFormAjax=function(b,e){b.preventDefault();var f=a(k.FORM_CONTAINER).find("form").serialize();return this.strings.then(function(a){c.call([{methodname:e,args:{jsonformdata:JSON.stringify(f)},done:function(){d.alert(a[0],a[1])},fail:d.exception}])})["catch"](d.exception)},l.prototype.loadExtra=function(a,b,f){c.call([{methodname:"tool_dataprivacy_tree_extra_branches",args:{contextid:b,element:f},done:function(b){return 0==b.branches.length?void this.noElements(a,f):void e.render("tool_dataprivacy/context_tree_branches",b).then(function(b){a.after(b),this.removeListeners(),this.registerEventListeners(),this.expand(a),a.data("loaded",1)}.bind(this)).fail(d.exception)}.bind(this),fail:d.exception}])},l.prototype.noElements=function(a,b){a.data("expandcontextid",""),a.data("expandelement",""),this.strings.then(function(c){var d=2;"module"==b?d=3:"course"==b&&(d=4),a.text(c[d])}).fail(d.exception)},l.prototype.collapse=function(a){a.data("expanded",0),a.siblings("nav").addClass("hidden"),a.find("> i").removeClass("fa-minus"),a.find("> i").addClass("fa-plus")},l.prototype.expand=function(a){a.data("expanded",1),a.siblings("nav").removeClass("hidden"),a.find("> i").removeClass("fa-plus"),a.find("> i").removeClass("fa-circle-o-notch fa-spin"),a.find("> i").addClass("fa-minus")},{init:function(a,b,c){return new l(a,b,c)}}}); \ No newline at end of file +define ("tool_dataprivacy/data_registry",["jquery","core/str","core/ajax","core/notification","core/templates","core/modal_factory","core/modal_events","core/fragment","tool_dataprivacy/add_purpose","tool_dataprivacy/add_category"],function(a,b,c,d,e,f,g,h,i,j){var k={TREE_NODES:"[data-context-tree-node=1]",FORM_CONTAINER:"#context-form-container"},l=function(a,b,c){this.systemContextId=a;this.currentContextLevel=b;this.currentContextId=c;this.init()};l.prototype.systemContextId=0;l.prototype.currentContextLevel=0;l.prototype.currentContextId=0;l.prototype.addpurpose=null;l.prototype.addcategory=null;l.prototype.init=function(){this.addpurpose=i.getInstance(this.systemContextId);this.addcategory=j.getInstance(this.systemContextId);this.strings=b.get_strings([{key:"changessaved",component:"moodle"},{key:"contextpurposecategorysaved",component:"tool_dataprivacy"},{key:"noblockstoload",component:"tool_dataprivacy"},{key:"noactivitiestoload",component:"tool_dataprivacy"},{key:"nocoursestoload",component:"tool_dataprivacy"}]);this.registerEventListeners();if(this.currentContextId){this.loadForm("context_form",[this.currentContextId],this.submitContextFormAjax.bind(this))}else{this.loadForm("contextlevel_form",[this.currentContextLevel],this.submitContextLevelFormAjax.bind(this))}};l.prototype.registerEventListeners=function(){a(k.TREE_NODES).on("click",function(b){b.preventDefault();var c=a(b.currentTarget);a(k.TREE_NODES).removeClass("active");c.addClass("active");var d=c.data("contextlevel"),e=c.data("contextid");if(d){window.history.pushState({},null,"?contextlevel="+d);this.addpurpose.removeListeners();this.addcategory.removeListeners();this.currentContextLevel=d;this.loadForm("contextlevel_form",[this.currentContextLevel],this.submitContextLevelFormAjax.bind(this))}else if(e){window.history.pushState({},null,"?contextid="+e);this.addpurpose.removeListeners();this.addcategory.removeListeners();this.currentContextId=e;this.loadForm("context_form",[this.currentContextId],this.submitContextFormAjax.bind(this))}else{var f=c.data("expandcontextid"),g=c.data("expandelement"),h=c.data("expanded");if(g){if(!h){if(c.data("loaded")||!f||!g){this.expand(c)}else{c.find("> i").removeClass("fa-plus");c.find("> i").addClass("fa-circle-o-notch fa-spin");this.loadExtra(c,f,g)}}else{this.collapse(c)}}}}.bind(this))};l.prototype.removeListeners=function(){a(k.TREE_NODES).off("click")};l.prototype.loadForm=function(b,c,f){this.clearForm();var g=h.loadFragment("tool_dataprivacy",b,this.systemContextId,c);g.done(function(b,c){a(k.FORM_CONTAINER).html(b);e.runTemplateJS(c);this.addpurpose.registerEventListeners();this.addcategory.registerEventListeners();a(k.FORM_CONTAINER).on("submit","form",f)}.bind(this)).fail(d.exception)};l.prototype.clearForm=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()});a(k.FORM_CONTAINER).off("submit","form")};l.prototype.submitForm=function(b){b.preventDefault();a(k.FORM_CONTAINER).find("form").submit()};l.prototype.submitContextLevelFormAjax=function(a){this.submitFormAjax(a,"tool_dataprivacy_set_contextlevel_form")};l.prototype.submitContextFormAjax=function(a){this.submitFormAjax(a,"tool_dataprivacy_set_context_form")};l.prototype.submitFormAjax=function(b,e){b.preventDefault();var f=a(k.FORM_CONTAINER).find("form").serialize();return this.strings.then(function(a){c.call([{methodname:e,args:{jsonformdata:JSON.stringify(f)},done:function done(){d.alert(a[0],a[1])},fail:d.exception}])}).catch(d.exception)};l.prototype.loadExtra=function(a,b,f){c.call([{methodname:"tool_dataprivacy_tree_extra_branches",args:{contextid:b,element:f},done:function(b){if(0==b.branches.length){this.noElements(a,f);return}e.render("tool_dataprivacy/context_tree_branches",b).then(function(b){a.after(b);this.removeListeners();this.registerEventListeners();this.expand(a);a.data("loaded",1)}.bind(this)).fail(d.exception)}.bind(this),fail:d.exception}])};l.prototype.noElements=function(a,b){a.data("expandcontextid","");a.data("expandelement","");this.strings.then(function(c){var d=2;if("module"==b){d=3}else if("course"==b){d=4}a.text(c[d])}).fail(d.exception)};l.prototype.collapse=function(a){a.data("expanded",0);a.siblings("nav").addClass("hidden");a.find("> i").removeClass("fa-minus");a.find("> i").addClass("fa-plus")};l.prototype.expand=function(a){a.data("expanded",1);a.siblings("nav").removeClass("hidden");a.find("> i").removeClass("fa-plus");a.find("> i").removeClass("fa-circle-o-notch fa-spin");a.find("> i").addClass("fa-minus")};return{init:function init(a,b,c){return new l(a,b,c)}}}); +//# sourceMappingURL=data_registry.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/data_registry.min.js.map b/admin/tool/dataprivacy/amd/build/data_registry.min.js.map new file mode 100644 index 0000000000000..eb4269ab1743e --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/data_registry.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/data_registry.js"],"names":["define","$","Str","Ajax","Notification","Templates","ModalFactory","ModalEvents","Fragment","AddPurpose","AddCategory","SELECTORS","TREE_NODES","FORM_CONTAINER","DataRegistry","systemContextId","initContextLevel","initContextId","currentContextLevel","currentContextId","init","prototype","addpurpose","addcategory","getInstance","strings","get_strings","key","component","registerEventListeners","loadForm","submitContextFormAjax","bind","submitContextLevelFormAjax","on","ev","preventDefault","trigger","currentTarget","removeClass","addClass","contextLevel","data","contextId","window","history","pushState","removeListeners","expandContextId","expandElement","expanded","expand","find","loadExtra","collapse","off","fragmentName","fragmentArgs","formSubmitCallback","clearForm","fragment","loadFragment","done","html","js","runTemplateJS","fail","exception","Y","use","M","core_formchangechecker","reset_form_dirty_state","submitForm","e","submit","submitFormAjax","saveMethodName","formData","serialize","then","call","methodname","args","jsonformdata","JSON","stringify","alert","catch","parentNode","contextid","element","branches","length","noElements","render","after","node","text","siblings"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Request actions.\n *\n * @module tool_dataprivacy/data_registry\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/ajax', 'core/notification', 'core/templates', 'core/modal_factory',\n 'core/modal_events', 'core/fragment', 'tool_dataprivacy/add_purpose', 'tool_dataprivacy/add_category'],\n function($, Str, Ajax, Notification, Templates, ModalFactory, ModalEvents, Fragment, AddPurpose, AddCategory) {\n\n var SELECTORS = {\n TREE_NODES: '[data-context-tree-node=1]',\n FORM_CONTAINER: '#context-form-container',\n };\n\n var DataRegistry = function(systemContextId, initContextLevel, initContextId) {\n this.systemContextId = systemContextId;\n this.currentContextLevel = initContextLevel;\n this.currentContextId = initContextId;\n this.init();\n };\n\n /**\n * @var {int} systemContextId\n * @private\n */\n DataRegistry.prototype.systemContextId = 0;\n\n /**\n * @var {int} currentContextLevel\n * @private\n */\n DataRegistry.prototype.currentContextLevel = 0;\n\n /**\n * @var {int} currentContextId\n * @private\n */\n DataRegistry.prototype.currentContextId = 0;\n\n /**\n * @var {AddPurpose} addpurpose\n * @private\n */\n DataRegistry.prototype.addpurpose = null;\n\n /**\n * @var {AddCategory} addcategory\n * @private\n */\n DataRegistry.prototype.addcategory = null;\n\n DataRegistry.prototype.init = function() {\n // Add purpose and category modals always at system context.\n this.addpurpose = AddPurpose.getInstance(this.systemContextId);\n this.addcategory = AddCategory.getInstance(this.systemContextId);\n\n var stringKeys = [\n {\n key: 'changessaved',\n component: 'moodle'\n }, {\n key: 'contextpurposecategorysaved',\n component: 'tool_dataprivacy'\n }, {\n key: 'noblockstoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'noactivitiestoload',\n component: 'tool_dataprivacy'\n }, {\n key: 'nocoursestoload',\n component: 'tool_dataprivacy'\n }\n ];\n this.strings = Str.get_strings(stringKeys);\n\n this.registerEventListeners();\n\n // Load the default context level form.\n if (this.currentContextId) {\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n }\n };\n\n DataRegistry.prototype.registerEventListeners = function() {\n $(SELECTORS.TREE_NODES).on('click', function(ev) {\n ev.preventDefault();\n\n var trigger = $(ev.currentTarget);\n\n // Active node.\n $(SELECTORS.TREE_NODES).removeClass('active');\n trigger.addClass('active');\n\n var contextLevel = trigger.data('contextlevel');\n var contextId = trigger.data('contextid');\n if (contextLevel) {\n // Context level level.\n\n window.history.pushState({}, null, '?contextlevel=' + contextLevel);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextLevel = contextLevel;\n this.loadForm('contextlevel_form', [this.currentContextLevel], this.submitContextLevelFormAjax.bind(this));\n } else if (contextId) {\n // Context instance level.\n\n window.history.pushState({}, null, '?contextid=' + contextId);\n\n // Remove previous add purpose and category listeners to avoid memory leaks.\n this.addpurpose.removeListeners();\n this.addcategory.removeListeners();\n\n // Load the context level form.\n this.currentContextId = contextId;\n this.loadForm('context_form', [this.currentContextId], this.submitContextFormAjax.bind(this));\n } else {\n // Expandable nodes.\n\n var expandContextId = trigger.data('expandcontextid');\n var expandElement = trigger.data('expandelement');\n var expanded = trigger.data('expanded');\n\n // Extra checking that there is an expandElement because we remove it after loading 0 branches.\n if (expandElement) {\n\n if (!expanded) {\n if (trigger.data('loaded') || !expandContextId || !expandElement) {\n this.expand(trigger);\n } else {\n\n trigger.find('> i').removeClass('fa-plus');\n trigger.find('> i').addClass('fa-circle-o-notch fa-spin');\n this.loadExtra(trigger, expandContextId, expandElement);\n }\n } else {\n this.collapse(trigger);\n }\n }\n }\n\n }.bind(this));\n };\n\n DataRegistry.prototype.removeListeners = function() {\n $(SELECTORS.TREE_NODES).off('click');\n };\n\n DataRegistry.prototype.loadForm = function(fragmentName, fragmentArgs, formSubmitCallback) {\n\n this.clearForm();\n\n var fragment = Fragment.loadFragment('tool_dataprivacy', fragmentName, this.systemContextId, fragmentArgs);\n fragment.done(function(html, js) {\n\n $(SELECTORS.FORM_CONTAINER).html(html);\n Templates.runTemplateJS(js);\n\n this.addpurpose.registerEventListeners();\n this.addcategory.registerEventListeners();\n\n // We also catch the form submit event and use it to submit the form with ajax.\n $(SELECTORS.FORM_CONTAINER).on('submit', 'form', formSubmitCallback);\n\n }.bind(this)).fail(Notification.exception);\n };\n\n DataRegistry.prototype.clearForm = function() {\n // For the previously loaded form.\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n\n // Remove previous listeners.\n $(SELECTORS.FORM_CONTAINER).off('submit', 'form');\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n DataRegistry.prototype.submitForm = function(e) {\n e.preventDefault();\n $(SELECTORS.FORM_CONTAINER).find('form').submit();\n };\n\n DataRegistry.prototype.submitContextLevelFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_contextlevel_form');\n };\n\n DataRegistry.prototype.submitContextFormAjax = function(e) {\n this.submitFormAjax(e, 'tool_dataprivacy_set_context_form');\n };\n\n DataRegistry.prototype.submitFormAjax = function(e, saveMethodName) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = $(SELECTORS.FORM_CONTAINER).find('form').serialize();\n return this.strings.then(function(strings) {\n Ajax.call([{\n methodname: saveMethodName,\n args: {jsonformdata: JSON.stringify(formData)},\n done: function() {\n Notification.alert(strings[0], strings[1]);\n },\n fail: Notification.exception\n }]);\n return;\n }).catch(Notification.exception);\n\n };\n\n DataRegistry.prototype.loadExtra = function(parentNode, expandContextId, expandElement) {\n\n Ajax.call([{\n methodname: 'tool_dataprivacy_tree_extra_branches',\n args: {\n contextid: expandContextId,\n element: expandElement,\n },\n done: function(data) {\n if (data.branches.length == 0) {\n this.noElements(parentNode, expandElement);\n return;\n }\n Templates.render('tool_dataprivacy/context_tree_branches', data)\n .then(function(html) {\n parentNode.after(html);\n this.removeListeners();\n this.registerEventListeners();\n this.expand(parentNode);\n parentNode.data('loaded', 1);\n return;\n }.bind(this))\n .fail(Notification.exception);\n }.bind(this),\n fail: Notification.exception\n }]);\n };\n\n DataRegistry.prototype.noElements = function(node, expandElement) {\n node.data('expandcontextid', '');\n node.data('expandelement', '');\n this.strings.then(function(strings) {\n\n // 2 = blocks, 3 = activities, 4 = courses (although courses is not likely really).\n var key = 2;\n if (expandElement == 'module') {\n key = 3;\n } else if (expandElement == 'course') {\n key = 4;\n }\n node.text(strings[key]);\n return;\n }).fail(Notification.exception);\n };\n\n DataRegistry.prototype.collapse = function(node) {\n node.data('expanded', 0);\n node.siblings('nav').addClass('hidden');\n node.find('> i').removeClass('fa-minus');\n node.find('> i').addClass('fa-plus');\n };\n\n DataRegistry.prototype.expand = function(node) {\n node.data('expanded', 1);\n node.siblings('nav').removeClass('hidden');\n node.find('> i').removeClass('fa-plus');\n // Also remove the spinning one if data was just loaded.\n node.find('> i').removeClass('fa-circle-o-notch fa-spin');\n node.find('> i').addClass('fa-minus');\n };\n return /** @alias module:tool_dataprivacy/data_registry */ {\n\n /**\n * Initialise the page.\n *\n * @param {Number} systemContextId\n * @param {Number} initContextLevel\n * @param {Number} initContextId\n * @return {DataRegistry}\n */\n init: function(systemContextId, initContextLevel, initContextId) {\n return new DataRegistry(systemContextId, initContextLevel, initContextId);\n }\n };\n }\n);\n\n"],"file":"data_registry.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/data_request_modal.min.js b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js index e8b22a22917f9..2027d4408fd49 100644 --- a/admin/tool/dataprivacy/amd/build/data_request_modal.min.js +++ b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","tool_dataprivacy/events"],function(a,b,c,d,e,f){var g=!1,h={APPROVE_BUTTON:'[data-action="approve"]',DENY_BUTTON:'[data-action="deny"]',COMPLETE_BUTTON:'[data-action="complete"]'},i=function(a){d.call(this,a)};return i.TYPE="tool_dataprivacy-data_request",i.prototype=Object.create(d.prototype),i.prototype.constructor=i,i.prototype.registerEventListeners=function(){d.prototype.registerEventListeners.call(this),this.getModal().on(c.events.activate,h.APPROVE_BUTTON,function(b,c){var d=a.Event(f.approve);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this)),this.getModal().on(c.events.activate,h.DENY_BUTTON,function(b,c){var d=a.Event(f.deny);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this)),this.getModal().on(c.events.activate,h.COMPLETE_BUTTON,function(b,c){var d=a.Event(f.complete);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this))},g||(e.register(i.TYPE,i,"tool_dataprivacy/data_request_modal"),g=!0),i}); \ No newline at end of file +define ("tool_dataprivacy/data_request_modal",["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","tool_dataprivacy/events"],function(a,b,c,d,e,f){var g=!1,h={APPROVE_BUTTON:"[data-action=\"approve\"]",DENY_BUTTON:"[data-action=\"deny\"]",COMPLETE_BUTTON:"[data-action=\"complete\"]"},i=function(a){d.call(this,a)};i.TYPE="tool_dataprivacy-data_request";i.prototype=Object.create(d.prototype);i.prototype.constructor=i;i.prototype.registerEventListeners=function(){d.prototype.registerEventListeners.call(this);this.getModal().on(c.events.activate,h.APPROVE_BUTTON,function(b,c){var d=a.Event(f.approve);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,h.DENY_BUTTON,function(b,c){var d=a.Event(f.deny);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,h.COMPLETE_BUTTON,function(b,c){var d=a.Event(f.complete);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this))};if(!g){e.register(i.TYPE,i,"tool_dataprivacy/data_request_modal");g=!0}return i}); +//# sourceMappingURL=data_request_modal.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map new file mode 100644 index 0000000000000..ee4933aa76ab9 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/data_request_modal.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/data_request_modal.js"],"names":["define","$","Notification","CustomEvents","Modal","ModalRegistry","DataPrivacyEvents","registered","SELECTORS","APPROVE_BUTTON","DENY_BUTTON","COMPLETE_BUTTON","ModalDataRequest","root","call","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","approveEvent","Event","approve","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","denyEvent","deny","completeEvent","complete","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Request actions.\n *\n * @module tool_dataprivacy/data_request_modal\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/custom_interaction_events', 'core/modal', 'core/modal_registry',\n 'tool_dataprivacy/events'],\n function($, Notification, CustomEvents, Modal, ModalRegistry, DataPrivacyEvents) {\n\n var registered = false;\n var SELECTORS = {\n APPROVE_BUTTON: '[data-action=\"approve\"]',\n DENY_BUTTON: '[data-action=\"deny\"]',\n COMPLETE_BUTTON: '[data-action=\"complete\"]'\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDataRequest = function(root) {\n Modal.call(this, root);\n };\n\n ModalDataRequest.TYPE = 'tool_dataprivacy-data_request';\n ModalDataRequest.prototype = Object.create(Modal.prototype);\n ModalDataRequest.prototype.constructor = ModalDataRequest;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDataRequest.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.APPROVE_BUTTON, function(e, data) {\n var approveEvent = $.Event(DataPrivacyEvents.approve);\n this.getRoot().trigger(approveEvent, this);\n\n if (!approveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DENY_BUTTON, function(e, data) {\n var denyEvent = $.Event(DataPrivacyEvents.deny);\n this.getRoot().trigger(denyEvent, this);\n\n if (!denyEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.COMPLETE_BUTTON, function(e, data) {\n var completeEvent = $.Event(DataPrivacyEvents.complete);\n this.getRoot().trigger(completeEvent, this);\n\n if (!completeEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDataRequest.TYPE, ModalDataRequest, 'tool_dataprivacy/data_request_modal');\n registered = true;\n }\n\n return ModalDataRequest;\n });"],"file":"data_request_modal.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js index b8f0bc3738dd1..fa8e7fcac2783 100644 --- a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js +++ b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,e,f,g){function h(b,d,h,j,k,l,m,n){null!==h&&l.forEach(function(a){a.id===h&&(a.selected=!0)}),null!==j&&m.forEach(function(a){a.id===j&&(a.selected=!0)});var o={contextlevel:d,categoryoptions:l,purposeoptions:m};null!==n&&n.length&&(null===k?o.newactivitydefaults=!0:n.forEach(function(a){k===a.name&&(a.selected=!0)}),o.modemodule=!0,o.activityoptions=n),e.create({title:b,body:g.render("tool_dataprivacy/category_purpose_form",o),type:e.types.SAVE_CANCEL,large:!0}).then(function(b){return b.getRoot().on(f.save,function(){var b=a("#activity"),c="undefined"!=typeof b?b.val():null,d=a("#override"),e="undefined"!=typeof d&&d.is(":checked");i(a("#contextlevel").val(),a("#category").val(),a("#purpose").val(),c,e)}),b.getRoot().on(f.hidden,function(){b.destroy()}),b.show(),b})["catch"](c.exception)}function i(a,c,d,e,f){var g={methodname:"tool_dataprivacy_set_context_defaults",args:{contextlevel:a,category:c,purpose:d,override:f,activity:e}};b.call([g])[0].done(function(a){a.result&&window.location.reload()})}var j={EDIT_LEVEL_DEFAULTS:'[data-action="edit-level-defaults"]',NEW_ACTIVITY_DEFAULTS:'[data-action="new-activity-defaults"]',EDIT_ACTIVITY_DEFAULTS:'[data-action="edit-activity-defaults"]',DELETE_ACTIVITY_DEFAULTS:'[data-action="delete-activity-defaults"]'},k=-1,l=function(){this.registerEvents()};return l.prototype.registerEvents=function(){a(j.EDIT_LEVEL_DEFAULTS).click(function(e){e.preventDefault();var f=a(this),g=f.data("contextlevel"),i=f.data("category"),j=f.data("purpose"),k=[{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}}],l=b.call(k),m=d.get_string("editdefaults","tool_dataprivacy",a("#defaults-header").text());a.when(l[0],l[1],m).then(function(a,b,c){var d=a.options,e=b.options;return h(c,g,i,j,null,d,e,null),!0})["catch"](c.exception)}),a(j.NEW_ACTIVITY_DEFAULTS).click(function(e){e.preventDefault();var f=a(this),g=f.data("contextlevel"),i=[{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}},{methodname:"tool_dataprivacy_get_activity_options",args:{nodefaults:!0}}],j=b.call(i),k=d.get_string("addnewdefaults","tool_dataprivacy");a.when(j[0],j[1],j[2],k).then(function(a,b,c,d){var e=a.options,f=b.options,i=c.options;return h(d,g,null,null,null,e,f,i),!0})["catch"](c.exception)}),a(j.EDIT_ACTIVITY_DEFAULTS).click(function(e){e.preventDefault();var f=a(this),g=f.data("contextlevel"),i=f.data("category"),j=f.data("purpose"),k=f.data("activityname"),l=[{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}},{methodname:"tool_dataprivacy_get_activity_options",args:{}}],m=b.call(l),n=d.get_string("editmoduledefaults","tool_dataprivacy");a.when(m[0],m[1],m[2],n).then(function(a,b,c,d){var e=a.options,f=b.options,l=c.options;return h(d,g,i,j,k,e,f,l),!0})["catch"](c.exception)}),a(j.DELETE_ACTIVITY_DEFAULTS).click(function(b){b.preventDefault();var h=a(this),j=h.data("contextlevel"),l=h.data("activityname"),m=h.data("activitydisplayname"),n=k,o=k;e.create({title:d.get_string("deletedefaults","tool_dataprivacy",m),body:g.render("tool_dataprivacy/delete_activity_defaults",{activityname:m}),type:e.types.SAVE_CANCEL,large:!0}).then(function(a){return a.setSaveButtonText(d.get_string("delete")),a.getRoot().on(f.save,function(){i(j,n,o,l,!1)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a.show(),!0})["catch"](c.exception)})},{init:function(){return new l}}}); \ No newline at end of file +define ("tool_dataprivacy/defaultsactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,f,g,h){var k={EDIT_LEVEL_DEFAULTS:"[data-action=\"edit-level-defaults\"]",NEW_ACTIVITY_DEFAULTS:"[data-action=\"new-activity-defaults\"]",EDIT_ACTIVITY_DEFAULTS:"[data-action=\"edit-activity-defaults\"]",DELETE_ACTIVITY_DEFAULTS:"[data-action=\"delete-activity-defaults\"]"},l=-1,m=function(){this.registerEvents()};m.prototype.registerEvents=function(){a(k.EDIT_LEVEL_DEFAULTS).click(function(f){f.preventDefault();var e=a(this),g=e.data("contextlevel"),h=e.data("category"),j=e.data("purpose"),k=b.call([{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}}]),l=d.get_string("editdefaults","tool_dataprivacy",a("#defaults-header").text());a.when(k[0],k[1],l).then(function(a,b,c){var d=a.options,e=b.options;i(c,g,h,j,null,d,e,null);return!0}).catch(c.exception)});a(k.NEW_ACTIVITY_DEFAULTS).click(function(f){f.preventDefault();var e=a(this),g=e.data("contextlevel"),h=b.call([{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}},{methodname:"tool_dataprivacy_get_activity_options",args:{nodefaults:!0}}]),j=d.get_string("addnewdefaults","tool_dataprivacy");a.when(h[0],h[1],h[2],j).then(function(a,b,c,d){var e=a.options,f=b.options,h=c.options;i(d,g,null,null,null,e,f,h);return!0}).catch(c.exception)});a(k.EDIT_ACTIVITY_DEFAULTS).click(function(f){f.preventDefault();var e=a(this),g=e.data("contextlevel"),h=e.data("category"),j=e.data("purpose"),k=e.data("activityname"),l=b.call([{methodname:"tool_dataprivacy_get_category_options",args:{}},{methodname:"tool_dataprivacy_get_purpose_options",args:{}},{methodname:"tool_dataprivacy_get_activity_options",args:{}}]),m=d.get_string("editmoduledefaults","tool_dataprivacy");a.when(l[0],l[1],l[2],m).then(function(a,b,c,d){var e=a.options,f=b.options,l=c.options;i(d,g,h,j,k,e,f,l);return!0}).catch(c.exception)});a(k.DELETE_ACTIVITY_DEFAULTS).click(function(b){b.preventDefault();var e=a(this),i=e.data("contextlevel"),k=e.data("activityname"),m=e.data("activitydisplayname");f.create({title:d.get_string("deletedefaults","tool_dataprivacy",m),body:h.render("tool_dataprivacy/delete_activity_defaults",{activityname:m}),type:f.types.SAVE_CANCEL,large:!0}).then(function(a){a.setSaveButtonText(d.get_string("delete"));a.getRoot().on(g.save,function(){j(i,l,l,k,!1)});a.getRoot().on(g.hidden,function(){a.destroy()});a.show();return!0}).catch(c.exception)})};function i(b,d,e,i,k,l,m,n){if(null!==e){l.forEach(function(a){if(a.id===e){a.selected=!0}})}if(null!==i){m.forEach(function(a){if(a.id===i){a.selected=!0}})}var o={contextlevel:d,categoryoptions:l,purposeoptions:m};if(null!==n&&n.length){if(null===k){o.newactivitydefaults=!0}else{n.forEach(function(a){if(k===a.name){a.selected=!0}})}o.modemodule=!0;o.activityoptions=n}f.create({title:b,body:h.render("tool_dataprivacy/category_purpose_form",o),type:f.types.SAVE_CANCEL,large:!0}).then(function(b){b.getRoot().on(g.save,function(){var b=a("#activity"),c="undefined"!=typeof b?b.val():null,d=a("#override"),e="undefined"!=typeof d?d.is(":checked"):!1;j(a("#contextlevel").val(),a("#category").val(),a("#purpose").val(),c,e)});b.getRoot().on(g.hidden,function(){b.destroy()});b.show();return b}).catch(c.exception)}function j(a,c,d,e,f){b.call([{methodname:"tool_dataprivacy_set_context_defaults",args:{contextlevel:a,category:c,purpose:d,override:f,activity:e}}])[0].done(function(a){if(a.result){window.location.reload()}})}return{init:function init(){return new m}}}); +//# sourceMappingURL=defaultsactions.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map new file mode 100644 index 0000000000000..73b2824ba0925 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/defaultsactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/defaultsactions.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ACTIONS","EDIT_LEVEL_DEFAULTS","NEW_ACTIVITY_DEFAULTS","EDIT_ACTIVITY_DEFAULTS","DELETE_ACTIVITY_DEFAULTS","INHERIT","DefaultsActions","registerEvents","prototype","click","e","preventDefault","button","contextLevel","data","category","purpose","promises","call","methodname","args","titlePromise","get_string","text","when","then","categoryResponse","purposeResponse","title","categories","options","purposes","showDefaultsFormModal","catch","exception","activityResponse","activities","activity","activityDisplayName","create","body","render","type","types","SAVE_CANCEL","large","modal","setSaveButtonText","getRoot","on","save","setContextDefaults","hidden","destroy","show","categoryOptions","purposeOptions","activityOptions","forEach","currentValue","id","selected","templateContext","length","newactivitydefaults","name","modemodule","activityoptions","activityVal","val","override","overrideVal","is","done","result","window","location","reload"],"mappings":"AAuBAA,OAAM,oCAAC,CACH,QADG,CAEH,WAFG,CAGH,mBAHG,CAIH,UAJG,CAKH,oBALG,CAMH,mBANG,CAOH,gBAPG,CAAD,CAQN,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgCC,CAAhC,CAAqCC,CAArC,CAAmDC,CAAnD,CAAgEC,CAAhE,CAA2E,IAUnEC,CAAAA,CAAO,CAAG,CACVC,mBAAmB,CAAE,uCADX,CAEVC,qBAAqB,CAAE,yCAFb,CAGVC,sBAAsB,CAAE,0CAHd,CAIVC,wBAAwB,CAAE,4CAJhB,CAVyD,CAkBnEC,CAAO,CAAG,CAAC,CAlBwD,CAuBnEC,CAAe,CAAG,UAAW,CAC7B,KAAKC,cAAL,EACH,CAzBsE,CA8BvED,CAAe,CAACE,SAAhB,CAA0BD,cAA1B,CAA2C,UAAW,CAClDd,CAAC,CAACO,CAAO,CAACC,mBAAT,CAAD,CAA+BQ,KAA/B,CAAqC,SAASC,CAAT,CAAY,CAC7CA,CAAC,CAACC,cAAF,GAD6C,GAGzCC,CAAAA,CAAM,CAAGnB,CAAC,CAAC,IAAD,CAH+B,CAIzCoB,CAAY,CAAGD,CAAM,CAACE,IAAP,CAAY,cAAZ,CAJ0B,CAKzCC,CAAQ,CAAGH,CAAM,CAACE,IAAP,CAAY,UAAZ,CAL8B,CAMzCE,CAAO,CAAGJ,CAAM,CAACE,IAAP,CAAY,SAAZ,CAN+B,CAczCG,CAAQ,CAAGvB,CAAI,CAACwB,IAAL,CALA,CACX,CAACC,UAAU,CAAE,uCAAb,CAAsDC,IAAI,CAAE,EAA5D,CADW,CAEX,CAACD,UAAU,CAAE,sCAAb,CAAqDC,IAAI,CAAE,EAA3D,CAFW,CAKA,CAd8B,CAezCC,CAAY,CAAGzB,CAAG,CAAC0B,UAAJ,CAAe,cAAf,CAA+B,kBAA/B,CAAmD7B,CAAC,CAAC,kBAAD,CAAD,CAAsB8B,IAAtB,EAAnD,CAf0B,CAgB7C9B,CAAC,CAAC+B,IAAF,CAAOP,CAAQ,CAAC,CAAD,CAAf,CAAoBA,CAAQ,CAAC,CAAD,CAA5B,CAAiCI,CAAjC,EAA+CI,IAA/C,CAAoD,SAASC,CAAT,CAA2BC,CAA3B,CAA4CC,CAA5C,CAAmD,IAC/FC,CAAAA,CAAU,CAAGH,CAAgB,CAACI,OADiE,CAE/FC,CAAQ,CAAGJ,CAAe,CAACG,OAFoE,CAGnGE,CAAqB,CAACJ,CAAD,CAAQf,CAAR,CAAsBE,CAAtB,CAAgCC,CAAhC,CAAyC,IAAzC,CAA+Ca,CAA/C,CAA2DE,CAA3D,CAAqE,IAArE,CAArB,CAEA,QACH,CAND,EAMGE,KANH,CAMStC,CAAY,CAACuC,SANtB,CAOH,CAvBD,EAyBAzC,CAAC,CAACO,CAAO,CAACE,qBAAT,CAAD,CAAiCO,KAAjC,CAAuC,SAASC,CAAT,CAAY,CAC/CA,CAAC,CAACC,cAAF,GAD+C,GAG3CC,CAAAA,CAAM,CAAGnB,CAAC,CAAC,IAAD,CAHiC,CAI3CoB,CAAY,CAAGD,CAAM,CAACE,IAAP,CAAY,cAAZ,CAJ4B,CAa3CG,CAAQ,CAAGvB,CAAI,CAACwB,IAAL,CANA,CACX,CAACC,UAAU,CAAE,uCAAb,CAAsDC,IAAI,CAAE,EAA5D,CADW,CAEX,CAACD,UAAU,CAAE,sCAAb,CAAqDC,IAAI,CAAE,EAA3D,CAFW,CAGX,CAACD,UAAU,CAAE,uCAAb,CAAsDC,IAAI,CAAE,CAAC,aAAD,CAA5D,CAHW,CAMA,CAbgC,CAc3CC,CAAY,CAAGzB,CAAG,CAAC0B,UAAJ,CAAe,gBAAf,CAAiC,kBAAjC,CAd4B,CAgB/C7B,CAAC,CAAC+B,IAAF,CAAOP,CAAQ,CAAC,CAAD,CAAf,CAAoBA,CAAQ,CAAC,CAAD,CAA5B,CAAiCA,CAAQ,CAAC,CAAD,CAAzC,CAA8CI,CAA9C,EAA4DI,IAA5D,CACI,SAASC,CAAT,CAA2BC,CAA3B,CAA4CQ,CAA5C,CAA8DP,CAA9D,CAAqE,IAC7DC,CAAAA,CAAU,CAAGH,CAAgB,CAACI,OAD+B,CAE7DC,CAAQ,CAAGJ,CAAe,CAACG,OAFkC,CAG7DM,CAAU,CAAGD,CAAgB,CAACL,OAH+B,CAKjEE,CAAqB,CAACJ,CAAD,CAAQf,CAAR,CAAsB,IAAtB,CAA4B,IAA5B,CAAkC,IAAlC,CAAwCgB,CAAxC,CAAoDE,CAApD,CAA8DK,CAA9D,CAArB,CAEA,QAEH,CAVL,EAUOH,KAVP,CAUatC,CAAY,CAACuC,SAV1B,CAWC,CA3BL,EA8BAzC,CAAC,CAACO,CAAO,CAACG,sBAAT,CAAD,CAAkCM,KAAlC,CAAwC,SAASC,CAAT,CAAY,CAChDA,CAAC,CAACC,cAAF,GADgD,GAG5CC,CAAAA,CAAM,CAAGnB,CAAC,CAAC,IAAD,CAHkC,CAI5CoB,CAAY,CAAGD,CAAM,CAACE,IAAP,CAAY,cAAZ,CAJ6B,CAK5CC,CAAQ,CAAGH,CAAM,CAACE,IAAP,CAAY,UAAZ,CALiC,CAM5CE,CAAO,CAAGJ,CAAM,CAACE,IAAP,CAAY,SAAZ,CANkC,CAO5CuB,CAAQ,CAAGzB,CAAM,CAACE,IAAP,CAAY,cAAZ,CAPiC,CAgB5CG,CAAQ,CAAGvB,CAAI,CAACwB,IAAL,CANA,CACX,CAACC,UAAU,CAAE,uCAAb,CAAsDC,IAAI,CAAE,EAA5D,CADW,CAEX,CAACD,UAAU,CAAE,sCAAb,CAAqDC,IAAI,CAAE,EAA3D,CAFW,CAGX,CAACD,UAAU,CAAE,uCAAb,CAAsDC,IAAI,CAAE,EAA5D,CAHW,CAMA,CAhBiC,CAiB5CC,CAAY,CAAGzB,CAAG,CAAC0B,UAAJ,CAAe,oBAAf,CAAqC,kBAArC,CAjB6B,CAmBhD7B,CAAC,CAAC+B,IAAF,CAAOP,CAAQ,CAAC,CAAD,CAAf,CAAoBA,CAAQ,CAAC,CAAD,CAA5B,CAAiCA,CAAQ,CAAC,CAAD,CAAzC,CAA8CI,CAA9C,EAA4DI,IAA5D,CACI,SAASC,CAAT,CAA2BC,CAA3B,CAA4CQ,CAA5C,CAA8DP,CAA9D,CAAqE,IAC7DC,CAAAA,CAAU,CAAGH,CAAgB,CAACI,OAD+B,CAE7DC,CAAQ,CAAGJ,CAAe,CAACG,OAFkC,CAG7DM,CAAU,CAAGD,CAAgB,CAACL,OAH+B,CAKjEE,CAAqB,CAACJ,CAAD,CAAQf,CAAR,CAAsBE,CAAtB,CAAgCC,CAAhC,CAAyCqB,CAAzC,CAAmDR,CAAnD,CAA+DE,CAA/D,CAAyEK,CAAzE,CAArB,CAEA,QAEH,CAVL,EAUOH,KAVP,CAUatC,CAAY,CAACuC,SAV1B,CAWC,CA9BL,EAiCAzC,CAAC,CAACO,CAAO,CAACI,wBAAT,CAAD,CAAoCK,KAApC,CAA0C,SAASC,CAAT,CAAY,CAClDA,CAAC,CAACC,cAAF,GADkD,GAG9CC,CAAAA,CAAM,CAAGnB,CAAC,CAAC,IAAD,CAHoC,CAI9CoB,CAAY,CAAGD,CAAM,CAACE,IAAP,CAAY,cAAZ,CAJ+B,CAK9CuB,CAAQ,CAAGzB,CAAM,CAACE,IAAP,CAAY,cAAZ,CALmC,CAM9CwB,CAAmB,CAAG1B,CAAM,CAACE,IAAP,CAAY,qBAAZ,CANwB,CAWlDjB,CAAY,CAAC0C,MAAb,CAAoB,CAChBX,KAAK,CAAEhC,CAAG,CAAC0B,UAAJ,CAAe,gBAAf,CAAiC,kBAAjC,CAAqDgB,CAArD,CADS,CAEhBE,IAAI,CAAEzC,CAAS,CAAC0C,MAAV,CAAiB,2CAAjB,CAA8D,CAAC,aAAgBH,CAAjB,CAA9D,CAFU,CAGhBI,IAAI,CAAE7C,CAAY,CAAC8C,KAAb,CAAmBC,WAHT,CAIhBC,KAAK,GAJW,CAApB,EAKGpB,IALH,CAKQ,SAASqB,CAAT,CAAgB,CACpBA,CAAK,CAACC,iBAAN,CAAwBnD,CAAG,CAAC0B,UAAJ,CAAe,QAAf,CAAxB,EAGAwB,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBnD,CAAW,CAACoD,IAA/B,CAAqC,UAAW,CAC5CC,CAAkB,CAACtC,CAAD,CAbXR,CAaW,CAZZA,CAYY,CAAkCgC,CAAlC,IACrB,CAFD,EAKAS,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBnD,CAAW,CAACsD,MAA/B,CAAuC,UAAW,CAE9CN,CAAK,CAACO,OAAN,EACH,CAHD,EAKAP,CAAK,CAACQ,IAAN,GAEA,QACH,CAtBD,EAsBGrB,KAtBH,CAsBStC,CAAY,CAACuC,SAtBtB,CAuBH,CAlCD,CAmCH,CA5HD,CA0IA,QAASF,CAAAA,CAAT,CAA+BJ,CAA/B,CAAsCf,CAAtC,CAAoDE,CAApD,CAA8DC,CAA9D,CAAuEqB,CAAvE,CAC+BkB,CAD/B,CACgDC,CADhD,CACgEC,CADhE,CACiF,CAE7E,GAAiB,IAAb,GAAA1C,CAAJ,CAAuB,CACnBwC,CAAe,CAACG,OAAhB,CAAwB,SAASC,CAAT,CAAuB,CAC3C,GAAIA,CAAY,CAACC,EAAb,GAAoB7C,CAAxB,CAAkC,CAC9B4C,CAAY,CAACE,QAAb,GACH,CACJ,CAJD,CAKH,CAED,GAAgB,IAAZ,GAAA7C,CAAJ,CAAsB,CAClBwC,CAAc,CAACE,OAAf,CAAuB,SAASC,CAAT,CAAuB,CAC1C,GAAIA,CAAY,CAACC,EAAb,GAAoB5C,CAAxB,CAAiC,CAC7B2C,CAAY,CAACE,QAAb,GACH,CACJ,CAJD,CAKH,CAED,GAAIC,CAAAA,CAAe,CAAG,CAClB,aAAgBjD,CADE,CAElB,gBAAmB0C,CAFD,CAGlB,eAAkBC,CAHA,CAAtB,CAOA,GAAwB,IAApB,GAAAC,CAAe,EAAaA,CAAe,CAACM,MAAhD,CAAwD,CAEpD,GAAiB,IAAb,GAAA1B,CAAJ,CAAuB,CAEnByB,CAAe,CAACE,mBAAhB,GAEH,CAJD,IAIO,CAEHP,CAAe,CAACC,OAAhB,CAAwB,SAASC,CAAT,CAAuB,CAC3C,GAAItB,CAAQ,GAAKsB,CAAY,CAACM,IAA9B,CAAoC,CAChCN,CAAY,CAACE,QAAb,GACH,CACJ,CAJD,CAKH,CAEDC,CAAe,CAACI,UAAhB,IACAJ,CAAe,CAACK,eAAhB,CAAkCV,CACrC,CAED5D,CAAY,CAAC0C,MAAb,CAAoB,CAChBX,KAAK,CAAEA,CADS,CAEhBY,IAAI,CAAEzC,CAAS,CAAC0C,MAAV,CAAiB,wCAAjB,CAA2DqB,CAA3D,CAFU,CAGhBpB,IAAI,CAAE7C,CAAY,CAAC8C,KAAb,CAAmBC,WAHT,CAIhBC,KAAK,GAJW,CAApB,EAKGpB,IALH,CAKQ,SAASqB,CAAT,CAAgB,CAGpBA,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBnD,CAAW,CAACoD,IAA/B,CAAqC,UAAW,IACxCb,CAAAA,CAAQ,CAAG5C,CAAC,CAAC,WAAD,CAD4B,CAExC2E,CAAW,CAAuB,WAApB,QAAO/B,CAAAA,CAAP,CAAkCA,CAAQ,CAACgC,GAAT,EAAlC,CAAmD,IAFzB,CAGxCC,CAAQ,CAAG7E,CAAC,CAAC,WAAD,CAH4B,CAIxC8E,CAAW,CAAuB,WAApB,QAAOD,CAAAA,CAAP,CAAkCA,CAAQ,CAACE,EAAT,CAAY,UAAZ,CAAlC,GAJ0B,CAM5CrB,CAAkB,CAAC1D,CAAC,CAAC,eAAD,CAAD,CAAmB4E,GAAnB,EAAD,CAA2B5E,CAAC,CAAC,WAAD,CAAD,CAAe4E,GAAf,EAA3B,CAAiD5E,CAAC,CAAC,UAAD,CAAD,CAAc4E,GAAd,EAAjD,CAAsED,CAAtE,CAAmFG,CAAnF,CACrB,CAPD,EAUAzB,CAAK,CAACE,OAAN,GAAgBC,EAAhB,CAAmBnD,CAAW,CAACsD,MAA/B,CAAuC,UAAW,CAE9CN,CAAK,CAACO,OAAN,EACH,CAHD,EAKAP,CAAK,CAACQ,IAAN,GAEA,MAAOR,CAAAA,CACV,CA1BD,EA0BGb,KA1BH,CA0BStC,CAAY,CAACuC,SA1BtB,CA2BH,CAWD,QAASiB,CAAAA,CAAT,CAA4BtC,CAA5B,CAA0CE,CAA1C,CAAoDC,CAApD,CAA6DqB,CAA7D,CAAuEiC,CAAvE,CAAiF,CAY7E5E,CAAI,CAACwB,IAAL,CAAU,CAXI,CACVC,UAAU,CAAE,uCADF,CAEVC,IAAI,CAAE,CACF,aAAgBP,CADd,CAEF,SAAYE,CAFV,CAGF,QAAWC,CAHT,CAIF,SAAYsD,CAJV,CAKF,SAAYjC,CALV,CAFI,CAWJ,CAAV,EAAqB,CAArB,EAAwBoC,IAAxB,CAA6B,SAAS3D,CAAT,CAAe,CACxC,GAAIA,CAAI,CAAC4D,MAAT,CAAiB,CACbC,MAAM,CAACC,QAAP,CAAgBC,MAAhB,EACH,CACJ,CAJD,CAKH,CAED,MAA6D,CASzD,KAAQ,eAAW,CACf,MAAO,IAAIvE,CAAAA,CACd,CAXwD,CAahE,CAnSK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD module for data registry defaults actions.\n *\n * @module tool_dataprivacy/defaultsactions\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of action selectors.\n *\n * @type {{EDIT_LEVEL_DEFAULTS: string}}\n * @type {{NEW_ACTIVITY_DEFAULTS: string}}\n * @type {{EDIT_ACTIVITY_DEFAULTS: string}}\n * @type {{DELETE_ACTIVITY_DEFAULTS: string}}\n */\n var ACTIONS = {\n EDIT_LEVEL_DEFAULTS: '[data-action=\"edit-level-defaults\"]',\n NEW_ACTIVITY_DEFAULTS: '[data-action=\"new-activity-defaults\"]',\n EDIT_ACTIVITY_DEFAULTS: '[data-action=\"edit-activity-defaults\"]',\n DELETE_ACTIVITY_DEFAULTS: '[data-action=\"delete-activity-defaults\"]'\n };\n\n /** @type {{INHERIT: Number}} **/\n var INHERIT = -1;\n\n /**\n * DefaultsActions class.\n */\n var DefaultsActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n DefaultsActions.prototype.registerEvents = function() {\n $(ACTIONS.EDIT_LEVEL_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editdefaults', 'tool_dataprivacy', $('#defaults-header').text());\n $.when(promises[0], promises[1], titlePromise).then(function(categoryResponse, purposeResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n showDefaultsFormModal(title, contextLevel, category, purpose, null, categories, purposes, null);\n\n return true;\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.NEW_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {'nodefaults': true}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('addnewdefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, null, null, null, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.EDIT_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var category = button.data('category');\n var purpose = button.data('purpose');\n var activity = button.data('activityname');\n\n // Get options.\n var requests = [\n {methodname: 'tool_dataprivacy_get_category_options', args: {}},\n {methodname: 'tool_dataprivacy_get_purpose_options', args: {}},\n {methodname: 'tool_dataprivacy_get_activity_options', args: {}}\n ];\n\n var promises = Ajax.call(requests);\n var titlePromise = Str.get_string('editmoduledefaults', 'tool_dataprivacy');\n\n $.when(promises[0], promises[1], promises[2], titlePromise).then(\n function(categoryResponse, purposeResponse, activityResponse, title) {\n var categories = categoryResponse.options;\n var purposes = purposeResponse.options;\n var activities = activityResponse.options;\n\n showDefaultsFormModal(title, contextLevel, category, purpose, activity, categories, purposes, activities);\n\n return true;\n\n }).catch(Notification.exception);\n }\n );\n\n $(ACTIONS.DELETE_ACTIVITY_DEFAULTS).click(function(e) {\n e.preventDefault();\n\n var button = $(this);\n var contextLevel = button.data('contextlevel');\n var activity = button.data('activityname');\n var activityDisplayName = button.data('activitydisplayname');\n // Set category and purpose to inherit (-1).\n var category = INHERIT;\n var purpose = INHERIT;\n\n ModalFactory.create({\n title: Str.get_string('deletedefaults', 'tool_dataprivacy', activityDisplayName),\n body: Templates.render('tool_dataprivacy/delete_activity_defaults', {\"activityname\": activityDisplayName}),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n modal.setSaveButtonText(Str.get_string('delete'));\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n setContextDefaults(contextLevel, category, purpose, activity, false);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return true;\n }).catch(Notification.exception);\n });\n };\n\n /**\n * Prepares and renders the modal for setting the defaults for the given context level/plugin.\n *\n * @param {String} title The modal's title.\n * @param {Number} contextLevel The context level to set defaults for.\n * @param {Number} category The current category ID.\n * @param {Number} purpose The current purpose ID.\n * @param {String} activity The plugin name of the activity. Optional.\n * @param {Array} categoryOptions The list of category options.\n * @param {Array} purposeOptions The list of purpose options.\n * @param {Array} activityOptions The list of activity options. Optional.\n */\n function showDefaultsFormModal(title, contextLevel, category, purpose, activity,\n categoryOptions, purposeOptions, activityOptions) {\n\n if (category !== null) {\n categoryOptions.forEach(function(currentValue) {\n if (currentValue.id === category) {\n currentValue.selected = true;\n }\n });\n }\n\n if (purpose !== null) {\n purposeOptions.forEach(function(currentValue) {\n if (currentValue.id === purpose) {\n currentValue.selected = true;\n }\n });\n }\n\n var templateContext = {\n \"contextlevel\": contextLevel,\n \"categoryoptions\": categoryOptions,\n \"purposeoptions\": purposeOptions\n };\n\n // Check the activityOptions parameter that was passed.\n if (activityOptions !== null && activityOptions.length) {\n // Check the activity parameter that was passed.\n if (activity === null) {\n // We're setting a new defaults for a module.\n templateContext.newactivitydefaults = true;\n\n } else {\n // Edit mode. Set selection.\n activityOptions.forEach(function(currentValue) {\n if (activity === currentValue.name) {\n currentValue.selected = true;\n }\n });\n }\n\n templateContext.modemodule = true;\n templateContext.activityoptions = activityOptions;\n }\n\n ModalFactory.create({\n title: title,\n body: Templates.render('tool_dataprivacy/category_purpose_form', templateContext),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n }).then(function(modal) {\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n var activity = $('#activity');\n var activityVal = typeof activity !== 'undefined' ? activity.val() : null;\n var override = $('#override');\n var overrideVal = typeof override !== 'undefined' ? override.is(':checked') : false;\n\n setContextDefaults($('#contextlevel').val(), $('#category').val(), $('#purpose').val(), activityVal, overrideVal);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a the tool_dataprivacy_set_context_defaults WS function.\n *\n * @param {Number} contextLevel The context level.\n * @param {Number} category The category ID.\n * @param {Number} purpose The purpose ID.\n * @param {String} activity The plugin name of the activity module.\n * @param {Boolean} override Whether to override custom instances.\n */\n function setContextDefaults(contextLevel, category, purpose, activity, override) {\n var request = {\n methodname: 'tool_dataprivacy_set_context_defaults',\n args: {\n 'contextlevel': contextLevel,\n 'category': category,\n 'purpose': purpose,\n 'override': override,\n 'activity': activity\n }\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n }\n });\n }\n\n return /** @alias module:tool_dataprivacy/defaultsactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {DefaultsActions}\n */\n 'init': function() {\n return new DefaultsActions();\n }\n };\n});\n"],"file":"defaultsactions.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js index 1fba508e9a1bf..b7bd5b769fc33 100644 --- a/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js +++ b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b={PURPOSE_SELECT:"#id_purposeid",RETENTION_FIELD:"#fitem_id_retention_current [data-fieldtype=static]"},c=function(a){this.purposeRetentionPeriods=a,this.registerEventListeners()},d=function(){a(b.PURPOSE_SELECT).off("change")};return c.prototype.purposeRetentionPeriods=[],c.prototype.registerEventListeners=function(){a(b.PURPOSE_SELECT).on("change",function(c){var d=a(c.currentTarget).val(),e=this.purposeRetentionPeriods[d];a(b.RETENTION_FIELD).text(e)}.bind(this))},{init:function(a){return d(),new c(a)}}}); \ No newline at end of file +define ("tool_dataprivacy/effective_retention_period",["jquery"],function(a){var b={PURPOSE_SELECT:"#id_purposeid",RETENTION_FIELD:"#fitem_id_retention_current [data-fieldtype=static]"},c=function(a){this.purposeRetentionPeriods=a;this.registerEventListeners()},d=function(){a(b.PURPOSE_SELECT).off("change")};c.prototype.purposeRetentionPeriods=[];c.prototype.registerEventListeners=function(){a(b.PURPOSE_SELECT).on("change",function(c){var d=a(c.currentTarget).val(),e=this.purposeRetentionPeriods[d];a(b.RETENTION_FIELD).text(e)}.bind(this))};return{init:function init(a){d();return new c(a)}}}); +//# sourceMappingURL=effective_retention_period.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map new file mode 100644 index 0000000000000..0452cf79826a4 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/effective_retention_period.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/effective_retention_period.js"],"names":["define","$","SELECTORS","PURPOSE_SELECT","RETENTION_FIELD","EffectiveRetentionPeriod","purposeRetentionPeriods","registerEventListeners","removeListeners","off","prototype","on","ev","selected","currentTarget","val","selectedPurpose","text","bind","init"],"mappings":"AAuBAA,OAAM,+CAAC,CAAC,QAAD,CAAD,CACF,SAASC,CAAT,CAAY,IAEJC,CAAAA,CAAS,CAAG,CACZC,cAAc,CAAE,eADJ,CAEZC,eAAe,CAAE,qDAFL,CAFR,CAYJC,CAAwB,CAAG,SAASC,CAAT,CAAkC,CAC7D,KAAKA,uBAAL,CAA+BA,CAA/B,CACA,KAAKC,sBAAL,EACH,CAfO,CAsBJC,CAAe,CAAG,UAAW,CAC7BP,CAAC,CAACC,CAAS,CAACC,cAAX,CAAD,CAA4BM,GAA5B,CAAgC,QAAhC,CACH,CAxBO,CA8BRJ,CAAwB,CAACK,SAAzB,CAAmCJ,uBAAnC,CAA6D,EAA7D,CAOAD,CAAwB,CAACK,SAAzB,CAAmCH,sBAAnC,CAA4D,UAAW,CAEnEN,CAAC,CAACC,CAAS,CAACC,cAAX,CAAD,CAA4BQ,EAA5B,CAA+B,QAA/B,CAAyC,SAASC,CAAT,CAAa,IAC9CC,CAAAA,CAAQ,CAAGZ,CAAC,CAACW,CAAE,CAACE,aAAJ,CAAD,CAAoBC,GAApB,EADmC,CAE9CC,CAAe,CAAG,KAAKV,uBAAL,CAA6BO,CAA7B,CAF4B,CAGlDZ,CAAC,CAACC,CAAS,CAACE,eAAX,CAAD,CAA6Ba,IAA7B,CAAkCD,CAAlC,CACH,CAJwC,CAIvCE,IAJuC,CAIlC,IAJkC,CAAzC,CAKH,CAPD,CASA,MAAwE,CACpEC,IAAI,CAAE,cAASb,CAAT,CAAkC,CAEpCE,CAAe,GACf,MAAO,IAAIH,CAAAA,CAAJ,CAA6BC,CAA7B,CACV,CALmE,CAO3E,CAtDC,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to update the displayed retention period.\n *\n * @module tool_dataprivacy/effective_retention_period\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'],\n function($) {\n\n var SELECTORS = {\n PURPOSE_SELECT: '#id_purposeid',\n RETENTION_FIELD: '#fitem_id_retention_current [data-fieldtype=static]',\n };\n\n /**\n * Constructor for the retention period display.\n *\n * @param {Array} purposeRetentionPeriods Associative array of purposeids with effective retention period at this context\n */\n var EffectiveRetentionPeriod = function(purposeRetentionPeriods) {\n this.purposeRetentionPeriods = purposeRetentionPeriods;\n this.registerEventListeners();\n };\n\n /**\n * Removes the current 'change' listeners.\n *\n * Useful when a new form is loaded.\n */\n var removeListeners = function() {\n $(SELECTORS.PURPOSE_SELECT).off('change');\n };\n\n /**\n * @var {Array} purposeRetentionPeriods\n * @private\n */\n EffectiveRetentionPeriod.prototype.purposeRetentionPeriods = [];\n\n /**\n * Add purpose change listeners.\n *\n * @method registerEventListeners\n */\n EffectiveRetentionPeriod.prototype.registerEventListeners = function() {\n\n $(SELECTORS.PURPOSE_SELECT).on('change', function(ev) {\n var selected = $(ev.currentTarget).val();\n var selectedPurpose = this.purposeRetentionPeriods[selected];\n $(SELECTORS.RETENTION_FIELD).text(selectedPurpose);\n }.bind(this));\n };\n\n return /** @alias module:tool_dataprivacy/effective_retention_period */ {\n init: function(purposeRetentionPeriods) {\n // Remove previously attached listeners.\n removeListeners();\n return new EffectiveRetentionPeriod(purposeRetentionPeriods);\n }\n };\n }\n);\n\n"],"file":"effective_retention_period.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/events.min.js b/admin/tool/dataprivacy/amd/build/events.min.js index 6c94ab3bb5c64..acae406b7dcf8 100644 --- a/admin/tool/dataprivacy/amd/build/events.min.js +++ b/admin/tool/dataprivacy/amd/build/events.min.js @@ -1 +1,2 @@ -define([],function(){return{approve:"tool_dataprivacy-data_request:approve",bulkApprove:"tool_dataprivacy-data_request:bulk_approve",deny:"tool_dataprivacy-data_request:deny",bulkDeny:"tool_dataprivacy-data_request:bulk_deny",complete:"tool_dataprivacy-data_request:complete"}}); \ No newline at end of file +define ("tool_dataprivacy/events",[],function(){return{approve:"tool_dataprivacy-data_request:approve",bulkApprove:"tool_dataprivacy-data_request:bulk_approve",deny:"tool_dataprivacy-data_request:deny",bulkDeny:"tool_dataprivacy-data_request:bulk_deny",complete:"tool_dataprivacy-data_request:complete"}}); +//# sourceMappingURL=events.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/events.min.js.map b/admin/tool/dataprivacy/amd/build/events.min.js.map new file mode 100644 index 0000000000000..262b82fc9cc31 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/events.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/events.js"],"names":["define","approve","bulkApprove","deny","bulkDeny","complete"],"mappings":"AAwBAA,OAAM,2BAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,OAAO,CAAE,uCADN,CAEHC,WAAW,CAAE,4CAFV,CAGHC,IAAI,CAAE,oCAHH,CAIHC,QAAQ,CAAE,yCAJP,CAKHC,QAAQ,CAAE,wCALP,CAOV,CARK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Contain the events the data privacy tool can fire.\n *\n * @module tool_dataprivacy/events\n * @class events\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n approve: 'tool_dataprivacy-data_request:approve',\n bulkApprove: 'tool_dataprivacy-data_request:bulk_approve',\n deny: 'tool_dataprivacy-data_request:deny',\n bulkDeny: 'tool_dataprivacy-data_request:bulk_deny',\n complete: 'tool_dataprivacy-data_request:complete'\n };\n});\n"],"file":"events.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/expand_contract.min.js b/admin/tool/dataprivacy/amd/build/expand_contract.min.js index 3419d58da10fa..ac0d11f5580e4 100644 --- a/admin/tool/dataprivacy/amd/build/expand_contract.min.js +++ b/admin/tool/dataprivacy/amd/build/expand_contract.min.js @@ -1 +1,2 @@ -define(["jquery","core/url","core/str"],function(a,b,c){var d=a(''),e=a('');return{expandCollapse:function(a,b){a.hasClass("hide")?(a.removeClass("hide"),a.addClass("visible"),a.attr("aria-expanded",!0),b.find(":header i.fa").removeClass("fa-plus-square"),b.find(":header i.fa").addClass("fa-minus-square"),b.find(":header img.icon").attr("src",d.attr("src"))):(a.removeClass("visible"),a.addClass("hide"),a.attr("aria-expanded",!1),b.find(":header i.fa").removeClass("fa-minus-square"),b.find(":header i.fa").addClass("fa-plus-square"),b.find(":header img.icon").attr("src",e.attr("src")))},expandCollapseAll:function(b){var f="visible"==b?"hide":"visible",g="visible"==b,h="visible"==b?"fa-plus-square":"fa-minus-square",i="visible"==b?"fa-minus-square":"fa-plus-square",j="visible"==b?d.attr("src"):e.attr("src");a("."+f).each(function(){a(this).removeClass(f),a(this).addClass(b),a(this).attr("aria-expanded",g)}),a(".tool_dataprivacy-expand-all").data("visibilityState",f),c.get_string(f,"tool_dataprivacy").then(function(b){a(".tool_dataprivacy-expand-all").html(b)})["catch"](Notification.exception),a(":header i.fa").each(function(){a(this).removeClass(h),a(this).addClass(i)}),a(":header img.icon").each(function(){a(this).attr("src",j)})}}}); \ No newline at end of file +define ("tool_dataprivacy/expand_contract",["jquery","core/url","core/str"],function(a,b,c){var d=a("\"\""),e=a("\"\"");return{expandCollapse:function expandCollapse(a,b){if(a.hasClass("hide")){a.removeClass("hide");a.addClass("visible");a.attr("aria-expanded",!0);b.find(":header i.fa").removeClass("fa-plus-square");b.find(":header i.fa").addClass("fa-minus-square");b.find(":header img.icon").attr("src",d.attr("src"))}else{a.removeClass("visible");a.addClass("hide");a.attr("aria-expanded",!1);b.find(":header i.fa").removeClass("fa-minus-square");b.find(":header i.fa").addClass("fa-plus-square");b.find(":header img.icon").attr("src",e.attr("src"))}},expandCollapseAll:function expandCollapseAll(b){var f="visible"==b?"hide":"visible",g="visible"==b?!0:!1,h="visible"==b?"fa-plus-square":"fa-minus-square",i="visible"==b?"fa-minus-square":"fa-plus-square",j="visible"==b?d.attr("src"):e.attr("src");a("."+f).each(function(){a(this).removeClass(f);a(this).addClass(b);a(this).attr("aria-expanded",g)});a(".tool_dataprivacy-expand-all").data("visibilityState",f);c.get_string(f,"tool_dataprivacy").then(function(b){a(".tool_dataprivacy-expand-all").html(b)}).catch(Notification.exception);a(":header i.fa").each(function(){a(this).removeClass(h);a(this).addClass(i)});a(":header img.icon").each(function(){a(this).attr("src",j)})}}}); +//# sourceMappingURL=expand_contract.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map b/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map new file mode 100644 index 0000000000000..9ee561c857aba --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/expand_contract.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/expand_contract.js"],"names":["define","$","url","str","expandedImage","imageUrl","collapsedImage","expandCollapse","targetnode","thisnode","hasClass","removeClass","addClass","attr","find","expandCollapseAll","nextstate","currentstate","ariaexpandedstate","iconclassnow","iconclassnext","imagenow","each","data","get_string","then","langString","html","catch","Notification","exception"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Potential user selector module.\n *\n * @module tool_dataprivacy/expand_contract\n * @class page-expand-contract\n * @package tool_dataprivacy\n * @copyright 2018 Adrian Greeve\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/url', 'core/str'], function($, url, str) {\n\n var expandedImage = $('\"\"');\n var collapsedImage = $('\"\"');\n\n return /** @alias module:tool_dataprivacy/expand-collapse */ {\n /**\n * Expand or collapse a selected node.\n *\n * @param {object} targetnode The node that we want to expand / collapse\n * @param {object} thisnode The node that was clicked.\n */\n expandCollapse: function(targetnode, thisnode) {\n if (targetnode.hasClass('hide')) {\n targetnode.removeClass('hide');\n targetnode.addClass('visible');\n targetnode.attr('aria-expanded', true);\n thisnode.find(':header i.fa').removeClass('fa-plus-square');\n thisnode.find(':header i.fa').addClass('fa-minus-square');\n thisnode.find(':header img.icon').attr('src', expandedImage.attr('src'));\n } else {\n targetnode.removeClass('visible');\n targetnode.addClass('hide');\n targetnode.attr('aria-expanded', false);\n thisnode.find(':header i.fa').removeClass('fa-minus-square');\n thisnode.find(':header i.fa').addClass('fa-plus-square');\n thisnode.find(':header img.icon').attr('src', collapsedImage.attr('src'));\n }\n },\n\n /**\n * Expand or collapse all nodes on this page.\n *\n * @param {string} nextstate The next state to change to.\n */\n expandCollapseAll: function(nextstate) {\n var currentstate = (nextstate == 'visible') ? 'hide' : 'visible';\n var ariaexpandedstate = (nextstate == 'visible') ? true : false;\n var iconclassnow = (nextstate == 'visible') ? 'fa-plus-square' : 'fa-minus-square';\n var iconclassnext = (nextstate == 'visible') ? 'fa-minus-square' : 'fa-plus-square';\n var imagenow = (nextstate == 'visible') ? expandedImage.attr('src') : collapsedImage.attr('src');\n $('.' + currentstate).each(function() {\n $(this).removeClass(currentstate);\n $(this).addClass(nextstate);\n $(this).attr('aria-expanded', ariaexpandedstate);\n });\n $('.tool_dataprivacy-expand-all').data('visibilityState', currentstate);\n\n str.get_string(currentstate, 'tool_dataprivacy').then(function(langString) {\n $('.tool_dataprivacy-expand-all').html(langString);\n return;\n }).catch(Notification.exception);\n\n $(':header i.fa').each(function() {\n $(this).removeClass(iconclassnow);\n $(this).addClass(iconclassnext);\n });\n $(':header img.icon').each(function() {\n $(this).attr('src', imagenow);\n });\n }\n };\n});\n"],"file":"expand_contract.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/form-user-selector.min.js b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js index faa073f568c46..72a0c40be9abf 100644 --- a/admin/tool/dataprivacy/amd/build/form-user-selector.min.js +++ b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d},transport:function(d,e,f,g){var h;h=b.call([{methodname:"tool_dataprivacy_get_users",args:{query:e}}]),h[0].then(function(b){var d=[],e=0;return a.each(b,function(a,b){d.push(c.render("tool_dataprivacy/form-user-selector-suggestion",b))}),a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[e],e++}),f(b)})}).fail(g)}}}); \ No newline at end of file +define ("tool_dataprivacy/form-user-selector",["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function processResults(b,c){var d=[];a.each(c,function(a,b){d.push({value:b.id,label:b._label})});return d},transport:function transport(d,e,f,g){var h=b.call([{methodname:"tool_dataprivacy_get_users",args:{query:e}}]);h[0].then(function(b){var d=[],e=0;a.each(b,function(a,b){d.push(c.render("tool_dataprivacy/form-user-selector-suggestion",b))});return a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[e];e++});f(b)})}).fail(g)}}}); +//# sourceMappingURL=form-user-selector.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map new file mode 100644 index 0000000000000..9050ecd1031a4 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/form-user-selector.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/form-user-selector.js"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","promise","call","methodname","args","then","promises","i","render","when","apply","arguments","fail"],"mappings":"AAyBAA,OAAM,uCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAAD,CAA4C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6B,CAE3E,MAAgE,CAE5DC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAK,CAAG,EAAZ,CACAN,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCH,CAAK,CAACI,IAAN,CAAW,CACPC,KAAK,CAAEF,CAAI,CAACG,EADL,CAEPC,KAAK,CAAEJ,CAAI,CAACK,MAFL,CAAX,CAIH,CALD,EAMA,MAAOR,CAAAA,CACV,CAX2D,CAa5DS,SAAS,CAAE,mBAASX,CAAT,CAAmBY,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,CACnD,GAAIC,CAAAA,CAAO,CAEDlB,CAAI,CAACmB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,4BADK,CAEjBC,IAAI,CAAE,CACFN,KAAK,CAAEA,CADL,CAFW,CAAD,CAAV,CAFV,CASAG,CAAO,CAAC,CAAD,CAAP,CAAWI,IAAX,CAAgB,SAASlB,CAAT,CAAkB,CAC9B,GAAImB,CAAAA,CAAQ,CAAG,EAAf,CACIC,CAAC,CAAG,CADR,CAIAzB,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCe,CAAQ,CAACd,IAAT,CAAcR,CAAS,CAACwB,MAAV,CAAiB,gDAAjB,CAAmEjB,CAAnE,CAAd,CACH,CAFD,EAKA,MAAOT,CAAAA,CAAC,CAAC2B,IAAF,CAAOC,KAAP,CAAa5B,CAAC,CAAC2B,IAAf,CAAqBH,CAArB,EAA+BD,IAA/B,CAAoC,UAAW,CAClD,GAAID,CAAAA,CAAI,CAAGO,SAAX,CACA7B,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCA,CAAI,CAACK,MAAL,CAAcQ,CAAI,CAACG,CAAD,CAAlB,CACAA,CAAC,EACJ,CAHD,EAIAR,CAAO,CAACZ,CAAD,CAEV,CARM,CAUV,CApBD,EAoBGyB,IApBH,CAoBQZ,CApBR,CAqBH,CA5C2D,CAgDnE,CAlDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Potential user selector module.\n *\n * @module tool_dataprivacy/form-user-selector\n * @class form-user-selector\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_dataprivacy/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n promise = Ajax.call([{\n methodname: 'tool_dataprivacy_get_users',\n args: {\n query: query\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results, function(index, user) {\n promises.push(Templates.render('tool_dataprivacy/form-user-selector-suggestion', user));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"file":"form-user-selector.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js index 937367c6fe9ae..f510cd2869e8f 100644 --- a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js +++ b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,e,f,g){function h(a){var e={methodname:"tool_dataprivacy_contact_dpo",args:{message:a}},f="success";b.call([e])[0].then(function(a){return a.result?d.get_string("requestsubmitted","tool_dataprivacy"):(f="error",a.warnings.join("
"))}).done(function(a){c.addNotification({message:a,type:f})}).fail(c.exception)}var i={CANCEL_REQUEST:'[data-action="cancel"]',CONTACT_DPO:'[data-action="contactdpo"]'},j=function(){this.registerEvents()};return j.prototype.registerEvents=function(){a(i.CANCEL_REQUEST).click(function(g){g.preventDefault();var h=a(this).data("requestid"),i=[{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}];d.get_strings(i).then(function(a){var d=a[0],g=a[1];return e.create({title:d,body:g,type:e.types.SAVE_CANCEL}).then(function(a){return a.setSaveButtonText(d),a.getRoot().on(f.save,function(){var a={requestid:h},d={methodname:"tool_dataprivacy_cancel_data_request",args:a};b.call([d])[0].done(function(a){a.result?window.location.reload():c.addNotification({message:a.warnings[0].message,type:"error"})}).fail(c.exception)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a})}).done(function(a){a.show()}).fail(c.exception)}),a(i.CONTACT_DPO).click(function(b){b.preventDefault();var i=a(this).data("replytoemail"),j=[{key:"contactdataprotectionofficer",component:"tool_dataprivacy"},{key:"send",component:"tool_dataprivacy"}],k="";d.get_strings(j).then(function(a){var b=a[0];k=a[1];var c={replytoemail:i};return e.create({title:b,body:g.render("tool_dataprivacy/contact_dpo",c),type:e.types.SAVE_CANCEL,large:!0})}).done(function(b){b.setSaveButtonText(k),b.getRoot().on(f.save,function(b){var c=a("#message").val().trim();0===c.length?(b.preventDefault(),a('[data-region="messageinput"]').addClass("has-danger notifyproblem"),a("#id_error_message").removeAttr("hidden")):h(c)}),b.getRoot().on(f.hidden,function(){b.destroy()}),b.show()}).fail(c.exception)})},{init:function(){return new j}}}); \ No newline at end of file +define ("tool_dataprivacy/myrequestactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates"],function(a,b,c,d,e,f,g){var i={CANCEL_REQUEST:"[data-action=\"cancel\"]",CONTACT_DPO:"[data-action=\"contactdpo\"]"},j=function(){this.registerEvents()};j.prototype.registerEvents=function(){a(i.CANCEL_REQUEST).click(function(g){g.preventDefault();var h=a(this).data("requestid");d.get_strings([{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}]).then(function(a){var d=a[0],g=a[1];return e.create({title:d,body:g,type:e.types.SAVE_CANCEL}).then(function(a){a.setSaveButtonText(d);a.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_cancel_data_request",args:{requestid:h}}])[0].done(function(a){if(a.result){window.location.reload()}else{c.addNotification({message:a.warnings[0].message,type:"error"})}}).fail(c.exception)});a.getRoot().on(f.hidden,function(){a.destroy()});return a})}).done(function(a){a.show()}).fail(c.exception)});a(i.CONTACT_DPO).click(function(b){b.preventDefault();var i=a(this).data("replytoemail"),j="";d.get_strings([{key:"contactdataprotectionofficer",component:"tool_dataprivacy"},{key:"send",component:"tool_dataprivacy"}]).then(function(a){var b=a[0];j=a[1];return e.create({title:b,body:g.render("tool_dataprivacy/contact_dpo",{replytoemail:i}),type:e.types.SAVE_CANCEL,large:!0})}).done(function(b){b.setSaveButtonText(j);b.getRoot().on(f.save,function(b){var c=a("#message").val().trim();if(0===c.length){b.preventDefault();a("[data-region=\"messageinput\"]").addClass("has-danger notifyproblem");a("#id_error_message").removeAttr("hidden")}else{h(c)}});b.getRoot().on(f.hidden,function(){b.destroy()});b.show()}).fail(c.exception)})};function h(a){var e="success";b.call([{methodname:"tool_dataprivacy_contact_dpo",args:{message:a}}])[0].then(function(a){if(a.result){return d.get_string("requestsubmitted","tool_dataprivacy")}e="error";return a.warnings.join("
")}).done(function(a){c.addNotification({message:a,type:e})}).fail(c.exception)}return{init:function init(){return new j}}}); +//# sourceMappingURL=myrequestactions.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map new file mode 100644 index 0000000000000..6d17dee57c356 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/myrequestactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/myrequestactions.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ACTIONS","CANCEL_REQUEST","CONTACT_DPO","MyRequestActions","registerEvents","prototype","click","e","preventDefault","requestId","data","get_strings","key","component","then","langStrings","title","confirmMessage","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","call","methodname","args","done","result","window","location","reload","addNotification","message","warnings","fail","exception","hidden","destroy","show","replyToEmail","sendButtonText","modalTitle","render","large","val","trim","length","addClass","removeAttr","sendMessageToDPO","requestType","get_string","join"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD module to enable users to manage their own data requests.\n *\n * @module tool_dataprivacy/myrequestactions\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates) {\n\n /**\n * List of action selectors.\n *\n * @type {{CANCEL_REQUEST: string}}\n * @type {{CONTACT_DPO: string}}\n */\n var ACTIONS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"]',\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n };\n\n /**\n * MyRequestActions class.\n */\n var MyRequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n MyRequestActions.prototype.registerEvents = function() {\n $(ACTIONS.CANCEL_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n var stringkeys = [\n {\n key: 'cancelrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'cancelrequestconfirmation',\n component: 'tool_dataprivacy'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(title);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n // Show the modal!\n modal.show();\n\n }).fail(Notification.exception);\n });\n\n $(ACTIONS.CONTACT_DPO).click(function(e) {\n e.preventDefault();\n\n var replyToEmail = $(this).data('replytoemail');\n\n var keys = [\n {\n key: 'contactdataprotectionofficer',\n component: 'tool_dataprivacy'\n },\n {\n key: 'send',\n component: 'tool_dataprivacy'\n },\n ];\n\n var sendButtonText = '';\n Str.get_strings(keys).then(function(langStrings) {\n var modalTitle = langStrings[0];\n sendButtonText = langStrings[1];\n var context = {\n 'replytoemail': replyToEmail\n };\n return ModalFactory.create({\n title: modalTitle,\n body: Templates.render('tool_dataprivacy/contact_dpo', context),\n type: ModalFactory.types.SAVE_CANCEL,\n large: true\n });\n }).done(function(modal) {\n modal.setSaveButtonText(sendButtonText);\n\n // Handle send event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n var message = $('#message').val().trim();\n if (message.length === 0) {\n e.preventDefault();\n // Show validation error when the message is empty.\n $('[data-region=\"messageinput\"]').addClass('has-danger notifyproblem');\n $('#id_error_message').removeAttr('hidden');\n } else {\n // Send the message.\n sendMessageToDPO(message);\n }\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal!\n modal.show();\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Send message to the Data Protection Officer.\n *\n * @param {String} message The message to send.\n */\n function sendMessageToDPO(message) {\n var request = {\n methodname: 'tool_dataprivacy_contact_dpo',\n args: {\n message: message\n }\n };\n\n var requestType = 'success';\n Ajax.call([request])[0].then(function(data) {\n if (data.result) {\n return Str.get_string('requestsubmitted', 'tool_dataprivacy');\n }\n requestType = 'error';\n return data.warnings.join('
');\n\n }).done(function(message) {\n Notification.addNotification({\n message: message,\n type: requestType\n });\n\n }).fail(Notification.exception);\n }\n\n return /** @alias module:tool_dataprivacy/myrequestactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the unified user filter.\n *\n * @method init\n * @return {MyRequestActions}\n */\n 'init': function() {\n return new MyRequestActions();\n }\n };\n});\n"],"file":"myrequestactions.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/purposesactions.min.js b/admin/tool/dataprivacy/amd/build/purposesactions.min.js index 33b773c865681..765e5ef410237 100644 --- a/admin/tool/dataprivacy/amd/build/purposesactions.min.js +++ b/admin/tool/dataprivacy/amd/build/purposesactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:'[data-action="deletepurpose"]'},h=function(){this.registerEvents()};return h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name"),j=[{key:"deletepurpose",component:"tool_dataprivacy"},{key:"deletepurposetext",component:"tool_dataprivacy",param:i},{key:"delete"}];d.get_strings(j).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){return d.setSaveButtonText(j),d.getRoot().on(f.save,function(){var d={methodname:"tool_dataprivacy_delete_purpose",args:{id:h}};b.call([d])[0].done(function(b){b.result?a('tr[data-purposeid="'+h+'"]').remove():c.addNotification({message:b.warnings[0].message,type:"error"})}).fail(c.exception)}),d.getRoot().on(f.hidden,function(){d.destroy()}),d})}).done(function(a){a.show()}).fail(c.exception)})},{init:function(){return new h}}}); \ No newline at end of file +define ("tool_dataprivacy/purposesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:"[data-action=\"deletepurpose\"]"},h=function(){this.registerEvents()};h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name");d.get_strings([{key:"deletepurpose",component:"tool_dataprivacy"},{key:"deletepurposetext",component:"tool_dataprivacy",param:i},{key:"delete"}]).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){d.setSaveButtonText(j);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_delete_purpose",args:{id:h}}])[0].done(function(b){if(b.result){a("tr[data-purposeid=\""+h+"\"]").remove()}else{c.addNotification({message:b.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d})}).done(function(a){a.show()}).fail(c.exception)})};return{init:function init(){return new h}}}); +//# sourceMappingURL=purposesactions.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map b/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map new file mode 100644 index 0000000000000..3762f307df031 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/purposesactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/purposesactions.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","ACTIONS","DELETE","PurposesActions","registerEvents","prototype","click","e","preventDefault","id","data","purposename","get_strings","key","component","param","then","langStrings","title","confirmMessage","buttonText","create","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","on","save","call","methodname","args","done","result","remove","addNotification","message","warnings","fail","exception","hidden","destroy","show"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD module for purposes actions.\n *\n * @module tool_dataprivacy/purposesactions\n * @package tool_dataprivacy\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{DELETE: string}}\n */\n var ACTIONS = {\n DELETE: '[data-action=\"deletepurpose\"]',\n };\n\n /**\n * PurposesActions class.\n */\n var PurposesActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n PurposesActions.prototype.registerEvents = function() {\n $(ACTIONS.DELETE).click(function(e) {\n e.preventDefault();\n\n var id = $(this).data('id');\n var purposename = $(this).data('name');\n var stringkeys = [\n {\n key: 'deletepurpose',\n component: 'tool_dataprivacy'\n },\n {\n key: 'deletepurposetext',\n component: 'tool_dataprivacy',\n param: purposename\n },\n {\n key: 'delete'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langStrings) {\n var title = langStrings[0];\n var confirmMessage = langStrings[1];\n var buttonText = langStrings[2];\n return ModalFactory.create({\n title: title,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n }).then(function(modal) {\n modal.setSaveButtonText(buttonText);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n\n var request = {\n methodname: 'tool_dataprivacy_delete_purpose',\n args: {'id': id}\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n $('tr[data-purposeid=\"' + id + '\"]').remove();\n } else {\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n });\n }).done(function(modal) {\n modal.show();\n\n }).fail(Notification.exception);\n });\n };\n\n return /** @alias module:tool_dataprivacy/purposesactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the module.\n *\n * @method init\n * @return {PurposesActions}\n */\n 'init': function() {\n return new PurposesActions();\n }\n };\n});\n"],"file":"purposesactions.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/request_filter.min.js b/admin/tool/dataprivacy/amd/build/request_filter.min.js index 61344eb0fe6d8..ed6083482919a 100644 --- a/admin/tool/dataprivacy/amd/build/request_filter.min.js +++ b/admin/tool/dataprivacy/amd/build/request_filter.min.js @@ -1 +1,2 @@ -define(["jquery","core/form-autocomplete","core/str","core/notification"],function(a,b,c,d){var e={REQUEST_FILTERS:"#request-filters"},f=function(){var f=[{key:"filter",component:"moodle"},{key:"nofiltersapplied",component:"moodle"}];c.get_strings(f).then(function(a){var c=a[0],d=a[1];return b.enhance(e.REQUEST_FILTERS,!1,"",c,!1,!0,d,!0)}).fail(d.exception);var g=a(e.REQUEST_FILTERS).val();a(e.REQUEST_FILTERS).on("change",function(){var b=a(this).val();g.join(",")!==b.join(",")&&(0===b.length&&a("#filters-cleared").val(1),a(this.form).submit())})};return{init:function(){f()}}}); \ No newline at end of file +define ("tool_dataprivacy/request_filter",["jquery","core/form-autocomplete","core/str","core/notification"],function(a,b,c,d){var e={REQUEST_FILTERS:"#request-filters"},f=function init(){c.get_strings([{key:"filter",component:"moodle"},{key:"nofiltersapplied",component:"moodle"}]).then(function(a){var c=a[0],d=a[1];return b.enhance(e.REQUEST_FILTERS,!1,"",c,!1,!0,d,!0)}).fail(d.exception);var f=a(e.REQUEST_FILTERS).val();a(e.REQUEST_FILTERS).on("change",function(){var b=a(this).val();if(f.join(",")!==b.join(",")){if(0===b.length){a("#filters-cleared").val(1)}a(this.form).submit()}})};return{init:function init(){f()}}}); +//# sourceMappingURL=request_filter.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/request_filter.min.js.map b/admin/tool/dataprivacy/amd/build/request_filter.min.js.map new file mode 100644 index 0000000000000..0bb55f0f1f0ce --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/request_filter.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/request_filter.js"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","REQUEST_FILTERS","init","get_strings","key","component","then","langstrings","placeholder","noSelectionString","enhance","fail","exception","last","val","on","current","join","length","form","submit"],"mappings":"AAuBAA,OAAM,mCAAC,CAAC,QAAD,CAAW,wBAAX,CAAqC,UAArC,CAAiD,mBAAjD,CAAD,CAAwE,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAA+BC,CAA/B,CAA6C,IAQnHC,CAAAA,CAAS,CAAG,CACZC,eAAe,CAAE,kBADL,CARuG,CAkBnHC,CAAI,CAAG,QAAPA,CAAAA,IAAO,EAAW,CAYlBJ,CAAG,CAACK,WAAJ,CAXiB,CACb,CACIC,GAAG,CAAE,QADT,CAEIC,SAAS,CAAE,QAFf,CADa,CAKb,CACID,GAAG,CAAE,kBADT,CAEIC,SAAS,CAAE,QAFf,CALa,CAWjB,EAA4BC,IAA5B,CAAiC,SAASC,CAAT,CAAsB,IAC/CC,CAAAA,CAAW,CAAGD,CAAW,CAAC,CAAD,CADsB,CAE/CE,CAAiB,CAAGF,CAAW,CAAC,CAAD,CAFgB,CAGnD,MAAOV,CAAAA,CAAY,CAACa,OAAb,CAAqBV,CAAS,CAACC,eAA/B,IAAuD,EAAvD,CAA2DO,CAA3D,OAAqFC,CAArF,IACV,CAJD,EAIGE,IAJH,CAIQZ,CAAY,CAACa,SAJrB,EAMA,GAAIC,CAAAA,CAAI,CAAGjB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6Ba,GAA7B,EAAX,CACAlB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6Bc,EAA7B,CAAgC,QAAhC,CAA0C,UAAW,CACjD,GAAIC,CAAAA,CAAO,CAAGpB,CAAC,CAAC,IAAD,CAAD,CAAQkB,GAAR,EAAd,CAEA,GAAID,CAAI,CAACI,IAAL,CAAU,GAAV,IAAmBD,CAAO,CAACC,IAAR,CAAa,GAAb,CAAvB,CAA0C,CAEtC,GAAuB,CAAnB,GAAAD,CAAO,CAACE,MAAZ,CAA0B,CACtBtB,CAAC,CAAC,kBAAD,CAAD,CAAsBkB,GAAtB,CAA0B,CAA1B,CACH,CACDlB,CAAC,CAAC,KAAKuB,IAAN,CAAD,CAAaC,MAAb,EACH,CACJ,CAVD,CAWH,CAhDsH,CAkDvH,MAAmD,CAM/ClB,IAAI,CAAE,eAAW,CACbA,CAAI,EACP,CAR8C,CAUtD,CA5DK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * JS module for the data requests filter.\n *\n * @module tool_dataprivacy/request_filter\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{REQUEST_FILTERS: string}}\n */\n var SELECTORS = {\n REQUEST_FILTERS: '#request-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [\n {\n key: 'filter',\n component: 'moodle'\n },\n {\n key: 'nofiltersapplied',\n component: 'moodle'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n return Autocomplete.enhance(SELECTORS.REQUEST_FILTERS, false, '', placeholder, false, true, noSelectionString, true);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.REQUEST_FILTERS).val();\n $(SELECTORS.REQUEST_FILTERS).on('change', function() {\n var current = $(this).val();\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') !== current.join(',')) {\n // If we're submitting without filters, set the hidden input 'filters-cleared' to 1.\n if (current.length === 0) {\n $('#filters-cleared').val(1);\n }\n $(this.form).submit();\n }\n });\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n }\n };\n});\n"],"file":"request_filter.min.js"} \ No newline at end of file diff --git a/admin/tool/dataprivacy/amd/build/requestactions.min.js b/admin/tool/dataprivacy/amd/build/requestactions.min.js index 2260ee3236ce6..3c081e89dda41 100644 --- a/admin/tool/dataprivacy/amd/build/requestactions.min.js +++ b/admin/tool/dataprivacy/amd/build/requestactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates","tool_dataprivacy/data_request_modal","tool_dataprivacy/events"],function(a,b,c,d,e,f,g,h,i){function j(a){return{wsfunction:"tool_dataprivacy_approve_data_request",wsparams:{requestid:a}}}function k(a){return{wsfunction:"tool_dataprivacy_bulk_approve_data_requests",wsparams:{requestids:a}}}function l(a){return{wsfunction:"tool_dataprivacy_deny_data_request",wsparams:{requestid:a}}}function m(a){return{wsfunction:"tool_dataprivacy_bulk_deny_data_requests",wsparams:{requestids:a}}}function n(a){return{wsfunction:"tool_dataprivacy_mark_complete",wsparams:{requestid:a}}}function o(a,b){var g=[];switch(a){case i.approve:g=[{key:"approverequest",component:"tool_dataprivacy"},{key:"confirmapproval",component:"tool_dataprivacy"}];break;case i.bulkApprove:g=[{key:"bulkapproverequests",component:"tool_dataprivacy"},{key:"confirmbulkapproval",component:"tool_dataprivacy"}];break;case i.deny:g=[{key:"denyrequest",component:"tool_dataprivacy"},{key:"confirmdenial",component:"tool_dataprivacy"}];break;case i.bulkDeny:g=[{key:"bulkdenyrequests",component:"tool_dataprivacy"},{key:"confirmbulkdenial",component:"tool_dataprivacy"}];break;case i.complete:g=[{key:"markcomplete",component:"tool_dataprivacy"},{key:"confirmcompletion",component:"tool_dataprivacy"}]}var h="";d.get_strings(g).then(function(a){h=a[0];var b=a[1];return e.create({title:h,body:b,type:e.types.SAVE_CANCEL})}).then(function(a){a.setSaveButtonText(h),a.getRoot().on(f.save,function(){p(b.wsfunction,b.wsparams)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a.show()})["catch"](c.exception)}function p(a,d){var e={methodname:a,args:d};b.call([e])[0].done(function(a){a.result?window.location.reload():c.addNotification({message:a.warnings[0].message,type:"error"})}).fail(c.exception)}var q={APPROVE_REQUEST:'[data-action="approve"]',DENY_REQUEST:'[data-action="deny"]',VIEW_REQUEST:'[data-action="view"]',MARK_COMPLETE:'[data-action="complete"]',CHANGE_BULK_ACTION:'[id="bulk-action"]',CONFIRM_BULK_ACTION:'[id="confirm-bulk-action"]',SELECT_ALL:'[data-action="selectall"]'},r={APPROVE:1,DENY:2},s={SELECT_REQUEST:".selectrequests"},t=function(){this.registerEvents()};return t.prototype.registerEvents=function(){a(q.VIEW_REQUEST).click(function(d){d.preventDefault();var k=a(this).data("requestid"),m={requestid:k},n={methodname:"tool_dataprivacy_get_data_request",args:m},q=b.call([n]);a.when(q[0]).then(function(a){return a.result?a.result:(c.addNotification({message:a.warnings[0].message,type:"error"}),!1)}).then(function(a){var b=g.render("tool_dataprivacy/request_details",a),c={approvedeny:a.approvedeny,canmarkcomplete:a.canmarkcomplete};return e.create({title:a.typename,body:b,type:h.TYPE,large:!0,templateContext:c})}).then(function(a){a.getRoot().on(i.approve,function(){o(i.approve,j(k))}),a.getRoot().on(i.deny,function(){o(i.deny,l(k))}),a.getRoot().on(i.complete,function(){var a={requestid:k};p("tool_dataprivacy_mark_complete",a)}),a.getRoot().on(f.hidden,function(){a.destroy()}),a.show()})["catch"](c.exception)}),a(q.APPROVE_REQUEST).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.approve,j(c))}),a(q.DENY_REQUEST).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.deny,l(c))}),a(q.MARK_COMPLETE).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.complete,n(c))}),a(q.CONFIRM_BULK_ACTION).click(function(){var b=[],e="",f={},g=[{key:"selectbulkaction",component:"tool_dataprivacy"},{key:"selectdatarequests",component:"tool_dataprivacy"},{key:"ok"}],h=parseInt(a("#bulk-action").val());if(h!=r.APPROVE&&h!=r.DENY)return void d.get_strings(g).done(function(a){c.alert("",a[0],a[2])}).fail(c.exception);if(a(".selectrequests:checked").each(function(){b.push(a(this).val())}),b.length<1)return void d.get_strings(g).done(function(a){c.alert("",a[1],a[2])}).fail(c.exception);switch(h){case r.APPROVE:e=i.bulkApprove,f=k(b);break;case r.DENY:e=i.bulkDeny,f=m(b)}o(e,f)}),a(q.SELECT_ALL).change(function(b){b.preventDefault();var c=a(this).is(":checked");a(s.SELECT_REQUEST).prop("checked",c)})},t}); \ No newline at end of file +define ("tool_dataprivacy/requestactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events","core/templates","tool_dataprivacy/data_request_modal","tool_dataprivacy/events"],function(a,b,c,d,e,f,g,h,i){var q={APPROVE_REQUEST:"[data-action=\"approve\"]",DENY_REQUEST:"[data-action=\"deny\"]",VIEW_REQUEST:"[data-action=\"view\"]",MARK_COMPLETE:"[data-action=\"complete\"]",CHANGE_BULK_ACTION:"[id=\"bulk-action\"]",CONFIRM_BULK_ACTION:"[id=\"confirm-bulk-action\"]",SELECT_ALL:"[data-action=\"selectall\"]"},r={APPROVE:1,DENY:2},s={SELECT_REQUEST:".selectrequests"},t=function(){this.registerEvents()};t.prototype.registerEvents=function(){a(q.VIEW_REQUEST).click(function(d){d.preventDefault();var k=a(this).data("requestid"),m=b.call([{methodname:"tool_dataprivacy_get_data_request",args:{requestid:k}}]);a.when(m[0]).then(function(a){if(a.result){return a.result}c.addNotification({message:a.warnings[0].message,type:"error"});return!1}).then(function(a){var b=g.render("tool_dataprivacy/request_details",a),c={approvedeny:a.approvedeny,canmarkcomplete:a.canmarkcomplete};return e.create({title:a.typename,body:b,type:h.TYPE,large:!0,templateContext:c})}).then(function(a){a.getRoot().on(i.approve,function(){o(i.approve,j(k))});a.getRoot().on(i.deny,function(){o(i.deny,l(k))});a.getRoot().on(i.complete,function(){p("tool_dataprivacy_mark_complete",{requestid:k})});a.getRoot().on(f.hidden,function(){a.destroy()});a.show()}).catch(c.exception)});a(q.APPROVE_REQUEST).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.approve,j(c))});a(q.DENY_REQUEST).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.deny,l(c))});a(q.MARK_COMPLETE).click(function(b){b.preventDefault();var c=a(this).data("requestid");o(i.complete,n(c))});a(q.CONFIRM_BULK_ACTION).click(function(){var b=[],e="",f={},g=[{key:"selectbulkaction",component:"tool_dataprivacy"},{key:"selectdatarequests",component:"tool_dataprivacy"},{key:"ok"}],h=parseInt(a("#bulk-action").val());if(h!=r.APPROVE&&h!=r.DENY){d.get_strings(g).done(function(a){c.alert("",a[0],a[2])}).fail(c.exception);return}a(".selectrequests:checked").each(function(){b.push(a(this).val())});if(1>b.length){d.get_strings(g).done(function(a){c.alert("",a[1],a[2])}).fail(c.exception);return}switch(h){case r.APPROVE:e=i.bulkApprove;f=k(b);break;case r.DENY:e=i.bulkDeny;f=m(b);}o(e,f)});a(q.SELECT_ALL).change(function(b){b.preventDefault();var c=a(this).is(":checked");a(s.SELECT_REQUEST).prop("checked",c)})};function j(a){return{wsfunction:"tool_dataprivacy_approve_data_request",wsparams:{requestid:a}}}function k(a){return{wsfunction:"tool_dataprivacy_bulk_approve_data_requests",wsparams:{requestids:a}}}function l(a){return{wsfunction:"tool_dataprivacy_deny_data_request",wsparams:{requestid:a}}}function m(a){return{wsfunction:"tool_dataprivacy_bulk_deny_data_requests",wsparams:{requestids:a}}}function n(a){return{wsfunction:"tool_dataprivacy_mark_complete",wsparams:{requestid:a}}}function o(a,b){var g=[];switch(a){case i.approve:g=[{key:"approverequest",component:"tool_dataprivacy"},{key:"confirmapproval",component:"tool_dataprivacy"}];break;case i.bulkApprove:g=[{key:"bulkapproverequests",component:"tool_dataprivacy"},{key:"confirmbulkapproval",component:"tool_dataprivacy"}];break;case i.deny:g=[{key:"denyrequest",component:"tool_dataprivacy"},{key:"confirmdenial",component:"tool_dataprivacy"}];break;case i.bulkDeny:g=[{key:"bulkdenyrequests",component:"tool_dataprivacy"},{key:"confirmbulkdenial",component:"tool_dataprivacy"}];break;case i.complete:g=[{key:"markcomplete",component:"tool_dataprivacy"},{key:"confirmcompletion",component:"tool_dataprivacy"}];break;}var h="";d.get_strings(g).then(function(a){h=a[0];var b=a[1];return e.create({title:h,body:b,type:e.types.SAVE_CANCEL})}).then(function(a){a.setSaveButtonText(h);a.getRoot().on(f.save,function(){p(b.wsfunction,b.wsparams)});a.getRoot().on(f.hidden,function(){a.destroy()});a.show()}).catch(c.exception)}function p(a,d){b.call([{methodname:a,args:d}])[0].done(function(a){if(a.result){window.location.reload()}else{c.addNotification({message:a.warnings[0].message,type:"error"})}}).fail(c.exception)}return t}); +//# sourceMappingURL=requestactions.min.js.map diff --git a/admin/tool/dataprivacy/amd/build/requestactions.min.js.map b/admin/tool/dataprivacy/amd/build/requestactions.min.js.map new file mode 100644 index 0000000000000..4f39d1361bed0 --- /dev/null +++ b/admin/tool/dataprivacy/amd/build/requestactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/requestactions.js"],"names":["define","$","Ajax","Notification","Str","ModalFactory","ModalEvents","Templates","ModalDataRequest","DataPrivacyEvents","ACTIONS","APPROVE_REQUEST","DENY_REQUEST","VIEW_REQUEST","MARK_COMPLETE","CHANGE_BULK_ACTION","CONFIRM_BULK_ACTION","SELECT_ALL","BULK_ACTIONS","APPROVE","DENY","SELECTORS","SELECT_REQUEST","RequestActions","registerEvents","prototype","click","e","preventDefault","requestId","data","promises","call","methodname","args","when","then","result","addNotification","message","warnings","type","body","render","templateContext","approvedeny","canmarkcomplete","create","title","typename","TYPE","large","modal","getRoot","on","approve","showConfirmation","approveEventWsData","deny","denyEventWsData","complete","handleSave","hidden","destroy","show","catch","exception","completeEventWsData","requestIds","actionEvent","wsdata","bulkActionKeys","key","component","bulkaction","parseInt","val","get_strings","done","langStrings","alert","fail","each","push","length","bulkApprove","bulkApproveEventWsData","bulkDeny","bulkDenyEventWsData","change","selectAll","is","prop","action","keys","modalTitle","confirmMessage","types","SAVE_CANCEL","setSaveButtonText","save","wsfunction","wsparams","params","window","location","reload"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Request actions.\n *\n * @module tool_dataprivacy/requestactions\n * @package tool_dataprivacy\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/templates',\n 'tool_dataprivacy/data_request_modal',\n 'tool_dataprivacy/events'],\nfunction($, Ajax, Notification, Str, ModalFactory, ModalEvents, Templates, ModalDataRequest, DataPrivacyEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{APPROVE_REQUEST: string}}\n * @type {{DENY_REQUEST: string}}\n * @type {{VIEW_REQUEST: string}}\n * @type {{MARK_COMPLETE: string}}\n * @type {{CHANGE_BULK_ACTION: string}}\n * @type {{CONFIRM_BULK_ACTION: string}}\n * @type {{SELECT_ALL: string}}\n */\n var ACTIONS = {\n APPROVE_REQUEST: '[data-action=\"approve\"]',\n DENY_REQUEST: '[data-action=\"deny\"]',\n VIEW_REQUEST: '[data-action=\"view\"]',\n MARK_COMPLETE: '[data-action=\"complete\"]',\n CHANGE_BULK_ACTION: '[id=\"bulk-action\"]',\n CONFIRM_BULK_ACTION: '[id=\"confirm-bulk-action\"]',\n SELECT_ALL: '[data-action=\"selectall\"]'\n };\n\n /**\n * List of available bulk actions.\n *\n * @type {{APPROVE: number}}\n * @type {{DENY: number}}\n */\n var BULK_ACTIONS = {\n APPROVE: 1,\n DENY: 2\n };\n\n /**\n * List of selectors.\n *\n * @type {{SELECT_REQUEST: string}}\n */\n var SELECTORS = {\n SELECT_REQUEST: '.selectrequests'\n };\n\n /**\n * RequestActions class.\n */\n var RequestActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n RequestActions.prototype.registerEvents = function() {\n $(ACTIONS.VIEW_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n\n // Cancel the request.\n var params = {\n 'requestid': requestId\n };\n\n var request = {\n methodname: 'tool_dataprivacy_get_data_request',\n args: params\n };\n\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result) {\n return data.result;\n }\n // Fail.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n return false;\n\n }).then(function(data) {\n var body = Templates.render('tool_dataprivacy/request_details', data);\n var templateContext = {\n approvedeny: data.approvedeny,\n canmarkcomplete: data.canmarkcomplete\n };\n return ModalFactory.create({\n title: data.typename,\n body: body,\n type: ModalDataRequest.TYPE,\n large: true,\n templateContext: templateContext\n });\n\n }).then(function(modal) {\n // Handle approve event.\n modal.getRoot().on(DataPrivacyEvents.approve, function() {\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n // Handle deny event.\n modal.getRoot().on(DataPrivacyEvents.deny, function() {\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n // Handle send event.\n modal.getRoot().on(DataPrivacyEvents.complete, function() {\n var params = {\n 'requestid': requestId\n };\n handleSave('tool_dataprivacy_mark_complete', params);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Show the modal!\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n });\n\n $(ACTIONS.APPROVE_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.approve, approveEventWsData(requestId));\n });\n\n $(ACTIONS.DENY_REQUEST).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.deny, denyEventWsData(requestId));\n });\n\n $(ACTIONS.MARK_COMPLETE).click(function(e) {\n e.preventDefault();\n\n var requestId = $(this).data('requestid');\n showConfirmation(DataPrivacyEvents.complete, completeEventWsData(requestId));\n });\n\n $(ACTIONS.CONFIRM_BULK_ACTION).click(function() {\n var requestIds = [];\n var actionEvent = '';\n var wsdata = {};\n var bulkActionKeys = [\n {\n key: 'selectbulkaction',\n component: 'tool_dataprivacy'\n },\n {\n key: 'selectdatarequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'ok'\n }\n ];\n\n var bulkaction = parseInt($('#bulk-action').val());\n\n if (bulkaction != BULK_ACTIONS.APPROVE && bulkaction != BULK_ACTIONS.DENY) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[0], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n $(\".selectrequests:checked\").each(function() {\n requestIds.push($(this).val());\n });\n\n if (requestIds.length < 1) {\n Str.get_strings(bulkActionKeys).done(function(langStrings) {\n Notification.alert('', langStrings[1], langStrings[2]);\n }).fail(Notification.exception);\n\n return;\n }\n\n switch (bulkaction) {\n case BULK_ACTIONS.APPROVE:\n actionEvent = DataPrivacyEvents.bulkApprove;\n wsdata = bulkApproveEventWsData(requestIds);\n break;\n case BULK_ACTIONS.DENY:\n actionEvent = DataPrivacyEvents.bulkDeny;\n wsdata = bulkDenyEventWsData(requestIds);\n }\n\n showConfirmation(actionEvent, wsdata);\n });\n\n $(ACTIONS.SELECT_ALL).change(function(e) {\n e.preventDefault();\n\n var selectAll = $(this).is(':checked');\n $(SELECTORS.SELECT_REQUEST).prop('checked', selectAll);\n });\n };\n\n /**\n * Return the webservice data for the approve request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function approveEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_approve_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk approve request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkApproveEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_approve_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the deny request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function denyEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_deny_data_request',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Return the webservice data for the bulk deny request action.\n *\n * @param {Array} requestIds The array of request ID's.\n * @return {Object}\n */\n function bulkDenyEventWsData(requestIds) {\n return {\n 'wsfunction': 'tool_dataprivacy_bulk_deny_data_requests',\n 'wsparams': {'requestids': requestIds}\n };\n }\n\n /**\n * Return the webservice data for the complete request action.\n *\n * @param {Number} requestId The ID of the request.\n * @return {Object}\n */\n function completeEventWsData(requestId) {\n return {\n 'wsfunction': 'tool_dataprivacy_mark_complete',\n 'wsparams': {'requestid': requestId}\n };\n }\n\n /**\n * Show the confirmation dialogue.\n *\n * @param {String} action The action name.\n * @param {Object} wsdata Object containing ws data.\n */\n function showConfirmation(action, wsdata) {\n var keys = [];\n\n switch (action) {\n case DataPrivacyEvents.approve:\n keys = [\n {\n key: 'approverequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkApprove:\n keys = [\n {\n key: 'bulkapproverequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkapproval',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.deny:\n keys = [\n {\n key: 'denyrequest',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.bulkDeny:\n keys = [\n {\n key: 'bulkdenyrequests',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmbulkdenial',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n case DataPrivacyEvents.complete:\n keys = [\n {\n key: 'markcomplete',\n component: 'tool_dataprivacy'\n },\n {\n key: 'confirmcompletion',\n component: 'tool_dataprivacy'\n }\n ];\n break;\n }\n\n var modalTitle = '';\n Str.get_strings(keys).then(function(langStrings) {\n modalTitle = langStrings[0];\n var confirmMessage = langStrings[1];\n return ModalFactory.create({\n title: modalTitle,\n body: confirmMessage,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).then(function(modal) {\n modal.setSaveButtonText(modalTitle);\n\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function() {\n handleSave(wsdata.wsfunction, wsdata.wsparams);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n modal.show();\n\n return;\n\n }).catch(Notification.exception);\n }\n\n /**\n * Calls a web service function and reloads the page on success and shows a notification.\n * Displays an error notification, otherwise.\n *\n * @param {String} wsfunction The web service function to call.\n * @param {Object} params The parameters for the web service functoon.\n */\n function handleSave(wsfunction, params) {\n // Confirm the request.\n var request = {\n methodname: wsfunction,\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // On success, reload the page so that the data request table will be updated.\n // TODO: Probably in the future, better to reload the table or the target data request via AJAX.\n window.location.reload();\n } else {\n // Add the notification.\n Notification.addNotification({\n message: data.warnings[0].message,\n type: 'error'\n });\n }\n }).fail(Notification.exception);\n }\n\n return RequestActions;\n});\n"],"file":"requestactions.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/actionselector.min.js b/admin/tool/lp/amd/build/actionselector.min.js index 0d03dea25077f..b082d803853f8 100644 --- a/admin/tool/lp/amd/build/actionselector.min.js +++ b/admin/tool/lp/amd/build/actionselector.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","tool_lp/event_base"],function(a,b,c,d,e,f){var g=function(a,b,c,d,e){var g=this;f.prototype.constructor.apply(this,[]),g._title=a,g._message=b,g._actions=c,g._confirm=d,g._cancel=e,g._selectedValue=null,g._reset()};return g.prototype=Object.create(f.prototype),g.prototype._selectedValue=null,g.prototype._popup=null,g.prototype._title=null,g.prototype._message=null,g.prototype._actions=null,g.prototype._confirm=null,g.prototype._cancel=null,g.prototype._afterRender=function(){var b=this;b._find('[data-action="action-selector-confirm"]').attr("disabled","disabled"),b._find('[data-region="action-selector-radio-buttons"]').change(function(){b._selectedValue=a("input[type='radio']:checked").val(),b._find('[data-action="action-selector-confirm"]').removeAttr("disabled"),b._refresh.bind(b)}),b._find('[data-action="action-selector-cancel"]').click(function(a){a.preventDefault(),b.close()}),b._find('[data-action="action-selector-confirm"]').click(function(a){a.preventDefault(),b._selectedValue.length&&(b._trigger("save",{action:b._selectedValue}),b.close())})},g.prototype.close=function(){var a=this;a._popup.close(),a._reset()},g.prototype.display=function(){var a=this;return a._render().then(function(b){a._popup=new e(a._title,b,a._afterRender.bind(a))}).fail(b.exception)},g.prototype._find=function(b){return a(this._popup.getContent()).find(b)},g.prototype._refresh=function(){var a=this;return a._render().then(function(b){a._find('[data-region="action-selector"]').replaceWith(b),a._afterRender()})},g.prototype._render=function(){var a=this,b=[];for(var c in a._actions)b.push(a._actions[c]);var e={message:a._message,choices:b,confirm:a._confirm,cancel:a._cancel};return d.render("tool_lp/action_selector",e)},g.prototype._reset=function(){this._popup=null,this._selectedValue=""},g}); \ No newline at end of file +define ("tool_lp/actionselector",["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","tool_lp/event_base"],function(a,b,c,d,e,f){var g=function(a,b,c,d,e){var g=this;f.prototype.constructor.apply(this,[]);g._title=a;g._message=b;g._actions=c;g._confirm=d;g._cancel=e;g._selectedValue=null;g._reset()};g.prototype=Object.create(f.prototype);g.prototype._selectedValue=null;g.prototype._popup=null;g.prototype._title=null;g.prototype._message=null;g.prototype._actions=null;g.prototype._confirm=null;g.prototype._cancel=null;g.prototype._afterRender=function(){var b=this;b._find("[data-action=\"action-selector-confirm\"]").attr("disabled","disabled");b._find("[data-region=\"action-selector-radio-buttons\"]").change(function(){b._selectedValue=a("input[type='radio']:checked").val();b._find("[data-action=\"action-selector-confirm\"]").removeAttr("disabled");b._refresh.bind(b)});b._find("[data-action=\"action-selector-cancel\"]").click(function(a){a.preventDefault();b.close()});b._find("[data-action=\"action-selector-confirm\"]").click(function(a){a.preventDefault();if(!b._selectedValue.length){return}b._trigger("save",{action:b._selectedValue});b.close()})};g.prototype.close=function(){var a=this;a._popup.close();a._reset()};g.prototype.display=function(){var a=this;return a._render().then(function(b){a._popup=new e(a._title,b,a._afterRender.bind(a))}).fail(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._refresh=function(){var a=this;return a._render().then(function(b){a._find("[data-region=\"action-selector\"]").replaceWith(b);a._afterRender()})};g.prototype._render=function(){var a=this,b=[];for(var c in a._actions){b.push(a._actions[c])}var e={message:a._message,choices:b,confirm:a._confirm,cancel:a._cancel};return d.render("tool_lp/action_selector",e)};g.prototype._reset=function(){this._popup=null;this._selectedValue=""};return g}); +//# sourceMappingURL=actionselector.min.js.map diff --git a/admin/tool/lp/amd/build/actionselector.min.js.map b/admin/tool/lp/amd/build/actionselector.min.js.map new file mode 100644 index 0000000000000..4309e71d1586c --- /dev/null +++ b/admin/tool/lp/amd/build/actionselector.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/actionselector.js"],"names":["define","$","Notification","Ajax","Templates","Dialogue","EventBase","ActionSelector","title","message","actions","confirm","cancel","self","prototype","constructor","apply","_title","_message","_actions","_confirm","_cancel","_selectedValue","_reset","Object","create","_popup","_afterRender","_find","attr","change","val","removeAttr","_refresh","bind","click","e","preventDefault","close","length","_trigger","action","display","_render","then","html","fail","exception","selector","getContent","find","replaceWith","choices","i","push","content","render"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Action selector.\n *\n * To handle 'save' events use: actionselector.on('save')\n * This will receive the information to display in popup.\n * The actions have the format [{'text': sometext, 'value' : somevalue}].\n *\n * @package tool_lp\n * @copyright 2016 Serge Gauthier - \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base'],\n function($, Notification, Ajax, Templates, Dialogue, EventBase) {\n\n /**\n * Action selector class.\n * @param {String} title The title of popup.\n * @param {String} message The message to display.\n * @param {object} actions The actions that can be selected.\n * @param {String} confirm Text for confirm button.\n * @param {String} cancel Text for cancel button.\n */\n var ActionSelector = function(title, message, actions, confirm, cancel) {\n var self = this;\n\n EventBase.prototype.constructor.apply(this, []);\n self._title = title;\n self._message = message;\n self._actions = actions;\n self._confirm = confirm;\n self._cancel = cancel;\n self._selectedValue = null;\n self._reset();\n };\n\n ActionSelector.prototype = Object.create(EventBase.prototype);\n\n /** @type {String} The value that was selected. */\n ActionSelector.prototype._selectedValue = null;\n /** @type {Dialogue} The reference to the dialogue. */\n ActionSelector.prototype._popup = null;\n /** @type {String} The title of popup. */\n ActionSelector.prototype._title = null;\n /** @type {String} The message in popup. */\n ActionSelector.prototype._message = null;\n /** @type {object} The information for radion buttons. */\n ActionSelector.prototype._actions = null;\n /** @type {String} The text for confirm button. */\n ActionSelector.prototype._confirm = null;\n /** @type {String} The text for cancel button. */\n ActionSelector.prototype._cancel = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n ActionSelector.prototype._afterRender = function() {\n var self = this;\n\n // Confirm button is disabled until a choice is done.\n self._find('[data-action=\"action-selector-confirm\"]').attr('disabled', 'disabled');\n\n // Add listener for radio buttons change.\n self._find('[data-region=\"action-selector-radio-buttons\"]').change(function() {\n self._selectedValue = $(\"input[type='radio']:checked\").val();\n self._find('[data-action=\"action-selector-confirm\"]').removeAttr('disabled');\n self._refresh.bind(self);\n });\n\n // Add listener for cancel.\n self._find('[data-action=\"action-selector-cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for confirm.\n self._find('[data-action=\"action-selector-confirm\"]').click(function(e) {\n e.preventDefault();\n if (!self._selectedValue.length) {\n return;\n }\n self._trigger('save', {action: self._selectedValue});\n self.close();\n });\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n ActionSelector.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the action selector.\n *\n * @method display\n * @return {Promise}\n */\n ActionSelector.prototype.display = function() {\n var self = this;\n return self._render().then(function(html) {\n self._popup = new Dialogue(\n self._title,\n html,\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery} The node\n * @method _find\n */\n ActionSelector.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n ActionSelector.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"action-selector\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n ActionSelector.prototype._render = function() {\n var self = this;\n var choices = [];\n for (var i in self._actions) {\n choices.push(self._actions[i]);\n }\n var content = {'message': self._message, 'choices': choices,\n 'confirm': self._confirm, 'cancel': self._cancel};\n\n return Templates.render('tool_lp/action_selector', content);\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n ActionSelector.prototype._reset = function() {\n this._popup = null;\n this._selectedValue = '';\n };\n\n return /** @alias module:tool_lp/actionselector */ ActionSelector;\n\n});\n"],"file":"actionselector.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencies.min.js b/admin/tool/lp/amd/build/competencies.min.js index 6d24fd8aeaf14..fd8cb9c8b223f 100644 --- a/admin/tool/lp/amd/build/competencies.min.js +++ b/admin/tool/lp/amd/build/competencies.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/competencypicker","tool_lp/dragdrop-reorder"],function(a,b,c,d,e,f,g){var h=function(b,c,d){this.itemid=b,this.itemtype=c,this.pageContextId=d,this.pickerInstance=null,a('[data-region="actions"] button').prop("disabled",!1),this.registerEvents(),this.registerDragDrop()};return h.prototype.registerDragDrop=function(){var a=this;e.get_string("movecompetency","tool_lp").done(function(b){g.dragdrop("movecompetency",b,{identifier:"movecompetency",component:"tool_lp"},{identifier:"movecompetencyafter",component:"tool_lp"},"drag-samenode","drag-parentnode","drag-handlecontainer",function(b,c){a.handleDrop(b,c)})}).fail(b.exception)},h.prototype.handleDrop=function(d,e){var f=a(d).data("id"),g=a(e).data("id"),h=this,i=[];if("course"==h.itemtype)i=c.call([{methodname:"core_competency_reorder_course_competency",args:{courseid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else if("template"==h.itemtype)i=c.call([{methodname:"core_competency_reorder_template_competency",args:{templateid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else{if("plan"!=h.itemtype)return;i=c.call([{methodname:"core_competency_reorder_plan_competency",args:{planid:h.itemid,competencyidfrom:f,competencyidto:g}}])}i[0].fail(b.exception)},h.prototype.pickCompetency=function(){var e,g,h,i,j=this;j.pickerInstance||("template"!==j.itemtype&&"course"!==j.itemtype||(i="parents"),j.pickerInstance=new f(j.pageContextId,(!1),i),j.pickerInstance.on("save",function(f,i){var k=i.competencyIds;"course"===j.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"core_competency_add_competency_to_course",args:{courseid:j.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:j.itemid,moduleid:0}}),g="tool_lp/course_competencies_page",h="coursecompetenciespage"):"template"===j.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"core_competency_add_competency_to_template",args:{templateid:j.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:j.itemid,pagecontext:{contextid:j.pageContextId}}}),g="tool_lp/template_competencies_page",h="templatecompetenciespage"):"plan"===j.itemtype&&(e=[],a.each(k,function(a,b){e.push({methodname:"core_competency_add_competency_to_plan",args:{planid:j.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_plan_page",args:{planid:j.itemid}}),g="tool_lp/plan_page",h="plan-page"),c.call(e)[e.length-1].then(function(a){return d.render(g,a)}).then(function(b,c){a('[data-region="'+h+'"]').replaceWith(b),d.runTemplateJS(c)})["catch"](b.exception)})),j.pickerInstance.display()},h.prototype.doDelete=function(e){var f=this,g=[],h="",i="";"course"==f.itemtype?(g=c.call([{methodname:"core_competency_remove_competency_from_course",args:{courseid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:f.itemid,moduleid:0}}]),h="tool_lp/course_competencies_page",i="coursecompetenciespage"):"template"==f.itemtype?(g=c.call([{methodname:"core_competency_remove_competency_from_template",args:{templateid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:f.itemid,pagecontext:{contextid:f.pageContextId}}}]),h="tool_lp/template_competencies_page",i="templatecompetenciespage"):"plan"==f.itemtype&&(g=c.call([{methodname:"core_competency_remove_competency_from_plan",args:{planid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_plan_page",args:{planid:f.itemid}}]),h="tool_lp/plan_page",i="plan-page"),g[1].done(function(c){d.render(h,c).done(function(b,c){a('[data-region="'+i+'"]').replaceWith(b),d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)},h.prototype.deleteHandler=function(a){var d,f=this,g=[];if("course"==f.itemtype)d="unlinkcompetencycourse";else if("template"==f.itemtype)d="unlinkcompetencytemplate";else{if("plan"!=f.itemtype)return;d="unlinkcompetencyplan"}g=c.call([{methodname:"core_competency_read_competency",args:{id:a}}]),g[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:d,component:"tool_lp",param:c.shortname},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){f.doDelete(a)})}).fail(b.exception)}).fail(b.exception)},h.prototype.registerEvents=function(){var e=this;"course"==e.itemtype&&a('[data-region="coursecompetenciespage"]').on("change",'select[data-field="ruleoutcome"]',function(f){var g=[],h="tool_lp/course_competencies_page",i="coursecompetenciespage",j=a(f.target).data("id"),k=a(f.target).val();g=c.call([{methodname:"core_competency_set_course_competency_ruleoutcome",args:{coursecompetencyid:j,ruleoutcome:k}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:e.itemid,moduleid:0}}]),g[1].done(function(c){d.render(h,c).done(function(b,c){a('[data-region="'+i+'"]').replaceWith(b),d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)}),a('[data-region="actions"] button').click(function(a){a.preventDefault(),e.pickCompetency()}),a('[data-action="delete-competency-link"]').click(function(b){b.preventDefault();var c=a(b.target).closest("[data-id]").data("id");e.deleteHandler(c)})},h}); \ No newline at end of file +define ("tool_lp/competencies",["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/competencypicker","tool_lp/dragdrop-reorder"],function(a,b,c,d,e,f,g){var h=function(b,c,d){this.itemid=b;this.itemtype=c;this.pageContextId=d;this.pickerInstance=null;a("[data-region=\"actions\"] button").prop("disabled",!1);this.registerEvents();this.registerDragDrop()};h.prototype.registerDragDrop=function(){var a=this;e.get_string("movecompetency","tool_lp").done(function(b){g.dragdrop("movecompetency",b,{identifier:"movecompetency",component:"tool_lp"},{identifier:"movecompetencyafter",component:"tool_lp"},"drag-samenode","drag-parentnode","drag-handlecontainer",function(b,c){a.handleDrop(b,c)})}).fail(b.exception)};h.prototype.handleDrop=function(d,e){var f=a(d).data("id"),g=a(e).data("id"),h=this,i=[];if("course"==h.itemtype){i=c.call([{methodname:"core_competency_reorder_course_competency",args:{courseid:h.itemid,competencyidfrom:f,competencyidto:g}}])}else if("template"==h.itemtype){i=c.call([{methodname:"core_competency_reorder_template_competency",args:{templateid:h.itemid,competencyidfrom:f,competencyidto:g}}])}else if("plan"==h.itemtype){i=c.call([{methodname:"core_competency_reorder_plan_competency",args:{planid:h.itemid,competencyidfrom:f,competencyidto:g}}])}else{return}i[0].fail(b.exception)};h.prototype.pickCompetency=function(){var g=this,h,i,j,k;if(!g.pickerInstance){if("template"===g.itemtype||"course"===g.itemtype){k="parents"}g.pickerInstance=new f(g.pageContextId,!1,k);g.pickerInstance.on("save",function(f,e){var k=e.competencyIds;if("course"===g.itemtype){h=[];a.each(k,function(a,b){h.push({methodname:"core_competency_add_competency_to_course",args:{courseid:g.itemid,competencyid:b}})});h.push({methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:g.itemid,moduleid:0}});i="tool_lp/course_competencies_page";j="coursecompetenciespage"}else if("template"===g.itemtype){h=[];a.each(k,function(a,b){h.push({methodname:"core_competency_add_competency_to_template",args:{templateid:g.itemid,competencyid:b}})});h.push({methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:g.itemid,pagecontext:{contextid:g.pageContextId}}});i="tool_lp/template_competencies_page";j="templatecompetenciespage"}else if("plan"===g.itemtype){h=[];a.each(k,function(a,b){h.push({methodname:"core_competency_add_competency_to_plan",args:{planid:g.itemid,competencyid:b}})});h.push({methodname:"tool_lp_data_for_plan_page",args:{planid:g.itemid}});i="tool_lp/plan_page";j="plan-page"}c.call(h)[h.length-1].then(function(a){return d.render(i,a)}).then(function(b,c){a("[data-region=\""+j+"\"]").replaceWith(b);d.runTemplateJS(c)}).catch(b.exception)})}g.pickerInstance.display()};h.prototype.doDelete=function(e){var f=this,g=[],h="",i="";if("course"==f.itemtype){g=c.call([{methodname:"core_competency_remove_competency_from_course",args:{courseid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:f.itemid,moduleid:0}}]);h="tool_lp/course_competencies_page";i="coursecompetenciespage"}else if("template"==f.itemtype){g=c.call([{methodname:"core_competency_remove_competency_from_template",args:{templateid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:f.itemid,pagecontext:{contextid:f.pageContextId}}}]);h="tool_lp/template_competencies_page";i="templatecompetenciespage"}else if("plan"==f.itemtype){g=c.call([{methodname:"core_competency_remove_competency_from_plan",args:{planid:f.itemid,competencyid:e}},{methodname:"tool_lp_data_for_plan_page",args:{planid:f.itemid}}]);h="tool_lp/plan_page";i="plan-page"}g[1].done(function(c){d.render(h,c).done(function(b,c){a("[data-region=\""+i+"\"]").replaceWith(b);d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)};h.prototype.deleteHandler=function(a){var d=this,f=[],g;if("course"==d.itemtype){g="unlinkcompetencycourse"}else if("template"==d.itemtype){g="unlinkcompetencytemplate"}else if("plan"==d.itemtype){g="unlinkcompetencyplan"}else{return}f=c.call([{methodname:"core_competency_read_competency",args:{id:a}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:g,component:"tool_lp",param:c.shortname},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(c){b.confirm(c[0],c[1],c[2],c[3],function(){d.doDelete(a)})}).fail(b.exception)}).fail(b.exception)};h.prototype.registerEvents=function(){var f=this;if("course"==f.itemtype){a("[data-region=\"coursecompetenciespage\"]").on("change","select[data-field=\"ruleoutcome\"]",function(g){var e=[],h=a(g.target).data("id"),i=a(g.target).val();e=c.call([{methodname:"core_competency_set_course_competency_ruleoutcome",args:{coursecompetencyid:h,ruleoutcome:i}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:f.itemid,moduleid:0}}]);e[1].done(function(c){d.render("tool_lp/course_competencies_page",c).done(function(b,c){a("[data-region=\""+"coursecompetenciespage"+"\"]").replaceWith(b);d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)})}a("[data-region=\"actions\"] button").click(function(a){a.preventDefault();f.pickCompetency()});a("[data-action=\"delete-competency-link\"]").click(function(b){b.preventDefault();var c=a(b.target).closest("[data-id]").data("id");f.deleteHandler(c)})};return h}); +//# sourceMappingURL=competencies.min.js.map diff --git a/admin/tool/lp/amd/build/competencies.min.js.map b/admin/tool/lp/amd/build/competencies.min.js.map new file mode 100644 index 0000000000000..aa66f0be036c5 --- /dev/null +++ b/admin/tool/lp/amd/build/competencies.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competencies.js"],"names":["define","$","notification","ajax","templates","str","Picker","dragdrop","competencies","itemid","itemtype","pagectxid","pageContextId","pickerInstance","prop","registerEvents","registerDragDrop","prototype","localthis","get_string","done","movestring","identifier","component","drag","drop","handleDrop","fail","exception","fromid","data","toid","requests","call","methodname","args","courseid","competencyidfrom","competencyidto","templateid","planid","pickCompetency","self","pagerender","pageregion","pageContextIncludes","on","e","compIds","competencyIds","each","index","compId","push","competencyid","moduleid","pagecontext","contextid","length","then","context","render","html","js","replaceWith","runTemplateJS","catch","display","doDelete","deleteid","deleteHandler","message","id","competency","get_strings","key","param","shortname","strings","confirm","coursecompetencyid","target","ruleoutcome","val","click","preventDefault","closest"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle add/remove competency links.\n *\n * @module tool_lp/competencies\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/competencypicker',\n 'tool_lp/dragdrop-reorder'],\n function($, notification, ajax, templates, str, Picker, dragdrop) {\n\n /**\n * Constructor\n *\n * @param {Number} itemid\n * @param {String} itemtype\n * @param {Number} pagectxid\n */\n var competencies = function(itemid, itemtype, pagectxid) {\n this.itemid = itemid;\n this.itemtype = itemtype;\n this.pageContextId = pagectxid;\n this.pickerInstance = null;\n\n $('[data-region=\"actions\"] button').prop('disabled', false);\n this.registerEvents();\n this.registerDragDrop();\n };\n\n /**\n * Initialise the drag/drop code.\n * @method registerDragDrop\n */\n competencies.prototype.registerDragDrop = function() {\n var localthis = this;\n // Init this module.\n str.get_string('movecompetency', 'tool_lp').done(\n function(movestring) {\n dragdrop.dragdrop('movecompetency',\n movestring,\n {identifier: 'movecompetency', component: 'tool_lp'},\n {identifier: 'movecompetencyafter', component: 'tool_lp'},\n 'drag-samenode',\n 'drag-parentnode',\n 'drag-handlecontainer',\n function(drag, drop) {\n localthis.handleDrop(drag, drop);\n });\n }\n ).fail(notification.exception);\n\n };\n\n /**\n * Handle a drop from a drag/drop operation.\n *\n * @method handleDrop\n * @param {DOMNode} drag The dragged node.\n * @param {DOMNode} drop The dropped on node.\n */\n competencies.prototype.handleDrop = function(drag, drop) {\n var fromid = $(drag).data('id');\n var toid = $(drop).data('id');\n var localthis = this;\n var requests = [];\n\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_course_competency',\n args: {courseid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_template_competency',\n args: {templateid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {\n methodname: 'core_competency_reorder_plan_competency',\n args: {planid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid}\n }\n ]);\n } else {\n return;\n }\n\n requests[0].fail(notification.exception);\n };\n\n /**\n * Pick a competency\n *\n * @method pickCompetency\n */\n competencies.prototype.pickCompetency = function() {\n var self = this;\n var requests;\n var pagerender;\n var pageregion;\n var pageContextIncludes;\n\n if (!self.pickerInstance) {\n if (self.itemtype === 'template' || self.itemtype === 'course') {\n pageContextIncludes = 'parents';\n }\n self.pickerInstance = new Picker(self.pageContextId, false, pageContextIncludes);\n self.pickerInstance.on('save', function(e, data) {\n var compIds = data.competencyIds;\n\n if (self.itemtype === \"course\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_course',\n args: {courseid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: self.itemid, moduleid: 0}\n });\n\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n\n } else if (self.itemtype === \"template\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_template',\n args: {templateid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: self.itemid, pagecontext: {contextid: self.pageContextId}}\n });\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (self.itemtype === \"plan\") {\n requests = [];\n\n $.each(compIds, function(index, compId) {\n requests.push({\n methodname: 'core_competency_add_competency_to_plan',\n args: {planid: self.itemid, competencyid: compId}\n });\n });\n requests.push({\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: self.itemid}\n });\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n ajax.call(requests)[requests.length - 1].then(function(context) {\n return templates.render(pagerender, context);\n }).then(function(html, js) {\n $('[data-region=\"' + pageregion + '\"]').replaceWith(html);\n templates.runTemplateJS(js);\n return;\n }).catch(notification.exception);\n });\n }\n\n self.pickerInstance.display();\n };\n\n /**\n * Delete the link between competency and course, template or plan. Reload the page.\n *\n * @method doDelete\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.doDelete = function(deleteid) {\n var localthis = this;\n var requests = [],\n pagerender = '',\n pageregion = '';\n\n // Delete the link and reload the page template.\n if (localthis.itemtype == 'course') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_course',\n args: {courseid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n pagerender = 'tool_lp/course_competencies_page';\n pageregion = 'coursecompetenciespage';\n } else if (localthis.itemtype == 'template') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_template',\n args: {templateid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_template_competencies_page',\n args: {templateid: localthis.itemid, pagecontext: {contextid: localthis.pageContextId}}}\n ]);\n pagerender = 'tool_lp/template_competencies_page';\n pageregion = 'templatecompetenciespage';\n } else if (localthis.itemtype == 'plan') {\n requests = ajax.call([\n {methodname: 'core_competency_remove_competency_from_plan',\n args: {planid: localthis.itemid, competencyid: deleteid}},\n {methodname: 'tool_lp_data_for_plan_page',\n args: {planid: localthis.itemid}}\n ]);\n pagerender = 'tool_lp/plan_page';\n pageregion = 'plan-page';\n }\n\n requests[1].done(function(context) {\n templates.render(pagerender, context).done(function(html, js) {\n $('[data-region=\"' + pageregion + '\"]').replaceWith(html);\n templates.runTemplateJS(js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n *\n * @method deleteHandler\n * @param {int} deleteid The id of record to delete.\n */\n competencies.prototype.deleteHandler = function(deleteid) {\n var localthis = this;\n var requests = [];\n var message;\n\n if (localthis.itemtype == 'course') {\n message = 'unlinkcompetencycourse';\n } else if (localthis.itemtype == 'template') {\n message = 'unlinkcompetencytemplate';\n } else if (localthis.itemtype == 'plan') {\n message = 'unlinkcompetencyplan';\n } else {\n return;\n }\n\n requests = ajax.call([{\n methodname: 'core_competency_read_competency',\n args: {id: deleteid}\n }]);\n\n requests[0].done(function(competency) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: message, component: 'tool_lp', param: competency.shortname},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink the competency X from the course?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n localthis.doDelete(deleteid);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Register the javascript event handlers for this page.\n *\n * @method registerEvents\n */\n competencies.prototype.registerEvents = function() {\n var localthis = this;\n\n if (localthis.itemtype == 'course') {\n // Course completion rule handling.\n $('[data-region=\"coursecompetenciespage\"]').on('change', 'select[data-field=\"ruleoutcome\"]', function(e) {\n var requests = [];\n var pagerender = 'tool_lp/course_competencies_page';\n var pageregion = 'coursecompetenciespage';\n var coursecompetencyid = $(e.target).data('id');\n var ruleoutcome = $(e.target).val();\n requests = ajax.call([\n {methodname: 'core_competency_set_course_competency_ruleoutcome',\n args: {coursecompetencyid: coursecompetencyid, ruleoutcome: ruleoutcome}},\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: localthis.itemid, moduleid: 0}}\n ]);\n\n requests[1].done(function(context) {\n templates.render(pagerender, context).done(function(html, js) {\n $('[data-region=\"' + pageregion + '\"]').replaceWith(html);\n templates.runTemplateJS(js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n });\n }\n\n $('[data-region=\"actions\"] button').click(function(e) {\n e.preventDefault();\n localthis.pickCompetency();\n });\n $('[data-action=\"delete-competency-link\"]').click(function(e) {\n e.preventDefault();\n\n var deleteid = $(e.target).closest('[data-id]').data('id');\n localthis.deleteHandler(deleteid);\n });\n };\n\n return /** @alias module:tool_lp/competencies */ competencies;\n});\n"],"file":"competencies.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_outcomes.min.js b/admin/tool/lp/amd/build/competency_outcomes.min.js index 2da17456896ad..ae3938f0be3ed 100644 --- a/admin/tool/lp/amd/build/competency_outcomes.min.js +++ b/admin/tool/lp/amd/build/competency_outcomes.min.js @@ -1 +1,2 @@ -define(["jquery","core/str"],function(a,b){var c=0,d=1,e=2,f=3;return{NONE:c,EVIDENCE:d,COMPLETE:e,RECOMMEND:f,getAll:function(){var a=this;return b.get_strings([{key:"competencyoutcome_none",component:"tool_lp"},{key:"competencyoutcome_evidence",component:"tool_lp"},{key:"competencyoutcome_recommend",component:"tool_lp"},{key:"competencyoutcome_complete",component:"tool_lp"}]).then(function(b){var c={};return c[a.NONE]={code:a.NONE,name:b[0]},c[a.EVIDENCE]={code:a.EVIDENCE,name:b[1]},c[a.RECOMMEND]={code:a.RECOMMEND,name:b[2]},c[a.COMPLETE]={code:a.COMPLETE,name:b[3]},c})},getString:function(b){var c=this,d=c.getAll();return d.then(function(c){return"undefined"==typeof c[b]?a.Deferred().reject().promise():c[b].name})}}}); \ No newline at end of file +define ("tool_lp/competency_outcomes",["jquery","core/str"],function(a,b){return{NONE:0,EVIDENCE:1,COMPLETE:2,RECOMMEND:3,getAll:function getAll(){var a=this;return b.get_strings([{key:"competencyoutcome_none",component:"tool_lp"},{key:"competencyoutcome_evidence",component:"tool_lp"},{key:"competencyoutcome_recommend",component:"tool_lp"},{key:"competencyoutcome_complete",component:"tool_lp"}]).then(function(b){var c={};c[a.NONE]={code:a.NONE,name:b[0]};c[a.EVIDENCE]={code:a.EVIDENCE,name:b[1]};c[a.RECOMMEND]={code:a.RECOMMEND,name:b[2]};c[a.COMPLETE]={code:a.COMPLETE,name:b[3]};return c})},getString:function getString(b){var c=this,d=c.getAll();return d.then(function(c){if("undefined"==typeof c[b]){return a.Deferred().reject().promise()}return c[b].name})}}}); +//# sourceMappingURL=competency_outcomes.min.js.map diff --git a/admin/tool/lp/amd/build/competency_outcomes.min.js.map b/admin/tool/lp/amd/build/competency_outcomes.min.js.map new file mode 100644 index 0000000000000..9d51fae52280d --- /dev/null +++ b/admin/tool/lp/amd/build/competency_outcomes.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competency_outcomes.js"],"names":["define","$","Str","NONE","EVIDENCE","COMPLETE","RECOMMEND","getAll","self","get_strings","key","component","then","strings","outcomes","code","name","getString","id","all","Deferred","reject","promise"],"mappings":"AAuBAA,OAAM,+BAAC,CAAC,QAAD,CACC,UADD,CAAD,CAEE,SAASC,CAAT,CAAYC,CAAZ,CAAiB,CAOrB,MAAwD,CAEpDC,IAAI,EAFgD,CAGpDC,QAAQ,EAH4C,CAIpDC,QAAQ,EAJ4C,CAKpDC,SAAS,EAL2C,CAapDC,MAAM,CAAE,iBAAW,CACf,GAAIC,CAAAA,CAAI,CAAG,IAAX,CACA,MAAON,CAAAA,CAAG,CAACO,WAAJ,CAAgB,CACnB,CAACC,GAAG,CAAE,wBAAN,CAAgCC,SAAS,CAAE,SAA3C,CADmB,CAEnB,CAACD,GAAG,CAAE,4BAAN,CAAoCC,SAAS,CAAE,SAA/C,CAFmB,CAGnB,CAACD,GAAG,CAAE,6BAAN,CAAqCC,SAAS,CAAE,SAAhD,CAHmB,CAInB,CAACD,GAAG,CAAE,4BAAN,CAAoCC,SAAS,CAAE,SAA/C,CAJmB,CAAhB,EAKJC,IALI,CAKC,SAASC,CAAT,CAAkB,CACtB,GAAIC,CAAAA,CAAQ,CAAG,EAAf,CACAA,CAAQ,CAACN,CAAI,CAACL,IAAN,CAAR,CAAsB,CAACY,IAAI,CAAEP,CAAI,CAACL,IAAZ,CAAkBa,IAAI,CAAEH,CAAO,CAAC,CAAD,CAA/B,CAAtB,CACAC,CAAQ,CAACN,CAAI,CAACJ,QAAN,CAAR,CAA0B,CAACW,IAAI,CAAEP,CAAI,CAACJ,QAAZ,CAAsBY,IAAI,CAAEH,CAAO,CAAC,CAAD,CAAnC,CAA1B,CACAC,CAAQ,CAACN,CAAI,CAACF,SAAN,CAAR,CAA2B,CAACS,IAAI,CAAEP,CAAI,CAACF,SAAZ,CAAuBU,IAAI,CAAEH,CAAO,CAAC,CAAD,CAApC,CAA3B,CACAC,CAAQ,CAACN,CAAI,CAACH,QAAN,CAAR,CAA0B,CAACU,IAAI,CAAEP,CAAI,CAACH,QAAZ,CAAsBW,IAAI,CAAEH,CAAO,CAAC,CAAD,CAAnC,CAA1B,CACA,MAAOC,CAAAA,CACV,CAZM,CAaV,CA5BmD,CAqCpDG,SAAS,CAAE,mBAASC,CAAT,CAAa,CACpB,GAAIV,CAAAA,CAAI,CAAG,IAAX,CACIW,CAAG,CAAGX,CAAI,CAACD,MAAL,EADV,CAGA,MAAOY,CAAAA,CAAG,CAACP,IAAJ,CAAS,SAASE,CAAT,CAAmB,CAC/B,GAA4B,WAAxB,QAAOA,CAAAA,CAAQ,CAACI,CAAD,CAAnB,CAAyC,CACrC,MAAOjB,CAAAA,CAAC,CAACmB,QAAF,GAAaC,MAAb,GAAsBC,OAAtB,EACV,CACD,MAAOR,CAAAA,CAAQ,CAACI,CAAD,CAAR,CAAaF,IACvB,CALM,CAMV,CA/CmD,CAkD3D,CA3DK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency rule config.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str'],\n function($, Str) {\n\n var OUTCOME_NONE = 0,\n OUTCOME_EVIDENCE = 1,\n OUTCOME_COMPLETE = 2,\n OUTCOME_RECOMMEND = 3;\n\n return /** @alias module:tool_lp/competency_outcomes */ {\n\n NONE: OUTCOME_NONE,\n EVIDENCE: OUTCOME_EVIDENCE,\n COMPLETE: OUTCOME_COMPLETE,\n RECOMMEND: OUTCOME_RECOMMEND,\n\n /**\n * Get all the outcomes.\n *\n * @return {Object} Indexed by outcome code, contains code and name.\n * @method getAll\n */\n getAll: function() {\n var self = this;\n return Str.get_strings([\n {key: 'competencyoutcome_none', component: 'tool_lp'},\n {key: 'competencyoutcome_evidence', component: 'tool_lp'},\n {key: 'competencyoutcome_recommend', component: 'tool_lp'},\n {key: 'competencyoutcome_complete', component: 'tool_lp'},\n ]).then(function(strings) {\n var outcomes = {};\n outcomes[self.NONE] = {code: self.NONE, name: strings[0]};\n outcomes[self.EVIDENCE] = {code: self.EVIDENCE, name: strings[1]};\n outcomes[self.RECOMMEND] = {code: self.RECOMMEND, name: strings[2]};\n outcomes[self.COMPLETE] = {code: self.COMPLETE, name: strings[3]};\n return outcomes;\n });\n },\n\n /**\n * Get the string for an outcome.\n *\n * @param {Number} id The outcome code.\n * @return {Promise} Resolved with the string.\n * @method getString\n */\n getString: function(id) {\n var self = this,\n all = self.getAll();\n\n return all.then(function(outcomes) {\n if (typeof outcomes[id] === 'undefined') {\n return $.Deferred().reject().promise();\n }\n return outcomes[id].name;\n });\n }\n };\n\n});\n"],"file":"competency_outcomes.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_plan_navigation.min.js b/admin/tool/lp/amd/build/competency_plan_navigation.min.js index 1862243a241ff..fbf44da2b3743 100644 --- a/admin/tool/lp/amd/build/competency_plan_navigation.min.js +++ b/admin/tool/lp/amd/build/competency_plan_navigation.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(b,c,d,e,f){this._baseUrl=c,this._userId=d+"",this._competencyId=e+"",this._planId=f,this._ignoreFirstCompetency=!0,a(b).on("change",this._competencyChanged.bind(this))};return b.prototype._competencyChanged=function(b){if(this._ignoreFirstCompetency)return void(this._ignoreFirstCompetency=!1);var c=a(b.target).val(),d="?userid="+this._userId+"&planid="+this._planId+"&competencyid="+c;document.location=this._baseUrl+d},b.prototype._competencyId=null,b.prototype._userId=null,b.prototype._planId=null,b.prototype._baseUrl=null,b.prototype._ignoreFirstCompetency=null,b}); \ No newline at end of file +define ("tool_lp/competency_plan_navigation",["jquery"],function(a){var b=function(b,c,d,e,f){this._baseUrl=c;this._userId=d+"";this._competencyId=e+"";this._planId=f;this._ignoreFirstCompetency=!0;a(b).on("change",this._competencyChanged.bind(this))};b.prototype._competencyChanged=function(b){if(this._ignoreFirstCompetency){this._ignoreFirstCompetency=!1;return}var c=a(b.target).val(),d="?userid="+this._userId+"&planid="+this._planId+"&competencyid="+c;document.location=this._baseUrl+d};b.prototype._competencyId=null;b.prototype._userId=null;b.prototype._planId=null;b.prototype._baseUrl=null;b.prototype._ignoreFirstCompetency=null;return b}); +//# sourceMappingURL=competency_plan_navigation.min.js.map diff --git a/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map b/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map new file mode 100644 index 0000000000000..bb2bb21e3e061 --- /dev/null +++ b/admin/tool/lp/amd/build/competency_plan_navigation.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competency_plan_navigation.js"],"names":["define","$","CompetencyPlanNavigation","competencySelector","baseUrl","userId","competencyId","planId","_baseUrl","_userId","_competencyId","_planId","_ignoreFirstCompetency","on","_competencyChanged","bind","prototype","e","newCompetencyId","target","val","queryStr","document","location"],"mappings":"AAuBAA,OAAM,sCAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAW3B,GAAIC,CAAAA,CAAwB,CAAG,SAASC,CAAT,CAA6BC,CAA7B,CAAsCC,CAAtC,CAA8CC,CAA9C,CAA4DC,CAA5D,CAAoE,CAC/F,KAAKC,QAAL,CAAgBJ,CAAhB,CACA,KAAKK,OAAL,CAAeJ,CAAM,CAAG,EAAxB,CACA,KAAKK,aAAL,CAAqBJ,CAAY,CAAG,EAApC,CACA,KAAKK,OAAL,CAAeJ,CAAf,CACA,KAAKK,sBAAL,IAEAX,CAAC,CAACE,CAAD,CAAD,CAAsBU,EAAtB,CAAyB,QAAzB,CAAmC,KAAKC,kBAAL,CAAwBC,IAAxB,CAA6B,IAA7B,CAAnC,CACH,CARD,CAgBAb,CAAwB,CAACc,SAAzB,CAAmCF,kBAAnC,CAAwD,SAASG,CAAT,CAAY,CAChE,GAAI,KAAKL,sBAAT,CAAiC,CAC7B,KAAKA,sBAAL,IACA,MACH,CAJ+D,GAK5DM,CAAAA,CAAe,CAAGjB,CAAC,CAACgB,CAAC,CAACE,MAAH,CAAD,CAAYC,GAAZ,EAL0C,CAM5DC,CAAQ,CAAG,WAAa,KAAKZ,OAAlB,CAA4B,UAA5B,CAAyC,KAAKE,OAA9C,CAAwD,gBAAxD,CAA2EO,CAN1B,CAOhEI,QAAQ,CAACC,QAAT,CAAoB,KAAKf,QAAL,CAAgBa,CACvC,CARD,CAWAnB,CAAwB,CAACc,SAAzB,CAAmCN,aAAnC,CAAmD,IAAnD,CAEAR,CAAwB,CAACc,SAAzB,CAAmCP,OAAnC,CAA6C,IAA7C,CAEAP,CAAwB,CAACc,SAAzB,CAAmCL,OAAnC,CAA6C,IAA7C,CAEAT,CAAwB,CAACc,SAAzB,CAAmCR,QAAnC,CAA8C,IAA9C,CAEAN,CAAwB,CAACc,SAAzB,CAAmCJ,sBAAnC,CAA4D,IAA5D,CAEA,MAA+DV,CAAAA,CAElE,CAlDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Event click on selecting competency in the competency autocomplete.\n *\n * @package tool_lp\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * CompetencyPlanNavigation\n *\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} planId The plan id\n */\n var CompetencyPlanNavigation = function(competencySelector, baseUrl, userId, competencyId, planId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._planId = planId;\n this._ignoreFirstCompetency = true;\n\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n CompetencyPlanNavigation.prototype._competencyChanged = function(e) {\n if (this._ignoreFirstCompetency) {\n this._ignoreFirstCompetency = false;\n return;\n }\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&planid=' + this._planId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @type {Number} The id of the competency. */\n CompetencyPlanNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n CompetencyPlanNavigation.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n CompetencyPlanNavigation.prototype._planId = null;\n /** @type {String} Plugin base url. */\n CompetencyPlanNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n CompetencyPlanNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/competency_plan_navigation */ CompetencyPlanNavigation;\n\n});\n"],"file":"competency_plan_navigation.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule.min.js b/admin/tool/lp/amd/build/competency_rule.min.js index 8939576cf60bc..1315e57b049de 100644 --- a/admin/tool/lp/amd/build/competency_rule.min.js +++ b/admin/tool/lp/amd/build/competency_rule.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(b){this._eventNode=a("
"),this._ready=a.Deferred(),this._tree=b};return b.prototype._competency=null,b.prototype._eventNode=null,b.prototype._ready=null,b.prototype._tree=null,b.prototype.canConfig=function(){return this._tree.hasChildren(this._competency.id)},b.prototype.getConfig=function(){return null},b.prototype.getType=function(){throw new Error("Not implemented")},b.prototype.init=function(){return this._load()},b.prototype.injectTemplate=function(){return a.Deferred().reject().promise()},b.prototype.isValid=function(){return!1},b.prototype._load=function(){return a.when()},b.prototype.on=function(a,b){this._eventNode.on(a,b)},b.prototype.setTargetCompetency=function(a){this._competency=a},b.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])},b.prototype._triggerChange=function(){this._trigger("change",this)},b}); \ No newline at end of file +define ("tool_lp/competency_rule",["jquery"],function(a){var b=function(b){this._eventNode=a("
");this._ready=a.Deferred();this._tree=b};b.prototype._competency=null;b.prototype._eventNode=null;b.prototype._ready=null;b.prototype._tree=null;b.prototype.canConfig=function(){return this._tree.hasChildren(this._competency.id)};b.prototype.getConfig=function(){return null};b.prototype.getType=function(){throw new Error("Not implemented")};b.prototype.init=function(){return this._load()};b.prototype.injectTemplate=function(){return a.Deferred().reject().promise()};b.prototype.isValid=function(){return!1};b.prototype._load=function(){return a.when()};b.prototype.on=function(a,b){this._eventNode.on(a,b)};b.prototype.setTargetCompetency=function(a){this._competency=a};b.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])};b.prototype._triggerChange=function(){this._trigger("change",this)};return b}); +//# sourceMappingURL=competency_rule.min.js.map diff --git a/admin/tool/lp/amd/build/competency_rule.min.js.map b/admin/tool/lp/amd/build/competency_rule.min.js.map new file mode 100644 index 0000000000000..a3f79cf3d6a23 --- /dev/null +++ b/admin/tool/lp/amd/build/competency_rule.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competency_rule.js"],"names":["define","$","Rule","tree","_eventNode","_ready","Deferred","_tree","prototype","_competency","canConfig","hasChildren","id","getConfig","getType","Error","init","_load","injectTemplate","reject","promise","isValid","when","on","type","handler","setTargetCompetency","competency","_trigger","data","trigger","_triggerChange"],"mappings":"AAuBAA,OAAM,2BAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAa3B,GAAIC,CAAAA,CAAI,CAAG,SAASC,CAAT,CAAe,CACtB,KAAKC,UAAL,CAAkBH,CAAC,CAAC,OAAD,CAAnB,CACA,KAAKI,MAAL,CAAcJ,CAAC,CAACK,QAAF,EAAd,CACA,KAAKC,KAAL,CAAaJ,CAChB,CAJD,CAOAD,CAAI,CAACM,SAAL,CAAeC,WAAf,CAA6B,IAA7B,CAEAP,CAAI,CAACM,SAAL,CAAeJ,UAAf,CAA4B,IAA5B,CAEAF,CAAI,CAACM,SAAL,CAAeH,MAAf,CAAwB,IAAxB,CAEAH,CAAI,CAACM,SAAL,CAAeD,KAAf,CAAuB,IAAvB,CAQAL,CAAI,CAACM,SAAL,CAAeE,SAAf,CAA2B,UAAW,CAClC,MAAO,MAAKH,KAAL,CAAWI,WAAX,CAAuB,KAAKF,WAAL,CAAiBG,EAAxC,CACV,CAFD,CAYAV,CAAI,CAACM,SAAL,CAAeK,SAAf,CAA2B,UAAW,CAClC,MAAO,KACV,CAFD,CAWAX,CAAI,CAACM,SAAL,CAAeM,OAAf,CAAyB,UAAW,CAChC,KAAM,IAAIC,CAAAA,KAAJ,CAAU,iBAAV,CACT,CAFD,CAYAb,CAAI,CAACM,SAAL,CAAeQ,IAAf,CAAsB,UAAW,CAC7B,MAAO,MAAKC,KAAL,EACV,CAFD,CAWAf,CAAI,CAACM,SAAL,CAAeU,cAAf,CAAgC,UAAW,CACvC,MAAOjB,CAAAA,CAAC,CAACK,QAAF,GAAaa,MAAb,GAAsBC,OAAtB,EACV,CAFD,CAYAlB,CAAI,CAACM,SAAL,CAAea,OAAf,CAAyB,UAAW,CAChC,QACH,CAFD,CAWAnB,CAAI,CAACM,SAAL,CAAeS,KAAf,CAAuB,UAAW,CAC9B,MAAOhB,CAAAA,CAAC,CAACqB,IAAF,EACV,CAFD,CAWApB,CAAI,CAACM,SAAL,CAAee,EAAf,CAAoB,SAASC,CAAT,CAAeC,CAAf,CAAwB,CACxC,KAAKrB,UAAL,CAAgBmB,EAAhB,CAAmBC,CAAnB,CAAyBC,CAAzB,CACH,CAFD,CAUAvB,CAAI,CAACM,SAAL,CAAekB,mBAAf,CAAqC,SAASC,CAAT,CAAqB,CACtD,KAAKlB,WAAL,CAAmBkB,CACtB,CAFD,CAYAzB,CAAI,CAACM,SAAL,CAAeoB,QAAf,CAA0B,SAASJ,CAAT,CAAeK,CAAf,CAAqB,CAC3C,KAAKzB,UAAL,CAAgB0B,OAAhB,CAAwBN,CAAxB,CAA8B,CAACK,CAAD,CAA9B,CACH,CAFD,CAUA3B,CAAI,CAACM,SAAL,CAAeuB,cAAf,CAAgC,UAAW,CACvC,KAAKH,QAAL,CAAc,QAAd,CAAwB,IAAxB,CACH,CAFD,CAIA,MAAoD1B,CAAAA,CAEvD,CAxJK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency rule base module.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * Competency rule abstract class.\n *\n * Any competency rule should extend this object. The event 'change' should be\n * triggered on the instance when the configuration has changed. This will allow\n * the components using the rule to gather the config, or check its validity.\n *\n * this._triggerChange();\n *\n * @param {Tree} tree The competency tree.\n */\n var Rule = function(tree) {\n this._eventNode = $('
');\n this._ready = $.Deferred();\n this._tree = tree;\n };\n\n /** @type {Object} The current competency. */\n Rule.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n Rule.prototype._eventNode = null;\n /** @type {Promise} Resolved when the object is ready. */\n Rule.prototype._ready = null;\n /** @type {Tree} The competency tree. */\n Rule.prototype._tree = null;\n\n /**\n * Whether or not the current competency can be configured using this rule.\n *\n * @return {Boolean}\n * @method canConfig\n */\n Rule.prototype.canConfig = function() {\n return this._tree.hasChildren(this._competency.id);\n };\n\n /**\n * The config established by this rule.\n *\n * To override in subclasses when relevant.\n *\n * @return {String|null}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return null;\n };\n\n // eslint-disable-next-line valid-jsdoc\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n throw new Error('Not implemented');\n };\n\n /**\n * The init process.\n *\n * Do not override this, instead override _load.\n *\n * @return {Promise} Revoled when the plugin is initialised.\n * @method init\n */\n Rule.prototype.init = function() {\n return this._load();\n };\n\n /**\n * Callback to inject the template.\n *\n * @param {Node} container Node to inject in.\n * @return {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function() {\n return $.Deferred().reject().promise();\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * Plugins should override this.\n *\n * @return {Boolean}\n * @method _isValid\n */\n Rule.prototype.isValid = function() {\n return false;\n };\n\n /**\n * Load the class.\n *\n * @return {Promise}\n * @method _load\n * @protected\n */\n Rule.prototype._load = function() {\n return $.when();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Rule.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Sets the current competency.\n *\n * @param {Competency} competency\n * @method setTargetCompetency\n */\n Rule.prototype.setTargetCompetency = function(competency) {\n this._competency = competency;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n Rule.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n /**\n * Trigger the change event.\n *\n * @method _triggerChange\n * @protected\n */\n Rule.prototype._triggerChange = function() {\n this._trigger('change', this);\n };\n\n return /** @alias module:tool_lp/competency_rule */ Rule;\n\n});\n"],"file":"competency_rule.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule_all.min.js b/admin/tool/lp/amd/build/competency_rule_all.min.js index d95f6a0732be5..c396c7fcfc955 100644 --- a/admin/tool/lp/amd/build/competency_rule_all.min.js +++ b/admin/tool/lp/amd/build/competency_rule_all.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","tool_lp/competency_rule"],function(a,b,c){var d=function(){c.apply(this,arguments)};return d.prototype=Object.create(c.prototype),d.prototype.getType=function(){return"core_competency\\competency_rule_all"},d.prototype.isValid=function(){return!0},d}); \ No newline at end of file +define ("tool_lp/competency_rule_all",["jquery","core/str","tool_lp/competency_rule"],function(a,b,c){var d=function(){c.apply(this,arguments)};d.prototype=Object.create(c.prototype);d.prototype.getType=function(){return"core_competency\\competency_rule_all"};d.prototype.isValid=function(){return!0};return d}); +//# sourceMappingURL=competency_rule_all.min.js.map diff --git a/admin/tool/lp/amd/build/competency_rule_all.min.js.map b/admin/tool/lp/amd/build/competency_rule_all.min.js.map new file mode 100644 index 0000000000000..ec8e34c939fc6 --- /dev/null +++ b/admin/tool/lp/amd/build/competency_rule_all.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competency_rule_all.js"],"names":["define","$","Str","RuleBase","Rule","apply","arguments","prototype","Object","create","getType","isValid"],"mappings":"AAuBAA,OAAM,+BAAC,CAAC,QAAD,CACC,UADD,CAEC,yBAFD,CAAD,CAIE,SAASC,CAAT,CAAYC,CAAZ,CAAiBC,CAAjB,CAA2B,CAK/B,GAAIC,CAAAA,CAAI,CAAG,UAAW,CAClBD,CAAQ,CAACE,KAAT,CAAe,IAAf,CAAqBC,SAArB,CACH,CAFD,CAGAF,CAAI,CAACG,SAAL,CAAiBC,MAAM,CAACC,MAAP,CAAcN,CAAQ,CAACI,SAAvB,CAAjB,CAQAH,CAAI,CAACG,SAAL,CAAeG,OAAf,CAAyB,UAAW,CAChC,MAAO,sCACV,CAFD,CAUAN,CAAI,CAACG,SAAL,CAAeI,OAAf,CAAyB,UAAW,CAChC,QACH,CAFD,CAIA,MAAwDP,CAAAA,CAE3D,CApCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency rule all module.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'tool_lp/competency_rule',\n ],\n function($, Str, RuleBase) {\n\n /**\n * Competency rule all class.\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_all';\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n return true;\n };\n\n return /** @alias module:tool_lp/competency_rule_all */ Rule;\n\n});\n"],"file":"competency_rule_all.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competency_rule_points.min.js b/admin/tool/lp/amd/build/competency_rule_points.min.js index 4afbdab0fb611..1a034201667a7 100644 --- a/admin/tool/lp/amd/build/competency_rule_points.min.js +++ b/admin/tool/lp/amd/build/competency_rule_points.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/templates","tool_lp/competency_rule"],function(a,b,c,d){var e=function(){d.apply(this,arguments)};return e.prototype=Object.create(d.prototype),e.prototype._container=null,e.prototype._templateLoaded=!1,e.prototype.getConfig=function(){return JSON.stringify({base:{points:this._getRequiredPoints()},competencies:this._getCompetenciesConfig()})},e.prototype._getCompetenciesConfig=function(){var b=[];return this._container.find("[data-competency]").each(function(){var c=a(this),d=c.data("competency"),e=parseInt(c.find('[name="points"]').val(),10),f=c.find('[name="required"]').prop("checked");b.push({id:d,points:e,required:f?1:0})}),b},e.prototype._getRequiredPoints=function(){return parseInt(this._container.find('[name="requiredpoints"]').val()||1,10)},e.prototype.getType=function(){return"core_competency\\competency_rule_points"},e.prototype.injectTemplate=function(b){var d,e=this,f=this._tree.getChildren(this._competency.id),g={base:{points:2},competencies:[]};if(this._templateLoaded=!1,e._competency.ruletype==e.getType())try{g=JSON.parse(e._competency.ruleconfig)}catch(h){}return d={requiredpoints:g&&g.base?g.base.points:2,competency:e._competency,children:[]},a.each(f,function(b,c){var e={id:c.id,shortname:c.shortname,required:!1,points:0};g&&a.each(g.competencies,function(a,b){b.id==e.id&&(e.required=!!b.required,e.points=b.points)}),d.children.push(e)}),c.render("tool_lp/competency_rule_points",d).then(function(a){e._container=b,b.html(a),b.find("input").change(function(){e._triggerChange()}),e._templateLoaded=!0,e._triggerChange()})},e.prototype.isValid=function(){if(!this._templateLoaded)return!1;var b=this._getRequiredPoints(),c=0,d=!0;return a.each(this._getCompetenciesConfig(),function(a,b){b.points<0&&(d=!1),c+=b.points}),d=d&&c>=b},e}); \ No newline at end of file +define ("tool_lp/competency_rule_points",["jquery","core/str","core/templates","tool_lp/competency_rule"],function(a,b,c,d){var e=function(){d.apply(this,arguments)};e.prototype=Object.create(d.prototype);e.prototype._container=null;e.prototype._templateLoaded=!1;e.prototype.getConfig=function(){return JSON.stringify({base:{points:this._getRequiredPoints()},competencies:this._getCompetenciesConfig()})};e.prototype._getCompetenciesConfig=function(){var b=[];this._container.find("[data-competency]").each(function(){var c=a(this),d=c.data("competency"),e=parseInt(c.find("[name=\"points\"]").val(),10),f=c.find("[name=\"required\"]").prop("checked");b.push({id:d,points:e,required:f?1:0})});return b};e.prototype._getRequiredPoints=function(){return parseInt(this._container.find("[name=\"requiredpoints\"]").val()||1,10)};e.prototype.getType=function(){return"core_competency\\competency_rule_points"};e.prototype.injectTemplate=function(b){var d=this,e=this._tree.getChildren(this._competency.id),f,g={base:{points:2},competencies:[]};this._templateLoaded=!1;if(d._competency.ruletype==d.getType()){try{g=JSON.parse(d._competency.ruleconfig)}catch(a){}}f={requiredpoints:g&&g.base?g.base.points:2,competency:d._competency,children:[]};a.each(e,function(b,c){var d={id:c.id,shortname:c.shortname,required:!1,points:0};if(g){a.each(g.competencies,function(a,b){if(b.id==d.id){d.required=b.required?!0:!1;d.points=b.points}})}f.children.push(d)});return c.render("tool_lp/competency_rule_points",f).then(function(a){d._container=b;b.html(a);b.find("input").change(function(){d._triggerChange()});d._templateLoaded=!0;d._triggerChange()})};e.prototype.isValid=function(){if(!this._templateLoaded){return!1}var b=this._getRequiredPoints(),c=0,d=!0;a.each(this._getCompetenciesConfig(),function(a,b){if(0>b.points){d=!1}c+=b.points});d=d&&c>=b;return d};return e}); +//# sourceMappingURL=competency_rule_points.min.js.map diff --git a/admin/tool/lp/amd/build/competency_rule_points.min.js.map b/admin/tool/lp/amd/build/competency_rule_points.min.js.map new file mode 100644 index 0000000000000..b75176e1f4c0d --- /dev/null +++ b/admin/tool/lp/amd/build/competency_rule_points.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competency_rule_points.js"],"names":["define","$","Str","Templates","RuleBase","Rule","apply","arguments","prototype","Object","create","_container","_templateLoaded","getConfig","JSON","stringify","base","points","_getRequiredPoints","competencies","_getCompetenciesConfig","find","each","node","id","data","parseInt","val","required","prop","push","getType","injectTemplate","container","self","children","_tree","getChildren","_competency","context","config","ruletype","parse","ruleconfig","e","requiredpoints","competency","index","child","shortname","comp","render","then","html","change","_triggerChange","isValid","max","valid"],"mappings":"AAuBAA,OAAM,kCAAC,CAAC,QAAD,CACC,UADD,CAEC,gBAFD,CAGC,yBAHD,CAAD,CAKE,SAASC,CAAT,CAAYC,CAAZ,CAAiBC,CAAjB,CAA4BC,CAA5B,CAAsC,CAK1C,GAAIC,CAAAA,CAAI,CAAG,UAAW,CAClBD,CAAQ,CAACE,KAAT,CAAe,IAAf,CAAqBC,SAArB,CACH,CAFD,CAGAF,CAAI,CAACG,SAAL,CAAiBC,MAAM,CAACC,MAAP,CAAcN,CAAQ,CAACI,SAAvB,CAAjB,CAGAH,CAAI,CAACG,SAAL,CAAeG,UAAf,CAA4B,IAA5B,CAEAN,CAAI,CAACG,SAAL,CAAeI,eAAf,IAQAP,CAAI,CAACG,SAAL,CAAeK,SAAf,CAA2B,UAAW,CAClC,MAAOC,CAAAA,IAAI,CAACC,SAAL,CAAe,CAClBC,IAAI,CAAE,CACFC,MAAM,CAAE,KAAKC,kBAAL,EADN,CADY,CAIlBC,YAAY,CAAE,KAAKC,sBAAL,EAJI,CAAf,CAMV,CAPD,CAgBAf,CAAI,CAACG,SAAL,CAAeY,sBAAf,CAAwC,UAAW,CAC/C,GAAID,CAAAA,CAAY,CAAG,EAAnB,CAEA,KAAKR,UAAL,CAAgBU,IAAhB,CAAqB,mBAArB,EAA0CC,IAA1C,CAA+C,UAAW,CACtD,GAAIC,CAAAA,CAAI,CAAGtB,CAAC,CAAC,IAAD,CAAZ,CACIuB,CAAE,CAAGD,CAAI,CAACE,IAAL,CAAU,YAAV,CADT,CAEIR,CAAM,CAAGS,QAAQ,CAACH,CAAI,CAACF,IAAL,CAAU,mBAAV,EAA6BM,GAA7B,EAAD,CAAqC,EAArC,CAFrB,CAGIC,CAAQ,CAAGL,CAAI,CAACF,IAAL,CAAU,qBAAV,EAA+BQ,IAA/B,CAAoC,SAApC,CAHf,CAKAV,CAAY,CAACW,IAAb,CAAkB,CACdN,EAAE,CAAEA,CADU,CAEdP,MAAM,CAAEA,CAFM,CAGdW,QAAQ,CAAEA,CAAQ,CAAG,CAAH,CAAO,CAHX,CAAlB,CAKH,CAXD,EAaA,MAAOT,CAAAA,CACV,CAjBD,CA0BAd,CAAI,CAACG,SAAL,CAAeU,kBAAf,CAAoC,UAAW,CAC3C,MAAOQ,CAAAA,QAAQ,CAAC,KAAKf,UAAL,CAAgBU,IAAhB,CAAqB,2BAArB,EAAgDM,GAAhD,IAAyD,CAA1D,CAA6D,EAA7D,CAClB,CAFD,CAUAtB,CAAI,CAACG,SAAL,CAAeuB,OAAf,CAAyB,UAAW,CAChC,MAAO,yCACV,CAFD,CAWA1B,CAAI,CAACG,SAAL,CAAewB,cAAf,CAAgC,SAASC,CAAT,CAAoB,CAChD,GAAIC,CAAAA,CAAI,CAAG,IAAX,CACIC,CAAQ,CAAG,KAAKC,KAAL,CAAWC,WAAX,CAAuB,KAAKC,WAAL,CAAiBd,EAAxC,CADf,CAEIe,CAFJ,CAGIC,CAAM,CAAG,CACLxB,IAAI,CAAE,CAACC,MAAM,CAAE,CAAT,CADD,CAELE,YAAY,CAAE,EAFT,CAHb,CAQA,KAAKP,eAAL,IAGA,GAAIsB,CAAI,CAACI,WAAL,CAAiBG,QAAjB,EAA6BP,CAAI,CAACH,OAAL,EAAjC,CAAiD,CAC7C,GAAI,CACAS,CAAM,CAAG1B,IAAI,CAAC4B,KAAL,CAAWR,CAAI,CAACI,WAAL,CAAiBK,UAA5B,CACZ,CAAC,MAAOC,CAAP,CAAU,CAEX,CACJ,CAEDL,CAAO,CAAG,CACNM,cAAc,CAAGL,CAAM,EAAIA,CAAM,CAACxB,IAAlB,CAA0BwB,CAAM,CAACxB,IAAP,CAAYC,MAAtC,CAA+C,CADzD,CAEN6B,UAAU,CAAEZ,CAAI,CAACI,WAFX,CAGNH,QAAQ,CAAE,EAHJ,CAAV,CAMAlC,CAAC,CAACqB,IAAF,CAAOa,CAAP,CAAiB,SAASY,CAAT,CAAgBC,CAAhB,CAAuB,CACpC,GAAIF,CAAAA,CAAU,CAAG,CACbtB,EAAE,CAAEwB,CAAK,CAACxB,EADG,CAEbyB,SAAS,CAAED,CAAK,CAACC,SAFJ,CAGbrB,QAAQ,GAHK,CAIbX,MAAM,CAAE,CAJK,CAAjB,CAOA,GAAIuB,CAAJ,CAAY,CACRvC,CAAC,CAACqB,IAAF,CAAOkB,CAAM,CAACrB,YAAd,CAA4B,SAAS4B,CAAT,CAAgBG,CAAhB,CAAsB,CAC9C,GAAIA,CAAI,CAAC1B,EAAL,EAAWsB,CAAU,CAACtB,EAA1B,CAA8B,CAC1BsB,CAAU,CAAClB,QAAX,CAAsBsB,CAAI,CAACtB,QAAL,MAAtB,CACAkB,CAAU,CAAC7B,MAAX,CAAoBiC,CAAI,CAACjC,MAC5B,CACJ,CALD,CAMH,CAEDsB,CAAO,CAACJ,QAAR,CAAiBL,IAAjB,CAAsBgB,CAAtB,CACH,CAlBD,EAoBA,MAAO3C,CAAAA,CAAS,CAACgD,MAAV,CAAiB,gCAAjB,CAAmDZ,CAAnD,EAA4Da,IAA5D,CAAiE,SAASC,CAAT,CAAe,CACnFnB,CAAI,CAACvB,UAAL,CAAkBsB,CAAlB,CACAA,CAAS,CAACoB,IAAV,CAAeA,CAAf,EACApB,CAAS,CAACZ,IAAV,CAAe,OAAf,EAAwBiC,MAAxB,CAA+B,UAAW,CACtCpB,CAAI,CAACqB,cAAL,EACH,CAFD,EAKArB,CAAI,CAACtB,eAAL,IACAsB,CAAI,CAACqB,cAAL,EAEH,CAXM,CAYV,CA1DD,CAkEAlD,CAAI,CAACG,SAAL,CAAegD,OAAf,CAAyB,UAAW,CAChC,GAAI,CAAC,KAAK5C,eAAV,CAA2B,CACvB,QACH,CAED,GAAIgB,CAAAA,CAAQ,CAAG,KAAKV,kBAAL,EAAf,CACIuC,CAAG,CAAG,CADV,CAEIC,CAAK,GAFT,CAIAzD,CAAC,CAACqB,IAAF,CAAO,KAAKF,sBAAL,EAAP,CAAsC,SAAS2B,CAAT,CAAgBD,CAAhB,CAA4B,CAC9D,GAAwB,CAApB,CAAAA,CAAU,CAAC7B,MAAf,CAA2B,CACvByC,CAAK,GACR,CACDD,CAAG,EAAIX,CAAU,CAAC7B,MACrB,CALD,EAOAyC,CAAK,CAAGA,CAAK,EAAID,CAAG,EAAI7B,CAAxB,CACA,MAAO8B,CAAAA,CACV,CAlBD,CAoBA,MAAwDrD,CAAAA,CAE3D,CAjLK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency rule points module.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/str',\n 'core/templates',\n 'tool_lp/competency_rule',\n ],\n function($, Str, Templates, RuleBase) {\n\n /**\n * Competency rule points class.\n */\n var Rule = function() {\n RuleBase.apply(this, arguments);\n };\n Rule.prototype = Object.create(RuleBase.prototype);\n\n /** @type {Node} Reference to the container in which the template was included. */\n Rule.prototype._container = null;\n /** @type {Boolean} Whether or not the template was included. */\n Rule.prototype._templateLoaded = false;\n\n /**\n * The config established by this rule.\n *\n * @return {String}\n * @method getConfig\n */\n Rule.prototype.getConfig = function() {\n return JSON.stringify({\n base: {\n points: this._getRequiredPoints(),\n },\n competencies: this._getCompetenciesConfig()\n });\n };\n\n /**\n * Gathers the input provided by the user for competencies.\n *\n * @return {Array} Containing id, points and required.\n * @method _getCompetenciesConfig\n * @protected\n */\n Rule.prototype._getCompetenciesConfig = function() {\n var competencies = [];\n\n this._container.find('[data-competency]').each(function() {\n var node = $(this),\n id = node.data('competency'),\n points = parseInt(node.find('[name=\"points\"]').val(), 10),\n required = node.find('[name=\"required\"]').prop('checked');\n\n competencies.push({\n id: id,\n points: points,\n required: required ? 1 : 0\n });\n });\n\n return competencies;\n };\n\n /**\n * Fetches the required points set by the user.\n *\n * @return {Number}\n * @method _getRequiredPoints\n * @protected\n */\n Rule.prototype._getRequiredPoints = function() {\n return parseInt(this._container.find('[name=\"requiredpoints\"]').val() || 1, 10);\n };\n\n /**\n * Return the type of the module.\n *\n * @return {String}\n * @method getType\n */\n Rule.prototype.getType = function() {\n return 'core_competency\\\\competency_rule_points';\n };\n\n /**\n * Callback to inject the template.\n *\n * @param {Node} container Node to inject in.\n * @return {Promise} Resolved when done.\n * @method injectTemplate\n */\n Rule.prototype.injectTemplate = function(container) {\n var self = this,\n children = this._tree.getChildren(this._competency.id),\n context,\n config = {\n base: {points: 2},\n competencies: []\n };\n\n this._templateLoaded = false;\n\n // Only pre-load the configuration when the competency is using this rule.\n if (self._competency.ruletype == self.getType()) {\n try {\n config = JSON.parse(self._competency.ruleconfig);\n } catch (e) {\n // eslint-disable-line no-empty\n }\n }\n\n context = {\n requiredpoints: (config && config.base) ? config.base.points : 2,\n competency: self._competency,\n children: []\n };\n\n $.each(children, function(index, child) {\n var competency = {\n id: child.id,\n shortname: child.shortname,\n required: false,\n points: 0\n };\n\n if (config) {\n $.each(config.competencies, function(index, comp) {\n if (comp.id == competency.id) {\n competency.required = comp.required ? true : false;\n competency.points = comp.points;\n }\n });\n }\n\n context.children.push(competency);\n });\n\n return Templates.render('tool_lp/competency_rule_points', context).then(function(html) {\n self._container = container;\n container.html(html);\n container.find('input').change(function() {\n self._triggerChange();\n });\n\n // We're done, let's trigger a change.\n self._templateLoaded = true;\n self._triggerChange();\n return;\n });\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method isValid\n */\n Rule.prototype.isValid = function() {\n if (!this._templateLoaded) {\n return false;\n }\n\n var required = this._getRequiredPoints(),\n max = 0,\n valid = true;\n\n $.each(this._getCompetenciesConfig(), function(index, competency) {\n if (competency.points < 0) {\n valid = false;\n }\n max += competency.points;\n });\n\n valid = valid && max >= required;\n return valid;\n };\n\n return /** @alias module:tool_lp/competency_rule_all */ Rule;\n\n});\n"],"file":"competency_rule_points.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencyactions.min.js b/admin/tool/lp/amd/build/competencyactions.min.js index 993a3ef943bf6..5314ff2902eff 100644 --- a/admin/tool/lp/amd/build/competencyactions.min.js +++ b/admin/tool/lp/amd/build/competencyactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/url","core/templates","core/notification","core/str","core/ajax","tool_lp/dragdrop-reorder","tool_lp/tree","tool_lp/dialogue","tool_lp/menubar","tool_lp/competencypicker","tool_lp/competency_outcomes","tool_lp/competencyruleconfig"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n,o,p,q,r,s,t=null,u=null,v=null,w=null,x=function(){var c=a('[data-region="competencyactions"]').data("competency"),f={competencyframeworkid:t.getCompetencyFrameworkId(),pagecontextid:n};null!==c&&(f.parentid=c.id);var g=function(){var c=a.param(f);window.location=b.relativeUrl("/admin/tool/lp/editcompetency.php?"+c)};null!==c&&t.hasRule(c.id)?e.get_strings([{key:"confirm",component:"moodle"},{key:"addingcompetencywillresetparentrule",component:"tool_lp",param:c.shortname},{key:"yes",component:"core"},{key:"no",component:"core"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],g)}).fail(d.exception):g()},y=function(){var b=a('[data-region="filtercompetencies"]').data("frameworkid"),c=f.call([{methodname:"core_competency_set_parent_competency",args:{competencyid:u,parentid:v}},{methodname:"tool_lp_data_for_competencies_manage_page",args:{competencyframeworkid:b,search:a('[data-region="filtercompetencies"] input').val()}}]);c[1].done(E).fail(d.exception)},z=function(){if(v="undefined"==typeof v?0:v,v!=u){var a=t.getCompetency(v)||{},b=t.getCompetency(u)||{},c="movecompetencywillresetrules",f=!1;b.parentid!=v&&(a.path&&a.path.indexOf("/"+b.id+"/")>=0&&(c="movecompetencytochildofselfwillresetrules",f=f||t.hasRule(b.id)),f=f||t.hasRule(a.id)||t.hasRule(b.parentid),f?e.get_strings([{key:"confirm",component:"moodle"},{key:c,component:"tool_lp"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],y)}).fail(d.exception):y())}},A=function(b){var c=a(b.getContent()),d=c.find("[data-enhance=movetree]"),e=new h(d,(!1));e.on("selectionchanged",function(b,c){var d=c.selected;v=a(d).data("id")}),d.show(),c.on("click",'[data-action="move"]',function(){b.close(),z()}),c.on("click",'[data-action="cancel"]',function(){b.close()})},B=function(a,b){var c;for(c=0;cspan",O).on("dragover","li>span",P).on("dragenter","li>span",Q).on("dragleave","li>span",R).on("drop","li>span",S),b.on("selectionchanged",$),p=new m(t,s),p.on("save",L.bind(this))}}}); \ No newline at end of file +define ("tool_lp/competencyactions",["jquery","core/url","core/templates","core/notification","core/str","core/ajax","tool_lp/dragdrop-reorder","tool_lp/tree","tool_lp/dialogue","tool_lp/menubar","tool_lp/competencypicker","tool_lp/competency_outcomes","tool_lp/competencyruleconfig"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=null,o=null,p=null,q,r,s,t,u,v,w=null,x=function(){var c=a("[data-region=\"competencyactions\"]").data("competency"),f={competencyframeworkid:n.getCompetencyFrameworkId(),pagecontextid:q};if(null!==c){f.parentid=c.id}var g=function(){var c=a.param(f);window.location=b.relativeUrl("/admin/tool/lp/editcompetency.php?"+c)};if(null!==c&&n.hasRule(c.id)){e.get_strings([{key:"confirm",component:"moodle"},{key:"addingcompetencywillresetparentrule",component:"tool_lp",param:c.shortname},{key:"yes",component:"core"},{key:"no",component:"core"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],g)}).fail(d.exception)}else{g()}},y=function(){var b=a("[data-region=\"filtercompetencies\"]").data("frameworkid"),c=f.call([{methodname:"core_competency_set_parent_competency",args:{competencyid:o,parentid:p}},{methodname:"tool_lp_data_for_competencies_manage_page",args:{competencyframeworkid:b,search:a("[data-region=\"filtercompetencies\"] input").val()}}]);c[1].done(E).fail(d.exception)},z=function(){p="undefined"==typeof p?0:p;if(p==o){return}var a=n.getCompetency(p)||{},b=n.getCompetency(o)||{},c="movecompetencywillresetrules",f=!1;if(b.parentid==p){return}if(a.path&&0<=a.path.indexOf("/"+b.id+"/")){c="movecompetencytochildofselfwillresetrules";f=f||n.hasRule(b.id)}f=f||n.hasRule(a.id)||n.hasRule(b.parentid);if(f){e.get_strings([{key:"confirm",component:"moodle"},{key:c,component:"tool_lp"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],y)}).fail(d.exception)}else{y()}},A=function(b){var c=a(b.getContent()),d=c.find("[data-enhance=movetree]"),e=new h(d,!1);e.on("selectionchanged",function(b,c){var d=c.selected;p=a(d).data("id")});d.show();c.on("click","[data-action=\"move\"]",function(){b.close();z()});c.on("click","[data-action=\"cancel\"]",function(){b.close()})},B=function(a,b){var c;for(c=0;cspan",O).on("dragover","li>span",P).on("dragenter","li>span",Q).on("dragleave","li>span",R).on("drop","li>span",S);b.on("selectionchanged",$);s=new m(n,v);s.on("save",L.bind(this))}}}); +//# sourceMappingURL=competencyactions.min.js.map diff --git a/admin/tool/lp/amd/build/competencyactions.min.js.map b/admin/tool/lp/amd/build/competencyactions.min.js.map new file mode 100644 index 0000000000000..baafad8e3de7e --- /dev/null +++ b/admin/tool/lp/amd/build/competencyactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competencyactions.js"],"names":["define","$","url","templates","notification","str","ajax","dragdrop","Ariatree","Dialogue","menubar","Picker","Outcomes","RuleConfig","treeModel","moveSource","moveTarget","pageContextId","pickerInstance","ruleConfigInstance","relatedTarget","taxonomiesConstants","rulesModules","selectedCompetencyId","addHandler","parent","data","params","competencyframeworkid","getCompetencyFrameworkId","pagecontextid","parentid","id","relocate","queryparams","param","window","location","relativeUrl","hasRule","get_strings","key","component","shortname","done","strings","confirm","fail","exception","doMove","frameworkid","requests","call","methodname","args","competencyid","search","val","reloadPage","confirmMove","targetComp","getCompetency","sourceComp","confirmMessage","showConfirm","path","indexOf","initMovePopup","popup","body","getContent","treeRoot","find","tree","on","evt","target","selected","show","close","addCompetencyChildren","competencies","i","length","haschildren","children","moveHandler","e","preventDefault","competency","searchtext","when","apply","framework","competenciestree","onecompetency","render","editHandler","context","newhtml","newjs","replaceWith","runTemplateJS","updateSearchHandler","moveUpHandler","moveDownHandler","seeCoursesHandler","courses","html","get_string","linkedcourses","relateCompetenciesHandler","compIds","competencyIds","calls","each","index","value","push","relatedcompetencyid","promises","then","js","updatedRelatedCompetencies","catch","setDisallowedCompetencyIDs","display","ruleConfigHandler","setTargetCompetencyId","ruleConfigSaveHandler","config","update","idnumber","description","descriptionformat","ruletype","ruleoutcome","ruleconfig","promise","result","renderCompetencySummary","doDelete","success","alert","deleteCompetencyHandler","dragStart","originalEvent","dataTransfer","setData","allowDrop","dropEffect","dragEnter","addClass","dragLeave","removeClass","dropOver","getData","deleteRelatedHandler","relatedid","substr","removeRelated","triggerCompetencyViewedEvent","getTaxonomyAtLevel","level","constant","Deferred","resolve","showdeleterelatedaction","showrelatedcompetencies","showrule","pluginbaseurl","NONE","getString","name","modInfo","type","strs","rule","outcome","replaceNodeContents","strAddTaxonomy","strSelectedTaxonomy","selectionChanged","node","btn","actionMenu","selectedTitle","sublevel","closeAll","clone","remove","end","text","hide","getCompetencyLevel","parseTaxonomies","taxonomiesstr","all","split","unshift","init","model","pagectxid","taxonomies","rulesMods","enhance","bind","top"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle selection changes and actions on the competency tree.\n *\n * @module tool_lp/competencyactions\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/url',\n 'core/templates',\n 'core/notification',\n 'core/str',\n 'core/ajax',\n 'tool_lp/dragdrop-reorder',\n 'tool_lp/tree',\n 'tool_lp/dialogue',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker',\n 'tool_lp/competency_outcomes',\n 'tool_lp/competencyruleconfig'],\n function($, url, templates, notification, str, ajax, dragdrop, Ariatree, Dialogue, menubar, Picker, Outcomes, RuleConfig) {\n\n // Private variables and functions.\n /** @var {Object} treeModel - This is an object representing the nodes in the tree. */\n var treeModel = null;\n /** @var {Node} moveSource - The start of a drag operation */\n var moveSource = null;\n /** @var {Node} moveTarget - The end of a drag operation */\n var moveTarget = null;\n /** @var {Number} pageContextId The page context ID. */\n var pageContextId;\n /** @type {Object} Picker instance. */\n var pickerInstance;\n /** @type {Object} Rule config instance. */\n var ruleConfigInstance;\n /** @type {Object} The competency we're picking a relation to. */\n var relatedTarget;\n /** @type {Object} Taxonomy constants indexed per level. */\n var taxonomiesConstants;\n /** @type {Array} The rules modules. Values are object containing type, namd and amd. */\n var rulesModules;\n /** @type {Number} the selected competency ID. */\n var selectedCompetencyId = null;\n\n /**\n * Respond to choosing the \"Add\" menu item for the selected node in the tree.\n * @method addHandler\n */\n var addHandler = function() {\n var parent = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n pagecontextid: pageContextId\n };\n\n if (parent !== null) {\n // We are adding at a sub node.\n params.parentid = parent.id;\n }\n\n var relocate = function() {\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n if (parent !== null && treeModel.hasRule(parent.id)) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'addingcompetencywillresetparentrule', component: 'tool_lp', param: parent.shortname},\n {key: 'yes', component: 'core'},\n {key: 'no', component: 'core'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0],\n strings[1],\n strings[2],\n strings[3],\n relocate\n );\n }).fail(notification.exception);\n } else {\n relocate();\n }\n };\n\n /**\n * A source and destination has been chosen - so time to complete a move.\n * @method doMove\n */\n var doMove = function() {\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n var requests = ajax.call([{\n methodname: 'core_competency_set_parent_competency',\n args: {competencyid: moveSource, parentid: moveTarget}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Confirms a competency move.\n *\n * @method confirmMove\n */\n var confirmMove = function() {\n moveTarget = typeof moveTarget === \"undefined\" ? 0 : moveTarget;\n if (moveTarget == moveSource) {\n // No move to do.\n return;\n }\n\n var targetComp = treeModel.getCompetency(moveTarget) || {},\n sourceComp = treeModel.getCompetency(moveSource) || {},\n confirmMessage = 'movecompetencywillresetrules',\n showConfirm = false;\n\n // We shouldn't be moving the competency to the same parent.\n if (sourceComp.parentid == moveTarget) {\n return;\n }\n\n // If we are moving to a child of self.\n if (targetComp.path && targetComp.path.indexOf('/' + sourceComp.id + '/') >= 0) {\n confirmMessage = 'movecompetencytochildofselfwillresetrules';\n\n // Show a confirmation if self has rules, as they'll disappear.\n showConfirm = showConfirm || treeModel.hasRule(sourceComp.id);\n }\n\n // Show a confirmation if the current parent, or the destination have rules.\n showConfirm = showConfirm || (treeModel.hasRule(targetComp.id) || treeModel.hasRule(sourceComp.parentid));\n\n // Show confirm, and/or do the things.\n if (showConfirm) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp'},\n {key: 'yes', component: 'moodle'},\n {key: 'no', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doMove\n );\n }).fail(notification.exception);\n\n } else {\n doMove();\n }\n };\n\n /**\n * A move competency popup was opened - initialise the aria tree in it.\n * @method initMovePopup\n * @param {dialogue} popup The tool_lp/dialogue that was created.\n */\n var initMovePopup = function(popup) {\n var body = $(popup.getContent());\n var treeRoot = body.find('[data-enhance=movetree]');\n var tree = new Ariatree(treeRoot, false);\n tree.on('selectionchanged', function(evt, params) {\n var target = params.selected;\n moveTarget = $(target).data('id');\n });\n treeRoot.show();\n\n body.on('click', '[data-action=\"move\"]', function() {\n popup.close();\n confirmMove();\n });\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Turn a flat list of competencies into a tree structure (recursive).\n * @method addCompetencyChildren\n * @param {Object} parent The current parent node in the tree\n * @param {Object[]} competencies The flat list of competencies\n */\n var addCompetencyChildren = function(parent, competencies) {\n var i;\n\n for (i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n };\n\n /**\n * A node was chosen and \"Move\" was selected from the menu. Open a popup to select the target.\n * @param {Event} e\n * @method moveHandler\n */\n var moveHandler = function(e) {\n e.preventDefault();\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n // Remember what we are moving.\n moveSource = competency.id;\n\n // Load data for the template.\n var requests = ajax.call([\n {\n methodname: 'core_competency_search_competencies',\n args: {\n competencyframeworkid: competency.competencyframeworkid,\n searchtext: ''\n }\n }, {\n methodname: 'core_competency_read_competency_framework',\n args: {\n id: competency.competencyframeworkid\n }\n }\n ]);\n\n // When all data has arrived, continue.\n $.when.apply(null, requests).done(function(competencies, framework) {\n\n // Expand the list of competencies into a tree.\n var i;\n var competenciestree = [];\n for (i = 0; i < competencies.length; i++) {\n var onecompetency = competencies[i];\n if (onecompetency.parentid == \"0\") {\n onecompetency.children = [];\n onecompetency.haschildren = 0;\n competenciestree[competenciestree.length] = onecompetency;\n addCompetencyChildren(onecompetency, competencies);\n }\n }\n\n str.get_strings([\n {key: 'movecompetency', component: 'tool_lp', param: competency.shortname},\n {key: 'move', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n\n var context = {\n framework: framework,\n competencies: competenciestree\n };\n\n templates.render('tool_lp/competencies_move_tree', context)\n .done(function(tree) {\n new Dialogue(\n strings[0], // Move competency x.\n tree, // The move tree.\n initMovePopup\n );\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n }).fail(notification.exception);\n\n };\n\n /**\n * Edit the selected competency.\n * @method editHandler\n */\n var editHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var params = {\n competencyframeworkid: treeModel.getCompetencyFrameworkId(),\n id: competency.id,\n parentid: competency.parentid,\n pagecontextid: pageContextId\n };\n\n var queryparams = $.param(params);\n window.location = url.relativeUrl('/admin/tool/lp/editcompetency.php?' + queryparams);\n };\n\n /**\n * Re-render the page with the latest data.\n * @param {Object} context\n * @method reloadPage\n */\n var reloadPage = function(context) {\n templates.render('tool_lp/manage_competencies_page', context)\n .done(function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n })\n .fail(notification.exception);\n };\n\n /**\n * Perform a search and render the page with the new search results.\n * @param {Event} e\n * @method updateSearchHandler\n */\n var updateSearchHandler = function(e) {\n e.preventDefault();\n\n var frameworkid = $('[data-region=\"filtercompetencies\"]').data('frameworkid');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: frameworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"up\". This only affects the sort order within the same branch of the tree.\n * @method moveUpHandler\n */\n var moveUpHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_up_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Move a competency \"down\". This only affects the sort order within the same branch of the tree.\n * @method moveDownHandler\n */\n var moveDownHandler = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_move_down_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Open a dialogue to show all the courses using the selected competency.\n * @method seeCoursesHandler\n */\n var seeCoursesHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competency.id}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html, // The linked courses.\n initMovePopup\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method relateCompetenciesHandler\n */\n var relateCompetenciesHandler = function() {\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, relatedTarget.competencyframeworkid);\n pickerInstance.on('save', function(e, data) {\n var compIds = data.competencyIds;\n\n var calls = [];\n $.each(compIds, function(index, value) {\n calls.push({\n methodname: 'core_competency_add_related_competency',\n args: {competencyid: value, relatedcompetencyid: relatedTarget.id}\n });\n });\n\n calls.push({\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: relatedTarget.id}\n });\n\n var promises = ajax.call(calls);\n\n promises[calls.length - 1].then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n }).catch(notification.exception);\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs([relatedTarget.id]);\n pickerInstance.display();\n };\n\n var ruleConfigHandler = function(e) {\n e.preventDefault();\n relatedTarget = $('[data-region=\"competencyactions\"]').data('competency');\n ruleConfigInstance.setTargetCompetencyId(relatedTarget.id);\n ruleConfigInstance.display();\n };\n\n var ruleConfigSaveHandler = function(e, config) {\n var update = {\n id: relatedTarget.id,\n shortname: relatedTarget.shortname,\n idnumber: relatedTarget.idnumber,\n description: relatedTarget.description,\n descriptionformat: relatedTarget.descriptionformat,\n ruletype: config.ruletype,\n ruleoutcome: config.ruleoutcome,\n ruleconfig: config.ruleconfig\n };\n var promise = ajax.call([{\n methodname: 'core_competency_update_competency',\n args: {competency: update}\n }]);\n promise[0].then(function(result) {\n if (result) {\n relatedTarget.ruletype = config.ruletype;\n relatedTarget.ruleoutcome = config.ruleoutcome;\n relatedTarget.ruleconfig = config.ruleconfig;\n renderCompetencySummary(relatedTarget);\n }\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Delete a competency.\n * @method doDelete\n */\n var doDelete = function() {\n // We are chaining ajax requests here.\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency',\n args: {id: competency.id}\n }, {\n methodname: 'tool_lp_data_for_competencies_manage_page',\n args: {competencyframeworkid: competency.competencyframeworkid,\n search: $('[data-region=\"filtercompetencies\"] input').val()}\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n str.get_strings([\n {key: 'competencycannotbedeleted', component: 'tool_lp', param: competency.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n requests[1].done(reloadPage).fail(notification.exception);\n };\n\n /**\n * Show a confirm dialogue before deleting a competency.\n * @method deleteCompetencyHandler\n */\n var deleteCompetencyHandler = function() {\n var competency = $('[data-region=\"competencyactions\"]').data('competency'),\n confirmMessage = 'deletecompetency';\n\n if (treeModel.hasRule(competency.parentid)) {\n confirmMessage = 'deletecompetencyparenthasrule';\n }\n\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: confirmMessage, component: 'tool_lp', param: competency.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragStart\n * @param {Event} e\n */\n var dragStart = function(e) {\n e.originalEvent.dataTransfer.setData('text', $(e.target).parent().data('id'));\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method allowDrop\n * @param {Event} e\n */\n var allowDrop = function(e) {\n e.originalEvent.dataTransfer.dropEffect = 'move';\n e.preventDefault();\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragEnter\n * @param {Event} e\n */\n var dragEnter = function(e) {\n e.preventDefault();\n $(this).addClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dragLeave\n * @param {Event} e\n */\n var dragLeave = function(e) {\n e.preventDefault();\n $(this).removeClass('currentdragtarget');\n };\n\n /**\n * HTML5 implementation of drag/drop (there is an accesible alternative in the menus).\n * @method dropOver\n * @param {Event} e\n */\n var dropOver = function(e) {\n e.preventDefault();\n moveSource = e.originalEvent.dataTransfer.getData('text');\n moveTarget = $(e.target).parent().data('id');\n $(this).removeClass('currentdragtarget');\n\n confirmMove();\n };\n\n /**\n * Deletes a related competency without confirmation.\n *\n * @param {Event} e The event that triggered the action.\n * @method deleteRelatedHandler\n */\n var deleteRelatedHandler = function(e) {\n e.preventDefault();\n\n var relatedid = this.id.substr(11);\n var competency = $('[data-region=\"competencyactions\"]').data('competency');\n var removeRelated = ajax.call([\n {methodname: 'core_competency_remove_related_competency',\n args: {relatedcompetencyid: relatedid, competencyid: competency.id}},\n {methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}}\n ]);\n\n removeRelated[1].done(function(context) {\n templates.render('tool_lp/related_competencies', context).done(function(html) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n updatedRelatedCompetencies();\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Updates the competencies list (with relations) and add listeners.\n *\n * @method updatedRelatedCompetencies\n */\n var updatedRelatedCompetencies = function() {\n\n // Listeners to newly loaded related competencies.\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Object} competency The competency.\n * @method triggerCompetencyViewedEvent\n */\n var triggerCompetencyViewedEvent = function(competency) {\n if (competency.id !== selectedCompetencyId) {\n // Set the selected competency id.\n selectedCompetencyId = competency.id;\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competency.id}\n }]);\n }\n };\n\n /**\n * Return the taxonomy constant for a level.\n *\n * @param {Number} level The level.\n * @return {String}\n * @function getTaxonomyAtLevel\n */\n var getTaxonomyAtLevel = function(level) {\n var constant = taxonomiesConstants[level];\n if (!constant) {\n constant = 'competency';\n }\n return constant;\n };\n\n /**\n * Render the competency summary.\n *\n * @param {Object} competency The competency.\n */\n var renderCompetencySummary = function(competency) {\n var promise = $.Deferred().resolve().promise(),\n context = {};\n\n context.competency = competency;\n context.showdeleterelatedaction = true;\n context.showrelatedcompetencies = true;\n context.showrule = false;\n context.pluginbaseurl = url.relativeUrl('/admin/tool/lp');\n\n if (competency.ruleoutcome != Outcomes.NONE) {\n // Get the outcome and rule name.\n promise = Outcomes.getString(competency.ruleoutcome).then(function(str) {\n var name;\n $.each(rulesModules, function(index, modInfo) {\n if (modInfo.type == competency.ruletype) {\n name = modInfo.name;\n }\n });\n return [str, name];\n });\n }\n\n promise.then(function(strs) {\n if (typeof strs !== 'undefined') {\n context.showrule = true;\n context.rule = {\n outcome: strs[0],\n type: strs[1]\n };\n }\n return context;\n }).then(function(context) {\n return templates.render('tool_lp/competency_summary', context);\n }).then(function(html) {\n $('[data-region=\"competencyinfo\"]').html(html);\n $('[data-action=\"deleterelation\"]').on('click', deleteRelatedHandler);\n return templates.render('tool_lp/loading', {});\n }).then(function(html, js) {\n templates.replaceNodeContents('[data-region=\"relatedcompetencies\"]', html, js);\n return ajax.call([{\n methodname: 'tool_lp_data_for_related_competencies_section',\n args: {competencyid: competency.id}\n }])[0];\n }).then(function(context) {\n return templates.render('tool_lp/related_competencies', context);\n }).then(function(html, js) {\n $('[data-region=\"relatedcompetencies\"]').replaceWith(html);\n templates.runTemplateJS(js);\n updatedRelatedCompetencies();\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Return the string \"Add \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strAddTaxonomy\n */\n var strAddTaxonomy = function(level) {\n return str.get_string('taxonomy_add_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @param {Number} level The level.\n * @return {String}\n * @function strSelectedTaxonomy\n */\n var strSelectedTaxonomy = function(level) {\n return str.get_string('taxonomy_selected_' + getTaxonomyAtLevel(level), 'tool_lp');\n };\n\n /**\n * Handler when a node in the aria tree is selected.\n * @method selectionChanged\n * @param {Event} evt The event that triggered the selection change.\n * @param {Object} params The parameters for the event. Contains a list of selected nodes.\n * @return {Boolean}\n */\n var selectionChanged = function(evt, params) {\n var node = params.selected,\n id = $(node).data('id'),\n btn = $('[data-region=\"competencyactions\"] [data-action=\"add\"]'),\n actionMenu = $('[data-region=\"competencyactionsmenu\"]'),\n selectedTitle = $('[data-region=\"selected-competency\"]'),\n level = 0,\n sublevel = 1;\n\n menubar.closeAll();\n\n if (typeof id === \"undefined\") {\n // Assume this is the root of the tree.\n // Here we are only getting the text from the top of the tree, to do it we clone the tree,\n // remove all children and then call text on the result.\n $('[data-region=\"competencyinfo\"]').html(node.clone().children().remove().end().text());\n $('[data-region=\"competencyactions\"]').data('competency', null);\n actionMenu.hide();\n\n } else {\n var competency = treeModel.getCompetency(id);\n\n level = treeModel.getCompetencyLevel(id);\n sublevel = level + 1;\n\n actionMenu.show();\n $('[data-region=\"competencyactions\"]').data('competency', competency);\n renderCompetencySummary(competency);\n // Log Competency viewed event.\n triggerCompetencyViewedEvent(competency);\n }\n strSelectedTaxonomy(level).then(function(str) {\n selectedTitle.text(str);\n return;\n }).catch(notification.exception);\n\n strAddTaxonomy(sublevel).then(function(str) {\n btn.show()\n .find('[data-region=\"term\"]')\n .text(str);\n return;\n }).catch(notification.exception);\n\n // We handled this event so consume it.\n evt.preventDefault();\n return false;\n };\n\n /**\n * Return the string \"Selected \".\n *\n * @function parseTaxonomies\n * @param {String} taxonomiesstr Comma separated list of taxonomies.\n * @return {Array} of level => taxonomystr\n */\n var parseTaxonomies = function(taxonomiesstr) {\n var all = taxonomiesstr.split(',');\n all.unshift(\"\");\n delete all[0];\n\n // Note we don't need to fill holes, because other functions check for empty anyway.\n return all;\n };\n\n return {\n /**\n * Initialise this page (attach event handlers etc).\n *\n * @method init\n * @param {Object} model The tree model provides some useful functions for loading and searching competencies.\n * @param {Number} pagectxid The page context ID.\n * @param {Object} taxonomies Constants indexed by level.\n * @param {Object} rulesMods The modules of the rules.\n */\n init: function(model, pagectxid, taxonomies, rulesMods) {\n treeModel = model;\n pageContextId = pagectxid;\n taxonomiesConstants = parseTaxonomies(taxonomies);\n rulesModules = rulesMods;\n\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').on('click', addHandler);\n\n menubar.enhance('.competencyactionsmenu', {\n '[data-action=\"edit\"]': editHandler,\n '[data-action=\"delete\"]': deleteCompetencyHandler,\n '[data-action=\"move\"]': moveHandler,\n '[data-action=\"moveup\"]': moveUpHandler,\n '[data-action=\"movedown\"]': moveDownHandler,\n '[data-action=\"linkedcourses\"]': seeCoursesHandler,\n '[data-action=\"relatedcompetencies\"]': relateCompetenciesHandler.bind(this),\n '[data-action=\"competencyrules\"]': ruleConfigHandler.bind(this)\n });\n $('[data-region=\"competencyactionsmenu\"]').hide();\n $('[data-region=\"competencyactions\"] [data-action=\"add\"]').hide();\n\n $('[data-region=\"filtercompetencies\"]').on('submit', updateSearchHandler);\n // Simple html5 drag drop because we already added an accessible alternative.\n var top = $('[data-region=\"managecompetencies\"] [data-enhance=\"tree\"]');\n top.on('dragstart', 'li>span', dragStart)\n .on('dragover', 'li>span', allowDrop)\n .on('dragenter', 'li>span', dragEnter)\n .on('dragleave', 'li>span', dragLeave)\n .on('drop', 'li>span', dropOver);\n\n model.on('selectionchanged', selectionChanged);\n\n // Prepare the configuration tool.\n ruleConfigInstance = new RuleConfig(treeModel, rulesModules);\n ruleConfigInstance.on('save', ruleConfigSaveHandler.bind(this));\n }\n };\n});\n"],"file":"competencyactions.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencydialogue.min.js b/admin/tool/lp/amd/build/competencydialogue.min.js index 2ef99e40fcfe6..53a0e337f32cf 100644 --- a/admin/tool/lp/amd/build/competencydialogue.min.js +++ b/admin/tool/lp/amd/build/competencydialogue.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/dialogue"],function(a,b,c,d,e,f){var g,h=function(){};return h.prototype.triggerCompetencyViewedEvent=function(a){c.call([{methodname:"core_competency_competency_viewed",args:{id:a}}])},h.prototype.showDialogue=function(a,c){var e=this.getCompetencyDataPromise(a,c),g=this;e.done(function(c){d.render("tool_lp/competency_summary",c).done(function(b){g.triggerCompetencyViewedEvent(a),new f(c.competency.shortname,b)}).fail(b.exception)}).fail(b.exception)},h.prototype.showDialogueFromData=function(a){var c=this;d.render("tool_lp/competency_summary",a).done(function(b){c.triggerCompetencyViewedEvent(a.id),new f(a.shortname,b,c.enhanceDialogue)}).fail(b.exception)},h.prototype.clickEventHandler=function(b){var c=b.data.compdialogue,d=a(b.currentTarget),e=d.data("id"),f=!d.data("excluderelated"),g=d.data("includecourses");c.showDialogue(e,{includerelated:f,includecourses:g}),b.preventDefault()},h.prototype.getCompetencyDataPromise=function(a,d){var e=c.call([{methodname:"tool_lp_data_for_competency_summary",args:{competencyid:a,includerelated:d.includerelated||!1,includecourses:d.includecourses||!1}}]);return e[0].then(function(a){return a}).fail(b.exception)},{init:function(){"undefined"==typeof g&&(g=new h,a("body").delegate('[data-action="competency-dialogue"]',"click",{compdialogue:g},g.clickEventHandler.bind(g)))}}}); \ No newline at end of file +define ("tool_lp/competencydialogue",["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/dialogue"],function(a,b,c,d,e,f){var g,h=function(){};h.prototype.triggerCompetencyViewedEvent=function(a){c.call([{methodname:"core_competency_competency_viewed",args:{id:a}}])};h.prototype.showDialogue=function(a,c){var e=this.getCompetencyDataPromise(a,c),g=this;e.done(function(c){d.render("tool_lp/competency_summary",c).done(function(b){g.triggerCompetencyViewedEvent(a);new f(c.competency.shortname,b)}).fail(b.exception)}).fail(b.exception)};h.prototype.showDialogueFromData=function(a){var c=this;d.render("tool_lp/competency_summary",a).done(function(b){c.triggerCompetencyViewedEvent(a.id);new f(a.shortname,b,c.enhanceDialogue)}).fail(b.exception)};h.prototype.clickEventHandler=function(b){var c=b.data.compdialogue,d=a(b.currentTarget),e=d.data("id"),f=!d.data("excluderelated"),g=d.data("includecourses");c.showDialogue(e,{includerelated:f,includecourses:g});b.preventDefault()};h.prototype.getCompetencyDataPromise=function(a,d){var e=c.call([{methodname:"tool_lp_data_for_competency_summary",args:{competencyid:a,includerelated:d.includerelated||!1,includecourses:d.includecourses||!1}}]);return e[0].then(function(a){return a}).fail(b.exception)};return{init:function init(){if("undefined"!=typeof g){return}g=new h;a("body").delegate("[data-action=\"competency-dialogue\"]","click",{compdialogue:g},g.clickEventHandler.bind(g))}}}); +//# sourceMappingURL=competencydialogue.min.js.map diff --git a/admin/tool/lp/amd/build/competencydialogue.min.js.map b/admin/tool/lp/amd/build/competencydialogue.min.js.map new file mode 100644 index 0000000000000..0b54b1160dd9a --- /dev/null +++ b/admin/tool/lp/amd/build/competencydialogue.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competencydialogue.js"],"names":["define","$","notification","ajax","templates","str","Dialogue","instance","Competencydialogue","prototype","triggerCompetencyViewedEvent","competencyId","call","methodname","args","id","showDialogue","competencyid","options","datapromise","getCompetencyDataPromise","localthis","done","data","render","html","competency","shortname","fail","exception","showDialogueFromData","dataSource","enhanceDialogue","clickEventHandler","e","compdialogue","currentTarget","includerelated","includecourses","preventDefault","requests","then","context","init","delegate","bind"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Display Competency in dialogue box.\n *\n * @module tool_lp/Competencydialogue\n * @package tool_lp\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/dialogue'],\n function($, notification, ajax, templates, str, Dialogue) {\n\n /**\n * The main instance we'll be working with.\n *\n * @type {Competencydialogue}\n */\n var instance;\n\n /**\n * Constructor for CompetencyDialogue.\n *\n * @param {Object} options\n *\n */\n var Competencydialogue = function() {\n // Intentionally left empty.\n };\n\n /**\n * Log the competency viewed event.\n *\n * @param {Number} competencyId The competency ID.\n * @method triggerCompetencyViewedEvent\n */\n Competencydialogue.prototype.triggerCompetencyViewedEvent = function(competencyId) {\n ajax.call([{\n methodname: 'core_competency_competency_viewed',\n args: {id: competencyId}\n }]);\n };\n\n /**\n * Display a dialogue box by competencyid.\n *\n * @param {Number} competencyid The competency ID.\n * @param {Object} options The options.\n * @method showDialogue\n */\n Competencydialogue.prototype.showDialogue = function(competencyid, options) {\n\n var datapromise = this.getCompetencyDataPromise(competencyid, options);\n var localthis = this;\n datapromise.done(function(data) {\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', data)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(competencyid);\n\n // Show the dialogue.\n new Dialogue(\n data.competency.shortname,\n html\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Display a dialogue box from data.\n *\n * @param {Object} dataSource data to be used to display dialogue box\n * @method showDialogueFromData\n */\n Competencydialogue.prototype.showDialogueFromData = function(dataSource) {\n\n var localthis = this;\n // Inner Html in the dialogue content.\n templates.render('tool_lp/competency_summary', dataSource)\n .done(function(html) {\n // Log competency viewed event.\n localthis.triggerCompetencyViewedEvent(dataSource.id);\n\n // Show the dialogue.\n new Dialogue(\n dataSource.shortname,\n html,\n localthis.enhanceDialogue\n );\n }).fail(notification.exception);\n };\n\n /**\n * The action on the click event.\n *\n * @param {Event} e event click\n * @method clickEventHandler\n */\n Competencydialogue.prototype.clickEventHandler = function(e) {\n\n var compdialogue = e.data.compdialogue;\n var currentTarget = $(e.currentTarget);\n var competencyid = currentTarget.data('id');\n var includerelated = !(currentTarget.data('excluderelated'));\n var includecourses = currentTarget.data('includecourses');\n\n // Show the dialogue box.\n compdialogue.showDialogue(competencyid, {\n includerelated: includerelated,\n includecourses: includecourses\n });\n e.preventDefault();\n };\n\n /**\n * Get a promise on data competency.\n *\n * @param {Number} competencyid\n * @param {Object} options\n * @return {Promise} return promise on data request\n * @method getCompetencyDataPromise\n */\n Competencydialogue.prototype.getCompetencyDataPromise = function(competencyid, options) {\n\n var requests = ajax.call([\n {methodname: 'tool_lp_data_for_competency_summary',\n args: {competencyid: competencyid,\n includerelated: options.includerelated || false,\n includecourses: options.includecourses || false\n }\n }\n ]);\n\n return requests[0].then(function(context) {\n return context;\n }).fail(notification.exception);\n };\n\n return /** @alias module:tool_lp/competencydialogue */ {\n\n /**\n * Initialise the competency dialogue module.\n *\n * Only the first call matters.\n */\n init: function() {\n if (typeof instance !== 'undefined') {\n return;\n }\n\n // Instantiate the one instance and delegate event on the body.\n instance = new Competencydialogue();\n $('body').delegate('[data-action=\"competency-dialogue\"]', 'click', {compdialogue: instance},\n instance.clickEventHandler.bind(instance));\n }\n };\n});\n"],"file":"competencydialogue.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencypicker.min.js b/admin/tool/lp/amd/build/competencypicker.min.js index e32b0808ae228..e9f3dff0aea16 100644 --- a/admin/tool/lp/amd/build/competencypicker.min.js +++ b/admin/tool/lp/amd/build/competencypicker.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","core/str","tool_lp/tree"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e){var f=this;f._eventNode=a("
"),f._frameworks=[],f._reset(),f._pageContextId=b,f._pageContextIncludes=d||"children",f._multiSelect="undefined"==typeof e||e===!0,c&&(f._frameworkId=c,f._singleFramework=!0)};return h.prototype._competencies=null,h.prototype._disallowedCompetencyIDs=null,h.prototype._eventNode=null,h.prototype._frameworks=null,h.prototype._frameworkId=null,h.prototype._pageContextId=null,h.prototype._pageContextIncludes=null,h.prototype._popup=null,h.prototype._searchText="",h.prototype._selectedCompetencies=null,h.prototype._singleFramework=!1,h.prototype._multiSelect=!0,h.prototype._onlyVisible=!0,h.prototype._afterRender=function(){var c=this,d=new g(c._find("[data-enhance=linktree]"),c._multiSelect);c._find("[data-enhance=linktree]").show(),d.on("selectionchanged",function(b,d){var e=d.selected;b.preventDefault();var f=[];a.each(e,function(b,d){var e=a(d).data("id"),g=!0;"undefined"==typeof e?g=!1:a.each(c._disallowedCompetencyIDs,function(a,b){b==e&&(g=!1)}),g&&f.push(e)}),c._selectedCompetencies=f,c._selectedCompetencies.length?c._find('[data-region="competencylinktree"] [data-action="add"]').removeAttr("disabled"):c._find('[data-region="competencylinktree"] [data-action="add"]').attr("disabled","disabled")}),c._singleFramework||c._find('[data-action="chooseframework"]').change(function(d){c._frameworkId=a(d.target).val(),c._loadCompetencies().then(c._refresh.bind(c))["catch"](b.exception)}),c._find('[data-region="filtercompetencies"] button').click(function(b){return b.preventDefault(),a(b.target).attr("disabled","disabled"),c._searchText=c._find('[data-region="filtercompetencies"] input').val()||"",c._refresh().always(function(){a(b.target).removeAttr("disabled")})}),c._find('[data-region="competencylinktree"] [data-action="cancel"]').click(function(a){a.preventDefault(),c.close()}),c._find('[data-region="competencylinktree"] [data-action="add"]').click(function(a){a.preventDefault(),c._selectedCompetencies.length&&(c._multiSelect?c._trigger("save",{competencyIds:c._selectedCompetencies}):c._trigger("save",{competencyId:c._selectedCompetencies[0]}),c.close())});var e=c._selectedCompetencies.slice(0);a.each(e,function(a,b){var e=c._find("[data-id="+b+"]");e.length&&(d.toggleItem(e),d.updateFocus(e))})},h.prototype.close=function(){var a=this;a._popup.close(),a._reset()},h.prototype.display=function(){var c=this;return a.when(f.get_string("competencypicker","tool_lp"),c._render()).then(function(a,b){c._popup=new e(a,b[0],c._afterRender.bind(c))})["catch"](b.exception)},h.prototype._fetchCompetencies=function(a,d){var e=this;return c.call([{methodname:"core_competency_search_competencies",args:{searchtext:d,competencyframeworkid:a}}])[0].done(function(a){function b(a,c){for(var d=0;d0?a.when():(d=e._singleFramework?c.call([{methodname:"core_competency_read_competency_framework",args:{id:this._frameworkId}}])[0].then(function(a){return[a]}):c.call([{methodname:"core_competency_list_competency_frameworks",args:{sort:"shortname",context:{contextid:e._pageContextId},includes:e._pageContextIncludes,onlyvisible:e._onlyVisible}}])[0],d.done(function(a){e._frameworks=a}).fail(b.exception))},h.prototype.on=function(a,b){this._eventNode.on(a,b)},h.prototype._preRender=function(){var b=this;return b._loadFrameworks().then(function(){return!b._frameworkId&&b._frameworks.length>0&&(b._frameworkId=b._frameworks[0].id),b._frameworkId?b._loadCompetencies():(b._frameworks=[],a.when())})},h.prototype._refresh=function(){var a=this;return a._render().then(function(b){a._find('[data-region="competencylinktree"]').replaceWith(b),a._afterRender()})},h.prototype._render=function(){var b=this;return b._preRender().then(function(){b._singleFramework||a.each(b._frameworks,function(a,c){c.id==b._frameworkId?c.selected=!0:c.selected=!1});var c={competencies:b._competencies,framework:b._getFramework(b._frameworkId),frameworks:b._frameworks,search:b._searchText,singleFramework:b._singleFramework};return d.render("tool_lp/competency_picker",c)})},h.prototype._reset=function(){this._competencies=[],this._disallowedCompetencyIDs=[],this._popup=null,this._searchText="",this._selectedCompetencies=[]},h.prototype.setDisallowedCompetencyIDs=function(a){this._disallowedCompetencyIDs=a},h.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])},h}); \ No newline at end of file +define ("tool_lp/competencypicker",["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","core/str","tool_lp/tree"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e){var f=this;f._eventNode=a("
");f._frameworks=[];f._reset();f._pageContextId=b;f._pageContextIncludes=d||"children";f._multiSelect="undefined"==typeof e||!0===e;if(c){f._frameworkId=c;f._singleFramework=!0}};h.prototype._competencies=null;h.prototype._disallowedCompetencyIDs=null;h.prototype._eventNode=null;h.prototype._frameworks=null;h.prototype._frameworkId=null;h.prototype._pageContextId=null;h.prototype._pageContextIncludes=null;h.prototype._popup=null;h.prototype._searchText="";h.prototype._selectedCompetencies=null;h.prototype._singleFramework=!1;h.prototype._multiSelect=!0;h.prototype._onlyVisible=!0;h.prototype._afterRender=function(){var c=this,d=new g(c._find("[data-enhance=linktree]"),c._multiSelect);c._find("[data-enhance=linktree]").show();d.on("selectionchanged",function(b,d){var e=d.selected;b.preventDefault();var f=[];a.each(e,function(b,d){var e=a(d).data("id"),g=!0;if("undefined"==typeof e){g=!1}else{a.each(c._disallowedCompetencyIDs,function(a,b){if(b==e){g=!1}})}if(g){f.push(e)}});c._selectedCompetencies=f;if(!c._selectedCompetencies.length){c._find("[data-region=\"competencylinktree\"] [data-action=\"add\"]").attr("disabled","disabled")}else{c._find("[data-region=\"competencylinktree\"] [data-action=\"add\"]").removeAttr("disabled")}});if(!c._singleFramework){c._find("[data-action=\"chooseframework\"]").change(function(d){c._frameworkId=a(d.target).val();c._loadCompetencies().then(c._refresh.bind(c)).catch(b.exception)})}c._find("[data-region=\"filtercompetencies\"] button").click(function(b){b.preventDefault();a(b.target).attr("disabled","disabled");c._searchText=c._find("[data-region=\"filtercompetencies\"] input").val()||"";return c._refresh().always(function(){a(b.target).removeAttr("disabled")})});c._find("[data-region=\"competencylinktree\"] [data-action=\"cancel\"]").click(function(a){a.preventDefault();c.close()});c._find("[data-region=\"competencylinktree\"] [data-action=\"add\"]").click(function(a){a.preventDefault();if(!c._selectedCompetencies.length){return}if(c._multiSelect){c._trigger("save",{competencyIds:c._selectedCompetencies})}else{c._trigger("save",{competencyId:c._selectedCompetencies[0]})}c.close()});var e=c._selectedCompetencies.slice(0);a.each(e,function(a,b){var e=c._find("[data-id="+b+"]");if(e.length){d.toggleItem(e);d.updateFocus(e)}})};h.prototype.close=function(){var a=this;a._popup.close();a._reset()};h.prototype.display=function(){var c=this;return a.when(f.get_string("competencypicker","tool_lp"),c._render()).then(function(a,b){c._popup=new e(a,b[0],c._afterRender.bind(c))}).catch(b.exception)};h.prototype._fetchCompetencies=function(a,d){var e=this;return c.call([{methodname:"core_competency_search_competencies",args:{searchtext:d,competencyframeworkid:a}}])[0].done(function(a){function b(a,c){for(var d=0;d.\n\n/**\n * Competency picker.\n *\n * To handle 'save' events use: picker.on('save')\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'tool_lp/dialogue',\n 'core/str',\n 'tool_lp/tree'],\n function($, Notification, Ajax, Templates, Dialogue, Str, Tree) {\n\n /**\n * Competency picker class.\n * @param {Number} pageContextId The page context ID.\n * @param {Number|false} singleFramework The ID of the framework when limited to one.\n * @param {String} pageContextIncludes One of 'children', 'parents', 'self'.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(pageContextId, singleFramework, pageContextIncludes, multiSelect) {\n var self = this;\n self._eventNode = $('
');\n self._frameworks = [];\n self._reset();\n\n self._pageContextId = pageContextId;\n self._pageContextIncludes = pageContextIncludes || 'children';\n self._multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n if (singleFramework) {\n self._frameworkId = singleFramework;\n self._singleFramework = true;\n }\n };\n\n /** @type {Array} The competencies fetched. */\n Picker.prototype._competencies = null;\n /** @type {Array} The competencies that cannot be picked. */\n Picker.prototype._disallowedCompetencyIDs = null;\n /** @type {Node} The node we attach the events to. */\n Picker.prototype._eventNode = null;\n /** @type {Array} The list of frameworks fetched. */\n Picker.prototype._frameworks = null;\n /** @type {Number} The current framework ID. */\n Picker.prototype._frameworkId = null;\n /** @type {Number} The page context ID. */\n Picker.prototype._pageContextId = null;\n /** @type {Number} Relevant contexts inclusion. */\n Picker.prototype._pageContextIncludes = null;\n /** @type {Dialogue} The reference to the dialogue. */\n Picker.prototype._popup = null;\n /** @type {String} The string we filter the competencies with. */\n Picker.prototype._searchText = '';\n /** @type {Object} The competency that was selected. */\n Picker.prototype._selectedCompetencies = null;\n /** @type {Boolean} Whether we can browse frameworks or not. */\n Picker.prototype._singleFramework = false;\n /** @type {Boolean} Do we allow multi select? */\n Picker.prototype._multiSelect = true;\n /** @type {Boolean} Do we allow to display hidden framework? */\n Picker.prototype._onlyVisible = true;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n\n // Initialise the tree.\n var tree = new Tree(self._find('[data-enhance=linktree]'), self._multiSelect);\n\n // To prevent jiggling we only show the tree after it is enhanced.\n self._find('[data-enhance=linktree]').show();\n\n tree.on('selectionchanged', function(evt, params) {\n var selected = params.selected;\n evt.preventDefault();\n var validIds = [];\n $.each(selected, function(index, item) {\n var compId = $(item).data('id'),\n valid = true;\n\n if (typeof compId === 'undefined') {\n // Do not allow picking nodes with no id.\n valid = false;\n } else {\n $.each(self._disallowedCompetencyIDs, function(i, id) {\n if (id == compId) {\n valid = false;\n }\n });\n }\n if (valid) {\n validIds.push(compId);\n }\n });\n\n self._selectedCompetencies = validIds;\n\n // TODO Implement disabling of nodes in the tree module somehow.\n if (!self._selectedCompetencies.length) {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').attr('disabled', 'disabled');\n } else {\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').removeAttr('disabled');\n }\n });\n\n // Add listener for framework change.\n if (!self._singleFramework) {\n self._find('[data-action=\"chooseframework\"]').change(function(e) {\n self._frameworkId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self)).catch(Notification.exception);\n });\n }\n\n // Add listener for search.\n self._find('[data-region=\"filtercompetencies\"] button').click(function(e) {\n e.preventDefault();\n $(e.target).attr('disabled', 'disabled');\n self._searchText = self._find('[data-region=\"filtercompetencies\"] input').val() || '';\n return self._refresh().always(function() {\n $(e.target).removeAttr('disabled');\n });\n });\n\n // Add listener for cancel.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n self.close();\n });\n\n // Add listener for add.\n self._find('[data-region=\"competencylinktree\"] [data-action=\"add\"]').click(function(e) {\n e.preventDefault();\n if (!self._selectedCompetencies.length) {\n return;\n }\n\n if (self._multiSelect) {\n self._trigger('save', {competencyIds: self._selectedCompetencies});\n } else {\n // We checked above that the array has at least one value.\n self._trigger('save', {competencyId: self._selectedCompetencies[0]});\n }\n\n self.close();\n });\n\n // The list of selected competencies will be modified while looping (because of the listeners above).\n var currentItems = self._selectedCompetencies.slice(0);\n\n $.each(currentItems, function(index, id) {\n var node = self._find('[data-id=' + id + ']');\n if (node.length) {\n tree.toggleItem(node);\n tree.updateFocus(node);\n }\n });\n\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Picker.prototype.close = function() {\n var self = this;\n self._popup.close();\n self._reset();\n };\n\n /**\n * Opens the picker.\n *\n * @method display\n * @return {Promise}\n */\n Picker.prototype.display = function() {\n var self = this;\n return $.when(Str.get_string('competencypicker', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} frameworkId The frameworkId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise}\n */\n Picker.prototype._fetchCompetencies = function(frameworkId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_search_competencies', args: {\n searchtext: searchText,\n competencyframeworkid: frameworkId\n }}\n ])[0].done(function(competencies) {\n /**\n * @param {Object} parent\n * @param {Array} competencies\n */\n function addCompetencyChildren(parent, competencies) {\n for (var i = 0; i < competencies.length; i++) {\n if (competencies[i].parentid == parent.id) {\n parent.haschildren = true;\n competencies[i].children = [];\n competencies[i].haschildren = false;\n parent.children[parent.children.length] = competencies[i];\n addCompetencyChildren(competencies[i], competencies);\n }\n }\n }\n\n // Expand the list of competencies into a tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i];\n if (comp.parentid == \"0\") { // Loose check for now, because WS returns a string.\n comp.children = [];\n comp.haschildren = 0;\n tree[tree.length] = comp;\n addCompetencyChildren(comp, competencies);\n }\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n */\n Picker.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Convenience method to get a framework object.\n *\n * @param {Number} fid The framework ID.\n * @return {Object}\n * @method _getFramework\n */\n Picker.prototype._getFramework = function(fid) {\n var frm;\n $.each(this._frameworks, function(i, f) {\n if (f.id == fid) {\n frm = f;\n return;\n }\n });\n return frm;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._frameworkId, this._searchText);\n };\n\n /**\n * Load the frameworks.\n *\n * @method _loadFrameworks\n * @return {Promise}\n */\n Picker.prototype._loadFrameworks = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._frameworks.length > 0) {\n return $.when();\n }\n\n if (self._singleFramework) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_competency_framework', args: {\n id: this._frameworkId\n }}\n ])[0].then(function(framework) {\n return [framework];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_competency_frameworks', args: {\n sort: 'shortname',\n context: {contextid: self._pageContextId},\n includes: self._pageContextIncludes,\n onlyvisible: self._onlyVisible\n }}\n ])[0];\n }\n\n return promise.done(function(frameworks) {\n self._frameworks = frameworks;\n }).fail(Notification.exception);\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Picker.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadFrameworks().then(function() {\n if (!self._frameworkId && self._frameworks.length > 0) {\n self._frameworkId = self._frameworks[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._frameworkId) {\n self._frameworks = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Refresh the view.\n *\n * @method _refresh\n * @return {Promise}\n */\n Picker.prototype._refresh = function() {\n var self = this;\n return self._render().then(function(html) {\n self._find('[data-region=\"competencylinktree\"]').replaceWith(html);\n self._afterRender();\n return;\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singleFramework) {\n $.each(self._frameworks, function(i, framework) {\n if (framework.id == self._frameworkId) {\n framework.selected = true;\n } else {\n framework.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker', context);\n });\n };\n\n /**\n * Reset the dialogue properties.\n *\n * This does not reset everything, just enough to reset the UI.\n *\n * @method _reset\n */\n Picker.prototype._reset = function() {\n this._competencies = [];\n this._disallowedCompetencyIDs = [];\n this._popup = null;\n this._searchText = '';\n this._selectedCompetencies = [];\n };\n\n /**\n * Set what competencies cannot be picked.\n *\n * This needs to be set after reset/close.\n *\n * @param {Number[]} ids The IDs.\n * @method _setDisallowedCompetencyIDs\n */\n Picker.prototype.setDisallowedCompetencyIDs = function(ids) {\n this._disallowedCompetencyIDs = ids;\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _reset\n */\n Picker.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/competencypicker */ Picker;\n\n});\n"],"file":"competencypicker.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencypicker_user_plans.min.js b/admin/tool/lp/amd/build/competencypicker_user_plans.min.js index fd3bf2d476010..460dd5cb7ad1c 100644 --- a/admin/tool/lp/amd/build/competencypicker_user_plans.min.js +++ b/admin/tool/lp/amd/build/competencypicker_user_plans.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/tree","tool_lp/competencypicker"],function(a,b,c,d,e,f,g){var h=function(a,b,c){g.prototype.constructor.apply(this,[1,!1,"self",c]),this._userId=a,this._plans=[],b&&(this._planId=b,this._singlePlan=!0)};return h.prototype=Object.create(g.prototype),h.prototype._plans=null,h.prototype._planId=null,h.prototype._singlePlan=!1,h.prototype._userId=null,h.prototype._afterRender=function(){var c=this;g.prototype._afterRender.apply(c,arguments),c._singlePlan||c._find('[data-action="chooseplan"]').change(function(d){c._planId=a(d.target).val(),c._loadCompetencies().then(c._refresh.bind(c))["catch"](b.exception)})},h.prototype._fetchCompetencies=function(a,d){var e=this;return c.call([{methodname:"core_competency_list_plan_competencies",args:{id:a}}])[0].done(function(a){var b,c,f=[];for(b=0;b0?a.when():(d=e._singlePlan?c.call([{methodname:"core_competency_read_plan",args:{id:this._planId}}])[0].then(function(a){return[a]}):c.call([{methodname:"core_competency_list_user_plans",args:{userid:e._userId}}])[0],d.done(function(a){e._plans=a}).fail(b.exception))},h.prototype._preRender=function(){var b=this;return b._loadPlans().then(function(){return!b._planId&&b._plans.length>0&&(b._planId=b._plans[0].id),b._planId?b._loadCompetencies():(b._plans=[],a.when())})},h.prototype._render=function(){var b=this;return b._preRender().then(function(){b._singlePlan||a.each(b._plans,function(a,c){c.id==b._planId?c.selected=!0:c.selected=!1});var c={competencies:b._competencies,plan:b._getPlan(b._planId),plans:b._plans,search:b._searchText,singlePlan:b._singlePlan};return d.render("tool_lp/competency_picker_user_plans",c)})},h}); \ No newline at end of file +define ("tool_lp/competencypicker_user_plans",["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/tree","tool_lp/competencypicker"],function(a,b,c,d,e,f,g){var h=function(a,b,c){g.prototype.constructor.apply(this,[1,!1,"self",c]);this._userId=a;this._plans=[];if(b){this._planId=b;this._singlePlan=!0}};h.prototype=Object.create(g.prototype);h.prototype._plans=null;h.prototype._planId=null;h.prototype._singlePlan=!1;h.prototype._userId=null;h.prototype._afterRender=function(){var c=this;g.prototype._afterRender.apply(c,arguments);if(!c._singlePlan){c._find("[data-action=\"chooseplan\"]").change(function(d){c._planId=a(d.target).val();c._loadCompetencies().then(c._refresh.bind(c)).catch(b.exception)})}};h.prototype._fetchCompetencies=function(a,d){var e=this;return c.call([{methodname:"core_competency_list_plan_competencies",args:{id:a}}])[0].done(function(a){var b,c,f=[];for(b=0;bc.shortname.toLowerCase().indexOf(d.toLowerCase())){continue}c.children=[];c.haschildren=0;f.push(c)}e._competencies=f}).fail(b.exception)};h.prototype._getPlan=function(b){var c;a.each(this._plans,function(a,d){if(d.id==b){c=d}});return c};h.prototype._loadCompetencies=function(){return this._fetchCompetencies(this._planId,this._searchText)};h.prototype._loadPlans=function(){var d,e=this;if(0.\n\n/**\n * Competency picker from user plans.\n *\n * To handle 'save' events use: picker.on('save').\n *\n * This will receive a object with either a single 'competencyId', or an array in 'competencyIds'\n * depending on the value of multiSelect.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/templates',\n 'core/str',\n 'tool_lp/tree',\n 'tool_lp/competencypicker'\n ],\n function($, Notification, Ajax, Templates, Str, Tree, PickerBase) {\n\n /**\n * Competency picker in plan class.\n *\n * @param {Number} userId\n * @param {Number|false} singlePlan The ID of the plan when limited to one.\n * @param {Boolean} multiSelect Support multi-select in the tree.\n */\n var Picker = function(userId, singlePlan, multiSelect) {\n PickerBase.prototype.constructor.apply(this, [1, false, 'self', multiSelect]);\n this._userId = userId;\n this._plans = [];\n\n if (singlePlan) {\n this._planId = singlePlan;\n this._singlePlan = true;\n }\n };\n Picker.prototype = Object.create(PickerBase.prototype);\n\n /** @type {Array} The list of plans fetched. */\n Picker.prototype._plans = null;\n /** @type {Number} The current plan ID. */\n Picker.prototype._planId = null;\n /** @type {Boolean} Whether we can browse plans or not. */\n Picker.prototype._singlePlan = false;\n /** @type {Number} The user the plans belongs to. */\n Picker.prototype._userId = null;\n\n /**\n * Hook to executed after the view is rendered.\n *\n * @method _afterRender\n */\n Picker.prototype._afterRender = function() {\n var self = this;\n PickerBase.prototype._afterRender.apply(self, arguments);\n\n // Add listener for framework change.\n if (!self._singlePlan) {\n self._find('[data-action=\"chooseplan\"]').change(function(e) {\n self._planId = $(e.target).val();\n self._loadCompetencies().then(self._refresh.bind(self))\n .catch(Notification.exception);\n });\n }\n };\n\n /**\n * Fetch the competencies.\n *\n * @param {Number} planId The planId.\n * @param {String} searchText Limit the competencies to those matching the text.\n * @method _fetchCompetencies\n * @return {Promise} The promise object.\n */\n Picker.prototype._fetchCompetencies = function(planId, searchText) {\n var self = this;\n\n return Ajax.call([\n {methodname: 'core_competency_list_plan_competencies', args: {\n id: planId\n }}\n ])[0].done(function(competencies) {\n\n // Expand the list of competencies into a fake tree.\n var i, comp;\n var tree = [];\n for (i = 0; i < competencies.length; i++) {\n comp = competencies[i].competency;\n if (comp.shortname.toLowerCase().indexOf(searchText.toLowerCase()) < 0) {\n continue;\n }\n comp.children = [];\n comp.haschildren = 0;\n tree.push(comp);\n }\n\n self._competencies = tree;\n\n }).fail(Notification.exception);\n };\n\n /**\n * Convenience method to get a plan object.\n *\n * @param {Number} id The plan ID.\n * @return {Object|undefined} The plan.\n * @method _getPlan\n */\n Picker.prototype._getPlan = function(id) {\n var plan;\n $.each(this._plans, function(i, f) {\n if (f.id == id) {\n plan = f;\n return;\n }\n });\n return plan;\n };\n\n /**\n * Load the competencies.\n *\n * @method _loadCompetencies\n * @return {Promise}\n */\n Picker.prototype._loadCompetencies = function() {\n return this._fetchCompetencies(this._planId, this._searchText);\n };\n\n /**\n * Load the plans.\n *\n * @method _loadPlans\n * @return {Promise}\n */\n Picker.prototype._loadPlans = function() {\n var promise,\n self = this;\n\n // Quit early because we already have the data.\n if (self._plans.length > 0) {\n return $.when();\n }\n\n if (self._singlePlan) {\n promise = Ajax.call([\n {methodname: 'core_competency_read_plan', args: {\n id: this._planId\n }}\n ])[0].then(function(plan) {\n return [plan];\n });\n } else {\n promise = Ajax.call([\n {methodname: 'core_competency_list_user_plans', args: {\n userid: self._userId\n }}\n ])[0];\n }\n\n return promise.done(function(plans) {\n self._plans = plans;\n }).fail(Notification.exception);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @return {Promise}\n */\n Picker.prototype._preRender = function() {\n var self = this;\n return self._loadPlans().then(function() {\n if (!self._planId && self._plans.length > 0) {\n self._planId = self._plans[0].id;\n }\n\n // We could not set a framework ID, that probably means there are no frameworks accessible.\n if (!self._planId) {\n self._plans = [];\n return $.when();\n }\n\n return self._loadCompetencies();\n });\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @return {Promise}\n */\n Picker.prototype._render = function() {\n var self = this;\n return self._preRender().then(function() {\n\n if (!self._singlePlan) {\n $.each(self._plans, function(i, plan) {\n if (plan.id == self._planId) {\n plan.selected = true;\n } else {\n plan.selected = false;\n }\n });\n }\n\n var context = {\n competencies: self._competencies,\n plan: self._getPlan(self._planId),\n plans: self._plans,\n search: self._searchText,\n singlePlan: self._singlePlan,\n };\n\n return Templates.render('tool_lp/competency_picker_user_plans', context);\n });\n };\n\n return /** @alias module:tool_lp/competencypicker_user_plans */ Picker;\n\n});\n"],"file":"competencypicker_user_plans.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencyruleconfig.min.js b/admin/tool/lp/amd/build/competencyruleconfig.min.js index db877a5e0c0d7..d52ffcb4aeccd 100644 --- a/admin/tool/lp/amd/build/competencyruleconfig.min.js +++ b/admin/tool/lp/amd/build/competencyruleconfig.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/competency_outcomes","core/str"],function(a,b,c,d,e,f){var g=function(b,c){this._eventNode=a("
"),this._tree=b,this._rulesModules=c,this._setUp()};return g.prototype._competency=null,g.prototype._eventNode=null,g.prototype._outcomesOption=null,g.prototype._popup=null,g.prototype._ready=null,g.prototype._rules=null,g.prototype._rulesModules=null,g.prototype._tree=null,g.prototype._afterChange=function(){this._isValid()?this._find('[data-action="save"]').prop("disabled",!1):this._find('[data-action="save"]').prop("disabled",!0)},g.prototype._afterRuleConfigChange=function(a,b){b==this._getRule()&&this._afterChange()},g.prototype._afterRender=function(){var a=this;a._find('[name="outcome"]').on("change",function(){a._switchedOutcome()}).trigger("change"),a._find('[name="rule"]').on("change",function(){a._switchedRule()}).trigger("change"),a._find('[data-action="save"]').on("click",function(){a._trigger("save",a._getConfig()),a.close()}),a._find('[data-action="cancel"]').on("click",function(){a.close()})},g.prototype.canBeConfigured=function(){var b=!1;return a.each(this._rules,function(a,c){if(c.canConfig())return void(b=!0)}),b},g.prototype.close=function(){this._popup.close(),this._popup=null},g.prototype.display=function(){var c=this;return!!c._competency&&a.when(f.get_string("competencyrule","tool_lp"),c._render()).then(function(a,b){c._popup=new d(a,b[0],c._afterRender.bind(c))}).fail(b.exception)},g.prototype._find=function(b){return a(this._popup.getContent()).find(b)},g.prototype._getApplicableOutcomesOptions=function(){var b=this,c=[];return a.each(b._outcomesOption,function(a,d){c.push({code:d.code,name:d.name,selected:d.code==b._competency.ruleoutcome})}),c},g.prototype._getApplicableRulesOptions=function(){var b=this,c=[];return a.each(b._rules,function(a,d){d.canConfig()&&c.push({name:b._getRuleName(d.getType()),type:d.getType(),selected:d.getType()==b._competency.ruletype})}),c},g.prototype._getConfig=function(){var a=this._getRule();return{ruletype:a?a.getType():null,ruleconfig:a?a.getConfig():null,ruleoutcome:this._getOutcome()}},g.prototype._getOutcome=function(){return this._find('[name="outcome"]').val()},g.prototype._getRule=function(){var b,c=this._find('[name="rule"]').val();return a.each(this._rules,function(a,d){if(d.getType()==c)return void(b=d)}),b},g.prototype._getRuleName=function(b){var c,d=this;return a.each(d._rulesModules,function(a,d){if(d.type==b)return void(c=d.name)}),c},g.prototype._initOutcomes=function(){var a=this;return e.getAll().then(function(b){a._outcomesOption=b})},g.prototype._initRules=function(){var b=this,c=[];return a.each(b._rules,function(d,e){var f=e.init().then(function(){e.setTargetCompetency(b._competency),e.on("change",b._afterRuleConfigChange.bind(b))},function(){return b._rules.splice(d,1),a.when()});c.push(f)}),a.when.apply(a.when,c)},g.prototype._isValid=function(){var a=this._getOutcome(),b=this._getRule();return a==e.NONE||!!b&&b.isValid()},g.prototype.on=function(a,b){this._eventNode.on(a,b)},g.prototype._preRender=function(){return this.ready()},g.prototype.ready=function(){return this._ready.promise()},g.prototype._render=function(){var a=this;return this._preRender().then(function(){var b;a.canBeConfigured()?(b={},b.outcomes=a._getApplicableOutcomesOptions(),b.rules=a._getApplicableRulesOptions()):b=!1;var d={competencyshortname:a._competency.shortname,config:b};return c.render("tool_lp/competency_rule_config",d)})},g.prototype.setTargetCompetencyId=function(b){var c=this;c._competency=c._tree.getCompetency(b),a.each(c._rules,function(a,b){b.setTargetCompetency(c._competency)})},g.prototype._setUp=function(){var b=this,c=[],d=[];b._ready=a.Deferred(),b._rules=[],a.each(b._rulesModules,function(a,b){d.push(b.amd)}),require(d,function(){a.each(arguments,function(a,c){var d=new c(b._tree);b._rules.push(d)}),c.push(b._initRules()),c.push(b._initOutcomes()),a.when.apply(a.when,c).always(function(){b._ready.resolve()})})},g.prototype._switchedOutcome=function(){var a=this,b=a._getOutcome();return b==e.NONE?(a._find('[data-region="rule-type"]').hide().find('[name="rule"]').val(-1),a._find('[data-region="rule-config"]').empty().hide(),void a._afterChange()):(a._find('[data-region="rule-type"]').show(),a._find('[data-region="rule-config"]').show(),void a._afterChange())},g.prototype._switchedRule=function(){var a=this,b=a._find('[data-region="rule-config"]'),c=a._getRule();return c?void c.injectTemplate(b).then(function(){b.show()}).always(function(){a._afterChange()})["catch"](function(){b.empty().hide()}):(b.empty().hide(),void a._afterChange())},g.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])},g}); \ No newline at end of file +define ("tool_lp/competencyruleconfig",["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/competency_outcomes","core/str"],function(a,b,c,d,e,f){var g=function(b,c){this._eventNode=a("
");this._tree=b;this._rulesModules=c;this._setUp()};g.prototype._competency=null;g.prototype._eventNode=null;g.prototype._outcomesOption=null;g.prototype._popup=null;g.prototype._ready=null;g.prototype._rules=null;g.prototype._rulesModules=null;g.prototype._tree=null;g.prototype._afterChange=function(){if(!this._isValid()){this._find("[data-action=\"save\"]").prop("disabled",!0)}else{this._find("[data-action=\"save\"]").prop("disabled",!1)}};g.prototype._afterRuleConfigChange=function(a,b){if(b!=this._getRule()){return}this._afterChange()};g.prototype._afterRender=function(){var a=this;a._find("[name=\"outcome\"]").on("change",function(){a._switchedOutcome()}).trigger("change");a._find("[name=\"rule\"]").on("change",function(){a._switchedRule()}).trigger("change");a._find("[data-action=\"save\"]").on("click",function(){a._trigger("save",a._getConfig());a.close()});a._find("[data-action=\"cancel\"]").on("click",function(){a.close()})};g.prototype.canBeConfigured=function(){var b=!1;a.each(this._rules,function(a,c){if(c.canConfig()){b=!0}});return b};g.prototype.close=function(){this._popup.close();this._popup=null};g.prototype.display=function(){var c=this;if(!c._competency){return!1}return a.when(f.get_string("competencyrule","tool_lp"),c._render()).then(function(a,b){c._popup=new d(a,b[0],c._afterRender.bind(c))}).fail(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._getApplicableOutcomesOptions=function(){var b=this,c=[];a.each(b._outcomesOption,function(a,d){c.push({code:d.code,name:d.name,selected:d.code==b._competency.ruleoutcome?!0:!1})});return c};g.prototype._getApplicableRulesOptions=function(){var b=this,c=[];a.each(b._rules,function(a,d){if(!d.canConfig()){return}c.push({name:b._getRuleName(d.getType()),type:d.getType(),selected:d.getType()==b._competency.ruletype?!0:!1})});return c};g.prototype._getConfig=function(){var a=this._getRule();return{ruletype:a?a.getType():null,ruleconfig:a?a.getConfig():null,ruleoutcome:this._getOutcome()}};g.prototype._getOutcome=function(){return this._find("[name=\"outcome\"]").val()};g.prototype._getRule=function(){var b,c=this._find("[name=\"rule\"]").val();a.each(this._rules,function(a,d){if(d.getType()==c){b=d}});return b};g.prototype._getRuleName=function(b){var c=this,d;a.each(c._rulesModules,function(a,c){if(c.type==b){d=c.name}});return d};g.prototype._initOutcomes=function(){var a=this;return e.getAll().then(function(b){a._outcomesOption=b})};g.prototype._initRules=function(){var b=this,c=[];a.each(b._rules,function(d,e){var f=e.init().then(function(){e.setTargetCompetency(b._competency);e.on("change",b._afterRuleConfigChange.bind(b))},function(){b._rules.splice(d,1);return a.when()});c.push(f)});return a.when.apply(a.when,c)};g.prototype._isValid=function(){var a=this._getOutcome(),b=this._getRule();if(a==e.NONE){return!0}else if(!b){return!1}return b.isValid()};g.prototype.on=function(a,b){this._eventNode.on(a,b)};g.prototype._preRender=function(){return this.ready()};g.prototype.ready=function(){return this._ready.promise()};g.prototype._render=function(){var a=this;return this._preRender().then(function(){var b;if(!a.canBeConfigured()){b=!1}else{b={};b.outcomes=a._getApplicableOutcomesOptions();b.rules=a._getApplicableRulesOptions()}var d={competencyshortname:a._competency.shortname,config:b};return c.render("tool_lp/competency_rule_config",d)})};g.prototype.setTargetCompetencyId=function(b){var c=this;c._competency=c._tree.getCompetency(b);a.each(c._rules,function(a,b){b.setTargetCompetency(c._competency)})};g.prototype._setUp=function(){var b=this,c=[],d=[];b._ready=a.Deferred();b._rules=[];a.each(b._rulesModules,function(a,b){d.push(b.amd)});require(d,function(){a.each(arguments,function(a,c){var d=new c(b._tree);b._rules.push(d)});c.push(b._initRules());c.push(b._initOutcomes());a.when.apply(a.when,c).always(function(){b._ready.resolve()})})};g.prototype._switchedOutcome=function(){var a=this,b=a._getOutcome();if(b==e.NONE){a._find("[data-region=\"rule-type\"]").hide().find("[name=\"rule\"]").val(-1);a._find("[data-region=\"rule-config\"]").empty().hide();a._afterChange();return}a._find("[data-region=\"rule-type\"]").show();a._find("[data-region=\"rule-config\"]").show();a._afterChange()};g.prototype._switchedRule=function(){var a=this,b=a._find("[data-region=\"rule-config\"]"),c=a._getRule();if(!c){b.empty().hide();a._afterChange();return}c.injectTemplate(b).then(function(){b.show()}).always(function(){a._afterChange()}).catch(function(){b.empty().hide()})};g.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])};return g}); +//# sourceMappingURL=competencyruleconfig.min.js.map diff --git a/admin/tool/lp/amd/build/competencyruleconfig.min.js.map b/admin/tool/lp/amd/build/competencyruleconfig.min.js.map new file mode 100644 index 0000000000000..713634702860b --- /dev/null +++ b/admin/tool/lp/amd/build/competencyruleconfig.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/competencyruleconfig.js"],"names":["define","$","Notification","Templates","Dialogue","Outcomes","Str","RuleConfig","tree","rulesModules","_eventNode","_tree","_rulesModules","_setUp","prototype","_competency","_outcomesOption","_popup","_ready","_rules","_afterChange","_isValid","_find","prop","_afterRuleConfigChange","e","rule","_getRule","_afterRender","self","on","_switchedOutcome","trigger","_switchedRule","_trigger","_getConfig","close","canBeConfigured","can","each","index","canConfig","display","when","get_string","_render","then","title","render","bind","fail","exception","selector","getContent","find","_getApplicableOutcomesOptions","options","outcome","push","code","name","selected","ruleoutcome","_getApplicableRulesOptions","_getRuleName","getType","type","ruletype","ruleconfig","getConfig","_getOutcome","val","result","modInfo","_initOutcomes","getAll","outcomes","_initRules","promises","promise","init","setTargetCompetency","splice","apply","NONE","isValid","handler","_preRender","ready","config","rules","context","competencyshortname","shortname","setTargetCompetencyId","competencyId","getCompetency","modules","Deferred","amd","require","arguments","Module","always","resolve","hide","empty","show","container","injectTemplate","catch","data"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency rule config.\n *\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/competency_outcomes',\n 'core/str'],\n function($, Notification, Templates, Dialogue, Outcomes, Str) {\n\n /**\n * Competency rule class.\n *\n * When implementing this you should attach a listener to the event 'save'\n * on the instance. E.g.\n *\n * var config = new RuleConfig(tree, modules);\n * config.on('save', function(e, config) { ... });\n *\n * @param {competencytree} tree The competency tree.\n * @param {Array} rulesModules The modules containing the rules: [{ typeName: { amd: amdModule, name: ruleName }}].\n */\n var RuleConfig = function(tree, rulesModules) {\n this._eventNode = $('
');\n this._tree = tree;\n this._rulesModules = rulesModules;\n this._setUp();\n };\n\n /** @type {Object} The current competency. */\n RuleConfig.prototype._competency = null;\n /** @type {Node} The node we attach the events to. */\n RuleConfig.prototype._eventNode = null;\n /** @type {Array} Outcomes options. */\n RuleConfig.prototype._outcomesOption = null;\n /** @type {Dialogue} The dialogue. */\n RuleConfig.prototype._popup = null;\n /** @type {Promise} Resolved when the module is ready. */\n RuleConfig.prototype._ready = null;\n /** @type {Array} The rules. */\n RuleConfig.prototype._rules = null;\n /** @type {Array} The rules modules. */\n RuleConfig.prototype._rulesModules = null;\n /** @type {competencytree} The competency tree. */\n RuleConfig.prototype._tree = null;\n\n /**\n * After change.\n *\n * Triggered when a change occured.\n *\n * @method _afterChange\n * @protected\n */\n RuleConfig.prototype._afterChange = function() {\n if (!this._isValid()) {\n this._find('[data-action=\"save\"]').prop('disabled', true);\n } else {\n this._find('[data-action=\"save\"]').prop('disabled', false);\n }\n };\n\n /**\n * After change in rule's config.\n *\n * Triggered when a change occured in a specific rule config.\n *\n * @method _afterRuleConfigChange\n * @protected\n * @param {Event} e\n * @param {Rule} rule\n */\n RuleConfig.prototype._afterRuleConfigChange = function(e, rule) {\n if (rule != this._getRule()) {\n // This rule is not the current one any more, we can ignore.\n return;\n }\n this._afterChange();\n };\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n RuleConfig.prototype._afterRender = function() {\n var self = this;\n\n self._find('[name=\"outcome\"]').on('change', function() {\n self._switchedOutcome();\n }).trigger('change');\n\n self._find('[name=\"rule\"]').on('change', function() {\n self._switchedRule();\n }).trigger('change');\n\n self._find('[data-action=\"save\"]').on('click', function() {\n self._trigger('save', self._getConfig());\n self.close();\n });\n\n self._find('[data-action=\"cancel\"]').on('click', function() {\n self.close();\n });\n };\n\n /**\n * Whether the current competency can be configured.\n *\n * @return {Boolean}\n * @method canBeConfigured\n */\n RuleConfig.prototype.canBeConfigured = function() {\n var can = false;\n $.each(this._rules, function(index, rule) {\n if (rule.canConfig()) {\n can = true;\n return;\n }\n });\n return can;\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n RuleConfig.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @param {Number} competencyId The competency ID of the competency to work on.\n * @method display\n * @return {Promise}\n */\n RuleConfig.prototype.display = function() {\n var self = this;\n if (!self._competency) {\n return false;\n }\n return $.when(Str.get_string('competencyrule', 'tool_lp'), self._render())\n .then(function(title, render) {\n self._popup = new Dialogue(\n title,\n render[0],\n self._afterRender.bind(self)\n );\n return;\n }).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @return {JQuery}\n * @method _find\n * @protected\n */\n RuleConfig.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Get the applicable outcome options.\n *\n * @return {Array}\n * @method _getApplicableOutcomesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableOutcomesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._outcomesOption, function(index, outcome) {\n options.push({\n code: outcome.code,\n name: outcome.name,\n selected: (outcome.code == self._competency.ruleoutcome) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the applicable rules options.\n *\n * @return {Array}\n * @method _getApplicableRulesOptions\n * @protected\n */\n RuleConfig.prototype._getApplicableRulesOptions = function() {\n var self = this,\n options = [];\n\n $.each(self._rules, function(index, rule) {\n if (!rule.canConfig()) {\n return;\n }\n options.push({\n name: self._getRuleName(rule.getType()),\n type: rule.getType(),\n selected: (rule.getType() == self._competency.ruletype) ? true : false,\n });\n });\n\n return options;\n };\n\n /**\n * Get the full config for the competency.\n *\n * @return {Object} Contains rule, ruleoutcome and ruleconfig.\n * @method _getConfig\n * @protected\n */\n RuleConfig.prototype._getConfig = function() {\n var rule = this._getRule();\n return {\n ruletype: rule ? rule.getType() : null,\n ruleconfig: rule ? rule.getConfig() : null,\n ruleoutcome: this._getOutcome()\n };\n };\n\n /**\n * Get the selected outcome code.\n *\n * @return {String}\n * @method _getOutcome\n * @protected\n */\n RuleConfig.prototype._getOutcome = function() {\n return this._find('[name=\"outcome\"]').val();\n };\n\n /**\n * Get the selected rule.\n *\n * @return {null|Rule}\n * @method _getRule\n * @protected\n */\n RuleConfig.prototype._getRule = function() {\n var result,\n type = this._find('[name=\"rule\"]').val();\n\n $.each(this._rules, function(index, rule) {\n if (rule.getType() == type) {\n result = rule;\n return;\n }\n });\n\n return result;\n };\n\n /**\n * Return the name of a rule.\n *\n * @param {String} type The type of a rule.\n * @return {String}\n * @method _getRuleName\n * @protected\n */\n RuleConfig.prototype._getRuleName = function(type) {\n var self = this,\n name;\n $.each(self._rulesModules, function(index, modInfo) {\n if (modInfo.type == type) {\n name = modInfo.name;\n return;\n }\n });\n return name;\n };\n\n /**\n * Initialise the outcomes.\n *\n * @return {Promise}\n * @method _initOutcomes\n * @protected\n */\n RuleConfig.prototype._initOutcomes = function() {\n var self = this;\n return Outcomes.getAll().then(function(outcomes) {\n self._outcomesOption = outcomes;\n return;\n });\n };\n\n /**\n * Initialise the rules.\n *\n * @return {Promise}\n * @method _initRules\n * @protected\n */\n RuleConfig.prototype._initRules = function() {\n var self = this,\n promises = [];\n $.each(self._rules, function(index, rule) {\n var promise = rule.init().then(function() {\n rule.setTargetCompetency(self._competency);\n rule.on('change', self._afterRuleConfigChange.bind(self));\n return;\n }, function() {\n // Upon failure remove the rule, and resolve the promise.\n self._rules.splice(index, 1);\n return $.when();\n });\n promises.push(promise);\n });\n\n return $.when.apply($.when, promises);\n };\n\n /**\n * Whether or not the current config is valid.\n *\n * @return {Boolean}\n * @method _isValid\n * @protected\n */\n RuleConfig.prototype._isValid = function() {\n var outcome = this._getOutcome(),\n rule = this._getRule();\n\n if (outcome == Outcomes.NONE) {\n return true;\n } else if (!rule) {\n return false;\n }\n\n return rule.isValid();\n };\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n RuleConfig.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Hook to executed before render.\n *\n * @method _preRender\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._preRender = function() {\n // We need to have all the information about the rule plugins first.\n return this.ready();\n };\n\n /**\n * Returns a promise that is resolved when the module is ready.\n *\n * @return {Promise}\n * @method ready\n * @protected\n */\n RuleConfig.prototype.ready = function() {\n return this._ready.promise();\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n RuleConfig.prototype._render = function() {\n var self = this;\n return this._preRender().then(function() {\n var config;\n\n if (!self.canBeConfigured()) {\n config = false;\n } else {\n config = {};\n config.outcomes = self._getApplicableOutcomesOptions();\n config.rules = self._getApplicableRulesOptions();\n }\n\n var context = {\n competencyshortname: self._competency.shortname,\n config: config\n };\n\n return Templates.render('tool_lp/competency_rule_config', context);\n });\n };\n\n /**\n * Set the target competency.\n *\n * @param {Number} competencyId The target competency Id.\n * @method setTargetCompetencyId\n */\n RuleConfig.prototype.setTargetCompetencyId = function(competencyId) {\n var self = this;\n self._competency = self._tree.getCompetency(competencyId);\n $.each(self._rules, function(index, rule) {\n rule.setTargetCompetency(self._competency);\n });\n };\n\n /**\n * Set up the instance.\n *\n * @method _setUp\n * @protected\n */\n RuleConfig.prototype._setUp = function() {\n var self = this,\n promises = [],\n modules = [];\n\n self._ready = $.Deferred();\n self._rules = [];\n\n $.each(self._rulesModules, function(index, rule) {\n modules.push(rule.amd);\n });\n\n // Load all the modules.\n require(modules, function() {\n $.each(arguments, function(index, Module) {\n // Instantiate the rule and listen to it.\n var rule = new Module(self._tree);\n self._rules.push(rule);\n });\n\n // Load all the option values.\n promises.push(self._initRules());\n promises.push(self._initOutcomes());\n\n // Ready when everything is done.\n $.when.apply($.when, promises).always(function() {\n self._ready.resolve();\n });\n });\n };\n\n /**\n * Called when the user switches outcome.\n *\n * @method _switchedOutcome\n * @protected\n */\n RuleConfig.prototype._switchedOutcome = function() {\n var self = this,\n type = self._getOutcome();\n\n if (type == Outcomes.NONE) {\n // Reset to defaults.\n self._find('[data-region=\"rule-type\"]').hide()\n .find('[name=\"rule\"]').val(-1);\n self._find('[data-region=\"rule-config\"]').empty().hide();\n self._afterChange();\n return;\n }\n\n self._find('[data-region=\"rule-type\"]').show();\n self._find('[data-region=\"rule-config\"]').show();\n self._afterChange();\n };\n\n /**\n * Called when the user switches rule.\n *\n * @method _switchedRule\n * @protected\n */\n RuleConfig.prototype._switchedRule = function() {\n var self = this,\n container = self._find('[data-region=\"rule-config\"]'),\n rule = self._getRule();\n\n if (!rule) {\n container.empty().hide();\n self._afterChange();\n return;\n }\n rule.injectTemplate(container).then(function() {\n container.show();\n return;\n }).always(function() {\n self._afterChange();\n }).catch(function() {\n container.empty().hide();\n });\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n * @protected\n */\n RuleConfig.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/competencyruleconfig */ RuleConfig;\n\n});\n"],"file":"competencyruleconfig.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/competencytree.min.js b/admin/tool/lp/amd/build/competencytree.min.js index 3c19f042bb1a6..305c88a3c7fb0 100644 --- a/admin/tool/lp/amd/build/competencytree.min.js +++ b/admin/tool/lp/amd/build/competencytree.min.js @@ -1 +1,2 @@ -define(["core/ajax","core/notification","core/templates","tool_lp/tree","tool_lp/competency_outcomes","jquery"],function(a,b,c,d,e,f){var g={},h=0,i="",j="",k="",l=!1,m=function(a,b){var c=0,d=!1;for(a.haschildren=!1,a.children=[],c=0;c0&&(k=g),this.on("selectionchanged",o)},on:function(a,b){f(j).on(a,b)},getChildren:function(a){var b=[];return f.each(g,function(c,d){d.parentid==a&&b.push(d)}),b},getCompetencyFrameworkId:function(){return h},getCompetency:function(a){return g[a]},getCompetencyLevel:function(a){var b=this.getCompetency(a),c=b.path.replace(/^\/|\/$/g,"").split("/").length;return c},hasChildren:function(a){return this.getChildren(a).length>0},hasRule:function(a){var b=this.getCompetency(a);return!!b&&(b.ruleoutcome!=e.OUTCOME_NONE&&b.ruletype)},reloadCompetencies:function(){return n("").fail(b.exception)},listCompetencies:function(){return g}}}); \ No newline at end of file +define ("tool_lp/competencytree",["core/ajax","core/notification","core/templates","tool_lp/tree","tool_lp/competency_outcomes","jquery"],function(a,b,c,d,e,f){var g={},h=0,j="",k="",l="",m=!1,n=function(a,b){var c=0,d=!1;a.haschildren=!1;a.children=[];for(c=0;c.\n\n/**\n * Handle selection changes on the competency tree.\n *\n * @module tool_lp/competencyselect\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification', 'core/templates', 'tool_lp/tree', 'tool_lp/competency_outcomes', 'jquery'],\n function(ajax, notification, templates, Ariatree, CompOutcomes, $) {\n\n // Private variables and functions.\n /** @var {Object[]} competencies - Cached list of competencies */\n var competencies = {};\n\n /** @var {Number} competencyFrameworkId - The current framework id */\n var competencyFrameworkId = 0;\n\n /** @var {String} competencyFrameworkShortName - The current framework short name */\n var competencyFrameworkShortName = '';\n\n /** @var {String} treeSelector - The selector for the root of the tree. */\n var treeSelector = '';\n\n /** @var {String} currentNodeId - The data-id of the current node in the tree. */\n var currentNodeId = '';\n\n /** @var {Boolean} competencyFramworkCanManage - Can manage the competencies framework */\n var competencyFramworkCanManage = false;\n\n /**\n * Build a tree from the flat list of competencies.\n * @param {Object} parent The parent competency.\n * @param {Array} all The list of all competencies.\n */\n var addChildren = function(parent, all) {\n var i = 0;\n var current = false;\n parent.haschildren = false;\n parent.children = [];\n for (i = 0; i < all.length; i++) {\n current = all[i];\n if (current.parentid == parent.id) {\n parent.haschildren = true;\n parent.children.push(current);\n addChildren(current, all);\n }\n }\n };\n\n /**\n * Load the list of competencies via ajax. Competencies are filtered by the searchtext.\n * @param {String} searchtext The text to filter on.\n * @return {promise}\n */\n var loadCompetencies = function(searchtext) {\n var deferred = $.Deferred();\n\n templates.render('tool_lp/loading', {}).done(function(loadinghtml, loadingjs) {\n templates.replaceNodeContents($(treeSelector), loadinghtml, loadingjs);\n\n var promises = ajax.call([{\n methodname: 'core_competency_search_competencies',\n args: {\n searchtext: searchtext,\n competencyframeworkid: competencyFrameworkId\n }\n }]);\n promises[0].done(function(result) {\n competencies = {};\n var i = 0;\n for (i = 0; i < result.length; i++) {\n competencies[result[i].id] = result[i];\n }\n\n var children = [];\n var competency = false;\n for (i = 0; i < result.length; i++) {\n competency = result[i];\n if (parseInt(competency.parentid, 10) === 0) {\n children.push(competency);\n addChildren(competency, result);\n }\n }\n var context = {\n shortname: competencyFrameworkShortName,\n canmanage: competencyFramworkCanManage,\n competencies: children\n };\n templates.render('tool_lp/competencies_tree_root', context).done(function(html, js) {\n templates.replaceNodeContents($(treeSelector), $(html).html(), js);\n var tree = new Ariatree(treeSelector, false);\n\n if (currentNodeId) {\n var node = $(treeSelector).find('[data-id=' + currentNodeId + ']');\n if (node.length) {\n tree.selectItem(node);\n tree.updateFocus(node);\n }\n }\n deferred.resolve(competencies);\n }).fail(deferred.reject);\n }).fail(deferred.reject);\n });\n\n return deferred.promise();\n };\n\n /**\n * Whenever the current item in the tree is changed - remember the \"id\".\n * @param {Event} evt\n * @param {Object} params The parameters for the event (This is the selected node).\n */\n var rememberCurrent = function(evt, params) {\n var node = params.selected;\n currentNodeId = node.attr('data-id');\n };\n\n return /** @alias module:tool_lp/competencytree */ {\n // Public variables and functions.\n /**\n * Initialise the tree.\n *\n * @param {Number} id The competency framework id.\n * @param {String} shortname The framework shortname\n * @param {String} search The current search string\n * @param {String} selector The selector for the tree div\n * @param {Boolean} canmanage Can manage the competencies\n * @param {Number} competencyid The id of the competency to show first\n */\n init: function(id, shortname, search, selector, canmanage, competencyid) {\n competencyFrameworkId = id;\n competencyFrameworkShortName = shortname;\n competencyFramworkCanManage = canmanage;\n treeSelector = selector;\n loadCompetencies(search).fail(notification.exception);\n if (competencyid > 0) {\n currentNodeId = competencyid;\n }\n\n this.on('selectionchanged', rememberCurrent);\n },\n\n /**\n * Add an event handler for custom events emitted by the tree.\n *\n * @param {String} eventname The name of the event - only \"selectionchanged\" for now\n * @param {Function} handler The handler for the event.\n */\n on: function(eventname, handler) {\n // We can't use the tree on function directly\n // because the tree gets rebuilt whenever the search string changes,\n // instead we attach the listner to the root node of the tree which never\n // gets destroyed (same as \"on()\" code in the tree.js).\n $(treeSelector).on(eventname, handler);\n },\n\n /**\n * Get the children of a competency.\n *\n * @param {Number} id The competency ID.\n * @return {Array}\n * @method getChildren\n */\n getChildren: function(id) {\n var children = [];\n $.each(competencies, function(index, competency) {\n if (competency.parentid == id) {\n children.push(competency);\n }\n });\n return children;\n },\n\n /**\n * Get the competency framework id this model was initiliased with.\n *\n * @return {Number}\n */\n getCompetencyFrameworkId: function() {\n return competencyFrameworkId;\n },\n\n /**\n * Get a competency by id\n *\n * @param {Number} id The competency id\n * @return {Object}\n */\n getCompetency: function(id) {\n return competencies[id];\n },\n\n /**\n * Get the competency level.\n *\n * @param {Number} id The competency ID.\n * @return {Number}\n */\n getCompetencyLevel: function(id) {\n var competency = this.getCompetency(id),\n level = competency.path.replace(/^\\/|\\/$/g, '').split('/').length;\n return level;\n },\n\n /**\n * Whether a competency has children.\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n * @method hasChildren\n */\n hasChildren: function(id) {\n return this.getChildren(id).length > 0;\n },\n\n /**\n * Does the competency have a rule?\n *\n * @param {Number} id The competency ID.\n * @return {Boolean}\n */\n hasRule: function(id) {\n var comp = this.getCompetency(id);\n if (comp) {\n return comp.ruleoutcome != CompOutcomes.OUTCOME_NONE\n && comp.ruletype;\n }\n return false;\n },\n\n /**\n * Reload all the page competencies framework competencies.\n * @method reloadCompetencies\n * @return {Promise}\n */\n reloadCompetencies: function() {\n return loadCompetencies('').fail(notification.exception);\n },\n\n /**\n * Get all competencies for this framework.\n *\n * @return {Object[]}\n */\n listCompetencies: function() {\n return competencies;\n },\n\n };\n });\n"],"file":"competencytree.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/course_competency_settings.min.js b/admin/tool/lp/amd/build/course_competency_settings.min.js index fe53dc6c88156..dce39b1f87ab7 100644 --- a/admin/tool/lp/amd/build/course_competency_settings.min.js +++ b/admin/tool/lp/amd/build/course_competency_settings.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","tool_lp/dialogue","core/str","core/ajax","core/templates"],function(a,b,c,d,e,f){var g=function(b){a(b).on("click",this.configureSettings.bind(this))};return g.prototype._dialogue=null,g.prototype.configureSettings=function(e){var g=a(e.target).closest("a").data("courseid"),h=a(e.target).closest("a").data("pushratingstouserplans"),i={courseid:g,settings:{pushratingstouserplans:h}};e.preventDefault(),f.render("tool_lp/course_competency_settings",i).done(function(a){d.get_string("configurecoursecompetencysettings","tool_lp").done(function(b){this._dialogue=new c(b,a,this.addListeners.bind(this))}.bind(this)).fail(b.exception)}.bind(this)).fail(b.exception)},g.prototype.addListeners=function(){var a=this._find('[data-action="save"]');a.on("click",this.saveSettings.bind(this));var b=this._find('[data-action="cancel"]');b.on("click",this.cancelChanges.bind(this))},g.prototype.cancelChanges=function(a){a.preventDefault(),this._dialogue.close()},g.prototype._find=function(b){return a('[data-region="coursecompetencysettings"]').find(b)},g.prototype.saveSettings=function(a){a.preventDefault();var c=this._find('input[name="pushratingstouserplans"]:checked').val(),d=this._find('input[name="courseid"]').val(),f={pushratingstouserplans:c};e.call([{methodname:"core_competency_update_course_competency_settings",args:{courseid:d,settings:f}}])[0].done(function(){this.refreshCourseCompetenciesPage()}.bind(this)).fail(b.exception)},g.prototype.refreshCourseCompetenciesPage=function(){var c=this._find('input[name="courseid"]').val();e.call([{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:c,moduleid:0}}])[0].done(function(c){f.render("tool_lp/course_competencies_page",c).done(function(b,c){a('[data-region="coursecompetenciespage"]').replaceWith(b),f.runTemplateJS(c),this._dialogue.close()}.bind(this)).fail(b.exception)}.bind(this)).fail(b.exception)},g}); \ No newline at end of file +define ("tool_lp/course_competency_settings",["jquery","core/notification","tool_lp/dialogue","core/str","core/ajax","core/templates"],function(a,b,c,d,f,g){var h=function(b){a(b).on("click",this.configureSettings.bind(this))};h.prototype._dialogue=null;h.prototype.configureSettings=function(f){var e=a(f.target).closest("a").data("courseid"),h=a(f.target).closest("a").data("pushratingstouserplans");f.preventDefault();g.render("tool_lp/course_competency_settings",{courseid:e,settings:{pushratingstouserplans:h}}).done(function(a){d.get_string("configurecoursecompetencysettings","tool_lp").done(function(b){this._dialogue=new c(b,a,this.addListeners.bind(this))}.bind(this)).fail(b.exception)}.bind(this)).fail(b.exception)};h.prototype.addListeners=function(){var a=this._find("[data-action=\"save\"]");a.on("click",this.saveSettings.bind(this));var b=this._find("[data-action=\"cancel\"]");b.on("click",this.cancelChanges.bind(this))};h.prototype.cancelChanges=function(a){a.preventDefault();this._dialogue.close()};h.prototype._find=function(b){return a("[data-region=\"coursecompetencysettings\"]").find(b)};h.prototype.saveSettings=function(a){a.preventDefault();var c=this._find("input[name=\"pushratingstouserplans\"]:checked").val(),d=this._find("input[name=\"courseid\"]").val();f.call([{methodname:"core_competency_update_course_competency_settings",args:{courseid:d,settings:{pushratingstouserplans:c}}}])[0].done(function(){this.refreshCourseCompetenciesPage()}.bind(this)).fail(b.exception)};h.prototype.refreshCourseCompetenciesPage=function(){var c=this._find("input[name=\"courseid\"]").val();f.call([{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:c,moduleid:0}}])[0].done(function(c){g.render("tool_lp/course_competencies_page",c).done(function(b,c){a("[data-region=\"coursecompetenciespage\"]").replaceWith(b);g.runTemplateJS(c);this._dialogue.close()}.bind(this)).fail(b.exception)}.bind(this)).fail(b.exception)};return h}); +//# sourceMappingURL=course_competency_settings.min.js.map diff --git a/admin/tool/lp/amd/build/course_competency_settings.min.js.map b/admin/tool/lp/amd/build/course_competency_settings.min.js.map new file mode 100644 index 0000000000000..329c5579ebc3b --- /dev/null +++ b/admin/tool/lp/amd/build/course_competency_settings.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/course_competency_settings.js"],"names":["define","$","notification","Dialogue","str","ajax","templates","settingsMod","selector","on","configureSettings","bind","prototype","_dialogue","e","courseid","target","closest","data","currentValue","preventDefault","render","settings","pushratingstouserplans","done","html","get_string","title","addListeners","fail","exception","save","_find","saveSettings","cancel","cancelChanges","close","find","newValue","val","courseId","call","methodname","args","refreshCourseCompetenciesPage","moduleid","context","js","replaceWith","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Change the course competency settings in a popup.\n *\n * @module tool_lp/configurecoursecompetencysettings\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/notification',\n 'tool_lp/dialogue',\n 'core/str',\n 'core/ajax',\n 'core/templates'],\n function($, notification, Dialogue, str, ajax, templates) {\n\n /**\n * Constructor\n *\n * @param {String} selector - selector for the links to open the dialogue.\n */\n var settingsMod = function(selector) {\n $(selector).on('click', this.configureSettings.bind(this));\n };\n\n /** @type {Dialogue} Reference to the dialogue that we opened. */\n settingsMod.prototype._dialogue = null;\n\n /**\n * Open the configure settings dialogue.\n *\n * @param {Event} e\n * @method configureSettings\n */\n settingsMod.prototype.configureSettings = function(e) {\n var courseid = $(e.target).closest('a').data('courseid');\n var currentValue = $(e.target).closest('a').data('pushratingstouserplans');\n var context = {\n courseid: courseid,\n settings: {pushratingstouserplans: currentValue}\n };\n e.preventDefault();\n\n templates.render('tool_lp/course_competency_settings', context).done(function(html) {\n str.get_string('configurecoursecompetencysettings', 'tool_lp').done(function(title) {\n this._dialogue = new Dialogue(\n title,\n html,\n this.addListeners.bind(this)\n );\n }.bind(this)).fail(notification.exception);\n }.bind(this)).fail(notification.exception);\n\n };\n\n /**\n * Add the save listener to the form.\n *\n * @method addSaveListener\n */\n settingsMod.prototype.addListeners = function() {\n var save = this._find('[data-action=\"save\"]');\n save.on('click', this.saveSettings.bind(this));\n var cancel = this._find('[data-action=\"cancel\"]');\n cancel.on('click', this.cancelChanges.bind(this));\n };\n\n /**\n * Cancel the changes.\n *\n * @param {Event} e\n * @method cancelChanges\n */\n settingsMod.prototype.cancelChanges = function(e) {\n e.preventDefault();\n this._dialogue.close();\n };\n\n /**\n * Cancel the changes.\n *\n * @param {String} selector\n * @return {JQuery}\n */\n settingsMod.prototype._find = function(selector) {\n return $('[data-region=\"coursecompetencysettings\"]').find(selector);\n };\n\n /**\n * Save the settings.\n *\n * @param {Event} e\n * @method saveSettings\n */\n settingsMod.prototype.saveSettings = function(e) {\n e.preventDefault();\n\n var newValue = this._find('input[name=\"pushratingstouserplans\"]:checked').val();\n var courseId = this._find('input[name=\"courseid\"]').val();\n var settings = {pushratingstouserplans: newValue};\n\n ajax.call([\n {methodname: 'core_competency_update_course_competency_settings',\n args: {courseid: courseId, settings: settings}}\n ])[0].done(function() {\n this.refreshCourseCompetenciesPage();\n }.bind(this)).fail(notification.exception);\n\n };\n\n /**\n * Refresh the course competencies page.\n *\n * @param {Event} e\n * @method saveSettings\n */\n settingsMod.prototype.refreshCourseCompetenciesPage = function() {\n var courseId = this._find('input[name=\"courseid\"]').val();\n\n ajax.call([\n {methodname: 'tool_lp_data_for_course_competencies_page',\n args: {courseid: courseId, moduleid: 0}}\n ])[0].done(function(context) {\n templates.render('tool_lp/course_competencies_page', context).done(function(html, js) {\n $('[data-region=\"coursecompetenciespage\"]').replaceWith(html);\n templates.runTemplateJS(js);\n this._dialogue.close();\n }.bind(this)).fail(notification.exception);\n }.bind(this)).fail(notification.exception);\n\n };\n\n return /** @alias module:tool_lp/configurecoursecompetencysettings */ settingsMod;\n});\n"],"file":"course_competency_settings.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/dialogue.min.js b/admin/tool/lp/amd/build/dialogue.min.js index 7538d6a0aae0a..b2f77e0ccd682 100644 --- a/admin/tool/lp/amd/build/dialogue.min.js +++ b/admin/tool/lp/amd/build/dialogue.min.js @@ -1 +1,2 @@ -define(["core/yui"],function(a){var b=function(b,c,d,e,f){this.yuiDialogue=null;var g=this;"undefined"==typeof f&&(f=!1),a.use("moodle-core-notification","timers",function(){var h="480px";f&&(h="800px"),g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h}),g.yuiDialogue.after("visibleChange",function(b){b.newVal?"undefined"!=typeof d&&a.soon(function(){d(g),g.yuiDialogue.centerDialogue()}):"undefined"!=typeof e&&a.soon(function(){e(g)})}),g.yuiDialogue.show()})};return b.prototype.close=function(){this.yuiDialogue.hide(),this.yuiDialogue.destroy()},b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()},b}); \ No newline at end of file +define ("tool_lp/dialogue",["core/yui"],function(a){var b=function(b,c,d,e,f){this.yuiDialogue=null;var g=this;if("undefined"==typeof f){f=!1}a.use("moodle-core-notification","timers",function(){var h="480px";if(f){h="800px"}g.yuiDialogue=new M.core.dialogue({headerContent:b,bodyContent:c,draggable:!0,visible:!1,center:!0,modal:!0,width:h});g.yuiDialogue.after("visibleChange",function(b){if(b.newVal){if("undefined"!=typeof d){a.soon(function(){d(g);g.yuiDialogue.centerDialogue()})}}else{if("undefined"!=typeof e){a.soon(function(){e(g)})}}});g.yuiDialogue.show()})};b.prototype.close=function(){this.yuiDialogue.hide();this.yuiDialogue.destroy()};b.prototype.getContent=function(){return this.yuiDialogue.bodyNode.getDOMNode()};return b}); +//# sourceMappingURL=dialogue.min.js.map diff --git a/admin/tool/lp/amd/build/dialogue.min.js.map b/admin/tool/lp/amd/build/dialogue.min.js.map new file mode 100644 index 0000000000000..7045a6f19197c --- /dev/null +++ b/admin/tool/lp/amd/build/dialogue.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/dialogue.js"],"names":["define","Y","dialogue","title","content","afterShow","afterHide","wide","yuiDialogue","parent","use","width","M","core","headerContent","bodyContent","draggable","visible","center","modal","after","e","newVal","soon","centerDialogue","show","prototype","close","hide","destroy","getContent","bodyNode","getDOMNode"],"mappings":"AAwBAA,OAAM,oBAAC,CAAC,UAAD,CAAD,CAAe,SAASC,CAAT,CAAY,CAY7B,GAAIC,CAAAA,CAAQ,CAAG,SAASC,CAAT,CAAgBC,CAAhB,CAAyBC,CAAzB,CAAoCC,CAApC,CAA+CC,CAA/C,CAAqD,CAChE,KAAKC,WAAL,CAAmB,IAAnB,CACA,GAAIC,CAAAA,CAAM,CAAG,IAAb,CAGA,GAAmB,WAAf,QAAOF,CAAAA,CAAX,CAAgC,CAC5BA,CAAI,GACP,CAEDN,CAAC,CAACS,GAAF,CAAM,0BAAN,CAAkC,QAAlC,CAA4C,UAAW,CACnD,GAAIC,CAAAA,CAAK,CAAG,OAAZ,CACA,GAAIJ,CAAJ,CAAU,CACNI,CAAK,CAAG,OACX,CAEDF,CAAM,CAACD,WAAP,CAAqB,GAAII,CAAAA,CAAC,CAACC,IAAF,CAAOX,QAAX,CAAoB,CACrCY,aAAa,CAAEX,CADsB,CAErCY,WAAW,CAAEX,CAFwB,CAGrCY,SAAS,GAH4B,CAIrCC,OAAO,GAJ8B,CAKrCC,MAAM,GAL+B,CAMrCC,KAAK,GANgC,CAOrCR,KAAK,CAAEA,CAP8B,CAApB,CAArB,CAUAF,CAAM,CAACD,WAAP,CAAmBY,KAAnB,CAAyB,eAAzB,CAA0C,SAASC,CAAT,CAAY,CAClD,GAAIA,CAAC,CAACC,MAAN,CAAc,CAGV,GAA0B,WAArB,QAAOjB,CAAAA,CAAZ,CAAwC,CACpCJ,CAAC,CAACsB,IAAF,CAAO,UAAW,CACdlB,CAAS,CAACI,CAAD,CAAT,CACAA,CAAM,CAACD,WAAP,CAAmBgB,cAAnB,EACH,CAHD,CAIH,CACJ,CATD,IASO,CACH,GAA0B,WAArB,QAAOlB,CAAAA,CAAZ,CAAwC,CACpCL,CAAC,CAACsB,IAAF,CAAO,UAAW,CACdjB,CAAS,CAACG,CAAD,CACZ,CAFD,CAGH,CACJ,CACJ,CAjBD,EAmBAA,CAAM,CAACD,WAAP,CAAmBiB,IAAnB,EACH,CApCD,CAqCH,CA9CD,CAmDAvB,CAAQ,CAACwB,SAAT,CAAmBC,KAAnB,CAA2B,UAAW,CAClC,KAAKnB,WAAL,CAAiBoB,IAAjB,GACA,KAAKpB,WAAL,CAAiBqB,OAAjB,EACH,CAHD,CASA3B,CAAQ,CAACwB,SAAT,CAAmBI,UAAnB,CAAgC,UAAW,CACvC,MAAO,MAAKtB,WAAL,CAAiBuB,QAAjB,CAA0BC,UAA1B,EACV,CAFD,CAIA,MAA6C9B,CAAAA,CAChD,CA7EK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Wrapper for the YUI M.core.notification class. Allows us to\n * use the YUI version in AMD code until it is replaced.\n *\n * @module tool_lp/dialogue\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/yui'], function(Y) {\n\n // Private variables and functions.\n /**\n * Constructor\n *\n * @param {String} title Title for the window.\n * @param {String} content The content for the window.\n * @param {function} afterShow Callback executed after the window is opened.\n * @param {function} afterHide Callback executed after the window is closed.\n * @param {Boolean} wide Specify we want an extra wide dialogue (the size is standard, but wider than the default).\n */\n var dialogue = function(title, content, afterShow, afterHide, wide) {\n this.yuiDialogue = null;\n var parent = this;\n\n // Default for wide is false.\n if (typeof wide == 'undefined') {\n wide = false;\n }\n\n Y.use('moodle-core-notification', 'timers', function() {\n var width = '480px';\n if (wide) {\n width = '800px';\n }\n\n parent.yuiDialogue = new M.core.dialogue({\n headerContent: title,\n bodyContent: content,\n draggable: true,\n visible: false,\n center: true,\n modal: true,\n width: width\n });\n\n parent.yuiDialogue.after('visibleChange', function(e) {\n if (e.newVal) {\n // Delay the callback call to the next tick, otherwise it can happen that it is\n // executed before the dialogue constructor returns.\n if ((typeof afterShow !== 'undefined')) {\n Y.soon(function() {\n afterShow(parent);\n parent.yuiDialogue.centerDialogue();\n });\n }\n } else {\n if ((typeof afterHide !== 'undefined')) {\n Y.soon(function() {\n afterHide(parent);\n });\n }\n }\n });\n\n parent.yuiDialogue.show();\n });\n };\n\n /**\n * Close this window.\n */\n dialogue.prototype.close = function() {\n this.yuiDialogue.hide();\n this.yuiDialogue.destroy();\n };\n\n /**\n * Get content.\n * @return {node}\n */\n dialogue.prototype.getContent = function() {\n return this.yuiDialogue.bodyNode.getDOMNode();\n };\n\n return /** @alias module:tool_lp/dialogue */ dialogue;\n});\n"],"file":"dialogue.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/dragdrop-reorder.min.js b/admin/tool/lp/amd/build/dragdrop-reorder.min.js index 48751b5a9f32f..d83b1c621076e 100644 --- a/admin/tool/lp/amd/build/dragdrop-reorder.min.js +++ b/admin/tool/lp/amd/build/dragdrop-reorder.min.js @@ -1 +1,2 @@ -define(["core/str","core/yui"],function(a,b){var c=null,d=function(a){var b=a.drag.get("node"),c=a.drop.get("node");this.callback(b.getDOMNode(),c.getDOMNode())};return{dragdrop:function(e,f,g,h,i,j,k,l){a.get_strings([{key:"emptydragdropregion",component:"moodle"},{key:"movecontent",component:"moodle"},{key:"tocontent",component:"moodle"}]).done(function(){b.use("moodle-tool_lp-dragdrop-reorder",function(){var a={callback:l};c&&c.destroy(),c=M.tool_lp.dragdrop_reorder({group:e,dragHandleText:f,sameNodeText:g,parentNodeText:h,sameNodeClass:i,parentNodeClass:j,dragHandleInsertClass:k,callback:b.bind(d,a)})})})}}}); \ No newline at end of file +define ("tool_lp/dragdrop-reorder",["core/str","core/yui"],function(a,b){var c=null,d=function(a){var b=a.drag.get("node"),c=a.drop.get("node");this.callback(b.getDOMNode(),c.getDOMNode())};return{dragdrop:function dragdrop(e,f,g,h,i,j,k,l){a.get_strings([{key:"emptydragdropregion",component:"moodle"},{key:"movecontent",component:"moodle"},{key:"tocontent",component:"moodle"}]).done(function(){b.use("moodle-tool_lp-dragdrop-reorder",function(){if(c){c.destroy()}c=M.tool_lp.dragdrop_reorder({group:e,dragHandleText:f,sameNodeText:g,parentNodeText:h,sameNodeClass:i,parentNodeClass:j,dragHandleInsertClass:k,callback:b.bind(d,{callback:l})})})})}}}); +//# sourceMappingURL=dragdrop-reorder.min.js.map diff --git a/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map b/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map new file mode 100644 index 0000000000000..dd6b103aa807c --- /dev/null +++ b/admin/tool/lp/amd/build/dragdrop-reorder.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/dragdrop-reorder.js"],"names":["define","str","Y","dragDropInstance","proxyCallback","e","dragNode","drag","get","dropNode","drop","callback","getDOMNode","dragdrop","group","dragHandleText","sameNodeText","parentNodeText","sameNodeClass","parentNodeClass","dragHandleInsertClass","get_strings","key","component","done","use","destroy","M","tool_lp","dragdrop_reorder","bind"],"mappings":"AAuBAA,OAAM,4BAAC,CAAC,UAAD,CAAa,UAAb,CAAD,CAA2B,SAASC,CAAT,CAAcC,CAAd,CAAiB,IAQ1CC,CAAAA,CAAgB,CAAG,IARuB,CAe1CC,CAAa,CAAG,SAASC,CAAT,CAAY,IACxBC,CAAAA,CAAQ,CAAGD,CAAC,CAACE,IAAF,CAAOC,GAAP,CAAW,MAAX,CADa,CAExBC,CAAQ,CAAGJ,CAAC,CAACK,IAAF,CAAOF,GAAP,CAAW,MAAX,CAFa,CAG5B,KAAKG,QAAL,CAAcL,CAAQ,CAACM,UAAT,EAAd,CAAqCH,CAAQ,CAACG,UAAT,EAArC,CACH,CAnB6C,CAqB9C,MAAqD,CAcjDC,QAAQ,CAAE,kBAASC,CAAT,CACSC,CADT,CAESC,CAFT,CAGSC,CAHT,CAISC,CAJT,CAKSC,CALT,CAMSC,CANT,CAOST,CAPT,CAOmB,CAGzBV,CAAG,CAACoB,WAAJ,CAAgB,CACZ,CAACC,GAAG,CAAE,qBAAN,CAA6BC,SAAS,CAAE,QAAxC,CADY,CAEZ,CAACD,GAAG,CAAE,aAAN,CAAqBC,SAAS,CAAE,QAAhC,CAFY,CAGZ,CAACD,GAAG,CAAE,WAAN,CAAmBC,SAAS,CAAE,QAA9B,CAHY,CAAhB,EAIGC,IAJH,CAIQ,UAAW,CACftB,CAAC,CAACuB,GAAF,CAAM,iCAAN,CAAyC,UAAW,CAKhD,GAAItB,CAAJ,CAAsB,CAClBA,CAAgB,CAACuB,OAAjB,EACH,CACDvB,CAAgB,CAAGwB,CAAC,CAACC,OAAF,CAAUC,gBAAV,CAA2B,CAC1Cf,KAAK,CAAEA,CADmC,CAE1CC,cAAc,CAAEA,CAF0B,CAG1CC,YAAY,CAAEA,CAH4B,CAI1CC,cAAc,CAAEA,CAJ0B,CAK1CC,aAAa,CAAEA,CAL2B,CAM1CC,eAAe,CAAEA,CANyB,CAO1CC,qBAAqB,CAAEA,CAPmB,CAQ1CT,QAAQ,CAAET,CAAC,CAAC4B,IAAF,CAAO1B,CAAP,CAdA,CACVO,QAAQ,CAAEA,CADA,CAcA,CARgC,CAA3B,CAUtB,CAlBD,CAmBH,CAxBD,CAyBH,CAjDgD,CAoDxD,CAzEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Drag and drop reorder via HTML5.\n *\n * @module tool_lp/dragdrop-reorder\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/str', 'core/yui'], function(str, Y) {\n // Private variables and functions.\n\n /**\n * Store the current instance of the core drag drop.\n *\n * @property dragDropInstance M.tool_lp.dragdrop_reorder\n */\n var dragDropInstance = null;\n\n /**\n * Translate the drophit event from YUI\n * into simple drag and drop nodes.\n * @param {Y.Event} e The yui drop event.\n */\n var proxyCallback = function(e) {\n var dragNode = e.drag.get('node');\n var dropNode = e.drop.get('node');\n this.callback(dragNode.getDOMNode(), dropNode.getDOMNode());\n };\n\n return /** @alias module:tool_lp/dragdrop-reorder */ {\n // Public variables and functions.\n /**\n * Create an instance of M.tool_lp.dragdrop\n *\n * @param {String} group Unique string to identify this interaction.\n * @param {String} dragHandleText Alt text for the drag handle.\n * @param {String} sameNodeText Used in keyboard drag drop for the list of items target.\n * @param {String} parentNodeText Used in keyboard drag drop for the parent target.\n * @param {String} sameNodeClass class used to find the each of the list of items.\n * @param {String} parentNodeClass class used to find the container for the list of items.\n * @param {String} dragHandleInsertClass class used to find the location to insert the drag handles.\n * @param {function} callback Drop hit handler.\n */\n dragdrop: function(group,\n dragHandleText,\n sameNodeText,\n parentNodeText,\n sameNodeClass,\n parentNodeClass,\n dragHandleInsertClass,\n callback) {\n // Here we are wrapping YUI. This allows us to start transitioning, but\n // wait for a good alternative without having inconsistent UIs.\n str.get_strings([\n {key: 'emptydragdropregion', component: 'moodle'},\n {key: 'movecontent', component: 'moodle'},\n {key: 'tocontent', component: 'moodle'},\n ]).done(function() {\n Y.use('moodle-tool_lp-dragdrop-reorder', function() {\n\n var context = {\n callback: callback\n };\n if (dragDropInstance) {\n dragDropInstance.destroy();\n }\n dragDropInstance = M.tool_lp.dragdrop_reorder({\n group: group,\n dragHandleText: dragHandleText,\n sameNodeText: sameNodeText,\n parentNodeText: parentNodeText,\n sameNodeClass: sameNodeClass,\n parentNodeClass: parentNodeClass,\n dragHandleInsertClass: dragHandleInsertClass,\n callback: Y.bind(proxyCallback, context)\n });\n });\n });\n }\n\n };\n});\n"],"file":"dragdrop-reorder.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/event_base.min.js b/admin/tool/lp/amd/build/event_base.min.js index c9e4818dbfb52..bd20aa13ce0f8 100644 --- a/admin/tool/lp/amd/build/event_base.min.js +++ b/admin/tool/lp/amd/build/event_base.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(){this._eventNode=a("
")};return b.prototype._eventNode=null,b.prototype.on=function(a,b){this._eventNode.on(a,b)},b.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])},b}); \ No newline at end of file +define ("tool_lp/event_base",["jquery"],function(a){var b=function(){this._eventNode=a("
")};b.prototype._eventNode=null;b.prototype.on=function(a,b){this._eventNode.on(a,b)};b.prototype._trigger=function(a,b){this._eventNode.trigger(a,[b])};return b}); +//# sourceMappingURL=event_base.min.js.map diff --git a/admin/tool/lp/amd/build/event_base.min.js.map b/admin/tool/lp/amd/build/event_base.min.js.map new file mode 100644 index 0000000000000..2ca46e091a7f5 --- /dev/null +++ b/admin/tool/lp/amd/build/event_base.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/event_base.js"],"names":["define","$","Base","_eventNode","prototype","on","type","handler","_trigger","data","trigger"],"mappings":"AAuBAA,OAAM,sBAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAK3B,GAAIC,CAAAA,CAAI,CAAG,UAAW,CAClB,KAAKC,UAAL,CAAkBF,CAAC,CAAC,aAAD,CACtB,CAFD,CAKAC,CAAI,CAACE,SAAL,CAAeD,UAAf,CAA4B,IAA5B,CASAD,CAAI,CAACE,SAAL,CAAeC,EAAf,CAAoB,SAASC,CAAT,CAAeC,CAAf,CAAwB,CACxC,KAAKJ,UAAL,CAAgBE,EAAhB,CAAmBC,CAAnB,CAAyBC,CAAzB,CACH,CAFD,CAWAL,CAAI,CAACE,SAAL,CAAeI,QAAf,CAA0B,SAASF,CAAT,CAAeG,CAAf,CAAqB,CAC3C,KAAKN,UAAL,CAAgBO,OAAhB,CAAwBJ,CAAxB,CAA8B,CAACG,CAAD,CAA9B,CACH,CAFD,CAIA,MAA+CP,CAAAA,CAClD,CAnCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Event base javascript module.\n *\n * @module tool_lp/event_base\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Base class.\n */\n var Base = function() {\n this._eventNode = $('
');\n };\n\n /** @type {Node} The node we attach the events to. */\n Base.prototype._eventNode = null;\n\n /**\n * Register an event listener.\n *\n * @param {String} type The event type.\n * @param {Function} handler The event listener.\n * @method on\n */\n Base.prototype.on = function(type, handler) {\n this._eventNode.on(type, handler);\n };\n\n /**\n * Trigger an event.\n *\n * @param {String} type The type of event.\n * @param {Object} data The data to pass to the listeners.\n * @method _trigger\n */\n Base.prototype._trigger = function(type, data) {\n this._eventNode.trigger(type, [data]);\n };\n\n return /** @alias module:tool_lp/event_base */ Base;\n});\n"],"file":"event_base.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/evidence_delete.min.js b/admin/tool/lp/amd/build/evidence_delete.min.js index aebb3f1b58e7b..d74b0d9f06b78 100644 --- a/admin/tool/lp/amd/build/evidence_delete.min.js +++ b/admin/tool/lp/amd/build/evidence_delete.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/str","core/log"],function(a,b,c,d,e){var f={},g=function(g,h){"undefined"==typeof f[g]&&(f[g]=a("body").delegate(g,"click",function(f){var g=a(f.currentTarget).parents(h);if(!g.length||g.length>1)return void e.error("None or too many evidence container were found.");var i=g.data("id");return i?(f.preventDefault(),f.stopPropagation(),void d.get_strings([{key:"confirm",component:"moodle"},{key:"areyousure",component:"moodle"},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){b.confirm(a[0],a[1],a[2],a[3],function(){var a=c.call([{methodname:"core_competency_delete_evidence",args:{id:i}}]);a[0].then(function(){g.remove()}).fail(b.exception)})}).fail(b.exception)):void e.error("Evidence ID was not found.")}))};return{register:g}}); \ No newline at end of file +define ("tool_lp/evidence_delete",["jquery","core/notification","core/ajax","core/str","core/log"],function(a,b,c,d,e){var f={};return{register:function register(g,h){if("undefined"!=typeof f[g]){return}f[g]=a("body").delegate(g,"click",function(f){var g=a(f.currentTarget).parents(h);if(!g.length||1.\n\n/**\n * Evidence delete.\n *\n * @package tool_lp\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/str',\n 'core/log'],\n function($, Notification, Ajax, Str, Log) {\n\n var selectors = {};\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n */\n var register = function(triggerSelector, containerSelector) {\n if (typeof selectors[triggerSelector] !== 'undefined') {\n return;\n }\n\n selectors[triggerSelector] = $('body').delegate(triggerSelector, 'click', function(e) {\n var parent = $(e.currentTarget).parents(containerSelector);\n if (!parent.length || parent.length > 1) {\n Log.error('None or too many evidence container were found.');\n return;\n }\n var evidenceId = parent.data('id');\n if (!evidenceId) {\n Log.error('Evidence ID was not found.');\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n Str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'areyousure', component: 'moodle'},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n Notification.confirm(\n strings[0], // Confirm.\n strings[1], // Are you sure?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n var promise = Ajax.call([{\n methodname: 'core_competency_delete_evidence',\n args: {\n id: evidenceId\n }\n }]);\n promise[0].then(function() {\n parent.remove();\n return;\n }).fail(Notification.exception);\n }\n );\n }).fail(Notification.exception);\n\n\n });\n };\n\n return /** @alias module:tool_lp/evidence_delete */ {\n\n /**\n * Register an event listener.\n *\n * @param {String} triggerSelector The node on which the click will happen.\n * @param {String} containerSelector The parent node that will be removed and contains the evidence ID.\n * @return {Void}\n */\n register: register\n };\n\n});\n"],"file":"evidence_delete.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form-cohort-selector.min.js b/admin/tool/lp/amd/build/form-cohort-selector.min.js index fd26ffb72b589..5a7a0144e1970 100644 --- a/admin/tool/lp/amd/build/form-cohort-selector.min.js +++ b/admin/tool/lp/amd/build/form-cohort-selector.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d},transport:function(d,e,f,g){var h,i=parseInt(a(d).data("contextid"),10),j=a(d).data("includes");h=b.call([{methodname:"tool_lp_search_cohorts",args:{query:e,context:{contextid:i},includes:j}}]),h[0].then(function(b){var d=[],e=0;return a.each(b.cohorts,function(a,b){d.push(c.render("tool_lp/form-cohort-selector-suggestion",b))}),a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b.cohorts,function(a,b){b._label=c[e],e++}),f(b.cohorts)})})["catch"](g)}}}); \ No newline at end of file +define ("tool_lp/form-cohort-selector",["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function processResults(b,c){var d=[];a.each(c,function(a,b){d.push({value:b.id,label:b._label})});return d},transport:function transport(d,e,f,g){var h,i=parseInt(a(d).data("contextid"),10),j=a(d).data("includes");h=b.call([{methodname:"tool_lp_search_cohorts",args:{query:e,context:{contextid:i},includes:j}}]);h[0].then(function(b){var d=[],e=0;a.each(b.cohorts,function(a,b){d.push(c.render("tool_lp/form-cohort-selector-suggestion",b))});return a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b.cohorts,function(a,b){b._label=c[e];e++});f(b.cohorts)})}).catch(g)}}}); +//# sourceMappingURL=form-cohort-selector.min.js.map diff --git a/admin/tool/lp/amd/build/form-cohort-selector.min.js.map b/admin/tool/lp/amd/build/form-cohort-selector.min.js.map new file mode 100644 index 0000000000000..a2807432a0ce8 --- /dev/null +++ b/admin/tool/lp/amd/build/form-cohort-selector.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/form-cohort-selector.js"],"names":["define","$","Ajax","Templates","processResults","selector","results","cohorts","each","index","cohort","push","value","id","label","_label","transport","query","success","failure","promise","contextid","parseInt","data","includes","call","methodname","args","context","then","promises","i","render","when","apply","arguments","catch"],"mappings":"AAyBAA,OAAM,gCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAAD,CAA4C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6B,CAE3E,MAAyD,CAErDC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAO,CAAG,EAAd,CACAN,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAwB,CACpCH,CAAO,CAACI,IAAR,CAAa,CACTC,KAAK,CAAEF,CAAM,CAACG,EADL,CAETC,KAAK,CAAEJ,CAAM,CAACK,MAFL,CAAb,CAIH,CALD,EAMA,MAAOR,CAAAA,CACV,CAXoD,CAarDS,SAAS,CAAE,mBAASX,CAAT,CAAmBY,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,CACnD,GAAIC,CAAAA,CAAJ,CACIC,CAAS,CAAGC,QAAQ,CAACrB,CAAC,CAACI,CAAD,CAAD,CAAYkB,IAAZ,CAAiB,WAAjB,CAAD,CAAgC,EAAhC,CADxB,CAEIC,CAAQ,CAAGvB,CAAC,CAACI,CAAD,CAAD,CAAYkB,IAAZ,CAAiB,UAAjB,CAFf,CAIAH,CAAO,CAAGlB,CAAI,CAACuB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,wBADK,CAEjBC,IAAI,CAAE,CACFV,KAAK,CAAEA,CADL,CAEFW,OAAO,CAAE,CAACP,SAAS,CAAEA,CAAZ,CAFP,CAGFG,QAAQ,CAAEA,CAHR,CAFW,CAAD,CAAV,CAAV,CAQAJ,CAAO,CAAC,CAAD,CAAP,CAAWS,IAAX,CAAgB,SAASvB,CAAT,CAAkB,CAC9B,GAAIwB,CAAAA,CAAQ,CAAG,EAAf,CACIC,CAAC,CAAG,CADR,CAIA9B,CAAC,CAACO,IAAF,CAAOF,CAAO,CAACC,OAAf,CAAwB,SAASE,CAAT,CAAgBC,CAAhB,CAAwB,CAC5CoB,CAAQ,CAACnB,IAAT,CAAcR,CAAS,CAAC6B,MAAV,CAAiB,yCAAjB,CAA4DtB,CAA5D,CAAd,CACH,CAFD,EAKA,MAAOT,CAAAA,CAAC,CAACgC,IAAF,CAAOC,KAAP,CAAajC,CAAC,CAACgC,IAAf,CAAqBH,CAArB,EAA+BD,IAA/B,CAAoC,UAAW,CAClD,GAAIF,CAAAA,CAAI,CAAGQ,SAAX,CACAlC,CAAC,CAACO,IAAF,CAAOF,CAAO,CAACC,OAAf,CAAwB,SAASE,CAAT,CAAgBC,CAAhB,CAAwB,CAC5CA,CAAM,CAACK,MAAP,CAAgBY,CAAI,CAACI,CAAD,CAApB,CACAA,CAAC,EACJ,CAHD,EAIAb,CAAO,CAACZ,CAAO,CAACC,OAAT,CAEV,CARM,CAUV,CApBD,EAoBG6B,KApBH,CAoBSjB,CApBT,CAqBH,CA/CoD,CAmD5D,CArDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Cohort selector module.\n *\n * @module tool_lp/form-cohort-selector\n * @class form-cohort-selector\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-cohort-selector */ {\n\n processResults: function(selector, results) {\n var cohorts = [];\n $.each(results, function(index, cohort) {\n cohorts.push({\n value: cohort.id,\n label: cohort._label\n });\n });\n return cohorts;\n },\n\n transport: function(selector, query, success, failure) {\n var promise,\n contextid = parseInt($(selector).data('contextid'), 10),\n includes = $(selector).data('includes');\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_cohorts',\n args: {\n query: query,\n context: {contextid: contextid},\n includes: includes\n }\n }]);\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.cohorts, function(index, cohort) {\n promises.push(Templates.render('tool_lp/form-cohort-selector-suggestion', cohort));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.cohorts, function(index, cohort) {\n cohort._label = args[i];\n i++;\n });\n success(results.cohorts);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"file":"form-cohort-selector.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form-user-selector.min.js b/admin/tool/lp/amd/build/form-user-selector.min.js index febb8d4408f27..0870d75389ce1 100644 --- a/admin/tool/lp/amd/build/form-user-selector.min.js +++ b/admin/tool/lp/amd/build/form-user-selector.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d},transport:function(d,e,f,g){var h,i=a(d).data("capability");"undefined"==typeof i&&(i=""),h=b.call([{methodname:"tool_lp_search_users",args:{query:e,capability:i}}]),h[0].then(function(b){var d=[],e=0;return a.each(b.users,function(b,e){var f=e,g=[];a.each(["idnumber","email","phone1","phone2","department","institution"],function(a,b){"undefined"!=typeof e[b]&&""!==e[b]&&(f.hasidentity=!0,g.push(e[b]))}),f.identity=g.join(", "),d.push(c.render("tool_lp/form-user-selector-suggestion",f))}),a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b.users,function(a,b){b._label=c[e],e++}),f(b.users)})})["catch"](g)}}}); \ No newline at end of file +define ("tool_lp/form-user-selector",["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function processResults(b,c){var d=[];a.each(c,function(a,b){d.push({value:b.id,label:b._label})});return d},transport:function transport(d,e,f,g){var h,i=a(d).data("capability");if("undefined"==typeof i){i=""}h=b.call([{methodname:"tool_lp_search_users",args:{query:e,capability:i}}]);h[0].then(function(b){var d=[],e=0;a.each(b.users,function(b,e){var f=e,g=[];a.each(["idnumber","email","phone1","phone2","department","institution"],function(a,b){if("undefined"!=typeof e[b]&&""!==e[b]){f.hasidentity=!0;g.push(e[b])}});f.identity=g.join(", ");d.push(c.render("tool_lp/form-user-selector-suggestion",f))});return a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b.users,function(a,b){b._label=c[e];e++});f(b.users)})}).catch(g)}}}); +//# sourceMappingURL=form-user-selector.min.js.map diff --git a/admin/tool/lp/amd/build/form-user-selector.min.js.map b/admin/tool/lp/amd/build/form-user-selector.min.js.map new file mode 100644 index 0000000000000..ea192dda709cf --- /dev/null +++ b/admin/tool/lp/amd/build/form-user-selector.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/form-user-selector.js"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","promise","capability","data","call","methodname","args","then","promises","i","ctx","identity","k","hasidentity","join","render","when","apply","arguments","catch"],"mappings":"AAyBAA,OAAM,8BAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAAD,CAA4C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6B,CAE3E,MAAuD,CAEnDC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAK,CAAG,EAAZ,CACAN,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCH,CAAK,CAACI,IAAN,CAAW,CACPC,KAAK,CAAEF,CAAI,CAACG,EADL,CAEPC,KAAK,CAAEJ,CAAI,CAACK,MAFL,CAAX,CAIH,CALD,EAMA,MAAOR,CAAAA,CACV,CAXkD,CAanDS,SAAS,CAAE,mBAASX,CAAT,CAAmBY,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,IAC/CC,CAAAA,CAD+C,CAE/CC,CAAU,CAAGpB,CAAC,CAACI,CAAD,CAAD,CAAYiB,IAAZ,CAAiB,YAAjB,CAFkC,CAGnD,GAA0B,WAAtB,QAAOD,CAAAA,CAAX,CAAuC,CACnCA,CAAU,CAAG,EAChB,CAEDD,CAAO,CAAGlB,CAAI,CAACqB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,sBADK,CAEjBC,IAAI,CAAE,CACFR,KAAK,CAAEA,CADL,CAEFI,UAAU,CAAEA,CAFV,CAFW,CAAD,CAAV,CAAV,CAQAD,CAAO,CAAC,CAAD,CAAP,CAAWM,IAAX,CAAgB,SAASpB,CAAT,CAAkB,CAC9B,GAAIqB,CAAAA,CAAQ,CAAG,EAAf,CACIC,CAAC,CAAG,CADR,CAIA3B,CAAC,CAACO,IAAF,CAAOF,CAAO,CAACC,KAAf,CAAsB,SAASE,CAAT,CAAgBC,CAAhB,CAAsB,CACxC,GAAImB,CAAAA,CAAG,CAAGnB,CAAV,CACIoB,CAAQ,CAAG,EADf,CAEA7B,CAAC,CAACO,IAAF,CAAO,CAAC,UAAD,CAAa,OAAb,CAAsB,QAAtB,CAAgC,QAAhC,CAA0C,YAA1C,CAAwD,aAAxD,CAAP,CAA+E,SAASoB,CAAT,CAAYG,CAAZ,CAAe,CAC1F,GAAuB,WAAnB,QAAOrB,CAAAA,CAAI,CAACqB,CAAD,CAAX,EAA8C,EAAZ,GAAArB,CAAI,CAACqB,CAAD,CAA1C,CAAsD,CAClDF,CAAG,CAACG,WAAJ,IACAF,CAAQ,CAACnB,IAAT,CAAcD,CAAI,CAACqB,CAAD,CAAlB,CACH,CACJ,CALD,EAMAF,CAAG,CAACC,QAAJ,CAAeA,CAAQ,CAACG,IAAT,CAAc,IAAd,CAAf,CACAN,CAAQ,CAAChB,IAAT,CAAcR,CAAS,CAAC+B,MAAV,CAAiB,uCAAjB,CAA0DL,CAA1D,CAAd,CACH,CAXD,EAcA,MAAO5B,CAAAA,CAAC,CAACkC,IAAF,CAAOC,KAAP,CAAanC,CAAC,CAACkC,IAAf,CAAqBR,CAArB,EAA+BD,IAA/B,CAAoC,UAAW,CAClD,GAAID,CAAAA,CAAI,CAAGY,SAAX,CACApC,CAAC,CAACO,IAAF,CAAOF,CAAO,CAACC,KAAf,CAAsB,SAASE,CAAT,CAAgBC,CAAhB,CAAsB,CACxCA,CAAI,CAACK,MAAL,CAAcU,CAAI,CAACG,CAAD,CAAlB,CACAA,CAAC,EACJ,CAHD,EAIAV,CAAO,CAACZ,CAAO,CAACC,KAAT,CAEV,CARM,CAUV,CA7BD,EA6BG+B,KA7BH,CA6BSnB,CA7BT,CA8BH,CA1DkD,CA8D1D,CAhEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * User selector module.\n *\n * @module tool_lp/form-user-selector\n * @class form-user-selector\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_lp/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var capability = $(selector).data('capability');\n if (typeof capability === \"undefined\") {\n capability = '';\n }\n\n promise = Ajax.call([{\n methodname: 'tool_lp_search_users',\n args: {\n query: query,\n capability: capability\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results.users, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(['idnumber', 'email', 'phone1', 'phone2', 'department', 'institution'], function(i, k) {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('tool_lp/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results.users, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results.users);\n return;\n });\n\n }).catch(failure);\n }\n\n };\n\n});\n"],"file":"form-user-selector.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/form_competency_element.min.js b/admin/tool/lp/amd/build/form_competency_element.min.js index 20679d9384eb5..c3937f2f8ace6 100644 --- a/admin/tool/lp/amd/build/form_competency_element.min.js +++ b/admin/tool/lp/amd/build/form_competency_element.min.js @@ -1 +1,2 @@ -define(["jquery","tool_lp/competencypicker","core/ajax","core/notification","core/templates"],function(a,b,c,d,e){var f=null,g=1,h=function(){var b=a('[data-action="competencies"]').val(),f=[],g=0;if(""!=b)for(b=b.split(","),g=0;g.\n\n/**\n * Badge select competency actions\n *\n * @module tool_lp/form_competency_element\n * @package tool_lp\n * @copyright 2019 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'tool_lp/competencypicker', 'core/ajax', 'core/notification', 'core/templates'],\n function($, Picker, Ajax, Notification, Templates) {\n\n var pickerInstance = null;\n\n var pageContextId = 1;\n\n /**\n * Re-render the list of selected competencies.\n *\n * @method renderCompetencies\n * @return {boolean}\n */\n var renderCompetencies = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val();\n var requests = [];\n var i = 0;\n\n if (currentCompetencies != '') {\n currentCompetencies = currentCompetencies.split(',');\n for (i = 0; i < currentCompetencies.length; i++) {\n requests[requests.length] = {\n methodname: 'core_competency_read_competency',\n args: {id: currentCompetencies[i]}\n };\n }\n }\n\n $.when.apply($, Ajax.call(requests, false)).then(function() {\n var i = 0,\n competencies = [];\n\n for (i = 0; i < arguments.length; i++) {\n competencies[i] = arguments[i];\n }\n var context = {\n competencies: competencies\n };\n\n return Templates.render('tool_lp/form_competency_list', context);\n }).then(function(html, js) {\n Templates.replaceNode($('[data-region=\"competencies\"]'), html, js);\n return true;\n }).fail(Notification.exception);\n\n return true;\n };\n\n /**\n * Deselect a competency\n *\n * @method unpickCompetenciesHandler\n * @param {Event} e\n * @return {boolean}\n */\n var unpickCompetenciesHandler = function(e) {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(','),\n newCompetencies = [],\n i,\n toRemove = $(e.currentTarget).data('id');\n\n for (i = 0; i < currentCompetencies.length; i++) {\n if (currentCompetencies[i] != toRemove) {\n newCompetencies[newCompetencies.length] = currentCompetencies[i];\n }\n }\n\n $('[data-action=\"competencies\"]').val(newCompetencies.join(','));\n\n return renderCompetencies();\n };\n\n /**\n * Open a competencies popup to relate competencies.\n *\n * @method pickCompetenciesHandler\n */\n var pickCompetenciesHandler = function() {\n var currentCompetencies = $('[data-action=\"competencies\"]').val().split(',');\n\n if (!pickerInstance) {\n pickerInstance = new Picker(pageContextId, false, 'parents', true);\n pickerInstance.on('save', function(e, data) {\n var before = $('[data-action=\"competencies\"]').val();\n var compIds = data.competencyIds;\n if (before != '') {\n compIds = compIds.concat(before.split(','));\n }\n var value = compIds.join(',');\n\n $('[data-action=\"competencies\"]').val(value);\n\n return renderCompetencies();\n });\n }\n\n pickerInstance.setDisallowedCompetencyIDs(currentCompetencies);\n pickerInstance.display();\n };\n\n return /** @alias module:tool_lp/form_competency_element */ {\n /**\n * Listen for clicks on the competency picker and push the changes to the form element.\n *\n * @method init\n * @param {Integer} contextId\n */\n init: function(contextId) {\n pageContextId = contextId;\n renderCompetencies();\n $('[data-action=\"select-competencies\"]').on('click', pickCompetenciesHandler);\n $('body').on('click', '[data-action=\"deselect-competency\"]', unpickCompetenciesHandler);\n }\n };\n});\n"],"file":"form_competency_element.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/frameworkactions.min.js b/admin/tool/lp/amd/build/frameworkactions.min.js index 32c694da7489d..523461f0c27ce 100644 --- a/admin/tool/lp/amd/build/frameworkactions.min.js +++ b/admin/tool/lp/amd/build/frameworkactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/ajax","core/notification","core/str"],function(a,b,c,d,e){var f=0,g=0,h=function(c,d){a('[data-region="managecompetencies"]').replaceWith(c),b.runTemplateJS(d)},i=function(a){b.render("tool_lp/manage_competency_frameworks_page",a).done(h).fail(d.exception)},j=function(b){b.preventDefault(),g=a(this).attr("data-frameworkid");var e=c.call([{methodname:"core_competency_duplicate_competency_framework",args:{id:g}},{methodname:"tool_lp_data_for_competency_frameworks_manage_page",args:{pagecontext:{contextid:f}}}]);e[1].done(i).fail(d.exception)},k=function(){var a=c.call([{methodname:"core_competency_delete_competency_framework",args:{id:g}},{methodname:"tool_lp_data_for_competency_frameworks_manage_page",args:{pagecontext:{contextid:f}}}]);a[0].done(function(a){if(a===!1){var b=c.call([{methodname:"core_competency_read_competency_framework",args:{id:g}}]);b[0].done(function(a){e.get_strings([{key:"frameworkcannotbedeleted",component:"tool_lp",param:a.shortname},{key:"cancel",component:"moodle"}]).done(function(a){d.alert(null,a[0])}).fail(d.exception)})}}).fail(d.exception),a[1].done(i).fail(d.exception)},l=function(b){b.preventDefault();var f=a(this).attr("data-frameworkid");g=f;var h=c.call([{methodname:"core_competency_read_competency_framework",args:{id:g}}]);h[0].done(function(a){e.get_strings([{key:"confirm",component:"moodle"},{key:"deletecompetencyframework",component:"tool_lp",param:a.shortname},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],k)}).fail(d.exception)}).fail(d.exception)};return{deleteHandler:l,duplicateHandler:j,init:function(a){f=a}}}); \ No newline at end of file +define ("tool_lp/frameworkactions",["jquery","core/templates","core/ajax","core/notification","core/str"],function(a,b,c,d,e){var f=0,g=0,h=function(c,d){a("[data-region=\"managecompetencies\"]").replaceWith(c);b.runTemplateJS(d)},i=function(a){b.render("tool_lp/manage_competency_frameworks_page",a).done(h).fail(d.exception)},j=function(b){b.preventDefault();g=a(this).attr("data-frameworkid");var e=c.call([{methodname:"core_competency_duplicate_competency_framework",args:{id:g}},{methodname:"tool_lp_data_for_competency_frameworks_manage_page",args:{pagecontext:{contextid:f}}}]);e[1].done(i).fail(d.exception)},k=function(){var a=c.call([{methodname:"core_competency_delete_competency_framework",args:{id:g}},{methodname:"tool_lp_data_for_competency_frameworks_manage_page",args:{pagecontext:{contextid:f}}}]);a[0].done(function(a){if(!1===a){var b=c.call([{methodname:"core_competency_read_competency_framework",args:{id:g}}]);b[0].done(function(a){e.get_strings([{key:"frameworkcannotbedeleted",component:"tool_lp",param:a.shortname},{key:"cancel",component:"moodle"}]).done(function(a){d.alert(null,a[0])}).fail(d.exception)})}}).fail(d.exception);a[1].done(i).fail(d.exception)},l=function(b){b.preventDefault();var f=a(this).attr("data-frameworkid");g=f;var h=c.call([{methodname:"core_competency_read_competency_framework",args:{id:g}}]);h[0].done(function(a){e.get_strings([{key:"confirm",component:"moodle"},{key:"deletecompetencyframework",component:"tool_lp",param:a.shortname},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],k)}).fail(d.exception)}).fail(d.exception)};return{deleteHandler:l,duplicateHandler:j,init:function init(a){f=a}}}); +//# sourceMappingURL=frameworkactions.min.js.map diff --git a/admin/tool/lp/amd/build/frameworkactions.min.js.map b/admin/tool/lp/amd/build/frameworkactions.min.js.map new file mode 100644 index 0000000000000..eab5c15ad3005 --- /dev/null +++ b/admin/tool/lp/amd/build/frameworkactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/frameworkactions.js"],"names":["define","$","templates","ajax","notification","str","pagecontextid","frameworkid","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDuplicate","e","preventDefault","attr","requests","call","methodname","args","id","pagecontext","contextid","doDelete","success","req","framework","get_strings","key","component","param","shortname","strings","alert","confirmDelete","confirm","deleteHandler","duplicateHandler","init"],"mappings":"AAuBAA,OAAM,4BAAC,CAAC,QAAD,CAAW,gBAAX,CAA6B,WAA7B,CAA0C,mBAA1C,CAA+D,UAA/D,CAAD,CAA6E,SAASC,CAAT,CAAYC,CAAZ,CAAuBC,CAAvB,CAA6BC,CAA7B,CAA2CC,CAA3C,CAAgD,IAI3HC,CAAAA,CAAa,CAAG,CAJ2G,CAO3HC,CAAW,CAAG,CAP6G,CAe3HC,CAAU,CAAG,SAASC,CAAT,CAAkBC,CAAlB,CAAyB,CACtCT,CAAC,CAAC,sCAAD,CAAD,CAAwCU,WAAxC,CAAoDF,CAApD,EACAP,CAAS,CAACU,aAAV,CAAwBF,CAAxB,CACH,CAlB8H,CAyB3HG,CAAU,CAAG,SAASC,CAAT,CAAkB,CAC/BZ,CAAS,CAACa,MAAV,CAAiB,2CAAjB,CAA8DD,CAA9D,EACKE,IADL,CACUR,CADV,EAEKS,IAFL,CAEUb,CAAY,CAACc,SAFvB,CAGH,CA7B8H,CAoC3HC,CAAW,CAAG,SAASC,CAAT,CAAY,CAC1BA,CAAC,CAACC,cAAF,GAEAd,CAAW,CAAGN,CAAC,CAAC,IAAD,CAAD,CAAQqB,IAAR,CAAa,kBAAb,CAAd,CAGA,GAAIC,CAAAA,CAAQ,CAAGpB,CAAI,CAACqB,IAAL,CAAU,CAAC,CACtBC,UAAU,CAAE,gDADU,CAEtBC,IAAI,CAAE,CAACC,EAAE,CAAEpB,CAAL,CAFgB,CAAD,CAGtB,CACCkB,UAAU,CAAE,oDADb,CAECC,IAAI,CAAE,CACFE,WAAW,CAAE,CACTC,SAAS,CAAEvB,CADF,CADX,CAFP,CAHsB,CAAV,CAAf,CAWAiB,CAAQ,CAAC,CAAD,CAAR,CAAYP,IAAZ,CAAiBH,CAAjB,EAA6BI,IAA7B,CAAkCb,CAAY,CAACc,SAA/C,CACH,CAtD8H,CA0D3HY,CAAQ,CAAG,UAAW,CAGtB,GAAIP,CAAAA,CAAQ,CAAGpB,CAAI,CAACqB,IAAL,CAAU,CAAC,CACtBC,UAAU,CAAE,6CADU,CAEtBC,IAAI,CAAE,CAACC,EAAE,CAAEpB,CAAL,CAFgB,CAAD,CAGtB,CACCkB,UAAU,CAAE,oDADb,CAECC,IAAI,CAAE,CACFE,WAAW,CAAE,CACTC,SAAS,CAAEvB,CADF,CADX,CAFP,CAHsB,CAAV,CAAf,CAWAiB,CAAQ,CAAC,CAAD,CAAR,CAAYP,IAAZ,CAAiB,SAASe,CAAT,CAAkB,CAC/B,GAAI,KAAAA,CAAJ,CAAuB,CACnB,GAAIC,CAAAA,CAAG,CAAG7B,CAAI,CAACqB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,2CADK,CAEjBC,IAAI,CAAE,CAACC,EAAE,CAAEpB,CAAL,CAFW,CAAD,CAAV,CAAV,CAIAyB,CAAG,CAAC,CAAD,CAAH,CAAOhB,IAAP,CAAY,SAASiB,CAAT,CAAoB,CAC5B5B,CAAG,CAAC6B,WAAJ,CAAgB,CACZ,CAACC,GAAG,CAAE,0BAAN,CAAkCC,SAAS,CAAE,SAA7C,CAAwDC,KAAK,CAAEJ,CAAS,CAACK,SAAzE,CADY,CAEZ,CAACH,GAAG,CAAE,QAAN,CAAgBC,SAAS,CAAE,QAA3B,CAFY,CAAhB,EAGGpB,IAHH,CAGQ,SAASuB,CAAT,CAAkB,CACtBnC,CAAY,CAACoC,KAAb,CACI,IADJ,CAEID,CAAO,CAAC,CAAD,CAFX,CAIH,CARD,EAQGtB,IARH,CAQQb,CAAY,CAACc,SARrB,CASH,CAVD,CAWH,CACJ,CAlBD,EAkBGD,IAlBH,CAkBQb,CAAY,CAACc,SAlBrB,EAmBAK,CAAQ,CAAC,CAAD,CAAR,CAAYP,IAAZ,CAAiBH,CAAjB,EAA6BI,IAA7B,CAAkCb,CAAY,CAACc,SAA/C,CACH,CA5F8H,CAkG3HuB,CAAa,CAAG,SAASrB,CAAT,CAAY,CAC5BA,CAAC,CAACC,cAAF,GAEA,GAAIM,CAAAA,CAAE,CAAG1B,CAAC,CAAC,IAAD,CAAD,CAAQqB,IAAR,CAAa,kBAAb,CAAT,CACAf,CAAW,CAAGoB,CAAd,CAEA,GAAIJ,CAAAA,CAAQ,CAAGpB,CAAI,CAACqB,IAAL,CAAU,CAAC,CACtBC,UAAU,CAAE,2CADU,CAEtBC,IAAI,CAAE,CAACC,EAAE,CAAEpB,CAAL,CAFgB,CAAD,CAAV,CAAf,CAKAgB,CAAQ,CAAC,CAAD,CAAR,CAAYP,IAAZ,CAAiB,SAASiB,CAAT,CAAoB,CACjC5B,CAAG,CAAC6B,WAAJ,CAAgB,CACZ,CAACC,GAAG,CAAE,SAAN,CAAiBC,SAAS,CAAE,QAA5B,CADY,CAEZ,CAACD,GAAG,CAAE,2BAAN,CAAmCC,SAAS,CAAE,SAA9C,CAAyDC,KAAK,CAAEJ,CAAS,CAACK,SAA1E,CAFY,CAGZ,CAACH,GAAG,CAAE,QAAN,CAAgBC,SAAS,CAAE,QAA3B,CAHY,CAIZ,CAACD,GAAG,CAAE,QAAN,CAAgBC,SAAS,CAAE,QAA3B,CAJY,CAAhB,EAKGpB,IALH,CAKQ,SAASuB,CAAT,CAAkB,CACtBnC,CAAY,CAACsC,OAAb,CACIH,CAAO,CAAC,CAAD,CADX,CAEIA,CAAO,CAAC,CAAD,CAFX,CAGIA,CAAO,CAAC,CAAD,CAHX,CAIIA,CAAO,CAAC,CAAD,CAJX,CAKIT,CALJ,CAOH,CAbD,EAaGb,IAbH,CAaQb,CAAY,CAACc,SAbrB,CAcH,CAfD,EAeGD,IAfH,CAeQb,CAAY,CAACc,SAfrB,CAiBH,CA9H8H,CAiI/H,MAAqD,CAQjDyB,aAAa,CAAEF,CARkC,CAejDG,gBAAgB,CAAEzB,CAf+B,CAsBjD0B,IAAI,CAAE,cAAShB,CAAT,CAAoB,CACtBvB,CAAa,CAAGuB,CACnB,CAxBgD,CA0BxD,CA3JK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Competency frameworks actions via ajax.\n *\n * @module tool_lp/frameworkactions\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str'], function($, templates, ajax, notification, str) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} frameworkid The id of the framework */\n var frameworkid = 0;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managecompetencies\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_competency_frameworks_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Duplicate a framework and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n frameworkid = $(this).attr('data-frameworkid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n /**\n * Delete a framework and reload the page.\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_competency_framework',\n args: {id: frameworkid}\n }, {\n methodname: 'tool_lp_data_for_competency_frameworks_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[0].done(function(success) {\n if (success === false) {\n var req = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n req[0].done(function(framework) {\n str.get_strings([\n {key: 'frameworkcannotbedeleted', component: 'tool_lp', param: framework.shortname},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.alert(\n null,\n strings[0]\n );\n }).fail(notification.exception);\n });\n }\n }).fail(notification.exception);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete competency framework\" actions.\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-frameworkid');\n frameworkid = id;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_competency_framework',\n args: {id: frameworkid}\n }]);\n\n requests[0].done(function(framework) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletecompetencyframework', component: 'tool_lp', param: framework.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete competency framework X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n\n return /** @alias module:tool_lp/frameworkactions */ {\n // Public variables and functions.\n\n /**\n * Expose the event handler for delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"file":"frameworkactions.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/frameworks_datasource.min.js b/admin/tool/lp/amd/build/frameworks_datasource.min.js index 9f2ec48389658..7e4abb6a96621 100644 --- a/admin/tool/lp/amd/build/frameworks_datasource.min.js +++ b/admin/tool/lp/amd/build/frameworks_datasource.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function(c,d){var e={context:{contextid:c}};return a.extend(e,"undefined"==typeof d?{}:d),b.call([{methodname:"core_competency_list_competency_frameworks",args:e}])[0]},processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.id,label:b.shortname+" "+b.idnumber})}),d},transport:function(b,d,e){var f=a(b),g=f.data("contextid"),h=f.data("onlyvisible");if(!g)throw new Error("The attribute data-contextid is required on "+b);this.list(g,{query:d,onlyvisible:h}).then(e)["catch"](c.exception)}}}); \ No newline at end of file +define ("tool_lp/frameworks_datasource",["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function list(c,d){var e={context:{contextid:c}};a.extend(e,"undefined"==typeof d?{}:d);return b.call([{methodname:"core_competency_list_competency_frameworks",args:e}])[0]},processResults:function processResults(b,c){var d=[];a.each(c,function(a,b){d.push({value:b.id,label:b.shortname+" "+b.idnumber})});return d},transport:function transport(b,d,e){var f=a(b),g=f.data("contextid"),h=f.data("onlyvisible");if(!g){throw new Error("The attribute data-contextid is required on "+b)}this.list(g,{query:d,onlyvisible:h}).then(e).catch(c.exception)}}}); +//# sourceMappingURL=frameworks_datasource.min.js.map diff --git a/admin/tool/lp/amd/build/frameworks_datasource.min.js.map b/admin/tool/lp/amd/build/frameworks_datasource.min.js.map new file mode 100644 index 0000000000000..96501a33fed52 --- /dev/null +++ b/admin/tool/lp/amd/build/frameworks_datasource.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/frameworks_datasource.js"],"names":["define","$","Ajax","Notification","list","contextId","options","args","context","contextid","extend","call","methodname","processResults","selector","results","each","index","data","push","value","id","label","shortname","idnumber","transport","query","callback","el","onlyVisible","Error","onlyvisible","then","catch","exception"],"mappings":"AAyBAA,OAAM,iCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CAA+C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CAEjF,MAAiE,CAS7DC,IAAI,CAAE,cAASC,CAAT,CAAoBC,CAApB,CAA6B,CAC/B,GAAIC,CAAAA,CAAI,CAAG,CACHC,OAAO,CAAE,CACLC,SAAS,CAAEJ,CADN,CADN,CAAX,CAMAJ,CAAC,CAACS,MAAF,CAASH,CAAT,CAAkC,WAAnB,QAAOD,CAAAA,CAAP,CAAiC,EAAjC,CAAsCA,CAArD,EACA,MAAOJ,CAAAA,CAAI,CAACS,IAAL,CAAU,CAAC,CACdC,UAAU,CAAE,4CADE,CAEdL,IAAI,CAAEA,CAFQ,CAAD,CAAV,EAGH,CAHG,CAIV,CArB4D,CA8B7DM,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIT,CAAAA,CAAO,CAAG,EAAd,CACAL,CAAC,CAACe,IAAF,CAAOD,CAAP,CAAgB,SAASE,CAAT,CAAgBC,CAAhB,CAAsB,CAClCZ,CAAO,CAACa,IAAR,CAAa,CACTC,KAAK,CAAEF,CAAI,CAACG,EADH,CAETC,KAAK,CAAEJ,CAAI,CAACK,SAAL,CAAiB,GAAjB,CAAuBL,CAAI,CAACM,QAF1B,CAAb,CAIH,CALD,EAMA,MAAOlB,CAAAA,CACV,CAvC4D,CAiD7DmB,SAAS,CAAE,mBAASX,CAAT,CAAmBY,CAAnB,CAA0BC,CAA1B,CAAoC,CAC3C,GAAIC,CAAAA,CAAE,CAAG3B,CAAC,CAACa,CAAD,CAAV,CACIT,CAAS,CAAGuB,CAAE,CAACV,IAAH,CAAQ,WAAR,CADhB,CAEIW,CAAW,CAAGD,CAAE,CAACV,IAAH,CAAQ,aAAR,CAFlB,CAIA,GAAI,CAACb,CAAL,CAAgB,CACZ,KAAM,IAAIyB,CAAAA,KAAJ,CAAU,+CAAiDhB,CAA3D,CACT,CACD,KAAKV,IAAL,CAAUC,CAAV,CAAqB,CACjBqB,KAAK,CAAEA,CADU,CAEjBK,WAAW,CAAEF,CAFI,CAArB,EAGGG,IAHH,CAGQL,CAHR,EAGkBM,KAHlB,CAGwB9B,CAAY,CAAC+B,SAHrC,CAIH,CA7D4D,CAgEpE,CAlEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Frameworks datasource.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package tool_lpmigrate\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_lpmigrate/frameworks_datasource */ {\n\n /**\n * List frameworks.\n *\n * @param {Number} contextId The context ID.\n * @param {Object} options Additional parameters to pass to the external function.\n * @return {Promise}\n */\n list: function(contextId, options) {\n var args = {\n context: {\n contextid: contextId\n }\n };\n\n $.extend(args, typeof options === 'undefined' ? {} : options);\n return Ajax.call([{\n methodname: 'core_competency_list_competency_frameworks',\n args: args\n }])[0];\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.id,\n label: data.shortname + ' ' + data.idnumber\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n var el = $(selector),\n contextId = el.data('contextid'),\n onlyVisible = el.data('onlyvisible');\n\n if (!contextId) {\n throw new Error('The attribute data-contextid is required on ' + selector);\n }\n this.list(contextId, {\n query: query,\n onlyvisible: onlyVisible,\n }).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"frameworks_datasource.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/grade_dialogue.min.js b/admin/tool/lp/amd/build/grade_dialogue.min.js index 6bfa3dfeec81d..9c0ecbdcf4a7c 100644 --- a/admin/tool/lp/amd/build/grade_dialogue.min.js +++ b/admin/tool/lp/amd/build/grade_dialogue.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]),this._ratingOptions=a};return g.prototype=Object.create(e.prototype),g.prototype._popup=null,g.prototype._ratingOptions=null,g.prototype._afterRender=function(){var b=this._find('[data-action="rate"]'),c=this._find('[name="rating"]'),d=this._find('[name="comment"]');this._find('[data-action="cancel"]').click(function(a){a.preventDefault(),this._trigger("cancelled"),this.close()}.bind(this)),c.change(function(){var c=a(this);c.val()?b.prop("disabled",!1):b.prop("disabled",!0)}).change(),b.click(function(a){a.preventDefault();var b=c.val();b&&(this._trigger("rated",{rating:b,note:d.val()}),this.close())}.bind(this))},g.prototype.close=function(){this._popup.close(),this._popup=null},g.prototype.display=function(){return this._render().then(function(a){return f.get_string("rate","tool_lp").then(function(b){this._popup=new d(b,a,this._afterRender.bind(this))}.bind(this))}.bind(this)).fail(b.exception)},g.prototype._find=function(b){return a(this._popup.getContent()).find(b)},g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)},g}); \ No newline at end of file +define ("tool_lp/grade_dialogue",["jquery","core/notification","core/templates","tool_lp/dialogue","tool_lp/event_base","core/str"],function(a,b,c,d,e,f){var g=function(a){e.prototype.constructor.apply(this,[]);this._ratingOptions=a};g.prototype=Object.create(e.prototype);g.prototype._popup=null;g.prototype._ratingOptions=null;g.prototype._afterRender=function(){var b=this._find("[data-action=\"rate\"]"),c=this._find("[name=\"rating\"]"),d=this._find("[name=\"comment\"]");this._find("[data-action=\"cancel\"]").click(function(a){a.preventDefault();this._trigger("cancelled");this.close()}.bind(this));c.change(function(){var c=a(this);if(!c.val()){b.prop("disabled",!0)}else{b.prop("disabled",!1)}}).change();b.click(function(a){a.preventDefault();var b=c.val();if(!b){return}this._trigger("rated",{rating:b,note:d.val()});this.close()}.bind(this))};g.prototype.close=function(){this._popup.close();this._popup=null};g.prototype.display=function(){return this._render().then(function(a){return f.get_string("rate","tool_lp").then(function(b){this._popup=new d(b,a,this._afterRender.bind(this))}.bind(this))}.bind(this)).fail(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._render=function(){var a={cangrade:this._canGrade,ratings:this._ratingOptions};return c.render("tool_lp/competency_grader",a)};return g}); +//# sourceMappingURL=grade_dialogue.min.js.map diff --git a/admin/tool/lp/amd/build/grade_dialogue.min.js.map b/admin/tool/lp/amd/build/grade_dialogue.min.js.map new file mode 100644 index 0000000000000..6f0202f40fcc4 --- /dev/null +++ b/admin/tool/lp/amd/build/grade_dialogue.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/grade_dialogue.js"],"names":["define","$","Notification","Templates","Dialogue","EventBase","Str","Grade","ratingOptions","prototype","constructor","apply","_ratingOptions","Object","create","_popup","_afterRender","btnRate","_find","lstRating","txtComment","click","e","preventDefault","_trigger","close","bind","change","node","val","prop","display","_render","then","html","get_string","title","fail","exception","selector","getContent","find","context","cangrade","_canGrade","ratings","render"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Grade dialogue.\n *\n * @package tool_lp\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/templates',\n 'tool_lp/dialogue',\n 'tool_lp/event_base',\n 'core/str'],\n function($, Notification, Templates, Dialogue, EventBase, Str) {\n\n /**\n * Grade dialogue class.\n * @param {Array} ratingOptions\n */\n var Grade = function(ratingOptions) {\n EventBase.prototype.constructor.apply(this, []);\n this._ratingOptions = ratingOptions;\n };\n Grade.prototype = Object.create(EventBase.prototype);\n\n /** @type {Dialogue} The dialogue. */\n Grade.prototype._popup = null;\n /** @type {Array} Array of objects containing, 'value', 'name' and optionally 'selected'. */\n Grade.prototype._ratingOptions = null;\n\n /**\n * After render hook.\n *\n * @method _afterRender\n * @protected\n */\n Grade.prototype._afterRender = function() {\n var btnRate = this._find('[data-action=\"rate\"]'),\n lstRating = this._find('[name=\"rating\"]'),\n txtComment = this._find('[name=\"comment\"]');\n\n this._find('[data-action=\"cancel\"]').click(function(e) {\n e.preventDefault();\n this._trigger('cancelled');\n this.close();\n }.bind(this));\n\n lstRating.change(function() {\n var node = $(this);\n if (!node.val()) {\n btnRate.prop('disabled', true);\n } else {\n btnRate.prop('disabled', false);\n }\n }).change();\n\n btnRate.click(function(e) {\n e.preventDefault();\n var val = lstRating.val();\n if (!val) {\n return;\n }\n this._trigger('rated', {\n 'rating': val,\n 'note': txtComment.val()\n });\n this.close();\n }.bind(this));\n };\n\n /**\n * Close the dialogue.\n *\n * @method close\n */\n Grade.prototype.close = function() {\n this._popup.close();\n this._popup = null;\n };\n\n /**\n * Opens the picker.\n *\n * @param {Number} competencyId The competency ID of the competency to work on.\n * @method display\n * @return {Promise}\n */\n Grade.prototype.display = function() {\n return this._render().then(function(html) {\n return Str.get_string('rate', 'tool_lp').then(function(title) {\n this._popup = new Dialogue(\n title,\n html,\n this._afterRender.bind(this)\n );\n }.bind(this));\n }.bind(this)).fail(Notification.exception);\n };\n\n /**\n * Find a node in the dialogue.\n *\n * @param {String} selector\n * @method _find\n * @returns {node} The node\n * @protected\n */\n Grade.prototype._find = function(selector) {\n return $(this._popup.getContent()).find(selector);\n };\n\n /**\n * Render the dialogue.\n *\n * @method _render\n * @protected\n * @return {Promise}\n */\n Grade.prototype._render = function() {\n var context = {\n cangrade: this._canGrade,\n ratings: this._ratingOptions\n };\n return Templates.render('tool_lp/competency_grader', context);\n };\n\n return /** @alias module:tool_lp/grade_dialogue */ Grade;\n\n});\n"],"file":"grade_dialogue.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/grade_user_competency_inline.min.js b/admin/tool/lp/amd/build/grade_user_competency_inline.min.js index 6ea96241ba16c..4d52c200527df 100644 --- a/admin/tool/lp/amd/build/grade_user_competency_inline.min.js +++ b/admin/tool/lp/amd/build/grade_user_competency_inline.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/log","tool_lp/grade_dialogue","tool_lp/event_base","tool_lp/scalevalues"],function(a,b,c,d,e,f,g){var h=function(b,c,d,e,g,h,i){f.prototype.constructor.apply(this,[]);var j=a(b);if(!j.length)throw new Error("Could not find the trigger");this._scaleId=c,this._competencyId=d,this._userId=e,this._planId=g,this._courseId=h,this._chooseStr=i,this._setUp(),j.click(function(a){a.preventDefault(),this._dialogue.display()}.bind(this)),this._planId?(this._methodName="core_competency_grade_competency_in_plan",this._args={competencyid:this._competencyId,planid:this._planId}):this._courseId?(this._methodName="core_competency_grade_competency_in_course",this._args={competencyid:this._competencyId,courseid:this._courseId,userid:this._userId}):(this._methodName="core_competency_grade_competency",this._args={userid:this._userId,competencyid:this._competencyId})};return h.prototype=Object.create(f.prototype),h.prototype._setUp=function(){var a=[],d=this,f=g.get_values(d._scaleId);f.done(function(f){a.push({value:"",name:d._chooseStr});for(var g=0;g.\n\n/**\n * Module to enable inline editing of a comptency grade.\n *\n * @package tool_lp\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery',\n 'core/notification',\n 'core/ajax',\n 'core/log',\n 'tool_lp/grade_dialogue',\n 'tool_lp/event_base',\n 'tool_lp/scalevalues',\n ], function($, notification, ajax, log, GradeDialogue, EventBase, ScaleValues) {\n\n /**\n * InlineEditor\n *\n * @param {String} selector The selector to trigger the grading.\n * @param {Number} scaleId The id of the scale for this competency.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {String} chooseStr Language string for choose a rating.\n */\n var InlineEditor = function(selector, scaleId, competencyId, userId, planId, courseId, chooseStr) {\n EventBase.prototype.constructor.apply(this, []);\n\n var trigger = $(selector);\n if (!trigger.length) {\n throw new Error('Could not find the trigger');\n }\n\n this._scaleId = scaleId;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._chooseStr = chooseStr;\n this._setUp();\n\n trigger.click(function(e) {\n e.preventDefault();\n this._dialogue.display();\n }.bind(this));\n\n if (this._planId) {\n this._methodName = 'core_competency_grade_competency_in_plan';\n this._args = {\n competencyid: this._competencyId,\n planid: this._planId\n };\n } else if (this._courseId) {\n this._methodName = 'core_competency_grade_competency_in_course';\n this._args = {\n competencyid: this._competencyId,\n courseid: this._courseId,\n userid: this._userId\n };\n } else {\n this._methodName = 'core_competency_grade_competency';\n this._args = {\n userid: this._userId,\n competencyid: this._competencyId\n };\n }\n };\n InlineEditor.prototype = Object.create(EventBase.prototype);\n\n /**\n * Setup.\n *\n * @method _setUp\n */\n InlineEditor.prototype._setUp = function() {\n var options = [],\n self = this;\n\n var promise = ScaleValues.get_values(self._scaleId);\n promise.done(function(scalevalues) {\n options.push({\n value: '',\n name: self._chooseStr\n });\n\n for (var i = 0; i < scalevalues.length; i++) {\n var optionConfig = scalevalues[i];\n options.push({\n value: optionConfig.id,\n name: optionConfig.name\n });\n }\n\n self._dialogue = new GradeDialogue(options);\n self._dialogue.on('rated', function(e, data) {\n var args = self._args;\n args.grade = data.rating;\n args.note = data.note;\n ajax.call([{\n methodname: self._methodName,\n args: args,\n done: function(evidence) {\n self._trigger('competencyupdated', {args: args, evidence: evidence});\n },\n fail: notification.exception\n }]);\n });\n }).fail(notification.exception);\n };\n\n /** @type {Number} The scale id for this competency. */\n InlineEditor.prototype._scaleId = null;\n /** @type {Number} The id of the competency. */\n InlineEditor.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n InlineEditor.prototype._userId = null;\n /** @type {Number} The id of the plan. */\n InlineEditor.prototype._planId = null;\n /** @type {Number} The id of the course. */\n InlineEditor.prototype._courseId = null;\n /** @type {String} The text for Choose rating. */\n InlineEditor.prototype._chooseStr = null;\n /** @type {GradeDialogue} The grading dialogue. */\n InlineEditor.prototype._dialogue = null;\n\n return /** @alias module:tool_lp/grade_user_competency_inline */ InlineEditor;\n\n});\n"],"file":"grade_user_competency_inline.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/menubar.min.js b/admin/tool/lp/amd/build/menubar.min.js index 627c7b7a3e3ae..b00dbac5c357b 100644 --- a/admin/tool/lp/amd/build/menubar.min.js +++ b/admin/tool/lp/amd/build/menubar.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=!1,c=!1,d=function(){a(".tool-lp-menu .tool-lp-sub-menu").attr("aria-hidden","true"),c=!1},e=function(a,b){this.menuRoot=a,this.handlers=b,this.rootMenus=this.menuRoot.children("li"),this.subMenus=this.rootMenus.children("ul"),this.subMenuItems=this.subMenus.children("li"),this.allItems=this.rootMenus.add(this.subMenuItems),this.activeItem=null,this.isChildOpen=!1,this.keys={tab:9,enter:13,esc:27,space:32,left:37,up:38,right:39,down:40},this.addAriaAttributes(),this.addEventListeners()};return e.prototype.openSubMenu=function(a){this.setOpenDirection(),d(),a.attr("aria-hidden","false"),c=!0},e.prototype.addEventListeners=function(){var e=this;b===!1&&(a(document).click(function(){c&&d()}),b=!0),this.subMenuItems.mouseenter(function(){return a(this).addClass("menu-hover"),!0}),this.subMenuItems.mouseout(function(){return a(this).removeClass("menu-hover"),!0}),this.allItems.click(function(b){return e.handleClick(a(this),b)}),this.allItems.keydown(function(b){return e.handleKeyDown(a(this),b)}),this.allItems.focus(function(){return e.handleFocus(a(this))}),this.allItems.blur(function(){return e.handleBlur(a(this))})},e.prototype.handleClick=function(b,c){c.stopPropagation();var d=b.parent();if(d.is(".tool-lp-menu"))"true"==b.children("ul").first().attr("aria-hidden")?this.openSubMenu(b.children("ul").first()):b.children("ul").first().attr("aria-hidden","true");else{this.allItems.removeClass("menu-hover menu-focus"),this.activeItem=null,this.menuRoot.find("ul").not(".root-level").attr("aria-hidden","true");var e=b.find("a").first(),f=new a.Event("click");f.target=e;var g=!1;this.handlers&&a.each(this.handlers,function(c,d){if(!g&&b.find(c).length>0){var h=a.proxy(d,e);g=h(f)===!1||f.isDefaultPrevented()}}),g||"#"===e.attr("href")||(window.location.href=e.attr("href"))}return!1},e.prototype.handleFocus=function(a){if(null===this.activeItem)this.activeItem=a;else if(a[0]!=this.activeItem[0])return!0;var b=this.activeItem.parentsUntil("ul.tool-lp-menu").filter("li");if(this.allItems.removeClass("menu-focus"),this.activeItem.addClass("menu-focus"),b.addClass("menu-focus"),this.isChildOpen===!0){var c=a.parent();c.is(".tool-lp-menu")&&"true"==a.attr("aria-haspopup")&&this.openSubMenu(a.children("ul").first())}return!0},e.prototype.handleBlur=function(a){return a.removeClass("menu-focus"),!0},e.prototype.setOpenDirection=function(){var b=this.menuRoot.offset(),c=a(document.body).hasClass("dir-rtl"),d=!0,e=this.rootMenus.outerHeight(),f=this.rootMenus.outerWidth(),g=this.rootMenus.find("ul.tool-lp-sub-menu");g.css("margin-right",""),g.css("margin-left",""),g.css("margin-top",""),g.attr("aria-hidden",!1);var h=g.outerWidth(),i=g.outerHeight(),j=null,k=null,l=null,m=b.top-a(window).scrollTop();m+i>a(window).height()&&(j=i+e,g.css("margin-top","-"+j+"px")),c?b.left-h<0&&(k=h-f,g.css("margin-right","-"+k+"px")):b.left+h>a(window).width()&&(l=h-f,g.css("margin-left","-"+l+"px")),d?this.menuRoot.addClass("tool-lp-menu-open-left"):this.menuRoot.removeClass("tool-lp-menu-open-left")},e.prototype.handleKeyDown=function(a,b){if(b.altKey||b.ctrlKey)return!0;switch(b.keyCode){case this.keys.tab:this.menuRoot.find("ul").attr("aria-hidden","true"),this.allItems.removeClass("menu-focus"),this.activeItem=null,this.isChildOpen=!1;break;case this.keys.esc:var c=a.parent();return c.is(".tool-lp-menu")?a.children("ul").first().attr("aria-hidden","true"):(this.activeItem=c.parent(),this.isChildOpen=!1,this.activeItem.focus(),c.attr("aria-hidden","true")),b.stopPropagation(),!1;case this.keys.enter:case this.keys.space:return this.handleClick(a,b);case this.keys.left:return this.activeItem=this.moveToPrevious(a),this.activeItem.focus(),b.stopPropagation(),!1;case this.keys.right:return this.activeItem=this.moveToNext(a),this.activeItem.focus(),b.stopPropagation(),!1;case this.keys.up:return this.activeItem=this.moveUp(a),this.activeItem.focus(),b.stopPropagation(),!1;case this.keys.down:return this.activeItem=this.moveDown(a),this.activeItem.focus(),b.stopPropagation(),!1}return!0},e.prototype.moveToNext=function(a){var b=a.parent(),c=b.children("li"),d=c.length,e=c.index(a),f=null,g=null;if(b.is(".tool-lp-menu"))f=e0?a.prev():c.last(),"true"==a.attr("aria-haspopup")&&(f=a.children("ul").first(),"false"==f.attr("aria-hidden")&&(f.attr("aria-hidden","true"),this.isChildOpen=!0)),a.removeClass("menu-focus"),"true"===e.attr("aria-haspopup")&&this.isChildOpen===!0&&(f=e.children("ul").first(),this.openSubMenu(f));else{var g=b.parent(),h=g.parent();h.is(".tool-lp-menu")?(b.attr("aria-hidden","true"),a.removeClass("menu-focus"),g.removeClass("menu-focus"),d=this.rootMenus.index(g),e=d>0?g.prev():this.rootMenus.last(),e.addClass("menu-focus"),"true"==e.attr("aria-haspopup")&&(f=e.children("ul").first(),this.openSubMenu(f),this.isChildOpen=!0,e=f.children("li").first())):(e=b.parent(),b.attr("aria-hidden","true"),a.removeClass("menu-focus"))}return e},e.prototype.moveDown=function(a,b){var c=a.parent(),d=c.children("li").not(".separator"),e=d.length,f=d.index(a),g=null,h=null;if(c.is(".tool-lp-menu"))return"true"!=a.attr("aria-haspopup")?a:(h=a.children("ul").first(),g=h.children("li").first(),this.openSubMenu(h),g);if(b){var i=!1,j=f+1;for(j==e&&(j=0);j!=f;){var k=d.eq(j).html().charAt(0);if(k.toLowerCase()==b){i=!0;break}j+=1,j==e&&(j=0)}return i===!0?(g=d.eq(j),a.removeClass("menu-focus"),g):a}return g=f0?c.eq(d-1):c.last(),a.removeClass("menu-focus"),e)},e.prototype.addAriaAttributes=function(){this.menuRoot.attr("role","menubar"),this.rootMenus.attr("role","menuitem"),this.rootMenus.attr("tabindex","0"),this.rootMenus.attr("aria-haspopup","true"),this.subMenus.attr("role","menu"),this.subMenus.attr("aria-hidden","true"),this.subMenuItems.attr("role","menuitem"),this.subMenuItems.attr("tabindex","-1"),this.menuRoot.addClass("tool-lp-menu"),this.allItems.addClass("tool-lp-menu-item"),this.rootMenus.addClass("tool-lp-root-menu"),this.subMenus.addClass("tool-lp-sub-menu"),this.subMenuItems.addClass("dropdown-item")},{enhance:function(b,c){a(b).each(function(b,d){var f=a(d);f.data("menubarEnhanced")!==!0&&(new e(f,c),f.data("menubarEnhanced",!0))})},closeAll:d}}); \ No newline at end of file +define ("tool_lp/menubar",["jquery"],function(a){var b=!1,c=!1,d=function(){a(".tool-lp-menu .tool-lp-sub-menu").attr("aria-hidden","true");c=!1},e=function(a,b){this.menuRoot=a;this.handlers=b;this.rootMenus=this.menuRoot.children("li");this.subMenus=this.rootMenus.children("ul");this.subMenuItems=this.subMenus.children("li");this.allItems=this.rootMenus.add(this.subMenuItems);this.activeItem=null;this.isChildOpen=!1;this.keys={tab:9,enter:13,esc:27,space:32,left:37,up:38,right:39,down:40};this.addAriaAttributes();this.addEventListeners()};e.prototype.openSubMenu=function(a){this.setOpenDirection();d();a.attr("aria-hidden","false");c=!0};e.prototype.addEventListeners=function(){var f=this;if(!1==b){a(document).click(function(){if(c){d()}});b=!0}this.subMenuItems.mouseenter(function(){a(this).addClass("menu-hover");return!0});this.subMenuItems.mouseout(function(){a(this).removeClass("menu-hover");return!0});this.allItems.click(function(b){return f.handleClick(a(this),b)});this.allItems.keydown(function(b){return f.handleKeyDown(a(this),b)});this.allItems.focus(function(){return f.handleFocus(a(this))});this.allItems.blur(function(){return f.handleBlur(a(this))})};e.prototype.handleClick=function(b,c){c.stopPropagation();var d=b.parent();if(d.is(".tool-lp-menu")){if("true"==b.children("ul").first().attr("aria-hidden")){this.openSubMenu(b.children("ul").first())}else{b.children("ul").first().attr("aria-hidden","true")}}else{this.allItems.removeClass("menu-hover menu-focus");this.activeItem=null;this.menuRoot.find("ul").not(".root-level").attr("aria-hidden","true");var e=b.find("a").first(),f=new a.Event("click");f.target=e;var g=!1;if(this.handlers){a.each(this.handlers,function(c,d){if(g){return}if(0a(window).height()){i=h+d;f.css("margin-top","-"+i+"px")}if(c){if(0>b.left-g){j=g-e;f.css("margin-right","-"+j+"px")}}else{if(b.left+g>a(window).width()){k=g-e;f.css("margin-left","-"+k+"px")}}if(!0){this.menuRoot.addClass("tool-lp-menu-open-left")}else{this.menuRoot.removeClass("tool-lp-menu-open-left")}};e.prototype.handleKeyDown=function(a,b){if(b.altKey||b.ctrlKey){return!0}switch(b.keyCode){case this.keys.tab:{this.menuRoot.find("ul").attr("aria-hidden","true");this.allItems.removeClass("menu-focus");this.activeItem=null;this.isChildOpen=!1;break}case this.keys.esc:{var c=a.parent();if(c.is(".tool-lp-menu")){a.children("ul").first().attr("aria-hidden","true")}else{this.activeItem=c.parent();this.isChildOpen=!1;this.activeItem.focus();c.attr("aria-hidden","true")}b.stopPropagation();return!1}case this.keys.enter:case this.keys.space:{return this.handleClick(a,b)}case this.keys.left:{this.activeItem=this.moveToPrevious(a);this.activeItem.focus();b.stopPropagation();return!1}case this.keys.right:{this.activeItem=this.moveToNext(a);this.activeItem.focus();b.stopPropagation();return!1}case this.keys.up:{this.activeItem=this.moveUp(a);this.activeItem.focus();b.stopPropagation();return!1}case this.keys.down:{this.activeItem=this.moveDown(a);this.activeItem.focus();b.stopPropagation();return!1}}return!0};e.prototype.moveToNext=function(a){var b=a.parent(),c=b.children("li"),d=c.length,e=c.index(a),f=null,g=null;if(b.is(".tool-lp-menu")){if(e.\n\n/**\n * Aria menubar functionality. Enhances a simple nested list structure into a full aria widget.\n * Based on the open ajax example: http://oaa-accessibility.org/example/26/\n *\n * @module tool_lp/menubar\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /** @property {boolean} Flag to indicate if we have already registered a click event handler for the document. */\n var documentClickHandlerRegistered = false;\n\n /** @property {boolean} Flag to indicate whether there's an active, open menu. */\n var menuActive = false;\n\n /**\n * Close all open submenus anywhere in the page (there should only ever be one open at a time).\n *\n * @method closeAllSubMenus\n */\n var closeAllSubMenus = function() {\n $('.tool-lp-menu .tool-lp-sub-menu').attr('aria-hidden', 'true');\n // Every menu's closed at this point, so set the menu active flag to false.\n menuActive = false;\n };\n\n /**\n * Constructor\n *\n * @param {$} menuRoot Jquery collection matching the root of the menu.\n * @param {Function[]} handlers, called when a menu item is chosen.\n */\n var Menubar = function(menuRoot, handlers) {\n // Setup private class variables.\n this.menuRoot = menuRoot;\n this.handlers = handlers;\n this.rootMenus = this.menuRoot.children('li');\n this.subMenus = this.rootMenus.children('ul');\n this.subMenuItems = this.subMenus.children('li');\n this.allItems = this.rootMenus.add(this.subMenuItems);\n this.activeItem = null;\n this.isChildOpen = false;\n\n this.keys = {\n tab: 9,\n enter: 13,\n esc: 27,\n space: 32,\n left: 37,\n up: 38,\n right: 39,\n down: 40\n };\n\n this.addAriaAttributes();\n // Add the event listeners.\n this.addEventListeners();\n };\n\n /**\n * Open a submenu, first it closes all other sub-menus and sets the open direction.\n * @method openSubMenu\n * @param {Node} menu\n */\n Menubar.prototype.openSubMenu = function(menu) {\n this.setOpenDirection();\n closeAllSubMenus();\n menu.attr('aria-hidden', 'false');\n // Set menu active flag to true when a menu is opened.\n menuActive = true;\n };\n\n\n /**\n * Bind the event listeners to the DOM\n * @method addEventListeners\n */\n Menubar.prototype.addEventListeners = function() {\n var currentThis = this;\n\n // When clicking outside the menubar.\n if (documentClickHandlerRegistered === false) {\n $(document).click(function() {\n // Check if a menu is opened.\n if (menuActive) {\n // Close menu.\n closeAllSubMenus();\n }\n });\n // Set this flag to true so that we won't need to add a document click handler for the other Menubar instances.\n documentClickHandlerRegistered = true;\n }\n\n // Hovers.\n this.subMenuItems.mouseenter(function() {\n $(this).addClass('menu-hover');\n return true;\n });\n\n this.subMenuItems.mouseout(function() {\n $(this).removeClass('menu-hover');\n return true;\n });\n\n // Mouse listeners.\n this.allItems.click(function(e) {\n return currentThis.handleClick($(this), e);\n });\n\n // Key listeners.\n this.allItems.keydown(function(e) {\n return currentThis.handleKeyDown($(this), e);\n });\n\n this.allItems.focus(function() {\n return currentThis.handleFocus($(this));\n });\n\n this.allItems.blur(function() {\n return currentThis.handleBlur($(this));\n });\n };\n\n /**\n * Process click events for the top menus.\n *\n * @method handleClick\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return {boolean} Returns false\n */\n Menubar.prototype.handleClick = function(item, e) {\n e.stopPropagation();\n\n var parentUL = item.parent();\n\n if (parentUL.is('.tool-lp-menu')) {\n // Toggle the child menu open/closed.\n if (item.children('ul').first().attr('aria-hidden') == 'true') {\n this.openSubMenu(item.children('ul').first());\n } else {\n item.children('ul').first().attr('aria-hidden', 'true');\n }\n } else {\n // Remove hover and focus styling.\n this.allItems.removeClass('menu-hover menu-focus');\n\n // Clear the active item.\n this.activeItem = null;\n\n // Close the menu.\n this.menuRoot.find('ul').not('.root-level').attr('aria-hidden', 'true');\n // Follow any link, or call the click handlers.\n var anchor = item.find('a').first();\n var clickEvent = new $.Event('click');\n clickEvent.target = anchor;\n var eventHandled = false;\n if (this.handlers) {\n $.each(this.handlers, function(selector, handler) {\n if (eventHandled) {\n return;\n }\n if (item.find(selector).length > 0) {\n var callable = $.proxy(handler, anchor);\n // False means stop propogatting events.\n eventHandled = (callable(clickEvent) === false) || clickEvent.isDefaultPrevented();\n }\n });\n }\n // If we didn't find a handler, and the HREF is # that probably means that\n // we are handling it from somewhere else. Let's just do nothing in that case.\n if (!eventHandled && anchor.attr('href') !== '#') {\n window.location.href = anchor.attr('href');\n }\n }\n return false;\n };\n\n /*\n * Process focus events for the menu.\n *\n * @method handleFocus\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleFocus = function(item) {\n\n // If activeItem is null, we are getting focus from outside the menu. Store\n // the item that triggered the event.\n if (this.activeItem === null) {\n this.activeItem = item;\n } else if (item[0] != this.activeItem[0]) {\n return true;\n }\n\n // Get the set of jquery objects for all the parent items of the active item.\n var parentItems = this.activeItem.parentsUntil('ul.tool-lp-menu').filter('li');\n\n // Remove focus styling from all other menu items.\n this.allItems.removeClass('menu-focus');\n\n // Add focus styling to the active item.\n this.activeItem.addClass('menu-focus');\n\n // Add focus styling to all parent items.\n parentItems.addClass('menu-focus');\n\n // If the bChildOpen flag has been set, open the active item's child menu (if applicable).\n if (this.isChildOpen === true) {\n\n var itemUL = item.parent();\n\n // If the itemUL is a root-level menu and item is a parent item,\n // show the child menu.\n if (itemUL.is('.tool-lp-menu') && (item.attr('aria-haspopup') == 'true')) {\n this.openSubMenu(item.children('ul').first());\n }\n }\n\n return true;\n };\n\n /*\n * Process blur events for the menu.\n *\n * @method handleBlur\n * @param {Object} item is the jquery object of the item firing the event\n * @return boolean Returns false\n */\n Menubar.prototype.handleBlur = function(item) {\n item.removeClass('menu-focus');\n\n return true;\n };\n\n /*\n * Determine if the menu should open to the left, or the right,\n * based on the screen size and menu position.\n * @method setOpenDirection\n */\n Menubar.prototype.setOpenDirection = function() {\n var pos = this.menuRoot.offset();\n var isRTL = $(document.body).hasClass('dir-rtl');\n var openLeft = true;\n var heightmenuRoot = this.rootMenus.outerHeight();\n var widthmenuRoot = this.rootMenus.outerWidth();\n // Sometimes the menuMinWidth is not enough to figure out if menu exceeds the window width.\n // So we have to calculate the real menu width.\n var subMenuContainer = this.rootMenus.find('ul.tool-lp-sub-menu');\n\n // Reset margins.\n subMenuContainer.css('margin-right', '');\n subMenuContainer.css('margin-left', '');\n subMenuContainer.css('margin-top', '');\n\n subMenuContainer.attr('aria-hidden', false);\n var menuRealWidth = subMenuContainer.outerWidth(),\n menuRealHeight = subMenuContainer.outerHeight();\n\n var margintop = null,\n marginright = null,\n marginleft = null;\n var top = pos.top - $(window).scrollTop();\n // Top is the same for RTL and LTR.\n if (top + menuRealHeight > $(window).height()) {\n margintop = menuRealHeight + heightmenuRoot;\n subMenuContainer.css('margin-top', '-' + margintop + 'px');\n }\n\n if (isRTL) {\n if (pos.left - menuRealWidth < 0) {\n marginright = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-right', '-' + marginright + 'px');\n }\n } else {\n if (pos.left + menuRealWidth > $(window).width()) {\n marginleft = menuRealWidth - widthmenuRoot;\n subMenuContainer.css('margin-left', '-' + marginleft + 'px');\n }\n }\n\n if (openLeft) {\n this.menuRoot.addClass('tool-lp-menu-open-left');\n } else {\n this.menuRoot.removeClass('tool-lp-menu-open-left');\n }\n\n };\n\n /*\n * Process keyDown events for the menu.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery object of the item firing the event\n * @param {Event} e is the associated event object\n * @return boolean Returns false if consuming the event\n */\n Menubar.prototype.handleKeyDown = function(item, e) {\n\n if (e.altKey || e.ctrlKey) {\n // Modifier key pressed: Do not process.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n\n // Hide all menu items and update their aria attributes.\n this.menuRoot.find('ul').attr('aria-hidden', 'true');\n\n // Remove focus styling from all menu items.\n this.allItems.removeClass('menu-focus');\n\n this.activeItem = null;\n\n this.isChildOpen = false;\n\n break;\n }\n case this.keys.esc: {\n var itemUL = item.parent();\n\n if (itemUL.is('.tool-lp-menu')) {\n // Hide the child menu and update the aria attributes.\n item.children('ul').first().attr('aria-hidden', 'true');\n } else {\n\n // Move up one level.\n this.activeItem = itemUL.parent();\n\n // Reset the isChildOpen flag.\n this.isChildOpen = false;\n\n // Set focus on the new item.\n this.activeItem.focus();\n\n // Hide the active menu and update the aria attributes.\n itemUL.attr('aria-hidden', 'true');\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n // Trigger click handler.\n return this.handleClick(item, e);\n }\n\n case this.keys.left: {\n\n this.activeItem = this.moveToPrevious(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n\n this.activeItem = this.moveToNext(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n this.activeItem = this.moveUp(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n this.activeItem = this.moveDown(item);\n\n this.activeItem.focus();\n\n e.stopPropagation();\n return false;\n }\n }\n\n return true;\n\n };\n\n\n /**\n * Move to the next menu level.\n * This will be either the next root-level menu or the child of a menu parent. If\n * at the root level and the active item is the last in the menu, this function will loop\n * to the first menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToNext\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToNext = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to next sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex < menuNum - 1) {\n // Not the last root menu.\n newItem = item.next();\n } else { // Wrap to first item.\n newItem = menuItems.first();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n }\n } else {\n // This is not the root level. If there is a child menu to be moved into, do that;\n // otherwise, move to the next root-level menu if there is one.\n if (item.attr('aria-haspopup') == 'true') {\n\n childMenu = item.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update its aria attributes.\n this.openSubMenu(childMenu);\n } else {\n // At deepest level, move to the next root-level menu.\n\n var parentMenus = null;\n var rootItem = null;\n\n // Get list of all parent menus for item, up to the root level.\n parentMenus = item.parentsUntil('ul.tool-lp-menu').filter('ul').not('.tool-lp-menu');\n\n // Hide the current menu and update its aria attributes accordingly.\n parentMenus.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n parentMenus.find('li').removeClass('menu-focus');\n parentMenus.last().parent().removeClass('menu-focus');\n\n // The containing root for the menu.\n rootItem = parentMenus.last().parent();\n\n menuIndex = this.rootMenus.index(rootItem);\n\n // If this is not the last root menu item, move to the next one.\n if (menuIndex < this.rootMenus.length - 1) {\n newItem = rootItem.next();\n } else {\n // Loop.\n newItem = this.rootMenus.first();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n newItem = childMenu.children('li').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to move to the previous menu level.\n * This will be either the previous root-level menu or the child of a menu parent. If\n * at the root level and the active item is the first in the menu, this function will loop\n * to the last menu item.\n *\n * If the menu is a horizontal menu, the first child element of the newly selected menu will\n * be selected\n *\n * @method moveToPrevious\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveToPrevious = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var childMenu = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level move to previous sibling. This will require closing\n // the current child menu and opening the new one.\n\n if (menuIndex > 0) {\n // Not the first root menu.\n newItem = item.prev();\n } else {\n // Wrap to last item.\n newItem = menuItems.last();\n }\n\n // Close the current child menu (if applicable).\n if (item.attr('aria-haspopup') == 'true') {\n childMenu = item.children('ul').first();\n\n if (childMenu.attr('aria-hidden') == 'false') {\n // Update the child menu's aria-hidden attribute.\n childMenu.attr('aria-hidden', 'true');\n this.isChildOpen = true;\n }\n }\n\n // Remove the focus styling from the current menu.\n item.removeClass('menu-focus');\n\n // Open the new child menu (if applicable).\n if ((newItem.attr('aria-haspopup') === 'true') && (this.isChildOpen === true)) {\n\n childMenu = newItem.children('ul').first();\n\n // Update the child's aria-hidden attribute.\n this.openSubMenu(childMenu);\n\n }\n } else {\n // This is not the root level. If there is a parent menu that is not the\n // root menu, move up one level; otherwise, move to first item of the previous\n // root menu.\n\n var parentLI = itemUL.parent();\n var parentUL = parentLI.parent();\n\n // If this is a vertical menu or is not the first child menu\n // of the root-level menu, move up one level.\n if (!parentUL.is('.tool-lp-menu')) {\n\n newItem = itemUL.parent();\n\n // Hide the active menu and update aria-hidden.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus highlight from the item.\n item.removeClass('menu-focus');\n\n } else {\n // Move to previous root-level menu.\n\n // Hide the current menu and update the aria attributes accordingly.\n itemUL.attr('aria-hidden', 'true');\n\n // Remove the focus styling from the active menu.\n item.removeClass('menu-focus');\n parentLI.removeClass('menu-focus');\n\n menuIndex = this.rootMenus.index(parentLI);\n\n if (menuIndex > 0) {\n // Move to the previous root-level menu.\n newItem = parentLI.prev();\n } else {\n // Loop to last root-level menu.\n newItem = this.rootMenus.last();\n }\n\n // Add the focus styling to the new menu.\n newItem.addClass('menu-focus');\n\n if (newItem.attr('aria-haspopup') == 'true') {\n childMenu = newItem.children('ul').first();\n\n // Show the child menu and update it's aria attributes.\n this.openSubMenu(childMenu);\n this.isChildOpen = true;\n\n newItem = childMenu.children('li').first();\n }\n }\n }\n\n return newItem;\n };\n\n /**\n * Member function to select the next item in a menu.\n * If the active item is the last in the menu, this function will loop to the\n * first menu item.\n *\n * @method moveDown\n * @param {Object} item is the active menu item\n * @param {String} startChr is the character to attempt to match against the beginning of the\n * menu item titles. If found, focus moves to the next menu item beginning with that character.\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveDown = function(item, startChr) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The number of items in the active menu.\n var menuNum = menuItems.length;\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n var newItemUL = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n\n if (item.attr('aria-haspopup') != 'true') {\n // No child menu to move to.\n return item;\n }\n\n // Move to the first item in the child menu.\n newItemUL = item.children('ul').first();\n newItem = newItemUL.children('li').first();\n\n // Make sure the child menu is visible.\n this.openSubMenu(newItemUL);\n\n return newItem;\n }\n\n // If $item is not the last item in its menu, move to the next item. If startChr is specified, move\n // to the next item with a title that begins with that character.\n if (startChr) {\n var match = false;\n var curNdx = menuIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (curNdx == menuNum) {\n curNdx = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (curNdx != menuIndex) {\n\n var titleChr = menuItems.eq(curNdx).html().charAt(0);\n\n if (titleChr.toLowerCase() == startChr) {\n match = true;\n break;\n }\n\n curNdx = curNdx + 1;\n\n if (curNdx == menuNum) {\n // Reached the end of the list, start again at the beginning.\n curNdx = 0;\n }\n }\n\n if (match === true) {\n newItem = menuItems.eq(curNdx);\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n } else {\n return item;\n }\n } else {\n if (menuIndex < menuNum - 1) {\n newItem = menuItems.eq(menuIndex + 1);\n } else {\n newItem = menuItems.first();\n }\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Function moveUp() is a member function to select the previous item in a menu.\n * If the active item is the first in the menu, this function will loop to the\n * last menu item.\n *\n * @method moveUp\n * @param {Object} item is the active menu item\n * @return {Object} Returns the item to move to. Returns item is no move is possible\n */\n Menubar.prototype.moveUp = function(item) {\n // Item's containing menu.\n var itemUL = item.parent();\n // The items in the currently active menu.\n var menuItems = itemUL.children('li').not('.separator');\n // The items index in its menu.\n var menuIndex = menuItems.index(item);\n var newItem = null;\n\n if (itemUL.is('.tool-lp-menu')) {\n // This is the root level menu.\n // Nothing to do.\n return item;\n }\n\n // If item is not the first item in its menu, move to the previous item.\n if (menuIndex > 0) {\n newItem = menuItems.eq(menuIndex - 1);\n } else {\n // Loop to top of menu.\n newItem = menuItems.last();\n }\n\n // Remove the focus styling from the current item.\n item.removeClass('menu-focus');\n\n return newItem;\n };\n\n /**\n * Enhance the dom with aria attributes.\n * @method addAriaAttributes\n */\n Menubar.prototype.addAriaAttributes = function() {\n this.menuRoot.attr('role', 'menubar');\n this.rootMenus.attr('role', 'menuitem');\n this.rootMenus.attr('tabindex', '0');\n this.rootMenus.attr('aria-haspopup', 'true');\n this.subMenus.attr('role', 'menu');\n this.subMenus.attr('aria-hidden', 'true');\n this.subMenuItems.attr('role', 'menuitem');\n this.subMenuItems.attr('tabindex', '-1');\n\n // For CSS styling and effects.\n this.menuRoot.addClass('tool-lp-menu');\n this.allItems.addClass('tool-lp-menu-item');\n this.rootMenus.addClass('tool-lp-root-menu');\n this.subMenus.addClass('tool-lp-sub-menu');\n this.subMenuItems.addClass('dropdown-item');\n };\n\n return /** @alias module:tool_lp/menubar */ {\n /**\n * Create a menu bar object for every node matching the selector.\n *\n * The expected DOM structure is shown below.\n *
    <- This is the target of the selector parameter.\n *
  • <- This is repeated for each top level menu.\n * Text <- This is the text for the top level menu.\n *
      <- This is a list of the entries in this top level menu.\n *
    • <- This is repeated for each menu entry.\n * Choice 1 <- The anchor for the menu.\n *
    • \n *
    \n *
  • \n *
\n *\n * @method enhance\n * @param {String} selector - The selector for the outer most menu node.\n * @param {Function} handler - Javascript handler for when a menu item was chosen. If the\n * handler returns true (or does not exist), the\n * menu will look for an anchor with a link to follow.\n * For example, if the menu entry has a \"data-action\" attribute\n * and we want to call a javascript function when that entry is chosen,\n * we could pass a list of handlers like this:\n * { \"[data-action='add']\" : callAddFunction }\n */\n enhance: function(selector, handler) {\n $(selector).each(function(index, element) {\n var menuRoot = $(element);\n // Don't enhance the same menu twice.\n if (menuRoot.data(\"menubarEnhanced\") !== true) {\n (new Menubar(menuRoot, handler));\n menuRoot.data(\"menubarEnhanced\", true);\n }\n });\n },\n\n /**\n * Handy function to close all open menus anywhere on the page.\n * @method closeAll\n */\n closeAll: closeAllSubMenus\n };\n});\n"],"file":"menubar.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/module_navigation.min.js b/admin/tool/lp/amd/build/module_navigation.min.js index db9d24184e8f3..917da94c8a0eb 100644 --- a/admin/tool/lp/amd/build/module_navigation.min.js +++ b/admin/tool/lp/amd/build/module_navigation.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(b,c,d,e){this._baseUrl=c,this._moduleId=e,this._courseId=d,a(b).on("change",this._moduleChanged.bind(this))};return b.prototype._moduleChanged=function(b){var c=a(b.target).val(),d="?mod="+c+"&courseid="+this._courseId;document.location=this._baseUrl+d},b.prototype._courseId=null,b.prototype._moduleId=null,b.prototype._baseUrl=null,b}); \ No newline at end of file +define ("tool_lp/module_navigation",["jquery"],function(a){var b=function(b,c,d,e){this._baseUrl=c;this._moduleId=e;this._courseId=d;a(b).on("change",this._moduleChanged.bind(this))};b.prototype._moduleChanged=function(b){var c=a(b.target).val(),d="?mod="+c+"&courseid="+this._courseId;document.location=this._baseUrl+d};b.prototype._courseId=null;b.prototype._moduleId=null;b.prototype._baseUrl=null;return b}); +//# sourceMappingURL=module_navigation.min.js.map diff --git a/admin/tool/lp/amd/build/module_navigation.min.js.map b/admin/tool/lp/amd/build/module_navigation.min.js.map new file mode 100644 index 0000000000000..000ae63662745 --- /dev/null +++ b/admin/tool/lp/amd/build/module_navigation.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/module_navigation.js"],"names":["define","$","ModuleNavigation","moduleSelector","baseUrl","courseId","moduleId","_baseUrl","_moduleId","_courseId","on","_moduleChanged","bind","prototype","e","newModuleId","target","val","queryStr","document","location"],"mappings":"AAuBAA,OAAM,6BAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAU3B,GAAIC,CAAAA,CAAgB,CAAG,SAASC,CAAT,CAAyBC,CAAzB,CAAkCC,CAAlC,CAA4CC,CAA5C,CAAsD,CACzE,KAAKC,QAAL,CAAgBH,CAAhB,CACA,KAAKI,SAAL,CAAiBF,CAAjB,CACA,KAAKG,SAAL,CAAiBJ,CAAjB,CAEAJ,CAAC,CAACE,CAAD,CAAD,CAAkBO,EAAlB,CAAqB,QAArB,CAA+B,KAAKC,cAAL,CAAoBC,IAApB,CAAyB,IAAzB,CAA/B,CACH,CAND,CAcAV,CAAgB,CAACW,SAAjB,CAA2BF,cAA3B,CAA4C,SAASG,CAAT,CAAY,IAChDC,CAAAA,CAAW,CAAGd,CAAC,CAACa,CAAC,CAACE,MAAH,CAAD,CAAYC,GAAZ,EADkC,CAEhDC,CAAQ,CAAG,QAAUH,CAAV,CAAwB,YAAxB,CAAuC,KAAKN,SAFP,CAGpDU,QAAQ,CAACC,QAAT,CAAoB,KAAKb,QAAL,CAAgBW,CACvC,CAJD,CAOAhB,CAAgB,CAACW,SAAjB,CAA2BJ,SAA3B,CAAuC,IAAvC,CAEAP,CAAgB,CAACW,SAAjB,CAA2BL,SAA3B,CAAuC,IAAvC,CAEAN,CAAgB,CAACW,SAAjB,CAA2BN,QAA3B,CAAsC,IAAtC,CAEA,MAAsDL,CAAAA,CACzD,CAtCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to navigation between users in a course.\n *\n * @package tool_lp\n * @copyright 2019 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * ModuleNavigation\n *\n * @param {String} moduleSelector The selector of the module element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} courseId The course id\n * @param {Number} moduleId The activity module (filter)\n */\n var ModuleNavigation = function(moduleSelector, baseUrl, courseId, moduleId) {\n this._baseUrl = baseUrl;\n this._moduleId = moduleId;\n this._courseId = courseId;\n\n $(moduleSelector).on('change', this._moduleChanged.bind(this));\n };\n\n /**\n * The module was changed in the select list.\n *\n * @method _moduleChanged\n * @param {Event} e the event\n */\n ModuleNavigation.prototype._moduleChanged = function(e) {\n var newModuleId = $(e.target).val();\n var queryStr = '?mod=' + newModuleId + '&courseid=' + this._courseId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @type {Number} The id of the course. */\n ModuleNavigation.prototype._courseId = null;\n /** @type {Number} The id of the module. */\n ModuleNavigation.prototype._moduleId = null;\n /** @type {String} Plugin base url. */\n ModuleNavigation.prototype._baseUrl = null;\n\n return /** @alias module:tool_lp/module_navigation */ ModuleNavigation;\n});\n"],"file":"module_navigation.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/parentcompetency_form.min.js b/admin/tool/lp/amd/build/parentcompetency_form.min.js index 4212884c3020c..87e8535bdcf58 100644 --- a/admin/tool/lp/amd/build/parentcompetency_form.min.js +++ b/admin/tool/lp/amd/build/parentcompetency_form.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/str","tool_lp/competencypicker","core/templates","core/notification"],function(a,b,c,d,e,f){var g=function(a,b,c,d,e){this.buttonSelector=a,this.inputHiddenSelector=b,this.staticElementSelector=c,this.frameworkId=d,this.pageContextId=e,this.registerEvents()};return g.prototype.buttonSelector=null,g.prototype.inputHiddenSelector=null,g.prototype.staticElementSelector=null,g.prototype.frameworkId=null,g.prototype.pageContextId=null,g.prototype.setParent=function(d){var e=this;0!==d.competencyId?b.call([{methodname:"core_competency_read_competency",args:{id:d.competencyId}}])[0].done(function(b){a(e.staticElementSelector).html(b.shortname),a(e.inputHiddenSelector).val(b.id)}).fail(f.exception):c.get_string("competencyframeworkroot","tool_lp").then(function(b){a(e.staticElementSelector).html(b),a(e.inputHiddenSelector).val(d.competencyId)}).fail(f.exception)},g.prototype.registerEvents=function(){var b=this;a(b.buttonSelector).on("click",function(a){a.preventDefault();var c=new d(b.pageContextId,b.frameworkId,"self",(!1));c._render=function(){var a=this;return a._preRender().then(function(){var b={competencies:a._competencies,framework:a._getFramework(a._frameworkId),frameworks:a._frameworks,search:a._searchText,singleFramework:a._singleFramework};return e.render("tool_lp/competency_picker_competencyform",b)})},c.on("save",function(a,c){b.setParent(c)}),c.display()})},{init:function(a,b,c,d,e){new g(a,b,c,d,e)}}}); \ No newline at end of file +define ("tool_lp/parentcompetency_form",["jquery","core/ajax","core/str","tool_lp/competencypicker","core/templates","core/notification"],function(a,b,c,d,e,f){var g=function(a,b,c,d,e){this.buttonSelector=a;this.inputHiddenSelector=b;this.staticElementSelector=c;this.frameworkId=d;this.pageContextId=e;this.registerEvents()};g.prototype.buttonSelector=null;g.prototype.inputHiddenSelector=null;g.prototype.staticElementSelector=null;g.prototype.frameworkId=null;g.prototype.pageContextId=null;g.prototype.setParent=function(d){var e=this;if(0!==d.competencyId){b.call([{methodname:"core_competency_read_competency",args:{id:d.competencyId}}])[0].done(function(b){a(e.staticElementSelector).html(b.shortname);a(e.inputHiddenSelector).val(b.id)}).fail(f.exception)}else{c.get_string("competencyframeworkroot","tool_lp").then(function(b){a(e.staticElementSelector).html(b);a(e.inputHiddenSelector).val(d.competencyId)}).fail(f.exception)}};g.prototype.registerEvents=function(){var b=this;a(b.buttonSelector).on("click",function(a){a.preventDefault();var c=new d(b.pageContextId,b.frameworkId,"self",!1);c._render=function(){var a=this;return a._preRender().then(function(){var b={competencies:a._competencies,framework:a._getFramework(a._frameworkId),frameworks:a._frameworks,search:a._searchText,singleFramework:a._singleFramework};return e.render("tool_lp/competency_picker_competencyform",b)})};c.on("save",function(a,c){b.setParent(c)});c.display()})};return{init:function init(a,b,c,d,e){new g(a,b,c,d,e)}}}); +//# sourceMappingURL=parentcompetency_form.min.js.map diff --git a/admin/tool/lp/amd/build/parentcompetency_form.min.js.map b/admin/tool/lp/amd/build/parentcompetency_form.min.js.map new file mode 100644 index 0000000000000..7939dd2054fba --- /dev/null +++ b/admin/tool/lp/amd/build/parentcompetency_form.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/parentcompetency_form.js"],"names":["define","$","ajax","Str","Picker","Templates","Notification","ParentCompetencyForm","buttonSelector","inputHiddenSelector","staticElementSelector","frameworkId","pageContextId","registerEvents","prototype","setParent","data","self","competencyId","call","methodname","args","id","done","competency","html","shortname","val","fail","exception","get_string","then","rootframework","on","e","preventDefault","picker","_render","_preRender","context","competencies","_competencies","framework","_getFramework","_frameworkId","frameworks","_frameworks","search","_searchText","singleFramework","_singleFramework","render","display","init","inputSelector"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle selecting parent competency in competency form.\n *\n * @module tool_lp/parentcompetency_form\n * @package tool_lp\n * @copyright 2015 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'tool_lp/competencypicker', 'core/templates', 'core/notification'],\n function($, ajax, Str, Picker, Templates, Notification) {\n\n /**\n * Parent Competency Form object.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputHiddenSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n */\n var ParentCompetencyForm = function(buttonSelector,\n inputHiddenSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n this.buttonSelector = buttonSelector;\n this.inputHiddenSelector = inputHiddenSelector;\n this.staticElementSelector = staticElementSelector;\n this.frameworkId = frameworkId;\n this.pageContextId = pageContextId;\n\n // Register the events.\n this.registerEvents();\n };\n\n /** @var {String} The parent competency button selector. */\n ParentCompetencyForm.prototype.buttonSelector = null;\n /** @var {String} The hidden input field selector. */\n ParentCompetencyForm.prototype.inputHiddenSelector = null;\n /** @var {String} The static element displaying the parent competency. */\n ParentCompetencyForm.prototype.staticElementSelector = null;\n /** @var {Number} The competency framework ID. */\n ParentCompetencyForm.prototype.frameworkId = null;\n /** @var {Number} The page context ID. */\n ParentCompetencyForm.prototype.pageContextId = null;\n\n /**\n * Set the parent competency in the competency form.\n *\n * @param {Object} data Data containing selected competency.\n * @method setParent\n */\n ParentCompetencyForm.prototype.setParent = function(data) {\n var self = this;\n\n if (data.competencyId !== 0) {\n ajax.call([\n {methodname: 'core_competency_read_competency', args: {\n id: data.competencyId\n }}\n ])[0].done(function(competency) {\n $(self.staticElementSelector).html(competency.shortname);\n $(self.inputHiddenSelector).val(competency.id);\n }).fail(Notification.exception);\n } else {\n // Root of competency framework selected.\n Str.get_string('competencyframeworkroot', 'tool_lp').then(function(rootframework) {\n $(self.staticElementSelector).html(rootframework);\n $(self.inputHiddenSelector).val(data.competencyId);\n return;\n }).fail(Notification.exception);\n }\n };\n\n /**\n * Register the events of parent competency button click.\n *\n * @method registerEvents\n */\n ParentCompetencyForm.prototype.registerEvents = function() {\n var self = this;\n\n // Event on edit parent button.\n $(self.buttonSelector).on('click', function(e) {\n e.preventDefault();\n\n var picker = new Picker(self.pageContextId, self.frameworkId, 'self', false);\n\n // Override the render method to make framework selectable.\n picker._render = function() {\n var self = this;\n return self._preRender().then(function() {\n var context = {\n competencies: self._competencies,\n framework: self._getFramework(self._frameworkId),\n frameworks: self._frameworks,\n search: self._searchText,\n singleFramework: self._singleFramework,\n };\n\n return Templates.render('tool_lp/competency_picker_competencyform', context);\n });\n };\n\n // On selected competency.\n picker.on('save', function(e, data) {\n self.setParent(data);\n });\n\n picker.display();\n });\n };\n\n return {\n\n /**\n * Main initialisation.\n * @param {String} buttonSelector The parent competency button selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} staticElementSelector The static element displaying the parent competency.\n * @param {Number} frameworkId The competency framework ID.\n * @param {Number} pageContextId The page context ID.\n * @method init\n */\n init: function(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId) {\n // Create instance.\n new ParentCompetencyForm(buttonSelector,\n inputSelector,\n staticElementSelector,\n frameworkId,\n pageContextId);\n }\n };\n});\n"],"file":"parentcompetency_form.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/planactions.min.js b/admin/tool/lp/amd/build/planactions.min.js index 8390ffa277053..4edcfa09f0698 100644 --- a/admin/tool/lp/amd/build/planactions.min.js +++ b/admin/tool/lp/amd/build/planactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/dialogue"],function(a,b,c,d,e,f,g){var h=function(a){if(this._type=a,"plan"===a)this._region='[data-region="plan-page"]',this._planNode='[data-region="plan-page"]',this._template="tool_lp/plan_page",this._contextMethod="tool_lp_data_for_plan_page";else{if("plans"!==a)throw new TypeError("Unexpected type.");this._region='[data-region="plans"]',this._planNode='[data-region="plan-node"]',this._template="tool_lp/plans_page",this._contextMethod="tool_lp_data_for_plans_page"}};return h.prototype._contextMethod=null,h.prototype._planNode=null,h.prototype._region=null,h.prototype._template=null,h.prototype._type=null,h.prototype._getContextArgs=function(a){var b=this,c={};return"plan"===b._type?c={planid:a.id}:"plans"===b._type&&(c={userid:a.userid}),c},h.prototype.refresh=function(b){var c=this._findPlanData(a(b));this._callAndRefresh([],c)},h.prototype._renderView=function(c){var d=this;return b.render(d._template,c).then(function(c,e){a(d._region).replaceWith(c),b.runTemplateJS(e)})},h.prototype._callAndRefresh=function(b,e){var f="tool_lp/planactions:_callAndRefresh-"+Math.floor(Math.random()*Math.floor(1e3));M.util.js_pending(f);var g=this;return b.push({methodname:g._contextMethod,args:g._getContextArgs(e)}),a.when.apply(a,c.call(b)).then(function(){return g._renderView(arguments[arguments.length-1])}).fail(d.exception).always(function(){return M.util.js_complete(f)})},h.prototype._doDelete=function(a){var b=this,c=[{methodname:"core_competency_delete_plan",args:{id:a.id}}];b._callAndRefresh(c,a)},h.prototype.deletePlan=function(a){var b,f=this;b=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]),b[0].done(function(b){e.get_strings([{key:"confirm",component:"moodle"},{key:"deleteplan",component:"tool_lp",param:b.name},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(b){d.confirm(b[0],b[1],b[2],b[3],function(){f._doDelete(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._doReopenPlan=function(a){var b=this,c=[{methodname:"core_competency_reopen_plan",args:{planid:a.id}}];b._callAndRefresh(c,a)},h.prototype.reopenPlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"reopenplanconfirm",component:"tool_lp",param:c.name},{key:"reopenplan",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doReopenPlan(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._doCompletePlan=function(a){var b=this,c=[{methodname:"core_competency_complete_plan",args:{planid:a.id}}];b._callAndRefresh(c,a)},h.prototype.completePlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"completeplanconfirm",component:"tool_lp",param:c.name},{key:"completeplan",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doCompletePlan(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._doUnlinkPlan=function(a){var b=this,c=[{methodname:"core_competency_unlink_plan_from_template",args:{planid:a.id}}];b._callAndRefresh(c,a)},h.prototype.unlinkPlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"unlinkplantemplateconfirm",component:"tool_lp",param:c.name},{key:"unlinkplantemplate",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doUnlinkPlan(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._doRequestReview=function(a){var b=[{methodname:"core_competency_plan_request_review",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.requestReview=function(a){this._doRequestReview(a)},h.prototype._doCancelReviewRequest=function(a){var b=[{methodname:"core_competency_plan_cancel_review_request",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.cancelReviewRequest=function(a){this._doCancelReviewRequest(a)},h.prototype._doStartReview=function(a){var b=[{methodname:"core_competency_plan_start_review",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.startReview=function(a){this._doStartReview(a)},h.prototype._doStopReview=function(a){var b=[{methodname:"core_competency_plan_stop_review",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.stopReview=function(a){this._doStopReview(a)},h.prototype._doApprove=function(a){var b=[{methodname:"core_competency_approve_plan",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.approve=function(a){this._doApprove(a)},h.prototype._doUnapprove=function(a){var b=[{methodname:"core_competency_unapprove_plan",args:{id:a.id}}];this._callAndRefresh(b,a)},h.prototype.unapprove=function(a){this._doUnapprove(a)},h.prototype._showLinkedCoursesHandler=function(f){f.preventDefault();var h=a(f.target).data("id"),i=c.call([{methodname:"tool_lp_list_courses_using_competency",args:{id:h}}]);i[0].done(function(a){var c={courses:a};b.render("tool_lp/linked_courses_summary",c).done(function(a){e.get_string("linkedcourses","tool_lp").done(function(b){new g(b,a)}).fail(d.exception)}).fail(d.exception)}).fail(d.exception)},h.prototype._eventHandler=function(b,c){c.preventDefault();var d=this._findPlanData(a(c.target));this[b](d)},h.prototype._findPlanData=function(b){var c,d=b.parentsUntil(a(this._region).parent(),this._planNode);if(1!=d.length)throw new Error("The plan node was not located.");if(c=d.data(),"undefined"==typeof c||"undefined"==typeof c.id)throw new Error("Plan data could not be found.");return c},h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="plan-delete"]':this._eventHandler.bind(this,"deletePlan"),'[data-action="plan-complete"]':this._eventHandler.bind(this,"completePlan"),'[data-action="plan-reopen"]':this._eventHandler.bind(this,"reopenPlan"),'[data-action="plan-unlink"]':this._eventHandler.bind(this,"unlinkPlan"),'[data-action="plan-request-review"]':this._eventHandler.bind(this,"requestReview"),'[data-action="plan-cancel-review-request"]':this._eventHandler.bind(this,"cancelReviewRequest"),'[data-action="plan-start-review"]':this._eventHandler.bind(this,"startReview"),'[data-action="plan-stop-review"]':this._eventHandler.bind(this,"stopReview"),'[data-action="plan-approve"]':this._eventHandler.bind(this,"approve"),'[data-action="plan-unapprove"]':this._eventHandler.bind(this,"unapprove")})},h.prototype.registerEvents=function(){var b=a(this._region);b.find('[data-action="plan-delete"]').click(this._eventHandler.bind(this,"deletePlan")),b.find('[data-action="plan-complete"]').click(this._eventHandler.bind(this,"completePlan")),b.find('[data-action="plan-reopen"]').click(this._eventHandler.bind(this,"reopenPlan")),b.find('[data-action="plan-unlink"]').click(this._eventHandler.bind(this,"unlinkPlan")),b.find('[data-action="plan-request-review"]').click(this._eventHandler.bind(this,"requestReview")),b.find('[data-action="plan-cancel-review-request"]').click(this._eventHandler.bind(this,"cancelReviewRequest")),b.find('[data-action="plan-start-review"]').click(this._eventHandler.bind(this,"startReview")),b.find('[data-action="plan-stop-review"]').click(this._eventHandler.bind(this,"stopReview")),b.find('[data-action="plan-approve"]').click(this._eventHandler.bind(this,"approve")),b.find('[data-action="plan-unapprove"]').click(this._eventHandler.bind(this,"unapprove")),b.find('[data-action="find-courses-link"]').click(this._showLinkedCoursesHandler.bind(this))},h}); \ No newline at end of file +define ("tool_lp/planactions",["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/dialogue"],function(a,b,c,d,e,f,g){var h=function(a){this._type=a;if("plan"===a){this._region="[data-region=\"plan-page\"]";this._planNode="[data-region=\"plan-page\"]";this._template="tool_lp/plan_page";this._contextMethod="tool_lp_data_for_plan_page"}else if("plans"===a){this._region="[data-region=\"plans\"]";this._planNode="[data-region=\"plan-node\"]";this._template="tool_lp/plans_page";this._contextMethod="tool_lp_data_for_plans_page"}else{throw new TypeError("Unexpected type.")}};h.prototype._contextMethod=null;h.prototype._planNode=null;h.prototype._region=null;h.prototype._template=null;h.prototype._type=null;h.prototype._getContextArgs=function(a){var b=this,c={};if("plan"===b._type){c={planid:a.id}}else if("plans"===b._type){c={userid:a.userid}}return c};h.prototype.refresh=function(b){var c=this._findPlanData(a(b));this._callAndRefresh([],c)};h.prototype._renderView=function(c){var d=this;return b.render(d._template,c).then(function(c,e){a(d._region).replaceWith(c);b.runTemplateJS(e)})};h.prototype._callAndRefresh=function(b,e){var f="tool_lp/planactions:_callAndRefresh-"+Math.floor(Math.random()*Math.floor(1e3));M.util.js_pending(f);var g=this;b.push({methodname:g._contextMethod,args:g._getContextArgs(e)});return a.when.apply(a,c.call(b)).then(function(){return g._renderView(arguments[arguments.length-1])}).fail(d.exception).always(function(){return M.util.js_complete(f)})};h.prototype._doDelete=function(a){var b=this,c=[{methodname:"core_competency_delete_plan",args:{id:a.id}}];b._callAndRefresh(c,a)};h.prototype.deletePlan=function(a){var b=this,f;f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"deleteplan",component:"tool_lp",param:c.name},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doDelete(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._doReopenPlan=function(a){var b=this,c=[{methodname:"core_competency_reopen_plan",args:{planid:a.id}}];b._callAndRefresh(c,a)};h.prototype.reopenPlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"reopenplanconfirm",component:"tool_lp",param:c.name},{key:"reopenplan",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doReopenPlan(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._doCompletePlan=function(a){var b=this,c=[{methodname:"core_competency_complete_plan",args:{planid:a.id}}];b._callAndRefresh(c,a)};h.prototype.completePlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"completeplanconfirm",component:"tool_lp",param:c.name},{key:"completeplan",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doCompletePlan(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._doUnlinkPlan=function(a){var b=this,c=[{methodname:"core_competency_unlink_plan_from_template",args:{planid:a.id}}];b._callAndRefresh(c,a)};h.prototype.unlinkPlan=function(a){var b=this,f=c.call([{methodname:"core_competency_read_plan",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"unlinkplantemplateconfirm",component:"tool_lp",param:c.name},{key:"unlinkplantemplate",component:"tool_lp"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doUnlinkPlan(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._doRequestReview=function(a){var b=[{methodname:"core_competency_plan_request_review",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.requestReview=function(a){this._doRequestReview(a)};h.prototype._doCancelReviewRequest=function(a){var b=[{methodname:"core_competency_plan_cancel_review_request",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.cancelReviewRequest=function(a){this._doCancelReviewRequest(a)};h.prototype._doStartReview=function(a){var b=[{methodname:"core_competency_plan_start_review",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.startReview=function(a){this._doStartReview(a)};h.prototype._doStopReview=function(a){var b=[{methodname:"core_competency_plan_stop_review",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.stopReview=function(a){this._doStopReview(a)};h.prototype._doApprove=function(a){var b=[{methodname:"core_competency_approve_plan",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.approve=function(a){this._doApprove(a)};h.prototype._doUnapprove=function(a){var b=[{methodname:"core_competency_unapprove_plan",args:{id:a.id}}];this._callAndRefresh(b,a)};h.prototype.unapprove=function(a){this._doUnapprove(a)};h.prototype._showLinkedCoursesHandler=function(f){f.preventDefault();var h=a(f.target).data("id"),i=c.call([{methodname:"tool_lp_list_courses_using_competency",args:{id:h}}]);i[0].done(function(a){b.render("tool_lp/linked_courses_summary",{courses:a}).done(function(a){e.get_string("linkedcourses","tool_lp").done(function(b){new g(b,a)}).fail(d.exception)}).fail(d.exception)}).fail(d.exception)};h.prototype._eventHandler=function(b,c){c.preventDefault();var d=this._findPlanData(a(c.target));this[b](d)};h.prototype._findPlanData=function(b){var c=b.parentsUntil(a(this._region).parent(),this._planNode),d;if(1!=c.length){throw new Error("The plan node was not located.")}d=c.data();if("undefined"==typeof d||"undefined"==typeof d.id){throw new Error("Plan data could not be found.")}return d};h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="plan-delete"]':this._eventHandler.bind(this,"deletePlan"),'[data-action="plan-complete"]':this._eventHandler.bind(this,"completePlan"),'[data-action="plan-reopen"]':this._eventHandler.bind(this,"reopenPlan"),'[data-action="plan-unlink"]':this._eventHandler.bind(this,"unlinkPlan"),'[data-action="plan-request-review"]':this._eventHandler.bind(this,"requestReview"),'[data-action="plan-cancel-review-request"]':this._eventHandler.bind(this,"cancelReviewRequest"),'[data-action="plan-start-review"]':this._eventHandler.bind(this,"startReview"),'[data-action="plan-stop-review"]':this._eventHandler.bind(this,"stopReview"),'[data-action="plan-approve"]':this._eventHandler.bind(this,"approve"),'[data-action="plan-unapprove"]':this._eventHandler.bind(this,"unapprove")})};h.prototype.registerEvents=function(){var b=a(this._region);b.find("[data-action=\"plan-delete\"]").click(this._eventHandler.bind(this,"deletePlan"));b.find("[data-action=\"plan-complete\"]").click(this._eventHandler.bind(this,"completePlan"));b.find("[data-action=\"plan-reopen\"]").click(this._eventHandler.bind(this,"reopenPlan"));b.find("[data-action=\"plan-unlink\"]").click(this._eventHandler.bind(this,"unlinkPlan"));b.find("[data-action=\"plan-request-review\"]").click(this._eventHandler.bind(this,"requestReview"));b.find("[data-action=\"plan-cancel-review-request\"]").click(this._eventHandler.bind(this,"cancelReviewRequest"));b.find("[data-action=\"plan-start-review\"]").click(this._eventHandler.bind(this,"startReview"));b.find("[data-action=\"plan-stop-review\"]").click(this._eventHandler.bind(this,"stopReview"));b.find("[data-action=\"plan-approve\"]").click(this._eventHandler.bind(this,"approve"));b.find("[data-action=\"plan-unapprove\"]").click(this._eventHandler.bind(this,"unapprove"));b.find("[data-action=\"find-courses-link\"]").click(this._showLinkedCoursesHandler.bind(this))};return h}); +//# sourceMappingURL=planactions.min.js.map diff --git a/admin/tool/lp/amd/build/planactions.min.js.map b/admin/tool/lp/amd/build/planactions.min.js.map new file mode 100644 index 0000000000000..5fcba7c5e344f --- /dev/null +++ b/admin/tool/lp/amd/build/planactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/planactions.js"],"names":["define","$","templates","ajax","notification","str","Menubar","Dialogue","PlanActions","type","_type","_region","_planNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","planData","self","args","planid","id","userid","refresh","selector","_findPlanData","_callAndRefresh","_renderView","context","render","then","newhtml","newjs","replaceWith","runTemplateJS","calls","callKey","Math","floor","random","M","util","js_pending","push","methodname","when","apply","call","arguments","length","fail","exception","always","js_complete","_doDelete","deletePlan","requests","done","plan","get_strings","key","component","param","name","strings","confirm","_doReopenPlan","reopenPlan","_doCompletePlan","completePlan","_doUnlinkPlan","unlinkPlan","_doRequestReview","requestReview","_doCancelReviewRequest","cancelReviewRequest","_doStartReview","startReview","_doStopReview","stopReview","_doApprove","approve","_doUnapprove","unapprove","_showLinkedCoursesHandler","e","preventDefault","competencyid","target","data","courses","html","get_string","linkedcourses","_eventHandler","method","node","parent","parentsUntil","Error","enhanceMenubar","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Plan actions via ajax.\n *\n * @module tool_lp/planactions\n * @package tool_lp\n * @copyright 2015 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/dialogue'],\n function($, templates, ajax, notification, str, Menubar, Dialogue) {\n\n /**\n * PlanActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var PlanActions = function(type) {\n this._type = type;\n\n if (type === 'plan') {\n // This is the page to view one plan.\n this._region = '[data-region=\"plan-page\"]';\n this._planNode = '[data-region=\"plan-page\"]';\n this._template = 'tool_lp/plan_page';\n this._contextMethod = 'tool_lp_data_for_plan_page';\n\n } else if (type === 'plans') {\n // This is the page to view a list of plans.\n this._region = '[data-region=\"plans\"]';\n this._planNode = '[data-region=\"plan-node\"]';\n this._template = 'tool_lp/plans_page';\n this._contextMethod = 'tool_lp_data_for_plans_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @type {String} Ajax method to fetch the page data from. */\n PlanActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the plan. */\n PlanActions.prototype._planNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n PlanActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n PlanActions.prototype._template = null;\n /** @type {String} Type of page/region we're in. */\n PlanActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} planData Plan data from plan node.\n * @return {Object} List of arguments.\n */\n PlanActions.prototype._getContextArgs = function(planData) {\n var self = this,\n args = {};\n\n if (self._type === 'plan') {\n args = {\n planid: planData.id\n };\n\n } else if (self._type === 'plans') {\n args = {\n userid: planData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Refresh the plan view.\n *\n * This is useful when you only want to refresh the view.\n *\n * @param {String} selector The node to search the plan data from.\n */\n PlanActions.prototype.refresh = function(selector) {\n var planData = this._findPlanData($(selector));\n this._callAndRefresh([], planData);\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n PlanActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n $(self._region).replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} planData Plan data from plan node.\n * @return {Promise}\n */\n PlanActions.prototype._callAndRefresh = function(calls, planData) {\n // Because this function causes a refresh, we must track the JS completion from start to finish to prevent\n // stale reference issues in Behat.\n var callKey = 'tool_lp/planactions:_callAndRefresh-' + Math.floor(Math.random() * Math.floor(1000));\n M.util.js_pending(callKey);\n\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(planData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception)\n .always(function() {\n return M.util.js_complete(callKey);\n });\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doDelete = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_plan',\n args: {id: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.deletePlan = function(planData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteplan', component: 'tool_lp', param: plan.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete plan X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Reopen plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doReopenPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_reopen_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Reopen a plan.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.reopenPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'reopenplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'reopenplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Reopen plan X?\n strings[2], // Reopen.\n strings[3], // Cancel.\n function() {\n self._doReopenPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Complete plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doCompletePlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_complete_plan',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Complete a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.completePlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'completeplanconfirm', component: 'tool_lp', param: plan.name},\n {key: 'completeplan', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Complete plan X?\n strings[2], // Complete.\n strings[3], // Cancel.\n function() {\n self._doCompletePlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Unlink plan and reload the region.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype._doUnlinkPlan = function(planData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_unlink_plan_from_template',\n args: {planid: planData.id}\n }];\n self._callAndRefresh(calls, planData);\n };\n\n /**\n * Unlink a plan process.\n *\n * @param {Object} planData Plan data from plan node.\n */\n PlanActions.prototype.unlinkPlan = function(planData) {\n var self = this,\n requests = ajax.call([{\n methodname: 'core_competency_read_plan',\n args: {id: planData.id}\n }]);\n\n requests[0].done(function(plan) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'unlinkplantemplateconfirm', component: 'tool_lp', param: plan.name},\n {key: 'unlinkplantemplate', component: 'tool_lp'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Unlink plan X?\n strings[2], // Unlink.\n strings[3], // Cancel.\n function() {\n self._doUnlinkPlan(planData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doRequestReview\n */\n PlanActions.prototype._doRequestReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_request_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Request review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method requestReview\n */\n PlanActions.prototype.requestReview = function(planData) {\n this._doRequestReview(planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doCancelReviewRequest\n */\n PlanActions.prototype._doCancelReviewRequest = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_cancel_review_request',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Cancel review request of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method cancelReviewRequest\n */\n PlanActions.prototype.cancelReviewRequest = function(planData) {\n this._doCancelReviewRequest(planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStartReview\n */\n PlanActions.prototype._doStartReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_start_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Start review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method startReview\n */\n PlanActions.prototype.startReview = function(planData) {\n this._doStartReview(planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doStopReview\n */\n PlanActions.prototype._doStopReview = function(planData) {\n var calls = [{\n methodname: 'core_competency_plan_stop_review',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Stop review of a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method stopReview\n */\n PlanActions.prototype.stopReview = function(planData) {\n this._doStopReview(planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doApprove\n */\n PlanActions.prototype._doApprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_approve_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Approve a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method approve\n */\n PlanActions.prototype.approve = function(planData) {\n this._doApprove(planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method _doUnapprove\n */\n PlanActions.prototype._doUnapprove = function(planData) {\n var calls = [{\n methodname: 'core_competency_unapprove_plan',\n args: {\n id: planData.id\n }\n }];\n this._callAndRefresh(calls, planData);\n };\n\n /**\n * Unapprove a plan.\n *\n * @param {Object} planData Plan data from plan node.\n * @method unapprove\n */\n PlanActions.prototype.unapprove = function(planData) {\n this._doUnapprove(planData);\n };\n\n /**\n * Display list of linked courses on a modal dialogue.\n *\n * @param {Event} e The event.\n */\n PlanActions.prototype._showLinkedCoursesHandler = function(e) {\n e.preventDefault();\n\n var competencyid = $(e.target).data('id');\n var requests = ajax.call([{\n methodname: 'tool_lp_list_courses_using_competency',\n args: {id: competencyid}\n }]);\n\n requests[0].done(function(courses) {\n var context = {\n courses: courses\n };\n templates.render('tool_lp/linked_courses_summary', context).done(function(html) {\n str.get_string('linkedcourses', 'tool_lp').done(function(linkedcourses) {\n new Dialogue(\n linkedcourses, // Title.\n html // The linked courses.\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Plan event handler.\n *\n * @param {String} method The method to call.\n * @param {Event} e The event.\n * @method _eventHandler\n */\n PlanActions.prototype._eventHandler = function(method, e) {\n e.preventDefault();\n var data = this._findPlanData($(e.target));\n this[method](data);\n };\n\n /**\n * Find the plan data from the plan node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Plan data.\n */\n PlanActions.prototype._findPlanData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._planNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The plan node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Plan data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n PlanActions.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"plan-delete\"]': this._eventHandler.bind(this, 'deletePlan'),\n '[data-action=\"plan-complete\"]': this._eventHandler.bind(this, 'completePlan'),\n '[data-action=\"plan-reopen\"]': this._eventHandler.bind(this, 'reopenPlan'),\n '[data-action=\"plan-unlink\"]': this._eventHandler.bind(this, 'unlinkPlan'),\n '[data-action=\"plan-request-review\"]': this._eventHandler.bind(this, 'requestReview'),\n '[data-action=\"plan-cancel-review-request\"]': this._eventHandler.bind(this, 'cancelReviewRequest'),\n '[data-action=\"plan-start-review\"]': this._eventHandler.bind(this, 'startReview'),\n '[data-action=\"plan-stop-review\"]': this._eventHandler.bind(this, 'stopReview'),\n '[data-action=\"plan-approve\"]': this._eventHandler.bind(this, 'approve'),\n '[data-action=\"plan-unapprove\"]': this._eventHandler.bind(this, 'unapprove'),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n PlanActions.prototype.registerEvents = function() {\n var wrapper = $(this._region);\n\n wrapper.find('[data-action=\"plan-delete\"]').click(this._eventHandler.bind(this, 'deletePlan'));\n wrapper.find('[data-action=\"plan-complete\"]').click(this._eventHandler.bind(this, 'completePlan'));\n wrapper.find('[data-action=\"plan-reopen\"]').click(this._eventHandler.bind(this, 'reopenPlan'));\n wrapper.find('[data-action=\"plan-unlink\"]').click(this._eventHandler.bind(this, 'unlinkPlan'));\n\n wrapper.find('[data-action=\"plan-request-review\"]').click(this._eventHandler.bind(this, 'requestReview'));\n wrapper.find('[data-action=\"plan-cancel-review-request\"]').click(this._eventHandler.bind(this, 'cancelReviewRequest'));\n wrapper.find('[data-action=\"plan-start-review\"]').click(this._eventHandler.bind(this, 'startReview'));\n wrapper.find('[data-action=\"plan-stop-review\"]').click(this._eventHandler.bind(this, 'stopReview'));\n wrapper.find('[data-action=\"plan-approve\"]').click(this._eventHandler.bind(this, 'approve'));\n wrapper.find('[data-action=\"plan-unapprove\"]').click(this._eventHandler.bind(this, 'unapprove'));\n\n wrapper.find('[data-action=\"find-courses-link\"]').click(this._showLinkedCoursesHandler.bind(this));\n };\n\n return PlanActions;\n});\n"],"file":"planactions.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/scaleconfig.min.js b/admin/tool/lp/amd/build/scaleconfig.min.js index 4c5b700ef9d9a..3e275c29b910a 100644 --- a/admin/tool/lp/amd/build/scaleconfig.min.js +++ b/admin/tool/lp/amd/build/scaleconfig.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/templates","core/ajax","tool_lp/dialogue","tool_lp/scalevalues"],function(a,b,c,d,e,f){var g=function(b,c,d){this.selectSelector=b,this.inputSelector=c,this.triggerSelector=d,this.originalscaleid=a(b).val(),a(b).on("change",this.scaleChangeHandler.bind(this)).change(),a(d).click(this.showConfig.bind(this))};return g.prototype.selectSelector=null,g.prototype.inputSelector=null,g.prototype.triggerSelector=null,g.prototype.scalevalues=null,g.prototype.originalscaleid=0,g.prototype.scaleid=0,g.prototype.popup=null,g.prototype.showConfig=function(){var d=this;if(this.scaleid=a(this.selectSelector).val(),!(this.scaleid<=0)){var f=a(this.selectSelector).find("option:selected").text();this.getScaleValues(this.scaleid).done(function(){var a={scalename:f,scales:d.scalevalues};c.render("tool_lp/scale_configuration_page",a).done(function(a){new e(f,a,d.initScaleConfig.bind(d))}).fail(b.exception)}).fail(b.exception)}},g.prototype.retrieveOriginalScaleConfig=function(){var b=a(this.inputSelector).val();if(""!==b){var c=a.parseJSON(b),d=c.shift();if(d.scaleid===this.originalscaleid)return c}return""},g.prototype.initScaleConfig=function(b){this.popup=b;var c=a(b.getContent());if(this.originalscaleid===this.scaleid){var d=this.retrieveOriginalScaleConfig();""!==d&&d.forEach(function(a){1===a.scaledefault&&c.find('[data-field="tool_lp_scale_default_'+a.id+'"]').attr("checked",!0),1===a.proficient&&c.find('[data-field="tool_lp_scale_proficient_'+a.id+'"]').attr("checked",!0)})}c.on("click",'[data-action="close"]',function(){this.setScaleConfig(),b.close()}.bind(this)),c.on("click",'[data-action="cancel"]',function(){b.close()})},g.prototype.setScaleConfig=function(){var b=a(this.popup.getContent()),c=[{scaleid:this.scaleid}];this.scalevalues.forEach(function(a){var d=0,e=0;b.find('[data-field="tool_lp_scale_default_'+a.id+'"]').is(":checked")&&(d=1),b.find('[data-field="tool_lp_scale_proficient_'+a.id+'"]').is(":checked")&&(e=1),(d||e)&&c.push({id:a.id,scaledefault:d,proficient:e})});var d=JSON.stringify(c);a(this.inputSelector).val(d),this.originalscaleid=this.scaleid},g.prototype.getScaleValues=function(a){return f.get_values(a).then(function(a){return this.scalevalues=a,a}.bind(this))},g.prototype.scaleChangeHandler=function(b){a(b.target).val()<=0?a(this.triggerSelector).prop("disabled",!0):a(this.triggerSelector).prop("disabled",!1)},{init:function(a,b,c){return new g(a,b,c)}}}); \ No newline at end of file +define ("tool_lp/scaleconfig",["jquery","core/notification","core/templates","core/ajax","tool_lp/dialogue","tool_lp/scalevalues"],function(a,b,c,d,e,f){var g=function(b,c,d){this.selectSelector=b;this.inputSelector=c;this.triggerSelector=d;this.originalscaleid=a(b).val();a(b).on("change",this.scaleChangeHandler.bind(this)).change();a(d).click(this.showConfig.bind(this))};g.prototype.selectSelector=null;g.prototype.inputSelector=null;g.prototype.triggerSelector=null;g.prototype.scalevalues=null;g.prototype.originalscaleid=0;g.prototype.scaleid=0;g.prototype.popup=null;g.prototype.showConfig=function(){var d=this;this.scaleid=a(this.selectSelector).val();if(0>=this.scaleid){return}var f=a(this.selectSelector).find("option:selected").text();this.getScaleValues(this.scaleid).done(function(){var a={scalename:f,scales:d.scalevalues};c.render("tool_lp/scale_configuration_page",a).done(function(a){new e(f,a,d.initScaleConfig.bind(d))}).fail(b.exception)}).fail(b.exception)};g.prototype.retrieveOriginalScaleConfig=function(){var b=a(this.inputSelector).val();if(""!==b){var c=a.parseJSON(b),d=c.shift();if(d.scaleid===this.originalscaleid){return c}}return""};g.prototype.initScaleConfig=function(b){this.popup=b;var c=a(b.getContent());if(this.originalscaleid===this.scaleid){var d=this.retrieveOriginalScaleConfig();if(""!==d){d.forEach(function(a){if(1===a.scaledefault){c.find("[data-field=\"tool_lp_scale_default_"+a.id+"\"]").attr("checked",!0)}if(1===a.proficient){c.find("[data-field=\"tool_lp_scale_proficient_"+a.id+"\"]").attr("checked",!0)}})}}c.on("click","[data-action=\"close\"]",function(){this.setScaleConfig();b.close()}.bind(this));c.on("click","[data-action=\"cancel\"]",function(){b.close()})};g.prototype.setScaleConfig=function(){var b=a(this.popup.getContent()),c=[{scaleid:this.scaleid}];this.scalevalues.forEach(function(a){var d=0,e=0;if(b.find("[data-field=\"tool_lp_scale_default_"+a.id+"\"]").is(":checked")){d=1}if(b.find("[data-field=\"tool_lp_scale_proficient_"+a.id+"\"]").is(":checked")){e=1}if(!d&&!e){return}c.push({id:a.id,scaledefault:d,proficient:e})});var d=JSON.stringify(c);a(this.inputSelector).val(d);this.originalscaleid=this.scaleid};g.prototype.getScaleValues=function(a){return f.get_values(a).then(function(a){this.scalevalues=a;return a}.bind(this))};g.prototype.scaleChangeHandler=function(b){if(0>=a(b.target).val()){a(this.triggerSelector).prop("disabled",!0)}else{a(this.triggerSelector).prop("disabled",!1)}};return{init:function init(a,b,c){return new g(a,b,c)}}}); +//# sourceMappingURL=scaleconfig.min.js.map diff --git a/admin/tool/lp/amd/build/scaleconfig.min.js.map b/admin/tool/lp/amd/build/scaleconfig.min.js.map new file mode 100644 index 0000000000000..e5cae05321623 --- /dev/null +++ b/admin/tool/lp/amd/build/scaleconfig.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/scaleconfig.js"],"names":["define","$","notification","templates","ajax","Dialogue","ModScaleValues","ScaleConfig","selectSelector","inputSelector","triggerSelector","originalscaleid","val","on","scaleChangeHandler","bind","change","click","showConfig","prototype","scalevalues","scaleid","popup","self","scalename","find","text","getScaleValues","done","context","scales","render","html","initScaleConfig","fail","exception","retrieveOriginalScaleConfig","jsonstring","scaleconfiguration","parseJSON","scaledetail","shift","body","getContent","currentconfig","forEach","value","scaledefault","id","attr","proficient","setScaleConfig","close","data","is","push","datastring","JSON","stringify","get_values","then","values","e","target","prop","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle opening a dialogue to configure scale data.\n *\n * @module tool_lp/scaleconfig\n * @package tool_lp\n * @copyright 2015 Adrian Greeve \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/notification', 'core/templates', 'core/ajax', 'tool_lp/dialogue', 'tool_lp/scalevalues'],\n function($, notification, templates, ajax, Dialogue, ModScaleValues) {\n\n /**\n * Scale config object.\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n */\n var ScaleConfig = function(selectSelector, inputSelector, triggerSelector) {\n this.selectSelector = selectSelector;\n this.inputSelector = inputSelector;\n this.triggerSelector = triggerSelector;\n\n // Get the current scale ID.\n this.originalscaleid = $(selectSelector).val();\n $(selectSelector).on('change', this.scaleChangeHandler.bind(this)).change();\n $(triggerSelector).click(this.showConfig.bind(this));\n };\n\n /** @var {String} The select box selector. */\n ScaleConfig.prototype.selectSelector = null;\n /** @var {String} The hidden field selector. */\n ScaleConfig.prototype.inputSelector = null;\n /** @var {String} The trigger selector. */\n ScaleConfig.prototype.triggerSelector = null;\n /** @var {Array} scalevalues ID and name of the scales. */\n ScaleConfig.prototype.scalevalues = null;\n /** @var {Number) originalscaleid Original scale ID when the page loads. */\n ScaleConfig.prototype.originalscaleid = 0;\n /** @var {Number} scaleid Current scale ID. */\n ScaleConfig.prototype.scaleid = 0;\n /** @var {Dialogue} Reference to the popup. */\n ScaleConfig.prototype.popup = null;\n\n /**\n * Displays the scale configuration dialogue.\n *\n * @method showConfig\n */\n ScaleConfig.prototype.showConfig = function() {\n var self = this;\n\n this.scaleid = $(this.selectSelector).val();\n if (this.scaleid <= 0) {\n // This should not happen.\n return;\n }\n\n var scalename = $(this.selectSelector).find(\"option:selected\").text();\n this.getScaleValues(this.scaleid).done(function() {\n\n var context = {\n scalename: scalename,\n scales: self.scalevalues\n };\n\n // Dish up the form.\n templates.render('tool_lp/scale_configuration_page', context)\n .done(function(html) {\n new Dialogue(\n scalename,\n html,\n self.initScaleConfig.bind(self)\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Gets the original scale configuration if it was set.\n *\n * @method retrieveOriginalScaleConfig\n * @return {Object|String} scale configuration or empty string.\n */\n ScaleConfig.prototype.retrieveOriginalScaleConfig = function() {\n var jsonstring = $(this.inputSelector).val();\n if (jsonstring !== '') {\n var scaleconfiguration = $.parseJSON(jsonstring);\n // The first object should contain the scale ID for the configuration.\n var scaledetail = scaleconfiguration.shift();\n // Check that this scale id matches the one from the page before returning the configuration.\n if (scaledetail.scaleid === this.originalscaleid) {\n return scaleconfiguration;\n }\n }\n return '';\n };\n\n /**\n * Initialises the scale configuration dialogue.\n *\n * @method initScaleConfig\n * @param {Dialogue} popup Dialogue object to initialise.\n */\n ScaleConfig.prototype.initScaleConfig = function(popup) {\n this.popup = popup;\n var body = $(popup.getContent());\n if (this.originalscaleid === this.scaleid) {\n // Set up the popup to show the current configuration.\n var currentconfig = this.retrieveOriginalScaleConfig();\n // Set up the form only if there is configuration settings to set.\n if (currentconfig !== '') {\n currentconfig.forEach(function(value) {\n if (value.scaledefault === 1) {\n body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').attr('checked', true);\n }\n if (value.proficient === 1) {\n body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').attr('checked', true);\n }\n });\n }\n }\n body.on('click', '[data-action=\"close\"]', function() {\n this.setScaleConfig();\n popup.close();\n }.bind(this));\n body.on('click', '[data-action=\"cancel\"]', function() {\n popup.close();\n });\n };\n\n /**\n * Set the scale configuration back into a JSON string in the hidden element.\n *\n * @method setScaleConfig\n */\n ScaleConfig.prototype.setScaleConfig = function() {\n var body = $(this.popup.getContent());\n // Get the data.\n var data = [{scaleid: this.scaleid}];\n this.scalevalues.forEach(function(value) {\n var scaledefault = 0;\n var proficient = 0;\n if (body.find('[data-field=\"tool_lp_scale_default_' + value.id + '\"]').is(':checked')) {\n scaledefault = 1;\n }\n if (body.find('[data-field=\"tool_lp_scale_proficient_' + value.id + '\"]').is(':checked')) {\n proficient = 1;\n }\n\n if (!scaledefault && !proficient) {\n return;\n }\n\n data.push({\n id: value.id,\n scaledefault: scaledefault,\n proficient: proficient\n });\n });\n var datastring = JSON.stringify(data);\n // Send to the hidden field on the form.\n $(this.inputSelector).val(datastring);\n // Once the configuration has been saved then the original scale ID is set to the current scale ID.\n this.originalscaleid = this.scaleid;\n };\n\n /**\n * Get the scale values for the selected scale.\n *\n * @method getScaleValues\n * @param {Number} scaleid The scale ID of the selected scale.\n * @return {Promise} A deffered object with the scale values.\n */\n ScaleConfig.prototype.getScaleValues = function(scaleid) {\n return ModScaleValues.get_values(scaleid).then(function(values) {\n this.scalevalues = values;\n return values;\n }.bind(this));\n };\n\n /**\n * Triggered when a scale is selected.\n *\n * @name scaleChangeHandler\n * @param {Event} e\n * @function\n */\n ScaleConfig.prototype.scaleChangeHandler = function(e) {\n if ($(e.target).val() <= 0) {\n $(this.triggerSelector).prop('disabled', true);\n } else {\n $(this.triggerSelector).prop('disabled', false);\n }\n\n };\n\n return {\n\n /**\n * Main initialisation.\n *\n * @param {String} selectSelector The select box selector.\n * @param {String} inputSelector The hidden input field selector.\n * @param {String} triggerSelector The trigger selector.\n * @return {ScaleConfig} A new instance of ScaleConfig.\n * @method init\n */\n init: function(selectSelector, inputSelector, triggerSelector) {\n return new ScaleConfig(selectSelector, inputSelector, triggerSelector);\n }\n };\n});\n"],"file":"scaleconfig.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/scalevalues.min.js b/admin/tool/lp/amd/build/scalevalues.min.js index 53c3286bc31a7..637c17fb289b1 100644 --- a/admin/tool/lp/amd/build/scalevalues.min.js +++ b/admin/tool/lp/amd/build/scalevalues.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax"],function(a,b){var c=[];return{get_values:function(d){var e=a.Deferred();return"undefined"==typeof c[d]?b.call([{methodname:"core_competency_get_scale_values",args:{scaleid:d},done:function(a){c[d]=a,e.resolve(a)},fail:e.reject}]):e.resolve(c[d]),e.promise()}}}); \ No newline at end of file +define ("tool_lp/scalevalues",["jquery","core/ajax"],function(a,b){var c=[];return{get_values:function get_values(d){var e=a.Deferred();if("undefined"==typeof c[d]){b.call([{methodname:"core_competency_get_scale_values",args:{scaleid:d},done:function done(a){c[d]=a;e.resolve(a)},fail:e.reject}])}else{e.resolve(c[d])}return e.promise()}}}); +//# sourceMappingURL=scalevalues.min.js.map diff --git a/admin/tool/lp/amd/build/scalevalues.min.js.map b/admin/tool/lp/amd/build/scalevalues.min.js.map new file mode 100644 index 0000000000000..687f3317634ec --- /dev/null +++ b/admin/tool/lp/amd/build/scalevalues.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/scalevalues.js"],"names":["define","$","ajax","localCache","get_values","scaleid","deferred","Deferred","call","methodname","args","done","scaleinfo","resolve","fail","reject","promise"],"mappings":"AAsBAA,OAAM,uBAAC,CAAC,QAAD,CAAW,WAAX,CAAD,CAA0B,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CAC9C,GAAIC,CAAAA,CAAU,CAAG,EAAjB,CAEA,MAAgD,CAU5CC,UAAU,CAAE,oBAASC,CAAT,CAAkB,CAE1B,GAAIC,CAAAA,CAAQ,CAAGL,CAAC,CAACM,QAAF,EAAf,CAEA,GAAmC,WAA/B,QAAOJ,CAAAA,CAAU,CAACE,CAAD,CAArB,CAAgD,CAC5CH,CAAI,CAACM,IAAL,CAAU,CAAC,CACPC,UAAU,CAAE,kCADL,CAEPC,IAAI,CAAE,CAACL,OAAO,CAAEA,CAAV,CAFC,CAGPM,IAAI,CAAE,cAASC,CAAT,CAAoB,CACtBT,CAAU,CAACE,CAAD,CAAV,CAAsBO,CAAtB,CACAN,CAAQ,CAACO,OAAT,CAAiBD,CAAjB,CACH,CANM,CAOPE,IAAI,CAAGR,CAAQ,CAACS,MAPT,CAAD,CAAV,CASH,CAVD,IAUO,CACHT,CAAQ,CAACO,OAAT,CAAiBV,CAAU,CAACE,CAAD,CAA3B,CACH,CAED,MAAOC,CAAAA,CAAQ,CAACU,OAAT,EACV,CA7B2C,CA+BnD,CAlCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to get the scale values.\n *\n * @package tool_lp\n * @copyright 2016 Serge Gauthier\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax'], function($, ajax) {\n var localCache = [];\n\n return /** @alias module:tool_lp/scalevalues */ {\n\n /**\n * Return a promise object that will be resolved into a string eventually (maybe immediately).\n *\n * @method get_values\n * @param {Number} scaleid The scale id\n * @return [] {Promise}\n */\n // eslint-disable-next-line camelcase\n get_values: function(scaleid) {\n\n var deferred = $.Deferred();\n\n if (typeof localCache[scaleid] === 'undefined') {\n ajax.call([{\n methodname: 'core_competency_get_scale_values',\n args: {scaleid: scaleid},\n done: function(scaleinfo) {\n localCache[scaleid] = scaleinfo;\n deferred.resolve(scaleinfo);\n },\n fail: (deferred.reject)\n }]);\n } else {\n deferred.resolve(localCache[scaleid]);\n }\n\n return deferred.promise();\n }\n };\n});\n"],"file":"scalevalues.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/templateactions.min.js b/admin/tool/lp/amd/build/templateactions.min.js index 02fd09b688e32..e57f9618e1c50 100644 --- a/admin/tool/lp/amd/build/templateactions.min.js +++ b/admin/tool/lp/amd/build/templateactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/actionselector"],function(a,b,c,d,e,f){var g=0,h=0,i=!0,j=function(c,d){a('[data-region="managetemplates"]').replaceWith(c),b.runTemplateJS(d)},k=function(a){b.render("tool_lp/manage_templates_page",a).done(j).fail(d.exception)},l=function(){var a=c.call([{methodname:"core_competency_delete_template",args:{id:h,deleteplans:i}},{methodname:"tool_lp_data_for_templates_manage_page",args:{pagecontext:{contextid:g}}}]);a[1].done(k).fail(d.exception)},m=function(b){b.preventDefault(),h=a(this).attr("data-templateid");var e=c.call([{methodname:"core_competency_duplicate_template",args:{id:h}},{methodname:"tool_lp_data_for_templates_manage_page",args:{pagecontext:{contextid:g}}}]);e[1].done(k).fail(d.exception)},n=function(b){b.preventDefault();var g=a(this).attr("data-templateid");h=g,i=!0;var j=c.call([{methodname:"core_competency_read_template",args:{id:h}},{methodname:"core_competency_template_has_related_data",args:{id:h}}]);j[0].done(function(a){j[1].done(function(b){b?e.get_strings([{key:"deletetemplate",component:"tool_lp",param:a.shortname},{key:"deletetemplatewithplans",component:"tool_lp"},{key:"deleteplans",component:"tool_lp"},{key:"unlinkplanstemplate",component:"tool_lp"},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){var b=[{text:a[2],value:"delete"},{text:a[3],value:"unlink"}],c=new f(a[0],a[1],b,a[4],a[5]);c.display(),c.on("save",function(a,b){"delete"!=b.action&&(i=!1),l()})}).fail(d.exception):e.get_strings([{key:"confirm",component:"moodle"},{key:"deletetemplate",component:"tool_lp",param:a.shortname},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],l)}).fail(d.exception)}).fail(d.exception)}).fail(d.exception)};return{deleteHandler:n,duplicateHandler:m,init:function(a){g=a}}}); \ No newline at end of file +define ("tool_lp/templateactions",["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/actionselector"],function(a,b,c,d,e,f){var g=0,h=0,i=!0,j=function(c,d){a("[data-region=\"managetemplates\"]").replaceWith(c);b.runTemplateJS(d)},k=function(a){b.render("tool_lp/manage_templates_page",a).done(j).fail(d.exception)},l=function(){var a=c.call([{methodname:"core_competency_delete_template",args:{id:h,deleteplans:i}},{methodname:"tool_lp_data_for_templates_manage_page",args:{pagecontext:{contextid:g}}}]);a[1].done(k).fail(d.exception)},m=function(b){b.preventDefault();h=a(this).attr("data-templateid");var e=c.call([{methodname:"core_competency_duplicate_template",args:{id:h}},{methodname:"tool_lp_data_for_templates_manage_page",args:{pagecontext:{contextid:g}}}]);e[1].done(k).fail(d.exception)},n=function(b){b.preventDefault();var g=a(this).attr("data-templateid");h=g;i=!0;var j=c.call([{methodname:"core_competency_read_template",args:{id:h}},{methodname:"core_competency_template_has_related_data",args:{id:h}}]);j[0].done(function(a){j[1].done(function(b){if(b){e.get_strings([{key:"deletetemplate",component:"tool_lp",param:a.shortname},{key:"deletetemplatewithplans",component:"tool_lp"},{key:"deleteplans",component:"tool_lp"},{key:"unlinkplanstemplate",component:"tool_lp"},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){var b=[{text:a[2],value:"delete"},{text:a[3],value:"unlink"}],c=new f(a[0],a[1],b,a[4],a[5]);c.display();c.on("save",function(a,b){if("delete"!=b.action){i=!1}l()})}).fail(d.exception)}else{e.get_strings([{key:"confirm",component:"moodle"},{key:"deletetemplate",component:"tool_lp",param:a.shortname},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],l)}).fail(d.exception)}}).fail(d.exception)}).fail(d.exception)};return{deleteHandler:n,duplicateHandler:m,init:function init(a){g=a}}}); +//# sourceMappingURL=templateactions.min.js.map diff --git a/admin/tool/lp/amd/build/templateactions.min.js.map b/admin/tool/lp/amd/build/templateactions.min.js.map new file mode 100644 index 0000000000000..e44ab4f97281a --- /dev/null +++ b/admin/tool/lp/amd/build/templateactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/templateactions.js"],"names":["define","$","templates","ajax","notification","str","Actionselector","pagecontextid","templateid","deleteplans","updatePage","newhtml","newjs","replaceWith","runTemplateJS","reloadList","context","render","done","fail","exception","doDelete","requests","call","methodname","args","id","pagecontext","contextid","doDuplicate","e","preventDefault","attr","confirmDelete","template","templatehasrelateddata","get_strings","key","component","param","shortname","strings","actions","actionselector","display","on","data","action","confirm","deleteHandler","duplicateHandler","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Handle actions on learning plan templates via ajax.\n *\n * @module tool_lp/templateactions\n * @package tool_lp\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/ajax', 'core/notification', 'core/str', 'tool_lp/actionselector'],\n function($, templates, ajax, notification, str, Actionselector) {\n // Private variables and functions.\n\n /** @var {Number} pagecontextid The id of the context */\n var pagecontextid = 0;\n\n /** @var {Number} templateid The id of the template */\n var templateid = 0;\n\n /** @var {Boolean} Action to apply to plans when deleting a template */\n var deleteplans = true;\n\n /**\n * Callback to replace the dom element with the rendered template.\n *\n * @method updatePage\n * @param {String} newhtml The new html to insert.\n * @param {String} newjs The new js to run.\n */\n var updatePage = function(newhtml, newjs) {\n $('[data-region=\"managetemplates\"]').replaceWith(newhtml);\n templates.runTemplateJS(newjs);\n };\n\n /**\n * Callback to render the page template again and update the page.\n *\n * @method reloadList\n * @param {Object} context The context for the template.\n */\n var reloadList = function(context) {\n templates.render('tool_lp/manage_templates_page', context)\n .done(updatePage)\n .fail(notification.exception);\n };\n\n /**\n * Delete a template and reload the page.\n * @method doDelete\n */\n var doDelete = function() {\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_delete_template',\n args: {id: templateid,\n deleteplans: deleteplans}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Duplicate a template and reload the page.\n * @method doDuplicate\n * @param {Event} e\n */\n var doDuplicate = function(e) {\n e.preventDefault();\n\n templateid = $(this).attr('data-templateid');\n\n // We are chaining ajax requests here.\n var requests = ajax.call([{\n methodname: 'core_competency_duplicate_template',\n args: {id: templateid}\n }, {\n methodname: 'tool_lp_data_for_templates_manage_page',\n args: {\n pagecontext: {\n contextid: pagecontextid\n }\n }\n }]);\n requests[1].done(reloadList).fail(notification.exception);\n };\n\n /**\n * Handler for \"Delete learning plan template\" actions.\n * @method confirmDelete\n * @param {Event} e\n */\n var confirmDelete = function(e) {\n e.preventDefault();\n\n var id = $(this).attr('data-templateid');\n templateid = id;\n deleteplans = true;\n\n var requests = ajax.call([{\n methodname: 'core_competency_read_template',\n args: {id: templateid}\n }, {\n methodname: 'core_competency_template_has_related_data',\n args: {id: templateid}\n }]);\n\n requests[0].done(function(template) {\n requests[1].done(function(templatehasrelateddata) {\n if (templatehasrelateddata) {\n str.get_strings([\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'deletetemplatewithplans', component: 'tool_lp'},\n {key: 'deleteplans', component: 'tool_lp'},\n {key: 'unlinkplanstemplate', component: 'tool_lp'},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n var actions = [{'text': strings[2], 'value': 'delete'},\n {'text': strings[3], 'value': 'unlink'}];\n var actionselector = new Actionselector(\n strings[0], // Title.\n strings[1], // Message\n actions, // Radio button options.\n strings[4], // Confirm.\n strings[5]); // Cancel.\n actionselector.display();\n actionselector.on('save', function(e, data) {\n if (data.action != 'delete') {\n deleteplans = false;\n }\n doDelete();\n });\n }).fail(notification.exception);\n } else {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deletetemplate', component: 'tool_lp', param: template.shortname},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete learning plan template X?\n strings[2], // Delete.\n strings[3], // Cancel.\n doDelete\n );\n }).fail(notification.exception);\n }\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n return /** @alias module:tool_lp/templateactions */ {\n // Public variables and functions.\n /**\n * Expose the event handler for the delete.\n * @method deleteHandler\n * @param {Event} e\n */\n deleteHandler: confirmDelete,\n\n /**\n * Expose the event handler for the duplicate.\n * @method duplicateHandler\n * @param {Event} e\n */\n duplicateHandler: doDuplicate,\n\n /**\n * Initialise the module.\n * @method init\n * @param {Number} contextid The context id of the page.\n */\n init: function(contextid) {\n pagecontextid = contextid;\n }\n };\n});\n"],"file":"templateactions.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/tree.min.js b/admin/tool/lp/amd/build/tree.min.js index 21134007663c0..a5a4ecd44499a 100644 --- a/admin/tool/lp/amd/build/tree.min.js +++ b/admin/tool/lp/amd/build/tree.min.js @@ -1 +1,2 @@ -define(["jquery","core/url","core/log"],function(a,b,c){var d=a(''),e=a(''),f=function(b,c){this.treeRoot=a(b),this.multiSelect="undefined"==typeof c||c===!0,this.items=this.treeRoot.find("li"),this.expandAll=this.items.length<20,this.parents=this.treeRoot.find("li:has(ul)"),c&&this.treeRoot.attr("aria-multiselectable","true"),this.items.attr("aria-selected","false"),this.visibleItems=null,this.activeItem=null,this.lastActiveItem=null,this.keys={tab:9,enter:13,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,eight:56,asterisk:106},this.init(),this.bindEventHandlers()};return f.prototype.init=function(){this.parents.attr("aria-expanded","true"),this.parents.prepend(d.clone()),this.items.attr("role","tree-item"),this.items.attr("tabindex","-1"),this.parents.attr("role","group"),this.treeRoot.attr("role","tree"),this.visibleItems=this.treeRoot.find("li");var b=this;this.expandAll||(this.parents.each(function(){b.collapseGroup(a(this))}),this.expandGroup(this.parents.first()))},f.prototype.expandGroup=function(a){var b=a.children("ul");b.show().attr("aria-hidden","false"),a.attr("aria-expanded","true"),a.children("img").attr("src",d.attr("src")),this.visibleItems=this.treeRoot.find("li:visible")},f.prototype.collapseGroup=function(a){var b=a.children("ul");b.hide().attr("aria-hidden","true"),a.attr("aria-expanded","false"),a.children("img").attr("src",e.attr("src")),this.visibleItems=this.treeRoot.find("li:visible")},f.prototype.toggleGroup=function(a){"true"==a.attr("aria-expanded")?this.collapseGroup(a):this.expandGroup(a)},f.prototype.triggerChange=function(){var a=this.items.filter("[aria-selected=true]");this.multiSelect||(a=a.first()),this.treeRoot.trigger("selectionchanged",{selected:a})},f.prototype.multiSelectItem=function(b){if(this.multiSelect){if(null!==this.lastActiveItem){for(var c=this.visibleItems.index(this.lastActiveItem),d=this.visibleItems.index(this.activeItem),e=null;cd;)e=a(this.visibleItems.get(c)),e.attr("aria-selected","true"),c--}}else this.items.attr("aria-selected","false");b.attr("aria-selected","true"),this.triggerChange()},f.prototype.selectItem=function(a){for(var b=a.parent();"tree"!=b.attr("role");)b=b.parent(),"false"==b.attr("aria-expanded")&&this.expandGroup(b),b=b.parent();this.items.attr("aria-selected","false"),a.attr("aria-selected","true"),this.triggerChange()},f.prototype.toggleItem=function(a){if(!this.multiSelect)return void this.selectItem(a);var b=a.attr("aria-selected");b="true"===b?"false":"true",a.attr("aria-selected",b),this.triggerChange()},f.prototype.updateFocus=function(a){this.lastActiveItem=this.activeItem,this.activeItem=a;for(var b=a.parent();"tree"!=b.attr("role");)b=b.parent(),"false"==b.attr("aria-expanded")&&this.expandGroup(b),b=b.parent();this.items.attr("tabindex","-1"),a.attr("tabindex",0)},f.prototype.handleKeyDown=function(b,c){var d=this.visibleItems.index(b),e=null,f=c.shiftKey||c.ctrlKey||c.metaKey||c.altKey,g=this;switch(c.keyCode){case this.keys.home:return e=this.parents.first(),e.focus(),c.shiftKey?this.multiSelectItem(e):f||this.selectItem(e),c.stopPropagation(),!1;case this.keys.end:return e=this.visibleItems.last(),e.focus(),c.shiftKey?this.multiSelectItem(e):f||this.selectItem(e),c.stopPropagation(),!1;case this.keys.enter:case this.keys.space:return c.shiftKey?this.multiSelectItem(b):c.metaKey||c.ctrlKey?this.toggleItem(b):this.selectItem(b),c.stopPropagation(),!1;case this.keys.left:if(b.has("ul")&&"true"==b.attr("aria-expanded"))this.collapseGroup(b);else{var h=b.parent(),i=h.parent();i.is("li")&&(i.focus(),c.shiftKey?this.multiSelectItem(i):f||this.selectItem(i))}return c.stopPropagation(),!1;case this.keys.right:return b.has("ul")&&"false"==b.attr("aria-expanded")?this.expandGroup(b):(e=b.children("ul").children("li").first(),e.length>0&&(e.focus(),c.shiftKey?this.multiSelectItem(e):f||this.selectItem(e))),c.stopPropagation(),!1;case this.keys.up:if(d>0){var j=this.visibleItems.eq(d-1);j.focus(),c.shiftKey?this.multiSelectItem(j):f||this.selectItem(j)}return c.stopPropagation(),!1;case this.keys.down:if(d"),e=a("\"\""),f=function(b,c){this.treeRoot=a(b);this.multiSelect="undefined"==typeof c||!0===c;this.items=this.treeRoot.find("li");this.expandAll=20>this.items.length;this.parents=this.treeRoot.find("li:has(ul)");if(c){this.treeRoot.attr("aria-multiselectable","true")}this.items.attr("aria-selected","false");this.visibleItems=null;this.activeItem=null;this.lastActiveItem=null;this.keys={tab:9,enter:13,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,eight:56,asterisk:106};this.init();this.bindEventHandlers()};f.prototype.init=function(){this.parents.attr("aria-expanded","true");this.parents.prepend(d.clone());this.items.attr("role","tree-item");this.items.attr("tabindex","-1");this.parents.attr("role","group");this.treeRoot.attr("role","tree");this.visibleItems=this.treeRoot.find("li");var b=this;if(!this.expandAll){this.parents.each(function(){b.collapseGroup(a(this))});this.expandGroup(this.parents.first())}};f.prototype.expandGroup=function(a){var b=a.children("ul");b.show().attr("aria-hidden","false");a.attr("aria-expanded","true");a.children("img").attr("src",d.attr("src"));this.visibleItems=this.treeRoot.find("li:visible")};f.prototype.collapseGroup=function(a){var b=a.children("ul");b.hide().attr("aria-hidden","true");a.attr("aria-expanded","false");a.children("img").attr("src",e.attr("src"));this.visibleItems=this.treeRoot.find("li:visible")};f.prototype.toggleGroup=function(a){if("true"==a.attr("aria-expanded")){this.collapseGroup(a)}else{this.expandGroup(a)}};f.prototype.triggerChange=function(){var a=this.items.filter("[aria-selected=true]");if(!this.multiSelect){a=a.first()}this.treeRoot.trigger("selectionchanged",{selected:a})};f.prototype.multiSelectItem=function(b){if(!this.multiSelect){this.items.attr("aria-selected","false")}else if(null!==this.lastActiveItem){var c=this.visibleItems.index(this.lastActiveItem),d=this.visibleItems.index(this.activeItem),e=null;while(cd){e=a(this.visibleItems.get(c));e.attr("aria-selected","true");c--}}b.attr("aria-selected","true");this.triggerChange()};f.prototype.selectItem=function(a){var b=a.parent();while("tree"!=b.attr("role")){b=b.parent();if("false"==b.attr("aria-expanded")){this.expandGroup(b)}b=b.parent()}this.items.attr("aria-selected","false");a.attr("aria-selected","true");this.triggerChange()};f.prototype.toggleItem=function(a){if(!this.multiSelect){this.selectItem(a);return}var b=a.attr("aria-selected");if("true"===b){b="false"}else{b="true"}a.attr("aria-selected",b);this.triggerChange()};f.prototype.updateFocus=function(a){this.lastActiveItem=this.activeItem;this.activeItem=a;var b=a.parent();while("tree"!=b.attr("role")){b=b.parent();if("false"==b.attr("aria-expanded")){this.expandGroup(b)}b=b.parent()}this.items.attr("tabindex","-1");a.attr("tabindex",0)};f.prototype.handleKeyDown=function(b,c){var d=this.visibleItems.index(b),e=null,f=c.shiftKey||c.ctrlKey||c.metaKey||c.altKey,g=this;switch(c.keyCode){case this.keys.home:{e=this.parents.first();e.focus();if(c.shiftKey){this.multiSelectItem(e)}else if(!f){this.selectItem(e)}c.stopPropagation();return!1}case this.keys.end:{e=this.visibleItems.last();e.focus();if(c.shiftKey){this.multiSelectItem(e)}else if(!f){this.selectItem(e)}c.stopPropagation();return!1}case this.keys.enter:case this.keys.space:{if(c.shiftKey){this.multiSelectItem(b)}else if(c.metaKey||c.ctrlKey){this.toggleItem(b)}else{this.selectItem(b)}c.stopPropagation();return!1}case this.keys.left:{if(b.has("ul")&&"true"==b.attr("aria-expanded")){this.collapseGroup(b)}else{var h=b.parent(),i=h.parent();if(i.is("li")){i.focus();if(c.shiftKey){this.multiSelectItem(i)}else if(!f){this.selectItem(i)}}}c.stopPropagation();return!1}case this.keys.right:{if(b.has("ul")&&"false"==b.attr("aria-expanded")){this.expandGroup(b)}else{e=b.children("ul").children("li").first();if(0.\n\n/**\n * Implement an accessible aria tree widget, from a nested unordered list.\n * Based on http://oaa-accessibility.org/example/41/\n *\n * To respond to selection changed events - use tree.on(\"selectionchanged\", handler).\n * The handler will receive an array of nodes, which are the list items that are currently\n * selected. (Or a single node if multiselect is disabled).\n *\n * @module tool_lp/tree\n * @package core\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/url', 'core/log'], function($, url, log) {\n // Private variables and functions.\n /** @var {String} expandedImage The html for an expanded tree node twistie. */\n var expandedImage = $('\"\"');\n /** @var {String} collapsedImage The html for a collapsed tree node twistie. */\n var collapsedImage = $('\"\"');\n\n /**\n * Constructor\n *\n * @param {String} selector\n * @param {Boolean} multiSelect\n */\n var Tree = function(selector, multiSelect) {\n this.treeRoot = $(selector);\n this.multiSelect = (typeof multiSelect === 'undefined' || multiSelect === true);\n\n this.items = this.treeRoot.find('li');\n this.expandAll = this.items.length < 20;\n this.parents = this.treeRoot.find('li:has(ul)');\n\n if (multiSelect) {\n this.treeRoot.attr('aria-multiselectable', 'true');\n }\n\n this.items.attr('aria-selected', 'false');\n\n this.visibleItems = null;\n this.activeItem = null;\n this.lastActiveItem = null;\n\n this.keys = {\n tab: 9,\n enter: 13,\n space: 32,\n pageup: 33,\n pagedown: 34,\n end: 35,\n home: 36,\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n eight: 56,\n asterisk: 106\n };\n\n this.init();\n\n this.bindEventHandlers();\n };\n // Public variables and functions.\n\n /**\n * Init this tree\n * @method init\n */\n Tree.prototype.init = function() {\n this.parents.attr('aria-expanded', 'true');\n this.parents.prepend(expandedImage.clone());\n\n this.items.attr('role', 'tree-item');\n this.items.attr('tabindex', '-1');\n this.parents.attr('role', 'group');\n this.treeRoot.attr('role', 'tree');\n\n this.visibleItems = this.treeRoot.find('li');\n\n var thisObj = this;\n if (!this.expandAll) {\n this.parents.each(function() {\n thisObj.collapseGroup($(this));\n });\n this.expandGroup(this.parents.first());\n }\n };\n\n /**\n * Expand a collapsed group.\n *\n * @method expandGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.expandGroup = function(item) {\n // Find the first child ul node.\n var group = item.children('ul');\n\n // Expand the group.\n group.show().attr('aria-hidden', 'false');\n\n item.attr('aria-expanded', 'true');\n\n item.children('img').attr('src', expandedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Collapse an expanded group.\n *\n * @method collapseGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.collapseGroup = function(item) {\n var group = item.children('ul');\n\n // Collapse the group.\n group.hide().attr('aria-hidden', 'true');\n\n item.attr('aria-expanded', 'false');\n\n item.children('img').attr('src', collapsedImage.attr('src'));\n\n // Update the list of visible items.\n this.visibleItems = this.treeRoot.find('li:visible');\n };\n\n /**\n * Expand or collapse a group.\n *\n * @method toggleGroup\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.toggleGroup = function(item) {\n if (item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n this.expandGroup(item);\n }\n };\n\n /**\n * Whenever the currently selected node has changed, trigger an event using this function.\n *\n * @method triggerChange\n */\n Tree.prototype.triggerChange = function() {\n var allSelected = this.items.filter('[aria-selected=true]');\n if (!this.multiSelect) {\n allSelected = allSelected.first();\n }\n this.treeRoot.trigger('selectionchanged', {selected: allSelected});\n };\n\n /**\n * Select all the items between the last focused item and this currently focused item.\n *\n * @method multiSelectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.multiSelectItem = function(item) {\n if (!this.multiSelect) {\n this.items.attr('aria-selected', 'false');\n } else if (this.lastActiveItem !== null) {\n var lastIndex = this.visibleItems.index(this.lastActiveItem);\n var currentIndex = this.visibleItems.index(this.activeItem);\n var oneItem = null;\n\n while (lastIndex < currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex++;\n }\n while (lastIndex > currentIndex) {\n oneItem = $(this.visibleItems.get(lastIndex));\n oneItem.attr('aria-selected', 'true');\n lastIndex--;\n }\n }\n\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Select a single item. Make sure all the parents are expanded. De-select all other items.\n *\n * @method selectItem\n * @param {Object} item is the jquery id of the newly selected item.\n */\n Tree.prototype.selectItem = function(item) {\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('aria-selected', 'false');\n item.attr('aria-selected', 'true');\n this.triggerChange();\n };\n\n /**\n * Toggle the selected state for an item back and forth.\n *\n * @method toggleItem\n * @param {Object} item is the jquery id of the item to toggle.\n */\n Tree.prototype.toggleItem = function(item) {\n if (!this.multiSelect) {\n this.selectItem(item);\n return;\n }\n\n var current = item.attr('aria-selected');\n if (current === 'true') {\n current = 'false';\n } else {\n current = 'true';\n }\n item.attr('aria-selected', current);\n this.triggerChange();\n };\n\n /**\n * Set the focus to this item.\n *\n * @method updateFocus\n * @param {Object} item is the jquery id of the parent item of the group\n */\n Tree.prototype.updateFocus = function(item) {\n this.lastActiveItem = this.activeItem;\n this.activeItem = item;\n // Expand all nodes up the tree.\n var walk = item.parent();\n while (walk.attr('role') != 'tree') {\n walk = walk.parent();\n if (walk.attr('aria-expanded') == 'false') {\n this.expandGroup(walk);\n }\n walk = walk.parent();\n }\n this.items.attr('tabindex', '-1');\n item.attr('tabindex', 0);\n };\n\n /**\n * Handle a key down event - ie navigate the tree.\n *\n * @method handleKeyDown\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n // This function should be simplified. In the meantime..\n // eslint-disable-next-line complexity\n Tree.prototype.handleKeyDown = function(item, e) {\n var currentIndex = this.visibleItems.index(item);\n var newItem = null;\n var hasKeyModifier = e.shiftKey || e.ctrlKey || e.metaKey || e.altKey;\n var thisObj = this;\n\n switch (e.keyCode) {\n case this.keys.home: {\n // Jump to first item in tree.\n newItem = this.parents.first();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.end: {\n // Jump to last visible item.\n newItem = this.visibleItems.last();\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.enter:\n case this.keys.space: {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.left: {\n if (item.has('ul') && item.attr('aria-expanded') == 'true') {\n this.collapseGroup(item);\n } else {\n // Move up to the parent.\n var itemUL = item.parent();\n var itemParent = itemUL.parent();\n if (itemParent.is('li')) {\n itemParent.focus();\n if (e.shiftKey) {\n this.multiSelectItem(itemParent);\n } else if (!hasKeyModifier) {\n this.selectItem(itemParent);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.right: {\n if (item.has('ul') && item.attr('aria-expanded') == 'false') {\n this.expandGroup(item);\n } else {\n // Move to the first item in the child group.\n newItem = item.children('ul').children('li').first();\n if (newItem.length > 0) {\n newItem.focus();\n if (e.shiftKey) {\n this.multiSelectItem(newItem);\n } else if (!hasKeyModifier) {\n this.selectItem(newItem);\n }\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.up: {\n\n if (currentIndex > 0) {\n var prev = this.visibleItems.eq(currentIndex - 1);\n prev.focus();\n if (e.shiftKey) {\n this.multiSelectItem(prev);\n } else if (!hasKeyModifier) {\n this.selectItem(prev);\n }\n }\n\n e.stopPropagation();\n return false;\n }\n case this.keys.down: {\n\n if (currentIndex < this.visibleItems.length - 1) {\n var next = this.visibleItems.eq(currentIndex + 1);\n next.focus();\n if (e.shiftKey) {\n this.multiSelectItem(next);\n } else if (!hasKeyModifier) {\n this.selectItem(next);\n }\n }\n e.stopPropagation();\n return false;\n }\n case this.keys.asterisk: {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n return false;\n }\n case this.keys.eight: {\n if (e.shiftKey) {\n // Expand all groups.\n this.parents.each(function() {\n thisObj.expandGroup($(this));\n });\n\n e.stopPropagation();\n }\n\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * Handle a key press event - ie navigate the tree.\n *\n * @method handleKeyPress\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleKeyPress = function(item, e) {\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n switch (e.keyCode) {\n case this.keys.tab: {\n return true;\n }\n case this.keys.enter:\n case this.keys.home:\n case this.keys.end:\n case this.keys.left:\n case this.keys.right:\n case this.keys.up:\n case this.keys.down: {\n e.stopPropagation();\n return false;\n }\n default : {\n var chr = String.fromCharCode(e.which);\n var match = false;\n var itemIndex = this.visibleItems.index(item);\n var itemCount = this.visibleItems.length;\n var currentIndex = itemIndex + 1;\n\n // Check if the active item was the last one on the list.\n if (currentIndex == itemCount) {\n currentIndex = 0;\n }\n\n // Iterate through the menu items (starting from the current item and wrapping) until a match is found\n // or the loop returns to the current menu item.\n while (currentIndex != itemIndex) {\n\n var currentItem = this.visibleItems.eq(currentIndex);\n var titleChr = currentItem.text().charAt(0);\n\n if (currentItem.has('ul')) {\n titleChr = currentItem.find('span').text().charAt(0);\n }\n\n if (titleChr.toLowerCase() == chr) {\n match = true;\n break;\n }\n\n currentIndex = currentIndex + 1;\n if (currentIndex == itemCount) {\n // Reached the end of the list, start again at the beginning.\n currentIndex = 0;\n }\n }\n\n if (match === true) {\n this.updateFocus(this.visibleItems.eq(currentIndex));\n }\n e.stopPropagation();\n return false;\n }\n }\n\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n /**\n * Attach an event listener to the tree.\n *\n * @method on\n * @param {String} eventname This is the name of the event to listen for. Only 'selectionchanged' is supported for now.\n * @param {Function} handler The function to call when the event is triggered.\n */\n Tree.prototype.on = function(eventname, handler) {\n if (eventname !== 'selectionchanged') {\n log.warning('Invalid custom event name for tree. Only \"selectionchanged\" is supported.');\n } else {\n this.treeRoot.on(eventname, handler);\n }\n };\n\n /**\n * Handle a double click (expand/collapse).\n *\n * @method handleDblClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleDblClick = function(item, e) {\n\n if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n // Do nothing.\n return true;\n }\n\n // Apply the focus markup.\n this.updateFocus(item);\n\n // Expand or collapse the group.\n this.toggleGroup(item);\n\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a click (select).\n *\n * @method handleExpandCollapseClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleExpandCollapseClick = function(item, e) {\n\n // Do not shift the focus.\n this.toggleGroup(item);\n e.stopPropagation();\n return false;\n };\n\n\n /**\n * Handle a click (select).\n *\n * @method handleClick\n * @param {Object} item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleClick = function(item, e) {\n\n if (e.shiftKey) {\n this.multiSelectItem(item);\n } else if (e.metaKey || e.ctrlKey) {\n this.toggleItem(item);\n } else {\n this.selectItem(item);\n }\n this.updateFocus(item);\n e.stopPropagation();\n return false;\n };\n\n /**\n * Handle a blur event\n *\n * @method handleBlur\n * @param {Object} item item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleBlur = function() {\n return true;\n };\n\n /**\n * Handle a focus event\n *\n * @method handleFocus\n * @param {Object} item item is the jquery id of the parent item of the group\n * @param {Event} e The event.\n * @return {Boolean}\n */\n Tree.prototype.handleFocus = function(item) {\n\n this.updateFocus(item);\n\n return true;\n };\n\n /**\n * Bind the event listeners we require.\n *\n * @method bindEventHandlers\n */\n Tree.prototype.bindEventHandlers = function() {\n var thisObj = this;\n\n // Bind a dblclick handler to the parent items.\n this.parents.dblclick(function(e) {\n return thisObj.handleDblClick($(this), e);\n });\n\n // Bind a click handler.\n this.items.click(function(e) {\n return thisObj.handleClick($(this), e);\n });\n\n // Bind a toggle handler to the expand/collapse icons.\n this.items.children('img').click(function(e) {\n return thisObj.handleExpandCollapseClick($(this).parent(), e);\n });\n\n // Bind a keydown handler.\n this.items.keydown(function(e) {\n return thisObj.handleKeyDown($(this), e);\n });\n\n // Bind a keypress handler.\n this.items.keypress(function(e) {\n return thisObj.handleKeyPress($(this), e);\n });\n\n // Bind a focus handler.\n this.items.focus(function(e) {\n return thisObj.handleFocus($(this), e);\n });\n\n // Bind a blur handler.\n this.items.blur(function(e) {\n return thisObj.handleBlur($(this), e);\n });\n\n };\n\n return /** @alias module:tool_lp/tree */ Tree;\n});\n"],"file":"tree.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_course_navigation.min.js b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js index 674172ff27bf9..6bf284959cea0 100644 --- a/admin/tool/lp/amd/build/user_competency_course_navigation.min.js +++ b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(b,c,d,e,f,g){this._baseUrl=d,this._userId=e+"",this._competencyId=f+"",this._courseId=g,a(b).on("change",this._userChanged.bind(this)),a(c).on("change",this._competencyChanged.bind(this))};return b.prototype._userChanged=function(b){var c=a(b.target).val(),d="?userid="+c+"&courseid="+this._courseId+"&competencyid="+this._competencyId;document.location=this._baseUrl+d},b.prototype._competencyChanged=function(b){var c=a(b.target).val(),d="?userid="+this._userId+"&courseid="+this._courseId+"&competencyid="+c;document.location=this._baseUrl+d},b.prototype._competencyId=null,b.prototype._userId=null,b.prototype._courseId=null,b.prototype._baseUrl=null,b.prototype._ignoreFirstCompetency=null,b}); \ No newline at end of file +define ("tool_lp/user_competency_course_navigation",["jquery"],function(a){var b=function(b,c,d,e,f,g){this._baseUrl=d;this._userId=e+"";this._competencyId=f+"";this._courseId=g;a(b).on("change",this._userChanged.bind(this));a(c).on("change",this._competencyChanged.bind(this))};b.prototype._userChanged=function(b){var c=a(b.target).val(),d="?userid="+c+"&courseid="+this._courseId+"&competencyid="+this._competencyId;document.location=this._baseUrl+d};b.prototype._competencyChanged=function(b){var c=a(b.target).val(),d="?userid="+this._userId+"&courseid="+this._courseId+"&competencyid="+c;document.location=this._baseUrl+d};b.prototype._competencyId=null;b.prototype._userId=null;b.prototype._courseId=null;b.prototype._baseUrl=null;b.prototype._ignoreFirstCompetency=null;return b}); +//# sourceMappingURL=user_competency_course_navigation.min.js.map diff --git a/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map new file mode 100644 index 0000000000000..2ad4133b7e4e3 --- /dev/null +++ b/admin/tool/lp/amd/build/user_competency_course_navigation.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/user_competency_course_navigation.js"],"names":["define","$","UserCompetencyCourseNavigation","userSelector","competencySelector","baseUrl","userId","competencyId","courseId","_baseUrl","_userId","_competencyId","_courseId","on","_userChanged","bind","_competencyChanged","prototype","e","newUserId","target","val","queryStr","document","location","newCompetencyId","_ignoreFirstCompetency"],"mappings":"AAuBAA,OAAM,6CAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAY3B,GAAIC,CAAAA,CAA8B,CAAG,SAASC,CAAT,CAAuBC,CAAvB,CAA2CC,CAA3C,CAAoDC,CAApD,CAA4DC,CAA5D,CAA0EC,CAA1E,CAAoF,CACrH,KAAKC,QAAL,CAAgBJ,CAAhB,CACA,KAAKK,OAAL,CAAeJ,CAAM,CAAG,EAAxB,CACA,KAAKK,aAAL,CAAqBJ,CAAY,CAAG,EAApC,CACA,KAAKK,SAAL,CAAiBJ,CAAjB,CAEAP,CAAC,CAACE,CAAD,CAAD,CAAgBU,EAAhB,CAAmB,QAAnB,CAA6B,KAAKC,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,CAA7B,EACAd,CAAC,CAACG,CAAD,CAAD,CAAsBS,EAAtB,CAAyB,QAAzB,CAAmC,KAAKG,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAAnC,CACH,CARD,CAgBAb,CAA8B,CAACe,SAA/B,CAAyCH,YAAzC,CAAwD,SAASI,CAAT,CAAY,IAC5DC,CAAAA,CAAS,CAAGlB,CAAC,CAACiB,CAAC,CAACE,MAAH,CAAD,CAAYC,GAAZ,EADgD,CAE5DC,CAAQ,CAAG,WAAaH,CAAb,CAAyB,YAAzB,CAAwC,KAAKP,SAA7C,CAAyD,gBAAzD,CAA4E,KAAKD,aAFhC,CAGhEY,QAAQ,CAACC,QAAT,CAAoB,KAAKf,QAAL,CAAgBa,CACvC,CAJD,CAYApB,CAA8B,CAACe,SAA/B,CAAyCD,kBAAzC,CAA8D,SAASE,CAAT,CAAY,IAClEO,CAAAA,CAAe,CAAGxB,CAAC,CAACiB,CAAC,CAACE,MAAH,CAAD,CAAYC,GAAZ,EADgD,CAElEC,CAAQ,CAAG,WAAa,KAAKZ,OAAlB,CAA4B,YAA5B,CAA2C,KAAKE,SAAhD,CAA4D,gBAA5D,CAA+Ea,CAFxB,CAGtEF,QAAQ,CAACC,QAAT,CAAoB,KAAKf,QAAL,CAAgBa,CACvC,CAJD,CAOApB,CAA8B,CAACe,SAA/B,CAAyCN,aAAzC,CAAyD,IAAzD,CAEAT,CAA8B,CAACe,SAA/B,CAAyCP,OAAzC,CAAmD,IAAnD,CAEAR,CAA8B,CAACe,SAA/B,CAAyCL,SAAzC,CAAqD,IAArD,CAEAV,CAA8B,CAACe,SAA/B,CAAyCR,QAAzC,CAAoD,IAApD,CAEAP,CAA8B,CAACe,SAA/B,CAAyCS,sBAAzC,CAAkE,IAAlE,CAEA,MAAsExB,CAAAA,CAEzE,CA3DK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to enable inline editing of a comptency grade.\n *\n * @package tool_lp\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery'], function($) {\n\n /**\n * UserCompetencyCourseNavigation\n *\n * @param {String} userSelector The selector of the user element.\n * @param {String} competencySelector The selector of the competency element.\n * @param {String} baseUrl The base url for the page (no params).\n * @param {Number} userId The user id\n * @param {Number} competencyId The competency id\n * @param {Number} courseId The course id\n */\n var UserCompetencyCourseNavigation = function(userSelector, competencySelector, baseUrl, userId, competencyId, courseId) {\n this._baseUrl = baseUrl;\n this._userId = userId + '';\n this._competencyId = competencyId + '';\n this._courseId = courseId;\n\n $(userSelector).on('change', this._userChanged.bind(this));\n $(competencySelector).on('change', this._competencyChanged.bind(this));\n };\n\n /**\n * The user was changed in the select list.\n *\n * @method _userChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._userChanged = function(e) {\n var newUserId = $(e.target).val();\n var queryStr = '?userid=' + newUserId + '&courseid=' + this._courseId + '&competencyid=' + this._competencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /**\n * The competency was changed in the select list.\n *\n * @method _competencyChanged\n * @param {Event} e\n */\n UserCompetencyCourseNavigation.prototype._competencyChanged = function(e) {\n var newCompetencyId = $(e.target).val();\n var queryStr = '?userid=' + this._userId + '&courseid=' + this._courseId + '&competencyid=' + newCompetencyId;\n document.location = this._baseUrl + queryStr;\n };\n\n /** @type {Number} The id of the competency. */\n UserCompetencyCourseNavigation.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n UserCompetencyCourseNavigation.prototype._userId = null;\n /** @type {Number} The id of the course. */\n UserCompetencyCourseNavigation.prototype._courseId = null;\n /** @type {String} Plugin base url. */\n UserCompetencyCourseNavigation.prototype._baseUrl = null;\n /** @type {Boolean} Ignore the first change event for competencies. */\n UserCompetencyCourseNavigation.prototype._ignoreFirstCompetency = null;\n\n return /** @alias module:tool_lp/user_competency_course_navigation */ UserCompetencyCourseNavigation;\n\n});\n"],"file":"user_competency_course_navigation.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_info.min.js b/admin/tool/lp/amd/build/user_competency_info.min.js index edd32c2627bc0..c4a3f727781a3 100644 --- a/admin/tool/lp/amd/build/user_competency_info.min.js +++ b/admin/tool/lp/amd/build/user_competency_info.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/ajax","core/templates"],function(a,b,c,d){var e=function(a,b,c,d,e,f){this._rootElement=a,this._competencyId=b,this._userId=c,this._planId=d,this._courseId=e,this._valid=!0,this._displayuser="undefined"!=typeof f&&f,this._planId?(this._methodName="tool_lp_data_for_user_competency_summary_in_plan",this._args={competencyid:this._competencyId,planid:this._planId},this._templateName="tool_lp/user_competency_summary_in_plan"):this._courseId?(this._methodName="tool_lp_data_for_user_competency_summary_in_course",this._args={userid:this._userId,competencyid:this._competencyId,courseid:this._courseId},this._templateName="tool_lp/user_competency_summary_in_course"):(this._methodName="tool_lp_data_for_user_competency_summary",this._args={userid:this._userId,competencyid:this._competencyId},this._templateName="tool_lp/user_competency_summary")};return e.prototype.reload=function(){var a=this,e=[];this._valid&&(e=c.call([{methodname:this._methodName,args:this._args}]),e[0].done(function(c){a._displayuser&&(c.displayuser=!0),d.render(a._templateName,c).done(function(b,c){d.replaceNode(a._rootElement,b,c)}).fail(b.exception)}).fail(b.exception))},e.prototype._rootElement=null,e.prototype._courseId=null,e.prototype._valid=null,e.prototype._planId=null,e.prototype._competencyId=null,e.prototype._userId=null,e.prototype._methodName=null,e.prototype._args=null,e.prototype._templateName=null,e.prototype._displayuser=!1,e}); \ No newline at end of file +define ("tool_lp/user_competency_info",["jquery","core/notification","core/ajax","core/templates"],function(a,b,c,d){var e=function(a,b,c,d,e,f){this._rootElement=a;this._competencyId=b;this._userId=c;this._planId=d;this._courseId=e;this._valid=!0;this._displayuser="undefined"!=typeof f?f:!1;if(this._planId){this._methodName="tool_lp_data_for_user_competency_summary_in_plan";this._args={competencyid:this._competencyId,planid:this._planId};this._templateName="tool_lp/user_competency_summary_in_plan"}else if(this._courseId){this._methodName="tool_lp_data_for_user_competency_summary_in_course";this._args={userid:this._userId,competencyid:this._competencyId,courseid:this._courseId};this._templateName="tool_lp/user_competency_summary_in_course"}else{this._methodName="tool_lp_data_for_user_competency_summary";this._args={userid:this._userId,competencyid:this._competencyId};this._templateName="tool_lp/user_competency_summary"}};e.prototype.reload=function(){var a=this,e=[];if(!this._valid){return}e=c.call([{methodname:this._methodName,args:this._args}]);e[0].done(function(c){if(a._displayuser){c.displayuser=!0}d.render(a._templateName,c).done(function(b,c){d.replaceNode(a._rootElement,b,c)}).fail(b.exception)}).fail(b.exception)};e.prototype._rootElement=null;e.prototype._courseId=null;e.prototype._valid=null;e.prototype._planId=null;e.prototype._competencyId=null;e.prototype._userId=null;e.prototype._methodName=null;e.prototype._args=null;e.prototype._templateName=null;e.prototype._displayuser=!1;return e}); +//# sourceMappingURL=user_competency_info.min.js.map diff --git a/admin/tool/lp/amd/build/user_competency_info.min.js.map b/admin/tool/lp/amd/build/user_competency_info.min.js.map new file mode 100644 index 0000000000000..af6f8b4d125cc --- /dev/null +++ b/admin/tool/lp/amd/build/user_competency_info.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/user_competency_info.js"],"names":["define","$","notification","ajax","templates","Info","rootElement","competencyId","userId","planId","courseId","displayuser","_rootElement","_competencyId","_userId","_planId","_courseId","_valid","_displayuser","_methodName","_args","competencyid","planid","_templateName","userid","courseid","prototype","reload","self","promises","call","methodname","args","done","context","render","html","js","replaceNode","fail","exception"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to refresh a user competency summary in a page.\n *\n * @package tool_lp\n * @copyright 2015 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/ajax', 'core/templates'], function($, notification, ajax, templates) {\n\n /**\n * Info\n *\n * @param {JQuery} rootElement Selector to replace when the information needs updating.\n * @param {Number} competencyId The id of the competency.\n * @param {Number} userId The id of the user.\n * @param {Number} planId The id of the plan.\n * @param {Number} courseId The id of the course.\n * @param {Boolean} displayuser If we should display the user info.\n */\n var Info = function(rootElement, competencyId, userId, planId, courseId, displayuser) {\n this._rootElement = rootElement;\n this._competencyId = competencyId;\n this._userId = userId;\n this._planId = planId;\n this._courseId = courseId;\n this._valid = true;\n this._displayuser = (typeof displayuser !== 'undefined') ? displayuser : false;\n\n if (this._planId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_plan';\n this._args = {competencyid: this._competencyId, planid: this._planId};\n this._templateName = 'tool_lp/user_competency_summary_in_plan';\n } else if (this._courseId) {\n this._methodName = 'tool_lp_data_for_user_competency_summary_in_course';\n this._args = {userid: this._userId, competencyid: this._competencyId, courseid: this._courseId};\n this._templateName = 'tool_lp/user_competency_summary_in_course';\n } else {\n this._methodName = 'tool_lp_data_for_user_competency_summary';\n this._args = {userid: this._userId, competencyid: this._competencyId};\n this._templateName = 'tool_lp/user_competency_summary';\n }\n };\n\n /**\n * Reload the info for this user competency.\n *\n * @method reload\n */\n Info.prototype.reload = function() {\n var self = this,\n promises = [];\n\n if (!this._valid) {\n return;\n }\n\n promises = ajax.call([{\n methodname: this._methodName,\n args: this._args\n }]);\n\n promises[0].done(function(context) {\n // Check if we should also the user info.\n if (self._displayuser) {\n context.displayuser = true;\n }\n templates.render(self._templateName, context).done(function(html, js) {\n templates.replaceNode(self._rootElement, html, js);\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /** @type {JQuery} The root element to replace in the DOM. */\n Info.prototype._rootElement = null;\n /** @type {Number} The id of the course. */\n Info.prototype._courseId = null;\n /** @type {Boolean} Is this module valid? */\n Info.prototype._valid = null;\n /** @type {Number} The id of the plan. */\n Info.prototype._planId = null;\n /** @type {Number} The id of the competency. */\n Info.prototype._competencyId = null;\n /** @type {Number} The id of the user. */\n Info.prototype._userId = null;\n /** @type {String} The method name to load the data. */\n Info.prototype._methodName = null;\n /** @type {Object} The arguments to load the data. */\n Info.prototype._args = null;\n /** @type {String} The template to reload the fragment. */\n Info.prototype._templateName = null;\n /** @type {Boolean} If we should display the user info? */\n Info.prototype._displayuser = false;\n\n return /** @alias module:tool_lp/user_competency_info */ Info;\n\n});\n"],"file":"user_competency_info.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_plan_popup.min.js b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js index 755a66433ab4b..cda67b4990779 100644 --- a/admin/tool/lp/amd/build/user_competency_plan_popup.min.js +++ b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/str","core/ajax","core/templates","tool_lp/dialogue"],function(a,b,c,d,e,f){var g=function(b,c,d){this._regionSelector=b,this._userCompetencySelector=c,this._planId=d,a(this._regionSelector).on("click",this._userCompetencySelector,this._handleClick.bind(this))};return g.prototype._handleClick=function(c){c.preventDefault();var e=a(c.target).closest("tr"),f=a(e).data("competencyid"),g=a(e).data("userid"),h=this._planId,i=d.call([{methodname:"tool_lp_data_for_user_competency_summary_in_plan",args:{competencyid:f,planid:h},done:this._contextLoaded.bind(this),fail:b.exception}]);i[0].then(function(a){var b="core_competency_user_competency_viewed_in_plan";return a.plan.iscompleted&&(b="core_competency_user_competency_plan_viewed"),d.call([{methodname:b,args:{competencyid:f,userid:g,planid:h}}])[0]})["catch"](b.exception)},g.prototype._contextLoaded=function(a){var d=this;e.render("tool_lp/user_competency_summary_in_plan",a).done(function(a,g){c.get_string("usercompetencysummary","report_competency").done(function(b){new f(b,a,e.runTemplateJS.bind(e,g),d._refresh.bind(d),(!0))}).fail(b.exception)}).fail(b.exception)},g.prototype._refresh=function(){var a=this._planId;d.call([{methodname:"tool_lp_data_for_plan_page",args:{planid:a},done:this._pageContextLoaded.bind(this),fail:b.exception}])},g.prototype._pageContextLoaded=function(a){var c=this;e.render("tool_lp/plan_page",a).done(function(a,b){e.replaceNode(c._regionSelector,a,b)}).fail(b.exception)},g.prototype._regionSelector=null,g.prototype._userCompetencySelector=null,g.prototype._planId=null,g}); \ No newline at end of file +define ("tool_lp/user_competency_plan_popup",["jquery","core/notification","core/str","core/ajax","core/templates","tool_lp/dialogue"],function(a,b,c,d,e,f){var g=function(b,c,d){this._regionSelector=b;this._userCompetencySelector=c;this._planId=d;a(this._regionSelector).on("click",this._userCompetencySelector,this._handleClick.bind(this))};g.prototype._handleClick=function(c){c.preventDefault();var e=a(c.target).closest("tr"),f=a(e).data("competencyid"),g=a(e).data("userid"),h=this._planId,i=d.call([{methodname:"tool_lp_data_for_user_competency_summary_in_plan",args:{competencyid:f,planid:h},done:this._contextLoaded.bind(this),fail:b.exception}]);i[0].then(function(a){var b="core_competency_user_competency_viewed_in_plan";if(a.plan.iscompleted){b="core_competency_user_competency_plan_viewed"}return d.call([{methodname:b,args:{competencyid:f,userid:g,planid:h}}])[0]}).catch(b.exception)};g.prototype._contextLoaded=function(a){var d=this;e.render("tool_lp/user_competency_summary_in_plan",a).done(function(a,g){c.get_string("usercompetencysummary","report_competency").done(function(b){new f(b,a,e.runTemplateJS.bind(e,g),d._refresh.bind(d),!0)}).fail(b.exception)}).fail(b.exception)};g.prototype._refresh=function(){var a=this._planId;d.call([{methodname:"tool_lp_data_for_plan_page",args:{planid:a},done:this._pageContextLoaded.bind(this),fail:b.exception}])};g.prototype._pageContextLoaded=function(a){var c=this;e.render("tool_lp/plan_page",a).done(function(a,b){e.replaceNode(c._regionSelector,a,b)}).fail(b.exception)};g.prototype._regionSelector=null;g.prototype._userCompetencySelector=null;g.prototype._planId=null;return g}); +//# sourceMappingURL=user_competency_plan_popup.min.js.map diff --git a/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map new file mode 100644 index 0000000000000..88d6b17bf57b1 --- /dev/null +++ b/admin/tool/lp/amd/build/user_competency_plan_popup.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/user_competency_plan_popup.js"],"names":["define","$","notification","str","ajax","templates","Dialogue","UserCompetencyPopup","regionSelector","userCompetencySelector","planId","_regionSelector","_userCompetencySelector","_planId","on","_handleClick","bind","prototype","e","preventDefault","tr","target","closest","competencyId","data","userId","requests","call","methodname","args","competencyid","planid","done","_contextLoaded","fail","exception","then","result","eventMethodName","plan","iscompleted","userid","catch","context","self","render","html","js","get_string","title","runTemplateJS","_refresh","_pageContextLoaded","replaceNode"],"mappings":"AAuBAA,OAAM,sCAAC,CAAC,QAAD,CAAW,mBAAX,CAAgC,UAAhC,CAA4C,WAA5C,CAAyD,gBAAzD,CAA2E,kBAA3E,CAAD,CACC,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAA+BC,CAA/B,CAAqCC,CAArC,CAAgDC,CAAhD,CAA0D,CAS7D,GAAIC,CAAAA,CAAmB,CAAG,SAASC,CAAT,CAAyBC,CAAzB,CAAiDC,CAAjD,CAAyD,CAC/E,KAAKC,eAAL,CAAuBH,CAAvB,CACA,KAAKI,uBAAL,CAA+BH,CAA/B,CACA,KAAKI,OAAL,CAAeH,CAAf,CAEAT,CAAC,CAAC,KAAKU,eAAN,CAAD,CAAwBG,EAAxB,CAA2B,OAA3B,CAAoC,KAAKF,uBAAzC,CAAkE,KAAKG,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,CAAlE,CACH,CAND,CAcAT,CAAmB,CAACU,SAApB,CAA8BF,YAA9B,CAA6C,SAASG,CAAT,CAAY,CACrDA,CAAC,CAACC,cAAF,GADqD,GAEjDC,CAAAA,CAAE,CAAGnB,CAAC,CAACiB,CAAC,CAACG,MAAH,CAAD,CAAYC,OAAZ,CAAoB,IAApB,CAF4C,CAGjDC,CAAY,CAAGtB,CAAC,CAACmB,CAAD,CAAD,CAAMI,IAAN,CAAW,cAAX,CAHkC,CAIjDC,CAAM,CAAGxB,CAAC,CAACmB,CAAD,CAAD,CAAMI,IAAN,CAAW,QAAX,CAJwC,CAKjDd,CAAM,CAAG,KAAKG,OALmC,CAOjDa,CAAQ,CAAGtB,CAAI,CAACuB,IAAL,CAAU,CAAC,CACtBC,UAAU,CAAE,kDADU,CAEtBC,IAAI,CAAE,CAACC,YAAY,CAAEP,CAAf,CAA6BQ,MAAM,CAAErB,CAArC,CAFgB,CAGtBsB,IAAI,CAAE,KAAKC,cAAL,CAAoBjB,IAApB,CAAyB,IAAzB,CAHgB,CAItBkB,IAAI,CAAEhC,CAAY,CAACiC,SAJG,CAAD,CAAV,CAPsC,CAcrDT,CAAQ,CAAC,CAAD,CAAR,CAAYU,IAAZ,CAAiB,SAASC,CAAT,CAAiB,CAC9B,GAAIC,CAAAA,CAAe,CAAG,gDAAtB,CAEA,GAAID,CAAM,CAACE,IAAP,CAAYC,WAAhB,CAA6B,CACzBF,CAAe,CAAG,6CACrB,CACD,MAAOlC,CAAAA,CAAI,CAACuB,IAAL,CAAU,CAAC,CACdC,UAAU,CAAEU,CADE,CAEdT,IAAI,CAAE,CAACC,YAAY,CAAEP,CAAf,CAA6BkB,MAAM,CAAEhB,CAArC,CAA6CM,MAAM,CAAErB,CAArD,CAFQ,CAAD,CAAV,EAGH,CAHG,CAIV,CAVD,EAUGgC,KAVH,CAUSxC,CAAY,CAACiC,SAVtB,CAWH,CAzBD,CAiCA5B,CAAmB,CAACU,SAApB,CAA8BgB,cAA9B,CAA+C,SAASU,CAAT,CAAkB,CAC7D,GAAIC,CAAAA,CAAI,CAAG,IAAX,CACAvC,CAAS,CAACwC,MAAV,CAAiB,yCAAjB,CAA4DF,CAA5D,EAAqEX,IAArE,CAA0E,SAASc,CAAT,CAAeC,CAAf,CAAmB,CACzF5C,CAAG,CAAC6C,UAAJ,CAAe,uBAAf,CAAwC,mBAAxC,EAA6DhB,IAA7D,CAAkE,SAASiB,CAAT,CAAgB,CAC7E,GAAI3C,CAAAA,CAAJ,CAAa2C,CAAb,CAAoBH,CAApB,CAA0BzC,CAAS,CAAC6C,aAAV,CAAwBlC,IAAxB,CAA6BX,CAA7B,CAAwC0C,CAAxC,CAA1B,CAAuEH,CAAI,CAACO,QAAL,CAAcnC,IAAd,CAAmB4B,CAAnB,CAAvE,IACJ,CAFD,EAEGV,IAFH,CAEQhC,CAAY,CAACiC,SAFrB,CAGH,CAJD,EAIGD,IAJH,CAIQhC,CAAY,CAACiC,SAJrB,CAKH,CAPD,CAcA5B,CAAmB,CAACU,SAApB,CAA8BkC,QAA9B,CAAyC,UAAW,CAChD,GAAIzC,CAAAA,CAAM,CAAG,KAAKG,OAAlB,CAEAT,CAAI,CAACuB,IAAL,CAAU,CAAC,CACPC,UAAU,CAAE,4BADL,CAEPC,IAAI,CAAE,CAACE,MAAM,CAAErB,CAAT,CAFC,CAGPsB,IAAI,CAAE,KAAKoB,kBAAL,CAAwBpC,IAAxB,CAA6B,IAA7B,CAHC,CAIPkB,IAAI,CAAEhC,CAAY,CAACiC,SAJZ,CAAD,CAAV,CAMH,CATD,CAiBA5B,CAAmB,CAACU,SAApB,CAA8BmC,kBAA9B,CAAmD,SAAST,CAAT,CAAkB,CACjE,GAAIC,CAAAA,CAAI,CAAG,IAAX,CACAvC,CAAS,CAACwC,MAAV,CAAiB,mBAAjB,CAAsCF,CAAtC,EAA+CX,IAA/C,CAAoD,SAASc,CAAT,CAAeC,CAAf,CAAmB,CACnE1C,CAAS,CAACgD,WAAV,CAAsBT,CAAI,CAACjC,eAA3B,CAA4CmC,CAA5C,CAAkDC,CAAlD,CACH,CAFD,EAEGb,IAFH,CAEQhC,CAAY,CAACiC,SAFrB,CAGH,CALD,CAQA5B,CAAmB,CAACU,SAApB,CAA8BN,eAA9B,CAAgD,IAAhD,CAEAJ,CAAmB,CAACU,SAApB,CAA8BL,uBAA9B,CAAwD,IAAxD,CAEAL,CAAmB,CAACU,SAApB,CAA8BJ,OAA9B,CAAwC,IAAxC,CAEA,MAA+DN,CAAAA,CAElE,CAxGK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Module to open user competency plan in popup\n *\n * @package report_competency\n * @copyright 2016 Issam Taboubi \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/notification', 'core/str', 'core/ajax', 'core/templates', 'tool_lp/dialogue'],\n function($, notification, str, ajax, templates, Dialogue) {\n\n /**\n * UserCompetencyPopup\n *\n * @param {String} regionSelector The regionSelector\n * @param {String} userCompetencySelector The userCompetencySelector\n * @param {Number} planId The plan ID\n */\n var UserCompetencyPopup = function(regionSelector, userCompetencySelector, planId) {\n this._regionSelector = regionSelector;\n this._userCompetencySelector = userCompetencySelector;\n this._planId = planId;\n\n $(this._regionSelector).on('click', this._userCompetencySelector, this._handleClick.bind(this));\n };\n\n /**\n * Get the data from the closest TR and open the popup.\n *\n * @method _handleClick\n * @param {Event} e\n */\n UserCompetencyPopup.prototype._handleClick = function(e) {\n e.preventDefault();\n var tr = $(e.target).closest('tr');\n var competencyId = $(tr).data('competencyid');\n var userId = $(tr).data('userid');\n var planId = this._planId;\n\n var requests = ajax.call([{\n methodname: 'tool_lp_data_for_user_competency_summary_in_plan',\n args: {competencyid: competencyId, planid: planId},\n done: this._contextLoaded.bind(this),\n fail: notification.exception\n }]);\n // Log the user competency viewed in plan event.\n requests[0].then(function(result) {\n var eventMethodName = 'core_competency_user_competency_viewed_in_plan';\n // Trigger core_competency_user_competency_plan_viewed event instead if plan is already completed.\n if (result.plan.iscompleted) {\n eventMethodName = 'core_competency_user_competency_plan_viewed';\n }\n return ajax.call([{\n methodname: eventMethodName,\n args: {competencyid: competencyId, userid: userId, planid: planId}\n }])[0];\n }).catch(notification.exception);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _contextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._contextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/user_competency_summary_in_plan', context).done(function(html, js) {\n str.get_string('usercompetencysummary', 'report_competency').done(function(title) {\n (new Dialogue(title, html, templates.runTemplateJS.bind(templates, js), self._refresh.bind(self), true));\n }).fail(notification.exception);\n }).fail(notification.exception);\n };\n\n /**\n * Refresh the page.\n *\n * @method _refresh\n */\n UserCompetencyPopup.prototype._refresh = function() {\n var planId = this._planId;\n\n ajax.call([{\n methodname: 'tool_lp_data_for_plan_page',\n args: {planid: planId},\n done: this._pageContextLoaded.bind(this),\n fail: notification.exception\n }]);\n };\n\n /**\n * We loaded the context, now render the template.\n *\n * @method _pageContextLoaded\n * @param {Object} context\n */\n UserCompetencyPopup.prototype._pageContextLoaded = function(context) {\n var self = this;\n templates.render('tool_lp/plan_page', context).done(function(html, js) {\n templates.replaceNode(self._regionSelector, html, js);\n }).fail(notification.exception);\n };\n\n /** @type {String} The selector for the region with the user competencies */\n UserCompetencyPopup.prototype._regionSelector = null;\n /** @type {String} The selector for the region with a single user competencies */\n UserCompetencyPopup.prototype._userCompetencySelector = null;\n /** @type {Number} The plan Id */\n UserCompetencyPopup.prototype._planId = null;\n\n return /** @alias module:tool_lp/user_competency_plan_popup */ UserCompetencyPopup;\n\n});\n"],"file":"user_competency_plan_popup.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_competency_workflow.min.js b/admin/tool/lp/amd/build/user_competency_workflow.min.js index deab0e18ab36b..b975a287e3b95 100644 --- a/admin/tool/lp/amd/build/user_competency_workflow.min.js +++ b/admin/tool/lp/amd/build/user_competency_workflow.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/event_base"],function(a,b,c,d,e,f,g){var h=function(){g.prototype.constructor.apply(this,[])};return h.prototype=Object.create(g.prototype),h.prototype._nodeSelector='[data-node="user-competency"]',h.prototype._cancelReviewRequest=function(a){var b={methodname:"core_competency_user_competency_cancel_review_request",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-request-cancelled",a),this._trigger("status-changed",a)}.bind(this))["catch"](function(){this._trigger("error-occured",a)}.bind(this))},h.prototype.cancelReviewRequest=function(a){this._cancelReviewRequest(a)},h.prototype._cancelReviewRequestHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.cancelReviewRequest(c)},h.prototype._requestReview=function(a){var b={methodname:"core_competency_user_competency_request_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-requested",a),this._trigger("status-changed",a)}.bind(this))["catch"](function(){this._trigger("error-occured",a)}.bind(this))},h.prototype.requestReview=function(a){this._requestReview(a)},h.prototype._requestReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.requestReview(c)},h.prototype._startReview=function(a){var b={methodname:"core_competency_user_competency_start_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-started",a),this._trigger("status-changed",a)}.bind(this))["catch"](function(){this._trigger("error-occured",a)}.bind(this))},h.prototype.startReview=function(a){this._startReview(a)},h.prototype._startReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.startReview(c)},h.prototype._stopReview=function(a){var b={methodname:"core_competency_user_competency_stop_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-stopped",a),this._trigger("status-changed",a)}.bind(this))["catch"](function(){this._trigger("error-occured",a)}.bind(this))},h.prototype.stopReview=function(a){this._stopReview(a)},h.prototype._stopReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.stopReview(c)},h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="request-review"]':this._requestReviewHandler.bind(this),'[data-action="cancel-review-request"]':this._cancelReviewRequestHandler.bind(this)})},h.prototype._findUserCompetencyData=function(a){var b,c=a.parents(this._nodeSelector);if(1!=c.length)throw new Error("The evidence node was not located.");if(b=c.data(),"undefined"==typeof b||"undefined"==typeof b.userid||"undefined"==typeof b.competencyid)throw new Error("User competency data could not be found.");return b},h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="request-review"]':this._requestReviewHandler.bind(this),'[data-action="cancel-review-request"]':this._cancelReviewRequestHandler.bind(this),'[data-action="start-review"]':this._startReviewHandler.bind(this),'[data-action="stop-review"]':this._stopReviewHandler.bind(this)})},h.prototype.registerEvents=function(b){var c=a(b);c.find('[data-action="request-review"]').click(this._requestReviewHandler.bind(this)),c.find('[data-action="cancel-review-request"]').click(this._cancelReviewRequestHandler.bind(this)),c.find('[data-action="start-review"]').click(this._startReviewHandler.bind(this)),c.find('[data-action="stop-review"]').click(this._stopReviewHandler.bind(this))},h}); \ No newline at end of file +define ("tool_lp/user_competency_workflow",["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/event_base"],function(a,b,c,d,e,f,g){var h=function(){g.prototype.constructor.apply(this,[])};h.prototype=Object.create(g.prototype);h.prototype._nodeSelector="[data-node=\"user-competency\"]";h.prototype._cancelReviewRequest=function(a){var b={methodname:"core_competency_user_competency_cancel_review_request",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-request-cancelled",a);this._trigger("status-changed",a)}.bind(this)).catch(function(){this._trigger("error-occured",a)}.bind(this))};h.prototype.cancelReviewRequest=function(a){this._cancelReviewRequest(a)};h.prototype._cancelReviewRequestHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.cancelReviewRequest(c)};h.prototype._requestReview=function(a){var b={methodname:"core_competency_user_competency_request_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-requested",a);this._trigger("status-changed",a)}.bind(this)).catch(function(){this._trigger("error-occured",a)}.bind(this))};h.prototype.requestReview=function(a){this._requestReview(a)};h.prototype._requestReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.requestReview(c)};h.prototype._startReview=function(a){var b={methodname:"core_competency_user_competency_start_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-started",a);this._trigger("status-changed",a)}.bind(this)).catch(function(){this._trigger("error-occured",a)}.bind(this))};h.prototype.startReview=function(a){this._startReview(a)};h.prototype._startReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.startReview(c)};h.prototype._stopReview=function(a){var b={methodname:"core_competency_user_competency_stop_review",args:{userid:a.userid,competencyid:a.competencyid}};c.call([b])[0].then(function(){this._trigger("review-stopped",a);this._trigger("status-changed",a)}.bind(this)).catch(function(){this._trigger("error-occured",a)}.bind(this))};h.prototype.stopReview=function(a){this._stopReview(a)};h.prototype._stopReviewHandler=function(b){b.preventDefault();var c=this._findUserCompetencyData(a(b.target));this.stopReview(c)};h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="request-review"]':this._requestReviewHandler.bind(this),'[data-action="cancel-review-request"]':this._cancelReviewRequestHandler.bind(this)})};h.prototype._findUserCompetencyData=function(a){var b=a.parents(this._nodeSelector),c;if(1!=b.length){throw new Error("The evidence node was not located.")}c=b.data();if("undefined"==typeof c||"undefined"==typeof c.userid||"undefined"==typeof c.competencyid){throw new Error("User competency data could not be found.")}return c};h.prototype.enhanceMenubar=function(a){f.enhance(a,{'[data-action="request-review"]':this._requestReviewHandler.bind(this),'[data-action="cancel-review-request"]':this._cancelReviewRequestHandler.bind(this),'[data-action="start-review"]':this._startReviewHandler.bind(this),'[data-action="stop-review"]':this._stopReviewHandler.bind(this)})};h.prototype.registerEvents=function(b){var c=a(b);c.find("[data-action=\"request-review\"]").click(this._requestReviewHandler.bind(this));c.find("[data-action=\"cancel-review-request\"]").click(this._cancelReviewRequestHandler.bind(this));c.find("[data-action=\"start-review\"]").click(this._startReviewHandler.bind(this));c.find("[data-action=\"stop-review\"]").click(this._stopReviewHandler.bind(this))};return h}); +//# sourceMappingURL=user_competency_workflow.min.js.map diff --git a/admin/tool/lp/amd/build/user_competency_workflow.min.js.map b/admin/tool/lp/amd/build/user_competency_workflow.min.js.map new file mode 100644 index 0000000000000..afc0a4c44b24d --- /dev/null +++ b/admin/tool/lp/amd/build/user_competency_workflow.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/user_competency_workflow.js"],"names":["define","$","Templates","Ajax","Notification","Str","Menubar","EventBase","UserCompetencyWorkflow","prototype","constructor","apply","Object","create","_nodeSelector","_cancelReviewRequest","data","call","methodname","args","userid","competencyid","then","_trigger","bind","catch","cancelReviewRequest","_cancelReviewRequestHandler","e","preventDefault","_findUserCompetencyData","target","_requestReview","requestReview","_requestReviewHandler","_startReview","startReview","_startReviewHandler","_stopReview","stopReview","_stopReviewHandler","enhanceMenubar","selector","enhance","node","parent","parents","length","Error","registerEvents","wrapper","find","click"],"mappings":"AAuBAA,OAAM,oCAAC,CAAC,QAAD,CACC,gBADD,CAEC,WAFD,CAGC,mBAHD,CAIC,UAJD,CAKC,iBALD,CAMC,oBAND,CAAD,CAOE,SAASC,CAAT,CAAYC,CAAZ,CAAuBC,CAAvB,CAA6BC,CAA7B,CAA2CC,CAA3C,CAAgDC,CAAhD,CAAyDC,CAAzD,CAAoE,CAOxE,GAAIC,CAAAA,CAAsB,CAAG,UAAW,CACpCD,CAAS,CAACE,SAAV,CAAoBC,WAApB,CAAgCC,KAAhC,CAAsC,IAAtC,CAA4C,EAA5C,CACH,CAFD,CAGAH,CAAsB,CAACC,SAAvB,CAAmCG,MAAM,CAACC,MAAP,CAAcN,CAAS,CAACE,SAAxB,CAAnC,CAGAD,CAAsB,CAACC,SAAvB,CAAiCK,aAAjC,CAAiD,iCAAjD,CAQAN,CAAsB,CAACC,SAAvB,CAAiCM,oBAAjC,CAAwD,SAASC,CAAT,CAAe,CACnE,GAAIC,CAAAA,CAAI,CAAG,CACPC,UAAU,CAAE,uDADL,CAEPC,IAAI,CAAE,CACFC,MAAM,CAAEJ,CAAI,CAACI,MADX,CAEFC,YAAY,CAAEL,CAAI,CAACK,YAFjB,CAFC,CAAX,CAQAlB,CAAI,CAACc,IAAL,CAAU,CAACA,CAAD,CAAV,EAAkB,CAAlB,EAAqBK,IAArB,CAA0B,UAAW,CACjC,KAAKC,QAAL,CAAc,0BAAd,CAA0CP,CAA1C,EACA,KAAKO,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,CACH,CAHyB,CAGxBQ,IAHwB,CAGnB,IAHmB,CAA1B,EAGcC,KAHd,CAGoB,UAAW,CAC3B,KAAKF,QAAL,CAAc,eAAd,CAA+BP,CAA/B,CACH,CAFmB,CAElBQ,IAFkB,CAEb,IAFa,CAHpB,CAMH,CAfD,CAuBAhB,CAAsB,CAACC,SAAvB,CAAiCiB,mBAAjC,CAAuD,SAASV,CAAT,CAAe,CAClE,KAAKD,oBAAL,CAA0BC,CAA1B,CACH,CAFD,CAUAR,CAAsB,CAACC,SAAvB,CAAiCkB,2BAAjC,CAA+D,SAASC,CAAT,CAAY,CACvEA,CAAC,CAACC,cAAF,GACA,GAAIb,CAAAA,CAAI,CAAG,KAAKc,uBAAL,CAA6B7B,CAAC,CAAC2B,CAAC,CAACG,MAAH,CAA9B,CAAX,CACA,KAAKL,mBAAL,CAAyBV,CAAzB,CACH,CAJD,CAYAR,CAAsB,CAACC,SAAvB,CAAiCuB,cAAjC,CAAkD,SAAShB,CAAT,CAAe,CAC7D,GAAIC,CAAAA,CAAI,CAAG,CACPC,UAAU,CAAE,gDADL,CAEPC,IAAI,CAAE,CACFC,MAAM,CAAEJ,CAAI,CAACI,MADX,CAEFC,YAAY,CAAEL,CAAI,CAACK,YAFjB,CAFC,CAAX,CAQAlB,CAAI,CAACc,IAAL,CAAU,CAACA,CAAD,CAAV,EAAkB,CAAlB,EAAqBK,IAArB,CAA0B,UAAW,CACjC,KAAKC,QAAL,CAAc,kBAAd,CAAkCP,CAAlC,EACA,KAAKO,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,CACH,CAHyB,CAGxBQ,IAHwB,CAGnB,IAHmB,CAA1B,EAGcC,KAHd,CAGoB,UAAW,CAC3B,KAAKF,QAAL,CAAc,eAAd,CAA+BP,CAA/B,CACH,CAFmB,CAElBQ,IAFkB,CAEb,IAFa,CAHpB,CAMH,CAfD,CAuBAhB,CAAsB,CAACC,SAAvB,CAAiCwB,aAAjC,CAAiD,SAASjB,CAAT,CAAe,CAC5D,KAAKgB,cAAL,CAAoBhB,CAApB,CACH,CAFD,CAUAR,CAAsB,CAACC,SAAvB,CAAiCyB,qBAAjC,CAAyD,SAASN,CAAT,CAAY,CACjEA,CAAC,CAACC,cAAF,GACA,GAAIb,CAAAA,CAAI,CAAG,KAAKc,uBAAL,CAA6B7B,CAAC,CAAC2B,CAAC,CAACG,MAAH,CAA9B,CAAX,CACA,KAAKE,aAAL,CAAmBjB,CAAnB,CACH,CAJD,CAYAR,CAAsB,CAACC,SAAvB,CAAiC0B,YAAjC,CAAgD,SAASnB,CAAT,CAAe,CAC3D,GAAIC,CAAAA,CAAI,CAAG,CACPC,UAAU,CAAE,8CADL,CAEPC,IAAI,CAAE,CACFC,MAAM,CAAEJ,CAAI,CAACI,MADX,CAEFC,YAAY,CAAEL,CAAI,CAACK,YAFjB,CAFC,CAAX,CAOAlB,CAAI,CAACc,IAAL,CAAU,CAACA,CAAD,CAAV,EAAkB,CAAlB,EAAqBK,IAArB,CAA0B,UAAW,CACjC,KAAKC,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,EACA,KAAKO,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,CACH,CAHyB,CAGxBQ,IAHwB,CAGnB,IAHmB,CAA1B,EAGcC,KAHd,CAGoB,UAAW,CAC3B,KAAKF,QAAL,CAAc,eAAd,CAA+BP,CAA/B,CACH,CAFmB,CAElBQ,IAFkB,CAEb,IAFa,CAHpB,CAMH,CAdD,CAsBAhB,CAAsB,CAACC,SAAvB,CAAiC2B,WAAjC,CAA+C,SAASpB,CAAT,CAAe,CAC1D,KAAKmB,YAAL,CAAkBnB,CAAlB,CACH,CAFD,CAUAR,CAAsB,CAACC,SAAvB,CAAiC4B,mBAAjC,CAAuD,SAAST,CAAT,CAAY,CAC/DA,CAAC,CAACC,cAAF,GACA,GAAIb,CAAAA,CAAI,CAAG,KAAKc,uBAAL,CAA6B7B,CAAC,CAAC2B,CAAC,CAACG,MAAH,CAA9B,CAAX,CACA,KAAKK,WAAL,CAAiBpB,CAAjB,CACH,CAJD,CAYAR,CAAsB,CAACC,SAAvB,CAAiC6B,WAAjC,CAA+C,SAAStB,CAAT,CAAe,CAC1D,GAAIC,CAAAA,CAAI,CAAG,CACPC,UAAU,CAAE,6CADL,CAEPC,IAAI,CAAE,CACFC,MAAM,CAAEJ,CAAI,CAACI,MADX,CAEFC,YAAY,CAAEL,CAAI,CAACK,YAFjB,CAFC,CAAX,CAQAlB,CAAI,CAACc,IAAL,CAAU,CAACA,CAAD,CAAV,EAAkB,CAAlB,EAAqBK,IAArB,CAA0B,UAAW,CACjC,KAAKC,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,EACA,KAAKO,QAAL,CAAc,gBAAd,CAAgCP,CAAhC,CACH,CAHyB,CAGxBQ,IAHwB,CAGnB,IAHmB,CAA1B,EAGcC,KAHd,CAGoB,UAAW,CAC3B,KAAKF,QAAL,CAAc,eAAd,CAA+BP,CAA/B,CACH,CAFmB,CAElBQ,IAFkB,CAEb,IAFa,CAHpB,CAMH,CAfD,CAuBAhB,CAAsB,CAACC,SAAvB,CAAiC8B,UAAjC,CAA8C,SAASvB,CAAT,CAAe,CACzD,KAAKsB,WAAL,CAAiBtB,CAAjB,CACH,CAFD,CAUAR,CAAsB,CAACC,SAAvB,CAAiC+B,kBAAjC,CAAsD,SAASZ,CAAT,CAAY,CAC9DA,CAAC,CAACC,cAAF,GACA,GAAIb,CAAAA,CAAI,CAAG,KAAKc,uBAAL,CAA6B7B,CAAC,CAAC2B,CAAC,CAACG,MAAH,CAA9B,CAAX,CACA,KAAKQ,UAAL,CAAgBvB,CAAhB,CACH,CAJD,CAWAR,CAAsB,CAACC,SAAvB,CAAiCgC,cAAjC,CAAkD,SAASC,CAAT,CAAmB,CACjEpC,CAAO,CAACqC,OAAR,CAAgBD,CAAhB,CAA0B,CACtB,iCAAkC,KAAKR,qBAAL,CAA2BV,IAA3B,CAAgC,IAAhC,CADZ,CAEtB,wCAAyC,KAAKG,2BAAL,CAAiCH,IAAjC,CAAsC,IAAtC,CAFnB,CAA1B,CAIH,CALD,CAaAhB,CAAsB,CAACC,SAAvB,CAAiCqB,uBAAjC,CAA2D,SAASc,CAAT,CAAe,CACtE,GAAIC,CAAAA,CAAM,CAAGD,CAAI,CAACE,OAAL,CAAa,KAAKhC,aAAlB,CAAb,CACIE,CADJ,CAGA,GAAqB,CAAjB,EAAA6B,CAAM,CAACE,MAAX,CAAwB,CACpB,KAAM,IAAIC,CAAAA,KAAJ,CAAU,oCAAV,CACT,CAEDhC,CAAI,CAAG6B,CAAM,CAAC7B,IAAP,EAAP,CACA,GAAoB,WAAhB,QAAOA,CAAAA,CAAP,EAAsD,WAAvB,QAAOA,CAAAA,CAAI,CAACI,MAA3C,EAAkG,WAA7B,QAAOJ,CAAAA,CAAI,CAACK,YAArF,CAAmH,CAC/G,KAAM,IAAI2B,CAAAA,KAAJ,CAAU,0CAAV,CACT,CAED,MAAOhC,CAAAA,CACV,CAdD,CAqBAR,CAAsB,CAACC,SAAvB,CAAiCgC,cAAjC,CAAkD,SAASC,CAAT,CAAmB,CACjEpC,CAAO,CAACqC,OAAR,CAAgBD,CAAhB,CAA0B,CACtB,iCAAkC,KAAKR,qBAAL,CAA2BV,IAA3B,CAAgC,IAAhC,CADZ,CAEtB,wCAAyC,KAAKG,2BAAL,CAAiCH,IAAjC,CAAsC,IAAtC,CAFnB,CAGtB,+BAAgC,KAAKa,mBAAL,CAAyBb,IAAzB,CAA8B,IAA9B,CAHV,CAItB,8BAA+B,KAAKgB,kBAAL,CAAwBhB,IAAxB,CAA6B,IAA7B,CAJT,CAA1B,CAMH,CAPD,CAcAhB,CAAsB,CAACC,SAAvB,CAAiCwC,cAAjC,CAAkD,SAASP,CAAT,CAAmB,CACjE,GAAIQ,CAAAA,CAAO,CAAGjD,CAAC,CAACyC,CAAD,CAAf,CAEAQ,CAAO,CAACC,IAAR,CAAa,kCAAb,EAA+CC,KAA/C,CAAqD,KAAKlB,qBAAL,CAA2BV,IAA3B,CAAgC,IAAhC,CAArD,EACA0B,CAAO,CAACC,IAAR,CAAa,yCAAb,EAAsDC,KAAtD,CAA4D,KAAKzB,2BAAL,CAAiCH,IAAjC,CAAsC,IAAtC,CAA5D,EACA0B,CAAO,CAACC,IAAR,CAAa,gCAAb,EAA6CC,KAA7C,CAAmD,KAAKf,mBAAL,CAAyBb,IAAzB,CAA8B,IAA9B,CAAnD,EACA0B,CAAO,CAACC,IAAR,CAAa,+BAAb,EAA4CC,KAA5C,CAAkD,KAAKZ,kBAAL,CAAwBhB,IAAxB,CAA6B,IAA7B,CAAlD,CACH,CAPD,CASA,MAA4DhB,CAAAA,CAC/D,CAxQK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * User competency workflow.\n *\n * @module tool_lp/user_competency_workflow\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/event_base'],\n function($, Templates, Ajax, Notification, Str, Menubar, EventBase) {\n\n /**\n * UserCompetencyWorkflow class.\n *\n * @param {String} selector The node containing the buttons to switch mode.\n */\n var UserCompetencyWorkflow = function() {\n EventBase.prototype.constructor.apply(this, []);\n };\n UserCompetencyWorkflow.prototype = Object.create(EventBase.prototype);\n\n /** @type {String} The selector to find the user competency data. */\n UserCompetencyWorkflow.prototype._nodeSelector = '[data-node=\"user-competency\"]';\n\n /**\n * Cancel a review request and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequest = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_cancel_review_request',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-request-cancelled', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Cancel a review request an refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method cancelReviewRequest\n */\n UserCompetencyWorkflow.prototype.cancelReviewRequest = function(data) {\n this._cancelReviewRequest(data);\n };\n\n /**\n * Cancel a review request handler.\n *\n * @param {Event} e The event.\n * @method _cancelReviewRequestHandler\n */\n UserCompetencyWorkflow.prototype._cancelReviewRequestHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.cancelReviewRequest(data);\n };\n\n /**\n * Request a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _requestReview\n */\n UserCompetencyWorkflow.prototype._requestReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_request_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-requested', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Request a review.\n *\n * @param {Object} data The user competency data.\n * @method requestReview\n */\n UserCompetencyWorkflow.prototype.requestReview = function(data) {\n this._requestReview(data);\n };\n\n /**\n * Request a review handler.\n *\n * @param {Event} e The event.\n * @method _requestReviewHandler\n */\n UserCompetencyWorkflow.prototype._requestReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.requestReview(data);\n };\n\n /**\n * Start a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _startReview\n */\n UserCompetencyWorkflow.prototype._startReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_start_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n Ajax.call([call])[0].then(function() {\n this._trigger('review-started', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Start a review.\n *\n * @param {Object} data The user competency data.\n * @method startReview\n */\n UserCompetencyWorkflow.prototype.startReview = function(data) {\n this._startReview(data);\n };\n\n /**\n * Start a review handler.\n *\n * @param {Event} e The event.\n * @method _startReviewHandler\n */\n UserCompetencyWorkflow.prototype._startReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.startReview(data);\n };\n\n /**\n * Stop a review and refresh the view.\n *\n * @param {Object} data The user competency data.\n * @method _stopReview\n */\n UserCompetencyWorkflow.prototype._stopReview = function(data) {\n var call = {\n methodname: 'core_competency_user_competency_stop_review',\n args: {\n userid: data.userid,\n competencyid: data.competencyid\n }\n };\n\n Ajax.call([call])[0].then(function() {\n this._trigger('review-stopped', data);\n this._trigger('status-changed', data);\n }.bind(this)).catch(function() {\n this._trigger('error-occured', data);\n }.bind(this));\n };\n\n /**\n * Stop a review.\n *\n * @param {Object} data The user competency data.\n * @method stopReview\n */\n UserCompetencyWorkflow.prototype.stopReview = function(data) {\n this._stopReview(data);\n };\n\n /**\n * Stop a review handler.\n *\n * @param {Event} e The event.\n * @method _stopReviewHandler\n */\n UserCompetencyWorkflow.prototype._stopReviewHandler = function(e) {\n e.preventDefault();\n var data = this._findUserCompetencyData($(e.target));\n this.stopReview(data);\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n });\n };\n\n /**\n * Find the user competency data from a node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} User competency data.\n */\n UserCompetencyWorkflow.prototype._findUserCompetencyData = function(node) {\n var parent = node.parents(this._nodeSelector),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.userid === 'undefined' || typeof data.competencyid === 'undefined') {\n throw new Error('User competency data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserCompetencyWorkflow.prototype.enhanceMenubar = function(selector) {\n Menubar.enhance(selector, {\n '[data-action=\"request-review\"]': this._requestReviewHandler.bind(this),\n '[data-action=\"cancel-review-request\"]': this._cancelReviewRequestHandler.bind(this),\n '[data-action=\"start-review\"]': this._startReviewHandler.bind(this),\n '[data-action=\"stop-review\"]': this._stopReviewHandler.bind(this),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * @param {String} selector The base selector to search nodes in and attach events.\n */\n UserCompetencyWorkflow.prototype.registerEvents = function(selector) {\n var wrapper = $(selector);\n\n wrapper.find('[data-action=\"request-review\"]').click(this._requestReviewHandler.bind(this));\n wrapper.find('[data-action=\"cancel-review-request\"]').click(this._cancelReviewRequestHandler.bind(this));\n wrapper.find('[data-action=\"start-review\"]').click(this._startReviewHandler.bind(this));\n wrapper.find('[data-action=\"stop-review\"]').click(this._stopReviewHandler.bind(this));\n };\n\n return /** @alias module:tool_lp/user_competency_actions */ UserCompetencyWorkflow;\n});\n"],"file":"user_competency_workflow.min.js"} \ No newline at end of file diff --git a/admin/tool/lp/amd/build/user_evidence_actions.min.js b/admin/tool/lp/amd/build/user_evidence_actions.min.js index f8b28d73c73e0..d8c7b8efe089a 100644 --- a/admin/tool/lp/amd/build/user_evidence_actions.min.js +++ b/admin/tool/lp/amd/build/user_evidence_actions.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/competencypicker_user_plans"],function(a,b,c,d,e,f,g){var h=function(a){if(this._type=a,"evidence"===a)this._region='[data-region="user-evidence-page"]',this._evidenceNode='[data-region="user-evidence-page"]',this._template="tool_lp/user_evidence_page",this._contextMethod="tool_lp_data_for_user_evidence_page";else{if("list"!==a)throw new TypeError("Unexpected type.");this._region='[data-region="user-evidence-list"]',this._evidenceNode='[data-region="user-evidence-node"]',this._template="tool_lp/user_evidence_list_page",this._contextMethod="tool_lp_data_for_user_evidence_list_page"}};return h.prototype._contextMethod=null,h.prototype._evidenceNode=null,h.prototype._region=null,h.prototype._template=null,h.prototype._type=null,h.prototype._getContextArgs=function(a){var b=this,c={};return"evidence"===b._type?c={id:a.id}:"list"===b._type&&(c={userid:a.userid}),c},h.prototype._renderView=function(c){var d=this;return b.render(d._template,c).then(function(c,e){b.replaceNode(a(d._region),c,e)})},h.prototype._callAndRefresh=function(b,e){var f=this;return b.push({methodname:f._contextMethod,args:f._getContextArgs(e)}),a.when.apply(a.when,c.call(b)).then(function(){return f._renderView(arguments[arguments.length-1])}).fail(d.exception)},h.prototype._doDelete=function(a){var b=this,c=[{methodname:"core_competency_delete_user_evidence",args:{id:a.id}}];b._callAndRefresh(c,a)},h.prototype.deleteEvidence=function(a){var b,f=this;b=c.call([{methodname:"core_competency_read_user_evidence",args:{id:a.id}}]),b[0].done(function(b){e.get_strings([{key:"confirm",component:"moodle"},{key:"deleteuserevidence",component:"tool_lp",param:b.name},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(b){d.confirm(b[0],b[1],b[2],b[3],function(){f._doDelete(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._deleteEvidenceHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.deleteEvidence(c)},h.prototype._doCreateUserEvidenceCompetency=function(b,c){var d=this,e=[];a.each(c,function(a,c){e.push({methodname:"core_competency_create_user_evidence_competency",args:{userevidenceid:b.id,competencyid:c}})}),d._callAndRefresh(e,b)},h.prototype.createUserEvidenceCompetency=function(a){var b=this,c=new g(a.userid);c.on("save",function(c,d){var e=d.competencyIds;b._doCreateUserEvidenceCompetency(a,e,d.requestReview)}),c.display()},h.prototype._createUserEvidenceCompetencyHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.createUserEvidenceCompetency(c)},h.prototype._doDeleteUserEvidenceCompetency=function(a,b){var c=this,d=[];d.push({methodname:"core_competency_delete_user_evidence_competency",args:{userevidenceid:a.id,competencyid:b}}),c._callAndRefresh(d,a)},h.prototype.deleteUserEvidenceCompetency=function(a,b){this._doDeleteUserEvidenceCompetency(a,b)},h.prototype._deleteUserEvidenceCompetencyHandler=function(b){var c=this._findEvidenceData(a(b.currentTarget)),d=a(b.currentTarget).data("id");b.preventDefault(),this.deleteUserEvidenceCompetency(c,d)},h.prototype._doReviewUserEvidenceCompetencies=function(a){var b=this,c=[{methodname:"core_competency_request_review_of_user_evidence_linked_competencies",args:{id:a.id}}];b._callAndRefresh(c,a)},h.prototype.reviewUserEvidenceCompetencies=function(a){var b,f=this;b=c.call([{methodname:"core_competency_read_user_evidence",args:{id:a.id}}]),b[0].done(function(b){e.get_strings([{key:"confirm",component:"moodle"},{key:"sendallcompetenciestoreview",component:"tool_lp",param:b.name},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(b){d.confirm(b[0],b[1],b[2],b[3],function(){f._doReviewUserEvidenceCompetencies(a)})}).fail(d.exception)}).fail(d.exception)},h.prototype._reviewUserEvidenceCompetenciesHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.reviewUserEvidenceCompetencies(c)},h.prototype._findEvidenceData=function(b){var c,d=b.parentsUntil(a(this._region).parent(),this._evidenceNode);if(1!=d.length)throw new Error("The evidence node was not located.");if(c=d.data(),"undefined"==typeof c||"undefined"==typeof c.id)throw new Error("Evidence data could not be found.");return c},h.prototype.enhanceMenubar=function(a){var b=this;f.enhance(a,{'[data-action="user-evidence-delete"]':b._deleteEvidenceHandler.bind(b),'[data-action="link-competency"]':b._createUserEvidenceCompetencyHandler.bind(b),'[data-action="send-competencies-review"]':b._reviewUserEvidenceCompetenciesHandler.bind(b)})},h.prototype.registerEvents=function(){var b=a(this._region),c=this;b.find('[data-action="user-evidence-delete"]').click(c._deleteEvidenceHandler.bind(c)),b.find('[data-action="link-competency"]').click(c._createUserEvidenceCompetencyHandler.bind(c)),b.find('[data-action="delete-competency-link"]').click(c._deleteUserEvidenceCompetencyHandler.bind(c)),b.find('[data-action="send-competencies-review"]').click(c._reviewUserEvidenceCompetenciesHandler.bind(c))},h}); \ No newline at end of file +define ("tool_lp/user_evidence_actions",["jquery","core/templates","core/ajax","core/notification","core/str","tool_lp/menubar","tool_lp/competencypicker_user_plans"],function(a,b,c,d,e,f,g){var h=function(a){this._type=a;if("evidence"===a){this._region="[data-region=\"user-evidence-page\"]";this._evidenceNode="[data-region=\"user-evidence-page\"]";this._template="tool_lp/user_evidence_page";this._contextMethod="tool_lp_data_for_user_evidence_page"}else if("list"===a){this._region="[data-region=\"user-evidence-list\"]";this._evidenceNode="[data-region=\"user-evidence-node\"]";this._template="tool_lp/user_evidence_list_page";this._contextMethod="tool_lp_data_for_user_evidence_list_page"}else{throw new TypeError("Unexpected type.")}};h.prototype._contextMethod=null;h.prototype._evidenceNode=null;h.prototype._region=null;h.prototype._template=null;h.prototype._type=null;h.prototype._getContextArgs=function(a){var b=this,c={};if("evidence"===b._type){c={id:a.id}}else if("list"===b._type){c={userid:a.userid}}return c};h.prototype._renderView=function(c){var d=this;return b.render(d._template,c).then(function(c,e){b.replaceNode(a(d._region),c,e)})};h.prototype._callAndRefresh=function(b,e){var f=this;b.push({methodname:f._contextMethod,args:f._getContextArgs(e)});return a.when.apply(a.when,c.call(b)).then(function(){return f._renderView(arguments[arguments.length-1])}).fail(d.exception)};h.prototype._doDelete=function(a){var b=this,c=[{methodname:"core_competency_delete_user_evidence",args:{id:a.id}}];b._callAndRefresh(c,a)};h.prototype.deleteEvidence=function(a){var b=this,f;f=c.call([{methodname:"core_competency_read_user_evidence",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"deleteuserevidence",component:"tool_lp",param:c.name},{key:"delete",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doDelete(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._deleteEvidenceHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.deleteEvidence(c)};h.prototype._doCreateUserEvidenceCompetency=function(b,c){var d=this,e=[];a.each(c,function(a,c){e.push({methodname:"core_competency_create_user_evidence_competency",args:{userevidenceid:b.id,competencyid:c}})});d._callAndRefresh(e,b)};h.prototype.createUserEvidenceCompetency=function(a){var b=this,c=new g(a.userid);c.on("save",function(c,d){var e=d.competencyIds;b._doCreateUserEvidenceCompetency(a,e,d.requestReview)});c.display()};h.prototype._createUserEvidenceCompetencyHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.createUserEvidenceCompetency(c)};h.prototype._doDeleteUserEvidenceCompetency=function(a,b){var c=this,d=[];d.push({methodname:"core_competency_delete_user_evidence_competency",args:{userevidenceid:a.id,competencyid:b}});c._callAndRefresh(d,a)};h.prototype.deleteUserEvidenceCompetency=function(a,b){this._doDeleteUserEvidenceCompetency(a,b)};h.prototype._deleteUserEvidenceCompetencyHandler=function(b){var c=this._findEvidenceData(a(b.currentTarget)),d=a(b.currentTarget).data("id");b.preventDefault();this.deleteUserEvidenceCompetency(c,d)};h.prototype._doReviewUserEvidenceCompetencies=function(a){var b=this,c=[{methodname:"core_competency_request_review_of_user_evidence_linked_competencies",args:{id:a.id}}];b._callAndRefresh(c,a)};h.prototype.reviewUserEvidenceCompetencies=function(a){var b=this,f;f=c.call([{methodname:"core_competency_read_user_evidence",args:{id:a.id}}]);f[0].done(function(c){e.get_strings([{key:"confirm",component:"moodle"},{key:"sendallcompetenciestoreview",component:"tool_lp",param:c.name},{key:"confirm",component:"moodle"},{key:"cancel",component:"moodle"}]).done(function(c){d.confirm(c[0],c[1],c[2],c[3],function(){b._doReviewUserEvidenceCompetencies(a)})}).fail(d.exception)}).fail(d.exception)};h.prototype._reviewUserEvidenceCompetenciesHandler=function(b){b.preventDefault();var c=this._findEvidenceData(a(b.target));this.reviewUserEvidenceCompetencies(c)};h.prototype._findEvidenceData=function(b){var c=b.parentsUntil(a(this._region).parent(),this._evidenceNode),d;if(1!=c.length){throw new Error("The evidence node was not located.")}d=c.data();if("undefined"==typeof d||"undefined"==typeof d.id){throw new Error("Evidence data could not be found.")}return d};h.prototype.enhanceMenubar=function(a){var b=this;f.enhance(a,{'[data-action="user-evidence-delete"]':b._deleteEvidenceHandler.bind(b),'[data-action="link-competency"]':b._createUserEvidenceCompetencyHandler.bind(b),'[data-action="send-competencies-review"]':b._reviewUserEvidenceCompetenciesHandler.bind(b)})};h.prototype.registerEvents=function(){var b=a(this._region),c=this;b.find("[data-action=\"user-evidence-delete\"]").click(c._deleteEvidenceHandler.bind(c));b.find("[data-action=\"link-competency\"]").click(c._createUserEvidenceCompetencyHandler.bind(c));b.find("[data-action=\"delete-competency-link\"]").click(c._deleteUserEvidenceCompetencyHandler.bind(c));b.find("[data-action=\"send-competencies-review\"]").click(c._reviewUserEvidenceCompetenciesHandler.bind(c))};return h}); +//# sourceMappingURL=user_evidence_actions.min.js.map diff --git a/admin/tool/lp/amd/build/user_evidence_actions.min.js.map b/admin/tool/lp/amd/build/user_evidence_actions.min.js.map new file mode 100644 index 0000000000000..47d584ccef230 --- /dev/null +++ b/admin/tool/lp/amd/build/user_evidence_actions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/user_evidence_actions.js"],"names":["define","$","templates","ajax","notification","str","Menubar","PickerUserPlans","UserEvidenceActions","type","_type","_region","_evidenceNode","_template","_contextMethod","TypeError","prototype","_getContextArgs","evidenceData","self","args","id","userid","_renderView","context","render","then","newhtml","newjs","replaceNode","_callAndRefresh","calls","push","methodname","when","apply","call","arguments","length","fail","exception","_doDelete","deleteEvidence","requests","done","evidence","get_strings","key","component","param","name","strings","confirm","_deleteEvidenceHandler","e","preventDefault","data","_findEvidenceData","target","_doCreateUserEvidenceCompetency","competencyIds","each","index","competencyId","userevidenceid","competencyid","createUserEvidenceCompetency","picker","on","requestReview","display","_createUserEvidenceCompetencyHandler","_doDeleteUserEvidenceCompetency","deleteUserEvidenceCompetency","_deleteUserEvidenceCompetencyHandler","currentTarget","_doReviewUserEvidenceCompetencies","reviewUserEvidenceCompetencies","_reviewUserEvidenceCompetenciesHandler","node","parent","parentsUntil","Error","enhanceMenubar","selector","enhance","bind","registerEvents","wrapper","find","click"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * User evidence actions.\n *\n * @module tool_lp/user_evidence_actions\n * @package tool_lp\n * @copyright 2015 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery',\n 'core/templates',\n 'core/ajax',\n 'core/notification',\n 'core/str',\n 'tool_lp/menubar',\n 'tool_lp/competencypicker_user_plans'],\n function($, templates, ajax, notification, str, Menubar, PickerUserPlans) {\n\n /**\n * UserEvidenceActions class.\n *\n * Note that presently this cannot be instantiated more than once per page.\n *\n * @param {String} type The type of page we're in.\n */\n var UserEvidenceActions = function(type) {\n this._type = type;\n\n if (type === 'evidence') {\n // This is the page to view one evidence.\n this._region = '[data-region=\"user-evidence-page\"]';\n this._evidenceNode = '[data-region=\"user-evidence-page\"]';\n this._template = 'tool_lp/user_evidence_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_page';\n\n } else if (type === 'list') {\n // This is the page to view a list of evidence.\n this._region = '[data-region=\"user-evidence-list\"]';\n this._evidenceNode = '[data-region=\"user-evidence-node\"]';\n this._template = 'tool_lp/user_evidence_list_page';\n this._contextMethod = 'tool_lp_data_for_user_evidence_list_page';\n\n } else {\n throw new TypeError('Unexpected type.');\n }\n };\n\n /** @type {String} Ajax method to fetch the page data from. */\n UserEvidenceActions.prototype._contextMethod = null;\n /** @type {String} Selector to find the node describing the evidence. */\n UserEvidenceActions.prototype._evidenceNode = null;\n /** @type {String} Selector mapping to the region to update. Usually similar to wrapper. */\n UserEvidenceActions.prototype._region = null;\n /** @type {String} Name of the template used to render the region. */\n UserEvidenceActions.prototype._template = null;\n /** @type {String} Type of page/region we're in. */\n UserEvidenceActions.prototype._type = null;\n\n /**\n * Resolve the arguments to refresh the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Object} List of arguments.\n */\n UserEvidenceActions.prototype._getContextArgs = function(evidenceData) {\n var self = this,\n args = {};\n\n if (self._type === 'evidence') {\n args = {\n id: evidenceData.id\n };\n\n } else if (self._type === 'list') {\n args = {\n userid: evidenceData.userid\n };\n }\n\n return args;\n };\n\n /**\n * Callback to render the region template.\n *\n * @param {Object} context The context for the template.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._renderView = function(context) {\n var self = this;\n return templates.render(self._template, context)\n .then(function(newhtml, newjs) {\n templates.replaceNode($(self._region), newhtml, newjs);\n return;\n });\n };\n\n /**\n * Call multiple ajax methods, and refresh.\n *\n * @param {Array} calls List of Ajax calls.\n * @param {Object} evidenceData Evidence data from evidence node.\n * @return {Promise}\n */\n UserEvidenceActions.prototype._callAndRefresh = function(calls, evidenceData) {\n var self = this;\n calls.push({\n methodname: self._contextMethod,\n args: self._getContextArgs(evidenceData)\n });\n\n // Apply all the promises, and refresh when the last one is resolved.\n return $.when.apply($.when, ajax.call(calls))\n .then(function() {\n return self._renderView(arguments[arguments.length - 1]);\n })\n .fail(notification.exception);\n };\n\n /**\n * Delete a plan and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doDelete = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_delete_user_evidence',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a plan.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.deleteEvidence = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'deleteuserevidence', component: 'tool_lp', param: evidence.name},\n {key: 'delete', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Delete evidence X?\n strings[2], // Delete.\n strings[3], // Cancel.\n function() {\n self._doDelete(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Delete evidence handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteEvidenceHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.deleteEvidence(data);\n };\n\n /**\n * Link a competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyIds The competency IDs.\n * @param {Boolean} requestReview Send competencies to review.\n */\n UserEvidenceActions.prototype._doCreateUserEvidenceCompetency = function(evidenceData, competencyIds) {\n var self = this,\n calls = [];\n\n $.each(competencyIds, function(index, competencyId) {\n calls.push({\n methodname: 'core_competency_create_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Create a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.createUserEvidenceCompetency = function(evidenceData) {\n var self = this,\n picker = new PickerUserPlans(evidenceData.userid);\n\n picker.on('save', function(e, data) {\n var competencyIds = data.competencyIds;\n self._doCreateUserEvidenceCompetency(evidenceData, competencyIds, data.requestReview);\n });\n\n picker.display();\n };\n\n /**\n * Create user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._createUserEvidenceCompetencyHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.createUserEvidenceCompetency(data);\n };\n\n /**\n * Remove a linked competency and reload.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype._doDeleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n var self = this,\n calls = [];\n\n calls.push({\n methodname: 'core_competency_delete_user_evidence_competency',\n args: {\n userevidenceid: evidenceData.id,\n competencyid: competencyId,\n }\n });\n\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Delete a user evidence competency.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n * @param {Number} competencyId The competency ID.\n */\n UserEvidenceActions.prototype.deleteUserEvidenceCompetency = function(evidenceData, competencyId) {\n this._doDeleteUserEvidenceCompetency(evidenceData, competencyId);\n };\n\n /**\n * Delete user evidence competency handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._deleteUserEvidenceCompetencyHandler = function(e) {\n var data = this._findEvidenceData($(e.currentTarget)),\n competencyId = $(e.currentTarget).data('id');\n e.preventDefault();\n this.deleteUserEvidenceCompetency(data, competencyId);\n };\n\n /**\n * Send request review for user evidence competencies and reload the region.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype._doReviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n calls = [{\n methodname: 'core_competency_request_review_of_user_evidence_linked_competencies',\n args: {id: evidenceData.id}\n }];\n self._callAndRefresh(calls, evidenceData);\n };\n\n /**\n * Send request review for user evidence competencies.\n *\n * @param {Object} evidenceData Evidence data from evidence node.\n */\n UserEvidenceActions.prototype.reviewUserEvidenceCompetencies = function(evidenceData) {\n var self = this,\n requests;\n\n requests = ajax.call([{\n methodname: 'core_competency_read_user_evidence',\n args: {id: evidenceData.id}\n }]);\n\n requests[0].done(function(evidence) {\n str.get_strings([\n {key: 'confirm', component: 'moodle'},\n {key: 'sendallcompetenciestoreview', component: 'tool_lp', param: evidence.name},\n {key: 'confirm', component: 'moodle'},\n {key: 'cancel', component: 'moodle'}\n ]).done(function(strings) {\n notification.confirm(\n strings[0], // Confirm.\n strings[1], // Send all competencies in review for X?\n strings[2], // Confirm.\n strings[3], // Cancel.\n function() {\n self._doReviewUserEvidenceCompetencies(evidenceData);\n }\n );\n }).fail(notification.exception);\n }).fail(notification.exception);\n\n };\n\n /**\n * Send request review for user evidence competencies handler.\n *\n * @param {Event} e The event.\n */\n UserEvidenceActions.prototype._reviewUserEvidenceCompetenciesHandler = function(e) {\n e.preventDefault();\n var data = this._findEvidenceData($(e.target));\n this.reviewUserEvidenceCompetencies(data);\n };\n\n /**\n * Find the evidence data from the evidence node.\n *\n * @param {Node} node The node to search from.\n * @return {Object} Evidence data.\n */\n UserEvidenceActions.prototype._findEvidenceData = function(node) {\n var parent = node.parentsUntil($(this._region).parent(), this._evidenceNode),\n data;\n\n if (parent.length != 1) {\n throw new Error('The evidence node was not located.');\n }\n\n data = parent.data();\n if (typeof data === 'undefined' || typeof data.id === 'undefined') {\n throw new Error('Evidence data could not be found.');\n }\n\n return data;\n };\n\n /**\n * Enhance a menu bar.\n *\n * @param {String} selector Menubar selector.\n */\n UserEvidenceActions.prototype.enhanceMenubar = function(selector) {\n var self = this;\n Menubar.enhance(selector, {\n '[data-action=\"user-evidence-delete\"]': self._deleteEvidenceHandler.bind(self),\n '[data-action=\"link-competency\"]': self._createUserEvidenceCompetencyHandler.bind(self),\n '[data-action=\"send-competencies-review\"]': self._reviewUserEvidenceCompetenciesHandler.bind(self),\n });\n };\n\n /**\n * Register the events in the region.\n *\n * At this stage this cannot be used with enhanceMenubar or multiple handlers\n * will be added to the same node.\n */\n UserEvidenceActions.prototype.registerEvents = function() {\n var wrapper = $(this._region),\n self = this;\n\n wrapper.find('[data-action=\"user-evidence-delete\"]').click(self._deleteEvidenceHandler.bind(self));\n wrapper.find('[data-action=\"link-competency\"]').click(self._createUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"delete-competency-link\"]').click(self._deleteUserEvidenceCompetencyHandler.bind(self));\n wrapper.find('[data-action=\"send-competencies-review\"]').click(self._reviewUserEvidenceCompetenciesHandler.bind(self));\n };\n\n return /** @alias module:tool_lp/user_evidence_actions */ UserEvidenceActions;\n});\n"],"file":"user_evidence_actions.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptances_filter.min.js b/admin/tool/policy/amd/build/acceptances_filter.min.js index 793e5af0251b2..0cb2282aecf53 100644 --- a/admin/tool/policy/amd/build/acceptances_filter.min.js +++ b/admin/tool/policy/amd/build/acceptances_filter.min.js @@ -1 +1,2 @@ -define(["jquery","core/form-autocomplete","core/str","core/notification"],function(a,b,c,d){var e={UNIFIED_FILTERS:"#unified-filters"},f=function(){var f=[{key:"filterplaceholder",component:"tool_policy"},{key:"nofiltersapplied",component:"tool_policy"}];M.util.js_pending("acceptances_filter_datasource"),c.get_strings(f).done(function(a){var c=a[0],f=a[1];b.enhance(e.UNIFIED_FILTERS,!0,"tool_policy/acceptances_filter_datasource",c,!1,!0,f,!0).then(function(){M.util.js_complete("acceptances_filter_datasource")}).fail(d.exception)}).fail(d.exception);var g=a(e.UNIFIED_FILTERS).val();a(e.UNIFIED_FILTERS).on("change",function(){var b=a(this).val(),c=[],d=[],e=!1;if(a.each(b,function(a,b){var f=b.split(":",2);if(2!==f.length)return d.push(b),!0;var g=f[0],h=f[1];return"undefined"!=typeof c[g]&&(e=!0),c[g]=h,!0}),e){var f=[];for(var h in c)f.push(h+":"+c[h]);f=f.concat(d),a(this).val(f)}g.join(",")!=b.join(",")&&this.form.submit()})},g=function(){return a(e.UNIFIED_FILTERS).closest("form")};return{init:function(){f()},getForm:function(){return g()}}}); \ No newline at end of file +define ("tool_policy/acceptances_filter",["jquery","core/form-autocomplete","core/str","core/notification"],function(a,b,c,d){var e={UNIFIED_FILTERS:"#unified-filters"},f=function init(){M.util.js_pending("acceptances_filter_datasource");c.get_strings([{key:"filterplaceholder",component:"tool_policy"},{key:"nofiltersapplied",component:"tool_policy"}]).done(function(a){var c=a[0],f=a[1];b.enhance(e.UNIFIED_FILTERS,!0,"tool_policy/acceptances_filter_datasource",c,!1,!0,f,!0).then(function(){M.util.js_complete("acceptances_filter_datasource")}).fail(d.exception)}).fail(d.exception);var f=a(e.UNIFIED_FILTERS).val();a(e.UNIFIED_FILTERS).on("change",function(){var b=a(this).val(),c=[],d=[],e=!1;a.each(b,function(a,b){var f=b.split(":",2);if(2!==f.length){d.push(b);return!0}var g=f[0],h=f[1];if("undefined"!=typeof c[g]){e=!0}c[g]=h;return!0});if(e){var g=[];for(var h in c){g.push(h+":"+c[h])}g=g.concat(d);a(this).val(g)}if(f.join(",")!=b.join(",")){this.form.submit()}})},g=function getForm(){return a(e.UNIFIED_FILTERS).closest("form")};return{init:function init(){f()},getForm:function getForm(){return g()}}}); +//# sourceMappingURL=acceptances_filter.min.js.map diff --git a/admin/tool/policy/amd/build/acceptances_filter.min.js.map b/admin/tool/policy/amd/build/acceptances_filter.min.js.map new file mode 100644 index 0000000000000..85eb1b08e404b --- /dev/null +++ b/admin/tool/policy/amd/build/acceptances_filter.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/acceptances_filter.js"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","UNIFIED_FILTERS","init","M","util","js_pending","get_strings","key","component","done","langstrings","placeholder","noSelectionString","enhance","then","js_complete","fail","exception","last","val","on","current","listoffilters","textfilters","updatedselectedfilters","each","index","catoption","catandoption","split","length","push","category","option","updatefilters","concat","join","form","submit","getForm","closest"],"mappings":"AAuBAA,OAAM,kCAAC,CAAC,QAAD,CAAW,wBAAX,CAAqC,UAArC,CAAiD,mBAAjD,CAAD,CACF,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAA+BC,CAA/B,CAA6C,IAQrCC,CAAAA,CAAS,CAAG,CACZC,eAAe,CAAE,kBADL,CARyB,CAkBrCC,CAAI,CAAG,QAAPA,CAAAA,IAAO,EAAW,CASlBC,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkB,+BAAlB,EACAP,CAAG,CAACQ,WAAJ,CATiB,CAAC,CACdC,GAAG,CAAE,mBADS,CAEdC,SAAS,CAAE,aAFG,CAAD,CAGd,CACCD,GAAG,CAAE,kBADN,CAECC,SAAS,CAAE,aAFZ,CAHc,CASjB,EAA4BC,IAA5B,CAAiC,SAASC,CAAT,CAAsB,IAC/CC,CAAAA,CAAW,CAAGD,CAAW,CAAC,CAAD,CADsB,CAE/CE,CAAiB,CAAGF,CAAW,CAAC,CAAD,CAFgB,CAGnDb,CAAY,CAACgB,OAAb,CAAqBb,CAAS,CAACC,eAA/B,IAAsD,2CAAtD,CAAmGU,CAAnG,OACiBC,CADjB,KAEKE,IAFL,CAEU,UAAW,CACbX,CAAC,CAACC,IAAF,CAAOW,WAAP,CAAmB,+BAAnB,CAGH,CANL,EAOKC,IAPL,CAOUjB,CAAY,CAACkB,SAPvB,CAQH,CAXD,EAWGD,IAXH,CAWQjB,CAAY,CAACkB,SAXrB,EAaA,GAAIC,CAAAA,CAAI,CAAGtB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6BkB,GAA7B,EAAX,CACAvB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6BmB,EAA7B,CAAgC,QAAhC,CAA0C,UAAW,IAC7CC,CAAAA,CAAO,CAAGzB,CAAC,CAAC,IAAD,CAAD,CAAQuB,GAAR,EADmC,CAE7CG,CAAa,CAAG,EAF6B,CAG7CC,CAAW,CAAG,EAH+B,CAI7CC,CAAsB,GAJuB,CAMjD5B,CAAC,CAAC6B,IAAF,CAAOJ,CAAP,CAAgB,SAASK,CAAT,CAAgBC,CAAhB,CAA2B,CACvC,GAAIC,CAAAA,CAAY,CAAGD,CAAS,CAACE,KAAV,CAAgB,GAAhB,CAAqB,CAArB,CAAnB,CACA,GAA4B,CAAxB,GAAAD,CAAY,CAACE,MAAjB,CAA+B,CAC3BP,CAAW,CAACQ,IAAZ,CAAiBJ,CAAjB,EACA,QACH,CALsC,GAOnCK,CAAAA,CAAQ,CAAGJ,CAAY,CAAC,CAAD,CAPY,CAQnCK,CAAM,CAAGL,CAAY,CAAC,CAAD,CARc,CAevC,GAAuC,WAAnC,QAAON,CAAAA,CAAa,CAACU,CAAD,CAAxB,CAAoD,CAChDR,CAAsB,GACzB,CAEDF,CAAa,CAACU,CAAD,CAAb,CAA0BC,CAA1B,CACA,QACH,CArBD,EAwBA,GAAIT,CAAJ,CAA4B,CAExB,GAAIU,CAAAA,CAAa,CAAG,EAApB,CACA,IAAK,GAAIF,CAAAA,CAAT,GAAqBV,CAAAA,CAArB,CAAoC,CAChCY,CAAa,CAACH,IAAd,CAAmBC,CAAQ,CAAG,GAAX,CAAiBV,CAAa,CAACU,CAAD,CAAjD,CACH,CACDE,CAAa,CAAGA,CAAa,CAACC,MAAd,CAAqBZ,CAArB,CAAhB,CACA3B,CAAC,CAAC,IAAD,CAAD,CAAQuB,GAAR,CAAYe,CAAZ,CACH,CAGD,GAAIhB,CAAI,CAACkB,IAAL,CAAU,GAAV,GAAkBf,CAAO,CAACe,IAAR,CAAa,GAAb,CAAtB,CAAyC,CACrC,KAAKC,IAAL,CAAUC,MAAV,EACH,CACJ,CA5CD,CA6CH,CAvFwC,CA+FrCC,CAAO,CAAG,QAAVA,CAAAA,OAAU,EAAW,CACrB,MAAO3C,CAAAA,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6BuC,OAA7B,CAAqC,MAArC,CACV,CAjGwC,CAmGzC,MAAmD,CAM/CtC,IAAI,CAAE,eAAW,CACbA,CAAI,EACP,CAR8C,CAgB/CqC,OAAO,CAAE,kBAAW,CAChB,MAAOA,CAAAA,CAAO,EACjB,CAlB8C,CAoBtD,CAxHC,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Unified filter page JS module for the course participants page.\n *\n * @module tool_policy/acceptances_filter\n * @package tool_policy\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'],\n function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{UNIFIED_FILTERS: string}}\n */\n var SELECTORS = {\n UNIFIED_FILTERS: '#unified-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [{\n key: 'filterplaceholder',\n component: 'tool_policy'\n }, {\n key: 'nofiltersapplied',\n component: 'tool_policy'\n }];\n\n M.util.js_pending('acceptances_filter_datasource');\n Str.get_strings(stringkeys).done(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n Autocomplete.enhance(SELECTORS.UNIFIED_FILTERS, true, 'tool_policy/acceptances_filter_datasource', placeholder,\n false, true, noSelectionString, true)\n .then(function() {\n M.util.js_complete('acceptances_filter_datasource');\n\n return;\n })\n .fail(Notification.exception);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.UNIFIED_FILTERS).val();\n $(SELECTORS.UNIFIED_FILTERS).on('change', function() {\n var current = $(this).val();\n var listoffilters = [];\n var textfilters = [];\n var updatedselectedfilters = false;\n\n $.each(current, function(index, catoption) {\n var catandoption = catoption.split(':', 2);\n if (catandoption.length !== 2) {\n textfilters.push(catoption);\n return true; // Text search filter.\n }\n\n var category = catandoption[0];\n var option = catandoption[1];\n\n // The last option (eg. 'Teacher') out of a category (eg. 'Role') in this loop is the one that was last\n // selected, so we want to use that if there are multiple options from the same category. Eg. The user\n // may have chosen to filter by the 'Student' role, then wanted to filter by the 'Teacher' role - the\n // last option in the category to be selected (in this case 'Teacher') will come last, so will overwrite\n // 'Student' (after this if). We want to let the JS know that the filters have been updated.\n if (typeof listoffilters[category] !== 'undefined') {\n updatedselectedfilters = true;\n }\n\n listoffilters[category] = option;\n return true;\n });\n\n // Check if we have something to remove from the list of filters.\n if (updatedselectedfilters) {\n // Go through and put the list into something we can use to update the list of filters.\n var updatefilters = [];\n for (var category in listoffilters) {\n updatefilters.push(category + \":\" + listoffilters[category]);\n }\n updatefilters = updatefilters.concat(textfilters);\n $(this).val(updatefilters);\n }\n\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') != current.join(',')) {\n this.form.submit();\n }\n });\n };\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n var getForm = function() {\n return $(SELECTORS.UNIFIED_FILTERS).closest('form');\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n },\n\n /**\n * Return the unified user filter form.\n *\n * @method getForm\n * @return {DOMElement}\n */\n getForm: function() {\n return getForm();\n }\n };\n });\n"],"file":"acceptances_filter.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js index 567ed4aa88a1b..b255da72bc2da 100644 --- a/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js +++ b/admin/tool/policy/amd/build/acceptances_filter_datasource.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function(b,c){var d=[],e=a(b),f=a(b).data("originaloptionsjson"),g=e.val();a.each(f,function(b,e){return""!==a.trim(c)&&e.label.toLocaleLowerCase().indexOf(c.toLocaleLowerCase())===-1||(a.inArray(e.value,g)>-1||(d.push(e),!0))});var h=new a.Deferred;return h.resolve(d),h.promise()},processResults:function(b,c){var d=[];return a.each(c,function(a,b){d.push({value:b.value,label:b.label})}),d},transport:function(a,b,d){this.list(a,b).then(d)["catch"](c.exception)}}}); \ No newline at end of file +define ("tool_policy/acceptances_filter_datasource",["jquery","core/ajax","core/notification"],function(a,b,c){return{list:function list(b,c){var d=[],e=a(b),f=a(b).data("originaloptionsjson"),g=e.val();a.each(f,function(b,e){if(""!==a.trim(c)&&-1===e.label.toLocaleLowerCase().indexOf(c.toLocaleLowerCase())){return!0}if(-1.\n\n/**\n * Datasource for the tool_policy/acceptances_filter.\n *\n * This module is compatible with core/form-autocomplete.\n *\n * @package tool_policy\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n return /** @alias module:tool_policy/acceptances_filter_datasource */ {\n /**\n * List filter options.\n *\n * @param {String} selector The select element selector.\n * @param {String} query The query string.\n * @return {Promise}\n */\n list: function(selector, query) {\n var filteredOptions = [];\n\n var el = $(selector);\n var originalOptions = $(selector).data('originaloptionsjson');\n var selectedFilters = el.val();\n $.each(originalOptions, function(index, option) {\n // Skip option if it does not contain the query string.\n if ($.trim(query) !== '' && option.label.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) === -1) {\n return true;\n }\n // Skip filters that have already been selected.\n if ($.inArray(option.value, selectedFilters) > -1) {\n return true;\n }\n\n filteredOptions.push(option);\n return true;\n });\n\n var deferred = new $.Deferred();\n deferred.resolve(filteredOptions);\n\n return deferred.promise();\n },\n\n /**\n * Process the results for auto complete elements.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {Array} results An array or results.\n * @return {Array} New array of results.\n */\n processResults: function(selector, results) {\n var options = [];\n $.each(results, function(index, data) {\n options.push({\n value: data.value,\n label: data.label\n });\n });\n return options;\n },\n\n /**\n * Source of data for Ajax element.\n *\n * @param {String} selector The selector of the auto complete element.\n * @param {String} query The query string.\n * @param {Function} callback A callback function receiving an array of results.\n */\n /* eslint-disable promise/no-callback-in-promise */\n transport: function(selector, query, callback) {\n this.list(selector, query).then(callback).catch(Notification.exception);\n }\n };\n\n});\n"],"file":"acceptances_filter_datasource.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/acceptmodal.min.js b/admin/tool/policy/amd/build/acceptmodal.min.js index cdd3496d4a777..0caa34f0e90f0 100644 --- a/admin/tool/policy/amd/build/acceptmodal.min.js +++ b/admin/tool/policy/amd/build/acceptmodal.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/modal_factory","core/modal_events","core/notification","core/fragment","core/ajax","core/yui"],function(a,b,c,d,e,f,g,h){"use strict";var i=function(a){this.contextid=a,this.init()};return i.prototype.modal=null,i.prototype.contextid=-1,i.prototype.currentTrigger=null,i.prototype.triggers={SINGLE:"a[data-action=acceptmodal]",BULK:"input[data-action=acceptmodal]"},i.prototype.init=function(){a(this.triggers.SINGLE).on("click",function(b){b.preventDefault(),this.currentTrigger=a(b.currentTarget);var c=a(b.currentTarget).attr("href"),d=c.slice(c.indexOf("?")+1);this.showFormModal(d)}.bind(this)),a(this.triggers.BULK).on("click",function(c){c.preventDefault(),this.currentTrigger=a(c.currentTarget);var d=a(c.currentTarget).closest("form");if(d.find('input[type=checkbox][name="userids[]"]:checked').length){var f=d.serialize();this.showFormModal(f)}else b.get_strings([{key:"notice"},{key:"selectusersforconsent",component:"tool_policy"},{key:"ok"}]).then(function(a){e.alert(a[0],a[1],a[2])}).fail(e.exception)}.bind(this))},i.prototype.showFormModal=function(a){for(var d,f=a.split("&"),g=0;g.\n\n/**\n * Add policy consent modal to the page\n *\n * @module tool_policy/acceptmodal\n * @class AcceptOnBehalf\n * @package tool_policy\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification', 'core/fragment',\n 'core/ajax', 'core/yui'],\n function($, Str, ModalFactory, ModalEvents, Notification, Fragment, Ajax, Y) {\n\n \"use strict\";\n\n /**\n * Constructor\n *\n * @param {int} contextid\n *\n * Each call to init gets it's own instance of this class.\n */\n var AcceptOnBehalf = function(contextid) {\n this.contextid = contextid;\n this.init();\n };\n\n /**\n * @var {Modal} modal\n * @private\n */\n AcceptOnBehalf.prototype.modal = null;\n\n /**\n * @var {int} contextid\n * @private\n */\n AcceptOnBehalf.prototype.contextid = -1;\n\n /**\n * @var {object} currentTrigger The triggered HTML jQuery object\n * @private\n */\n AcceptOnBehalf.prototype.currentTrigger = null;\n\n /**\n * @var {object} triggers The trigger selectors\n * @private\n */\n AcceptOnBehalf.prototype.triggers = {\n SINGLE: 'a[data-action=acceptmodal]',\n BULK: 'input[data-action=acceptmodal]'\n };\n\n /**\n * Initialise the class.\n *\n * @private\n */\n AcceptOnBehalf.prototype.init = function() {\n // Initialise for links accepting policies for individual users.\n $(this.triggers.SINGLE).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var href = $(e.currentTarget).attr('href'),\n formData = href.slice(href.indexOf('?') + 1);\n this.showFormModal(formData);\n }.bind(this));\n\n // Initialise for multiple users acceptance form.\n $(this.triggers.BULK).on('click', function(e) {\n e.preventDefault();\n this.currentTrigger = $(e.currentTarget);\n var form = $(e.currentTarget).closest('form');\n if (form.find('input[type=checkbox][name=\"userids[]\"]:checked').length) {\n var formData = form.serialize();\n this.showFormModal(formData);\n } else {\n Str.get_strings([\n {key: 'notice'},\n {key: 'selectusersforconsent', component: 'tool_policy'},\n {key: 'ok'}\n ]).then(function(strings) {\n Notification.alert(strings[0], strings[1], strings[2]);\n return;\n }).fail(Notification.exception);\n }\n }.bind(this));\n };\n\n /**\n * Show modal with a form\n *\n * @param {String} formData\n */\n AcceptOnBehalf.prototype.showFormModal = function(formData) {\n var action;\n var params = formData.split('&');\n for (var i = 0; i < params.length; i++) {\n var pair = params[i].split('=');\n if (pair[0] == 'action') {\n action = pair[1];\n }\n }\n // Fetch the title string.\n Str.get_strings([\n {key: 'statusformtitleaccept', component: 'tool_policy'},\n {key: 'iagreetothepolicy', component: 'tool_policy'},\n {key: 'statusformtitlerevoke', component: 'tool_policy'},\n {key: 'irevokethepolicy', component: 'tool_policy'},\n {key: 'statusformtitledecline', component: 'tool_policy'},\n {key: 'declinethepolicy', component: 'tool_policy'}\n ]).then(function(strings) {\n var title;\n var saveText;\n if (action == 'accept') {\n title = strings[0];\n saveText = strings[1];\n } else if (action == 'revoke') {\n title = strings[2];\n saveText = strings[3];\n } else if (action == 'decline') {\n title = strings[4];\n saveText = strings[5];\n }\n // Create the modal.\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: title,\n body: ''\n }).done(function(modal) {\n this.modal = modal;\n this.setupFormModal(formData, saveText);\n }.bind(this));\n }.bind(this))\n .catch(Notification.exception);\n };\n\n /**\n * Setup form inside a modal\n *\n * @param {String} formData\n * @param {String} saveText\n */\n AcceptOnBehalf.prototype.setupFormModal = function(formData, saveText) {\n var modal = this.modal;\n\n modal.setLarge();\n\n modal.setSaveButtonText(saveText);\n\n // We want to reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, this.destroy.bind(this));\n\n modal.setBody(this.getBody(formData));\n\n // We catch the modal save event, and use it to submit the form inside the modal.\n // Triggering a form submission will give JS validation scripts a chance to check for errors.\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n // We also catch the form submit event and use it to submit the form with ajax.\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n modal.show();\n };\n\n /**\n * Load the body of the modal (contains the form)\n *\n * @method getBody\n * @private\n * @param {String} formData\n * @return {Promise}\n */\n AcceptOnBehalf.prototype.getBody = function(formData) {\n if (typeof formData === \"undefined\") {\n formData = {};\n }\n // Get the content of the modal.\n var params = {jsonformdata: JSON.stringify(formData)};\n return Fragment.loadFragment('tool_policy', 'accept_on_behalf', this.contextid, params);\n };\n\n /**\n * Submit the form inside the modal via AJAX request\n *\n * @method submitFormAjax\n * @private\n * @param {Event} e Form submission event.\n */\n AcceptOnBehalf.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n // Convert all the form elements values to a serialised string.\n var formData = this.modal.getRoot().find('form').serialize();\n\n var requests = Ajax.call([{\n methodname: 'tool_policy_submit_accept_on_behalf',\n args: {jsonformdata: JSON.stringify(formData)}\n }]);\n requests[0].done(function(data) {\n if (data.validationerrors) {\n this.modal.setBody(this.getBody(formData));\n } else {\n this.close();\n }\n }.bind(this)).fail(Notification.exception);\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n AcceptOnBehalf.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n /**\n * Close the modal\n */\n AcceptOnBehalf.prototype.close = function() {\n this.destroy();\n document.location.reload();\n };\n\n /**\n * Destroy the modal\n */\n AcceptOnBehalf.prototype.destroy = function() {\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n this.modal.destroy();\n this.currentTrigger.focus();\n };\n\n return /** @alias module:tool_policy/acceptmodal */ {\n // Public variables and functions.\n /**\n * Attach event listeners to initialise this module.\n *\n * @method init\n * @param {int} contextid The contextid for the course.\n * @return {AcceptOnBehalf}\n */\n getInstance: function(contextid) {\n return new AcceptOnBehalf(contextid);\n }\n };\n });\n"],"file":"acceptmodal.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js b/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js index 1ed6d8b8f827a..22045d5570a66 100644 --- a/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js +++ b/admin/tool/policy/amd/build/jquery-eu-cookie-law-popup.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){window.console||(window.console={}),window.console.log||(window.console.log=function(){}),a.fn.euCookieLawPopup=function(){var b=this;b.params={cookiePolicyUrl:"/?cookie-policy",popupPosition:"top",colorStyle:"default",compactStyle:!1,popupTitle:"This website is using cookies",popupText:"We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we'll assume that you are happy to receive all cookies on this website.",buttonContinueTitle:"Continue",buttonLearnmoreTitle:"Learn more",buttonLearnmoreOpenInNewWindow:!0,agreementExpiresInDays:30,autoAcceptCookiePolicy:!1,htmlMarkup:null},b.vars={INITIALISED:!1,HTML_MARKUP:null,COOKIE_NAME:"EU_COOKIE_LAW_CONSENT"};var c=function(c,d,e){if(c){var f=a(c).attr("class")?a(c).attr("class"):"";f.indexOf("eupopup-top")>-1?b.params.popupPosition="top":f.indexOf("eupopup-fixedtop")>-1?b.params.popupPosition="fixedtop":f.indexOf("eupopup-bottomright")>-1?b.params.popupPosition="bottomright":f.indexOf("eupopup-bottomleft")>-1?b.params.popupPosition="bottomleft":f.indexOf("eupopup-bottom")>-1?b.params.popupPosition="bottom":f.indexOf("eupopup-block")>-1&&(b.params.popupPosition="block"),f.indexOf("eupopup-color-default")>-1?b.params.colorStyle="default":f.indexOf("eupopup-color-inverse")>-1&&(b.params.colorStyle="inverse"),f.indexOf("eupopup-style-compact")>-1&&(b.params.compactStyle=!0)}d&&(b.params.htmlMarkup=d),e&&("undefined"!=typeof e.cookiePolicyUrl&&(b.params.cookiePolicyUrl=e.cookiePolicyUrl),"undefined"!=typeof e.popupPosition&&(b.params.popupPosition=e.popupPosition),"undefined"!=typeof e.colorStyle&&(b.params.colorStyle=e.colorStyle),"undefined"!=typeof e.popupTitle&&(b.params.popupTitle=e.popupTitle),"undefined"!=typeof e.popupText&&(b.params.popupText=e.popupText),"undefined"!=typeof e.buttonContinueTitle&&(b.params.buttonContinueTitle=e.buttonContinueTitle),"undefined"!=typeof e.buttonLearnmoreTitle&&(b.params.buttonLearnmoreTitle=e.buttonLearnmoreTitle),"undefined"!=typeof e.buttonLearnmoreOpenInNewWindow&&(b.params.buttonLearnmoreOpenInNewWindow=e.buttonLearnmoreOpenInNewWindow),"undefined"!=typeof e.agreementExpiresInDays&&(b.params.agreementExpiresInDays=e.agreementExpiresInDays),"undefined"!=typeof e.autoAcceptCookiePolicy&&(b.params.autoAcceptCookiePolicy=e.autoAcceptCookiePolicy),"undefined"!=typeof e.htmlMarkup&&(b.params.htmlMarkup=e.htmlMarkup))},d=function(){if(b.params.htmlMarkup)return b.params.htmlMarkup;var a='
'+b.params.popupTitle+'
'+b.params.popupText+'
x
';return a},e=function(c){var d=new Date,e=24*b.params.agreementExpiresInDays*60*60*1e3;d.setTime(d.getTime()+e);var f="expires="+d.toGMTString();document.cookie=b.vars.COOKIE_NAME+"="+c+"; "+f+";path=/",a(document).trigger("user_cookie_consent_changed",{consent:c})},f=function(){for(var a=!1,c=document.cookie.split(";"),d=0;d0?a(".eupopup-block").append(b.vars.HTML_MARKUP):a("BODY").append(b.vars.HTML_MARKUP),a(".eupopup-button_1").click(function(){return e(!0),g(),!1}),a(".eupopup-closebutton").click(function(){return e(!0),g(),!1}),a(".eupopup-container").show(),b.params.autoAcceptCookiePolicy&&e(!0)))}};return h}}); \ No newline at end of file +define ("tool_policy/jquery-eu-cookie-law-popup",["jquery"],function(a){if(!window.console)window.console={};if(!window.console.log)window.console.log=function(){};a.fn.euCookieLawPopup=function(){var b=this;b.params={cookiePolicyUrl:"/?cookie-policy",popupPosition:"top",colorStyle:"default",compactStyle:!1,popupTitle:"This website is using cookies",popupText:"We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we'll assume that you are happy to receive all cookies on this website.",buttonContinueTitle:"Continue",buttonLearnmoreTitle:"Learn more",buttonLearnmoreOpenInNewWindow:!0,agreementExpiresInDays:30,autoAcceptCookiePolicy:!1,htmlMarkup:null};b.vars={INITIALISED:!1,HTML_MARKUP:null,COOKIE_NAME:"EU_COOKIE_LAW_CONSENT"};var c=function(c,d,e){if(c){var f=a(c).attr("class")?a(c).attr("class"):"";if(-1
"+b.params.popupTitle+"
"+b.params.popupText+"
x
";return a},e=function(c){var e=new Date,d=1e3*(60*(60*(24*b.params.agreementExpiresInDays)));e.setTime(e.getTime()+d);var f="expires="+e.toGMTString();document.cookie=b.vars.COOKIE_NAME+"="+c+"; "+f+";path=/";a(document).trigger("user_cookie_consent_changed",{consent:c})},f=function(){for(var a=!1,d=document.cookie.split(";"),e=0,f;e>>\r\nif (!window.console) window.console = {};\r\nif (!window.console.log) window.console.log = function () { };\r\n// ^^^\r\n\r\n$.fn.euCookieLawPopup = (function() {\r\n\r\n\tvar _self = this;\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PARAMETERS (MODIFY THIS PART) //////////////////////////////////////////////////////////////\r\n\t_self.params = {\r\n\t\tcookiePolicyUrl : '/?cookie-policy',\r\n\t\tpopupPosition : 'top',\r\n\t\tcolorStyle : 'default',\r\n\t\tcompactStyle : false,\r\n\t\tpopupTitle : 'This website is using cookies',\r\n\t\tpopupText : 'We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we\\'ll assume that you are happy to receive all cookies on this website.',\r\n\t\tbuttonContinueTitle : 'Continue',\r\n\t\tbuttonLearnmoreTitle : 'Learn more',\r\n\t\tbuttonLearnmoreOpenInNewWindow : true,\r\n\t\tagreementExpiresInDays : 30,\r\n\t\tautoAcceptCookiePolicy : false,\r\n\t\thtmlMarkup : null\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// VARIABLES USED BY THE FUNCTION (DON'T MODIFY THIS PART) ////////////////////////////////////\r\n\t_self.vars = {\r\n\t\tINITIALISED : false,\r\n\t\tHTML_MARKUP : null,\r\n\t\tCOOKIE_NAME : 'EU_COOKIE_LAW_CONSENT'\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PRIVATE FUNCTIONS FOR MANIPULATING DATA ////////////////////////////////////////////////////\r\n\r\n\t// Overwrite default parameters if any of those is present\r\n\tvar parseParameters = function(object, markup, settings) {\r\n\r\n\t\tif (object) {\r\n\t\t\tvar className = $(object).attr('class') ? $(object).attr('class') : '';\r\n\t\t\tif (className.indexOf('eupopup-top') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'top';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-fixedtop') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'fixedtop';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomright') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomright';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottomleft') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottomleft';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-bottom') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'bottom';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-block') > -1) {\r\n\t\t\t\t_self.params.popupPosition = 'block';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-color-default') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'default';\r\n\t\t\t}\r\n\t\t\telse if (className.indexOf('eupopup-color-inverse') > -1) {\r\n\t\t\t\t_self.params.colorStyle = 'inverse';\r\n\t\t\t}\r\n\t\t\tif (className.indexOf('eupopup-style-compact') > -1) {\r\n\t\t\t\t_self.params.compactStyle = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (markup) {\r\n\t\t\t_self.params.htmlMarkup = markup;\r\n\t\t}\r\n\r\n\t\tif (settings) {\r\n\t\t\tif (typeof settings.cookiePolicyUrl !== 'undefined') {\r\n\t\t\t\t_self.params.cookiePolicyUrl = settings.cookiePolicyUrl;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupPosition !== 'undefined') {\r\n\t\t\t\t_self.params.popupPosition = settings.popupPosition;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.colorStyle !== 'undefined') {\r\n\t\t\t\t_self.params.colorStyle = settings.colorStyle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupTitle !== 'undefined') {\r\n\t\t\t\t_self.params.popupTitle = settings.popupTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.popupText !== 'undefined') {\r\n\t\t\t\t_self.params.popupText = settings.popupText;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonContinueTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonContinueTitle = settings.buttonContinueTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreTitle !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreTitle = settings.buttonLearnmoreTitle;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.buttonLearnmoreOpenInNewWindow !== 'undefined') {\r\n\t\t\t\t_self.params.buttonLearnmoreOpenInNewWindow = settings.buttonLearnmoreOpenInNewWindow;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.agreementExpiresInDays !== 'undefined') {\r\n\t\t\t\t_self.params.agreementExpiresInDays = settings.agreementExpiresInDays;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.autoAcceptCookiePolicy !== 'undefined') {\r\n\t\t\t\t_self.params.autoAcceptCookiePolicy = settings.autoAcceptCookiePolicy;\r\n\t\t\t}\r\n\t\t\tif (typeof settings.htmlMarkup !== 'undefined') {\r\n\t\t\t\t_self.params.htmlMarkup = settings.htmlMarkup;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar createHtmlMarkup = function() {\r\n\r\n\t\tif (_self.params.htmlMarkup) {\r\n\t\t\treturn _self.params.htmlMarkup;\r\n\t\t}\r\n\r\n\t\tvar html =\r\n\t\t\t'
' +\r\n\t\t\t\t'
' + _self.params.popupTitle + '
' +\r\n\t\t\t\t'
' + _self.params.popupText + '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t '' + _self.params.buttonContinueTitle + '' +\r\n\t\t\t\t '' + _self.params.buttonLearnmoreTitle + '' +\r\n\t\t\t\t '
' +\r\n\t\t\t\t'
' +\r\n\t\t\t\t'x' +\r\n\t\t\t'
';\r\n\r\n\t\treturn html;\r\n\t};\r\n\r\n\t// Storing the consent in a cookie\r\n\tvar setUserAcceptsCookies = function(consent) {\r\n\t\tvar d = new Date();\r\n\t\tvar expiresInDays = _self.params.agreementExpiresInDays * 24 * 60 * 60 * 1000;\r\n\t\td.setTime( d.getTime() + expiresInDays );\r\n\t\tvar expires = \"expires=\" + d.toGMTString();\r\n\t\tdocument.cookie = _self.vars.COOKIE_NAME + '=' + consent + \"; \" + expires + \";path=/\";\r\n\r\n\t\t$(document).trigger(\"user_cookie_consent_changed\", {'consent' : consent});\r\n\t};\r\n\r\n\t// Let's see if we have a consent cookie already\r\n\tvar userAlreadyAcceptedCookies = function() {\r\n\t\tvar userAcceptedCookies = false;\r\n\t\tvar cookies = document.cookie.split(\";\");\r\n\t\tfor (var i = 0; i < cookies.length; i++) {\r\n\t\t\tvar c = cookies[i].trim();\r\n\t\t\tif (c.indexOf(_self.vars.COOKIE_NAME) == 0) {\r\n\t\t\t\tuserAcceptedCookies = c.substring(_self.vars.COOKIE_NAME.length + 1, c.length);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn userAcceptedCookies;\r\n\t};\r\n\r\n\tvar hideContainer = function() {\r\n\t\t// $('.eupopup-container').slideUp(200);\r\n\t\t$('.eupopup-container').animate({\r\n\t\t\topacity: 0,\r\n\t\t\theight: 0\r\n\t\t}, 200, function() {\r\n\t\t\t$('.eupopup-container').hide(0);\r\n\t\t});\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////////////////////////\r\n\t// PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////////////////\r\n\tvar publicfunc = {\r\n\r\n\t\t// INITIALIZE EU COOKIE LAW POPUP /////////////////////////////////////////////////////////\r\n\t\tinit : function(settings) {\r\n\r\n\t\t\tparseParameters(\r\n\t\t\t\t$(\".eupopup\").first(),\r\n\t\t\t\t$(\".eupopup-markup\").html(),\r\n\t\t\t\tsettings);\r\n\r\n\t\t\t// No need to display this if user already accepted the policy\r\n\t\t\tif (userAlreadyAcceptedCookies()) {\r\n $(document).trigger(\"user_cookie_already_accepted\", {'consent': true});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// We should initialise only once\r\n\t\t\tif (_self.vars.INITIALISED) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t_self.vars.INITIALISED = true;\r\n\r\n\t\t\t// Markup and event listeners >>>\r\n\t\t\t_self.vars.HTML_MARKUP = createHtmlMarkup();\r\n\r\n\t\t\tif ($('.eupopup-block').length > 0) {\r\n\t\t\t\t$('.eupopup-block').append(_self.vars.HTML_MARKUP);\r\n\t\t\t} else {\r\n\t\t\t\t$('BODY').append(_self.vars.HTML_MARKUP);\r\n\t\t\t}\r\n\r\n\t\t\t$('.eupopup-button_1').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t$('.eupopup-closebutton').click(function() {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t\thideContainer();\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t\t// ^^^ Markup and event listeners\r\n\r\n\t\t\t// Ready to start!\r\n\t\t\t$('.eupopup-container').show();\r\n\r\n\t\t\t// In case it's alright to just display the message once\r\n\t\t\tif (_self.params.autoAcceptCookiePolicy) {\r\n\t\t\t\tsetUserAcceptsCookies(true);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\treturn publicfunc;\r\n});\r\n});\r\n"],"file":"jquery-eu-cookie-law-popup.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/managedocsactions.min.js b/admin/tool/policy/amd/build/managedocsactions.min.js index 5c351dcbf8b5c..e5a1692f3845e 100644 --- a/admin/tool/policy/amd/build/managedocsactions.min.js +++ b/admin/tool/policy/amd/build/managedocsactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/log","core/config","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){"use strict";function g(a){this.base=a,this.initEvents()}var h={LINKS:"[data-action]",MAKE_CURRENT:'[data-action="makecurrent"]',INACTIVATE:'[data-action="inactivate"]',DELETE:'[data-action="delete"]'};return g.prototype.initEvents=function(){var g=this;g.base.on("click",h.LINKS,function(g){g.stopPropagation();var i,j,k=a(g.currentTarget);if(k.is(h.MAKE_CURRENT))i=d.get_strings([{key:"activating",component:"tool_policy"},{key:"activateconfirm",component:"tool_policy",param:{name:k.closest("[data-policy-name]").attr("data-policy-name"),revision:k.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"activateconfirmyes",component:"tool_policy"}]);else if(k.is(h.INACTIVATE))i=d.get_strings([{key:"inactivating",component:"tool_policy"},{key:"inactivatingconfirm",component:"tool_policy",param:{name:k.closest("[data-policy-name]").attr("data-policy-name"),revision:k.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"inactivatingconfirmyes",component:"tool_policy"}]);else{if(!k.is(h.DELETE))return void b.error("unknown action type detected","tool_policy/managedocsactions");i=d.get_strings([{key:"deleting",component:"tool_policy"},{key:"deleteconfirm",component:"tool_policy",param:{name:k.closest("[data-policy-name]").attr("data-policy-name"),revision:k.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"delete",component:"core"}])}g.preventDefault(),i.then(function(a){return j=a,e.create({title:j[0],body:j[1],type:e.types.SAVE_CANCEL})}).then(function(a){return a.setSaveButtonText(j[2]),a.getRoot().on(f.save,function(){window.location.href=k.attr("href")+"&sesskey="+c.sesskey+"&confirm=1"}),a.getRoot().on(f.hidden,function(){a.destroy()}),a.show(),!0})["catch"](function(a){return b.error(a),!1})})},{init:function(b){var c=a(document.getElementById(b));if(c.length)return new g(c);throw new Error("managedocsactions: Invalid base element identifier")}}}); \ No newline at end of file +define ("tool_policy/managedocsactions",["jquery","core/log","core/config","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){"use strict";var h={LINKS:"[data-action]",MAKE_CURRENT:"[data-action=\"makecurrent\"]",INACTIVATE:"[data-action=\"inactivate\"]",DELETE:"[data-action=\"delete\"]"};function g(a){this.base=a;this.initEvents()}g.prototype.initEvents=function(){var g=this;g.base.on("click",h.LINKS,function(g){g.stopPropagation();var i=a(g.currentTarget),j,k;if(i.is(h.MAKE_CURRENT)){j=d.get_strings([{key:"activating",component:"tool_policy"},{key:"activateconfirm",component:"tool_policy",param:{name:i.closest("[data-policy-name]").attr("data-policy-name"),revision:i.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"activateconfirmyes",component:"tool_policy"}])}else if(i.is(h.INACTIVATE)){j=d.get_strings([{key:"inactivating",component:"tool_policy"},{key:"inactivatingconfirm",component:"tool_policy",param:{name:i.closest("[data-policy-name]").attr("data-policy-name"),revision:i.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"inactivatingconfirmyes",component:"tool_policy"}])}else if(i.is(h.DELETE)){j=d.get_strings([{key:"deleting",component:"tool_policy"},{key:"deleteconfirm",component:"tool_policy",param:{name:i.closest("[data-policy-name]").attr("data-policy-name"),revision:i.closest("[data-policy-revision]").attr("data-policy-revision")}},{key:"delete",component:"core"}])}else{b.error("unknown action type detected","tool_policy/managedocsactions");return}g.preventDefault();j.then(function(a){k=a;return e.create({title:k[0],body:k[1],type:e.types.SAVE_CANCEL})}).then(function(a){a.setSaveButtonText(k[2]);a.getRoot().on(f.save,function(){window.location.href=i.attr("href")+"&sesskey="+c.sesskey+"&confirm=1"});a.getRoot().on(f.hidden,function(){a.destroy()});a.show();return!0}).catch(function(a){b.error(a);return!1})})};return{init:function init(b){var c=a(document.getElementById(b));if(c.length){return new g(c)}else{throw new Error("managedocsactions: Invalid base element identifier")}}}}); +//# sourceMappingURL=managedocsactions.min.js.map diff --git a/admin/tool/policy/amd/build/managedocsactions.min.js.map b/admin/tool/policy/amd/build/managedocsactions.min.js.map new file mode 100644 index 0000000000000..171cecce05b4f --- /dev/null +++ b/admin/tool/policy/amd/build/managedocsactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/managedocsactions.js"],"names":["define","$","Log","Config","Str","ModalFactory","ModalEvents","ACTION","LINKS","MAKE_CURRENT","INACTIVATE","DELETE","ManageDocsActions","base","initEvents","prototype","self","on","e","stopPropagation","link","currentTarget","promise","strings","is","get_strings","key","component","param","name","closest","attr","revision","error","preventDefault","then","strs","create","title","body","type","types","SAVE_CANCEL","modal","setSaveButtonText","getRoot","save","window","location","href","sesskey","hidden","destroy","show","catch","init","baseid","document","getElementById","length","Error"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Adds support for confirmation via JS modal for some management actions at the Manage policies page.\n *\n * @module tool_policy/managedocsactions\n * @package tool_policy\n * @copyright 2018 David Mudrák \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/log',\n 'core/config',\n 'core/str',\n 'core/modal_factory',\n 'core/modal_events'\n], function($, Log, Config, Str, ModalFactory, ModalEvents) {\n\n \"use strict\";\n\n /**\n * List of action selectors.\n *\n * @property {string} LINKS - Selector for all action links\n * @property {string} MAKE_CURRENT\n */\n var ACTION = {\n LINKS: '[data-action]',\n MAKE_CURRENT: '[data-action=\"makecurrent\"]',\n INACTIVATE: '[data-action=\"inactivate\"]',\n DELETE: '[data-action=\"delete\"]'\n };\n\n /**\n * @constructor\n * @param {Element} base - Management area wrapping element\n */\n function ManageDocsActions(base) {\n this.base = base;\n\n this.initEvents();\n }\n\n /**\n * Register event listeners.\n */\n ManageDocsActions.prototype.initEvents = function() {\n var self = this;\n\n self.base.on('click', ACTION.LINKS, function(e) {\n e.stopPropagation();\n\n var link = $(e.currentTarget);\n var promise;\n var strings;\n\n if (link.is(ACTION.MAKE_CURRENT)) {\n promise = Str.get_strings([\n {key: 'activating', component: 'tool_policy'},\n {key: 'activateconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'activateconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.INACTIVATE)) {\n promise = Str.get_strings([\n {key: 'inactivating', component: 'tool_policy'},\n {key: 'inactivatingconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'inactivatingconfirmyes', component: 'tool_policy'}\n ]);\n\n } else if (link.is(ACTION.DELETE)) {\n promise = Str.get_strings([\n {key: 'deleting', component: 'tool_policy'},\n {key: 'deleteconfirm', component: 'tool_policy', param: {\n name: link.closest('[data-policy-name]').attr('data-policy-name'),\n revision: link.closest('[data-policy-revision]').attr('data-policy-revision')\n }},\n {key: 'delete', component: 'core'}\n ]);\n\n } else {\n Log.error('unknown action type detected', 'tool_policy/managedocsactions');\n return;\n }\n\n e.preventDefault();\n\n promise.then(function(strs) {\n strings = strs;\n return ModalFactory.create({\n title: strings[0],\n body: strings[1],\n type: ModalFactory.types.SAVE_CANCEL\n });\n\n }).then(function(modal) {\n modal.setSaveButtonText(strings[2]);\n modal.getRoot().on(ModalEvents.save, function() {\n window.location.href = link.attr('href') + '&sesskey=' + Config.sesskey + '&confirm=1';\n });\n\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.destroy();\n });\n\n modal.show();\n return true;\n\n }).catch(function(e) {\n Log.error(e);\n return false;\n });\n });\n };\n\n return {\n /**\n * Factory method returning instance of the ManageDocsActions\n *\n * @param {String} baseid - ID of the management area wrapping element\n * @return {ManageDocsActions}\n */\n init: function(baseid) {\n var base = $(document.getElementById(baseid));\n\n if (base.length) {\n return new ManageDocsActions(base);\n\n } else {\n throw new Error(\"managedocsactions: Invalid base element identifier\");\n }\n }\n };\n});\n"],"file":"managedocsactions.min.js"} \ No newline at end of file diff --git a/admin/tool/policy/amd/build/policyactions.min.js b/admin/tool/policy/amd/build/policyactions.min.js index 2e547734159a6..d9d40af68d924 100644 --- a/admin/tool/policy/amd/build/policyactions.min.js +++ b/admin/tool/policy/amd/build/policyactions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification","core/modal_factory","core/modal_events"],function(a,b,c,d,e){var f={VIEW_POLICY:'[data-action="view"]'},g=function(){this.registerEvents()};return g.prototype.registerEvents=function(){a(f.VIEW_POLICY).click(function(f){f.preventDefault();var g=a(this).data("versionid"),h=a(this).data("behalfid"),i={versionid:g,behalfid:h},j={methodname:"tool_policy_get_policy_version",args:i},k=a.Deferred(),l=a.Deferred(),m=d.create({title:k,body:l,large:!0}).then(function(a){return a.getRoot().on(e.hidden,function(){a.destroy()}),a}).then(function(a){return a.show(),a})["catch"](c.exception),n=b.call([j]);a.when(n[0]).then(function(a){if(a.result.policy)return k.resolve(a.result.policy.name),l.resolve(a.result.policy.content),a;throw new Error(a.warnings[0].message)})["catch"](function(a){return m.then(function(a){return a.hide(),a.destroy(),a})["catch"](c.exception),c.addNotification({message:a,type:"error"})})})},{init:function(){return new g}}}); \ No newline at end of file +define ("tool_policy/policyactions",["jquery","core/ajax","core/notification","core/modal_factory","core/modal_events"],function(a,b,c,d,e){var f={VIEW_POLICY:"[data-action=\"view\"]"},g=function(){this.registerEvents()};g.prototype.registerEvents=function(){a(f.VIEW_POLICY).click(function(f){f.preventDefault();var g=a(this).data("versionid"),h=a(this).data("behalfid"),i=a.Deferred(),j=a.Deferred(),k=d.create({title:i,body:j,large:!0}).then(function(a){a.getRoot().on(e.hidden,function(){a.destroy()});return a}).then(function(a){a.show();return a}).catch(c.exception),l=b.call([{methodname:"tool_policy_get_policy_version",args:{versionid:g,behalfid:h}}]);a.when(l[0]).then(function(a){if(a.result.policy){i.resolve(a.result.policy.name);j.resolve(a.result.policy.content);return a}else{throw new Error(a.warnings[0].message)}}).catch(function(a){k.then(function(a){a.hide();a.destroy();return a}).catch(c.exception);return c.addNotification({message:a,type:"error"})})})};return{init:function init(){return new g}}}); +//# sourceMappingURL=policyactions.min.js.map diff --git a/admin/tool/policy/amd/build/policyactions.min.js.map b/admin/tool/policy/amd/build/policyactions.min.js.map new file mode 100644 index 0000000000000..fe3a635d4a05e --- /dev/null +++ b/admin/tool/policy/amd/build/policyactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/policyactions.js"],"names":["define","$","Ajax","Notification","ModalFactory","ModalEvents","ACTIONS","VIEW_POLICY","PolicyActions","registerEvents","prototype","click","e","preventDefault","versionid","data","behalfid","modalTitle","Deferred","modalBody","modal","create","title","body","large","then","getRoot","on","hidden","destroy","show","catch","exception","promises","call","methodname","args","when","result","policy","resolve","name","content","Error","warnings","message","hide","addNotification","type"],"mappings":"AAuBAA,OAAM,6BAAC,CACH,QADG,CAEH,WAFG,CAGH,mBAHG,CAIH,oBAJG,CAKH,mBALG,CAAD,CAMN,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgCC,CAAhC,CAA8CC,CAA9C,CAA2D,IAOnDC,CAAAA,CAAO,CAAG,CACVC,WAAW,CAAE,wBADH,CAPyC,CAcnDC,CAAa,CAAG,UAAW,CAC3B,KAAKC,cAAL,EACH,CAhBsD,CAqBvDD,CAAa,CAACE,SAAd,CAAwBD,cAAxB,CAAyC,UAAW,CAChDR,CAAC,CAACK,CAAO,CAACC,WAAT,CAAD,CAAuBI,KAAvB,CAA6B,SAASC,CAAT,CAAY,CACrCA,CAAC,CAACC,cAAF,GADqC,GAGjCC,CAAAA,CAAS,CAAGb,CAAC,CAAC,IAAD,CAAD,CAAQc,IAAR,CAAa,WAAb,CAHqB,CAIjCC,CAAQ,CAAGf,CAAC,CAAC,IAAD,CAAD,CAAQc,IAAR,CAAa,UAAb,CAJsB,CAgBjCE,CAAU,CAAGhB,CAAC,CAACiB,QAAF,EAhBoB,CAiBjCC,CAAS,CAAGlB,CAAC,CAACiB,QAAF,EAjBqB,CAmBjCE,CAAK,CAAGhB,CAAY,CAACiB,MAAb,CAAoB,CAC5BC,KAAK,CAAEL,CADqB,CAE5BM,IAAI,CAAEJ,CAFsB,CAG5BK,KAAK,GAHuB,CAApB,EAKXC,IALW,CAKN,SAASL,CAAT,CAAgB,CAElBA,CAAK,CAACM,OAAN,GAAgBC,EAAhB,CAAmBtB,CAAW,CAACuB,MAA/B,CAAuC,UAAW,CAE9CR,CAAK,CAACS,OAAN,EACH,CAHD,EAKA,MAAOT,CAAAA,CACV,CAbW,EAcXK,IAdW,CAcN,SAASL,CAAT,CAAgB,CAClBA,CAAK,CAACU,IAAN,GAEA,MAAOV,CAAAA,CACV,CAlBW,EAmBXW,KAnBW,CAmBL5B,CAAY,CAAC6B,SAnBR,CAnByB,CAyCjCC,CAAQ,CAAG/B,CAAI,CAACgC,IAAL,CAAU,CA9BX,CACVC,UAAU,CAAE,gCADF,CAEVC,IAAI,CAPK,CACT,UAAatB,CADJ,CAET,SAAYE,CAFH,CAKC,CA8BW,CAAV,CAzCsB,CA0CrCf,CAAC,CAACoC,IAAF,CAAOJ,CAAQ,CAAC,CAAD,CAAf,EAAoBR,IAApB,CAAyB,SAASV,CAAT,CAAe,CACpC,GAAIA,CAAI,CAACuB,MAAL,CAAYC,MAAhB,CAAwB,CACpBtB,CAAU,CAACuB,OAAX,CAAmBzB,CAAI,CAACuB,MAAL,CAAYC,MAAZ,CAAmBE,IAAtC,EACAtB,CAAS,CAACqB,OAAV,CAAkBzB,CAAI,CAACuB,MAAL,CAAYC,MAAZ,CAAmBG,OAArC,EAEA,MAAO3B,CAAAA,CACV,CALD,IAKO,CACH,KAAM,IAAI4B,CAAAA,KAAJ,CAAU5B,CAAI,CAAC6B,QAAL,CAAc,CAAd,EAAiBC,OAA3B,CACT,CACJ,CATD,EASGd,KATH,CASS,SAASc,CAAT,CAAkB,CACvBzB,CAAK,CAACK,IAAN,CAAW,SAASL,CAAT,CAAgB,CACvBA,CAAK,CAAC0B,IAAN,GACA1B,CAAK,CAACS,OAAN,GAEA,MAAOT,CAAAA,CACV,CALD,EAMCW,KAND,CAMO5B,CAAY,CAAC6B,SANpB,EAQA,MAAO7B,CAAAA,CAAY,CAAC4C,eAAb,CAA6B,CAChCF,OAAO,CAAEA,CADuB,CAEhCG,IAAI,CAAE,OAF0B,CAA7B,CAIV,CAtBD,CAuBH,CAjED,CAmEH,CApED,CAsEA,MAAsD,CASlD,KAAQ,eAAW,CACf,MAAO,IAAIxC,CAAAA,CACd,CAXiD,CAazD,CA9GK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Policy actions.\n *\n * @module tool_policy/policyactions\n * @package tool_policy\n * @copyright 2018 Sara Arjona (sara@moodle.com)\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events'],\nfunction($, Ajax, Notification, ModalFactory, ModalEvents) {\n\n /**\n * List of action selectors.\n *\n * @type {{VIEW_POLICY: string}}\n */\n var ACTIONS = {\n VIEW_POLICY: '[data-action=\"view\"]'\n };\n\n /**\n * PolicyActions class.\n */\n var PolicyActions = function() {\n this.registerEvents();\n };\n\n /**\n * Register event listeners.\n */\n PolicyActions.prototype.registerEvents = function() {\n $(ACTIONS.VIEW_POLICY).click(function(e) {\n e.preventDefault();\n\n var versionid = $(this).data('versionid');\n var behalfid = $(this).data('behalfid');\n\n var params = {\n 'versionid': versionid,\n 'behalfid': behalfid\n };\n\n var request = {\n methodname: 'tool_policy_get_policy_version',\n args: params\n };\n\n var modalTitle = $.Deferred();\n var modalBody = $.Deferred();\n\n var modal = ModalFactory.create({\n title: modalTitle,\n body: modalBody,\n large: true\n })\n .then(function(modal) {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n return modal;\n })\n .then(function(modal) {\n modal.show();\n\n return modal;\n })\n .catch(Notification.exception);\n\n // Make the request now that the modal is configured.\n var promises = Ajax.call([request]);\n $.when(promises[0]).then(function(data) {\n if (data.result.policy) {\n modalTitle.resolve(data.result.policy.name);\n modalBody.resolve(data.result.policy.content);\n\n return data;\n } else {\n throw new Error(data.warnings[0].message);\n }\n }).catch(function(message) {\n modal.then(function(modal) {\n modal.hide();\n modal.destroy();\n\n return modal;\n })\n .catch(Notification.exception);\n\n return Notification.addNotification({\n message: message,\n type: 'error'\n });\n });\n });\n\n };\n\n return /** @alias module:tool_policy/policyactions */ {\n // Public variables and functions.\n\n /**\n * Initialise the actions helper.\n *\n * @method init\n * @return {PolicyActions}\n */\n 'init': function() {\n return new PolicyActions();\n }\n };\n});\n"],"file":"policyactions.min.js"} \ No newline at end of file diff --git a/admin/tool/templatelibrary/amd/build/display.min.js b/admin/tool/templatelibrary/amd/build/display.min.js index 0c75544343f6e..76ec8130610b8 100644 --- a/admin/tool/templatelibrary/amd/build/display.min.js +++ b/admin/tool/templatelibrary/amd/build/display.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/log","core/notification","core/templates","core/config","core/str"],function(a,b,c,d,e,f,g){var h=function(a,b){if(!a)return!1;var c="@template "+b,d=0,e=[];if(e=a.match(/{{!([\s\S]*?)}}/g),null!==e)for(d=0;d.\n\n/**\n * This module adds ajax display functions to the template library page.\n *\n * @module tool_templatelibrary/display\n * @package tool_templatelibrary\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config', 'core/str'],\n function($, ajax, log, notification, templates, config, str) {\n\n /**\n * Search through a template for a template docs comment.\n *\n * @param {String} templateSource The raw template\n * @param {String} templateName The name of the template used to search for docs tag\n * @return {String|boolean} the correct comment or false\n */\n var findDocsSection = function(templateSource, templateName) {\n\n if (!templateSource) {\n return false;\n }\n // Find the comment section marked with @template component/template.\n var marker = \"@template \" + templateName,\n i = 0,\n sections = [];\n\n sections = templateSource.match(/{{!([\\s\\S]*?)}}/g);\n\n // If no sections match - show the entire file.\n if (sections !== null) {\n for (i = 0; i < sections.length; i++) {\n var section = sections[i];\n var start = section.indexOf(marker);\n if (start !== -1) {\n // Remove {{! and }} from start and end.\n var offset = start + marker.length + 1;\n section = section.substr(offset, section.length - 2 - offset);\n return section;\n }\n }\n }\n // No matching comment.\n return false;\n };\n\n /**\n * Handle a template loaded response.\n *\n * @param {String} templateName The template name\n * @param {String} source The template source\n * @param {String} originalSource The original template source (not theme overridden)\n */\n var templateLoaded = function(templateName, source, originalSource) {\n str.get_string('templateselected', 'tool_templatelibrary', templateName).done(function(s) {\n $('[data-region=\"displaytemplateheader\"]').text(s);\n }).fail(notification.exception);\n\n // Find the comment section marked with @template component/template.\n var docs = findDocsSection(source, templateName);\n\n if (docs === false) {\n // Docs was not in theme template, try original.\n docs = findDocsSection(originalSource, templateName);\n }\n\n // If we found a docs section, limit the template library to showing this section.\n if (docs) {\n source = docs;\n }\n\n $('[data-region=\"displaytemplatesource\"]').text(source);\n\n // Now search the text for a json example.\n\n var example = source.match(/Example context \\(json\\):([\\s\\S]*)/);\n var context = false;\n if (example) {\n var rawJSON = example[1].trim();\n try {\n context = $.parseJSON(rawJSON);\n } catch (e) {\n log.debug('Could not parse json example context for template.');\n log.debug(e);\n }\n }\n if (context) {\n templates.render(templateName, context).done(function(html, js) {\n templates.replaceNodeContents($('[data-region=\"displaytemplateexample\"]'), html, js);\n }).fail(notification.exception);\n } else {\n str.get_string('templatehasnoexample', 'tool_templatelibrary').done(function(s) {\n $('[data-region=\"displaytemplateexample\"]').text(s);\n }).fail(notification.exception);\n }\n };\n\n /**\n * Load the a template source from Moodle.\n *\n * @param {String} templateName\n */\n var loadTemplate = function(templateName) {\n var parts = templateName.split('/');\n var component = parts.shift();\n var name = parts.shift();\n\n var promises = ajax.call([{\n methodname: 'core_output_load_template',\n args: {\n component: component,\n template: name,\n themename: config.theme,\n includecomments: true\n }\n }, {\n methodname: 'tool_templatelibrary_load_canonical_template',\n args: {\n component: component,\n template: name\n }\n }], true, false);\n\n // When returns a new promise that is resolved when all the passed in promises are resolved.\n // The arguments to the done become the values of each resolved promise.\n $.when.apply($, promises)\n .done(function(source, originalSource) {\n templateLoaded(templateName, source, originalSource);\n })\n .fail(notification.exception);\n };\n\n // Add the event listeners.\n $('[data-region=\"list-templates\"]').on('click', '[data-templatename]', function(e) {\n var templatename = $(this).data('templatename');\n e.preventDefault();\n loadTemplate(templatename);\n });\n\n // This module does not expose anything.\n return {};\n});\n"],"file":"display.min.js"} \ No newline at end of file diff --git a/admin/tool/templatelibrary/amd/build/search.min.js b/admin/tool/templatelibrary/amd/build/search.min.js index 01f2d04894388..ea1aac52977ff 100644 --- a/admin/tool/templatelibrary/amd/build/search.min.js +++ b/admin/tool/templatelibrary/amd/build/search.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/log","core/notification","core/templates","core/config"],function(a,b,c,d,e,f){var g=function(b){e.render("tool_templatelibrary/search_results",{templates:b}).done(function(b,c){e.replaceNode(a('[data-region="searchresults"]'),b,c)}).fail(d.exception)},h=function(c){var e=a('[data-field="component"]').val(),f=a('[data-field="search"]').val();document.location.hash=f,b.call([{methodname:"tool_templatelibrary_list_templates",args:{component:e,search:f,themename:c},done:g,fail:d.exception}],!0,!1)},i=null,j=function(a,b){null!==i&&window.clearTimeout(i),i=window.setTimeout(function(){a(),i=null},b)},k=function(){j(h.bind(this,f.theme),400)};return a('[data-region="list-templates"]').on("change",'[data-field="component"]',k),a('[data-region="list-templates"]').on("input",'[data-field="search"]',k),a('[data-field="search"]').val(document.location.hash.replace("#","")),h(f.theme),{}}); \ No newline at end of file +define ("tool_templatelibrary/search",["jquery","core/ajax","core/log","core/notification","core/templates","core/config"],function(a,b,c,d,e,f){var g=function(b){e.render("tool_templatelibrary/search_results",{templates:b}).done(function(b,c){e.replaceNode(a("[data-region=\"searchresults\"]"),b,c)}).fail(d.exception)},h=function(c){var e=a("[data-field=\"component\"]").val(),f=a("[data-field=\"search\"]").val();document.location.hash=f;b.call([{methodname:"tool_templatelibrary_list_templates",args:{component:e,search:f,themename:c},done:g,fail:d.exception}],!0,!1)},i=null,j=function(a,b){if(null!==i){window.clearTimeout(i)}i=window.setTimeout(function(){a();i=null},b)},k=function(){j(h.bind(this,f.theme),400)};a("[data-region=\"list-templates\"]").on("change","[data-field=\"component\"]",k);a("[data-region=\"list-templates\"]").on("input","[data-field=\"search\"]",k);a("[data-field=\"search\"]").val(document.location.hash.replace("#",""));h(f.theme);return{}}); +//# sourceMappingURL=search.min.js.map diff --git a/admin/tool/templatelibrary/amd/build/search.min.js.map b/admin/tool/templatelibrary/amd/build/search.min.js.map new file mode 100644 index 0000000000000..1611c7e245d24 --- /dev/null +++ b/admin/tool/templatelibrary/amd/build/search.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/search.js"],"names":["define","$","ajax","log","notification","templates","config","reloadListTemplate","templateList","render","done","result","js","replaceNode","fail","exception","refreshSearch","themename","componentStr","val","searchStr","document","location","hash","call","methodname","args","component","search","throttle","queueRefresh","callback","delay","window","clearTimeout","setTimeout","changeHandler","bind","theme","on","replace"],"mappings":"AAuBAA,OAAM,+BAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,UAAxB,CAAoC,mBAApC,CAAyD,gBAAzD,CAA2E,aAA3E,CAAD,CACC,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAuBC,CAAvB,CAAqCC,CAArC,CAAgDC,CAAhD,CAAwD,IAQvDC,CAAAA,CAAkB,CAAG,SAASC,CAAT,CAAuB,CAC5CH,CAAS,CAACI,MAAV,CAAiB,qCAAjB,CAAwD,CAACJ,SAAS,CAAEG,CAAZ,CAAxD,EACKE,IADL,CACU,SAASC,CAAT,CAAiBC,CAAjB,CAAqB,CACvBP,CAAS,CAACQ,WAAV,CAAsBZ,CAAC,CAAC,iCAAD,CAAvB,CAA0DU,CAA1D,CAAkEC,CAAlE,CACH,CAHL,EAGOE,IAHP,CAGYV,CAAY,CAACW,SAHzB,CAIH,CAb0D,CAqBvDC,CAAa,CAAG,SAASC,CAAT,CAAoB,IAChCC,CAAAA,CAAY,CAAGjB,CAAC,CAAC,4BAAD,CAAD,CAA8BkB,GAA9B,EADiB,CAEhCC,CAAS,CAAGnB,CAAC,CAAC,yBAAD,CAAD,CAA2BkB,GAA3B,EAFoB,CAKpCE,QAAQ,CAACC,QAAT,CAAkBC,IAAlB,CAAyBH,CAAzB,CAEAlB,CAAI,CAACsB,IAAL,CAAU,CACN,CAACC,UAAU,CAAE,qCAAb,CACEC,IAAI,CAAE,CAACC,SAAS,CAAET,CAAZ,CAA0BU,MAAM,CAAER,CAAlC,CAA6CH,SAAS,CAAEA,CAAxD,CADR,CAEEP,IAAI,CAAEH,CAFR,CAGEO,IAAI,CAAEV,CAAY,CAACW,SAHrB,CADM,CAAV,OAMH,CAlC0D,CAoCvDc,CAAQ,CAAG,IApC4C,CA8CvDC,CAAY,CAAG,SAASC,CAAT,CAAmBC,CAAnB,CAA0B,CACzC,GAAiB,IAAb,GAAAH,CAAJ,CAAuB,CACnBI,MAAM,CAACC,YAAP,CAAoBL,CAApB,CACH,CAEDA,CAAQ,CAAGI,MAAM,CAACE,UAAP,CAAkB,UAAW,CACpCJ,CAAQ,GACRF,CAAQ,CAAG,IACd,CAHU,CAGRG,CAHQ,CAId,CAvD0D,CAyDvDI,CAAa,CAAG,UAAW,CAC3BN,CAAY,CAACd,CAAa,CAACqB,IAAd,CAAmB,IAAnB,CAAyB/B,CAAM,CAACgC,KAAhC,CAAD,CAAyC,GAAzC,CACf,CA3D0D,CA6D3DrC,CAAC,CAAC,kCAAD,CAAD,CAAoCsC,EAApC,CAAuC,QAAvC,CAAiD,4BAAjD,CAA6EH,CAA7E,EACAnC,CAAC,CAAC,kCAAD,CAAD,CAAoCsC,EAApC,CAAuC,OAAvC,CAAgD,yBAAhD,CAAyEH,CAAzE,EAEAnC,CAAC,CAAC,yBAAD,CAAD,CAA2BkB,GAA3B,CAA+BE,QAAQ,CAACC,QAAT,CAAkBC,IAAlB,CAAuBiB,OAAvB,CAA+B,GAA/B,CAAoC,EAApC,CAA/B,EACAxB,CAAa,CAACV,CAAM,CAACgC,KAAR,CAAb,CACA,MAAO,EACV,CApEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module adds ajax search functions to the template library page.\n *\n * @module tool_templatelibrary/search\n * @package tool_templatelibrary\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/log', 'core/notification', 'core/templates', 'core/config'],\n function($, ajax, log, notification, templates, config) {\n\n /**\n * The ajax call has returned with a new list of templates.\n *\n * @method reloadListTemplate\n * @param {String[]} templateList List of template ids.\n */\n var reloadListTemplate = function(templateList) {\n templates.render('tool_templatelibrary/search_results', {templates: templateList})\n .done(function(result, js) {\n templates.replaceNode($('[data-region=\"searchresults\"]'), result, js);\n }).fail(notification.exception);\n };\n\n /**\n * Get the current values for the form inputs and refresh the list of matching templates.\n *\n * @method refreshSearch\n * @param {String} themename The naeme of the theme.\n */\n var refreshSearch = function(themename) {\n var componentStr = $('[data-field=\"component\"]').val();\n var searchStr = $('[data-field=\"search\"]').val();\n\n // Trigger the search.\n document.location.hash = searchStr;\n\n ajax.call([\n {methodname: 'tool_templatelibrary_list_templates',\n args: {component: componentStr, search: searchStr, themename: themename},\n done: reloadListTemplate,\n fail: notification.exception}\n ], true, false);\n };\n\n var throttle = null;\n\n /**\n * Call the specified function after a delay. If this function is called again before the function is executed,\n * the function will only be executed once.\n *\n * @method queueRefresh\n * @param {function} callback\n * @param {Number} delay The time in milliseconds to delay.\n */\n var queueRefresh = function(callback, delay) {\n if (throttle !== null) {\n window.clearTimeout(throttle);\n }\n\n throttle = window.setTimeout(function() {\n callback();\n throttle = null;\n }, delay);\n };\n\n var changeHandler = function() {\n queueRefresh(refreshSearch.bind(this, config.theme), 400);\n };\n // Add change handlers to refresh the list.\n $('[data-region=\"list-templates\"]').on('change', '[data-field=\"component\"]', changeHandler);\n $('[data-region=\"list-templates\"]').on('input', '[data-field=\"search\"]', changeHandler);\n\n $('[data-field=\"search\"]').val(document.location.hash.replace('#', ''));\n refreshSearch(config.theme);\n return {};\n});\n"],"file":"search.min.js"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/managesteps.min.js b/admin/tool/usertours/amd/build/managesteps.min.js index 37718352d9f2e..e585d632e5eb7 100644 --- a/admin/tool/usertours/amd/build/managesteps.min.js +++ b/admin/tool/usertours/amd/build/managesteps.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/notification"],function(a,b,c){var d={removeStep:function(d){d.preventDefault();var e=a(d.currentTarget).attr("href");b.get_strings([{key:"confirmstepremovaltitle",component:"tool_usertours"},{key:"confirmstepremovalquestion",component:"tool_usertours"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).then(function(a){c.confirm(a[0],a[1],a[2],a[3],function(){window.location=e})})["catch"]()},setup:function(){a("body").delegate('[data-action="delete"]',"click",d.removeStep)}};return{setup:d.setup}}); \ No newline at end of file +define ("tool_usertours/managesteps",["jquery","core/str","core/notification"],function(a,b,c){var d={removeStep:function removeStep(d){d.preventDefault();var e=a(d.currentTarget).attr("href");b.get_strings([{key:"confirmstepremovaltitle",component:"tool_usertours"},{key:"confirmstepremovalquestion",component:"tool_usertours"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).then(function(a){c.confirm(a[0],a[1],a[2],a[3],function(){window.location=e})}).catch()},setup:function setup(){a("body").delegate("[data-action=\"delete\"]","click",d.removeStep)}};return{setup:d.setup}}); +//# sourceMappingURL=managesteps.min.js.map diff --git a/admin/tool/usertours/amd/build/managesteps.min.js.map b/admin/tool/usertours/amd/build/managesteps.min.js.map new file mode 100644 index 0000000000000..84e5f29afe106 --- /dev/null +++ b/admin/tool/usertours/amd/build/managesteps.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/managesteps.js"],"names":["define","$","str","notification","manager","removeStep","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAQAA,OAAM,8BACN,CAAC,QAAD,CAAW,UAAX,CAAuB,mBAAvB,CADM,CAEN,SAASC,CAAT,CAAYC,CAAZ,CAAiBC,CAAjB,CAA+B,CAC3B,GAAIC,CAAAA,CAAO,CAAG,CAOVC,UAAU,CAAE,oBAASC,CAAT,CAAY,CACpBA,CAAC,CAACC,cAAF,GACA,GAAIC,CAAAA,CAAS,CAAGP,CAAC,CAACK,CAAC,CAACG,aAAH,CAAD,CAAmBC,IAAnB,CAAwB,MAAxB,CAAhB,CACAR,CAAG,CAACS,WAAJ,CAAgB,CACZ,CACIC,GAAG,CAAS,yBADhB,CAEIC,SAAS,CAAG,gBAFhB,CADY,CAKZ,CACID,GAAG,CAAS,4BADhB,CAEIC,SAAS,CAAG,gBAFhB,CALY,CASZ,CACID,GAAG,CAAS,KADhB,CAEIC,SAAS,CAAG,QAFhB,CATY,CAaZ,CACID,GAAG,CAAS,IADhB,CAEIC,SAAS,CAAG,QAFhB,CAbY,CAAhB,EAkBCC,IAlBD,CAkBM,SAASC,CAAT,CAAY,CACdZ,CAAY,CAACa,OAAb,CAAqBD,CAAC,CAAC,CAAD,CAAtB,CAA2BA,CAAC,CAAC,CAAD,CAA5B,CAAiCA,CAAC,CAAC,CAAD,CAAlC,CAAuCA,CAAC,CAAC,CAAD,CAAxC,CAA6C,UAAW,CACpDE,MAAM,CAACC,QAAP,CAAkBV,CACrB,CAFD,CAKH,CAxBD,EAyBCW,KAzBD,EA0BH,CApCS,CA2CVC,KAAK,CAAE,gBAAW,CAEdnB,CAAC,CAAC,MAAD,CAAD,CAAUoB,QAAV,CAAmB,0BAAnB,CAA6C,OAA7C,CAAsDjB,CAAO,CAACC,UAA9D,CACH,CA9CS,CAAd,CAiDA,MAAuD,CAMnDe,KAAK,CAAEhB,CAAO,CAACgB,KANoC,CAQ1D,CA5DK,CAAN","sourcesContent":["/**\n * Step management code.\n *\n * @module tool_usertours/managesteps\n * @class managesteps\n * @package tool_usertours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/str', 'core/notification'],\nfunction($, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified step.\n *\n * @method removeStep\n * @param {EventFacade} e The EventFacade\n */\n removeStep: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmstepremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmstepremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: function() {\n\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeStep);\n }\n };\n\n return /** @alias module:tool_usertours/managesteps */ {\n /**\n * Setup the step management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"file":"managesteps.min.js"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/managetours.min.js b/admin/tool/usertours/amd/build/managetours.min.js index 75c7d1b5a43d9..a1bd2e1c485bd 100644 --- a/admin/tool/usertours/amd/build/managetours.min.js +++ b/admin/tool/usertours/amd/build/managetours.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/str","core/notification"],function(a,b,c,d){var e={removeTour:function(b){b.preventDefault();var e=a(b.currentTarget).attr("href");c.get_strings([{key:"confirmtourremovaltitle",component:"tool_usertours"},{key:"confirmtourremovalquestion",component:"tool_usertours"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).then(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location=e})})["catch"]()},setup:function(){a("body").delegate('[data-action="delete"]',"click",e.removeTour)}};return{setup:e.setup}}); \ No newline at end of file +define ("tool_usertours/managetours",["jquery","core/ajax","core/str","core/notification"],function(a,b,c,d){var e={removeTour:function removeTour(b){b.preventDefault();var e=a(b.currentTarget).attr("href");c.get_strings([{key:"confirmtourremovaltitle",component:"tool_usertours"},{key:"confirmtourremovalquestion",component:"tool_usertours"},{key:"yes",component:"moodle"},{key:"no",component:"moodle"}]).then(function(a){d.confirm(a[0],a[1],a[2],a[3],function(){window.location=e})}).catch()},setup:function setup(){a("body").delegate("[data-action=\"delete\"]","click",e.removeTour)}};return{setup:e.setup}}); +//# sourceMappingURL=managetours.min.js.map diff --git a/admin/tool/usertours/amd/build/managetours.min.js.map b/admin/tool/usertours/amd/build/managetours.min.js.map new file mode 100644 index 0000000000000..6fa4688c4c8b8 --- /dev/null +++ b/admin/tool/usertours/amd/build/managetours.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/managetours.js"],"names":["define","$","ajax","str","notification","manager","removeTour","e","preventDefault","targetUrl","currentTarget","attr","get_strings","key","component","then","s","confirm","window","location","catch","setup","delegate"],"mappings":"AAQAA,OAAM,8BACN,CAAC,QAAD,CAAW,WAAX,CAAwB,UAAxB,CAAoC,mBAApC,CADM,CAEN,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAuBC,CAAvB,CAAqC,CACjC,GAAIC,CAAAA,CAAO,CAAG,CAOVC,UAAU,CAAE,oBAASC,CAAT,CAAY,CACpBA,CAAC,CAACC,cAAF,GACA,GAAIC,CAAAA,CAAS,CAAGR,CAAC,CAACM,CAAC,CAACG,aAAH,CAAD,CAAmBC,IAAnB,CAAwB,MAAxB,CAAhB,CACAR,CAAG,CAACS,WAAJ,CAAgB,CACZ,CACIC,GAAG,CAAS,yBADhB,CAEIC,SAAS,CAAG,gBAFhB,CADY,CAKZ,CACID,GAAG,CAAS,4BADhB,CAEIC,SAAS,CAAG,gBAFhB,CALY,CASZ,CACID,GAAG,CAAS,KADhB,CAEIC,SAAS,CAAG,QAFhB,CATY,CAaZ,CACID,GAAG,CAAS,IADhB,CAEIC,SAAS,CAAG,QAFhB,CAbY,CAAhB,EAkBCC,IAlBD,CAkBM,SAASC,CAAT,CAAY,CACdZ,CAAY,CAACa,OAAb,CAAqBD,CAAC,CAAC,CAAD,CAAtB,CAA2BA,CAAC,CAAC,CAAD,CAA5B,CAAiCA,CAAC,CAAC,CAAD,CAAlC,CAAuCA,CAAC,CAAC,CAAD,CAAxC,CAA6C,UAAW,CACpDE,MAAM,CAACC,QAAP,CAAkBV,CACrB,CAFD,CAKH,CAxBD,EAyBCW,KAzBD,EA0BH,CApCS,CA2CVC,KAAK,CAAE,gBAAW,CACdpB,CAAC,CAAC,MAAD,CAAD,CAAUqB,QAAV,CAAmB,0BAAnB,CAA6C,OAA7C,CAAsDjB,CAAO,CAACC,UAA9D,CACH,CA7CS,CAAd,CAgDA,MAAuD,CAMnDe,KAAK,CAAEhB,CAAO,CAACgB,KANoC,CAQ1D,CA3DK,CAAN","sourcesContent":["/**\n * Tour management code.\n *\n * @module tool_usertours/managetours\n * @class managetours\n * @package tool_usertours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['jquery', 'core/ajax', 'core/str', 'core/notification'],\nfunction($, ajax, str, notification) {\n var manager = {\n /**\n * Confirm removal of the specified tour.\n *\n * @method removeTour\n * @param {EventFacade} e The EventFacade\n */\n removeTour: function(e) {\n e.preventDefault();\n var targetUrl = $(e.currentTarget).attr('href');\n str.get_strings([\n {\n key: 'confirmtourremovaltitle',\n component: 'tool_usertours'\n },\n {\n key: 'confirmtourremovalquestion',\n component: 'tool_usertours'\n },\n {\n key: 'yes',\n component: 'moodle'\n },\n {\n key: 'no',\n component: 'moodle'\n }\n ])\n .then(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], function() {\n window.location = targetUrl;\n });\n\n return;\n })\n .catch();\n },\n\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: function() {\n $('body').delegate('[data-action=\"delete\"]', 'click', manager.removeTour);\n }\n };\n\n return /** @alias module:tool_usertours/managetours */ {\n /**\n * Setup the tour management UI.\n *\n * @method setup\n */\n setup: manager.setup\n };\n});\n"],"file":"managetours.min.js"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/tour.min.js b/admin/tool/usertours/amd/build/tour.min.js index 7b9e5676c3d77..5f967551a1c78 100644 --- a/admin/tool/usertours/amd/build/tour.min.js +++ b/admin/tool/usertours/amd/build/tour.min.js @@ -1 +1,2 @@ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery","core/popper"],function(c,d){return a.Tour=b(c,d)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery"),require("popper.js")):a.Tour=b(a.$,a.Popper)}(this,function(a,b){"use strict";function c(a){this.init(a)}var d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a};return c.prototype.tourName,c.prototype.storageKey,c.prototype.storage,c.prototype.originalConfiguration,c.prototype.listeners,c.prototype.eventHandlers,c.prototype.steps,c.prototype.currentStepNode,c.prototype.currentStepNumber,c.prototype.currentStepPopper,c.prototype.currentStepConfig,c.prototype.templateContent,c.prototype.init=function(a){this.eventHandlers={},this.reset(),this.originalConfiguration=a||{},this.configure.apply(this,arguments);try{this.storage=window.sessionStorage,this.storageKey="tourstate_"+this.tourName}catch(b){this.storage=!1,this.storageKey=""}return this},c.prototype.reset=function(){return this.hide(),this.eventHandlers=[],this.resetStepListeners(),this.originalConfiguration={},this.steps=[],this.currentStepNumber=0,this},c.prototype.configure=function(a){var b=this;return"object"===("undefined"==typeof a?"undefined":d(a))&&("undefined"!=typeof a.tourName&&(this.tourName=a.tourName),a.eventHandlers&&!function(){var c=void 0;for(c in a.eventHandlers)a.eventHandlers[c].forEach(function(a){this.addEventHandler(c,a)},b)}(),this.resetStepDefaults(!0),"object"===d(a.steps)&&(this.steps=a.steps),"undefined"!=typeof a.template&&(this.templateContent=a.template)),this.checkMinimumRequirements(),this},c.prototype.checkMinimumRequirements=function(){if(!this.tourName)throw new Error("Tour Name required");if(!this.steps||!this.steps.length)throw new Error("Steps must be specified")},c.prototype.resetStepDefaults=function(a){return"undefined"==typeof a&&(a=!0),this.stepDefaults={},a&&"undefined"!=typeof this.originalConfiguration.stepDefaults?this.setStepDefaults(this.originalConfiguration.stepDefaults):this.setStepDefaults({}),this},c.prototype.setStepDefaults=function(b){return this.stepDefaults||(this.stepDefaults={}),a.extend(this.stepDefaults,{element:"",placement:"top",delay:0,moveOnClick:!1,moveAfterTime:0,orphan:!1,direction:1},b),this},c.prototype.getCurrentStepNumber=function(){return parseInt(this.currentStepNumber,10)},c.prototype.setCurrentStepNumber=function(a){if(this.currentStepNumber=a,this.storage)try{this.storage.setItem(this.storageKey,a)}catch(b){b.code===DOMException.QUOTA_EXCEEDED_ERR&&this.storage.removeItem(this.storageKey)}},c.prototype.getNextStepNumber=function(a){"undefined"==typeof a&&(a=this.getCurrentStepNumber());for(var b=a+1;b<=this.steps.length;){if(this.isStepPotentiallyVisible(this.getStepConfig(b)))return b;b++}return null},c.prototype.getPreviousStepNumber=function(a){"undefined"==typeof a&&(a=this.getCurrentStepNumber());for(var b=a-1;b>=0;){if(this.isStepPotentiallyVisible(this.getStepConfig(b)))return b;b--}return null},c.prototype.isLastStep=function(a){var b=this.getNextStepNumber(a);return null===b},c.prototype.isFirstStep=function(a){var b=this.getPreviousStepNumber(a);return null===b},c.prototype.isStepPotentiallyVisible=function(a){return!!a&&(!!this.isStepActuallyVisible(a)||(!("undefined"==typeof a.orphan||!a.orphan)||!("undefined"==typeof a.delay||!a.delay)))},c.prototype.isStepActuallyVisible=function(a){if(!a)return!1;var b=this.getStepTarget(a);return!!(b&&b.length&&b.is(":visible"))&&!!b.length},c.prototype.next=function(){return this.gotoStep(this.getNextStepNumber())},c.prototype.previous=function(){return this.gotoStep(this.getPreviousStepNumber(),-1)},c.prototype.gotoStep=function(a,b){if(a<0)return this.endTour();var c=this.getStepConfig(a);return null===c?this.endTour():this._gotoStep(c,b)},c.prototype._gotoStep=function(a,b){if(!a)return this.endTour();if("undefined"!=typeof a.delay&&a.delay&&!a.delayed)return a.delayed=!0,window.setTimeout(this._gotoStep.bind(this),a.delay,a,b),this;if(!a.orphan&&!this.isStepActuallyVisible(a)){var c=b==-1?"getPreviousStepNumber":"getNextStepNumber";return this.gotoStep(this[c](a.stepNumber),b)}return this.hide(),this.fireEventHandlers("beforeRender",a),this.renderStep(a),this.fireEventHandlers("afterRender",a),this},c.prototype.getStepConfig=function(b){if(null===b||b<0||b>=this.steps.length)return null;var c=this.normalizeStepConfig(this.steps[b]);return c=a.extend(c,{stepNumber:b})},c.prototype.normalizeStepConfig=function(b){return"undefined"!=typeof b.reflex&&"undefined"==typeof b.moveAfterClick&&(b.moveAfterClick=b.reflex),"undefined"!=typeof b.element&&"undefined"==typeof b.target&&(b.target=b.element),"undefined"!=typeof b.content&&"undefined"==typeof b.body&&(b.body=b.content),b=a.extend({},this.stepDefaults,b),b=a.extend({},{attachTo:b.target,attachPoint:"after"},b),b.attachTo&&(b.attachTo=a(b.attachTo).first()),b},c.prototype.getStepTarget=function(b){return b.target?a(b.target):null},c.prototype.fireEventHandlers=function(a,b){return"undefined"==typeof this.eventHandlers[a]?this:(this.eventHandlers[a].forEach(function(a){a.call(this,b)},this),this)},c.prototype.addEventHandler=function(a,b){return"undefined"==typeof this.eventHandlers[a]&&(this.eventHandlers[a]=[]),this.eventHandlers[a].push(b),this},c.prototype.processStepListeners=function(b){if(this.listeners.push({node:this.currentStepNode,args:["click",'[data-role="next"]',a.proxy(this.next,this)]},{node:this.currentStepNode,args:["click",'[data-role="previous"]',a.proxy(this.previous,this)]},{node:this.currentStepNode,args:["click",'[data-role="end"]',a.proxy(this.endTour,this)]},{node:a('[data-flexitour="backdrop"]'),args:["click",a.proxy(this.hide,this)]},{node:a("body"),args:["keydown",a.proxy(this.handleKeyDown,this)]}),b.moveOnClick){var c=this.getStepTarget(b);this.listeners.push({node:c,args:["click",a.proxy(function(b){0===a(b.target).parents('[data-flexitour="container"]').length&&window.setTimeout(a.proxy(this.next,this),500)},this)]})}return this.listeners.forEach(function(a){a.node.on.apply(a.node,a.args)}),this},c.prototype.resetStepListeners=function(){return this.listeners&&this.listeners.forEach(function(a){a.node.off.apply(a.node,a.args)}),this.listeners=[],this},c.prototype.renderStep=function(b){this.currentStepConfig=b,this.setCurrentStepNumber(b.stepNumber);var c=a(this.getTemplateContent());return c.find('[data-placeholder="title"]').html(b.title),c.find('[data-placeholder="body"]').html(b.body),this.isFirstStep(b.stepNumber)?c.find('[data-role="previous"]').prop("disabled",!0):c.find('[data-role="previous"]').prop("disabled",!1),this.isLastStep(b.stepNumber)?c.find('[data-role="next"]').prop("disabled",!0):c.find('[data-role="next"]').prop("disabled",!1),c.find('[data-role="previous"]').attr("role","button"),c.find('[data-role="next"]').attr("role","button"),c.find('[data-role="end"]').attr("role","button"),b.template=c,this.addStepToPage(b),this.processStepListeners(b),this},c.prototype.getTemplateContent=function(){return a(this.templateContent).clone()},c.prototype.addStepToPage=function(c){var d=(c.template,a('').html(c.template).hide()),e=a("body, html").stop(!0,!0);if(this.isStepActuallyVisible(c)){var f=this.getStepTarget(c);f.data("flexitour","target");var g=this.calculateZIndex(f);g&&(c.zIndex=g+1),c.zIndex&&d.css("zIndex",c.zIndex+1),this.positionBackdrop(c),a(document.body).append(d),this.currentStepNode=d,this.currentStepNode.css({top:0,left:0}),e.animate({scrollTop:this.calculateScrollTop(c)}).promise().then(function(){this.positionStep(c),this.revealStep(c)}.bind(this))}else c.orphan&&(c.isOrphan=!0,c.attachTo=a("body").first(),c.attachPoint="append",this.positionBackdrop(c),d.addClass("orphan"),a(document.body).append(d),this.currentStepNode=d,this.currentStepNode.offset(this.calculateStepPositionInPage()),this.currentStepNode.css("position","fixed"),this.currentStepPopper=new b(a("body"),this.currentStepNode[0],{removeOnDestroy:!0,placement:c.placement+"-start",arrowElement:'[data-role="arrow"]',modifiers:{hide:{enabled:!1},applyStyle:{onLoad:null,enabled:!1}}}),this.revealStep(c));return this},c.prototype.revealStep=function(b){return this.currentStepNode.fadeIn("",a.proxy(function(){this.announceStep(b),this.currentStepNode.focus(),window.setTimeout(a.proxy(function(){this.currentStepNode&&this.currentStepNode.focus()},this),100)},this)),this},c.prototype.announceStep=function(a){var b="tour-step-"+this.tourName+"-"+a.stepNumber;this.currentStepNode.attr("id",b);var c=this.currentStepNode.find('[data-placeholder="body"]').first();c.attr("id",b+"-body"),c.attr("role","document");var d=this.currentStepNode.find('[data-placeholder="title"]').first();d.attr("id",b+"-title"),d.attr("aria-labelledby",b+"-body"),this.currentStepNode.attr("role","dialog"),this.currentStepNode.attr("tabindex",0),this.currentStepNode.attr("aria-labelledby",b+"-title"),this.currentStepNode.attr("aria-describedby",b+"-body");var e=this.getStepTarget(a);return e&&(e.attr("tabindex")||e.attr("tabindex",0),e.data("original-describedby",e.attr("aria-describedby")).attr("aria-describedby",b+"-body")),this.accessibilityShow(a),this},c.prototype.handleKeyDown=function(b){var c="a[href], link[href], [draggable=true], [contenteditable=true], :input:enabled, [tabindex], button:enabled";switch(b.keyCode){case 27:this.endTour();break;case 9:(function(){if(this.currentStepConfig.hasBackdrop){var d=a(document.activeElement),e=this.getStepTarget(this.currentStepConfig),f=a(c),g=a('span[data-flexitour="container"]'),h=void 0;e&&(f=f.filter(function(a,b){return null!=e&&(e.has(b).length||g.has(b).length||e.is(b)||g.is(b))})),f.each(function(a,b){if(d.is(b))return h=a,!1});var i=void 0,j=void 0,k=void 0;if(void 0!=h){var l=1;b.shiftKey&&(l=-1),i=h;do i+=l,j=a(f[i]);while(j.length&&j.is(":disabled")||j.is(":hidden"));j.length?(k=j.closest(e).length,k=k||j.closest(this.currentStepNode).length):k=!1}k?j.focus():b.shiftKey?this.currentStepNode.find(c).last().focus():this.currentStepConfig.isOrphan?this.currentStepNode.focus():e.focus(),b.preventDefault()}}).call(this)}},c.prototype.startTour=function(a){if(this.storage&&"undefined"==typeof a){var b=this.storage.getItem(this.storageKey);if(b){var c=parseInt(b,10);c<=this.steps.length&&(a=c)}}return"undefined"==typeof a&&(a=this.getCurrentStepNumber()),this.fireEventHandlers("beforeStart",a),this.gotoStep(a),this.fireEventHandlers("afterStart",a),this},c.prototype.restartTour=function(){return this.startTour(0)},c.prototype.endTour=function(){if(this.fireEventHandlers("beforeEnd"),this.currentStepConfig){var a=this.getStepTarget(this.currentStepConfig);a&&(a.attr("tabindex")||a.attr("tabindex","-1"),a.focus())}return this.hide(!0),this.fireEventHandlers("afterEnd"),this},c.prototype.hide=function(b){if(this.fireEventHandlers("beforeHide"),this.currentStepNode&&this.currentStepNode.length&&(this.currentStepNode.hide(),this.currentStepPopper&&this.currentStepPopper.destroy()),this.currentStepConfig){var c=this.getStepTarget(this.currentStepConfig);c&&(c.data("original-labelledby")&&c.attr("aria-labelledby",c.data("original-labelledby")),c.data("original-describedby")&&c.attr("aria-describedby",c.data("original-describedby")),c.data("original-tabindex")&&c.attr("tabindex",c.data("tabindex"))),this.currentStepConfig=null}var d=0;if(b&&(d=400),a('[data-flexitour="step-background"]').remove(),a('[data-flexitour="step-backdrop"]').removeAttr("data-flexitour"),a('[data-flexitour="backdrop"]').fadeOut(d,function(){a(this).remove()}),this.currentStepNode&&this.currentStepNode.length){var e=this.currentStepNode.attr("id");if(e){var f='[aria-describedby="'+e+'-body"]';a(f).removeAttr("tabindex"),a(f).removeAttr("aria-describedby")}}return this.resetStepListeners(),this.accessibilityHide(),this.fireEventHandlers("afterHide"),this.currentStepNode=null,this.currentStepPopper=null,this},c.prototype.show=function(){var a=this.getCurrentStepNumber();return this.gotoStep(a)},c.prototype.getStepContainer=function(){return a(this.currentStepNode)},c.prototype.calculateScrollTop=function(b){var c=a(window).scrollTop(),d=a(window).height(),e=this.getStepTarget(b);return c="top"===b.placement?e.offset().top-d/2:"bottom"===b.placement?e.offset().top+e.height()-d/2:e.height()<=.8*d?e.offset().top-(d-e.height())/2:e.offset().top-.2*d,c=Math.max(0,c),c=Math.min(a(document).height()-d,c),Math.ceil(c)},c.prototype.calculateStepPositionInPage=function(){var b=a(window).height(),c=this.currentStepNode.height(),d=a(window).width(),e=this.currentStepNode.width();return{top:Math.ceil((b-c)/2),left:Math.ceil((d-e)/2)}},c.prototype.positionStep=function(c){var d=this.currentStepNode;if(!d||!d.length)return this;var e=void 0;switch(c.placement){case"left":e=["left","right","top","bottom"];break;case"right":e=["right","left","top","bottom"];break;case"top":e=["top","bottom","right","left"];break;case"bottom":e=["bottom","top","right","left"];break;default:e="flip"}var f=this.getStepTarget(c),g={placement:c.placement+"-start",removeOnDestroy:!0,modifiers:{flip:{behaviour:e},arrow:{element:'[data-role="arrow"]'}},onCreate:function(a){h(a)},onUpdate:function(a){h(a)}},h=function(b){var c=b.placement.split("-")[0],d=["left","right"].indexOf(c)!==-1,e=b.instance.popper.querySelector('[data-role="arrow"]'),f=a(b.instance.popper.querySelector('[data-role="flexitour-step"]'));if(d){var g=parseFloat(window.getComputedStyle(e).height),h=parseFloat(window.getComputedStyle(e).top),i=parseFloat(window.getComputedStyle(b.instance.popper).height),j=parseFloat(window.getComputedStyle(b.instance.popper).top),k=parseFloat(f.css("borderTopWidth")),l=2*parseFloat(f.css("borderTopLeftRadius")),m=h+g/2,n=i+j-k-l,o=j+k+l;if(m>=n||m<=o){var p=0;p=m>i/2?n-g:o+g,a(e).css("top",p)}}else{var q=parseFloat(window.getComputedStyle(e).width),r=parseFloat(window.getComputedStyle(e).left),s=parseFloat(window.getComputedStyle(b.instance.popper).width),t=parseFloat(window.getComputedStyle(b.instance.popper).left),u=parseFloat(f.css("borderTopWidth")),v=2*parseFloat(f.css("borderTopLeftRadius")),w=r+q/2,x=s+t-u-v,y=t+u+v;if(w>=x||w<=y){var z=0;z=w>s/2?x-q:y+q,a(e).css("left",z)}}},i=a('[data-flexitour="step-background"]');return i.length&&(f=i),this.currentStepPopper=new b(f,d[0],g),this},c.prototype.positionBackdrop=function(b){if(b.backdrop){this.currentStepConfig.hasBackdrop=!0;var c=a('
');if(b.zIndex?"append"===b.attachPoint?b.attachTo.append(c):c.insertAfter(b.attachTo):a("body").append(c),this.isStepActuallyVisible(b)){var d=a('
'),e=this.getStepTarget(b),f=10,g=e;f&&(g=a("body")),d.css({width:e.outerWidth()+f+f,height:e.outerHeight()+f+f,left:e.offset().left-f,top:e.offset().top-f,backgroundColor:this.calculateInherittedBackgroundColor(g)}),e.offset().left").hide();a("body").append(c);var d=c.css("backgroundColor");for(c.remove(),b=a(b);b.length&&b[0]!==document;){var e=b.css("backgroundColor");if(e!==d)return e;b=b.parent()}return null},c.prototype.calculatePosition=function(b){for(b=a(b);b.length&&b[0]!==document;){var c=b.css("position");if("static"!==c)return c;b=b.parent()}return null},c.prototype.accessibilityShow=function(){var b="data-has-hidden",c="aria-hidden",d=function(a){var d=a.data("flexitour");if(d)switch(d){case"container":case"target":return}var e=a.attr(c);e||(a.attr(b,!0),a.attr(c,!0))};this.currentStepNode.siblings().each(function(b,c){d(a(c))}),this.currentStepNode.parentsUntil("body").siblings().each(function(b,c){d(a(c))})},c.prototype.accessibilityHide=function(){var b="data-has-hidden",c="aria-hidden",d=function(a){var d=a.attr(b);"undefined"!=typeof d&&(a.removeAttr(b),a.removeAttr(c))};a("["+b+"]").each(function(b,c){d(a(c))})},"object"===("undefined"==typeof exports?"undefined":d(exports))&&(module.exports=c),c}); \ No newline at end of file +function _typeof2(a){if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof2=function(a){return typeof a}}else{_typeof2=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof2(a)}(function(a,b){if("function"==typeof define&&define.amd){define ("tool_usertours/tour",["jquery","core/popper"],function(c,d){return a.Tour=b(c,d)})}else if("object"===("undefined"==typeof module?"undefined":_typeof2(module))&&module.exports){module.exports=b(require("jquery"),require("popper.js"))}else{a.Tour=b(a.$,a.Popper)}})(this,function(a,b){"use strict";var d="function"==typeof Symbol&&"symbol"===_typeof2(Symbol.iterator)?function(a){return _typeof2(a)}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":_typeof2(a)};function c(a){this.init(a)}c.prototype.tourName;c.prototype.storageKey;c.prototype.storage;c.prototype.originalConfiguration;c.prototype.listeners;c.prototype.eventHandlers;c.prototype.steps;c.prototype.currentStepNode;c.prototype.currentStepNumber;c.prototype.currentStepPopper;c.prototype.currentStepConfig;c.prototype.templateContent;c.prototype.init=function(a){this.eventHandlers={};this.reset();this.originalConfiguration=a||{};this.configure.apply(this,arguments);try{this.storage=window.sessionStorage;this.storageKey="tourstate_"+this.tourName}catch(a){this.storage=!1;this.storageKey=""}return this};c.prototype.reset=function(){this.hide();this.eventHandlers=[];this.resetStepListeners();this.originalConfiguration={};this.steps=[];this.currentStepNumber=0;return this};c.prototype.configure=function(a){var b=this;if("object"===("undefined"==typeof a?"undefined":d(a))){if("undefined"!=typeof a.tourName){this.tourName=a.tourName}if(a.eventHandlers){(function(){for(var c in a.eventHandlers){a.eventHandlers[c].forEach(function(a){this.addEventHandler(c,a)},b)}})()}this.resetStepDefaults(!0);if("object"===d(a.steps)){this.steps=a.steps}if("undefined"!=typeof a.template){this.templateContent=a.template}}this.checkMinimumRequirements();return this};c.prototype.checkMinimumRequirements=function(){if(!this.tourName){throw new Error("Tour Name required")}if(!this.steps||!this.steps.length){throw new Error("Steps must be specified")}};c.prototype.resetStepDefaults=function(a){if("undefined"==typeof a){a=!0}this.stepDefaults={};if(!a||"undefined"==typeof this.originalConfiguration.stepDefaults){this.setStepDefaults({})}else{this.setStepDefaults(this.originalConfiguration.stepDefaults)}return this};c.prototype.setStepDefaults=function(b){if(!this.stepDefaults){this.stepDefaults={}}a.extend(this.stepDefaults,{element:"",placement:"top",delay:0,moveOnClick:!1,moveAfterTime:0,orphan:!1,direction:1},b);return this};c.prototype.getCurrentStepNumber=function(){return parseInt(this.currentStepNumber,10)};c.prototype.setCurrentStepNumber=function(a){this.currentStepNumber=a;if(this.storage){try{this.storage.setItem(this.storageKey,a)}catch(a){if(a.code===DOMException.QUOTA_EXCEEDED_ERR){this.storage.removeItem(this.storageKey)}}}};c.prototype.getNextStepNumber=function(a){if("undefined"==typeof a){a=this.getCurrentStepNumber()}var b=a+1;while(b<=this.steps.length){if(this.isStepPotentiallyVisible(this.getStepConfig(b))){return b}b++}return null};c.prototype.getPreviousStepNumber=function(a){if("undefined"==typeof a){a=this.getCurrentStepNumber()}var b=a-1;while(0<=b){if(this.isStepPotentiallyVisible(this.getStepConfig(b))){return b}b--}return null};c.prototype.isLastStep=function(a){var b=this.getNextStepNumber(a);return null===b};c.prototype.isFirstStep=function(a){var b=this.getPreviousStepNumber(a);return null===b};c.prototype.isStepPotentiallyVisible=function(a){if(!a){return!1}if(this.isStepActuallyVisible(a)){return!0}if("undefined"!=typeof a.orphan&&a.orphan){return!0}if("undefined"!=typeof a.delay&&a.delay){return!0}return!1};c.prototype.isStepActuallyVisible=function(a){if(!a){return!1}var b=this.getStepTarget(a);if(b&&b.length&&b.is(":visible")){return!!b.length}return!1};c.prototype.next=function(){return this.gotoStep(this.getNextStepNumber())};c.prototype.previous=function(){return this.gotoStep(this.getPreviousStepNumber(),-1)};c.prototype.gotoStep=function(a,b){if(0>a){return this.endTour()}var c=this.getStepConfig(a);if(null===c){return this.endTour()}return this._gotoStep(c,b)};c.prototype._gotoStep=function(a,b){if(!a){return this.endTour()}if("undefined"!=typeof a.delay&&a.delay&&!a.delayed){a.delayed=!0;window.setTimeout(this._gotoStep.bind(this),a.delay,a,b);return this}else if(!a.orphan&&!this.isStepActuallyVisible(a)){var c=-1==b?"getPreviousStepNumber":"getNextStepNumber";return this.gotoStep(this[c](a.stepNumber),b)}this.hide();this.fireEventHandlers("beforeRender",a);this.renderStep(a);this.fireEventHandlers("afterRender",a);return this};c.prototype.getStepConfig=function(b){if(null===b||0>b||b>=this.steps.length){return null}var c=this.normalizeStepConfig(this.steps[b]);c=a.extend(c,{stepNumber:b});return c};c.prototype.normalizeStepConfig=function(b){if("undefined"!=typeof b.reflex&&"undefined"==typeof b.moveAfterClick){b.moveAfterClick=b.reflex}if("undefined"!=typeof b.element&&"undefined"==typeof b.target){b.target=b.element}if("undefined"!=typeof b.content&&"undefined"==typeof b.body){b.body=b.content}b=a.extend({},this.stepDefaults,b);b=a.extend({},{attachTo:b.target,attachPoint:"after"},b);if(b.attachTo){b.attachTo=a(b.attachTo).first()}return b};c.prototype.getStepTarget=function(b){if(b.target){return a(b.target)}return null};c.prototype.fireEventHandlers=function(a,b){if("undefined"==typeof this.eventHandlers[a]){return this}this.eventHandlers[a].forEach(function(a){a.call(this,b)},this);return this};c.prototype.addEventHandler=function(a,b){if("undefined"==typeof this.eventHandlers[a]){this.eventHandlers[a]=[]}this.eventHandlers[a].push(b);return this};c.prototype.processStepListeners=function(b){this.listeners.push({node:this.currentStepNode,args:["click","[data-role=\"next\"]",a.proxy(this.next,this)]},{node:this.currentStepNode,args:["click","[data-role=\"previous\"]",a.proxy(this.previous,this)]},{node:this.currentStepNode,args:["click","[data-role=\"end\"]",a.proxy(this.endTour,this)]},{node:a("[data-flexitour=\"backdrop\"]"),args:["click",a.proxy(this.hide,this)]},{node:a("body"),args:["keydown",a.proxy(this.handleKeyDown,this)]});if(b.moveOnClick){var c=this.getStepTarget(b);this.listeners.push({node:c,args:["click",a.proxy(function(b){if(0===a(b.target).parents("[data-flexitour=\"container\"]").length){window.setTimeout(a.proxy(this.next,this),500)}},this)]})}this.listeners.forEach(function(a){a.node.on.apply(a.node,a.args)});return this};c.prototype.resetStepListeners=function(){if(this.listeners){this.listeners.forEach(function(a){a.node.off.apply(a.node,a.args)})}this.listeners=[];return this};c.prototype.renderStep=function(b){this.currentStepConfig=b;this.setCurrentStepNumber(b.stepNumber);var c=a(this.getTemplateContent());c.find("[data-placeholder=\"title\"]").html(b.title);c.find("[data-placeholder=\"body\"]").html(b.body);if(this.isFirstStep(b.stepNumber)){c.find("[data-role=\"previous\"]").prop("disabled",!0)}else{c.find("[data-role=\"previous\"]").prop("disabled",!1)}if(this.isLastStep(b.stepNumber)){c.find("[data-role=\"next\"]").prop("disabled",!0)}else{c.find("[data-role=\"next\"]").prop("disabled",!1)}c.find("[data-role=\"previous\"]").attr("role","button");c.find("[data-role=\"next\"]").attr("role","button");c.find("[data-role=\"end\"]").attr("role","button");b.template=c;this.addStepToPage(b);this.processStepListeners(b);return this};c.prototype.getTemplateContent=function(){return a(this.templateContent).clone()};c.prototype.addStepToPage=function(c){var d=c.template,e=a("").html(c.template).hide(),f=a("body, html").stop(!0,!0);if(this.isStepActuallyVisible(c)){var g=this.getStepTarget(c);g.data("flexitour","target");var h=this.calculateZIndex(g);if(h){c.zIndex=h+1}if(c.zIndex){e.css("zIndex",c.zIndex+1)}this.positionBackdrop(c);a(document.body).append(e);this.currentStepNode=e;this.currentStepNode.css({top:0,left:0});f.animate({scrollTop:this.calculateScrollTop(c)}).promise().then(function(){this.positionStep(c);this.revealStep(c)}.bind(this))}else if(c.orphan){c.isOrphan=!0;c.attachTo=a("body").first();c.attachPoint="append";this.positionBackdrop(c);e.addClass("orphan");a(document.body).append(e);this.currentStepNode=e;this.currentStepNode.offset(this.calculateStepPositionInPage());this.currentStepNode.css("position","fixed");this.currentStepPopper=new b(a("body"),this.currentStepNode[0],{removeOnDestroy:!0,placement:c.placement+"-start",arrowElement:"[data-role=\"arrow\"]",modifiers:{hide:{enabled:!1},applyStyle:{onLoad:null,enabled:!1}}});this.revealStep(c)}return this};c.prototype.revealStep=function(b){this.currentStepNode.fadeIn("",a.proxy(function(){this.announceStep(b);this.currentStepNode.focus();window.setTimeout(a.proxy(function(){if(this.currentStepNode){this.currentStepNode.focus()}},this),100)},this));return this};c.prototype.announceStep=function(a){var b="tour-step-"+this.tourName+"-"+a.stepNumber;this.currentStepNode.attr("id",b);var c=this.currentStepNode.find("[data-placeholder=\"body\"]").first();c.attr("id",b+"-body");c.attr("role","document");var d=this.currentStepNode.find("[data-placeholder=\"title\"]").first();d.attr("id",b+"-title");d.attr("aria-labelledby",b+"-body");this.currentStepNode.attr("role","dialog");this.currentStepNode.attr("tabindex",0);this.currentStepNode.attr("aria-labelledby",b+"-title");this.currentStepNode.attr("aria-describedby",b+"-body");var e=this.getStepTarget(a);if(e){if(!e.attr("tabindex")){e.attr("tabindex",0)}e.data("original-describedby",e.attr("aria-describedby")).attr("aria-describedby",b+"-body")}this.accessibilityShow(a);return this};c.prototype.handleKeyDown=function(b){switch(b.keyCode){case 27:this.endTour();break;case 9:(function(){if(!this.currentStepConfig.hasBackdrop){return}var c=a(document.activeElement),d=this.getStepTarget(this.currentStepConfig),e=a("a[href], link[href], [draggable=true], [contenteditable=true], :input:enabled, [tabindex], button:enabled"),f=a("span[data-flexitour=\"container\"]"),g=void 0;if(d){e=e.filter(function(a,b){return null!=d&&(d.has(b).length||f.has(b).length||d.is(b)||f.is(b))})}e.each(function(a,b){if(c.is(b)){g=a;return!1}});var h=void 0,i=void 0,j=void 0;if(void 0!=g){var k=1;if(b.shiftKey){k=-1}h=g;do{h+=k;i=a(e[h])}while(i.length&&i.is(":disabled")||i.is(":hidden"));if(i.length){j=i.closest(d).length;j=j||i.closest(this.currentStepNode).length}else{j=!1}}if(j){i.focus()}else{if(b.shiftKey){this.currentStepNode.find("a[href], link[href], [draggable=true], [contenteditable=true], :input:enabled, [tabindex], button:enabled").last().focus()}else{if(this.currentStepConfig.isOrphan){this.currentStepNode.focus()}else{d.focus()}}}b.preventDefault()}).call(this);break;}};c.prototype.startTour=function(a){if(this.storage&&"undefined"==typeof a){var b=this.storage.getItem(this.storageKey);if(b){var c=parseInt(b,10);if(c<=this.steps.length){a=c}}}if("undefined"==typeof a){a=this.getCurrentStepNumber()}this.fireEventHandlers("beforeStart",a);this.gotoStep(a);this.fireEventHandlers("afterStart",a);return this};c.prototype.restartTour=function(){return this.startTour(0)};c.prototype.endTour=function(){this.fireEventHandlers("beforeEnd");if(this.currentStepConfig){var a=this.getStepTarget(this.currentStepConfig);if(a){if(!a.attr("tabindex")){a.attr("tabindex","-1")}a.focus()}}this.hide(!0);this.fireEventHandlers("afterEnd");return this};c.prototype.hide=function(b){this.fireEventHandlers("beforeHide");if(this.currentStepNode&&this.currentStepNode.length){this.currentStepNode.hide();if(this.currentStepPopper){this.currentStepPopper.destroy()}}if(this.currentStepConfig){var c=this.getStepTarget(this.currentStepConfig);if(c){if(c.data("original-labelledby")){c.attr("aria-labelledby",c.data("original-labelledby"))}if(c.data("original-describedby")){c.attr("aria-describedby",c.data("original-describedby"))}if(c.data("original-tabindex")){c.attr("tabindex",c.data("tabindex"))}}this.currentStepConfig=null}var d=0;if(b){d=400}a("[data-flexitour=\"step-background\"]").remove();a("[data-flexitour=\"step-backdrop\"]").removeAttr("data-flexitour");a("[data-flexitour=\"backdrop\"]").fadeOut(d,function(){a(this).remove()});if(this.currentStepNode&&this.currentStepNode.length){var e=this.currentStepNode.attr("id");if(e){var f="[aria-describedby=\""+e+"-body\"]";a(f).removeAttr("tabindex");a(f).removeAttr("aria-describedby")}}this.resetStepListeners();this.accessibilityHide();this.fireEventHandlers("afterHide");this.currentStepNode=null;this.currentStepPopper=null;return this};c.prototype.show=function(){var a=this.getCurrentStepNumber();return this.gotoStep(a)};c.prototype.getStepContainer=function(){return a(this.currentStepNode)};c.prototype.calculateScrollTop=function(b){var c=a(window).scrollTop(),d=a(window).height(),e=this.getStepTarget(b);if("top"===b.placement){c=e.offset().top-d/2}else if("bottom"===b.placement){c=e.offset().top+e.height()-d/2}else if(e.height()<=.8*d){c=e.offset().top-(d-e.height())/2}else{c=e.offset().top-.2*d}c=Math.max(0,c);c=Math.min(a(document).height()-d,c);return Math.ceil(c)};c.prototype.calculateStepPositionInPage=function(){var b=a(window).height(),c=this.currentStepNode.height(),d=a(window).width(),e=this.currentStepNode.width();return{top:Math.ceil((b-c)/2),left:Math.ceil((d-e)/2)}};c.prototype.positionStep=function(c){var d=this.currentStepNode;if(!d||!d.length){return this}var e;switch(c.placement){case"left":e=["left","right","top","bottom"];break;case"right":e=["right","left","top","bottom"];break;case"top":e=["top","bottom","right","left"];break;case"bottom":e=["bottom","top","right","left"];break;default:e="flip";break;}var f=this.getStepTarget(c),g={placement:c.placement+"-start",removeOnDestroy:!0,modifiers:{flip:{behaviour:e},arrow:{element:"[data-role=\"arrow\"]"}},onCreate:function(a){h(a)},onUpdate:function(a){h(a)}},h=function(b){var c=b.placement.split("-")[0],d=-1!==["left","right"].indexOf(c),e=b.instance.popper.querySelector("[data-role=\"arrow\"]"),f=a(b.instance.popper.querySelector("[data-role=\"flexitour-step\"]"));if(d){var g=parseFloat(window.getComputedStyle(e).height),h=parseFloat(window.getComputedStyle(e).top),i=parseFloat(window.getComputedStyle(b.instance.popper).height),j=parseFloat(window.getComputedStyle(b.instance.popper).top),k=parseFloat(f.css("borderTopWidth")),l=2*parseFloat(f.css("borderTopLeftRadius")),m=h+g/2,n=i+j-k-l,o=j+k+l;if(m>=n||m<=o){var p=0;if(m>i/2){p=n-g}else{p=o+g}a(e).css("top",p)}}else{var q=parseFloat(window.getComputedStyle(e).width),r=parseFloat(window.getComputedStyle(e).left),s=parseFloat(window.getComputedStyle(b.instance.popper).width),t=parseFloat(window.getComputedStyle(b.instance.popper).left),u=parseFloat(f.css("borderTopWidth")),v=2*parseFloat(f.css("borderTopLeftRadius")),w=r+q/2,x=s+t-u-v,y=t+u+v;if(w>=x||w<=y){var z=0;if(w>s/2){z=x-q}else{z=y+q}a(e).css("left",z)}}},i=a("[data-flexitour=\"step-background\"]");if(i.length){f=i}this.currentStepPopper=new b(f,d[0],g);return this};c.prototype.positionBackdrop=function(b){if(b.backdrop){this.currentStepConfig.hasBackdrop=!0;var c=a("
");if(b.zIndex){if("append"===b.attachPoint){b.attachTo.append(c)}else{c.insertAfter(b.attachTo)}}else{a("body").append(c)}if(this.isStepActuallyVisible(b)){var d=a("
"),e=this.getStepTarget(b),f=10,g=e;if(f){g=a("body")}d.css({width:e.outerWidth()+f+f,height:e.outerHeight()+f+f,left:e.offset().left-f,top:e.offset().top-f,backgroundColor:this.calculateInherittedBackgroundColor(g)});if(e.offset().left").hide();a("body").append(c);var d=c.css("backgroundColor");c.remove();b=a(b);while(b.length&&b[0]!==document){var e=b.css("backgroundColor");if(e!==d){return e}b=b.parent()}return null};c.prototype.calculatePosition=function(b){b=a(b);while(b.length&&b[0]!==document){var c=b.css("position");if("static"!==c){return c}b=b.parent()}return null};c.prototype.accessibilityShow=function(){var b="aria-hidden",c=function(a){var c=a.data("flexitour");if(c){switch(c){case"container":case"target":return;}}var d=a.attr(b);if(!d){a.attr("data-has-hidden",!0);a.attr(b,!0)}};this.currentStepNode.siblings().each(function(b,d){c(a(d))});this.currentStepNode.parentsUntil("body").siblings().each(function(b,d){c(a(d))})};c.prototype.accessibilityHide=function(){var b=function(a){var b=a.attr("data-has-hidden");if("undefined"!=typeof b){a.removeAttr("data-has-hidden");a.removeAttr("aria-hidden")}};a("[data-has-hidden]").each(function(c,d){b(a(d))})};if("object"===("undefined"==typeof exports?"undefined":d(exports))){module.exports=c}return c}); +//# sourceMappingURL=tour.min.js.map diff --git a/admin/tool/usertours/amd/build/tour.min.js.map b/admin/tool/usertours/amd/build/tour.min.js.map new file mode 100644 index 0000000000000..1ff8ed8f90849 --- /dev/null +++ b/admin/tool/usertours/amd/build/tour.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/tour.js"],"names":["root","factory","define","amd","a0","b1","module","exports","require","$","Popper","_typeof","Symbol","iterator","obj","constructor","prototype","Tour","config","init","tourName","storageKey","storage","originalConfiguration","listeners","eventHandlers","steps","currentStepNode","currentStepNumber","currentStepPopper","currentStepConfig","templateContent","reset","configure","apply","arguments","window","sessionStorage","e","hide","resetStepListeners","_this","eventName","forEach","handler","addEventHandler","resetStepDefaults","template","checkMinimumRequirements","Error","length","loadOriginalConfiguration","stepDefaults","setStepDefaults","extend","element","placement","delay","moveOnClick","moveAfterTime","orphan","direction","getCurrentStepNumber","parseInt","setCurrentStepNumber","stepNumber","setItem","code","DOMException","QUOTA_EXCEEDED_ERR","removeItem","getNextStepNumber","nextStepNumber","isStepPotentiallyVisible","getStepConfig","getPreviousStepNumber","previousStepNumber","isLastStep","isFirstStep","stepConfig","isStepActuallyVisible","target","getStepTarget","is","next","gotoStep","previous","endTour","_gotoStep","delayed","setTimeout","bind","fn","fireEventHandlers","renderStep","normalizeStepConfig","reflex","moveAfterClick","content","body","attachTo","attachPoint","first","data","thisEvent","call","push","processStepListeners","node","args","proxy","handleKeyDown","targetNode","parents","listener","on","off","getTemplateContent","find","html","title","prop","attr","addStepToPage","clone","stepContent","animationTarget","stop","zIndex","calculateZIndex","css","positionBackdrop","document","append","top","left","animate","scrollTop","calculateScrollTop","promise","then","positionStep","revealStep","isOrphan","addClass","offset","calculateStepPositionInPage","removeOnDestroy","arrowElement","modifiers","enabled","applyStyle","onLoad","fadeIn","announceStep","focus","stepId","bodyRegion","headerRegion","accessibilityShow","keyCode","hasBackdrop","activeElement","stepTarget","tabbableNodes","dialogContainer","currentIndex","filter","index","has","each","nextIndex","nextNode","focusRelevant","shiftKey","closest","last","preventDefault","startTour","startAt","storageStartValue","getItem","storageStartAt","restartTour","previousTarget","transition","destroy","fadeTime","remove","removeAttr","fadeOut","currentStepElement","accessibilityHide","show","getStepContainer","viewportHeight","height","Math","max","min","ceil","stepHeight","viewportWidth","width","stepWidth","flipBehavior","flip","behaviour","arrow","onCreate","recalculateArrowPosition","onUpdate","split","isVertical","indexOf","instance","popper","querySelector","stepElement","arrowHeight","parseFloat","getComputedStyle","arrowOffset","popperHeight","popperOffset","popperBorderWidth","popperBorderRadiusWidth","arrowPos","maxPos","minPos","newArrowPos","arrowWidth","_arrowOffset","popperWidth","_popperOffset","_popperBorderWidth","_popperBorderRadiusWidth","_arrowPos","_maxPos","_minPos","_newArrowPos","background","backdrop","insertAfter","buffer","colorNode","outerWidth","outerHeight","backgroundColor","calculateInherittedBackgroundColor","targetRadius","targetPosition","calculatePosition","fader","opacity","elem","position","value","isNaN","parent","fakeNode","fakeElemColor","color","attrName","hideFunction","child","flexitourRole","hidden","siblings","parentsUntil","showFunction"],"mappings":"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","sourcesContent":["// jshint ignore: start\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module unless amdModuleId is set\n define([\"jquery\",\"core/popper\"], function (a0,b1) {\n return (root['Tour'] = factory(a0,b1));\n });\n } else if (typeof module === 'object' && module.exports) {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like environments that support module.exports,\n // like Node.\n module.exports = factory(require(\"jquery\"),require(\"popper.js\"));\n } else {\n root['Tour'] = factory(root[\"$\"],root[\"Popper\"]);\n }\n}(this, function ($, Popper) {\n\n\"use strict\";\n\n/**\n * A Tour.\n *\n * @class Tour\n * @param {object} config The configuration object.\n */\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction Tour(config) {\n this.init(config);\n}\n\n/**\n * The name of the tour.\n *\n * @property {String} tourName\n */\nTour.prototype.tourName;\n\n/**\n * The name of the tour storage key.\n *\n * @property {String} storageKey\n */\nTour.prototype.storageKey;\n\n/**\n * The session storage object\n *\n * @property {Storage} storage\n */\nTour.prototype.storage;\n\n/**\n * The original configuration as passed into the constructor.\n *\n * @property {Object} originalConfiguration\n */\nTour.prototype.originalConfiguration;\n\n/**\n * The list of step listeners.\n *\n * @property {Array} listeners\n */\nTour.prototype.listeners;\n\n/**\n * The list of event handlers.\n *\n * @property {Object} eventHandlers\n */\nTour.prototype.eventHandlers;\n\n/**\n * The list of steps.\n *\n * @property {Object[]} steps\n */\nTour.prototype.steps;\n\n/**\n * The current step node.\n *\n * @property {jQuery} currentStepNode\n */\nTour.prototype.currentStepNode;\n\n/**\n * The current step number.\n *\n * @property {Number} currentStepNumber\n */\nTour.prototype.currentStepNumber;\n\n/**\n * The popper for the current step.\n *\n * @property {Popper} currentStepPopper\n */\nTour.prototype.currentStepPopper;\n\n/**\n * The config for the current step.\n *\n * @property {Object} currentStepConfig\n */\nTour.prototype.currentStepConfig;\n\n/**\n * The template content.\n *\n * @property {String} templateContent\n */\nTour.prototype.templateContent;\n\n/**\n * Initialise the tour.\n *\n * @method init\n * @param {Object} config The configuration object.\n * @chainable\n */\nTour.prototype.init = function (config) {\n // Unset all handlers.\n this.eventHandlers = {};\n\n // Reset the current tour states.\n this.reset();\n\n // Store the initial configuration.\n this.originalConfiguration = config || {};\n\n // Apply configuration.\n this.configure.apply(this, arguments);\n\n try {\n this.storage = window.sessionStorage;\n this.storageKey = 'tourstate_' + this.tourName;\n } catch (e) {\n this.storage = false;\n this.storageKey = '';\n }\n\n return this;\n};\n\n/**\n * Reset the current tour state.\n *\n * @method reset\n * @chainable\n */\nTour.prototype.reset = function () {\n // Hide the current step.\n this.hide();\n\n // Unset all handlers.\n this.eventHandlers = [];\n\n // Unset all listeners.\n this.resetStepListeners();\n\n // Unset the original configuration.\n this.originalConfiguration = {};\n\n // Reset the current step number and list of steps.\n this.steps = [];\n\n // Reset the current step number.\n this.currentStepNumber = 0;\n\n return this;\n};\n\n/**\n * Prepare tour configuration.\n *\n * @method configure\n * @chainable\n */\nTour.prototype.configure = function (config) {\n var _this = this;\n\n if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {\n // Tour name.\n if (typeof config.tourName !== 'undefined') {\n this.tourName = config.tourName;\n }\n\n // Set up eventHandlers.\n if (config.eventHandlers) {\n (function () {\n var eventName = void 0;\n for (eventName in config.eventHandlers) {\n config.eventHandlers[eventName].forEach(function (handler) {\n this.addEventHandler(eventName, handler);\n }, _this);\n }\n })();\n }\n\n // Reset the step configuration.\n this.resetStepDefaults(true);\n\n // Configure the steps.\n if (_typeof(config.steps) === 'object') {\n this.steps = config.steps;\n }\n\n if (typeof config.template !== 'undefined') {\n this.templateContent = config.template;\n }\n }\n\n // Check that we have enough to start the tour.\n this.checkMinimumRequirements();\n\n return this;\n};\n\n/**\n * Check that the configuration meets the minimum requirements.\n *\n * @method checkMinimumRequirements\n * @chainable\n */\nTour.prototype.checkMinimumRequirements = function () {\n // Need a tourName.\n if (!this.tourName) {\n throw new Error(\"Tour Name required\");\n }\n\n // Need a minimum of one step.\n if (!this.steps || !this.steps.length) {\n throw new Error(\"Steps must be specified\");\n }\n};\n\n/**\n * Reset step default configuration.\n *\n * @method resetStepDefaults\n * @param {Boolean} loadOriginalConfiguration Whether to load the original configuration supplied with the Tour.\n * @chainable\n */\nTour.prototype.resetStepDefaults = function (loadOriginalConfiguration) {\n if (typeof loadOriginalConfiguration === 'undefined') {\n loadOriginalConfiguration = true;\n }\n\n this.stepDefaults = {};\n if (!loadOriginalConfiguration || typeof this.originalConfiguration.stepDefaults === 'undefined') {\n this.setStepDefaults({});\n } else {\n this.setStepDefaults(this.originalConfiguration.stepDefaults);\n }\n\n return this;\n};\n\n/**\n * Set the step defaults.\n *\n * @method setStepDefaults\n * @param {Object} stepDefaults The step defaults to apply to all steps\n * @chainable\n */\nTour.prototype.setStepDefaults = function (stepDefaults) {\n if (!this.stepDefaults) {\n this.stepDefaults = {};\n }\n $.extend(this.stepDefaults, {\n element: '',\n placement: 'top',\n delay: 0,\n moveOnClick: false,\n moveAfterTime: 0,\n orphan: false,\n direction: 1\n }, stepDefaults);\n\n return this;\n};\n\n/**\n * Retrieve the current step number.\n *\n * @method getCurrentStepNumber\n * @return {Integer} The current step number\n */\nTour.prototype.getCurrentStepNumber = function () {\n return parseInt(this.currentStepNumber, 10);\n};\n\n/**\n * Store the current step number.\n *\n * @method setCurrentStepNumber\n * @param {Integer} stepNumber The current step number\n * @chainable\n */\nTour.prototype.setCurrentStepNumber = function (stepNumber) {\n this.currentStepNumber = stepNumber;\n if (this.storage) {\n try {\n this.storage.setItem(this.storageKey, stepNumber);\n } catch (e) {\n if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this.storage.removeItem(this.storageKey);\n }\n }\n }\n};\n\n/**\n * Get the next step number after the currently displayed step.\n *\n * @method getNextStepNumber\n * @return {Integer} The next step number to display\n */\nTour.prototype.getNextStepNumber = function (stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n var nextStepNumber = stepNumber + 1;\n\n // Keep checking the remaining steps.\n while (nextStepNumber <= this.steps.length) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(nextStepNumber))) {\n return nextStepNumber;\n }\n nextStepNumber++;\n }\n\n return null;\n};\n\n/**\n * Get the previous step number before the currently displayed step.\n *\n * @method getPreviousStepNumber\n * @return {Integer} The previous step number to display\n */\nTour.prototype.getPreviousStepNumber = function (stepNumber) {\n if (typeof stepNumber === 'undefined') {\n stepNumber = this.getCurrentStepNumber();\n }\n var previousStepNumber = stepNumber - 1;\n\n // Keep checking the remaining steps.\n while (previousStepNumber >= 0) {\n if (this.isStepPotentiallyVisible(this.getStepConfig(previousStepNumber))) {\n return previousStepNumber;\n }\n previousStepNumber--;\n }\n\n return null;\n};\n\n/**\n * Is the step the final step number?\n *\n * @method isLastStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the final step\n */\nTour.prototype.isLastStep = function (stepNumber) {\n var nextStepNumber = this.getNextStepNumber(stepNumber);\n\n return nextStepNumber === null;\n};\n\n/**\n * Is the step the first step number?\n *\n * @method isFirstStep\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the first step\n */\nTour.prototype.isFirstStep = function (stepNumber) {\n var previousStepNumber = this.getPreviousStepNumber(stepNumber);\n\n return previousStepNumber === null;\n};\n\n/**\n * Is this step potentially visible?\n *\n * @method isStepPotentiallyVisible\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is the potentially visible\n */\nTour.prototype.isStepPotentiallyVisible = function (stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // If it is actually visible, it is already potentially visible.\n return true;\n }\n\n if (typeof stepConfig.orphan !== 'undefined' && stepConfig.orphan) {\n // Orphan steps have no target. They are always visible.\n return true;\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay) {\n // Only return true if the activated has not been used yet.\n return true;\n }\n\n // Not theoretically, or actually visible.\n return false;\n};\n\n/**\n * Is this step actually visible?\n *\n * @method isStepActuallyVisible\n * @param {Integer} stepNumber Step number to test\n * @return {Boolean} Whether the step is actually visible\n */\nTour.prototype.isStepActuallyVisible = function (stepConfig) {\n if (!stepConfig) {\n // Without step config, there can be no step.\n return false;\n }\n\n var target = this.getStepTarget(stepConfig);\n if (target && target.length && target.is(':visible')) {\n // Without a target, there can be no step.\n return !!target.length;\n }\n\n return false;\n};\n\n/**\n * Go to the next step in the tour.\n *\n * @method next\n * @chainable\n */\nTour.prototype.next = function () {\n return this.gotoStep(this.getNextStepNumber());\n};\n\n/**\n * Go to the previous step in the tour.\n *\n * @method previous\n * @chainable\n */\nTour.prototype.previous = function () {\n return this.gotoStep(this.getPreviousStepNumber(), -1);\n};\n\n/**\n * Go to the specified step in the tour.\n *\n * @method gotoStep\n * @param {Integer} stepNumber The step number to display\n * @chainable\n */\nTour.prototype.gotoStep = function (stepNumber, direction) {\n if (stepNumber < 0) {\n return this.endTour();\n }\n\n var stepConfig = this.getStepConfig(stepNumber);\n if (stepConfig === null) {\n return this.endTour();\n }\n\n return this._gotoStep(stepConfig, direction);\n};\n\nTour.prototype._gotoStep = function (stepConfig, direction) {\n if (!stepConfig) {\n return this.endTour();\n }\n\n if (typeof stepConfig.delay !== 'undefined' && stepConfig.delay && !stepConfig.delayed) {\n stepConfig.delayed = true;\n window.setTimeout(this._gotoStep.bind(this), stepConfig.delay, stepConfig, direction);\n\n return this;\n } else if (!stepConfig.orphan && !this.isStepActuallyVisible(stepConfig)) {\n var fn = direction == -1 ? 'getPreviousStepNumber' : 'getNextStepNumber';\n return this.gotoStep(this[fn](stepConfig.stepNumber), direction);\n }\n\n this.hide();\n\n this.fireEventHandlers('beforeRender', stepConfig);\n this.renderStep(stepConfig);\n this.fireEventHandlers('afterRender', stepConfig);\n\n return this;\n};\n\n/**\n * Fetch the normalised step configuration for the specified step number.\n *\n * @method getStepConfig\n * @param {Integer} stepNumber The step number to fetch configuration for\n * @return {Object} The step configuration\n */\nTour.prototype.getStepConfig = function (stepNumber) {\n if (stepNumber === null || stepNumber < 0 || stepNumber >= this.steps.length) {\n return null;\n }\n\n // Normalise the step configuration.\n var stepConfig = this.normalizeStepConfig(this.steps[stepNumber]);\n\n // Add the stepNumber to the stepConfig.\n stepConfig = $.extend(stepConfig, { stepNumber: stepNumber });\n\n return stepConfig;\n};\n\n/**\n * Normalise the supplied step configuration.\n *\n * @method normalizeStepConfig\n * @param {Object} stepConfig The step configuration to normalise\n * @return {Object} The normalised step configuration\n */\nTour.prototype.normalizeStepConfig = function (stepConfig) {\n\n if (typeof stepConfig.reflex !== 'undefined' && typeof stepConfig.moveAfterClick === 'undefined') {\n stepConfig.moveAfterClick = stepConfig.reflex;\n }\n\n if (typeof stepConfig.element !== 'undefined' && typeof stepConfig.target === 'undefined') {\n stepConfig.target = stepConfig.element;\n }\n\n if (typeof stepConfig.content !== 'undefined' && typeof stepConfig.body === 'undefined') {\n stepConfig.body = stepConfig.content;\n }\n\n stepConfig = $.extend({}, this.stepDefaults, stepConfig);\n\n stepConfig = $.extend({}, {\n attachTo: stepConfig.target,\n attachPoint: 'after'\n }, stepConfig);\n\n if (stepConfig.attachTo) {\n stepConfig.attachTo = $(stepConfig.attachTo).first();\n }\n\n return stepConfig;\n};\n\n/**\n * Fetch the actual step target from the selector.\n *\n * This should not be called until after any delay has completed.\n *\n * @method getStepTarget\n * @param {Object} stepConfig The step configuration\n * @return {$}\n */\nTour.prototype.getStepTarget = function (stepConfig) {\n if (stepConfig.target) {\n return $(stepConfig.target);\n }\n\n return null;\n};\n\n/**\n * Fire any event handlers for the specified event.\n *\n * @param {String} eventName The name of the event to handle\n * @param {Object} data Any data to pass to the event\n * @chainable\n */\nTour.prototype.fireEventHandlers = function (eventName, data) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n return this;\n }\n\n this.eventHandlers[eventName].forEach(function (thisEvent) {\n thisEvent.call(this, data);\n }, this);\n\n return this;\n};\n\n/**\n * @method addEventHandler\n * @param string eventName The name of the event to listen for\n * @param function handler The event handler to call\n */\nTour.prototype.addEventHandler = function (eventName, handler) {\n if (typeof this.eventHandlers[eventName] === 'undefined') {\n this.eventHandlers[eventName] = [];\n }\n\n this.eventHandlers[eventName].push(handler);\n\n return this;\n};\n\n/**\n * Process listeners for the step being shown.\n *\n * @method processStepListeners\n * @param {object} stepConfig The configuration for the step\n * @chainable\n */\nTour.prototype.processStepListeners = function (stepConfig) {\n this.listeners.push(\n // Next/Previous buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"next\"]', $.proxy(this.next, this)]\n }, {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"previous\"]', $.proxy(this.previous, this)]\n },\n\n // Close and end tour buttons.\n {\n node: this.currentStepNode,\n args: ['click', '[data-role=\"end\"]', $.proxy(this.endTour, this)]\n },\n\n // Click backdrop and hide tour.\n {\n node: $('[data-flexitour=\"backdrop\"]'),\n args: ['click', $.proxy(this.hide, this)]\n },\n\n // Keypresses.\n {\n node: $('body'),\n args: ['keydown', $.proxy(this.handleKeyDown, this)]\n });\n\n if (stepConfig.moveOnClick) {\n var targetNode = this.getStepTarget(stepConfig);\n this.listeners.push({\n node: targetNode,\n args: ['click', $.proxy(function (e) {\n if ($(e.target).parents('[data-flexitour=\"container\"]').length === 0) {\n // Ignore clicks when they are in the flexitour.\n window.setTimeout($.proxy(this.next, this), 500);\n }\n }, this)]\n });\n }\n\n this.listeners.forEach(function (listener) {\n listener.node.on.apply(listener.node, listener.args);\n });\n\n return this;\n};\n\n/**\n * Reset step listeners.\n *\n * @method resetStepListeners\n * @chainable\n */\nTour.prototype.resetStepListeners = function () {\n // Stop listening to all external handlers.\n if (this.listeners) {\n this.listeners.forEach(function (listener) {\n listener.node.off.apply(listener.node, listener.args);\n });\n }\n this.listeners = [];\n\n return this;\n};\n\n/**\n * The standard step renderer.\n *\n * @method renderStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n */\nTour.prototype.renderStep = function (stepConfig) {\n // Store the current step configuration for later.\n this.currentStepConfig = stepConfig;\n this.setCurrentStepNumber(stepConfig.stepNumber);\n\n // Fetch the template and convert it to a $ object.\n var template = $(this.getTemplateContent());\n\n // Title.\n template.find('[data-placeholder=\"title\"]').html(stepConfig.title);\n\n // Body.\n template.find('[data-placeholder=\"body\"]').html(stepConfig.body);\n\n // Is this the first step?\n if (this.isFirstStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"previous\"]').prop('disabled', true);\n } else {\n template.find('[data-role=\"previous\"]').prop('disabled', false);\n }\n\n // Is this the final step?\n if (this.isLastStep(stepConfig.stepNumber)) {\n template.find('[data-role=\"next\"]').prop('disabled', true);\n } else {\n template.find('[data-role=\"next\"]').prop('disabled', false);\n }\n\n template.find('[data-role=\"previous\"]').attr('role', 'button');\n template.find('[data-role=\"next\"]').attr('role', 'button');\n template.find('[data-role=\"end\"]').attr('role', 'button');\n\n // Replace the template with the updated version.\n stepConfig.template = template;\n\n // Add to the page.\n this.addStepToPage(stepConfig);\n\n // Process step listeners after adding to the page.\n // This uses the currentNode.\n this.processStepListeners(stepConfig);\n\n return this;\n};\n\n/**\n * Getter for the template content.\n *\n * @method getTemplateContent\n * @return {$}\n */\nTour.prototype.getTemplateContent = function () {\n return $(this.templateContent).clone();\n};\n\n/**\n * Helper to add a step to the page.\n *\n * @method addStepToPage\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n */\nTour.prototype.addStepToPage = function (stepConfig) {\n var stepContent = stepConfig.template;\n\n // Create the stepNode from the template data.\n var currentStepNode = $('').html(stepConfig.template).hide();\n\n // The scroll animation occurs on the body or html.\n var animationTarget = $('body, html').stop(true, true);\n\n if (this.isStepActuallyVisible(stepConfig)) {\n var targetNode = this.getStepTarget(stepConfig);\n\n targetNode.data('flexitour', 'target');\n\n var zIndex = this.calculateZIndex(targetNode);\n if (zIndex) {\n stepConfig.zIndex = zIndex + 1;\n }\n\n if (stepConfig.zIndex) {\n currentStepNode.css('zIndex', stepConfig.zIndex + 1);\n }\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n // Ensure that the step node is positioned.\n // Some situations mean that the value is not properly calculated without this step.\n this.currentStepNode.css({\n top: 0,\n left: 0\n });\n\n animationTarget.animate({\n scrollTop: this.calculateScrollTop(stepConfig)\n }).promise().then(function () {\n this.positionStep(stepConfig);\n this.revealStep(stepConfig);\n }.bind(this));\n } else if (stepConfig.orphan) {\n stepConfig.isOrphan = true;\n\n // This will be appended to the body instead.\n stepConfig.attachTo = $('body').first();\n stepConfig.attachPoint = 'append';\n\n // Add the backdrop.\n this.positionBackdrop(stepConfig);\n\n // This is an orphaned step.\n currentStepNode.addClass('orphan');\n\n // It lives in the body.\n $(document.body).append(currentStepNode);\n this.currentStepNode = currentStepNode;\n\n this.currentStepNode.offset(this.calculateStepPositionInPage());\n this.currentStepNode.css('position', 'fixed');\n\n this.currentStepPopper = new Popper($('body'), this.currentStepNode[0], {\n removeOnDestroy: true,\n placement: stepConfig.placement + '-start',\n arrowElement: '[data-role=\"arrow\"]',\n // Empty the modifiers. We've already placed the step and don't want it moved.\n modifiers: {\n hide: {\n enabled: false\n },\n applyStyle: {\n onLoad: null,\n enabled: false\n }\n }\n });\n\n this.revealStep(stepConfig);\n }\n\n return this;\n};\n\nTour.prototype.revealStep = function (stepConfig) {\n // Fade the step in.\n this.currentStepNode.fadeIn('', $.proxy(function () {\n // Announce via ARIA.\n this.announceStep(stepConfig);\n\n // Focus on the current step Node.\n this.currentStepNode.focus();\n window.setTimeout($.proxy(function () {\n // After a brief delay, focus again.\n // There seems to be an issue with Jaws where it only reads the dialogue title initially.\n // This second focus helps it to read the full dialogue.\n if (this.currentStepNode) {\n this.currentStepNode.focus();\n }\n }, this), 100);\n }, this));\n\n return this;\n};\n\n/**\n * Helper to announce the step on the page.\n *\n * @method announceStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n */\nTour.prototype.announceStep = function (stepConfig) {\n // Setup the step Dialogue as per:\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_nonmodal\n // * https://www.w3.org/TR/wai-aria-practices/#dialog_modal\n\n // Generate an ID for the current step node.\n var stepId = 'tour-step-' + this.tourName + '-' + stepConfig.stepNumber;\n this.currentStepNode.attr('id', stepId);\n\n var bodyRegion = this.currentStepNode.find('[data-placeholder=\"body\"]').first();\n bodyRegion.attr('id', stepId + '-body');\n bodyRegion.attr('role', 'document');\n\n var headerRegion = this.currentStepNode.find('[data-placeholder=\"title\"]').first();\n headerRegion.attr('id', stepId + '-title');\n headerRegion.attr('aria-labelledby', stepId + '-body');\n\n // Generally, a modal dialog has a role of dialog.\n this.currentStepNode.attr('role', 'dialog');\n this.currentStepNode.attr('tabindex', 0);\n this.currentStepNode.attr('aria-labelledby', stepId + '-title');\n this.currentStepNode.attr('aria-describedby', stepId + '-body');\n\n // Configure ARIA attributes on the target.\n var target = this.getStepTarget(stepConfig);\n if (target) {\n if (!target.attr('tabindex')) {\n target.attr('tabindex', 0);\n }\n\n target.data('original-describedby', target.attr('aria-describedby')).attr('aria-describedby', stepId + '-body');\n }\n\n this.accessibilityShow(stepConfig);\n\n return this;\n};\n\n/**\n * Handle key down events.\n *\n * @method handleKeyDown\n * @param {EventFacade} e\n */\nTour.prototype.handleKeyDown = function (e) {\n var tabbableSelector = 'a[href], link[href], [draggable=true], [contenteditable=true], :input:enabled, [tabindex], button:enabled';\n switch (e.keyCode) {\n case 27:\n this.endTour();\n break;\n\n // 9 == Tab - trap focus for items with a backdrop.\n case 9:\n // Tab must be handled on key up only in this instance.\n (function () {\n if (!this.currentStepConfig.hasBackdrop) {\n // Trapping tab focus is only handled for those steps with a backdrop.\n return;\n }\n\n // Find all tabbable locations.\n var activeElement = $(document.activeElement);\n var stepTarget = this.getStepTarget(this.currentStepConfig);\n var tabbableNodes = $(tabbableSelector);\n var dialogContainer = $('span[data-flexitour=\"container\"]');\n var currentIndex = void 0;\n // Filter out element which is not belong to target section or dialogue.\n if (stepTarget) {\n tabbableNodes = tabbableNodes.filter(function (index, element) {\n return stepTarget != null && (stepTarget.has(element).length || dialogContainer.has(element).length || stepTarget.is(element) || dialogContainer.is(element));\n });\n }\n\n // Find index of focusing element.\n tabbableNodes.each(function (index, element) {\n if (activeElement.is(element)) {\n currentIndex = index;\n return false;\n }\n });\n\n var nextIndex = void 0;\n var nextNode = void 0;\n var focusRelevant = void 0;\n if (currentIndex != void 0) {\n var direction = 1;\n if (e.shiftKey) {\n direction = -1;\n }\n nextIndex = currentIndex;\n do {\n nextIndex += direction;\n nextNode = $(tabbableNodes[nextIndex]);\n } while (nextNode.length && nextNode.is(':disabled') || nextNode.is(':hidden'));\n if (nextNode.length) {\n // A new f\n focusRelevant = nextNode.closest(stepTarget).length;\n focusRelevant = focusRelevant || nextNode.closest(this.currentStepNode).length;\n } else {\n // Unable to find the target somehow.\n focusRelevant = false;\n }\n }\n\n if (focusRelevant) {\n nextNode.focus();\n } else {\n if (e.shiftKey) {\n // Focus on the last tabbable node in the step.\n this.currentStepNode.find(tabbableSelector).last().focus();\n } else {\n if (this.currentStepConfig.isOrphan) {\n // Focus on the step - there is no target.\n this.currentStepNode.focus();\n } else {\n // Focus on the step target.\n stepTarget.focus();\n }\n }\n }\n e.preventDefault();\n }).call(this);\n break;\n }\n};\n\n/**\n * Start the current tour.\n *\n * @method startTour\n * @param {Integer} startAt Which step number to start at. If not specified, starts at the last point.\n * @chainable\n */\nTour.prototype.startTour = function (startAt) {\n if (this.storage && typeof startAt === 'undefined') {\n var storageStartValue = this.storage.getItem(this.storageKey);\n if (storageStartValue) {\n var storageStartAt = parseInt(storageStartValue, 10);\n if (storageStartAt <= this.steps.length) {\n startAt = storageStartAt;\n }\n }\n }\n\n if (typeof startAt === 'undefined') {\n startAt = this.getCurrentStepNumber();\n }\n\n this.fireEventHandlers('beforeStart', startAt);\n this.gotoStep(startAt);\n this.fireEventHandlers('afterStart', startAt);\n\n return this;\n};\n\n/**\n * Restart the tour from the beginning, resetting the completionlag.\n *\n * @method restartTour\n * @chainable\n */\nTour.prototype.restartTour = function () {\n return this.startTour(0);\n};\n\n/**\n * End the current tour.\n *\n * @method endTour\n * @chainable\n */\nTour.prototype.endTour = function () {\n this.fireEventHandlers('beforeEnd');\n\n if (this.currentStepConfig) {\n var previousTarget = this.getStepTarget(this.currentStepConfig);\n if (previousTarget) {\n if (!previousTarget.attr('tabindex')) {\n previousTarget.attr('tabindex', '-1');\n }\n previousTarget.focus();\n }\n }\n\n this.hide(true);\n\n this.fireEventHandlers('afterEnd');\n\n return this;\n};\n\n/**\n * Hide any currently visible steps.\n *\n * @method hide\n * @chainable\n */\nTour.prototype.hide = function (transition) {\n this.fireEventHandlers('beforeHide');\n\n if (this.currentStepNode && this.currentStepNode.length) {\n this.currentStepNode.hide();\n if (this.currentStepPopper) {\n this.currentStepPopper.destroy();\n }\n }\n\n // Restore original target configuration.\n if (this.currentStepConfig) {\n var target = this.getStepTarget(this.currentStepConfig);\n if (target) {\n if (target.data('original-labelledby')) {\n target.attr('aria-labelledby', target.data('original-labelledby'));\n }\n\n if (target.data('original-describedby')) {\n target.attr('aria-describedby', target.data('original-describedby'));\n }\n\n if (target.data('original-tabindex')) {\n target.attr('tabindex', target.data('tabindex'));\n }\n }\n\n // Clear the step configuration.\n this.currentStepConfig = null;\n }\n\n var fadeTime = 0;\n if (transition) {\n fadeTime = 400;\n }\n\n // Remove the backdrop features.\n $('[data-flexitour=\"step-background\"]').remove();\n $('[data-flexitour=\"step-backdrop\"]').removeAttr('data-flexitour');\n $('[data-flexitour=\"backdrop\"]').fadeOut(fadeTime, function () {\n $(this).remove();\n });\n\n // Remove aria-describedby and tabindex attributes.\n if (this.currentStepNode && this.currentStepNode.length) {\n var stepId = this.currentStepNode.attr('id');\n if (stepId) {\n var currentStepElement = '[aria-describedby=\"' + stepId + '-body\"]';\n $(currentStepElement).removeAttr('tabindex');\n $(currentStepElement).removeAttr('aria-describedby');\n }\n }\n\n // Reset the listeners.\n this.resetStepListeners();\n\n this.accessibilityHide();\n\n this.fireEventHandlers('afterHide');\n\n this.currentStepNode = null;\n this.currentStepPopper = null;\n return this;\n};\n\n/**\n * Show the current steps.\n *\n * @method show\n * @chainable\n */\nTour.prototype.show = function () {\n // Show the current step.\n var startAt = this.getCurrentStepNumber();\n\n return this.gotoStep(startAt);\n};\n\n/**\n * Return the current step node.\n *\n * @method getStepContainer\n * @return {jQuery}\n */\nTour.prototype.getStepContainer = function () {\n return $(this.currentStepNode);\n};\n\n/**\n * Calculate scrollTop.\n *\n * @method calculateScrollTop\n * @param {Object} stepConfig The step configuration of the step\n * @return {Number}\n */\nTour.prototype.calculateScrollTop = function (stepConfig) {\n var scrollTop = $(window).scrollTop();\n var viewportHeight = $(window).height();\n var targetNode = this.getStepTarget(stepConfig);\n\n if (stepConfig.placement === 'top') {\n // If the placement is top, center scroll at the top of the target.\n scrollTop = targetNode.offset().top - viewportHeight / 2;\n } else if (stepConfig.placement === 'bottom') {\n // If the placement is bottom, center scroll at the bottom of the target.\n scrollTop = targetNode.offset().top + targetNode.height() - viewportHeight / 2;\n } else if (targetNode.height() <= viewportHeight * 0.8) {\n // If the placement is left/right, and the target fits in the viewport, centre screen on the target\n scrollTop = targetNode.offset().top - (viewportHeight - targetNode.height()) / 2;\n } else {\n // If the placement is left/right, and the target is bigger than the viewport, set scrollTop to target.top + buffer\n // and change step attachmentTarget to top+.\n scrollTop = targetNode.offset().top - viewportHeight * 0.2;\n }\n\n // Never scroll over the top.\n scrollTop = Math.max(0, scrollTop);\n\n // Never scroll beyond the bottom.\n scrollTop = Math.min($(document).height() - viewportHeight, scrollTop);\n\n return Math.ceil(scrollTop);\n};\n\n/**\n * Calculate dialogue position for page middle.\n *\n * @method calculateScrollTop\n * @return {Number}\n */\nTour.prototype.calculateStepPositionInPage = function () {\n var viewportHeight = $(window).height();\n var stepHeight = this.currentStepNode.height();\n\n var viewportWidth = $(window).width();\n var stepWidth = this.currentStepNode.width();\n\n return {\n top: Math.ceil((viewportHeight - stepHeight) / 2),\n left: Math.ceil((viewportWidth - stepWidth) / 2)\n };\n};\n\n/**\n * Position the step on the page.\n *\n * @method positionStep\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n */\nTour.prototype.positionStep = function (stepConfig) {\n var content = this.currentStepNode;\n if (!content || !content.length) {\n // Unable to find the step node.\n return this;\n }\n\n var flipBehavior = void 0;\n switch (stepConfig.placement) {\n case 'left':\n flipBehavior = ['left', 'right', 'top', 'bottom'];\n break;\n case 'right':\n flipBehavior = ['right', 'left', 'top', 'bottom'];\n break;\n case 'top':\n flipBehavior = ['top', 'bottom', 'right', 'left'];\n break;\n case 'bottom':\n flipBehavior = ['bottom', 'top', 'right', 'left'];\n break;\n default:\n flipBehavior = 'flip';\n break;\n }\n\n var target = this.getStepTarget(stepConfig);\n var config = {\n placement: stepConfig.placement + '-start',\n removeOnDestroy: true,\n modifiers: {\n flip: {\n behaviour: flipBehavior\n },\n arrow: {\n element: '[data-role=\"arrow\"]'\n }\n },\n onCreate: function onCreate(data) {\n recalculateArrowPosition(data);\n },\n onUpdate: function onUpdate(data) {\n recalculateArrowPosition(data);\n }\n };\n\n var recalculateArrowPosition = function recalculateArrowPosition(data) {\n var placement = data.placement.split('-')[0];\n var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n var arrowElement = data.instance.popper.querySelector('[data-role=\"arrow\"]');\n var stepElement = $(data.instance.popper.querySelector('[data-role=\"flexitour-step\"]'));\n if (isVertical) {\n var arrowHeight = parseFloat(window.getComputedStyle(arrowElement).height);\n var arrowOffset = parseFloat(window.getComputedStyle(arrowElement).top);\n var popperHeight = parseFloat(window.getComputedStyle(data.instance.popper).height);\n var popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).top);\n var popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n var popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n var arrowPos = arrowOffset + arrowHeight / 2;\n var maxPos = popperHeight + popperOffset - popperBorderWidth - popperBorderRadiusWidth;\n var minPos = popperOffset + popperBorderWidth + popperBorderRadiusWidth;\n if (arrowPos >= maxPos || arrowPos <= minPos) {\n var newArrowPos = 0;\n if (arrowPos > popperHeight / 2) {\n newArrowPos = maxPos - arrowHeight;\n } else {\n newArrowPos = minPos + arrowHeight;\n }\n $(arrowElement).css('top', newArrowPos);\n }\n } else {\n var arrowWidth = parseFloat(window.getComputedStyle(arrowElement).width);\n var _arrowOffset = parseFloat(window.getComputedStyle(arrowElement).left);\n var popperWidth = parseFloat(window.getComputedStyle(data.instance.popper).width);\n var _popperOffset = parseFloat(window.getComputedStyle(data.instance.popper).left);\n var _popperBorderWidth = parseFloat(stepElement.css('borderTopWidth'));\n var _popperBorderRadiusWidth = parseFloat(stepElement.css('borderTopLeftRadius')) * 2;\n var _arrowPos = _arrowOffset + arrowWidth / 2;\n var _maxPos = popperWidth + _popperOffset - _popperBorderWidth - _popperBorderRadiusWidth;\n var _minPos = _popperOffset + _popperBorderWidth + _popperBorderRadiusWidth;\n if (_arrowPos >= _maxPos || _arrowPos <= _minPos) {\n var _newArrowPos = 0;\n if (_arrowPos > popperWidth / 2) {\n _newArrowPos = _maxPos - arrowWidth;\n } else {\n _newArrowPos = _minPos + arrowWidth;\n }\n $(arrowElement).css('left', _newArrowPos);\n }\n }\n };\n\n var background = $('[data-flexitour=\"step-background\"]');\n if (background.length) {\n target = background;\n }\n this.currentStepPopper = new Popper(target, content[0], config);\n\n return this;\n};\n\n/**\n * Add the backdrop.\n *\n * @method positionBackdrop\n * @param {Object} stepConfig The step configuration of the step\n * @chainable\n */\nTour.prototype.positionBackdrop = function (stepConfig) {\n if (stepConfig.backdrop) {\n this.currentStepConfig.hasBackdrop = true;\n var backdrop = $('
');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(backdrop);\n } else {\n backdrop.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(backdrop);\n }\n\n if (this.isStepActuallyVisible(stepConfig)) {\n // The step has a visible target.\n // Punch a hole through the backdrop.\n var background = $('
');\n\n var targetNode = this.getStepTarget(stepConfig);\n\n var buffer = 10;\n\n var colorNode = targetNode;\n if (buffer) {\n colorNode = $('body');\n }\n\n background.css({\n width: targetNode.outerWidth() + buffer + buffer,\n height: targetNode.outerHeight() + buffer + buffer,\n left: targetNode.offset().left - buffer,\n top: targetNode.offset().top - buffer,\n backgroundColor: this.calculateInherittedBackgroundColor(colorNode)\n });\n\n if (targetNode.offset().left < buffer) {\n background.css({\n width: targetNode.outerWidth() + targetNode.offset().left + buffer,\n left: targetNode.offset().left\n });\n }\n\n if (targetNode.offset().top < buffer) {\n background.css({\n height: targetNode.outerHeight() + targetNode.offset().top + buffer,\n top: targetNode.offset().top\n });\n }\n\n var targetRadius = targetNode.css('borderRadius');\n if (targetRadius && targetRadius !== $('body').css('borderRadius')) {\n background.css('borderRadius', targetRadius);\n }\n\n var targetPosition = this.calculatePosition(targetNode);\n if (targetPosition === 'fixed') {\n background.css('top', 0);\n } else if (targetPosition === 'absolute') {\n background.css('position', 'fixed');\n }\n\n var fader = background.clone();\n fader.css({\n backgroundColor: backdrop.css('backgroundColor'),\n opacity: backdrop.css('opacity')\n });\n fader.attr('data-flexitour', 'step-background-fader');\n\n if (stepConfig.zIndex) {\n if (stepConfig.attachPoint === 'append') {\n stepConfig.attachTo.append(background);\n } else {\n fader.insertAfter(stepConfig.attachTo);\n background.insertAfter(stepConfig.attachTo);\n }\n } else {\n $('body').append(fader);\n $('body').append(background);\n }\n\n // Add the backdrop data to the actual target.\n // This is the part which actually does the work.\n targetNode.attr('data-flexitour', 'step-backdrop');\n\n if (stepConfig.zIndex) {\n backdrop.css('zIndex', stepConfig.zIndex);\n background.css('zIndex', stepConfig.zIndex + 1);\n targetNode.css('zIndex', stepConfig.zIndex + 2);\n }\n\n fader.fadeOut('2000', function () {\n $(this).remove();\n });\n }\n }\n return this;\n};\n\n/**\n * Calculate the inheritted z-index.\n *\n * @method calculateZIndex\n * @param {jQuery} elem The element to calculate z-index for\n * @return {Number} Calculated z-index\n */\nTour.prototype.calculateZIndex = function (elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n // Ignore z-index if position is set to a value where z-index is ignored by the browser\n // This makes behavior of this function consistent across browsers\n // WebKit always returns auto if the element is positioned.\n var position = elem.css(\"position\");\n if (position === \"absolute\" || position === \"relative\" || position === \"fixed\") {\n // IE returns 0 when zIndex is not specified\n // other browsers return a string\n // we ignore the case of nested elements with an explicit value of 0\n //
\n var value = parseInt(elem.css(\"zIndex\"), 10);\n if (!isNaN(value) && value !== 0) {\n return value;\n }\n }\n elem = elem.parent();\n }\n\n return 0;\n};\n\n/**\n * Calculate the inheritted background colour.\n *\n * @method calculateInherittedBackgroundColor\n * @param {jQuery} elem The element to calculate colour for\n * @return {String} Calculated background colour\n */\nTour.prototype.calculateInherittedBackgroundColor = function (elem) {\n // Use a fake node to compare each element against.\n var fakeNode = $('
').hide();\n $('body').append(fakeNode);\n var fakeElemColor = fakeNode.css('backgroundColor');\n fakeNode.remove();\n\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n var color = elem.css('backgroundColor');\n if (color !== fakeElemColor) {\n return color;\n }\n elem = elem.parent();\n }\n\n return null;\n};\n\n/**\n * Calculate the inheritted position.\n *\n * @method calculatePosition\n * @param {jQuery} elem The element to calculate position for\n * @return {String} Calculated position\n */\nTour.prototype.calculatePosition = function (elem) {\n elem = $(elem);\n while (elem.length && elem[0] !== document) {\n var position = elem.css('position');\n if (position !== 'static') {\n return position;\n }\n elem = elem.parent();\n }\n\n return null;\n};\n\n/**\n * Perform accessibility changes for step shown.\n *\n * This will add aria-hidden=\"true\" to all siblings and parent siblings.\n *\n * @method accessibilityShow\n */\nTour.prototype.accessibilityShow = function () {\n var stateHolder = 'data-has-hidden';\n var attrName = 'aria-hidden';\n var hideFunction = function hideFunction(child) {\n var flexitourRole = child.data('flexitour');\n if (flexitourRole) {\n switch (flexitourRole) {\n case 'container':\n case 'target':\n return;\n }\n }\n\n var hidden = child.attr(attrName);\n if (!hidden) {\n child.attr(stateHolder, true);\n child.attr(attrName, true);\n }\n };\n\n this.currentStepNode.siblings().each(function (index, node) {\n hideFunction($(node));\n });\n this.currentStepNode.parentsUntil('body').siblings().each(function (index, node) {\n hideFunction($(node));\n });\n};\n\n/**\n * Perform accessibility changes for step hidden.\n *\n * This will remove any newly added aria-hidden=\"true\".\n *\n * @method accessibilityHide\n */\nTour.prototype.accessibilityHide = function () {\n var stateHolder = 'data-has-hidden';\n var attrName = 'aria-hidden';\n var showFunction = function showFunction(child) {\n var hidden = child.attr(stateHolder);\n if (typeof hidden !== 'undefined') {\n child.removeAttr(stateHolder);\n child.removeAttr(attrName);\n }\n };\n\n $('[' + stateHolder + ']').each(function (index, node) {\n showFunction($(node));\n });\n};\n\nif ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {\n module.exports = Tour;\n}\n\nreturn Tour;\n\n}));\n"],"file":"tour.min.js"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/usertours.min.js b/admin/tool/usertours/amd/build/usertours.min.js index 3caa790abd328..6895e7573f005 100644 --- a/admin/tool/usertours/amd/build/usertours.min.js +++ b/admin/tool/usertours/amd/build/usertours.min.js @@ -1 +1,2 @@ -define(["core/ajax","tool_usertours/tour","jquery","core/templates","core/str","core/log","core/notification"],function(a,b,c,d,e,f,g){var h={tourId:null,currentTour:null,context:null,init:function(a,b,d){h.tourId=a,h.context=d,"undefined"==typeof b&&(b=!0),b&&h.fetchTour(a),h.addResetLink(),c("body").on("click",'[data-action="tool_usertours/resetpagetour"]',function(a){a.preventDefault(),h.resetTourState(h.tourId)})},fetchTour:function(b){M.util.js_pending("admin_usertour_fetchTour"+b),c.when(a.call([{methodname:"tool_usertours_fetch_and_start_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0],d.render("tool_usertours/tourstep",{})).then(function(a,c){return h.startBootstrapTour(b,c[0],a.tourconfig)}).always(function(){M.util.js_complete("admin_usertour_fetchTour"+b)}).fail(g.exception)},addResetLink:function(){var a;M.util.js_pending("admin_usertour_addResetLink"),a=c(c(".tool_usertours-resettourcontainer").length?".tool_usertours-resettourcontainer":c(".logininfo").length?".logininfo":c("footer").length?"footer":"body"),d.render("tool_usertours/resettour",{}).then(function(b,c){d.appendNodeContents(a,b,c)}).always(function(){M.util.js_complete("admin_usertour_addResetLink")}).fail()},startBootstrapTour:function(a,c,d){return h.currentTour&&(d.onEnd=null,h.currentTour.endTour(),delete h.currentTour),d.eventHandlers={afterEnd:[h.markTourComplete],afterRender:[h.markStepShown]},d.tourName=d.name,delete d.name,d.template=c,d.steps=d.steps.map(function(a){return"undefined"!=typeof a.element&&(a.target=a.element,delete a.element),"undefined"!=typeof a.reflex&&(a.moveOnClick=!!a.reflex,delete a.reflex),"undefined"!=typeof a.content&&(a.body=a.content,delete a.content),a}),h.currentTour=new b(d),h.currentTour.startTour()},markStepShown:function(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_step_shown",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},markTourComplete:function(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_complete_tour",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},resetTourState:function(b){c.when(a.call([{methodname:"tool_usertours_reset_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0]).then(function(a){a.startTour&&h.fetchTour(a.startTour)}).fail(g.exception)}};return{init:h.init,resetTourState:h.resetTourState}}); \ No newline at end of file +define ("tool_usertours/usertours",["core/ajax","tool_usertours/tour","jquery","core/templates","core/str","core/log","core/notification"],function(a,b,c,d,e,f,g){var h={tourId:null,currentTour:null,context:null,init:function init(a,b,d){h.tourId=a;h.context=d;if("undefined"==typeof b){b=!0}if(b){h.fetchTour(a)}h.addResetLink();c("body").on("click","[data-action=\"tool_usertours/resetpagetour\"]",function(a){a.preventDefault();h.resetTourState(h.tourId)})},fetchTour:function fetchTour(b){M.util.js_pending("admin_usertour_fetchTour"+b);c.when(a.call([{methodname:"tool_usertours_fetch_and_start_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0],d.render("tool_usertours/tourstep",{})).then(function(a,c){return h.startBootstrapTour(b,c[0],a.tourconfig)}).always(function(){M.util.js_complete("admin_usertour_fetchTour"+b)}).fail(g.exception)},addResetLink:function addResetLink(){var a;M.util.js_pending("admin_usertour_addResetLink");if(c(".tool_usertours-resettourcontainer").length){a=c(".tool_usertours-resettourcontainer")}else if(c(".logininfo").length){a=c(".logininfo")}else if(c("footer").length){a=c("footer")}else{a=c("body")}d.render("tool_usertours/resettour",{}).then(function(b,c){d.appendNodeContents(a,b,c)}).always(function(){M.util.js_complete("admin_usertour_addResetLink")}).fail()},startBootstrapTour:function startBootstrapTour(a,c,d){if(h.currentTour){d.onEnd=null;h.currentTour.endTour();delete h.currentTour}d.eventHandlers={afterEnd:[h.markTourComplete],afterRender:[h.markStepShown]};d.tourName=d.name;delete d.name;d.template=c;d.steps=d.steps.map(function(a){if("undefined"!=typeof a.element){a.target=a.element;delete a.element}if("undefined"!=typeof a.reflex){a.moveOnClick=!!a.reflex;delete a.reflex}if("undefined"!=typeof a.content){a.body=a.content;delete a.content}return a});h.currentTour=new b(d);return h.currentTour.startTour()},markStepShown:function markStepShown(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_step_shown",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},markTourComplete:function markTourComplete(){var b=this.getStepConfig(this.getCurrentStepNumber());c.when(a.call([{methodname:"tool_usertours_complete_tour",args:{tourid:h.tourId,context:h.context,pageurl:window.location.href,stepid:b.stepid,stepindex:this.getCurrentStepNumber()}}])[0]).fail(f.error)},resetTourState:function resetTourState(b){c.when(a.call([{methodname:"tool_usertours_reset_tour",args:{tourid:b,context:h.context,pageurl:window.location.href}}])[0]).then(function(a){if(a.startTour){h.fetchTour(a.startTour)}}).fail(g.exception)}};return{init:h.init,resetTourState:h.resetTourState}}); +//# sourceMappingURL=usertours.min.js.map diff --git a/admin/tool/usertours/amd/build/usertours.min.js.map b/admin/tool/usertours/amd/build/usertours.min.js.map new file mode 100644 index 0000000000000..ebfcda0091426 --- /dev/null +++ b/admin/tool/usertours/amd/build/usertours.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/usertours.js"],"names":["define","ajax","BootstrapTour","$","templates","str","log","notification","usertours","tourId","currentTour","context","init","startTour","fetchTour","addResetLink","on","e","preventDefault","resetTourState","M","util","js_pending","when","call","methodname","args","tourid","pageurl","window","location","href","render","then","response","template","startBootstrapTour","tourconfig","always","js_complete","fail","exception","ele","length","html","js","appendNodeContents","tourConfig","onEnd","endTour","eventHandlers","afterEnd","markTourComplete","afterRender","markStepShown","tourName","name","steps","map","step","element","target","reflex","moveOnClick","content","body","stepConfig","getStepConfig","getCurrentStepNumber","stepid","stepindex","error"],"mappings":"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","sourcesContent":["/**\n * User tour control library.\n *\n * @module tool_usertours/usertours\n * @class usertours\n * @package tool_usertours\n * @copyright 2016 Andrew Nicols \n */\ndefine(\n['core/ajax', 'tool_usertours/tour', 'jquery', 'core/templates', 'core/str', 'core/log', 'core/notification'],\nfunction(ajax, BootstrapTour, $, templates, str, log, notification) {\n var usertours = {\n tourId: null,\n\n currentTour: null,\n\n context: null,\n\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Number} tourId The ID of the tour to start.\n * @param {Bool} startTour Attempt to start the tour now.\n * @param {Number} context The context of the current page.\n */\n init: function(tourId, startTour, context) {\n // Only one tour per page is allowed.\n usertours.tourId = tourId;\n\n usertours.context = context;\n\n if (typeof startTour === 'undefined') {\n startTour = true;\n }\n\n if (startTour) {\n // Fetch the tour configuration.\n usertours.fetchTour(tourId);\n }\n\n usertours.addResetLink();\n // Watch for the reset link.\n $('body').on('click', '[data-action=\"tool_usertours/resetpagetour\"]', function(e) {\n e.preventDefault();\n usertours.resetTourState(usertours.tourId);\n });\n },\n\n /**\n * Fetch the configuration specified tour, and start the tour when it has been fetched.\n *\n * @method fetchTour\n * @param {Number} tourId The ID of the tour to start.\n */\n fetchTour: function(tourId) {\n M.util.js_pending('admin_usertour_fetchTour' + tourId);\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_fetch_and_start_tour',\n args: {\n tourid: tourId,\n context: usertours.context,\n pageurl: window.location.href,\n }\n }\n ])[0],\n templates.render('tool_usertours/tourstep', {})\n )\n .then(function(response, template) {\n return usertours.startBootstrapTour(tourId, template[0], response.tourconfig);\n })\n .always(function() {\n M.util.js_complete('admin_usertour_fetchTour' + tourId);\n\n return;\n })\n .fail(notification.exception);\n },\n\n /**\n * Add a reset link to the page.\n *\n * @method addResetLink\n */\n addResetLink: function() {\n var ele;\n M.util.js_pending('admin_usertour_addResetLink');\n\n // Append the link to the most suitable place on the page\n // with fallback to legacy selectors and finally the body\n // if there is no better place.\n if ($('.tool_usertours-resettourcontainer').length) {\n ele = $('.tool_usertours-resettourcontainer');\n } else if ($('.logininfo').length) {\n ele = $('.logininfo');\n } else if ($('footer').length) {\n ele = $('footer');\n } else {\n ele = $('body');\n }\n templates.render('tool_usertours/resettour', {})\n .then(function(html, js) {\n templates.appendNodeContents(ele, html, js);\n\n return;\n })\n .always(function() {\n M.util.js_complete('admin_usertour_addResetLink');\n\n return;\n })\n .fail();\n },\n\n /**\n * Start the specified tour.\n *\n * @method startBootstrapTour\n * @param {Number} tourId The ID of the tour to start.\n * @param {String} template The template to use.\n * @param {Object} tourConfig The tour configuration.\n * @return {Object}\n */\n startBootstrapTour: function(tourId, template, tourConfig) {\n if (usertours.currentTour) {\n // End the current tour, but disable end tour handler.\n tourConfig.onEnd = null;\n usertours.currentTour.endTour();\n delete usertours.currentTour;\n }\n\n // Normalize for the new library.\n tourConfig.eventHandlers = {\n afterEnd: [usertours.markTourComplete],\n afterRender: [usertours.markStepShown],\n };\n\n // Sort out the tour name.\n tourConfig.tourName = tourConfig.name;\n delete tourConfig.name;\n\n // Add the template to the configuration.\n // This enables translations of the buttons.\n tourConfig.template = template;\n\n tourConfig.steps = tourConfig.steps.map(function(step) {\n if (typeof step.element !== 'undefined') {\n step.target = step.element;\n delete step.element;\n }\n\n if (typeof step.reflex !== 'undefined') {\n step.moveOnClick = !!step.reflex;\n delete step.reflex;\n }\n\n if (typeof step.content !== 'undefined') {\n step.body = step.content;\n delete step.content;\n }\n\n return step;\n });\n\n usertours.currentTour = new BootstrapTour(tourConfig);\n return usertours.currentTour.startTour();\n },\n\n /**\n * Mark the specified step as being shownd by the user.\n *\n * @method markStepShown\n */\n markStepShown: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_step_shown',\n args: {\n tourid: usertours.tourId,\n context: usertours.context,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Mark the specified tour as being completed by the user.\n *\n * @method markTourComplete\n */\n markTourComplete: function() {\n var stepConfig = this.getStepConfig(this.getCurrentStepNumber());\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_complete_tour',\n args: {\n tourid: usertours.tourId,\n context: usertours.context,\n pageurl: window.location.href,\n stepid: stepConfig.stepid,\n stepindex: this.getCurrentStepNumber(),\n }\n }\n ])[0]\n ).fail(log.error);\n },\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to start.\n */\n resetTourState: function(tourId) {\n $.when(\n ajax.call([\n {\n methodname: 'tool_usertours_reset_tour',\n args: {\n tourid: tourId,\n context: usertours.context,\n pageurl: window.location.href,\n }\n }\n ])[0]\n ).then(function(response) {\n if (response.startTour) {\n usertours.fetchTour(response.startTour);\n }\n return;\n }).fail(notification.exception);\n }\n };\n\n return /** @alias module:tool_usertours/usertours */ {\n /**\n * Initialise the user tour for the current page.\n *\n * @method init\n * @param {Number} tourId The ID of the tour to start.\n * @param {Bool} startTour Attempt to start the tour now.\n */\n init: usertours.init,\n\n /**\n * Reset the state, and restart the the tour on the current page.\n *\n * @method resetTourState\n * @param {Number} tourId The ID of the tour to restart.\n */\n resetTourState: usertours.resetTourState\n };\n});\n"],"file":"usertours.min.js"} \ No newline at end of file diff --git a/admin/tool/xmldb/amd/build/move.min.js b/admin/tool/xmldb/amd/build/move.min.js index 341413f7de6b6..3873d1b223444 100644 --- a/admin/tool/xmldb/amd/build/move.min.js +++ b/admin/tool/xmldb/amd/build/move.min.js @@ -1 +1,2 @@ -define(["jquery","core/sortable_list","core/ajax","core/notification"],function(a,b,c,d){return{init:function(e,f){var g=new b("#"+e+" tbody");g.getElementName=function(b){return a.Deferred().resolve(b.attr("data-name"))};var h;a("#"+e+" tbody tr").on(b.EVENTS.DRAGSTART,function(b,c){h=c.sourceList.children().index(c.element),setTimeout(function(){a(".sortable-list-is-dragged").width(c.element.width())},501)}).on(b.EVENTS.DROP,function(a,b){var e=b.targetList.children().index(b.element),g=b.element.find("[data-action="+f+"]");if(b.positionChanged&&g.length){var i={methodname:"tool_xmldb_invoke_move_action",args:{action:f,dir:g.attr("data-dir"),table:g.attr("data-table"),field:g.attr("data-field"),key:g.attr("data-key"),index:g.attr("data-index"),position:e-h}};c.call([i])[0].fail(d.exception)}})}}}); \ No newline at end of file +define ("tool_xmldb/move",["jquery","core/sortable_list","core/ajax","core/notification"],function(a,b,c,d){return{init:function init(e,f){var g=new b("#"+e+" tbody");g.getElementName=function(b){return a.Deferred().resolve(b.attr("data-name"))};var h;a("#"+e+" tbody tr").on(b.EVENTS.DRAGSTART,function(b,c){h=c.sourceList.children().index(c.element);setTimeout(function(){a(".sortable-list-is-dragged").width(c.element.width())},501)}).on(b.EVENTS.DROP,function(a,b){var e=b.targetList.children().index(b.element),g=b.element.find("[data-action="+f+"]");if(b.positionChanged&&g.length){var i={methodname:"tool_xmldb_invoke_move_action",args:{action:f,dir:g.attr("data-dir"),table:g.attr("data-table"),field:g.attr("data-field"),key:g.attr("data-key"),index:g.attr("data-index"),position:e-h}};c.call([i])[0].fail(d.exception)}})}}}); +//# sourceMappingURL=move.min.js.map diff --git a/admin/tool/xmldb/amd/build/move.min.js.map b/admin/tool/xmldb/amd/build/move.min.js.map new file mode 100644 index 0000000000000..28f624fa5b940 --- /dev/null +++ b/admin/tool/xmldb/amd/build/move.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/move.js"],"names":["define","$","SortableList","Ajax","Notification","init","tableid","moveaction","sort","getElementName","element","Deferred","resolve","attr","origIndex","on","EVENTS","DRAGSTART","_","info","sourceList","children","index","setTimeout","width","DROP","newIndex","targetList","t","find","positionChanged","length","request","methodname","args","action","dir","table","field","key","position","call","fail","exception"],"mappings":"AAeAA,OAAM,mBAAC,CAAC,QAAD,CAAW,oBAAX,CAAiC,WAAjC,CAA8C,mBAA9C,CAAD,CAAqE,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAAgCC,CAAhC,CAA8C,CACrH,MAAO,CACHC,IAAI,CAAE,cAASC,CAAT,CAAkBC,CAAlB,CAA8B,CAEhC,GAAIC,CAAAA,CAAI,CAAG,GAAIN,CAAAA,CAAJ,CAAiB,IAAMI,CAAN,CAAgB,QAAjC,CAAX,CACAE,CAAI,CAACC,cAAL,CAAsB,SAASC,CAAT,CAAkB,CACpC,MAAOT,CAAAA,CAAC,CAACU,QAAF,GAAaC,OAAb,CAAqBF,CAAO,CAACG,IAAR,CAAa,WAAb,CAArB,CACV,CAFD,CAGA,GAAIC,CAAAA,CAAJ,CACAb,CAAC,CAAC,IAAMK,CAAN,CAAgB,WAAjB,CAAD,CAA+BS,EAA/B,CAAkCb,CAAY,CAACc,MAAb,CAAoBC,SAAtD,CAAiE,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CAE/EL,CAAS,CAAGK,CAAI,CAACC,UAAL,CAAgBC,QAAhB,GAA2BC,KAA3B,CAAiCH,CAAI,CAACT,OAAtC,CAAZ,CAEAa,UAAU,CAAC,UAAW,CAClBtB,CAAC,CAAC,2BAAD,CAAD,CAA+BuB,KAA/B,CAAqCL,CAAI,CAACT,OAAL,CAAac,KAAb,EAArC,CACH,CAFS,CAEP,GAFO,CAGb,CAPD,EAOGT,EAPH,CAOMb,CAAY,CAACc,MAAb,CAAoBS,IAP1B,CAOgC,SAASP,CAAT,CAAYC,CAAZ,CAAkB,IAE1CO,CAAAA,CAAQ,CAAGP,CAAI,CAACQ,UAAL,CAAgBN,QAAhB,GAA2BC,KAA3B,CAAiCH,CAAI,CAACT,OAAtC,CAF+B,CAG1CkB,CAAC,CAAGT,CAAI,CAACT,OAAL,CAAamB,IAAb,CAAkB,gBAAkBtB,CAAlB,CAA+B,GAAjD,CAHsC,CAI9C,GAAIY,CAAI,CAACW,eAAL,EAAwBF,CAAC,CAACG,MAA9B,CAAsC,CAClC,GAAIC,CAAAA,CAAO,CAAG,CACVC,UAAU,CAAE,+BADF,CAEVC,IAAI,CAAE,CACFC,MAAM,CAAE5B,CADN,CAEF6B,GAAG,CAAER,CAAC,CAACf,IAAF,CAAO,UAAP,CAFH,CAGFwB,KAAK,CAAET,CAAC,CAACf,IAAF,CAAO,YAAP,CAHL,CAIFyB,KAAK,CAAEV,CAAC,CAACf,IAAF,CAAO,YAAP,CAJL,CAKF0B,GAAG,CAAEX,CAAC,CAACf,IAAF,CAAO,UAAP,CALH,CAMFS,KAAK,CAAEM,CAAC,CAACf,IAAF,CAAO,YAAP,CANL,CAOF2B,QAAQ,CAAEd,CAAQ,CAAGZ,CAPnB,CAFI,CAAd,CAYAX,CAAI,CAACsC,IAAL,CAAU,CAACT,CAAD,CAAV,EAAqB,CAArB,EAAwBU,IAAxB,CAA6BtC,CAAY,CAACuC,SAA1C,CACH,CACJ,CA1BD,CA2BH,CAnCE,CAqCV,CAtCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\ndefine(['jquery', 'core/sortable_list', 'core/ajax', 'core/notification'], function($, SortableList, Ajax, Notification) {\n return {\n init: function(tableid, moveaction) {\n // Initialise sortable for the given list.\n var sort = new SortableList('#' + tableid + ' tbody');\n sort.getElementName = function(element) {\n return $.Deferred().resolve(element.attr('data-name'));\n };\n var origIndex;\n $('#' + tableid + ' tbody tr').on(SortableList.EVENTS.DRAGSTART, function(_, info) {\n // Remember position of the element in the beginning of dragging.\n origIndex = info.sourceList.children().index(info.element);\n // Resize the \"proxy\" element to be the same width as the main element.\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }).on(SortableList.EVENTS.DROP, function(_, info) {\n // When a list element was moved send AJAX request to the server.\n var newIndex = info.targetList.children().index(info.element);\n var t = info.element.find('[data-action=' + moveaction + ']');\n if (info.positionChanged && t.length) {\n var request = {\n methodname: 'tool_xmldb_invoke_move_action',\n args: {\n action: moveaction,\n dir: t.attr('data-dir'),\n table: t.attr('data-table'),\n field: t.attr('data-field'),\n key: t.attr('data-key'),\n index: t.attr('data-index'),\n position: newIndex - origIndex\n }\n };\n Ajax.call([request])[0].fail(Notification.exception);\n }\n });\n }\n };\n});\n"],"file":"move.min.js"} \ No newline at end of file diff --git a/backup/util/ui/amd/build/async_backup.min.js b/backup/util/ui/amd/build/async_backup.min.js index 41384ff51353a..fa9bd92b3d39f 100644 --- a/backup/util/ui/amd/build/async_backup.min.js +++ b/backup/util/ui/amd/build/async_backup.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/str","core/notification","core/templates"],function(a,b,c,d,e){function f(b,c){var d=Math.round(c)+"%",e=a("#"+b+"_bar"),f=c.toFixed(2)+"%";e.attr("aria-valuenow",d),e.css("width",d),e.text(f)}function g(c){var f=a("#"+c+"_bar").parent().parent(),g=f.parent(),h=f.siblings(),i=h[1],j=a(i).text(),k=h[0],l=a(k).text();b.call([{methodname:"core_backup_get_async_backup_links_backup",args:{filename:l,contextid:n}}])[0].done(function(a){var b={filename:l,time:j,size:a.filesize,fileurl:a.fileurl,restoreurl:a.restoreurl};e.render("core/async_backup_progress_row",b).then(function(a,b){e.replaceNodeContents(g,a,b)}).fail(function(){d.exception(new Error("Failed to load table row"))})})}function h(c){var f=a("#"+c+"_bar").parent().parent(),g=f.parent(),h=f.siblings(),i=h[0],j=h[1],k=a(j).text();b.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:c,contextid:n}}])[0].done(function(b){var c=a(i).text(),f={resourcename:c,restoreurl:b.restoreurl,time:k};e.render("core/async_restore_progress_row",f).then(function(a,b){e.replaceNodeContents(g,a,b)}).fail(function(){d.exception(new Error("Failed to load table row"))})})}function i(e){var g,h=100*e.progress,i=a("#"+m+"_bar"),j=a("#"+m+"_status"),k=a("#"+m+"_detail"),l=a("#"+m+"_button");if(e.status==s){i.addClass("bg-success"),f(m,h);var r="async"+p+"processing";c.get_string(r,"backup").then(function(a){return j.text(a),a})["catch"](function(){d.exception(new Error("Failed to load string: backup "+r))})}else if(e.status==t){i.addClass("bg-danger"),i.removeClass("bg-success"),f(m,100);var v="async"+p+"error",w="async"+p+"errordetail";g=[{key:v,component:"backup"},{key:w,component:"backup"}],c.get_strings(g).then(function(a){return j.text(a[0]),k.text(a[1]),a})["catch"](function(){d.exception(new Error("Failed to load string"))}),a(".backup_progress").children("span").removeClass("backup_stage_current"),a(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(q)}else if(e.status==u){i.addClass("bg-success"),f(m,100);var x="async"+p+"complete";if(c.get_string(x,"backup").then(function(a){return j.text(a),a})["catch"](function(){d.exception(new Error("Failed to load string: backup "+x))}),"restore"==p)b.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:m,contextid:n}}])[0].done(function(a){var b="async"+p+"completedetail",e="async"+p+"completebutton",f=[{key:b,component:"backup",param:a.restoreurl},{key:e,component:"backup"}];c.get_strings(f).then(function(b){return k.html(b[0]),l.text(b[1]),l.attr("href",a.restoreurl),b})["catch"](function(){d.exception(new Error("Failed to load string"))})});else{var y="async"+p+"completedetail",z="async"+p+"completebutton";g=[{key:y,component:"backup",param:o},{key:z,component:"backup"}],c.get_strings(g).then(function(a){return k.html(a[0]),l.text(a[1]),l.attr("href",o),a})["catch"](function(){d.exception(new Error("Failed to load string"))})}a(".backup_progress").children("span").removeClass("backup_stage_current"),a(".backup_progress").children("span").last().addClass("backup_stage_current"),clearInterval(q)}}function j(b){b.forEach(function(b){var c=100*b.progress,d=b.backupid,e=a("#"+d+"_bar"),i=b.operation;b.status==s?(e.addClass("bg-success"),f(d,c)):b.status==t?(e.addClass("bg-danger"),e.addClass("complete"),a("#"+d+"_bar").removeClass("bg-success"),f(d,100)):b.status==u&&(e.addClass("bg-success"),e.addClass("complete"),f(d,100),"backup"==i?g(d):h(d))})}function k(){b.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:[m],contextid:n}}])[0].done(function(a){i(a[0])})}function l(){var c=[],d=a(".progress").find(".progress-bar").not(".complete");d.each(function(){c.push(this.id.substring(0,32))}),c.length>0?b.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:c,contextid:n}}])[0].done(function(a){j(a)}):clearInterval(r)}var m,n,o,p,q,r,s=800,t=900,u=1e3,v={},w=5e3;return v.asyncBackupAllStatus=function(a){n=a,r=setInterval(l,w)},v.asyncBackupStatus=function(b,c,d,e){m=b,n=c,o=d,p="backup"==e?"backup":"restore",a(".backup_progress").children("a").removeAttr("href"),q=setInterval(k,w)},v}); \ No newline at end of file +define ("core_backup/async_backup",["jquery","core/ajax","core/str","core/notification","core/templates"],function(a,b,c,d,e){var m=900,n=1e3,o={},p=5e3,q,r,s,t,u,v;function f(b,c){var d=Math.round(c)+"%",e=a("#"+b+"_bar"),f=c.toFixed(2)+"%";e.attr("aria-valuenow",d);e.css("width",d);e.text(f)}function g(c){var f=a("#"+c+"_bar").parent().parent(),g=f.parent(),h=f.siblings(),i=h[1],j=a(i).text(),k=h[0],l=a(k).text();b.call([{methodname:"core_backup_get_async_backup_links_backup",args:{filename:l,contextid:r}}])[0].done(function(a){var b={filename:l,time:j,size:a.filesize,fileurl:a.fileurl,restoreurl:a.restoreurl};e.render("core/async_backup_progress_row",b).then(function(a,b){e.replaceNodeContents(g,a,b)}).fail(function(){d.exception(new Error("Failed to load table row"))})})}function h(c){var f=a("#"+c+"_bar").parent().parent(),g=f.parent(),h=f.siblings(),i=h[0],j=h[1],k=a(j).text();b.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:c,contextid:r}}])[0].done(function(b){var c=a(i).text(),f={resourcename:c,restoreurl:b.restoreurl,time:k};e.render("core/async_restore_progress_row",f).then(function(a,b){e.replaceNodeContents(g,a,b)}).fail(function(){d.exception(new Error("Failed to load table row"))})})}function i(e){var g=100*e.progress,h=a("#"+q+"_bar"),i=a("#"+q+"_status"),j=a("#"+q+"_detail"),k=a("#"+q+"_button"),l;if(e.status==800){h.addClass("bg-success");f(q,g);var o="async"+t+"processing";c.get_string(o,"backup").then(function(a){i.text(a);return a}).catch(function(){d.exception(new Error("Failed to load string: backup "+o))})}else if(e.status==m){h.addClass("bg-danger");h.removeClass("bg-success");f(q,100);var p="async"+t+"error",v="async"+t+"errordetail";l=[{key:p,component:"backup"},{key:v,component:"backup"}];c.get_strings(l).then(function(a){i.text(a[0]);j.text(a[1]);return a}).catch(function(){d.exception(new Error("Failed to load string"))});a(".backup_progress").children("span").removeClass("backup_stage_current");a(".backup_progress").children("span").last().addClass("backup_stage_current");clearInterval(u)}else if(e.status==n){h.addClass("bg-success");f(q,100);var w="async"+t+"complete";c.get_string(w,"backup").then(function(a){i.text(a);return a}).catch(function(){d.exception(new Error("Failed to load string: backup "+w))});if("restore"==t){b.call([{methodname:"core_backup_get_async_backup_links_restore",args:{backupid:q,contextid:r}}])[0].done(function(a){var b="async"+t+"completedetail",e="async"+t+"completebutton",f=[{key:b,component:"backup",param:a.restoreurl},{key:e,component:"backup"}];c.get_strings(f).then(function(b){j.html(b[0]);k.text(b[1]);k.attr("href",a.restoreurl);return b}).catch(function(){d.exception(new Error("Failed to load string"))})})}else{var x="async"+t+"completedetail",y="async"+t+"completebutton";l=[{key:x,component:"backup",param:s},{key:y,component:"backup"}];c.get_strings(l).then(function(a){j.html(a[0]);k.text(a[1]);k.attr("href",s);return a}).catch(function(){d.exception(new Error("Failed to load string"))})}a(".backup_progress").children("span").removeClass("backup_stage_current");a(".backup_progress").children("span").last().addClass("backup_stage_current");clearInterval(u)}}function j(b){b.forEach(function(b){var c=100*b.progress,d=b.backupid,e=a("#"+d+"_bar"),i=b.operation;if(b.status==800){e.addClass("bg-success");f(d,c)}else if(b.status==m){e.addClass("bg-danger");e.addClass("complete");a("#"+d+"_bar").removeClass("bg-success");f(d,100)}else if(b.status==n){e.addClass("bg-success");e.addClass("complete");f(d,100);if("backup"==i){g(d)}else{h(d)}}})}function k(){b.call([{methodname:"core_backup_get_async_backup_progress",args:{backupids:[q],contextid:r}}])[0].done(function(a){i(a[0])})}function l(){var c=[],d=a(".progress").find(".progress-bar").not(".complete");d.each(function(){c.push(this.id.substring(0,32))});if(0.\n\n/**\n * This module updates the UI during an asynchronous\n * backup or restore process.\n *\n * @module backup/util/async_backup\n * @package core\n * @copyright 2018 Matt Porritt \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.7\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification', 'core/templates'],\n function($, ajax, Str, notification, Templates) {\n\n /**\n * Module level constants.\n *\n * Using var instead of const as ES6 isn't fully supported yet.\n */\n var STATUS_EXECUTING = 800;\n var STATUS_FINISHED_ERR = 900;\n var STATUS_FINISHED_OK = 1000;\n\n /**\n * Module level variables.\n */\n var Asyncbackup = {};\n var checkdelay = 5000; // How often we check for progress updates.\n var backupid; // The backup id to get the progress for.\n var contextid; // The course this backup progress is for.\n var restoreurl; // The URL to view course restores.\n var typeid; // The type of operation backup or restore.\n var backupintervalid; // The id of the setInterval function.\n var allbackupintervalid; // The id of the setInterval function.\n\n /**\n * Helper function to update UI components.\n *\n * @param {string} backupid The id to match elements on.\n * @param {number} percentage The completion percentage to apply.\n */\n function updateElement(backupid, percentage) {\n var percentagewidth = Math.round(percentage) + '%';\n var elementbar = $('#' + backupid + '_bar');\n var percentagetext = percentage.toFixed(2) + '%';\n\n // Set progress bar percentage indicators\n elementbar.attr('aria-valuenow', percentagewidth);\n elementbar.css('width', percentagewidth);\n elementbar.text(percentagetext);\n }\n\n /**\n * Update backup table row when an async backup completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateBackupTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n var filenamecell = cellsiblings[0];\n var filename = $(filenamecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_backup',\n args: {\n 'filename': filename,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var context = {\n filename: filename,\n time: timevalue,\n size: response.filesize,\n fileurl: response.fileurl,\n restoreurl: response.restoreurl\n };\n\n Templates.render('core/async_backup_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update restore table row when an async restore completes.\n *\n * @param {string} backupid The id to match elements on.\n */\n function updateRestoreTableRow(backupid) {\n var statuscell = $('#' + backupid + '_bar').parent().parent();\n var tablerow = statuscell.parent();\n var cellsiblings = statuscell.siblings();\n var coursecell = cellsiblings[0];\n var timecell = cellsiblings[1];\n var timevalue = $(timecell).text();\n\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the data now update the UI.\n var resourcename = $(coursecell).text();\n var context = {\n resourcename: resourcename,\n restoreurl: response.restoreurl,\n time: timevalue\n };\n\n Templates.render('core/async_restore_progress_row', context).then(function(html, js) {\n Templates.replaceNodeContents(tablerow, html, js);\n return;\n }).fail(function() {\n notification.exception(new Error('Failed to load table row'));\n return;\n });\n });\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * the backup process.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgress(progress) {\n var percentage = progress.progress * 100;\n var elementbar = $('#' + backupid + '_bar');\n var elementstatus = $('#' + backupid + '_status');\n var elementdetail = $('#' + backupid + '_detail');\n var elementbutton = $('#' + backupid + '_button');\n var stringRequests;\n\n if (progress.status == STATUS_EXECUTING) {\n // Process is in progress.\n // Add in progress class color to bar\n elementbar.addClass('bg-success');\n\n updateElement(backupid, percentage);\n\n // Change heading\n var strProcessing = 'async' + typeid + 'processing';\n Str.get_string(strProcessing, 'backup').then(function(title) {\n elementstatus.text(title);\n return title;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strProcessing));\n });\n\n } else if (progress.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.addClass('bg-danger');\n\n // Remove in progress class color to bar\n elementbar.removeClass('bg-success');\n\n updateElement(backupid, 100);\n\n // Change heading and text\n var strStatus = 'async' + typeid + 'error';\n var strStatusDetail = 'async' + typeid + 'errordetail';\n stringRequests = [\n {key: strStatus, component: 'backup'},\n {key: strStatusDetail, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementstatus.text(strings[0]);\n elementdetail.text(strings[1]);\n\n return strings;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n\n } else if (progress.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in progress class color to bar\n elementbar.addClass('bg-success');\n\n updateElement(backupid, 100);\n\n // Change heading and text\n var strComplete = 'async' + typeid + 'complete';\n Str.get_string(strComplete, 'backup').then(function(title) {\n elementstatus.text(title);\n return title;\n }).catch(function() {\n notification.exception(new Error('Failed to load string: backup ' + strComplete));\n });\n\n if (typeid == 'restore') {\n ajax.call([{\n // Get the table data via webservice.\n methodname: 'core_backup_get_async_backup_links_restore',\n args: {\n 'backupid': backupid,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n var stringRequests = [\n {key: strDetail, component: 'backup', param: response.restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', response.restoreurl);\n\n return strings;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n });\n } else {\n var strDetail = 'async' + typeid + 'completedetail';\n var strButton = 'async' + typeid + 'completebutton';\n stringRequests = [\n {key: strDetail, component: 'backup', param: restoreurl},\n {key: strButton, component: 'backup'}\n ];\n Str.get_strings(stringRequests).then(function(strings) {\n elementdetail.html(strings[0]);\n elementbutton.text(strings[1]);\n elementbutton.attr('href', restoreurl);\n\n return strings;\n })\n .catch(function() {\n notification.exception(new Error('Failed to load string'));\n return;\n });\n\n }\n\n $('.backup_progress').children('span').removeClass('backup_stage_current');\n $('.backup_progress').children('span').last().addClass('backup_stage_current');\n\n // Stop checking when we either have an error or a completion.\n clearInterval(backupintervalid);\n }\n }\n\n /**\n * Update the Moodle user interface with the progress of\n * all the pending processes.\n *\n * @param {object} progress The progress and status of the process.\n */\n function updateProgressAll(progress) {\n progress.forEach(function(element) {\n var percentage = element.progress * 100;\n var backupid = element.backupid;\n var elementbar = $('#' + backupid + '_bar');\n var type = element.operation;\n\n if (element.status == STATUS_EXECUTING) {\n // Process is in element.\n\n // Add in element class color to bar\n elementbar.addClass('bg-success');\n\n updateElement(backupid, percentage);\n\n } else if (element.status == STATUS_FINISHED_ERR) {\n // Process completed with error.\n\n // Add in fail class color to bar\n elementbar.addClass('bg-danger');\n elementbar.addClass('complete');\n\n // Remove in element class color to bar\n $('#' + backupid + '_bar').removeClass('bg-success');\n\n updateElement(backupid, 100);\n\n } else if (element.status == STATUS_FINISHED_OK) {\n // Process completed successfully.\n\n // Add in element class color to bar\n elementbar.addClass('bg-success');\n elementbar.addClass('complete');\n\n updateElement(backupid, 100);\n\n // We have a successful backup. Update the UI with download and file details.\n if (type == 'backup') {\n updateBackupTableRow(backupid);\n } else {\n updateRestoreTableRow(backupid);\n }\n\n }\n\n });\n }\n\n /**\n * Get the progress of the backup process via ajax.\n */\n function getBackupProgress() {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': [backupid],\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n // We have the progress now update the UI.\n updateProgress(response[0]);\n });\n }\n\n /**\n * Get the progress of all backup processes via ajax.\n */\n function getAllBackupProgress() {\n var backupids = [];\n var progressbars = $('.progress').find('.progress-bar').not('.complete');\n\n progressbars.each(function() {\n backupids.push((this.id).substring(0, 32));\n });\n\n if (backupids.length > 0) {\n ajax.call([{\n // Get the backup progress via webservice.\n methodname: 'core_backup_get_async_backup_progress',\n args: {\n 'backupids': backupids,\n 'contextid': contextid\n },\n }])[0].done(function(response) {\n updateProgressAll(response);\n });\n } else {\n clearInterval(allbackupintervalid); // No more progress bars to update, stop checking.\n }\n }\n\n /**\n * Get status updates for all backups.\n *\n * @public\n * @param {number} context The context id.\n */\n Asyncbackup.asyncBackupAllStatus = function(context) {\n contextid = context;\n allbackupintervalid = setInterval(getAllBackupProgress, checkdelay);\n };\n\n /**\n * Get status updates for backup.\n *\n * @public\n * @param {string} backup The backup record id.\n * @param {number} context The context id.\n * @param {string} restore The restore link.\n * @param {string} type The operation type (backup or restore).\n */\n Asyncbackup.asyncBackupStatus = function(backup, context, restore, type) {\n backupid = backup;\n contextid = context;\n restoreurl = restore;\n\n if (type == 'backup') {\n typeid = 'backup';\n } else {\n typeid = 'restore';\n }\n\n // Remove the links from the progress bar, no going back now.\n $('.backup_progress').children('a').removeAttr('href');\n\n // Periodically check for progress updates and update the UI as required.\n backupintervalid = setInterval(getBackupProgress, checkdelay);\n\n };\n\n return Asyncbackup;\n});\n"],"file":"async_backup.min.js"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/main.min.js b/blocks/myoverview/amd/build/main.min.js index 5ca1a228279c0..c8b1ba8f634bd 100644 --- a/blocks/myoverview/amd/build/main.min.js +++ b/blocks/myoverview/amd/build/main.min.js @@ -1 +1,2 @@ -define(["jquery","block_myoverview/view","block_myoverview/view_nav"],function(a,b,c){var d=function(d){d=a(d),c.init(d),b.init(d)};return{init:d}}); \ No newline at end of file +define ("block_myoverview/main",["jquery","block_myoverview/view","block_myoverview/view_nav"],function(a,b,c){return{init:function init(d){d=a(d);c.init(d);b.init(d)}}}); +//# sourceMappingURL=main.min.js.map diff --git a/blocks/myoverview/amd/build/main.min.js.map b/blocks/myoverview/amd/build/main.min.js.map new file mode 100644 index 0000000000000..215d532d074bb --- /dev/null +++ b/blocks/myoverview/amd/build/main.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/main.js"],"names":["define","$","View","ViewNav","init","root"],"mappings":"AAuBAA,OAAM,yBACN,CACI,QADJ,CAEI,uBAFJ,CAGI,2BAHJ,CADM,CAMN,SACIC,CADJ,CAEIC,CAFJ,CAGIC,CAHJ,CAIE,CAcE,MAAO,CACHC,IAAI,CATG,QAAPA,CAAAA,IAAO,CAASC,CAAT,CAAe,CACtBA,CAAI,CAAGJ,CAAC,CAACI,CAAD,CAAR,CAEAF,CAAO,CAACC,IAAR,CAAaC,CAAb,EAEAH,CAAI,CAACE,IAAL,CAAUC,CAAV,CACH,CAEM,CAGV,CA3BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to initialise the myoverview block.\n *\n * @package block_myoverview\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/view',\n 'block_myoverview/view_nav'\n],\nfunction(\n $,\n View,\n ViewNav\n) {\n /**\n * Initialise all of the modules for the overview block.\n *\n * @param {object} root The root element for the overview block.\n */\n var init = function(root) {\n root = $(root);\n // Initialise the course navigation elements.\n ViewNav.init(root);\n // Initialise the courses view modules.\n View.init(root);\n };\n\n return {\n init: init\n };\n});\n"],"file":"main.min.js"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/repository.min.js b/blocks/myoverview/amd/build/repository.min.js index 92f1945f9d998..896dbb910eb87 100644 --- a/blocks/myoverview/amd/build/repository.min.js +++ b/blocks/myoverview/amd/build/repository.min.js @@ -1 +1,2 @@ -define(["core/ajax","core/notification"],function(a,b){var c=function(b){var c={methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:b},d=a.call([c])[0];return d},d=function(b){var c={methodname:"core_course_set_favourite_courses",args:b},d=a.call([c])[0];return d},e=function(c){var d={methodname:"core_user_update_user_preferences",args:c};a.call([d])[0].fail(b.exception)};return{getEnrolledCoursesByTimeline:c,setFavouriteCourses:d,updateUserPreferences:e}}); \ No newline at end of file +define ("block_myoverview/repository",["core/ajax","core/notification"],function(a,b){return{getEnrolledCoursesByTimeline:function getEnrolledCoursesByTimeline(b){var c=a.call([{methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:b}])[0];return c},setFavouriteCourses:function setFavouriteCourses(b){var c=a.call([{methodname:"core_course_set_favourite_courses",args:b}])[0];return c},updateUserPreferences:function updateUserPreferences(c){a.call([{methodname:"core_user_update_user_preferences",args:c}])[0].fail(b.exception)}}}); +//# sourceMappingURL=repository.min.js.map diff --git a/blocks/myoverview/amd/build/repository.min.js.map b/blocks/myoverview/amd/build/repository.min.js.map new file mode 100644 index 0000000000000..1ceb1883e79db --- /dev/null +++ b/blocks/myoverview/amd/build/repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/repository.js"],"names":["define","Ajax","Notification","getEnrolledCoursesByTimeline","args","promise","call","methodname","setFavouriteCourses","updateUserPreferences","fail","exception"],"mappings":"AAsBAA,OAAM,+BAAC,CAAC,WAAD,CAAc,mBAAd,CAAD,CAAqC,SAASC,CAAT,CAAeC,CAAf,CAA6B,CAyEpE,MAAO,CACHC,4BAA4B,CA3DG,QAA/BA,CAAAA,4BAA+B,CAASC,CAAT,CAAe,IAO1CC,CAAAA,CAAO,CAAGJ,CAAI,CAACK,IAAL,CAAU,CALV,CACVC,UAAU,CAAE,6DADF,CAEVH,IAAI,CAAEA,CAFI,CAKU,CAAV,EAAqB,CAArB,CAPgC,CAS9C,MAAOC,CAAAA,CACV,CAgDM,CAEHG,mBAAmB,CAvCG,QAAtBA,CAAAA,mBAAsB,CAASJ,CAAT,CAAe,IAOjCC,CAAAA,CAAO,CAAGJ,CAAI,CAACK,IAAL,CAAU,CALV,CACVC,UAAU,CAAE,mCADF,CAEVH,IAAI,CAAEA,CAFI,CAKU,CAAV,EAAqB,CAArB,CAPuB,CASrC,MAAOC,CAAAA,CACV,CA2BM,CAGHI,qBAAqB,CAbG,QAAxBA,CAAAA,qBAAwB,CAASL,CAAT,CAAe,CAMvCH,CAAI,CAACK,IAAL,CAAU,CALI,CACVC,UAAU,CAAE,mCADF,CAEVH,IAAI,CAAEA,CAFI,CAKJ,CAAV,EAAqB,CAArB,EACKM,IADL,CACUR,CAAY,CAACS,SADvB,CAEH,CAEM,CAKV,CA9EK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to retrieve enrolled coruses from the server.\n *\n * @package block_myoverview\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax', 'core/notification'], function(Ajax, Notification) {\n\n /**\n * Retrieve a list of enrolled courses.\n *\n * Valid args are:\n * string classification future, inprogress, past\n * int limit number of records to retreive\n * int Offset offset for pagination\n * int sort sort by lastaccess or name\n *\n * @method getEnrolledCoursesByTimeline\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getEnrolledCoursesByTimeline = function(args) {\n\n var request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Set the favourite state on a list of courses.\n *\n * Valid args are:\n * Array courses list of course id numbers.\n *\n * @param {Object} args Arguments send to the webservice.\n * @return {Promise} Resolve with warnings.\n */\n var setFavouriteCourses = function(args) {\n\n var request = {\n methodname: 'core_course_set_favourite_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n return promise;\n };\n\n /**\n * Update the user preferences.\n *\n * @param {Object} args Arguments send to the webservice.\n *\n * Sample args:\n * {\n * preferences: [\n * {\n * type: 'block_example_user_sort_preference'\n * value: 'title'\n * }\n * ]\n * }\n */\n var updateUserPreferences = function(args) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: args\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n return {\n getEnrolledCoursesByTimeline: getEnrolledCoursesByTimeline,\n setFavouriteCourses: setFavouriteCourses,\n updateUserPreferences: updateUserPreferences\n };\n});\n"],"file":"repository.min.js"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/selectors.min.js b/blocks/myoverview/amd/build/selectors.min.js index a07864c092d35..ef937b71f9dc7 100644 --- a/blocks/myoverview/amd/build/selectors.min.js +++ b/blocks/myoverview/amd/build/selectors.min.js @@ -1 +1,2 @@ -define([],function(){return{courseView:{region:'[data-region="courses-view"]',regionContent:'[data-region="course-view-content"]'}}}); \ No newline at end of file +define ("block_myoverview/selectors",[],function(){return{courseView:{region:"[data-region=\"courses-view\"]",regionContent:"[data-region=\"course-view-content\"]"}}}); +//# sourceMappingURL=selectors.min.js.map diff --git a/blocks/myoverview/amd/build/selectors.min.js.map b/blocks/myoverview/amd/build/selectors.min.js.map new file mode 100644 index 0000000000000..d02ccf8698de4 --- /dev/null +++ b/blocks/myoverview/amd/build/selectors.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/selectors.js"],"names":["define","courseView","region","regionContent"],"mappings":"AAuBAA,OAAM,8BAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,UAAU,CAAE,CACRC,MAAM,CAAE,gCADA,CAERC,aAAa,CAAE,uCAFP,CADT,CAMV,CAPK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to initialise the selectors for the myoverview block.\n *\n * @package block_myoverview\n * @copyright 2018 Peter Dias \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine([], function() {\n return {\n courseView: {\n region: '[data-region=\"courses-view\"]',\n regionContent: '[data-region=\"course-view-content\"]'\n }\n };\n});\n"],"file":"selectors.min.js"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/view.min.js b/blocks/myoverview/amd/build/view.min.js index e113a14a3557c..57e14e5e734a8 100644 --- a/blocks/myoverview/amd/build/view.min.js +++ b/blocks/myoverview/amd/build/view.min.js @@ -1 +1,2 @@ -define(["jquery","block_myoverview/repository","core/paged_content_factory","core/pubsub","core/custom_interaction_events","core/notification","core/templates","core_course/events","block_myoverview/selectors","core/paged_content_events"],function(a,b,c,d,e,f,g,h,i,j){var k={COURSE_REGION:'[data-region="course-view-content"]',ACTION_HIDE_COURSE:'[data-action="hide-course"]',ACTION_SHOW_COURSE:'[data-action="show-course"]',ACTION_ADD_FAVOURITE:'[data-action="add-favourite"]',ACTION_REMOVE_FAVOURITE:'[data-action="remove-favourite"]',FAVOURITE_ICON:'[data-region="favourite-icon"]',ICON_IS_FAVOURITE:'[data-region="is-favourite"]',ICON_NOT_FAVOURITE:'[data-region="not-favourite"]',PAGED_CONTENT_CONTAINER:'[data-region="page-container"]'},l={COURSES_CARDS:"block_myoverview/view-cards",COURSES_LIST:"block_myoverview/view-list",COURSES_SUMMARY:"block_myoverview/view-summary",NOCOURSES:"core_course/no-courses"},m=[12,24,48],n=[],o=0,p=0,q=0,r=null,s=function(a){var b=a.find(i.courseView.region);return{display:b.attr("data-display"),grouping:b.attr("data-grouping"),sort:b.attr("data-sort"),displaycategories:b.attr("data-displaycategories")}},t={ignoreControlWhileLoading:!0,controlPlacementBottom:!0,persistentLimitKey:"block_myoverview_user_paging_preference"},u=function(a,c){return b.getEnrolledCoursesByTimeline({offset:o,limit:c,classification:a.grouping,sort:a.sort})},v=function(a,b){return a.find(k.FAVOURITE_ICON+'[data-course-id="'+b+'"]')},w=function(a,b){return a.find('[data-region="paged-content-page"][data-page="'+b+'"]')},x=function(a){return a.attr("data-course-id")},y=function(a,b){var c=v(a,b),d=c.find(k.ICON_IS_FAVOURITE);d.addClass("hidden"),d.attr("aria-hidden",!0);var e=c.find(k.ICON_NOT_FAVOURITE);e.removeClass("hidden"),e.attr("aria-hidden",!1)},z=function(a,b){var c=v(a,b),d=c.find(k.ICON_IS_FAVOURITE);d.removeClass("hidden"),d.attr("aria-hidden",!1);var e=c.find(k.ICON_NOT_FAVOURITE);e.addClass("hidden"),e.attr("aria-hidden",!0)},A=function(a,b){return a.find('[data-action="add-favourite"][data-course-id="'+b+'"]')},B=function(a,b){return a.find('[data-action="remove-favourite"][data-course-id="'+b+'"]')},C=function(a,b){var c=B(a,b),e=A(a,b);F(b,!0).then(function(g){g?(d.publish(h.favourited,b),c.removeClass("hidden"),e.addClass("hidden"),z(a,b)):f.alert("Starring course failed","Could not change favourite state")})["catch"](f.exception)},D=function(a,b){var c=B(a,b),e=A(a,b);F(b,!1).then(function(g){g?(d.publish(h.unfavorited,b),c.addClass("hidden"),e.removeClass("hidden"),y(a,b)):f.alert("Starring course failed","Could not change favourite state")})["catch"](f.exception)},E=function(b,d){var e=x(d),h=b.find('[data-region="paging-bar"]'),i=parseInt(h.attr("data-active-page-number")),j=n[i],k=j.courses.reduce(function(a,b){return e!=b.id&&a.push(b),a},[]);if(void 0!=n[i+1]){var l=n[i+1].courses.slice(0,1);n.forEach(function(b,c){if(c>i){var d=[];void 0!=n[c+1]&&(d=n[c+1].courses.slice(0,1)),n[c].courses=a.merge(n[c].courses.slice(1),d)}}),k=a.merge(k,l)}if(p==i+1&&0==n[i+1].courses.length){var m=b.find('[data-region="paged-content-container"]');c.resetLastPageNumber(a(m).attr("id"),i)}n[i].courses=k,o--;var q=w(b,i);G(b,n[i]).then(function(a,b){return g.replaceNodeContents(q,a,b)})["catch"](f.exception),n.forEach(function(a,c){if(c>i){var d=w(b,c);d.remove()}})},F=function(a,c){return b.setFavouriteCourses({courses:[{id:a,favourite:c}]}).then(function(b){return 0==b.warnings.length&&(n.forEach(function(b){b.courses.forEach(function(d,e){d.id==a&&(b.courses[e].isfavourite=c)})}),!0)})["catch"](f.exception)},G=function(a,b){var c=s(a),d="";if(d="card"==c.display?l.COURSES_CARDS:"list"==c.display?l.COURSES_LIST:l.COURSES_SUMMARY,"on"!=c.displaycategories&&(b.courses=b.courses.map(function(a){return delete a.coursecategory,a})),b.courses.length)return g.render(d,{courses:b.courses});var e=a.find(i.courseView.region).attr("data-nocoursesimg");return g.render(l.NOCOURSES,{nocoursesimg:e})},H=function(a){this.find(i.courseView.region).attr("data-paging",a)},I=function(a,b){var c=b+j.SET_ITEMS_PER_PAGE_LIMIT;d.subscribe(c,H.bind(a))},J=function(b){r="block_myoverview_"+b.attr("id")+"_"+Math.random();var d=m,e=parseInt(b.find(i.courseView.region).attr("data-paging"),10);e&&(d=m.map(function(a){var b=!1;return a==e&&(b=!0),{value:a,active:b}}));var h=s(b),j=a.extend({},t);j.eventNamespace=r;var k=c.createWithLimit(d,function(c,d){var e=[];return c.forEach(function(c){var g=c.pageNumber,i=c.limit;if(q!=i&&(n=[],o=0,p=0),p==g)return d.allItemsLoaded(p),void e.push(G(b,n[g]));q=i,void 0==n[g+1]&&void 0==n[g]&&(i*=2);var j=u(h,i).then(function(e){var f=e.courses,h=0,i=[];if(void 0!=n[g]){i=n[g].courses;var j=i.length;j0?n.forEach(function(b,c){var d=w(a,c);G(a,b).then(function(a,b){return g.replaceNodeContents(d,a,b)})["catch"](f.exception)}):L(a)};return{init:L,reset:M}}); \ No newline at end of file +define ("block_myoverview/view",["jquery","block_myoverview/repository","core/paged_content_factory","core/pubsub","core/custom_interaction_events","core/notification","core/templates","core_course/events","block_myoverview/selectors","core/paged_content_events"],function(a,b,c,d,e,f,g,h,i,j){var k={COURSE_REGION:"[data-region=\"course-view-content\"]",ACTION_HIDE_COURSE:"[data-action=\"hide-course\"]",ACTION_SHOW_COURSE:"[data-action=\"show-course\"]",ACTION_ADD_FAVOURITE:"[data-action=\"add-favourite\"]",ACTION_REMOVE_FAVOURITE:"[data-action=\"remove-favourite\"]",FAVOURITE_ICON:"[data-region=\"favourite-icon\"]",ICON_IS_FAVOURITE:"[data-region=\"is-favourite\"]",ICON_NOT_FAVOURITE:"[data-region=\"not-favourite\"]",PAGED_CONTENT_CONTAINER:"[data-region=\"page-container\"]"},l={COURSES_CARDS:"block_myoverview/view-cards",COURSES_LIST:"block_myoverview/view-list",COURSES_SUMMARY:"block_myoverview/view-summary",NOCOURSES:"core_course/no-courses"},m=[12,24,48],n=[],o=0,p=0,q=0,r=null,s=function(a){var b=a.find(i.courseView.region);return{display:b.attr("data-display"),grouping:b.attr("data-grouping"),sort:b.attr("data-sort"),displaycategories:b.attr("data-displaycategories")}},t={ignoreControlWhileLoading:!0,controlPlacementBottom:!0,persistentLimitKey:"block_myoverview_user_paging_preference"},u=function(a,c){return b.getEnrolledCoursesByTimeline({offset:o,limit:c,classification:a.grouping,sort:a.sort})},v=function(a,b){return a.find(k.FAVOURITE_ICON+"[data-course-id=\""+b+"\"]")},w=function(a,b){return a.find("[data-region=\"paged-content-page\"][data-page=\""+b+"\"]")},x=function(a){return a.attr("data-course-id")},y=function(a,b){var c=v(a,b),d=c.find(k.ICON_IS_FAVOURITE);d.addClass("hidden");d.attr("aria-hidden",!0);var e=c.find(k.ICON_NOT_FAVOURITE);e.removeClass("hidden");e.attr("aria-hidden",!1)},z=function(a,b){var c=v(a,b),d=c.find(k.ICON_IS_FAVOURITE);d.removeClass("hidden");d.attr("aria-hidden",!1);var e=c.find(k.ICON_NOT_FAVOURITE);e.addClass("hidden");e.attr("aria-hidden",!0)},A=function(a,b){return a.find("[data-action=\"add-favourite\"][data-course-id=\""+b+"\"]")},B=function(a,b){return a.find("[data-action=\"remove-favourite\"][data-course-id=\""+b+"\"]")},C=function(a,b){var c=B(a,b),e=A(a,b);F(b,!0).then(function(g){if(g){d.publish(h.favourited,b);c.removeClass("hidden");e.addClass("hidden");z(a,b)}else{f.alert("Starring course failed","Could not change favourite state")}}).catch(f.exception)},D=function(a,b){var c=B(a,b),e=A(a,b);F(b,!1).then(function(g){if(g){d.publish(h.unfavorited,b);c.addClass("hidden");e.removeClass("hidden");y(a,b)}else{f.alert("Starring course failed","Could not change favourite state")}}).catch(f.exception)},E=function(b,d){var e=x(d),h=b.find("[data-region=\"paging-bar\"]"),i=parseInt(h.attr("data-active-page-number")),j=n[i],k=j.courses.reduce(function(a,b){if(e!=b.id){a.push(b)}return a},[]);if(n[i+1]!=void 0){var l=n[i+1].courses.slice(0,1);n.forEach(function(b,c){if(c>i){var d=[];if(n[c+1]!=void 0){d=n[c+1].courses.slice(0,1)}n[c].courses=a.merge(n[c].courses.slice(1),d)}});k=a.merge(k,l)}if(p==i+1&&0==n[i+1].courses.length){var m=b.find("[data-region=\"paged-content-container\"]");c.resetLastPageNumber(a(m).attr("id"),i)}n[i].courses=k;o--;var q=w(b,i);G(b,n[i]).then(function(a,b){return g.replaceNodeContents(q,a,b)}).catch(f.exception);n.forEach(function(a,c){if(c>i){var d=w(b,c);d.remove()}})},F=function(a,c){return b.setFavouriteCourses({courses:[{id:a,favourite:c}]}).then(function(b){if(0==b.warnings.length){n.forEach(function(b){b.courses.forEach(function(d,e){if(d.id==a){b.courses[e].isfavourite=c}})});return!0}else{return!1}}).catch(f.exception)},G=function(a,b){var c=s(a),d="";if("card"==c.display){d=l.COURSES_CARDS}else if("list"==c.display){d=l.COURSES_LIST}else{d=l.COURSES_SUMMARY}if("on"!=c.displaycategories){b.courses=b.courses.map(function(a){delete a.coursecategory;return a})}if(b.courses.length){return g.render(d,{courses:b.courses})}else{var e=a.find(i.courseView.region).attr("data-nocoursesimg");return g.render(l.NOCOURSES,{nocoursesimg:e})}},H=function(a){this.find(i.courseView.region).attr("data-paging",a)},I=function(a,b){var c=b+j.SET_ITEMS_PER_PAGE_LIMIT;d.subscribe(c,H.bind(a))},J=function(b){r="block_myoverview_"+b.attr("id")+"_"+Math.random();var d=m,e=parseInt(b.find(i.courseView.region).attr("data-paging"),10);if(e){d=m.map(function(a){var b=!1;if(a==e){b=!0}return{value:a,active:b}})}var h=s(b),j=a.extend({},t);j.eventNamespace=r;var k=c.createWithLimit(d,function(c,d){var e=[];c.forEach(function(c){var g=c.pageNumber,i=c.limit;if(q!=i){n=[];o=0;p=0}if(p==g){d.allItemsLoaded(p);e.push(G(b,n[g]));return}q=i;if(n[g+1]==void 0){if(n[g]==void 0){i*=2}}var j=u(h,i).then(function(e){var f=e.courses,h=0,i=[];if(n[g]!=void 0){i=n[g].courses;var j=i.length;if(j.\n\n/**\n * Manage the courses view for the overview block.\n *\n * @package block_myoverview\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_myoverview/repository',\n 'core/paged_content_factory',\n 'core/pubsub',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/templates',\n 'core_course/events',\n 'block_myoverview/selectors',\n 'core/paged_content_events',\n],\nfunction(\n $,\n Repository,\n PagedContentFactory,\n PubSub,\n CustomEvents,\n Notification,\n Templates,\n CourseEvents,\n Selectors,\n PagedContentEvents\n) {\n\n var SELECTORS = {\n COURSE_REGION: '[data-region=\"course-view-content\"]',\n ACTION_HIDE_COURSE: '[data-action=\"hide-course\"]',\n ACTION_SHOW_COURSE: '[data-action=\"show-course\"]',\n ACTION_ADD_FAVOURITE: '[data-action=\"add-favourite\"]',\n ACTION_REMOVE_FAVOURITE: '[data-action=\"remove-favourite\"]',\n FAVOURITE_ICON: '[data-region=\"favourite-icon\"]',\n ICON_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n ICON_NOT_FAVOURITE: '[data-region=\"not-favourite\"]',\n PAGED_CONTENT_CONTAINER: '[data-region=\"page-container\"]'\n\n };\n\n var TEMPLATES = {\n COURSES_CARDS: 'block_myoverview/view-cards',\n COURSES_LIST: 'block_myoverview/view-list',\n COURSES_SUMMARY: 'block_myoverview/view-summary',\n NOCOURSES: 'core_course/no-courses'\n };\n\n var NUMCOURSES_PERPAGE = [12, 24, 48];\n\n var loadedPages = [];\n\n var courseOffset = 0;\n\n var lastPage = 0;\n\n var lastLimit = 0;\n\n var namespace = null;\n\n /**\n * Get filter values from DOM.\n *\n * @param {object} root The root element for the courses view.\n * @return {filters} Set filters.\n */\n var getFilterValues = function(root) {\n var courseRegion = root.find(Selectors.courseView.region);\n return {\n display: courseRegion.attr('data-display'),\n grouping: courseRegion.attr('data-grouping'),\n sort: courseRegion.attr('data-sort'),\n displaycategories: courseRegion.attr('data-displaycategories'),\n };\n };\n\n // We want the paged content controls below the paged content area.\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n persistentLimitKey: 'block_myoverview_user_paging_preference'\n };\n\n /**\n * Get enrolled courses from backend.\n *\n * @param {object} filters The filters for this view.\n * @param {int} limit The number of courses to show.\n * @return {promise} Resolved with an array of courses.\n */\n var getMyCourses = function(filters, limit) {\n\n return Repository.getEnrolledCoursesByTimeline({\n offset: courseOffset,\n limit: limit,\n classification: filters.grouping,\n sort: filters.sort\n });\n };\n\n /**\n * Get the container element for the favourite icon.\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n * @return {Object} The favourite icon container\n */\n var getFavouriteIconContainer = function(root, courseId) {\n return root.find(SELECTORS.FAVOURITE_ICON + '[data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the paged content container element.\n *\n * @param {Object} root The course overview container\n * @param {Number} index Rendered page index.\n * @return {Object} The rendered paged container.\n */\n var getPagedContentContainer = function(root, index) {\n return root.find('[data-region=\"paged-content-page\"][data-page=\"' + index + '\"]');\n };\n\n /**\n * Get the course id from a favourite element.\n *\n * @param {Object} root The favourite icon container element.\n * @return {Number} Course id.\n */\n var getCourseId = function(root) {\n return root.attr('data-course-id');\n };\n\n /**\n * Hide the favourite icon.\n *\n * @param {Object} root The favourite icon container element.\n * @param {Number} courseId Course id number.\n */\n var hideFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.addClass('hidden');\n isFavouriteIcon.attr('aria-hidden', true);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.removeClass('hidden');\n notFavourteIcon.attr('aria-hidden', false);\n };\n\n /**\n * Show the favourite icon.\n *\n * @param {Object} root The course overview container.\n * @param {Number} courseId Course id number.\n */\n var showFavouriteIcon = function(root, courseId) {\n var iconContainer = getFavouriteIconContainer(root, courseId);\n var isFavouriteIcon = iconContainer.find(SELECTORS.ICON_IS_FAVOURITE);\n isFavouriteIcon.removeClass('hidden');\n isFavouriteIcon.attr('aria-hidden', false);\n var notFavourteIcon = iconContainer.find(SELECTORS.ICON_NOT_FAVOURITE);\n notFavourteIcon.addClass('hidden');\n notFavourteIcon.attr('aria-hidden', true);\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The add to favourite menu item.\n */\n var getAddFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"add-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Get the action menu item\n *\n * @param {Object} root root The course overview container\n * @param {Number} courseId Course id.\n * @return {Object} The remove from favourites menu item.\n */\n var getRemoveFavouriteMenuItem = function(root, courseId) {\n return root.find('[data-action=\"remove-favourite\"][data-course-id=\"' + courseId + '\"]');\n };\n\n /**\n * Add course to favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var addToFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, true).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.favourited, courseId);\n removeAction.removeClass('hidden');\n addAction.addClass('hidden');\n showFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Remove course from favourites\n *\n * @param {Object} root The course overview container\n * @param {Number} courseId Course id number\n */\n var removeFromFavourites = function(root, courseId) {\n var removeAction = getRemoveFavouriteMenuItem(root, courseId);\n var addAction = getAddFavouriteMenuItem(root, courseId);\n\n setCourseFavouriteState(courseId, false).then(function(success) {\n if (success) {\n PubSub.publish(CourseEvents.unfavorited, courseId);\n removeAction.addClass('hidden');\n addAction.removeClass('hidden');\n hideFavouriteIcon(root, courseId);\n } else {\n Notification.alert('Starring course failed', 'Could not change favourite state');\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Reset the loadedPages dataset to take into account the hidden element\n *\n * @param {Object} root The course overview container\n * @param {Object} target The course that you want to hide\n */\n var hideElement = function(root, target) {\n var id = getCourseId(target);\n\n var pagingBar = root.find('[data-region=\"paging-bar\"]');\n var jumpto = parseInt(pagingBar.attr('data-active-page-number'));\n\n // Get a reduced dataset for the current page.\n var courseList = loadedPages[jumpto];\n var reducedCourse = courseList.courses.reduce(function(accumulator, current) {\n if (id != current.id) {\n accumulator.push(current);\n }\n return accumulator;\n }, []);\n\n // Get the next page's data if loaded and pop the first element from it\n if (loadedPages[jumpto + 1] != undefined) {\n var newElement = loadedPages[jumpto + 1].courses.slice(0, 1);\n\n // Adjust the dataset for the reset of the pages that are loaded\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var popElement = [];\n if (loadedPages[index + 1] != undefined) {\n popElement = loadedPages[index + 1].courses.slice(0, 1);\n }\n\n loadedPages[index].courses = $.merge(loadedPages[index].courses.slice(1), popElement);\n }\n });\n\n\n reducedCourse = $.merge(reducedCourse, newElement);\n }\n\n // Check if the next page is the last page and if it still has data associated to it\n if (lastPage == jumpto + 1 && loadedPages[jumpto + 1].courses.length == 0) {\n var pagedContentContainer = root.find('[data-region=\"paged-content-container\"]');\n PagedContentFactory.resetLastPageNumber($(pagedContentContainer).attr('id'), jumpto);\n }\n\n loadedPages[jumpto].courses = reducedCourse;\n\n // Reduce the course offset\n courseOffset--;\n\n // Render the paged content for the current\n var pagedContentPage = getPagedContentContainer(root, jumpto);\n renderCourses(root, loadedPages[jumpto]).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n\n // Delete subsequent pages in order to trigger the callback\n loadedPages.forEach(function(courseList, index) {\n if (index > jumpto) {\n var page = getPagedContentContainer(root, index);\n page.remove();\n }\n });\n };\n\n /**\n * Set the courses favourite status and push to repository\n *\n * @param {Number} courseId Course id to favourite.\n * @param {Bool} status new favourite status.\n * @return {Promise} Repository promise.\n */\n var setCourseFavouriteState = function(courseId, status) {\n\n return Repository.setFavouriteCourses({\n courses: [\n {\n 'id': courseId,\n 'favourite': status\n }\n ]\n }).then(function(result) {\n if (result.warnings.length == 0) {\n loadedPages.forEach(function(courseList) {\n courseList.courses.forEach(function(course, index) {\n if (course.id == courseId) {\n courseList.courses[index].isfavourite = status;\n }\n });\n });\n return true;\n } else {\n return false;\n }\n }).catch(Notification.exception);\n };\n\n /**\n * Render the dashboard courses.\n *\n * @param {object} root The root element for the courses view.\n * @param {array} coursesData containing array of returned courses.\n * @return {promise} jQuery promise resolved after rendering is complete.\n */\n var renderCourses = function(root, coursesData) {\n\n var filters = getFilterValues(root);\n\n var currentTemplate = '';\n if (filters.display == 'card') {\n currentTemplate = TEMPLATES.COURSES_CARDS;\n } else if (filters.display == 'list') {\n currentTemplate = TEMPLATES.COURSES_LIST;\n } else {\n currentTemplate = TEMPLATES.COURSES_SUMMARY;\n }\n\n // Delete the course category if it is not to be displayed\n if (filters.displaycategories != 'on') {\n coursesData.courses = coursesData.courses.map(function(course) {\n delete course.coursecategory;\n return course;\n });\n }\n\n if (coursesData.courses.length) {\n return Templates.render(currentTemplate, {\n courses: coursesData.courses,\n });\n } else {\n var nocoursesimg = root.find(Selectors.courseView.region).attr('data-nocoursesimg');\n return Templates.render(TEMPLATES.NOCOURSES, {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Return the callback to be passed to the subscribe event\n *\n * @param {Number} limit The paged limit that is passed through the event\n */\n var setLimit = function(limit) {\n this.find(Selectors.courseView.region).attr('data-paging', limit);\n };\n\n /**\n * Intialise the paged list and cards views on page load.\n * Returns an array of paged contents that we would like to handle here\n *\n * @param {object} root The root element for the courses view\n * @param {string} namespace The namespace for all the events attached\n */\n var registerPagedEventHandlers = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, setLimit.bind(root));\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n * @param {object} content The content element for the courses view.\n */\n var initializePagedContent = function(root) {\n namespace = \"block_myoverview_\" + root.attr('id') + \"_\" + Math.random();\n\n var itemsPerPage = NUMCOURSES_PERPAGE;\n var pagingLimit = parseInt(root.find(Selectors.courseView.region).attr('data-paging'), 10);\n if (pagingLimit) {\n itemsPerPage = NUMCOURSES_PERPAGE.map(function(value) {\n var active = false;\n if (value == pagingLimit) {\n active = true;\n }\n\n return {\n value: value,\n active: active\n };\n });\n }\n\n var filters = getFilterValues(root);\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG);\n config.eventNamespace = namespace;\n\n var pagedContentPromise = PagedContentFactory.createWithLimit(\n itemsPerPage,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var currentPage = pageData.pageNumber;\n var limit = pageData.limit;\n\n // Reset local variables if limits have changed\n if (lastLimit != limit) {\n loadedPages = [];\n courseOffset = 0;\n lastPage = 0;\n }\n\n if (lastPage == currentPage) {\n // If we are on the last page and have it's data then load it from cache\n actions.allItemsLoaded(lastPage);\n promises.push(renderCourses(root, loadedPages[currentPage]));\n return;\n }\n\n lastLimit = limit;\n\n // Get 2 pages worth of data as we will need it for the hidden functionality.\n if (loadedPages[currentPage + 1] == undefined) {\n if (loadedPages[currentPage] == undefined) {\n limit *= 2;\n }\n }\n\n var pagePromise = getMyCourses(\n filters,\n limit\n ).then(function(coursesData) {\n var courses = coursesData.courses;\n var nextPageStart = 0;\n var pageCourses = [];\n\n // If current page's data is loaded make sure we max it to page limit\n if (loadedPages[currentPage] != undefined) {\n pageCourses = loadedPages[currentPage].courses;\n var currentPageLength = pageCourses.length;\n if (currentPageLength < pageData.limit) {\n nextPageStart = pageData.limit - currentPageLength;\n pageCourses = $.merge(loadedPages[currentPage].courses, courses.slice(0, nextPageStart));\n }\n } else {\n nextPageStart = pageData.limit;\n pageCourses = courses.slice(0, pageData.limit);\n }\n\n // Finished setting up the current page\n loadedPages[currentPage] = {\n courses: pageCourses\n };\n\n // Set up the next page\n var remainingCourses = courses.slice(nextPageStart, courses.length);\n if (remainingCourses.length) {\n loadedPages[currentPage + 1] = {\n courses: remainingCourses\n };\n }\n\n // Set the last page to either the current or next page\n if (loadedPages[currentPage].courses.length < pageData.limit || !remainingCourses.length) {\n lastPage = currentPage;\n actions.allItemsLoaded(currentPage);\n } else if (loadedPages[currentPage + 1] != undefined\n && loadedPages[currentPage + 1].courses.length < pageData.limit) {\n lastPage = currentPage + 1;\n }\n\n courseOffset = coursesData.nextoffset;\n return renderCourses(root, loadedPages[currentPage]);\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n return promises;\n },\n config\n );\n\n pagedContentPromise.then(function(html, js) {\n registerPagedEventHandlers(root, namespace);\n return Templates.replaceNodeContents(root.find(Selectors.courseView.region), html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Listen to, and handle events for the myoverview block.\n *\n * @param {Object} root The myoverview block container element.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [\n CustomEvents.events.activate\n ]);\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_ADD_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_ADD_FAVOURITE);\n var courseId = getCourseId(favourite);\n addToFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_REMOVE_FAVOURITE, function(e, data) {\n var favourite = $(e.target).closest(SELECTORS.ACTION_REMOVE_FAVOURITE);\n var courseId = getCourseId(favourite);\n removeFromFavourites(root, courseId);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.FAVOURITE_ICON, function(e, data) {\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_HIDE_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_HIDE_COURSE);\n var id = getCourseId(target);\n\n var request = {\n preferences: [\n {\n type: 'block_myoverview_hidden_course_' + id,\n value: true\n }\n ]\n };\n Repository.updateUserPreferences(request);\n\n hideElement(root, target);\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.ACTION_SHOW_COURSE, function(e, data) {\n var target = $(e.target).closest(SELECTORS.ACTION_SHOW_COURSE);\n var id = getCourseId(target);\n\n var request = {\n preferences: [\n {\n type: 'block_myoverview_hidden_course_' + id,\n value: null\n }\n ]\n };\n\n Repository.updateUserPreferences(request);\n\n hideElement(root, target);\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Intialise the courses list and cards views on page load.\n *\n * @param {object} root The root element for the courses view.\n */\n var init = function(root) {\n root = $(root);\n loadedPages = [];\n lastPage = 0;\n courseOffset = 0;\n\n initializePagedContent(root);\n\n if (!root.attr('data-init')) {\n registerEventListeners(root);\n root.attr('data-init', true);\n }\n };\n\n /**\n\n * Reset the courses views to their original\n * state on first page load.courseOffset\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {Object} root The root element for the timeline view.\n */\n var reset = function(root) {\n if (loadedPages.length > 0) {\n loadedPages.forEach(function(courseList, index) {\n var pagedContentPage = getPagedContentContainer(root, index);\n renderCourses(root, courseList).then(function(html, js) {\n return Templates.replaceNodeContents(pagedContentPage, html, js);\n }).catch(Notification.exception);\n });\n } else {\n init(root);\n }\n };\n\n return {\n init: init,\n reset: reset\n };\n});\n"],"file":"view.min.js"} \ No newline at end of file diff --git a/blocks/myoverview/amd/build/view_nav.min.js b/blocks/myoverview/amd/build/view_nav.min.js index 66a3cbae409b2..ce56253686e43 100644 --- a/blocks/myoverview/amd/build/view_nav.min.js +++ b/blocks/myoverview/amd/build/view_nav.min.js @@ -1 +1,2 @@ -define(["jquery","core/custom_interaction_events","block_myoverview/repository","block_myoverview/view","block_myoverview/selectors"],function(a,b,c,d,e){var f={FILTERS:'[data-region="filter"]',FILTER_OPTION:"[data-filter]",DISPLAY_OPTION:"[data-display-option]"},g=function(a,b){var d=null;d="display"==a?"block_myoverview_user_view_preference":"sort"==a?"block_myoverview_user_sort_preference":"block_myoverview_user_grouping_preference",c.updateUserPreferences({preferences:[{type:d,value:b}]})},h=function(c){var h=c.find(f.FILTERS);b.define(h,[b.events.activate]),h.on(b.events.activate,f.FILTER_OPTION,function(b,f){var h=a(b.target);if(!h.hasClass("active")){var i=h.attr("data-filter"),j=h.attr("data-pref");c.find(e.courseView.region).attr("data-"+i,h.attr("data-value")),g(i,j),d.init(c),f.originalEvent.preventDefault()}}),b.define(h,[b.events.activate]),h.on(b.events.activate,f.DISPLAY_OPTION,function(b,f){var h=a(b.target);if(!h.hasClass("active")){var i=h.attr("data-display-option"),j=h.attr("data-pref");c.find(e.courseView.region).attr("data-display",h.attr("data-value")),g(i,j),d.reset(c),f.originalEvent.preventDefault()}})},i=function(b){b=a(b),h(b)};return{init:i}}); \ No newline at end of file +define ("block_myoverview/view_nav",["jquery","core/custom_interaction_events","block_myoverview/repository","block_myoverview/view","block_myoverview/selectors"],function(a,b,c,d,f){var g={FILTERS:"[data-region=\"filter\"]",FILTER_OPTION:"[data-filter]",DISPLAY_OPTION:"[data-display-option]"},h=function(a,b){var d=null;if("display"==a){d="block_myoverview_user_view_preference"}else if("sort"==a){d="block_myoverview_user_sort_preference"}else{d="block_myoverview_user_grouping_preference"}c.updateUserPreferences({preferences:[{type:d,value:b}]})},i=function(c){var e=c.find(g.FILTERS);b.define(e,[b.events.activate]);e.on(b.events.activate,g.FILTER_OPTION,function(b,e){var g=a(b.target);if(g.hasClass("active")){return}var i=g.attr("data-filter"),j=g.attr("data-pref");c.find(f.courseView.region).attr("data-"+i,g.attr("data-value"));h(i,j);d.init(c);e.originalEvent.preventDefault()});b.define(e,[b.events.activate]);e.on(b.events.activate,g.DISPLAY_OPTION,function(b,e){var g=a(b.target);if(g.hasClass("active")){return}var i=g.attr("data-display-option"),j=g.attr("data-pref");c.find(f.courseView.region).attr("data-display",g.attr("data-value"));h(i,j);d.reset(c);e.originalEvent.preventDefault()})};return{init:function init(b){b=a(b);i(b)}}}); +//# sourceMappingURL=view_nav.min.js.map diff --git a/blocks/myoverview/amd/build/view_nav.min.js.map b/blocks/myoverview/amd/build/view_nav.min.js.map new file mode 100644 index 0000000000000..dfa381d8c3d29 --- /dev/null +++ b/blocks/myoverview/amd/build/view_nav.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view_nav.js"],"names":["define","$","CustomEvents","Repository","View","Selectors","SELECTORS","FILTERS","FILTER_OPTION","DISPLAY_OPTION","updatePreferences","filter","value","type","updateUserPreferences","preferences","registerSelector","root","Selector","find","events","activate","on","e","data","option","target","hasClass","attr","pref","courseView","region","init","originalEvent","preventDefault","reset"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Manage the timeline view navigation for the overview block.\n *\n * @package block_myoverview\n * @copyright 2018 Bas Brands \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_myoverview/repository',\n 'block_myoverview/view',\n 'block_myoverview/selectors'\n],\nfunction(\n $,\n CustomEvents,\n Repository,\n View,\n Selectors\n) {\n\n var SELECTORS = {\n FILTERS: '[data-region=\"filter\"]',\n FILTER_OPTION: '[data-filter]',\n DISPLAY_OPTION: '[data-display-option]'\n };\n\n /**\n * Update the user preference for the block.\n *\n * @param {String} filter The type of filter: display/sort/grouping.\n * @param {String} value The current preferred value.\n */\n var updatePreferences = function(filter, value) {\n var type = null;\n if (filter == 'display') {\n type = 'block_myoverview_user_view_preference';\n } else if (filter == 'sort') {\n type = 'block_myoverview_user_sort_preference';\n } else {\n type = 'block_myoverview_user_grouping_preference';\n }\n\n Repository.updateUserPreferences({\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n });\n };\n\n /**\n * Event listener for the Display filter (cards, list).\n *\n * @param {object} root The root element for the overview block\n */\n var registerSelector = function(root) {\n\n var Selector = root.find(SELECTORS.FILTERS);\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.FILTER_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var filter = option.attr('data-filter');\n var pref = option.attr('data-pref');\n\n root.find(Selectors.courseView.region).attr('data-' + filter, option.attr('data-value'));\n updatePreferences(filter, pref);\n\n // Reset the views.\n View.init(root);\n\n data.originalEvent.preventDefault();\n }\n );\n\n CustomEvents.define(Selector, [CustomEvents.events.activate]);\n Selector.on(\n CustomEvents.events.activate,\n SELECTORS.DISPLAY_OPTION,\n function(e, data) {\n var option = $(e.target);\n\n if (option.hasClass('active')) {\n return;\n }\n\n var filter = option.attr('data-display-option');\n var pref = option.attr('data-pref');\n\n root.find(Selectors.courseView.region).attr('data-display', option.attr('data-value'));\n updatePreferences(filter, pref);\n View.reset(root);\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the myoverview block\n */\n var init = function(root) {\n root = $(root);\n registerSelector(root);\n };\n\n return {\n init: init\n };\n});\n"],"file":"view_nav.min.js"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/ajax_response_renderer.min.js b/blocks/navigation/amd/build/ajax_response_renderer.min.js index 02578ec2d3cd5..e60aad8bab39b 100644 --- a/blocks/navigation/amd/build/ajax_response_renderer.min.js +++ b/blocks/navigation/amd/build/ajax_response_renderer.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/notification","core/url"],function(a,b,c,d){function e(g,h){var i=a("
    ");i.attr("role","group"),i.attr("aria-hidden",!0),a.each(h,function(g,h){if("object"==typeof h){var j=a("
  • "),k=a("

    "),l=h.id||h.key+"_tree_item",m=null,n=!(!h.expandable&&!h.haschildren);k.addClass("tree_item"),k.attr("id",l),k.attr("role","treeitem"),k.attr("tabindex","-1"),h.requiresajaxloading&&(k.attr("data-requires-ajax",!0),k.attr("data-node-id",h.id),k.attr("data-node-key",h.key),k.attr("data-node-type",h.type)),n&&(j.addClass("collapsed contains_branch"),k.attr("aria-expanded",!1),k.addClass("branch"));var o=null;if(h.link){var p=a('');o=p,p.append(''+h.name+""),h.hidden&&p.addClass("dimmed"),k.append(p)}else{var q=a("");o=q,q.append(''+h.name+""),h.hidden&&q.addClass("dimmed"),k.append(q)}!h.icon||n&&h.type!==f.ACTIVITY&&h.type!==f.RESOURCE||(j.addClass("item_with_icon"),k.addClass("hasicon"),h.type===f.ACTIVITY||h.type===f.RESOURCE?(m=a(""),m.attr("alt",h.icon.alt),m.attr("title",h.icon.title),m.attr("src",d.imageUrl(h.icon.pix,h.icon.component)),a.each(h.icon.classes,function(a,b){m.addClass(b)}),o.prepend(m)):("moodle"==h.icon.component&&(h.icon.component="core"),b.renderPix(h.icon.pix,h.icon.component,h.icon.title).then(function(a){o.prepend(a)})["catch"](c.exception))),j.append(k),i.append(j),h.children&&h.children.length?e(k,h.children):n&&!h.requiresajaxloading&&(j.removeClass("contains_branch"),k.addClass("emptybranch"))}}),g.parent().append(i);var j=g.attr("id")+"_group";i.attr("id",j),g.attr("aria-owns",j),g.attr("role","treeitem")}var f={ACTIVITY:40,RESOURCE:50};return{render:function(a,b){if(b.children&&b.children.length){e(a,b.children);var c=a.children("[role='treeitem']").first(),d=a.find("#"+c.attr("aria-owns"));c.attr("aria-expanded",!0),d.attr("aria-hidden",!1)}else a.parent().hasClass("contains_branch")&&(a.parent().removeClass("contains_branch"),a.addClass("emptybranch"))}}}); \ No newline at end of file +function _typeof(a){if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("block_navigation/ajax_response_renderer",["jquery","core/templates","core/notification","core/url"],function(a,b,c,d){var f={ACTIVITY:40,RESOURCE:50};function e(g,h){var i=a("
      ");i.attr("role","group");i.attr("aria-hidden",!0);a.each(h,function(g,h){if("object"!==_typeof(h)){return}var j=a("
    • "),k=a("

      "),l=h.id||h.key+"_tree_item",m=null,n=h.expandable||h.haschildren?!0:!1;k.addClass("tree_item");k.attr("id",l);k.attr("role","treeitem");k.attr("tabindex","-1");if(h.requiresajaxloading){k.attr("data-requires-ajax",!0);k.attr("data-node-id",h.id);k.attr("data-node-key",h.key);k.attr("data-node-type",h.type)}if(n){j.addClass("collapsed contains_branch");k.attr("aria-expanded",!1);k.addClass("branch")}var o=null;if(h.link){var p=a("");o=p;p.append(""+h.name+"");if(h.hidden){p.addClass("dimmed")}k.append(p)}else{var q=a("");o=q;q.append(""+h.name+"");if(h.hidden){q.addClass("dimmed")}k.append(q)}if(h.icon&&(!n||h.type===f.ACTIVITY||h.type===f.RESOURCE)){j.addClass("item_with_icon");k.addClass("hasicon");if(h.type===f.ACTIVITY||h.type===f.RESOURCE){m=a("");m.attr("alt",h.icon.alt);m.attr("title",h.icon.title);m.attr("src",d.imageUrl(h.icon.pix,h.icon.component));a.each(h.icon.classes,function(a,b){m.addClass(b)});o.prepend(m)}else{if("moodle"==h.icon.component){h.icon.component="core"}b.renderPix(h.icon.pix,h.icon.component,h.icon.title).then(function(a){o.prepend(a)}).catch(c.exception)}}j.append(k);i.append(j);if(h.children&&h.children.length){e(k,h.children)}else if(n&&!h.requiresajaxloading){j.removeClass("contains_branch");k.addClass("emptybranch")}});g.parent().append(i);var j=g.attr("id")+"_group";i.attr("id",j);g.attr("aria-owns",j);g.attr("role","treeitem")}return{render:function render(a,b){if(b.children&&b.children.length){e(a,b.children);var c=a.children("[role='treeitem']").first(),d=a.find("#"+c.attr("aria-owns"));c.attr("aria-expanded",!0);d.attr("aria-hidden",!1)}else{if(a.parent().hasClass("contains_branch")){a.parent().removeClass("contains_branch");a.addClass("emptybranch")}}}}}); +//# sourceMappingURL=ajax_response_renderer.min.js.map diff --git a/blocks/navigation/amd/build/ajax_response_renderer.min.js.map b/blocks/navigation/amd/build/ajax_response_renderer.min.js.map new file mode 100644 index 0000000000000..5154d5bad9903 --- /dev/null +++ b/blocks/navigation/amd/build/ajax_response_renderer.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/ajax_response_renderer.js"],"names":["define","$","Templates","Notification","Url","NODETYPE","ACTIVITY","RESOURCE","buildDOM","rootElement","nodes","ul","attr","each","index","node","li","p","id","key","icon","isBranch","expandable","haschildren","addClass","requiresajaxloading","type","eleToAddIcon","link","title","append","name","hidden","span","alt","imageUrl","pix","component","classes","className","prepend","renderPix","then","html","catch","exception","children","length","removeClass","parent","render","element","item","first","group","find","hasClass"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Parse the response from the navblock ajax page and render the correct DOM\n * structure for the tree from it.\n *\n * @module block_navigation/ajax_response_renderer\n * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/url'], function($, Templates, Notification, Url) {\n\n // Mappings for the different types of nodes coming from the navigation.\n // Copied from lib/navigationlib.php navigation_node constants.\n var NODETYPE = {\n // @type int Activity (course module) = 40.\n ACTIVITY: 40,\n // @type int Resource (course module = 50.\n RESOURCE: 50,\n };\n\n /**\n * Build DOM.\n *\n * @method buildDOM\n * @param {Object} rootElement the root element of DOM.\n * @param {object} nodes jquery object representing the nodes to be build.\n */\n function buildDOM(rootElement, nodes) {\n var ul = $('
        ');\n ul.attr('role', 'group');\n ul.attr('aria-hidden', true);\n\n $.each(nodes, function(index, node) {\n if (typeof node !== 'object') {\n return;\n }\n\n var li = $('
      • ');\n var p = $('

        ');\n var id = node.id || node.key + '_tree_item';\n var icon = null;\n var isBranch = (node.expandable || node.haschildren) ? true : false;\n\n p.addClass('tree_item');\n p.attr('id', id);\n p.attr('role', 'treeitem');\n // Negative tab index to allow it to receive focus.\n p.attr('tabindex', '-1');\n\n if (node.requiresajaxloading) {\n p.attr('data-requires-ajax', true);\n p.attr('data-node-id', node.id);\n p.attr('data-node-key', node.key);\n p.attr('data-node-type', node.type);\n }\n\n if (isBranch) {\n li.addClass('collapsed contains_branch');\n p.attr('aria-expanded', false);\n p.addClass('branch');\n }\n\n var eleToAddIcon = null;\n if (node.link) {\n var link = $('');\n\n eleToAddIcon = link;\n link.append('' + node.name + '');\n\n if (node.hidden) {\n link.addClass('dimmed');\n }\n\n p.append(link);\n } else {\n var span = $('');\n\n eleToAddIcon = span;\n span.append('' + node.name + '');\n\n if (node.hidden) {\n span.addClass('dimmed');\n }\n\n p.append(span);\n }\n\n if (node.icon && (!isBranch || node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE)) {\n li.addClass('item_with_icon');\n p.addClass('hasicon');\n\n if (node.type === NODETYPE.ACTIVITY || node.type === NODETYPE.RESOURCE) {\n icon = $('');\n icon.attr('alt', node.icon.alt);\n icon.attr('title', node.icon.title);\n icon.attr('src', Url.imageUrl(node.icon.pix, node.icon.component));\n $.each(node.icon.classes, function(index, className) {\n icon.addClass(className);\n });\n eleToAddIcon.prepend(icon);\n } else {\n if (node.icon.component == 'moodle') {\n node.icon.component = 'core';\n }\n Templates.renderPix(node.icon.pix, node.icon.component, node.icon.title).then(function(html) {\n // Prepend.\n eleToAddIcon.prepend(html);\n return;\n }).catch(Notification.exception);\n }\n }\n\n li.append(p);\n ul.append(li);\n\n if (node.children && node.children.length) {\n buildDOM(p, node.children);\n } else if (isBranch && !node.requiresajaxloading) {\n li.removeClass('contains_branch');\n p.addClass('emptybranch');\n }\n });\n\n rootElement.parent().append(ul);\n var id = rootElement.attr('id') + '_group';\n ul.attr('id', id);\n rootElement.attr('aria-owns', id);\n rootElement.attr('role', 'treeitem');\n }\n\n return {\n render: function(element, nodes) {\n // The first element of the response is the existing node so we start with processing the children.\n if (nodes.children && nodes.children.length) {\n buildDOM(element, nodes.children);\n\n var item = element.children(\"[role='treeitem']\").first();\n var group = element.find('#' + item.attr('aria-owns'));\n\n item.attr('aria-expanded', true);\n group.attr('aria-hidden', false);\n } else {\n if (element.parent().hasClass('contains_branch')) {\n element.parent().removeClass('contains_branch');\n element.addClass('emptybranch');\n }\n }\n }\n };\n});\n"],"file":"ajax_response_renderer.min.js"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/nav_loader.min.js b/blocks/navigation/amd/build/nav_loader.min.js index 183a19f43b7af..444e854396907 100644 --- a/blocks/navigation/amd/build/nav_loader.min.js +++ b/blocks/navigation/amd/build/nav_loader.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/config","block_navigation/ajax_response_renderer"],function(a,b,c,d){function e(a){return a.closest("[data-block]").attr("data-instanceid")}var f=c.wwwroot+"/lib/ajax/getnavbranch.php";return{load:function(b){b=a(b);var g=a.Deferred(),h={elementid:b.attr("data-node-id"),id:b.attr("data-node-key"),type:b.attr("data-node-type"),sesskey:c.sesskey,instance:e(b)},i={type:"POST",dataType:"json",data:h};return a.ajax(f,i).done(function(a){d.render(b,a),g.resolve()}),g}}}); \ No newline at end of file +define ("block_navigation/nav_loader",["jquery","core/ajax","core/config","block_navigation/ajax_response_renderer"],function(a,b,c,d){var f=c.wwwroot+"/lib/ajax/getnavbranch.php";function e(a){return a.closest("[data-block]").attr("data-instanceid")}return{load:function load(b){b=a(b);var g=a.Deferred(),h={elementid:b.attr("data-node-id"),id:b.attr("data-node-key"),type:b.attr("data-node-type"),sesskey:c.sesskey,instance:e(b)};a.ajax(f,{type:"POST",dataType:"json",data:h}).done(function(a){d.render(b,a);g.resolve()});return g}}}); +//# sourceMappingURL=nav_loader.min.js.map diff --git a/blocks/navigation/amd/build/nav_loader.min.js.map b/blocks/navigation/amd/build/nav_loader.min.js.map new file mode 100644 index 0000000000000..331c071a0f576 --- /dev/null +++ b/blocks/navigation/amd/build/nav_loader.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/nav_loader.js"],"names":["define","$","ajax","config","renderer","URL","wwwroot","getBlockInstanceId","element","closest","attr","load","promise","Deferred","data","elementid","id","type","sesskey","instance","dataType","done","nodes","render","resolve"],"mappings":"AAuBAA,OAAM,+BAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,aAAxB,CAAuC,yCAAvC,CAAD,CACF,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA0BC,CAA1B,CAAoC,CAChC,GAAIC,CAAAA,CAAG,CAAGF,CAAM,CAACG,OAAP,CAAiB,4BAA3B,CASA,QAASC,CAAAA,CAAT,CAA4BC,CAA5B,CAAqC,CACjC,MAAOA,CAAAA,CAAO,CAACC,OAAR,CAAgB,cAAhB,EAAgCC,IAAhC,CAAqC,iBAArC,CACV,CAEL,MAAO,CACHC,IAAI,CAAE,cAASH,CAAT,CAAkB,CACpBA,CAAO,CAAGP,CAAC,CAACO,CAAD,CAAX,CADoB,GAEhBI,CAAAA,CAAO,CAAGX,CAAC,CAACY,QAAF,EAFM,CAGhBC,CAAI,CAAG,CACPC,SAAS,CAAEP,CAAO,CAACE,IAAR,CAAa,cAAb,CADJ,CAEPM,EAAE,CAAER,CAAO,CAACE,IAAR,CAAa,eAAb,CAFG,CAGPO,IAAI,CAAET,CAAO,CAACE,IAAR,CAAa,gBAAb,CAHC,CAIPQ,OAAO,CAAEf,CAAM,CAACe,OAJT,CAKPC,QAAQ,CAAEZ,CAAkB,CAACC,CAAD,CALrB,CAHS,CAgBpBP,CAAC,CAACC,IAAF,CAAOG,CAAP,CANe,CACXY,IAAI,CAAE,MADK,CAEXG,QAAQ,CAAE,MAFC,CAGXN,IAAI,CAAEA,CAHK,CAMf,EAAsBO,IAAtB,CAA2B,SAASC,CAAT,CAAgB,CACvClB,CAAQ,CAACmB,MAAT,CAAgBf,CAAhB,CAAyBc,CAAzB,EACAV,CAAO,CAACY,OAAR,EACH,CAHD,EAKA,MAAOZ,CAAAA,CACV,CAvBE,CAyBV,CAxCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Load the nav tree items via ajax and render the response.\n *\n * @module block_navigation/nav_loader\n * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n var URL = config.wwwroot + '/lib/ajax/getnavbranch.php';\n\n /**\n * Get the block instance id.\n *\n * @function getBlockInstanceId\n * @param {Element} element\n * @returns {String} the instance id\n */\n function getBlockInstanceId(element) {\n return element.closest('[data-block]').attr('data-instanceid');\n }\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n elementid: element.attr('data-node-id'),\n id: element.attr('data-node-key'),\n type: element.attr('data-node-type'),\n sesskey: config.sesskey,\n instance: getBlockInstanceId(element)\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"file":"nav_loader.min.js"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/navblock.min.js b/blocks/navigation/amd/build/navblock.min.js index 20255544242bc..fe24b09b59592 100644 --- a/blocks/navigation/amd/build/navblock.min.js +++ b/blocks/navigation/amd/build/navblock.min.js @@ -1 +1,2 @@ -define(["jquery","core/tree"],function(a,b){return{init:function(a){var c=new b(".block_navigation .block_tree");c.finishExpandingGroup=function(c){b.prototype.finishExpandingGroup.call(this,c),Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})},c.collapseGroup=function(c){b.prototype.collapseGroup.call(this,c),Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})}}}}); \ No newline at end of file +define ("block_navigation/navblock",["jquery","core/tree"],function(a,b){return{init:function init(a){var c=new b(".block_navigation .block_tree");c.finishExpandingGroup=function(c){b.prototype.finishExpandingGroup.call(this,c);Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})};c.collapseGroup=function(c){b.prototype.collapseGroup.call(this,c);Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})}}}}); +//# sourceMappingURL=navblock.min.js.map diff --git a/blocks/navigation/amd/build/navblock.min.js.map b/blocks/navigation/amd/build/navblock.min.js.map new file mode 100644 index 0000000000000..f93c05d4349d9 --- /dev/null +++ b/blocks/navigation/amd/build/navblock.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/navblock.js"],"names":["define","$","Tree","init","instanceid","navTree","finishExpandingGroup","item","prototype","call","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":"AAuBAA,OAAM,6BAAC,CAAC,QAAD,CAAW,WAAX,CAAD,CAA0B,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CAC9C,MAAO,CACHC,IAAI,CAAE,cAASC,CAAT,CAAqB,CACvB,GAAIC,CAAAA,CAAO,CAAG,GAAIH,CAAAA,CAAJ,CAAS,+BAAT,CAAd,CACAG,CAAO,CAACC,oBAAR,CAA+B,SAASC,CAAT,CAAe,CAC1CL,CAAI,CAACM,SAAL,CAAeF,oBAAf,CAAoCG,IAApC,CAAyC,IAAzC,CAA+CF,CAA/C,EACAG,CAAC,CAACC,GAAF,CAAM,mBAAN,CAA2B,UAAW,CAClCD,CAAC,CAACE,MAAF,CAASC,IAAT,CAAcC,CAAC,CAACC,IAAF,CAAOC,YAAP,CAAoBC,qBAAlC,CAAyD,CACrDb,UAAU,CAAEA,CADyC,CAAzD,CAGH,CAJD,CAKH,CAPD,CAQAC,CAAO,CAACa,aAAR,CAAwB,SAASX,CAAT,CAAe,CACnCL,CAAI,CAACM,SAAL,CAAeU,aAAf,CAA6BT,IAA7B,CAAkC,IAAlC,CAAwCF,CAAxC,EACAG,CAAC,CAACC,GAAF,CAAM,mBAAN,CAA2B,UAAW,CAClCD,CAAC,CAACE,MAAF,CAASC,IAAT,CAAcC,CAAC,CAACC,IAAF,CAAOC,YAAP,CAAoBC,qBAAlC,CAAyD,CACrDb,UAAU,CAAEA,CADyC,CAAzD,CAGH,CAJD,CAKH,CACJ,CAnBE,CAqBV,CAtBK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Load the navigation tree javascript.\n *\n * @module block_navigation/navblock\n * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid) {\n var navTree = new Tree(\".block_navigation .block_tree\");\n navTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n navTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"file":"navblock.min.js"} \ No newline at end of file diff --git a/blocks/navigation/amd/build/site_admin_loader.min.js b/blocks/navigation/amd/build/site_admin_loader.min.js index 9bd76cbae61c0..a1ee89786e053 100644 --- a/blocks/navigation/amd/build/site_admin_loader.min.js +++ b/blocks/navigation/amd/build/site_admin_loader.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/config","block_navigation/ajax_response_renderer"],function(a,b,c,d){var e=71,f=c.wwwroot+"/lib/ajax/getsiteadminbranch.php";return{load:function(b){b=a(b);var g=a.Deferred(),h={type:e,sesskey:c.sesskey},i={type:"POST",dataType:"json",data:h};return a.ajax(f,i).done(function(a){d.render(b,a),g.resolve()}),g}}}); \ No newline at end of file +define ("block_navigation/site_admin_loader",["jquery","core/ajax","core/config","block_navigation/ajax_response_renderer"],function(a,b,c,d){var e=c.wwwroot+"/lib/ajax/getsiteadminbranch.php";return{load:function load(b){b=a(b);var f=a.Deferred(),g={type:71,sesskey:c.sesskey};a.ajax(e,{type:"POST",dataType:"json",data:g}).done(function(a){d.render(b,a);f.resolve()});return f}}}); +//# sourceMappingURL=site_admin_loader.min.js.map diff --git a/blocks/navigation/amd/build/site_admin_loader.min.js.map b/blocks/navigation/amd/build/site_admin_loader.min.js.map new file mode 100644 index 0000000000000..c7cd6459f0d83 --- /dev/null +++ b/blocks/navigation/amd/build/site_admin_loader.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/site_admin_loader.js"],"names":["define","$","ajax","config","renderer","URL","wwwroot","load","element","promise","Deferred","data","type","sesskey","dataType","done","nodes","render","resolve"],"mappings":"AAuBAA,OAAM,sCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,aAAxB,CAAuC,yCAAvC,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA0BC,CAA1B,CAAoC,IAGpCC,CAAAA,CAAG,CAAGF,CAAM,CAACG,OAAP,CAAiB,kCAHa,CAKxC,MAAO,CACHC,IAAI,CAAE,cAASC,CAAT,CAAkB,CACpBA,CAAO,CAAGP,CAAC,CAACO,CAAD,CAAX,CADoB,GAEhBC,CAAAA,CAAO,CAAGR,CAAC,CAACS,QAAF,EAFM,CAGhBC,CAAI,CAAG,CACPC,IAAI,GADG,CAEPC,OAAO,CAAEV,CAAM,CAACU,OAFT,CAHS,CAapBZ,CAAC,CAACC,IAAF,CAAOG,CAAP,CANe,CACXO,IAAI,CAAE,MADK,CAEXE,QAAQ,CAAE,MAFC,CAGXH,IAAI,CAAEA,CAHK,CAMf,EAAsBI,IAAtB,CAA2B,SAASC,CAAT,CAAgB,CACvCZ,CAAQ,CAACa,MAAT,CAAgBT,CAAhB,CAAyBQ,CAAzB,EACAP,CAAO,CAACS,OAAR,EACH,CAHD,EAKA,MAAOT,CAAAA,CACV,CApBE,CAsBV,CA5BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Load the site admin nav tree via ajax and render the response.\n *\n * @module block_navigation/site_admin_loader\n * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/config', 'block_navigation/ajax_response_renderer'],\n function($, ajax, config, renderer) {\n\n var SITE_ADMIN_NODE_TYPE = 71;\n var URL = config.wwwroot + '/lib/ajax/getsiteadminbranch.php';\n\n return {\n load: function(element) {\n element = $(element);\n var promise = $.Deferred();\n var data = {\n type: SITE_ADMIN_NODE_TYPE,\n sesskey: config.sesskey\n };\n var settings = {\n type: 'POST',\n dataType: 'json',\n data: data\n };\n\n $.ajax(URL, settings).done(function(nodes) {\n renderer.render(element, nodes);\n promise.resolve();\n });\n\n return promise;\n }\n };\n});\n"],"file":"site_admin_loader.min.js"} \ No newline at end of file diff --git a/blocks/online_users/amd/build/change_user_visibility.min.js b/blocks/online_users/amd/build/change_user_visibility.min.js index f45ae5b30d8f2..c80c6e45117f1 100644 --- a/blocks/online_users/amd/build/change_user_visibility.min.js +++ b/blocks/online_users/amd/build/change_user_visibility.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/str","core/notification"],function(a,b,c,d){var e={CHANGE_VISIBILITY_LINK:"#change-user-visibility",CHANGE_VISIBILITY_ICON:"#change-user-visibility .icon"},f=function(a,c){var e="show"==a?1:0,f=[{name:"block_online_users_uservisibility",value:e,userid:c}],j={methodname:"core_user_set_user_preferences",args:{preferences:f}};b.call([j])[0].then(function(b){if(b.saved){var c=g(a);h(c),i(c)}})["catch"](d.exception)},g=function(a){return"show"==a?"hide":"show"},h=function(b){k(b).then(function(c){a(e.CHANGE_VISIBILITY_LINK).attr({"data-action":b,title:c})})["catch"](d.exception)},i=function(b){var c=a(e.CHANGE_VISIBILITY_ICON);k(b).then(function(d){a(c).attr({title:d,"aria-label":d}),c.is("img")?a(c).attr({src:M.util.image_url("t/"+b),alt:d}):(a(c).addClass(j(b)),a(c).removeClass(j(g(b))))})["catch"](d.exception)},j=function(a){return"show"==a?"fa-eye-slash":"fa-eye"},k=function(a){return c.get_string("online_status:"+a,"block_online_users")};return{init:function(){a(e.CHANGE_VISIBILITY_LINK).on("click",function(b){b.preventDefault();var c=a(this).attr("data-action"),d=a(this).attr("data-userid");f(c,d)})}}}); \ No newline at end of file +define ("block_online_users/change_user_visibility",["jquery","core/ajax","core/str","core/notification"],function(a,b,c,d){var e={CHANGE_VISIBILITY_LINK:"#change-user-visibility",CHANGE_VISIBILITY_ICON:"#change-user-visibility .icon"},f=function(a,c){var e="show"==a?1:0;b.call([{methodname:"core_user_set_user_preferences",args:{preferences:[{name:"block_online_users_uservisibility",value:e,userid:c}]}}])[0].then(function(b){if(b.saved){var c=g(a);h(c);i(c)}}).catch(d.exception)},g=function(a){return"show"==a?"hide":"show"},h=function(b){k(b).then(function(c){a(e.CHANGE_VISIBILITY_LINK).attr({"data-action":b,title:c})}).catch(d.exception)},i=function(b){var c=a(e.CHANGE_VISIBILITY_ICON);k(b).then(function(d){a(c).attr({title:d,"aria-label":d});if(c.is("img")){a(c).attr({src:M.util.image_url("t/"+b),alt:d})}else{a(c).addClass(j(b));a(c).removeClass(j(g(b)))}}).catch(d.exception)},j=function(a){return"show"==a?"fa-eye-slash":"fa-eye"},k=function(a){return c.get_string("online_status:"+a,"block_online_users")};return{init:function init(){a(e.CHANGE_VISIBILITY_LINK).on("click",function(b){b.preventDefault();var c=a(this).attr("data-action"),d=a(this).attr("data-userid");f(c,d)})}}}); +//# sourceMappingURL=change_user_visibility.min.js.map diff --git a/blocks/online_users/amd/build/change_user_visibility.min.js.map b/blocks/online_users/amd/build/change_user_visibility.min.js.map new file mode 100644 index 0000000000000..f8872777068e2 --- /dev/null +++ b/blocks/online_users/amd/build/change_user_visibility.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/change_user_visibility.js"],"names":["define","$","Ajax","Str","Notification","SELECTORS","CHANGE_VISIBILITY_LINK","CHANGE_VISIBILITY_ICON","changeVisibility","action","userid","value","call","methodname","args","preferences","then","data","saved","newAction","oppositeAction","changeVisibilityLinkAttr","changeVisibilityIconAttr","catch","exception","getTitle","title","attr","icon","is","M","util","image_url","addClass","getIconClass","removeClass","get_string","init","on","e","preventDefault"],"mappings":"AAwBAA,OAAM,6CAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,UAAxB,CAAoC,mBAApC,CAAD,CACE,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAuBC,CAAvB,CAAqC,IAQrCC,CAAAA,CAAS,CAAG,CACZC,sBAAsB,CAAE,yBADZ,CAEZC,sBAAsB,CAAE,+BAFZ,CARyB,CAqBrCC,CAAgB,CAAG,SAASC,CAAT,CAAiBC,CAAjB,CAAyB,IAExCC,CAAAA,CAAK,CAAa,MAAV,EAAAF,CAAM,CAAa,CAAb,CAAiB,CAFS,CAe5CP,CAAI,CAACU,IAAL,CAAU,CANI,CACVC,UAAU,CAAE,gCADF,CAEVC,IAAI,CAAE,CACFC,WAAW,CATD,CAAC,CACf,KAAQ,mCADO,CAEf,MAASJ,CAFM,CAGf,OAAUD,CAHK,CAAD,CAQR,CAFI,CAMJ,CAAV,EAAqB,CAArB,EAAwBM,IAAxB,CAA6B,SAASC,CAAT,CAAe,CACxC,GAAIA,CAAI,CAACC,KAAT,CAAgB,CACZ,GAAIC,CAAAA,CAAS,CAAGC,CAAc,CAACX,CAAD,CAA9B,CACAY,CAAwB,CAACF,CAAD,CAAxB,CACAG,CAAwB,CAACH,CAAD,CAC3B,CAEJ,CAPD,EAOGI,KAPH,CAOSnB,CAAY,CAACoB,SAPtB,CAQH,CA5CwC,CAsDrCJ,CAAc,CAAG,SAASX,CAAT,CAAiB,CAClC,MAAiB,MAAV,EAAAA,CAAM,CAAa,MAAb,CAAsB,MACtC,CAxDwC,CAiErCY,CAAwB,CAAG,SAASZ,CAAT,CAAiB,CAC5CgB,CAAQ,CAAChB,CAAD,CAAR,CAAiBO,IAAjB,CAAsB,SAASU,CAAT,CAAgB,CAClCzB,CAAC,CAACI,CAAS,CAACC,sBAAX,CAAD,CAAoCqB,IAApC,CAAyC,CACrC,cAAelB,CADsB,CAErC,MAASiB,CAF4B,CAAzC,CAKH,CAND,EAMGH,KANH,CAMSnB,CAAY,CAACoB,SANtB,CAOH,CAzEwC,CAkFrCF,CAAwB,CAAG,SAASb,CAAT,CAAiB,CAC5C,GAAImB,CAAAA,CAAI,CAAG3B,CAAC,CAACI,CAAS,CAACE,sBAAX,CAAZ,CACAkB,CAAQ,CAAChB,CAAD,CAAR,CAAiBO,IAAjB,CAAsB,SAASU,CAAT,CAAgB,CAElCzB,CAAC,CAAC2B,CAAD,CAAD,CAAQD,IAAR,CAAa,CACT,MAASD,CADA,CAET,aAAcA,CAFL,CAAb,EAKA,GAAIE,CAAI,CAACC,EAAL,CAAQ,KAAR,CAAJ,CAAoB,CAChB5B,CAAC,CAAC2B,CAAD,CAAD,CAAQD,IAAR,CAAa,CACT,IAAOG,CAAC,CAACC,IAAF,CAAOC,SAAP,CAAiB,KAAOvB,CAAxB,CADE,CAET,IAAOiB,CAFE,CAAb,CAIH,CALD,IAKO,CAEHzB,CAAC,CAAC2B,CAAD,CAAD,CAAQK,QAAR,CAAiBC,CAAY,CAACzB,CAAD,CAA7B,EACAR,CAAC,CAAC2B,CAAD,CAAD,CAAQO,WAAR,CAAoBD,CAAY,CAACd,CAAc,CAACX,CAAD,CAAf,CAAhC,CACH,CAEJ,CAlBD,EAkBGc,KAlBH,CAkBSnB,CAAY,CAACoB,SAlBtB,CAmBH,CAvGwC,CAiHrCU,CAAY,CAAG,SAASzB,CAAT,CAAiB,CAChC,MAAiB,MAAV,EAAAA,CAAM,CAAa,cAAb,CAA8B,QAC9C,CAnHwC,CA6HrCgB,CAAQ,CAAG,SAAShB,CAAT,CAAiB,CAC5B,MAAON,CAAAA,CAAG,CAACiC,UAAJ,CAAe,iBAAmB3B,CAAlC,CAA0C,oBAA1C,CACV,CA/HwC,CAiIzC,MAAO,CAOH4B,IAAI,CAAE,eAAW,CACbpC,CAAC,CAACI,CAAS,CAACC,sBAAX,CAAD,CAAoCgC,EAApC,CAAuC,OAAvC,CAAgD,SAASC,CAAT,CAAY,CACxDA,CAAC,CAACC,cAAF,GADwD,GAEpD/B,CAAAA,CAAM,CAAIR,CAAC,CAAC,IAAD,CAAD,CAAQ0B,IAAR,CAAa,aAAb,CAF0C,CAGpDjB,CAAM,CAAIT,CAAC,CAAC,IAAD,CAAD,CAAQ0B,IAAR,CAAa,aAAb,CAH0C,CAIxDnB,CAAgB,CAACC,CAAD,CAASC,CAAT,CACnB,CALD,CAMH,CAdE,CAgBV,CAlJK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module that handles the change of the user's visibility in the\n * online users block.\n *\n * @module block_online_users/change_user_visibility\n * @package block_online_users\n * @copyright 2018 Mihail Geshoski \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/str', 'core/notification'],\n function($, Ajax, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {Object}\n */\n var SELECTORS = {\n CHANGE_VISIBILITY_LINK: '#change-user-visibility',\n CHANGE_VISIBILITY_ICON: '#change-user-visibility .icon'\n };\n\n /**\n * Change user visibility in the online users block.\n *\n * @method changeVisibility\n * @param {String} action\n * @param {String} userid\n * @private\n */\n var changeVisibility = function(action, userid) {\n\n var value = action == \"show\" ? 1 : 0;\n var preferences = [{\n 'name': 'block_online_users_uservisibility',\n 'value': value,\n 'userid': userid\n }];\n\n var request = {\n methodname: 'core_user_set_user_preferences',\n args: {\n preferences: preferences\n }\n };\n Ajax.call([request])[0].then(function(data) {\n if (data.saved) {\n var newAction = oppositeAction(action);\n changeVisibilityLinkAttr(newAction);\n changeVisibilityIconAttr(newAction);\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the opposite action.\n *\n * @method oppositeAction\n * @param {String} action\n * @return {String}\n * @private\n */\n var oppositeAction = function(action) {\n return action == 'show' ? 'hide' : 'show';\n };\n\n /**\n * Change the attribute values of the user visibility link in the online users block.\n *\n * @method changeVisibilityLinkAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityLinkAttr = function(action) {\n getTitle(action).then(function(title) {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).attr({\n 'data-action': action,\n 'title': title\n });\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Change the attribute values of the user visibility icon in the online users block.\n *\n * @method changeVisibilityIconAttr\n * @param {String} action\n * @private\n */\n var changeVisibilityIconAttr = function(action) {\n var icon = $(SELECTORS.CHANGE_VISIBILITY_ICON);\n getTitle(action).then(function(title) {\n // Add the proper title to the icon.\n $(icon).attr({\n 'title': title,\n 'aria-label': title\n });\n // If the icon is an image.\n if (icon.is(\"img\")) {\n $(icon).attr({\n 'src': M.util.image_url('t/' + action),\n 'alt': title\n });\n } else {\n // Add the new icon class and remove the old one.\n $(icon).addClass(getIconClass(action));\n $(icon).removeClass(getIconClass(oppositeAction(action)));\n }\n return;\n }).catch(Notification.exception);\n };\n\n /**\n * Get the proper class for the user visibility icon in the online users block.\n *\n * @method getIconClass\n * @param {String} action\n * @return {String}\n * @private\n */\n var getIconClass = function(action) {\n return action == 'show' ? 'fa-eye-slash' : 'fa-eye';\n };\n\n /**\n * Get the title description of the user visibility link in the online users block.\n *\n * @method getTitle\n * @param {String} action\n * @return {object} jQuery promise\n * @private\n */\n var getTitle = function(action) {\n return Str.get_string('online_status:' + action, 'block_online_users');\n };\n\n return {\n // Public variables and functions.\n /**\n * Initialise change user visibility function.\n *\n * @method init\n */\n init: function() {\n $(SELECTORS.CHANGE_VISIBILITY_LINK).on('click', function(e) {\n e.preventDefault();\n var action = ($(this).attr('data-action'));\n var userid = ($(this).attr('data-userid'));\n changeVisibility(action, userid);\n });\n }\n };\n});\n"],"file":"change_user_visibility.min.js"} \ No newline at end of file diff --git a/blocks/recentlyaccessedcourses/amd/build/main.min.js b/blocks/recentlyaccessedcourses/amd/build/main.min.js index e76490aa13f33..6c3de1c93c6a3 100644 --- a/blocks/recentlyaccessedcourses/amd/build/main.min.js +++ b/blocks/recentlyaccessedcourses/amd/build/main.min.js @@ -1 +1,2 @@ -define(["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/paged_content_paging_bar","core/templates","core_course/events","core_course/repository"],function(a,b,c,d,e,f,g,h){var i=10,j={CARD_CONTAINER:'[data-region="card-deck"]',COURSE_IS_FAVOURITE:'[data-region="is-favourite"]',CONTENT:'[data-region="view-content"]',EMPTY_MESSAGE:'[data-region="empty-message"]',LOADING_PLACEHOLDER:'[data-region="loading-placeholder"]',PAGING_BAR:'[data-region="paging-bar"]',PAGING_BAR_NEXT:'[data-control="next"]',PAGING_BAR_PREVIOUS:'[data-control="previous"]'},k=!1,l=[],m=null,n=null,o=0,p=1,q=function(a){a.find(j.EMPTY_MESSAGE).removeClass("hidden"),a.find(j.LOADING_PLACEHOLDER).addClass("hidden"),a.find(j.CONTENT).addClass("hidden")},r=function(a){a.find(j.CONTENT).removeClass("hidden"),a.find(j.EMPTY_MESSAGE).addClass("hidden"),a.find(j.LOADING_PLACEHOLDER).addClass("hidden")},s=function(a){var b=a.find(j.PAGING_BAR);b.css("opacity",1),b.css("visibility","visible"),b.attr("aria-hidden","false")},t=function(a){var b=a.find(j.PAGING_BAR);b.css("opacity",0),b.css("visibility","hidden"),b.attr("aria-hidden","true")},u=function(a,b){l.forEach(function(a){a.attr("data-course-id")==b&&a.find(j.COURSE_IS_FAVOURITE).removeClass("hidden")})},v=function(a,b){l.forEach(function(a){a.attr("data-course-id")==b&&a.find(j.COURSE_IS_FAVOURITE).addClass("hidden")})},w=function(b){var d=b.map(function(a){return f.render("block_recentlyaccessedcourses/course-card",a)});return a.when.apply(null,d).then(function(){var b=[];return d.forEach(function(d){d.then(function(c){b.push(a(c))})["catch"](c.exception)}),b})},x=function(a){return h.getLastAccessedCourses(a,i).then(function(a){return w(a)})},y=function(a){var b=a.find(j.CONTENT).find(j.CARD_CONTAINER),c=parseFloat(a.css("width")),d=l.length,f=0;if(n||(b.html(l[0]),n=l[0].outerWidth(!0)),p=Math.floor(c/n),o+p=0?f:0}var h=l.slice(f,f+p),i=h.reduce(function(a,b){return a+b.attr("data-course-id")},"");if(l.length>h.length?(b.addClass("justify-content-center"),b.removeClass("justify-content-start")):(b.removeClass("justify-content-center"),b.addClass("justify-content-start")),m!=i){var k=a.find(e.rootSelector);b.html(h),m=i,p>=l.length?t(a):(s(a),0===o?e.disablePreviousControlButtons(k):e.enablePreviousControlButtons(k),o+p>=l.length?e.disableNextControlButtons(k):e.enableNextControlButtons(k))}},z=function(c){var e=null,f=!1;d.subscribe(g.favourited,function(a){u(c,a)}),d.subscribe(g.unfavorited,function(a){v(c,a)}),d.subscribe("nav-drawer-toggle-start",function(){if(k&&l.length&&!f){f=!0;var a=0,b=function(){setTimeout(function(){y(c),a++,a<5&&f&&b()},100)};b(c)}}),d.subscribe("nav-drawer-toggle-end",function(){f=!1}),a(window).on("resize",function(){k&&l.length&&(e||(e=setTimeout(function(){e=null,y(c)},66)))}),b.define(c,[b.events.activate]),c.on(b.events.activate,j.PAGING_BAR_NEXT,function(b,d){var e=a(b.target).closest(j.PAGING_BAR_NEXT);e.hasClass("disabled")||(o+=p,y(c)),d.originalEvent.preventDefault()}),c.on(b.events.activate,j.PAGING_BAR_PREVIOUS,function(b,d){var e=a(b.target).closest(j.PAGING_BAR_PREVIOUS);e.hasClass("disabled")||(o-=p,o=o<0?0:o,y(c)),d.originalEvent.preventDefault()})},A=function(b,d){d=a(d),z(d),x(b).then(function(a){l=a,k=!0,l.length?(r(d),y(d)):q(d)})["catch"](c.exception)};return{init:A}}); \ No newline at end of file +define ("block_recentlyaccessedcourses/main",["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/paged_content_paging_bar","core/templates","core_course/events","core_course/repository"],function(a,b,c,d,e,f,g,h){var i={CARD_CONTAINER:"[data-region=\"card-deck\"]",COURSE_IS_FAVOURITE:"[data-region=\"is-favourite\"]",CONTENT:"[data-region=\"view-content\"]",EMPTY_MESSAGE:"[data-region=\"empty-message\"]",LOADING_PLACEHOLDER:"[data-region=\"loading-placeholder\"]",PAGING_BAR:"[data-region=\"paging-bar\"]",PAGING_BAR_NEXT:"[data-control=\"next\"]",PAGING_BAR_PREVIOUS:"[data-control=\"previous\"]"},j=!1,k=[],l=null,m=null,n=0,o=1,p=function(a){a.find(i.EMPTY_MESSAGE).removeClass("hidden");a.find(i.LOADING_PLACEHOLDER).addClass("hidden");a.find(i.CONTENT).addClass("hidden")},q=function(a){a.find(i.CONTENT).removeClass("hidden");a.find(i.EMPTY_MESSAGE).addClass("hidden");a.find(i.LOADING_PLACEHOLDER).addClass("hidden")},r=function(a){var b=a.find(i.PAGING_BAR);b.css("opacity",1);b.css("visibility","visible");b.attr("aria-hidden","false")},s=function(a){var b=a.find(i.PAGING_BAR);b.css("opacity",0);b.css("visibility","hidden");b.attr("aria-hidden","true")},t=function(a,b){k.forEach(function(a){if(a.attr("data-course-id")==b){a.find(i.COURSE_IS_FAVOURITE).removeClass("hidden")}})},u=function(a,b){k.forEach(function(a){if(a.attr("data-course-id")==b){a.find(i.COURSE_IS_FAVOURITE).addClass("hidden")}})},v=function(b){var d=b.map(function(a){return f.render("block_recentlyaccessedcourses/course-card",a)});return a.when.apply(null,d).then(function(){var b=[];d.forEach(function(d){d.then(function(c){b.push(a(c))}).catch(c.exception)});return b})},w=function(a){return h.getLastAccessedCourses(a,10).then(function(a){return v(a)})},x=function(a){var b=a.find(i.CONTENT).find(i.CARD_CONTAINER),c=parseFloat(a.css("width")),d=k.length,f=0;if(!m){b.html(k[0]);m=k[0].outerWidth(!0)}o=Math.floor(c/m);if(n+oh.length){b.addClass("justify-content-center");b.removeClass("justify-content-start")}else{b.removeClass("justify-content-center");b.addClass("justify-content-start")}if(l!=j){var p=a.find(e.rootSelector);b.html(h);l=j;if(o>=k.length){s(a)}else{r(a);if(0===n){e.disablePreviousControlButtons(p)}else{e.enablePreviousControlButtons(p)}if(n+o>=k.length){e.disableNextControlButtons(p)}else{e.enableNextControlButtons(p)}}}},y=function(c){var e=null,f=!1;d.subscribe(g.favourited,function(a){t(c,a)});d.subscribe(g.unfavorited,function(a){u(c,a)});d.subscribe("nav-drawer-toggle-start",function(){if(!j||!k.length||f){return}f=!0;var a=0,b=function(){setTimeout(function(){x(c);a++;if(5>a&&f){b()}},100)};b(c)});d.subscribe("nav-drawer-toggle-end",function(){f=!1});a(window).on("resize",function(){if(!j||!k.length){return}if(!e){e=setTimeout(function(){e=null;x(c)},66)}});b.define(c,[b.events.activate]);c.on(b.events.activate,i.PAGING_BAR_NEXT,function(b,d){var e=a(b.target).closest(i.PAGING_BAR_NEXT);if(!e.hasClass("disabled")){n=n+o;x(c)}d.originalEvent.preventDefault()});c.on(b.events.activate,i.PAGING_BAR_PREVIOUS,function(b,d){var e=a(b.target).closest(i.PAGING_BAR_PREVIOUS);if(!e.hasClass("disabled")){n=n-o;n=0>n?0:n;x(c)}d.originalEvent.preventDefault()})};return{init:function init(b,d){d=a(d);y(d);w(b).then(function(a){k=a;j=!0;if(k.length){q(d);x(d)}else{p(d)}}).catch(c.exception)}}}); +//# sourceMappingURL=main.min.js.map diff --git a/blocks/recentlyaccessedcourses/amd/build/main.min.js.map b/blocks/recentlyaccessedcourses/amd/build/main.min.js.map new file mode 100644 index 0000000000000..d8e8d129f3984 --- /dev/null +++ b/blocks/recentlyaccessedcourses/amd/build/main.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/main.js"],"names":["define","$","CustomEvents","Notification","PubSub","PagedContentPagingBar","Templates","CourseEvents","CoursesRepository","SELECTORS","CARD_CONTAINER","COURSE_IS_FAVOURITE","CONTENT","EMPTY_MESSAGE","LOADING_PLACEHOLDER","PAGING_BAR","PAGING_BAR_NEXT","PAGING_BAR_PREVIOUS","contentLoaded","allCourses","visibleCoursesId","cardWidth","viewIndex","availableVisibleCards","showEmptyMessage","root","find","removeClass","addClass","showContent","showPagingBar","pagingBar","css","attr","hidePagingBar","favouriteCourse","courseId","forEach","course","unfavouriteCourse","renderAllCourses","courses","promises","map","render","when","apply","then","renderedCourses","promise","html","push","catch","exception","loadContent","userid","getLastAccessedCourses","recalculateVisibleCourses","container","availableWidth","parseFloat","numberOfCourses","length","start","outerWidth","Math","floor","overflow","coursesToShow","slice","newVisibleCoursesId","reduce","carry","rootSelector","disablePreviousControlButtons","enablePreviousControlButtons","disableNextControlButtons","enableNextControlButtons","registerEventListeners","resizeTimeout","drawerToggling","subscribe","favourited","unfavorited","recalculationCount","doRecalculation","setTimeout","window","on","events","activate","e","data","button","target","closest","hasClass","originalEvent","preventDefault","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to initialise the Recently accessed courses block.\n *\n * @module block_recentlyaccessedcourses/main.js\n * @package block_recentlyaccessedcourses\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'core/custom_interaction_events',\n 'core/notification',\n 'core/pubsub',\n 'core/paged_content_paging_bar',\n 'core/templates',\n 'core_course/events',\n 'core_course/repository',\n ],\n function(\n $,\n CustomEvents,\n Notification,\n PubSub,\n PagedContentPagingBar,\n Templates,\n CourseEvents,\n CoursesRepository\n ) {\n\n // Constants.\n var NUM_COURSES_TOTAL = 10;\n var SELECTORS = {\n CARD_CONTAINER: '[data-region=\"card-deck\"]',\n COURSE_IS_FAVOURITE: '[data-region=\"is-favourite\"]',\n CONTENT: '[data-region=\"view-content\"]',\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n LOADING_PLACEHOLDER: '[data-region=\"loading-placeholder\"]',\n PAGING_BAR: '[data-region=\"paging-bar\"]',\n PAGING_BAR_NEXT: '[data-control=\"next\"]',\n PAGING_BAR_PREVIOUS: '[data-control=\"previous\"]'\n };\n // Module variables.\n var contentLoaded = false;\n var allCourses = [];\n var visibleCoursesId = null;\n var cardWidth = null;\n var viewIndex = 0;\n var availableVisibleCards = 1;\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showEmptyMessage = function(root) {\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n root.find(SELECTORS.CONTENT).addClass('hidden');\n };\n\n /**\n * Show the empty message when no course are found.\n *\n * @param {object} root The root element for the courses view.\n */\n var showContent = function(root) {\n root.find(SELECTORS.CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n root.find(SELECTORS.LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Show the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var showPagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 1);\n pagingBar.css('visibility', 'visible');\n pagingBar.attr('aria-hidden', 'false');\n };\n\n /**\n * Hide the paging bar.\n *\n * @param {object} root The root element for the courses view.\n */\n var hidePagingBar = function(root) {\n var pagingBar = root.find(SELECTORS.PAGING_BAR);\n pagingBar.css('opacity', 0);\n pagingBar.css('visibility', 'hidden');\n pagingBar.attr('aria-hidden', 'true');\n };\n\n /**\n * Show the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be favourited.\n */\n var favouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).removeClass('hidden');\n }\n });\n };\n\n /**\n * Hide the favourite indicator for the given course (if it's in the list).\n *\n * @param {object} root The root element for the courses view.\n * @param {number} courseId The id of the course to be unfavourited.\n */\n var unfavouriteCourse = function(root, courseId) {\n allCourses.forEach(function(course) {\n if (course.attr('data-course-id') == courseId) {\n course.find(SELECTORS.COURSE_IS_FAVOURITE).addClass('hidden');\n }\n });\n };\n\n /**\n * Render the a list of courses.\n *\n * @param {array} courses containing array of courses.\n * @return {promise} Resolved with list of rendered courses as jQuery objects.\n */\n var renderAllCourses = function(courses) {\n var promises = courses.map(function(course) {\n return Templates.render('block_recentlyaccessedcourses/course-card', course);\n });\n\n return $.when.apply(null, promises).then(function() {\n var renderedCourses = [];\n\n promises.forEach(function(promise) {\n promise.then(function(html) {\n renderedCourses.push($(html));\n return;\n })\n .catch(Notification.exception);\n });\n\n return renderedCourses;\n });\n };\n\n /**\n * Fetch user's recently accessed courses and reload the content of the block.\n *\n * @param {int} userid User whose courses will be shown\n * @returns {promise} The updated content for the block.\n */\n var loadContent = function(userid) {\n return CoursesRepository.getLastAccessedCourses(userid, NUM_COURSES_TOTAL)\n .then(function(courses) {\n return renderAllCourses(courses);\n });\n };\n\n /**\n * Recalculate the number of courses that should be visible.\n *\n * @param {object} root The root element for the courses view.\n */\n var recalculateVisibleCourses = function(root) {\n var container = root.find(SELECTORS.CONTENT).find(SELECTORS.CARD_CONTAINER);\n var availableWidth = parseFloat(root.css('width'));\n var numberOfCourses = allCourses.length;\n var start = 0;\n\n if (!cardWidth) {\n container.html(allCourses[0]);\n // Render one card initially to calculate the width of the cards\n // including the margins.\n cardWidth = allCourses[0].outerWidth(true);\n }\n\n availableVisibleCards = Math.floor(availableWidth / cardWidth);\n\n if (viewIndex + availableVisibleCards < numberOfCourses) {\n start = viewIndex;\n } else {\n var overflow = (viewIndex + availableVisibleCards) - numberOfCourses;\n start = viewIndex - overflow;\n start = start >= 0 ? start : 0;\n }\n\n var coursesToShow = allCourses.slice(start, start + availableVisibleCards);\n // Create an id for the list of courses we expect to be displayed.\n var newVisibleCoursesId = coursesToShow.reduce(function(carry, course) {\n return carry + course.attr('data-course-id');\n }, '');\n\n // Centre the courses if we have an overflow of courses.\n if (allCourses.length > coursesToShow.length) {\n container.addClass('justify-content-center');\n container.removeClass('justify-content-start');\n } else {\n container.removeClass('justify-content-center');\n container.addClass('justify-content-start');\n }\n\n // Don't bother updating the DOM unless the visible courses have changed.\n if (visibleCoursesId != newVisibleCoursesId) {\n var pagingBar = root.find(PagedContentPagingBar.rootSelector);\n container.html(coursesToShow);\n visibleCoursesId = newVisibleCoursesId;\n\n if (availableVisibleCards >= allCourses.length) {\n hidePagingBar(root);\n } else {\n showPagingBar(root);\n\n if (viewIndex === 0) {\n PagedContentPagingBar.disablePreviousControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enablePreviousControlButtons(pagingBar);\n }\n\n if (viewIndex + availableVisibleCards >= allCourses.length) {\n PagedContentPagingBar.disableNextControlButtons(pagingBar);\n } else {\n PagedContentPagingBar.enableNextControlButtons(pagingBar);\n }\n }\n }\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var registerEventListeners = function(root) {\n var resizeTimeout = null;\n var drawerToggling = false;\n\n PubSub.subscribe(CourseEvents.favourited, function(courseId) {\n favouriteCourse(root, courseId);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function(courseId) {\n unfavouriteCourse(root, courseId);\n });\n\n PubSub.subscribe('nav-drawer-toggle-start', function() {\n if (!contentLoaded || !allCourses.length || drawerToggling) {\n // Nothing to recalculate.\n return;\n }\n\n drawerToggling = true;\n var recalculationCount = 0;\n // This function is going to recalculate the number of courses while\n // the nav drawer is opening or closes (up to a maximum of 5 recalcs).\n var doRecalculation = function() {\n setTimeout(function() {\n recalculateVisibleCourses(root);\n recalculationCount++;\n\n if (recalculationCount < 5 && drawerToggling) {\n // If we haven't done too many recalculations and the drawer\n // is still toggling then recurse.\n doRecalculation();\n }\n }, 100);\n };\n\n // Start the recalculations.\n doRecalculation(root);\n });\n\n PubSub.subscribe('nav-drawer-toggle-end', function() {\n drawerToggling = false;\n });\n\n $(window).on('resize', function() {\n if (!contentLoaded || !allCourses.length) {\n // Nothing to reclculate.\n return;\n }\n\n // Resize events fire rapidly so recalculating the visible courses each\n // time can be expensive. Let's debounce them,\n if (!resizeTimeout) {\n resizeTimeout = setTimeout(function() {\n resizeTimeout = null;\n recalculateVisibleCourses(root);\n // The recalculateVisibleCourses function will execute at a rate of 15fps.\n }, 66);\n }\n });\n\n CustomEvents.define(root, [CustomEvents.events.activate]);\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_NEXT, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_NEXT);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex + availableVisibleCards;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n\n root.on(CustomEvents.events.activate, SELECTORS.PAGING_BAR_PREVIOUS, function(e, data) {\n var button = $(e.target).closest(SELECTORS.PAGING_BAR_PREVIOUS);\n if (!button.hasClass('disabled')) {\n viewIndex = viewIndex - availableVisibleCards;\n viewIndex = viewIndex < 0 ? 0 : viewIndex;\n recalculateVisibleCourses(root);\n }\n\n data.originalEvent.preventDefault();\n });\n };\n\n /**\n * Get and show the recent courses into the block.\n *\n * @param {int} userid User from which the courses will be obtained\n * @param {object} root The root element for the recentlyaccessedcourses block.\n */\n var init = function(userid, root) {\n root = $(root);\n\n registerEventListeners(root);\n loadContent(userid)\n .then(function(renderedCourses) {\n allCourses = renderedCourses;\n contentLoaded = true;\n\n if (allCourses.length) {\n showContent(root);\n recalculateVisibleCourses(root);\n } else {\n showEmptyMessage(root);\n }\n\n return;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });\n"],"file":"main.min.js"} \ No newline at end of file diff --git a/blocks/recentlyaccesseditems/amd/build/main.min.js b/blocks/recentlyaccesseditems/amd/build/main.min.js index d4daa0f0a5df8..0f3c4882a1e83 100644 --- a/blocks/recentlyaccesseditems/amd/build/main.min.js +++ b/blocks/recentlyaccesseditems/amd/build/main.min.js @@ -1 +1,2 @@ -define(["jquery","block_recentlyaccesseditems/repository","core/templates","core/notification"],function(a,b,c,d){var e=9,f={CARDDECK_CONTAINER:'[data-region="recentlyaccesseditems-view"]',CARDDECK:'[data-region="recentlyaccesseditems-view-content"]'},g=function(a){return b.getRecentItems(a)},h=function(a,b){if(b.length>0)return c.render("block_recentlyaccesseditems/view-cards",{items:b});var d=a.attr("data-noitemsimgurl");return c.render("block_recentlyaccesseditems/no-items",{noitemsimgurl:d})},i=function(b){b=a(b);var i=b.find(f.CARDDECK_CONTAINER),j=b.find(f.CARDDECK),k=g(e);k.then(function(a){var b=h(i,a);return b.then(function(a,b){return c.replaceNodeContents(j,a,b)})["catch"](d.exception),k})["catch"](d.exception)};return{init:i}}); \ No newline at end of file +define ("block_recentlyaccesseditems/main",["jquery","block_recentlyaccesseditems/repository","core/templates","core/notification"],function(a,b,c,d){var e={CARDDECK_CONTAINER:"[data-region=\"recentlyaccesseditems-view\"]",CARDDECK:"[data-region=\"recentlyaccesseditems-view-content\"]"},f=function(a){return b.getRecentItems(a)},g=function(a,b){if(0.\n\n/**\n * Javascript to initialise the Recently accessed items block.\n *\n * @module block_recentlyaccesseditems/main\n * @package block_recentlyaccesseditems\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n [\n 'jquery',\n 'block_recentlyaccesseditems/repository',\n 'core/templates',\n 'core/notification'\n ],\n function(\n $,\n Repository,\n Templates,\n Notification\n ) {\n\n var NUM_ITEMS = 9;\n\n var SELECTORS = {\n CARDDECK_CONTAINER: '[data-region=\"recentlyaccesseditems-view\"]',\n CARDDECK: '[data-region=\"recentlyaccesseditems-view-content\"]',\n };\n\n /**\n * Get recent items from backend.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {array} Items user most recently has accessed\n */\n var getRecentItems = function(limit) {\n return Repository.getRecentItems(limit);\n };\n\n /**\n * Render the block content.\n *\n * @method renderItems\n * @param {object} root The root element for the items view.\n * @param {array} items containing array of returned items.\n * @return {promise} Resolved with HTML and JS strings\n */\n var renderItems = function(root, items) {\n if (items.length > 0) {\n return Templates.render('block_recentlyaccesseditems/view-cards', {\n items: items\n });\n } else {\n var noitemsimgurl = root.attr('data-noitemsimgurl');\n return Templates.render('block_recentlyaccesseditems/no-items', {\n noitemsimgurl: noitemsimgurl\n });\n }\n };\n\n /**\n * Get and show the recent items into the block.\n *\n * @param {object} root The root element for the items block.\n */\n var init = function(root) {\n root = $(root);\n\n var itemsContainer = root.find(SELECTORS.CARDDECK_CONTAINER);\n var itemsContent = root.find(SELECTORS.CARDDECK);\n\n var itemsPromise = getRecentItems(NUM_ITEMS);\n\n itemsPromise.then(function(items) {\n var pageContentPromise = renderItems(itemsContainer, items);\n\n pageContentPromise.then(function(html, js) {\n return Templates.replaceNodeContents(itemsContent, html, js);\n }).catch(Notification.exception);\n return itemsPromise;\n }).catch(Notification.exception);\n };\n\n return {\n init: init\n };\n });"],"file":"main.min.js"} \ No newline at end of file diff --git a/blocks/recentlyaccesseditems/amd/build/repository.min.js b/blocks/recentlyaccesseditems/amd/build/repository.min.js index fa504bbb65520..f86b1960b048e 100644 --- a/blocks/recentlyaccesseditems/amd/build/repository.min.js +++ b/blocks/recentlyaccesseditems/amd/build/repository.min.js @@ -1 +1,2 @@ -define(["core/ajax"],function(a){var b=function(b){var c={};"undefined"!=typeof b&&(c.limit=b);var d={methodname:"block_recentlyaccesseditems_get_recent_items",args:c};return a.call([d])[0]};return{getRecentItems:b}}); \ No newline at end of file +define ("block_recentlyaccesseditems/repository",["core/ajax"],function(a){return{getRecentItems:function getRecentItems(b){var c={};if("undefined"!=typeof b){c.limit=b}return a.call([{methodname:"block_recentlyaccesseditems_get_recent_items",args:c}])[0]}}}); +//# sourceMappingURL=repository.min.js.map diff --git a/blocks/recentlyaccesseditems/amd/build/repository.min.js.map b/blocks/recentlyaccesseditems/amd/build/repository.min.js.map new file mode 100644 index 0000000000000..2a17bd0b5b1ea --- /dev/null +++ b/blocks/recentlyaccesseditems/amd/build/repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/repository.js"],"names":["define","Ajax","getRecentItems","limit","args","call","methodname"],"mappings":"AAuBAA,OAAM,0CAAC,CAAC,WAAD,CAAD,CAAgB,SAASC,CAAT,CAAe,CAoBjC,MAAO,CACHC,cAAc,CAZG,QAAjBA,CAAAA,cAAiB,CAASC,CAAT,CAAgB,CACjC,GAAIC,CAAAA,CAAI,CAAG,EAAX,CACA,GAAqB,WAAjB,QAAOD,CAAAA,CAAX,CAAkC,CAC9BC,CAAI,CAACD,KAAL,CAAaA,CAChB,CAKD,MAAOF,CAAAA,CAAI,CAACI,IAAL,CAAU,CAJH,CACVC,UAAU,CAAE,8CADF,CAEVF,IAAI,CAAEA,CAFI,CAIG,CAAV,EAAqB,CAArB,CACV,CACM,CAGV,CAvBK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handle user ajax actions.\n *\n * @module block_recentlyaccesseditems/repository\n * @package block_recentlyaccesseditems\n * @copyright 2018 Victor Deniz \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/ajax'], function(Ajax) {\n\n /**\n * Get the list of items that the user has most recently accessed.\n *\n * @method getRecentItems\n * @param {int} limit Only return this many results\n * @return {promise} Resolved with an array of items\n */\n var getRecentItems = function(limit) {\n var args = {};\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n var request = {\n methodname: 'block_recentlyaccesseditems_get_recent_items',\n args: args\n };\n return Ajax.call([request])[0];\n };\n return {\n getRecentItems: getRecentItems\n };\n});"],"file":"repository.min.js"} \ No newline at end of file diff --git a/blocks/settings/amd/build/settingsblock.min.js b/blocks/settings/amd/build/settingsblock.min.js index 1cebc858d7de4..1bce461ca9072 100644 --- a/blocks/settings/amd/build/settingsblock.min.js +++ b/blocks/settings/amd/build/settingsblock.min.js @@ -1 +1,2 @@ -define(["jquery","core/tree"],function(a,b){return{init:function(a,c){var d=new b(".block_settings .block_tree");if(c){var e=d.treeRoot.find("#"+c),f=e.children("a").first();f.replaceWith(''+f.html()+"")}d.finishExpandingGroup=function(c){b.prototype.finishExpandingGroup.call(this,c),Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})},d.collapseGroup=function(c){b.prototype.collapseGroup.call(this,c),Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})}}}}); \ No newline at end of file +define ("block_settings/settingsblock",["jquery","core/tree"],function(a,b){return{init:function init(a,c){var d=new b(".block_settings .block_tree");if(c){var e=d.treeRoot.find("#"+c),f=e.children("a").first();f.replaceWith(""+f.html()+"")}d.finishExpandingGroup=function(c){b.prototype.finishExpandingGroup.call(this,c);Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})};d.collapseGroup=function(c){b.prototype.collapseGroup.call(this,c);Y.use("moodle-core-event",function(){Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED,{instanceid:a})})}}}}); +//# sourceMappingURL=settingsblock.min.js.map diff --git a/blocks/settings/amd/build/settingsblock.min.js.map b/blocks/settings/amd/build/settingsblock.min.js.map new file mode 100644 index 0000000000000..1696676c47094 --- /dev/null +++ b/blocks/settings/amd/build/settingsblock.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/settingsblock.js"],"names":["define","$","Tree","init","instanceid","siteAdminNodeId","adminTree","siteAdminNode","treeRoot","find","siteAdminLink","children","first","replaceWith","html","finishExpandingGroup","item","prototype","call","Y","use","Global","fire","M","core","globalEvents","BLOCK_CONTENT_UPDATED","collapseGroup"],"mappings":"AAuBAA,OAAM,gCAAC,CAAC,QAAD,CAAW,WAAX,CAAD,CAA0B,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CAC9C,MAAO,CACHC,IAAI,CAAE,cAASC,CAAT,CAAqBC,CAArB,CAAsC,CACxC,GAAIC,CAAAA,CAAS,CAAG,GAAIJ,CAAAA,CAAJ,CAAS,6BAAT,CAAhB,CACA,GAAIG,CAAJ,CAAqB,IACbE,CAAAA,CAAa,CAAGD,CAAS,CAACE,QAAV,CAAmBC,IAAnB,CAAwB,IAAMJ,CAA9B,CADH,CAEbK,CAAa,CAAGH,CAAa,CAACI,QAAd,CAAuB,GAAvB,EAA4BC,KAA5B,EAFH,CAGjBF,CAAa,CAACG,WAAd,CAA0B,wBAAwBH,CAAa,CAACI,IAAd,EAAxB,CAA+C,SAAzE,CACH,CACDR,CAAS,CAACS,oBAAV,CAAiC,SAASC,CAAT,CAAe,CAC5Cd,CAAI,CAACe,SAAL,CAAeF,oBAAf,CAAoCG,IAApC,CAAyC,IAAzC,CAA+CF,CAA/C,EACAG,CAAC,CAACC,GAAF,CAAM,mBAAN,CAA2B,UAAW,CAClCD,CAAC,CAACE,MAAF,CAASC,IAAT,CAAcC,CAAC,CAACC,IAAF,CAAOC,YAAP,CAAoBC,qBAAlC,CAAyD,CACrDtB,UAAU,CAAEA,CADyC,CAAzD,CAGH,CAJD,CAKH,CAPD,CAQAE,CAAS,CAACqB,aAAV,CAA0B,SAASX,CAAT,CAAe,CACrCd,CAAI,CAACe,SAAL,CAAeU,aAAf,CAA6BT,IAA7B,CAAkC,IAAlC,CAAwCF,CAAxC,EACAG,CAAC,CAACC,GAAF,CAAM,mBAAN,CAA2B,UAAW,CAClCD,CAAC,CAACE,MAAF,CAASC,IAAT,CAAcC,CAAC,CAACC,IAAF,CAAOC,YAAP,CAAoBC,qBAAlC,CAAyD,CACrDtB,UAAU,CAAEA,CADyC,CAAzD,CAGH,CAJD,CAKH,CACJ,CAxBE,CA0BV,CA3BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Load the settings block tree javscript\n *\n * @module block_settings/settingsblock\n * @package core\n * @copyright 2015 John Okely \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/tree'], function($, Tree) {\n return {\n init: function(instanceid, siteAdminNodeId) {\n var adminTree = new Tree(\".block_settings .block_tree\");\n if (siteAdminNodeId) {\n var siteAdminNode = adminTree.treeRoot.find('#' + siteAdminNodeId);\n var siteAdminLink = siteAdminNode.children('a').first();\n siteAdminLink.replaceWith('' + siteAdminLink.html() + '');\n }\n adminTree.finishExpandingGroup = function(item) {\n Tree.prototype.finishExpandingGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n adminTree.collapseGroup = function(item) {\n Tree.prototype.collapseGroup.call(this, item);\n Y.use('moodle-core-event', function() {\n Y.Global.fire(M.core.globalEvents.BLOCK_CONTENT_UPDATED, {\n instanceid: instanceid\n });\n });\n };\n }\n };\n});\n"],"file":"settingsblock.min.js"} \ No newline at end of file diff --git a/blocks/starredcourses/amd/build/main.min.js b/blocks/starredcourses/amd/build/main.min.js index 9b9beb924559f..bb939cd680019 100644 --- a/blocks/starredcourses/amd/build/main.min.js +++ b/blocks/starredcourses/amd/build/main.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","block_starredcourses/repository","core/pubsub","core/templates","core_course/events"],function(a,b,c,d,e,f){var g={STARRED_COURSES_REGION_VIEW:'[data-region="starred-courses-view"]',STARRED_COURSES_REGION:'[data-region="starred-courses-view-content"]'},h=function(a,b){if(b.length>0)return e.render("core_course/view-cards",{courses:b});var c=a.find(g.STARRED_COURSES_REGION_VIEW).attr("data-nocoursesimg");return e.render("block_starredcourses/no-courses",{nocoursesimg:c})},i=function(a){var d=a.find(g.STARRED_COURSES_REGION),f={limit:0,offset:0};return c.getStarredCourses(f).then(function(b){return h(a,b)}).then(function(a,b){return e.replaceNodeContents(d,a,b)})["catch"](b.exception)},j=function(a){d.subscribe(f.favourited,function(){i(a)}),d.subscribe(f.unfavorited,function(){i(a)})},k=function(b){b=a(b),j(b),i(b)};return{init:k}}); \ No newline at end of file +define ("block_starredcourses/main",["jquery","core/notification","block_starredcourses/repository","core/pubsub","core/templates","core_course/events"],function(a,b,c,d,e,f){var g={STARRED_COURSES_REGION_VIEW:"[data-region=\"starred-courses-view\"]",STARRED_COURSES_REGION:"[data-region=\"starred-courses-view-content\"]"},h=function(a,b){if(0.\n\n/**\n * Javascript to initialise the starred courses block.\n *\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'block_starredcourses/repository',\n 'core/pubsub',\n 'core/templates',\n 'core_course/events'\n],\nfunction(\n $,\n Notification,\n Repository,\n PubSub,\n Templates,\n CourseEvents\n) {\n\n var SELECTORS = {\n STARRED_COURSES_REGION_VIEW: '[data-region=\"starred-courses-view\"]',\n STARRED_COURSES_REGION: '[data-region=\"starred-courses-view-content\"]'\n };\n\n /**\n * Render the starred courses.\n *\n * @method renderCourses\n * @param {object} root The root element for the starred view.\n * @param {array} courses containing array of returned courses.\n * @returns {promise} Resolved with HTML and JS strings\n */\n var renderCourses = function(root, courses) {\n if (courses.length > 0) {\n return Templates.render('core_course/view-cards', {\n courses: courses\n });\n } else {\n var nocoursesimg = root.find(SELECTORS.STARRED_COURSES_REGION_VIEW).attr('data-nocoursesimg');\n return Templates.render('block_starredcourses/no-courses', {\n nocoursesimg: nocoursesimg\n });\n }\n };\n\n /**\n * Fetch user's starred courses and reload the content of the block.\n *\n * @param {object} root The root element for the starred view.\n * @returns {promise} The updated content for the block.\n */\n var reloadContent = function(root) {\n var content = root.find(SELECTORS.STARRED_COURSES_REGION);\n\n var args = {\n limit: 0,\n offset: 0,\n };\n\n return Repository.getStarredCourses(args)\n .then(function(courses) {\n return renderCourses(root, courses);\n }).then(function(html, js) {\n return Templates.replaceNodeContents(content, html, js);\n }).catch(Notification.exception);\n };\n\n /**\n * Register event listeners for the block.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n PubSub.subscribe(CourseEvents.favourited, function() {\n reloadContent(root);\n });\n\n PubSub.subscribe(CourseEvents.unfavorited, function() {\n reloadContent(root);\n });\n };\n\n /**\n * Initialise all of the modules for the starred courses block.\n *\n * @param {object} root The root element for the block.\n */\n var init = function(root) {\n root = $(root);\n\n registerEventListeners(root);\n reloadContent(root);\n };\n\n return {\n init: init\n };\n});\n"],"file":"main.min.js"} \ No newline at end of file diff --git a/blocks/starredcourses/amd/build/repository.min.js b/blocks/starredcourses/amd/build/repository.min.js index 7c886009989ce..98c45aad3e377 100644 --- a/blocks/starredcourses/amd/build/repository.min.js +++ b/blocks/starredcourses/amd/build/repository.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){var d=function(a){var d={methodname:"block_starredcourses_get_starred_courses",args:a},e=b.call([d])[0];return e.fail(c.exception),e};return{getStarredCourses:d}}); \ No newline at end of file +define ("block_starredcourses/repository",["jquery","core/ajax","core/notification"],function(a,b,c){return{getStarredCourses:function getStarredCourses(a){var d=b.call([{methodname:"block_starredcourses_get_starred_courses",args:a}])[0];d.fail(c.exception);return d}}}); +//# sourceMappingURL=repository.min.js.map diff --git a/blocks/starredcourses/amd/build/repository.min.js.map b/blocks/starredcourses/amd/build/repository.min.js.map new file mode 100644 index 0000000000000..41d6b41c4865e --- /dev/null +++ b/blocks/starredcourses/amd/build/repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/repository.js"],"names":["define","$","Ajax","Notification","getStarredCourses","args","promise","call","methodname","fail","exception"],"mappings":"AAsBAA,OAAM,mCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,mBAAxB,CAAD,CAA+C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAAgC,CA2BjF,MAAO,CACHC,iBAAiB,CAfG,QAApBA,CAAAA,iBAAoB,CAASC,CAAT,CAAe,IAO/BC,CAAAA,CAAO,CAAGJ,CAAI,CAACK,IAAL,CAAU,CALV,CACVC,UAAU,CAAE,0CADF,CAEVH,IAAI,CAAEA,CAFI,CAKU,CAAV,EAAqB,CAArB,CAPqB,CASnCC,CAAO,CAACG,IAAR,CAAaN,CAAY,CAACO,SAA1B,EAEA,MAAOJ,CAAAA,CACV,CAEM,CAGV,CA9BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to retrieve user's starred courses.\n *\n * @package block_starredcourses\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n /**\n * Retrieve a list of starred courses.\n *\n * Valid args are:\n * int limit number of records to retrieve\n * int offset the offset of records to retrieve\n *\n * @method getStarredCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of courses\n */\n var getStarredCourses = function(args) {\n\n var request = {\n methodname: 'block_starredcourses_get_starred_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n getStarredCourses: getStarredCourses\n };\n});"],"file":"repository.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/calendar_events_repository.min.js b/blocks/timeline/amd/build/calendar_events_repository.min.js index d9f1640c5df19..94e56a9fb61b6 100644 --- a/blocks/timeline/amd/build/calendar_events_repository.min.js +++ b/blocks/timeline/amd/build/calendar_events_repository.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){var d=20,e=function(a){a.hasOwnProperty("limit")||(a.limit=d),a.limitnum=a.limit,delete a.limit,a.hasOwnProperty("starttime")&&(a.timesortfrom=a.starttime,delete a.starttime),a.hasOwnProperty("endtime")&&(a.timesortto=a.endtime,delete a.endtime);var e={methodname:"core_calendar_get_action_events_by_course",args:a},f=b.call([e])[0];return f.fail(c.exception),f},f=function(a){a.hasOwnProperty("limit")||(a.limit=10),a.limitnum=a.limit,delete a.limit,a.hasOwnProperty("starttime")&&(a.timesortfrom=a.starttime,delete a.starttime),a.hasOwnProperty("endtime")&&(a.timesortto=a.endtime,delete a.endtime);var d={methodname:"core_calendar_get_action_events_by_courses",args:a},e=b.call([d])[0];return e.fail(c.exception),e},g=function(a){a.hasOwnProperty("limit")||(a.limit=d),a.limitnum=a.limit,delete a.limit,a.hasOwnProperty("starttime")&&(a.timesortfrom=a.starttime,delete a.starttime),a.hasOwnProperty("endtime")&&(a.timesortto=a.endtime,delete a.endtime),a.limittononsuspendedevents=!0;var e={methodname:"core_calendar_get_action_events_by_timesort",args:a},f=b.call([e])[0];return f.fail(c.exception),f};return{queryByTime:g,queryByCourse:e,queryByCourses:f}}); \ No newline at end of file +define ("block_timeline/calendar_events_repository",["jquery","core/ajax","core/notification"],function(a,b,c){return{queryByTime:function queryByTime(a){if(!a.hasOwnProperty("limit")){a.limit=20}a.limitnum=a.limit;delete a.limit;if(a.hasOwnProperty("starttime")){a.timesortfrom=a.starttime;delete a.starttime}if(a.hasOwnProperty("endtime")){a.timesortto=a.endtime;delete a.endtime}a.limittononsuspendedevents=!0;var d=b.call([{methodname:"core_calendar_get_action_events_by_timesort",args:a}])[0];d.fail(c.exception);return d},queryByCourse:function queryByCourse(a){if(!a.hasOwnProperty("limit")){a.limit=20}a.limitnum=a.limit;delete a.limit;if(a.hasOwnProperty("starttime")){a.timesortfrom=a.starttime;delete a.starttime}if(a.hasOwnProperty("endtime")){a.timesortto=a.endtime;delete a.endtime}var d=b.call([{methodname:"core_calendar_get_action_events_by_course",args:a}])[0];d.fail(c.exception);return d},queryByCourses:function queryByCourses(a){if(!a.hasOwnProperty("limit")){a.limit=10}a.limitnum=a.limit;delete a.limit;if(a.hasOwnProperty("starttime")){a.timesortfrom=a.starttime;delete a.starttime}if(a.hasOwnProperty("endtime")){a.timesortto=a.endtime;delete a.endtime}var d=b.call([{methodname:"core_calendar_get_action_events_by_courses",args:a}])[0];d.fail(c.exception);return d}}}); +//# sourceMappingURL=calendar_events_repository.min.js.map diff --git a/blocks/timeline/amd/build/calendar_events_repository.min.js.map b/blocks/timeline/amd/build/calendar_events_repository.min.js.map new file mode 100644 index 0000000000000..a4aa5e2b7d2cc --- /dev/null +++ b/blocks/timeline/amd/build/calendar_events_repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar_events_repository.js"],"names":["define","$","Ajax","Notification","queryByTime","args","hasOwnProperty","limit","limitnum","timesortfrom","starttime","timesortto","endtime","limittononsuspendedevents","promise","call","methodname","fail","exception","queryByCourse","queryByCourses"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to retrieve calendar events from the server.\n *\n * @module block_timeline/calendar_events_repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notification) {\n\n var DEFAULT_LIMIT = 20;\n\n /**\n * Retrieve a list of calendar events for the logged in user for the\n * given course.\n *\n * Valid args are:\n * int courseid Only get events for this course\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByCourse\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourse = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_course',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the given courses for the\n * logged in user.\n *\n * Valid args are:\n * array courseids Get events for these courses\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n *\n * @method queryByCourses\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByCourses = function(args) {\n if (!args.hasOwnProperty('limit')) {\n // This is intentionally smaller than the default limit.\n args.limit = 10;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_courses',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n /**\n * Retrieve a list of calendar events for the logged in user after the given\n * time.\n *\n * Valid args are:\n * int starttime Only get events after this time\n * int endtime Only get events before this time\n * int limit Limit the number of results returned\n * int aftereventid Offset the result set from the given id\n *\n * @method queryByTime\n * @param {object} args The request arguments\n * @return {promise} Resolved with an array of the calendar events\n */\n var queryByTime = function(args) {\n if (!args.hasOwnProperty('limit')) {\n args.limit = DEFAULT_LIMIT;\n }\n\n args.limitnum = args.limit;\n delete args.limit;\n\n if (args.hasOwnProperty('starttime')) {\n args.timesortfrom = args.starttime;\n delete args.starttime;\n }\n\n if (args.hasOwnProperty('endtime')) {\n args.timesortto = args.endtime;\n delete args.endtime;\n }\n // Don't show events related to courses that the user is suspended in.\n args.limittononsuspendedevents = true;\n\n var request = {\n methodname: 'core_calendar_get_action_events_by_timesort',\n args: args\n };\n\n var promise = Ajax.call([request])[0];\n\n promise.fail(Notification.exception);\n\n return promise;\n };\n\n return {\n queryByTime: queryByTime,\n queryByCourse: queryByCourse,\n queryByCourses: queryByCourses,\n };\n});\n"],"file":"calendar_events_repository.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/event_list.min.js b/blocks/timeline/amd/build/event_list.min.js index 893a2ac780254..5989f592c68b4 100644 --- a/blocks/timeline/amd/build/event_list.min.js +++ b/blocks/timeline/amd/build/event_list.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/templates","core/paged_content_factory","core/str","core/user_date","block_timeline/calendar_events_repository"],function(a,b,c,d,e,f,g){var h=86400,i={EMPTY_MESSAGE:'[data-region="empty-message"]',ROOT:'[data-region="event-list-container"]',EVENT_LIST_CONTENT:'[data-region="event-list-content"]',EVENT_LIST_LOADING_PLACEHOLDER:'[data-region="event-list-loading-placeholder"]'},j={EVENT_LIST_CONTENT:"block_timeline/event-list-content"},k={ignoreControlWhileLoading:!0,controlPlacementBottom:!0,ariaLabels:{itemsperpagecomponents:"ariaeventlistpagelimit, block_timeline"}},l=function(a){a.find(i.EVENT_LIST_CONTENT).addClass("hidden"),a.find(i.EMPTY_MESSAGE).removeClass("hidden")},m=function(a){a.find(i.EVENT_LIST_CONTENT).removeClass("hidden"),a.find(i.EMPTY_MESSAGE).addClass("hidden")},n=function(a){a.find(i.EVENT_LIST_CONTENT).empty()},o=function(a,b){var c={},d={eventsbyday:[]};return a.forEach(function(a){var d=f.getUserMidnightForTimestamp(a.timesort,b);c[d]?c[d].push(a):c[d]=[a]}),Object.keys(c).forEach(function(a){var e=c[a];d.eventsbyday.push({past:a.\n\n/**\n * Javascript to load and render the list of calendar events for a\n * given day range.\n *\n * @module block_timeline/event_list\n * @package block_timeline\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/templates',\n 'core/paged_content_factory',\n 'core/str',\n 'core/user_date',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n Templates,\n PagedContentFactory,\n Str,\n UserDate,\n CalendarEventsRepository\n) {\n\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n var SELECTORS = {\n EMPTY_MESSAGE: '[data-region=\"empty-message\"]',\n ROOT: '[data-region=\"event-list-container\"]',\n EVENT_LIST_CONTENT: '[data-region=\"event-list-content\"]',\n EVENT_LIST_LOADING_PLACEHOLDER: '[data-region=\"event-list-loading-placeholder\"]',\n };\n\n var TEMPLATES = {\n EVENT_LIST_CONTENT: 'block_timeline/event-list-content'\n };\n\n // We want the paged content controls below the paged content area\n // and the controls should be ignored while data is loading.\n var DEFAULT_PAGED_CONTENT_CONFIG = {\n ignoreControlWhileLoading: true,\n controlPlacementBottom: true,\n ariaLabels: {\n itemsperpagecomponents: 'ariaeventlistpagelimit, block_timeline',\n }\n };\n\n /**\n * Hide the content area and display the empty content message.\n *\n * @param {object} root The container element\n */\n var hideContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).addClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Show the content area and hide the empty content message.\n *\n * @param {object} root The container element\n */\n var showContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).removeClass('hidden');\n root.find(SELECTORS.EMPTY_MESSAGE).addClass('hidden');\n };\n\n /**\n * Empty the content area.\n *\n * @param {object} root The container element\n */\n var emptyContent = function(root) {\n root.find(SELECTORS.EVENT_LIST_CONTENT).empty();\n };\n\n /**\n * Construct the template context from a list of calendar events. The events\n * are grouped by which day they are on. The day is calculated from the user's\n * midnight timestamp to ensure that the calculation is timezone agnostic.\n *\n * The return data structure will look like:\n * {\n * eventsbyday: [\n * {\n * dayTimestamp: 1533744000,\n * events: [\n * { ...event 1 data... },\n * { ...event 2 data... }\n * ]\n * },\n * {\n * dayTimestamp: 1533830400,\n * events: [\n * { ...event 3 data... },\n * { ...event 4 data... }\n * ]\n * }\n * ]\n * }\n *\n * Each day timestamp is the day's midnight in the user's timezone.\n *\n * @param {array} calendarEvents List of calendar events\n * @param {Number} midnight A timestamp representing midnight in the user's timezone\n * @return {object}\n */\n var buildTemplateContext = function(calendarEvents, midnight) {\n var eventsByDay = {};\n var templateContext = {\n eventsbyday: []\n };\n\n calendarEvents.forEach(function(calendarEvent) {\n var dayTimestamp = UserDate.getUserMidnightForTimestamp(calendarEvent.timesort, midnight);\n if (eventsByDay[dayTimestamp]) {\n eventsByDay[dayTimestamp].push(calendarEvent);\n } else {\n eventsByDay[dayTimestamp] = [calendarEvent];\n }\n });\n\n Object.keys(eventsByDay).forEach(function(dayTimestamp) {\n var events = eventsByDay[dayTimestamp];\n templateContext.eventsbyday.push({\n past: dayTimestamp < midnight,\n dayTimestamp: dayTimestamp,\n events: events\n });\n });\n\n return templateContext;\n };\n\n /**\n * Render the HTML for the given calendar events.\n *\n * @param {array} calendarEvents A list of calendar events\n * @param {Number} midnight A timestamp representing midnight for the user\n * @return {promise} Resolved with HTML and JS strings.\n */\n var render = function(calendarEvents, midnight) {\n var templateContext = buildTemplateContext(calendarEvents, midnight);\n var templateName = TEMPLATES.EVENT_LIST_CONTENT;\n\n return Templates.render(templateName, templateContext);\n };\n\n /**\n * Retrieve a list of calendar events from the server for the given\n * constraints.\n *\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {Number} limit Limit the result set to this number of items\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {int|falsey} lastId The ID of the last seen event (if any)\n * @param {int|undefined} courseId Course ID to restrict events to\n * @return {promise} A jquery promise\n */\n var load = function(midnight, limit, daysOffset, daysLimit, lastId, courseId) {\n var startTime = midnight + (daysOffset * SECONDS_IN_DAY);\n var endTime = daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n\n var args = {\n starttime: startTime,\n limit: limit,\n };\n\n if (lastId) {\n args.aftereventid = lastId;\n }\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n if (courseId) {\n // If we have a course id then we only want events from that course.\n args.courseid = courseId;\n return CalendarEventsRepository.queryByCourse(args);\n } else {\n // Otherwise we want events from any course.\n return CalendarEventsRepository.queryByTime(args);\n }\n };\n\n /**\n * Handle a single page request from the paged content. Uses the given page data to request\n * the events from the server.\n *\n * Checks the given preloadedPages before sending a request to the server to make sure we\n * don't load data unnecessarily.\n *\n * @param {object} pageData A single page data (see core/paged_content_pages for more info).\n * @param {object} actions Paged content actions (see core/paged_content_pages for more info).\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} lastIds The last event ID for each loaded page. Page number is key, id is value.\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @return {object} jQuery promise resolved with calendar events.\n */\n var loadEventsFromPageData = function(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ) {\n var pageNumber = pageData.pageNumber;\n var limit = pageData.limit;\n var lastPageNumber = pageNumber;\n\n // This is here to protect us if, for some reason, the pages\n // are loaded out of order somehow and we don't have a reference\n // to the previous page. In that case, scan back to find the most\n // recent page we've seen.\n while (!lastIds.hasOwnProperty(lastPageNumber)) {\n lastPageNumber--;\n }\n // Use the last id of the most recent page.\n var lastId = lastIds[lastPageNumber];\n var eventsPromise = null;\n\n if (preloadedPages && preloadedPages.hasOwnProperty(pageNumber)) {\n // This page has been preloaded so use that rather than load the values\n // again.\n eventsPromise = preloadedPages[pageNumber];\n } else {\n // Load one more than the given limit so that we can tell if there\n // is more content to load after this.\n eventsPromise = load(midnight, limit + 1, daysOffset, daysLimit, lastId, courseId);\n }\n\n return eventsPromise.then(function(result) {\n if (!result.events.length) {\n // If we didn't get any events back then tell the paged content\n // that we're done loading.\n actions.allItemsLoaded(pageNumber);\n return [];\n }\n\n var calendarEvents = result.events;\n // We expect to receive limit + 1 events back from the server.\n // Any less means there are no more events to load.\n var loadedAll = calendarEvents.length <= limit;\n\n if (loadedAll) {\n // Tell the pagination that everything is loaded.\n actions.allItemsLoaded(pageNumber);\n } else {\n // Remove the last element from the array because it isn't\n // needed in this result set.\n calendarEvents.pop();\n }\n\n return calendarEvents;\n });\n };\n\n /**\n * Use the paged content factory to create a paged content element for showing\n * the event list. We only provide a page limit to the factory because we don't\n * know exactly how many pages we'll need. This creates a paging bar with just\n * next/previous buttons.\n *\n * This function specifies the callback for loading the event data that the user\n * is requesting.\n *\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {Number} midnight The user's midnight time in unix timestamp.\n * @param {object} firstLoad A jQuery promise to be resolved after the first set of data is loaded.\n * @param {int|undefined} courseId Course ID to restrict events to\n * @param {Number} daysOffset How many days (from midnight) to offset the results from\n * @param {int|undefined} daysLimit How many dates (from midnight) to limit the result to\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n * @return {object} jQuery promise.\n */\n var createPagedContent = function(\n pageLimit,\n preloadedPages,\n midnight,\n firstLoad,\n courseId,\n daysOffset,\n daysLimit,\n paginationAriaLabel,\n additionalConfig\n ) {\n // Remember the last event id we loaded on each page because we can't\n // use the offset value since the backend can skip events if the user doesn't\n // have the capability to see them. Instead we load the next page of events\n // based on the last seen event id.\n var lastIds = {'1': 0};\n var hasContent = false;\n var config = $.extend({}, DEFAULT_PAGED_CONTENT_CONFIG, additionalConfig);\n\n return Str.get_string(\n 'ariaeventlistpagelimit',\n 'block_timeline',\n $.isArray(pageLimit) ? pageLimit[0].value : pageLimit\n )\n .then(function(string) {\n config.ariaLabels.itemsperpage = string;\n config.ariaLabels.paginationnav = paginationAriaLabel;\n return string;\n })\n .then(function() {\n return PagedContentFactory.createWithLimit(\n pageLimit,\n function(pagesData, actions) {\n var promises = [];\n\n pagesData.forEach(function(pageData) {\n var pageNumber = pageData.pageNumber;\n // Load the page data.\n var pagePromise = loadEventsFromPageData(\n pageData,\n actions,\n midnight,\n lastIds,\n preloadedPages,\n courseId,\n daysOffset,\n daysLimit\n ).then(function(calendarEvents) {\n if (calendarEvents.length) {\n // Remember that we've loaded content.\n hasContent = true;\n // Remember the last id we've seen.\n var lastEventId = calendarEvents[calendarEvents.length - 1].id;\n // Record the id that the next page will need to start from.\n lastIds[pageNumber + 1] = lastEventId;\n // Get the HTML and JS for these calendar events.\n return render(calendarEvents, midnight);\n } else {\n return calendarEvents;\n }\n })\n .catch(Notification.exception);\n\n promises.push(pagePromise);\n });\n\n $.when.apply($, promises).then(function() {\n // Tell the calling code that the first page has been loaded\n // and whether it contains any content.\n firstLoad.resolve(hasContent);\n return;\n })\n .catch(function() {\n firstLoad.resolve(hasContent);\n });\n\n return promises;\n },\n config\n );\n });\n };\n\n /**\n * Create a paged content region for the calendar events in the given root element.\n * The content of the root element are replaced with a new paged content section\n * each time this function is called.\n *\n * This function will be called each time the offset or limit values are changed to\n * reload the event list region.\n *\n * @param {object} root The event list container element\n * @param {int|array} pageLimit A single limit or list of limits as options for the paged content\n * @param {object} preloadedPages An object of preloaded page data. Page number as key, data promise as value.\n * @param {string} paginationAriaLabel String to set as the aria label for the pagination bar.\n * @param {object} additionalConfig Additional config options to pass to pagedContentFactory\n */\n var init = function(root, pageLimit, preloadedPages, paginationAriaLabel, additionalConfig) {\n root = $(root);\n\n // Create a promise that will be resolved once the first set of page\n // data has been loaded. This ensures that the loading placeholder isn't\n // hidden until we have all of the data back to prevent the page elements\n // jumping around.\n var firstLoad = $.Deferred();\n var eventListContent = root.find(SELECTORS.EVENT_LIST_CONTENT);\n var loadingPlaceholder = root.find(SELECTORS.EVENT_LIST_LOADING_PLACEHOLDER);\n var courseId = root.attr('data-course-id');\n var daysOffset = parseInt(root.attr('data-days-offset'), 10);\n var daysLimit = root.attr('data-days-limit');\n var midnight = parseInt(root.attr('data-midnight'), 10);\n\n // Make sure the content area and loading placeholder is visible.\n // This is because the init function can be called to re-initialise\n // an existing event list area.\n emptyContent(root);\n showContent(root);\n loadingPlaceholder.removeClass('hidden');\n\n // Days limit isn't mandatory.\n if (daysLimit != undefined) {\n daysLimit = parseInt(daysLimit, 10);\n }\n\n // Created the paged content element.\n return createPagedContent(pageLimit, preloadedPages, midnight, firstLoad, courseId, daysOffset, daysLimit,\n paginationAriaLabel, additionalConfig)\n .then(function(html, js) {\n html = $(html);\n // Hide the content for now.\n html.addClass('hidden');\n // Replace existing elements with the newly created paged content.\n // If we're reinitialising an existing event list this will replace\n // the old event list (including removing any event handlers).\n Templates.replaceNodeContents(eventListContent, html, js);\n\n firstLoad.then(function(hasContent) {\n // Prevent changing page elements too much by only showing the content\n // once we've loaded some data for the first time. This allows our\n // fancy loading placeholder to shine.\n html.removeClass('hidden');\n loadingPlaceholder.addClass('hidden');\n\n if (!hasContent) {\n // If we didn't get any data then show the empty data message.\n hideContent(root);\n }\n\n return hasContent;\n })\n .catch(function() {\n return false;\n });\n\n return html;\n })\n .catch(Notification.exception);\n };\n\n return {\n init: init,\n rootSelector: SELECTORS.ROOT,\n };\n});\n"],"file":"event_list.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/main.min.js b/blocks/timeline/amd/build/main.min.js index 4b8ded90cf1fa..7aacd6361d2e8 100644 --- a/blocks/timeline/amd/build/main.min.js +++ b/blocks/timeline/amd/build/main.min.js @@ -1 +1,2 @@ -define(["jquery","block_timeline/view_nav","block_timeline/view"],function(a,b,c){var d={TIMELINE_VIEW:'[data-region="timeline-view"]'},e=function(e){e=a(e);var f=e.find(d.TIMELINE_VIEW);b.init(e,f),c.init(f)};return{init:e}}); \ No newline at end of file +define ("block_timeline/main",["jquery","block_timeline/view_nav","block_timeline/view"],function(a,b,c){var d={TIMELINE_VIEW:"[data-region=\"timeline-view\"]"};return{init:function init(e){e=a(e);var f=e.find(d.TIMELINE_VIEW);b.init(e,f);c.init(f)}}}); +//# sourceMappingURL=main.min.js.map diff --git a/blocks/timeline/amd/build/main.min.js.map b/blocks/timeline/amd/build/main.min.js.map new file mode 100644 index 0000000000000..64ba6b70a08e7 --- /dev/null +++ b/blocks/timeline/amd/build/main.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/main.js"],"names":["define","$","ViewNav","View","SELECTORS","TIMELINE_VIEW","init","root","viewRoot","find"],"mappings":"AAsBAA,OAAM,uBACN,CACI,QADJ,CAEI,yBAFJ,CAGI,qBAHJ,CADM,CAMN,SACIC,CADJ,CAEIC,CAFJ,CAGIC,CAHJ,CAIE,IAEMC,CAAAA,CAAS,CAAG,CACZC,aAAa,CAAE,iCADH,CAFlB,CAqBE,MAAO,CACHC,IAAI,CAXG,QAAPA,CAAAA,IAAO,CAASC,CAAT,CAAe,CACtBA,CAAI,CAAGN,CAAC,CAACM,CAAD,CAAR,CACA,GAAIC,CAAAA,CAAQ,CAAGD,CAAI,CAACE,IAAL,CAAUL,CAAS,CAACC,aAApB,CAAf,CAGAH,CAAO,CAACI,IAAR,CAAaC,CAAb,CAAmBC,CAAnB,EAEAL,CAAI,CAACG,IAAL,CAAUE,CAAV,CACH,CAEM,CAGV,CAlCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to initialise the timeline block.\n *\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_nav',\n 'block_timeline/view'\n],\nfunction(\n $,\n ViewNav,\n View\n) {\n\n var SELECTORS = {\n TIMELINE_VIEW: '[data-region=\"timeline-view\"]'\n };\n\n /**\n * Initialise all of the modules for the timeline block.\n *\n * @param {object} root The root element for the timeline block.\n */\n var init = function(root) {\n root = $(root);\n var viewRoot = root.find(SELECTORS.TIMELINE_VIEW);\n\n // Initialise the timeline navigation elements.\n ViewNav.init(root, viewRoot);\n // Initialise the timeline view modules.\n View.init(viewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"file":"main.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view.min.js b/blocks/timeline/amd/build/view.min.js index e374dc33fc442..ac57cbeefad97 100644 --- a/blocks/timeline/amd/build/view.min.js +++ b/blocks/timeline/amd/build/view.min.js @@ -1 +1,2 @@ -define(["jquery","block_timeline/view_dates","block_timeline/view_courses"],function(a,b,c){var d={TIMELINE_DATES_VIEW:'[data-region="view-dates"]',TIMELINE_COURSES_VIEW:'[data-region="view-courses"]'},e=function(e){e=a(e);var f=e.find(d.TIMELINE_DATES_VIEW),g=e.find(d.TIMELINE_COURSES_VIEW);b.init(f),c.init(g)},f=function(a){var e=a.find(d.TIMELINE_DATES_VIEW),f=a.find(d.TIMELINE_COURSES_VIEW);b.reset(e),c.reset(f)},g=function(a){var e=a.find(d.TIMELINE_DATES_VIEW),f=a.find(d.TIMELINE_COURSES_VIEW);e.hasClass("active")?b.shown(e):c.shown(f)};return{init:e,reset:f,shown:g}}); \ No newline at end of file +define ("block_timeline/view",["jquery","block_timeline/view_dates","block_timeline/view_courses"],function(a,b,c){var d={TIMELINE_DATES_VIEW:"[data-region=\"view-dates\"]",TIMELINE_COURSES_VIEW:"[data-region=\"view-courses\"]"};return{init:function init(e){e=a(e);var f=e.find(d.TIMELINE_DATES_VIEW),g=e.find(d.TIMELINE_COURSES_VIEW);b.init(f);c.init(g)},reset:function reset(a){var e=a.find(d.TIMELINE_DATES_VIEW),f=a.find(d.TIMELINE_COURSES_VIEW);b.reset(e);c.reset(f)},shown:function shown(a){var e=a.find(d.TIMELINE_DATES_VIEW),f=a.find(d.TIMELINE_COURSES_VIEW);if(e.hasClass("active")){b.shown(e)}else{c.shown(f)}}}}); +//# sourceMappingURL=view.min.js.map diff --git a/blocks/timeline/amd/build/view.min.js.map b/blocks/timeline/amd/build/view.min.js.map new file mode 100644 index 0000000000000..90d9b070a0530 --- /dev/null +++ b/blocks/timeline/amd/build/view.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view.js"],"names":["define","$","ViewDates","ViewCourses","SELECTORS","TIMELINE_DATES_VIEW","TIMELINE_COURSES_VIEW","init","root","datesViewRoot","find","coursesViewRoot","reset","shown","hasClass"],"mappings":"AAuBAA,OAAM,uBACN,CACI,QADJ,CAEI,2BAFJ,CAGI,6BAHJ,CADM,CAMN,SACIC,CADJ,CAEIC,CAFJ,CAGIC,CAHJ,CAIE,IAEMC,CAAAA,CAAS,CAAG,CACZC,mBAAmB,CAAE,8BADT,CAEZC,qBAAqB,CAAE,gCAFX,CAFlB,CA0DE,MAAO,CACHC,IAAI,CA7CG,QAAPA,CAAAA,IAAO,CAASC,CAAT,CAAe,CACtBA,CAAI,CAAGP,CAAC,CAACO,CAAD,CAAR,CADsB,GAElBC,CAAAA,CAAa,CAAGD,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACC,mBAApB,CAFE,CAGlBM,CAAe,CAAGH,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACE,qBAApB,CAHA,CAKtBJ,CAAS,CAACK,IAAV,CAAeE,CAAf,EACAN,CAAW,CAACI,IAAZ,CAAiBI,CAAjB,CACH,CAqCM,CAEHC,KAAK,CA5BG,QAARA,CAAAA,KAAQ,CAASJ,CAAT,CAAe,IACnBC,CAAAA,CAAa,CAAGD,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACC,mBAApB,CADG,CAEnBM,CAAe,CAAGH,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACE,qBAApB,CAFC,CAGvBJ,CAAS,CAACU,KAAV,CAAgBH,CAAhB,EACAN,CAAW,CAACS,KAAZ,CAAkBD,CAAlB,CACH,CAqBM,CAGHE,KAAK,CAdG,QAARA,CAAAA,KAAQ,CAASL,CAAT,CAAe,IACnBC,CAAAA,CAAa,CAAGD,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACC,mBAApB,CADG,CAEnBM,CAAe,CAAGH,CAAI,CAACE,IAAL,CAAUN,CAAS,CAACE,qBAApB,CAFC,CAIvB,GAAIG,CAAa,CAACK,QAAd,CAAuB,QAAvB,CAAJ,CAAsC,CAClCZ,CAAS,CAACW,KAAV,CAAgBJ,CAAhB,CACH,CAFD,IAEO,CACHN,CAAW,CAACU,KAAZ,CAAkBF,CAAlB,CACH,CACJ,CAEM,CAKV,CAzEK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Manage the timeline view for the timeline block.\n *\n * @package block_timeline\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'block_timeline/view_dates',\n 'block_timeline/view_courses',\n],\nfunction(\n $,\n ViewDates,\n ViewCourses\n) {\n\n var SELECTORS = {\n TIMELINE_DATES_VIEW: '[data-region=\"view-dates\"]',\n TIMELINE_COURSES_VIEW: '[data-region=\"view-courses\"]',\n };\n\n /**\n * Intialise the timeline dates and courses views on page load.\n * This function should only be called once per page load because\n * it can cause event listeners to be added to the page.\n *\n * @param {object} root The root element for the timeline view.\n */\n var init = function(root) {\n root = $(root);\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n ViewDates.init(datesViewRoot);\n ViewCourses.init(coursesViewRoot);\n };\n\n /**\n * Reset the timeline dates and courses views to their original\n * state on first page load.\n *\n * This is called when configuration has changed for the event lists\n * to cause them to reload their data.\n *\n * @param {object} root The root element for the timeline view.\n */\n var reset = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n ViewDates.reset(datesViewRoot);\n ViewCourses.reset(coursesViewRoot);\n };\n\n /**\n * Tell the timeline dates or courses view that it has been displayed.\n *\n * This is called each time one of the views is displayed and is used to\n * lazy load the data within it on first load.\n *\n * @param {object} root The root element for the timeline view.\n */\n var shown = function(root) {\n var datesViewRoot = root.find(SELECTORS.TIMELINE_DATES_VIEW);\n var coursesViewRoot = root.find(SELECTORS.TIMELINE_COURSES_VIEW);\n\n if (datesViewRoot.hasClass('active')) {\n ViewDates.shown(datesViewRoot);\n } else {\n ViewCourses.shown(coursesViewRoot);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown,\n };\n});\n"],"file":"view.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_courses.min.js b/blocks/timeline/amd/build/view_courses.min.js index 918fdd16fda1a..70345b121238b 100644 --- a/blocks/timeline/amd/build/view_courses.min.js +++ b/blocks/timeline/amd/build/view_courses.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/custom_interaction_events","core/str","core/templates","block_timeline/event_list","core_course/repository","block_timeline/calendar_events_repository"],function(a,b,c,d,e,f,g,h){var i={MORE_COURSES_BUTTON:'[data-action="more-courses"]',MORE_COURSES_BUTTON_CONTAINER:'[data-region="more-courses-button-container"]',NO_COURSES_EMPTY_MESSAGE:'[data-region="no-courses-empty-message"]',COURSES_LIST:'[data-region="courses-list"]',COURSE_ITEMS_LOADING_PLACEHOLDER:'[data-region="course-items-loading-placeholder"]',COURSE_EVENTS_CONTAINER:'[data-region="course-events-container"]',COURSE_NAME:'[data-region="course-name"]',LOADING_ICON:".loading-icon"},j={COURSE_ITEMS:"block_timeline/course-items",LOADING_ICON:"core/loading"},k="inprogress",l="fullname asc",m=5,n=2,o=86400,p=function(a){a.find(i.COURSE_ITEMS_LOADING_PLACEHOLDER).addClass("hidden")},q=function(a){a.find(i.MORE_COURSES_BUTTON_CONTAINER).addClass("hidden")},r=function(a){a.find(i.MORE_COURSES_BUTTON_CONTAINER).removeClass("hidden")},s=function(a){var b=a.find(i.MORE_COURSES_BUTTON);b.prop("disabled",!0),e.render(j.LOADING_ICON,{}).then(function(a){return b.append(a),a})["catch"](function(){return!1})},t=function(a){var b=a.find(i.MORE_COURSES_BUTTON);b.prop("disabled",!1),b.find(i.LOADING_ICON).remove()},u=function(a){a.find(i.NO_COURSES_EMPTY_MESSAGE).removeClass("hidden")},v=function(a,b){var c=a.find(i.COURSES_LIST);e.appendNodeContents(c,b,"")},w=function(a){return a.find(i.COURSE_EVENTS_CONTAINER).length>0},x=function(a){return parseInt(a.attr("data-offset"),10)},y=function(a,b){a.attr("data-offset",b)},z=function(a){return parseInt(a.attr("data-limit"),10)},A=function(a){return parseInt(a.attr("data-days-offset"),10)},B=function(a){var b=a.attr("data-days-limit");return void 0!=b?parseInt(b,10):void 0},C=function(a){return parseInt(a.attr("data-midnight"),10)},D=function(a){var b=C(a),c=A(a);return b+c*o},E=function(a){var b=C(a),c=B(a);return void 0!=c&&b+c*o},F=function(a,b,c,d){var e={courseids:a,starttime:b,limit:c};return d&&(e.endtime=d),h.queryByCourses(e)},G=function(a){return a.data("last-event-load-time")},H=function(a,b){a.data("last-event-load-time",b)},I=function(a,b){return G(a)>b},J=function(a,b,c){var d=a.map(function(a){return a.id});return F(d,b,m+1,c)},K=function(a,b,c,d,f,g){return e.render(j.COURSE_ITEMS,{courses:a,midnight:c,hasdaysoffset:!0,hasdayslimit:void 0!=f,daysoffset:d,dayslimit:f,nodayslimit:void 0==f,urls:{noevents:g}}).then(function(a){return p(b),a?v(b,a):w(b)||u(b),a}).then(function(c){return a.lengthb},G=function(a,b,c){var d=a.map(function(a){return a.id});return C(d,b,k+1,c)},H=function(a,b,c,d,f,g){return e.render(j.COURSE_ITEMS,{courses:a,midnight:c,hasdaysoffset:!0,hasdayslimit:f!=void 0,daysoffset:d,dayslimit:f,nodayslimit:f==void 0,urls:{noevents:g}}).then(function(a){m(b);if(a){s(b,a)}else{if(!t(b)){r(b)}}return a}).then(function(c){if(a.length<2){n(b)}else{o(b)}return c}).catch(function(){m(b)})},I=function(c){var e=u(c),h=w(c);return g.getEnrolledCoursesByTimelineClassification("inprogress",h,e,"fullname asc").then(function(b){var e=Date.now(),g=b.courses,h=b.nextoffset,i=x(c),j=y(c),l=z(c),m=A(c),n=B(c),o=c.attr("data-no-events-url");v(c,h);var p=G(g,m,n),q=H(g,c,l,i,j,o);return a.when(p,q).then(function(b){if(F(c,e)){return b}g.forEach(function(e){var g=e.id,h=[],i=c.find("[data-region=\"course-events-container\"][data-course-id=\""+g+"\"]"),j=i.find(f.rootSelector),l=b.groupedbycourse.filter(function(a){return a.courseid==g});if(l.length){h=l[0].events}var m=a.Deferred().resolve({events:h}).promise();d.get_string("ariaeventlistpaginationnavcourses","block_timeline",e.fullnamedisplay).then(function(a){f.init(j,k,{1:m},a);return a}).catch(function(){f.init(j,k,{1:m})})});return b})}).catch(b.exception)},J=function(c){var e=Date.now(),g=A(c),h=B(c),j=c.find(i.COURSE_EVENTS_CONTAINER),l=j.map(function(){return a(this).attr("data-course-id")}).get();E(c,e);return C(l,g,k+1,h).then(function(b){if(F(c,e)){return b}j.each(function(c,e){e=a(e);var g=e.attr("data-course-id"),h=e.find(i.COURSE_NAME).text(),j=e.find(f.rootSelector),l=a.Deferred(),m=[],n=b.groupedbycourse.filter(function(a){return a.courseid==g});if(n.length){m=n[0].events}l.resolve({events:m});d.get_string("ariaeventlistpaginationnavcourses","block_timeline",h).then(function(a){f.init(j,k,{1:l.promise()},a);return a}).catch(function(){f.init(j,k,{1:l.promise()})})});return b}).catch(b.exception)},K=function(a){c.define(a,[c.events.activate]);a.on(c.events.activate,i.MORE_COURSES_BUTTON,function(b,c){p(a);I(a).then(function(){q(a)}).catch(function(){q(a)});if(c){c.originalEvent.preventDefault();c.originalEvent.stopPropagation()}b.stopPropagation()})},L=function(a){if(!a.attr("data-seen")){if(t(a)){J(a)}else{I(a)}a.attr("data-seen",!0)}};return{init:function init(b){b=a(b);E(b,Date.now());if(b.hasClass("active")){I(b);b.attr("data-seen",!0)}K(b)},reset:function reset(a){a.removeAttr("data-seen");if(a.hasClass("active")){L(a)}},shown:L}}); +//# sourceMappingURL=view_courses.min.js.map diff --git a/blocks/timeline/amd/build/view_courses.min.js.map b/blocks/timeline/amd/build/view_courses.min.js.map new file mode 100644 index 0000000000000..58b9369cfcdae --- /dev/null +++ b/blocks/timeline/amd/build/view_courses.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view_courses.js"],"names":["define","$","Notification","CustomEvents","Str","Templates","EventList","CourseRepository","EventsRepository","SELECTORS","MORE_COURSES_BUTTON","MORE_COURSES_BUTTON_CONTAINER","NO_COURSES_EMPTY_MESSAGE","COURSES_LIST","COURSE_ITEMS_LOADING_PLACEHOLDER","COURSE_EVENTS_CONTAINER","COURSE_NAME","LOADING_ICON","TEMPLATES","COURSE_ITEMS","COURSE_EVENT_LIMIT","SECONDS_IN_DAY","hideLoadingPlaceholder","root","find","addClass","hideMoreCoursesButton","showMoreCoursesButton","removeClass","enableMoreCoursesButtonLoading","button","prop","render","then","html","append","catch","disableMoreCoursesButtonLoading","remove","showNoCoursesEmptyMessage","renderCourseItemsHTML","container","appendNodeContents","hasLoadedCourses","length","getOffset","parseInt","attr","setOffset","offset","getLimit","getDaysOffset","getDaysLimit","daysLimit","getMidnight","getStartTime","midnight","daysOffset","getEndTime","getEventsForCourseIds","courseIds","startTime","limit","endTime","args","courseids","starttime","endtime","queryByCourses","getEventReloadTime","data","setEventReloadTime","time","hasReloadedEventsSince","loadEventsForCourses","courses","map","course","id","updateDisplayFromCourses","noEventsURL","hasdaysoffset","hasdayslimit","daysoffset","dayslimit","nodayslimit","urls","noevents","loadMoreCourses","getEnrolledCoursesByTimelineClassification","result","startEventLoadingTime","Date","now","nextOffset","nextoffset","eventsPromise","renderPromise","when","eventsByCourse","forEach","courseId","events","courseEventsContainer","eventListRoot","rootSelector","courseGroups","groupedbycourse","filter","group","courseid","pageOnePreload","Deferred","resolve","promise","get_string","fullnamedisplay","string","init","exception","reloadCourseEvents","startReloadTime","courseEventsContainers","get","each","index","courseName","text","eventListContainer","pageDeferred","registerEventListeners","activate","on","e","originalEvent","preventDefault","stopPropagation","shown","hasClass","reset","removeAttr"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Manage the timeline courses view for the timeline block.\n *\n * @package block_timeline\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/str',\n 'core/templates',\n 'block_timeline/event_list',\n 'core_course/repository',\n 'block_timeline/calendar_events_repository'\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Str,\n Templates,\n EventList,\n CourseRepository,\n EventsRepository\n) {\n\n var SELECTORS = {\n MORE_COURSES_BUTTON: '[data-action=\"more-courses\"]',\n MORE_COURSES_BUTTON_CONTAINER: '[data-region=\"more-courses-button-container\"]',\n NO_COURSES_EMPTY_MESSAGE: '[data-region=\"no-courses-empty-message\"]',\n COURSES_LIST: '[data-region=\"courses-list\"]',\n COURSE_ITEMS_LOADING_PLACEHOLDER: '[data-region=\"course-items-loading-placeholder\"]',\n COURSE_EVENTS_CONTAINER: '[data-region=\"course-events-container\"]',\n COURSE_NAME: '[data-region=\"course-name\"]',\n LOADING_ICON: '.loading-icon'\n };\n\n var TEMPLATES = {\n COURSE_ITEMS: 'block_timeline/course-items',\n LOADING_ICON: 'core/loading'\n };\n\n var COURSE_CLASSIFICATION = 'inprogress';\n var COURSE_SORT = 'fullname asc';\n var COURSE_EVENT_LIMIT = 5;\n var COURSE_LIMIT = 2;\n var SECONDS_IN_DAY = 60 * 60 * 24;\n\n /**\n * Hide the loading placeholder elements.\n *\n * @param {object} root The rool element.\n */\n var hideLoadingPlaceholder = function(root) {\n root.find(SELECTORS.COURSE_ITEMS_LOADING_PLACEHOLDER).addClass('hidden');\n };\n\n /**\n * Hide the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var hideMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).addClass('hidden');\n };\n\n /**\n * Show the \"more courses\" button.\n *\n * @param {object} root The rool element.\n */\n var showMoreCoursesButton = function(root) {\n root.find(SELECTORS.MORE_COURSES_BUTTON_CONTAINER).removeClass('hidden');\n };\n\n /**\n * Disable the \"more courses\" button and show the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var enableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', true);\n Templates.render(TEMPLATES.LOADING_ICON, {})\n .then(function(html) {\n button.append(html);\n return html;\n })\n .catch(function() {\n // It's not important if this false so just do so silently.\n return false;\n });\n };\n\n /**\n * Enable the \"more courses\" button and remove the loading spinner.\n *\n * @param {object} root The rool element.\n */\n var disableMoreCoursesButtonLoading = function(root) {\n var button = root.find(SELECTORS.MORE_COURSES_BUTTON);\n button.prop('disabled', false);\n button.find(SELECTORS.LOADING_ICON).remove();\n };\n\n /**\n * Display the message for when there are no courses available.\n *\n * @param {object} root The rool element.\n */\n var showNoCoursesEmptyMessage = function(root) {\n root.find(SELECTORS.NO_COURSES_EMPTY_MESSAGE).removeClass('hidden');\n };\n\n /**\n * Render the course items HTML to the page.\n *\n * @param {object} root The rool element.\n * @param {string} html The course items HTML to render.\n */\n var renderCourseItemsHTML = function(root, html) {\n var container = root.find(SELECTORS.COURSES_LIST);\n Templates.appendNodeContents(container, html, '');\n };\n\n /**\n * Check if any courses have been loaded.\n *\n * @param {object} root The rool element.\n * @return {bool}\n */\n var hasLoadedCourses = function(root) {\n return root.find(SELECTORS.COURSE_EVENTS_CONTAINER).length > 0;\n };\n\n /**\n * Return the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getOffset = function(root) {\n return parseInt(root.attr('data-offset'), 10);\n };\n\n /**\n * Set the offset value for fetching courses.\n *\n * @param {object} root The rool element.\n * @param {Number} offset Offset value.\n */\n var setOffset = function(root, offset) {\n root.attr('data-offset', offset);\n };\n\n /**\n * Return the limit value for fetching courses.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getLimit = function(root) {\n return parseInt(root.attr('data-limit'), 10);\n };\n\n /**\n * Return the days offset value for fetching events.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getDaysOffset = function(root) {\n return parseInt(root.attr('data-days-offset'), 10);\n };\n\n /**\n * Return the days limit value for fetching events. The days\n * limit is optional so undefined will be returned if it isn't\n * set.\n *\n * @param {object} root The rool element.\n * @return {int|undefined}\n */\n var getDaysLimit = function(root) {\n var daysLimit = root.attr('data-days-limit');\n return daysLimit != undefined ? parseInt(daysLimit, 10) : undefined;\n };\n\n /**\n * Return the timestamp for the user's midnight.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getMidnight = function(root) {\n return parseInt(root.attr('data-midnight'), 10);\n };\n\n /**\n * Return the start time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getStartTime = function(root) {\n var midnight = getMidnight(root);\n var daysOffset = getDaysOffset(root);\n return midnight + (daysOffset * SECONDS_IN_DAY);\n };\n\n /**\n * Return the end time for fetching events. This is calculated\n * based on the user's midnight value so that timezones are\n * preserved.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEndTime = function(root) {\n var midnight = getMidnight(root);\n var daysLimit = getDaysLimit(root);\n return daysLimit != undefined ? midnight + (daysLimit * SECONDS_IN_DAY) : false;\n };\n\n /**\n * Get a list of events for the given course ids. Returns a promise that will\n * be resolved with the events.\n *\n * @param {array} courseIds The list of course ids to fetch events for.\n * @param {Number} startTime Timestamp to fetch events from.\n * @param {Number} limit Limit to the number of events (this applies per course, not total)\n * @param {Number} endTime Timestamp to fetch events to.\n * @return {object} jQuery promise.\n */\n var getEventsForCourseIds = function(courseIds, startTime, limit, endTime) {\n var args = {\n courseids: courseIds,\n starttime: startTime,\n limit: limit\n };\n\n if (endTime) {\n args.endtime = endTime;\n }\n\n return EventsRepository.queryByCourses(args);\n };\n\n /**\n * Get the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @return {Number}\n */\n var getEventReloadTime = function(root) {\n return root.data('last-event-load-time');\n };\n\n /**\n * Set the last time the events were reloaded.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n */\n var setEventReloadTime = function(root, time) {\n root.data('last-event-load-time', time);\n };\n\n /**\n * Check if events have begun reloading since the given\n * time.\n *\n * @param {object} root The rool element.\n * @param {Number} time Timestamp in milliseconds.\n * @return {bool}\n */\n var hasReloadedEventsSince = function(root, time) {\n return getEventReloadTime(root) > time;\n };\n\n /**\n * Send a request to the server to load the events for the courses.\n *\n * @param {array} courses List of course objects.\n * @param {Number} startTime Timestamp to load events after.\n * @param {int|undefined} endTime Timestamp to load events up until.\n * @return {object} jQuery promise resolved with the events.\n */\n var loadEventsForCourses = function(courses, startTime, endTime) {\n var courseIds = courses.map(function(course) {\n return course.id;\n });\n\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime);\n };\n\n /**\n * Render the courses in the DOM once the server has returned the courses.\n *\n * @param {array} courses List of course objects.\n * @param {object} root The root element\n * @param {Number} midnight The midnight timestamp in the user's timezone.\n * @param {Number} daysOffset Number of days from today to offset the events.\n * @param {Number} daysLimit Number of days from today to limit the events to.\n * @param {string} noEventsURL URL for the image to display for no events.\n * @return {object} jQuery promise resolved after rendering is complete.\n */\n var updateDisplayFromCourses = function(courses, root, midnight, daysOffset, daysLimit, noEventsURL) {\n // Render the courses template.\n return Templates.render(TEMPLATES.COURSE_ITEMS, {\n courses: courses,\n midnight: midnight,\n hasdaysoffset: true,\n hasdayslimit: daysLimit != undefined,\n daysoffset: daysOffset,\n dayslimit: daysLimit,\n nodayslimit: daysLimit == undefined,\n urls: {\n noevents: noEventsURL\n }\n }).then(function(html) {\n hideLoadingPlaceholder(root);\n\n if (html) {\n // Template rendering is complete and we have the HTML so we can\n // add it to the DOM.\n renderCourseItemsHTML(root, html);\n } else {\n if (!hasLoadedCourses(root)) {\n // There were no courses to render so show the empty placeholder\n // message for the user to tell them.\n showNoCoursesEmptyMessage(root);\n }\n }\n\n return html;\n })\n .then(function(html) {\n if (courses.length < COURSE_LIMIT) {\n // We know there aren't any more courses because we got back less\n // than we asked for so hide the button to request more.\n hideMoreCoursesButton(root);\n } else {\n // Make sure the button is visible if there are more courses to load.\n showMoreCoursesButton(root);\n }\n\n return html;\n })\n .catch(function() {\n hideLoadingPlaceholder(root);\n });\n };\n\n /**\n * Find all of the visible course blocks and initialise the event\n * list module to being loading the events for the course block.\n *\n * @param {object} root The root element for the timeline courses view.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var loadMoreCourses = function(root) {\n var offset = getOffset(root);\n var limit = getLimit(root);\n\n // Start loading the next set of courses.\n return CourseRepository.getEnrolledCoursesByTimelineClassification(\n COURSE_CLASSIFICATION,\n limit,\n offset,\n COURSE_SORT\n ).then(function(result) {\n var startEventLoadingTime = Date.now();\n var courses = result.courses;\n var nextOffset = result.nextoffset;\n var daysOffset = getDaysOffset(root);\n var daysLimit = getDaysLimit(root);\n var midnight = getMidnight(root);\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var noEventsURL = root.attr('data-no-events-url');\n // Record the next offset if we want to request more courses.\n setOffset(root, nextOffset);\n // Load the events for these courses.\n var eventsPromise = loadEventsForCourses(courses, startTime, endTime);\n // Render the courses in the DOM.\n var renderPromise = updateDisplayFromCourses(courses, root, midnight, daysOffset, daysLimit, noEventsURL);\n\n return $.when(eventsPromise, renderPromise)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startEventLoadingTime)) {\n // All of the events are being reloaded so ignore our results.\n return eventsByCourse;\n }\n\n // When we've got all of the courses and events we can render the events in the\n // correct course event list.\n courses.forEach(function(course) {\n var courseId = course.id;\n var events = [];\n var containerSelector = '[data-region=\"course-events-container\"][data-course-id=\"' + courseId + '\"]';\n var courseEventsContainer = root.find(containerSelector);\n var eventListRoot = courseEventsContainer.find(EventList.rootSelector);\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events for this course.\n events = courseGroups[0].events;\n }\n\n // Create a preloaded page to pass to the event list because we've already\n // loaded the first page of events.\n var pageOnePreload = $.Deferred().resolve({events: events}).promise();\n // Initialise the event list pagination area for this course.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', course.fullnamedisplay)\n .then(function(string) {\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload}, string);\n return string;\n })\n .catch(function() {\n // An error is ok, just render with the default string.\n EventList.init(eventListRoot, COURSE_EVENT_LIMIT, {'1': pageOnePreload});\n });\n });\n\n return eventsByCourse;\n });\n }).catch(Notification.exception);\n };\n\n /**\n * Reload the events for all of the visible courses. These events will be loaded\n * in a single request to the server.\n *\n * @param {object} root The root element.\n * @return {object} jQuery promise resolved with courses and events.\n */\n var reloadCourseEvents = function(root) {\n var startReloadTime = Date.now();\n var startTime = getStartTime(root);\n var endTime = getEndTime(root);\n var courseEventsContainers = root.find(SELECTORS.COURSE_EVENTS_CONTAINER);\n var courseIds = courseEventsContainers.map(function() {\n return $(this).attr('data-course-id');\n }).get();\n\n // Record when we started our request.\n setEventReloadTime(root, startReloadTime);\n\n // Load all of the events for the given courses.\n return getEventsForCourseIds(courseIds, startTime, COURSE_EVENT_LIMIT + 1, endTime)\n .then(function(eventsByCourse) {\n if (hasReloadedEventsSince(root, startReloadTime)) {\n // A new reload has begun so ignore our results.\n return eventsByCourse;\n }\n\n courseEventsContainers.each(function(index, container) {\n container = $(container);\n var courseId = container.attr('data-course-id');\n var courseName = container.find(SELECTORS.COURSE_NAME).text();\n var eventListContainer = container.find(EventList.rootSelector);\n var pageDeferred = $.Deferred();\n var events = [];\n var courseGroups = eventsByCourse.groupedbycourse.filter(function(group) {\n return group.courseid == courseId;\n });\n\n if (courseGroups.length) {\n // Get the events just for this course.\n events = courseGroups[0].events;\n }\n\n pageDeferred.resolve({events: events});\n\n // Re-initialise the events list with the preloaded events we just got from\n // the server.\n Str.get_string('ariaeventlistpaginationnavcourses', 'block_timeline', courseName)\n .then(function(string) {\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()}, string);\n return string;\n })\n .catch(function() {\n // Ignore a failure to load the string. Just render with the default string.\n EventList.init(eventListContainer, COURSE_EVENT_LIMIT, {'1': pageDeferred.promise()});\n });\n });\n\n return eventsByCourse;\n }).catch(Notification.exception);\n };\n\n /**\n * Add event listeners to load more courses for the courses view.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var registerEventListeners = function(root) {\n CustomEvents.define(root, [CustomEvents.events.activate]);\n // Show more courses and load their events when the user clicks the \"more courses\"\n // button.\n root.on(CustomEvents.events.activate, SELECTORS.MORE_COURSES_BUTTON, function(e, data) {\n enableMoreCoursesButtonLoading(root);\n loadMoreCourses(root)\n .then(function() {\n disableMoreCoursesButtonLoading(root);\n return;\n })\n .catch(function() {\n disableMoreCoursesButtonLoading(root);\n });\n\n if (data) {\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }\n e.stopPropagation();\n });\n };\n\n /**\n * Initialise the timeline courses view. Begin loading the events\n * if this view is active. Add the relevant event listeners.\n *\n * This function should only be called once per page load because it\n * is adding event listeners to the page.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n\n setEventReloadTime(root, Date.now());\n\n if (root.hasClass('active')) {\n // Only load if this is active otherwise it will be lazy loaded later.\n loadMoreCourses(root);\n root.attr('data-seen', true);\n }\n\n registerEventListeners(root);\n };\n\n /**\n * Reset the element back to it's initial state. Begin loading the events again\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n shown(root);\n }\n };\n\n /**\n * If this is the first time this view has been displayed then begin loading\n * the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.attr('data-seen')) {\n if (hasLoadedCourses(root)) {\n // This isn't the first time this view is shown so just reload the\n // events for the courses we've already loaded.\n reloadCourseEvents(root);\n } else {\n // We haven't loaded any courses yet so do that now.\n loadMoreCourses(root);\n }\n\n root.attr('data-seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"file":"view_courses.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_dates.min.js b/blocks/timeline/amd/build/view_dates.min.js index dc99182dd860c..a0c93b6fe5fc0 100644 --- a/blocks/timeline/amd/build/view_dates.min.js +++ b/blocks/timeline/amd/build/view_dates.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","block_timeline/event_list","core/pubsub","core/paged_content_events"],function(a,b,c,d,e){var f={EVENT_LIST_CONTAINER:'[data-region="event-list-container"]'},g=[5,10,25],h=function(a){var b=parseInt(a.data("limit"),10),c=!1,d=g.map(function(a){return b==a&&(c=!0),{value:a,active:b==a}});return c||(d[0].active=!0),d},i=function(b,c){var f=c+e.SET_ITEMS_PER_PAGE_LIMIT;d.subscribe(f,function(c){a(b).data("limit",c)})},j=function(d){var e=d.find(f.EVENT_LIST_CONTAINER),g=a(e).attr("id")+"user_block_timeline"+Math.random();i(d,g);var j=h(d),k={persistentLimitKey:"block_timeline_user_limit_preference",eventNamespace:g};b.get_string("ariaeventlistpaginationnavdates","block_timeline").then(function(a){return c.init(e,j,{},a,k),a})["catch"](function(){c.init(e,j,{},"",k)})},k=function(b){b=a(b),b.hasClass("active")&&(j(b),b.data("seen",!0))},l=function(a){a.removeAttr("data-seen"),a.hasClass("active")&&(j(a),a.data("seen",!0))},m=function(a){a.data("seen")||(j(a),a.data("seen",!0))};return{init:k,reset:l,shown:m}}); \ No newline at end of file +define ("block_timeline/view_dates",["jquery","core/str","block_timeline/event_list","core/pubsub","core/paged_content_events"],function(a,b,c,d,e){var f={EVENT_LIST_CONTAINER:"[data-region=\"event-list-container\"]"},g=[5,10,25],h=function(a){var b=parseInt(a.data("limit"),10),c=!1,d=g.map(function(a){if(b==a){c=!0}return{value:a,active:b==a}});if(!c){d[0].active=!0}return d},i=function(b,c){var f=c+e.SET_ITEMS_PER_PAGE_LIMIT;d.subscribe(f,function(c){a(b).data("limit",c)})},j=function(d){var e=d.find(f.EVENT_LIST_CONTAINER),g=a(e).attr("id")+"user_block_timeline"+Math.random();i(d,g);var j=h(d),k={persistentLimitKey:"block_timeline_user_limit_preference",eventNamespace:g};b.get_string("ariaeventlistpaginationnavdates","block_timeline").then(function(a){c.init(e,j,{},a,k);return a}).catch(function(){c.init(e,j,{},"",k)})};return{init:function init(b){b=a(b);if(b.hasClass("active")){j(b);b.data("seen",!0)}},reset:function reset(a){a.removeAttr("data-seen");if(a.hasClass("active")){j(a);a.data("seen",!0)}},shown:function shown(a){if(!a.data("seen")){j(a);a.data("seen",!0)}}}}); +//# sourceMappingURL=view_dates.min.js.map diff --git a/blocks/timeline/amd/build/view_dates.min.js.map b/blocks/timeline/amd/build/view_dates.min.js.map new file mode 100644 index 0000000000000..93dcbe3c571d4 --- /dev/null +++ b/blocks/timeline/amd/build/view_dates.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view_dates.js"],"names":["define","$","Str","EventList","PubSub","PagedContentEvents","SELECTORS","EVENT_LIST_CONTAINER","DEFAULT_PAGE_LIMIT","getPagingLimits","root","limitPref","parseInt","data","isDefaultSet","limits","map","value","active","registerEventListeners","namespace","event","SET_ITEMS_PER_PAGE_LIMIT","subscribe","limit","load","eventListContainer","find","attr","Math","random","config","persistentLimitKey","eventNamespace","get_string","then","string","init","catch","hasClass","reset","removeAttr","shown"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Manage the timeline dates view for the timeline block.\n *\n * @package block_timeline\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/str',\n 'block_timeline/event_list',\n 'core/pubsub',\n 'core/paged_content_events'\n],\nfunction(\n $,\n Str,\n EventList,\n PubSub,\n PagedContentEvents\n) {\n\n var SELECTORS = {\n EVENT_LIST_CONTAINER: '[data-region=\"event-list-container\"]',\n };\n\n var DEFAULT_PAGE_LIMIT = [5, 10, 25];\n\n /**\n * Generate a paged content array of limits taking into account user preferences\n *\n * @param {object} root The root element for the timeline dates view.\n * @return {array} Array of limit objects\n */\n var getPagingLimits = function(root) {\n var limitPref = parseInt(root.data('limit'), 10);\n var isDefaultSet = false;\n var limits = DEFAULT_PAGE_LIMIT.map(function(value) {\n if (limitPref == value) {\n isDefaultSet = true;\n }\n\n return {\n value: value,\n active: limitPref == value\n };\n });\n\n if (!isDefaultSet) {\n limits[0].active = true;\n }\n\n return limits;\n };\n\n /**\n * Setup the listeners for the timeline block\n *\n * @param {string} root view dates container\n * @param {string} namespace The namespace for the paged content\n */\n var registerEventListeners = function(root, namespace) {\n var event = namespace + PagedContentEvents.SET_ITEMS_PER_PAGE_LIMIT;\n PubSub.subscribe(event, function(limit) {\n $(root).data('limit', limit);\n });\n };\n\n /**\n * Initialise the event list and being loading the events.\n *\n * @param {object} root The root element for the timeline dates view.\n */\n var load = function(root) {\n var eventListContainer = root.find(SELECTORS.EVENT_LIST_CONTAINER);\n var namespace = $(eventListContainer).attr('id') + \"user_block_timeline\" + Math.random();\n registerEventListeners(root, namespace);\n\n var limits = getPagingLimits(root);\n var config = {\n persistentLimitKey: \"block_timeline_user_limit_preference\",\n eventNamespace: namespace\n };\n Str.get_string('ariaeventlistpaginationnavdates', 'block_timeline')\n .then(function(string) {\n EventList.init(eventListContainer, limits, {}, string, config);\n return string;\n })\n .catch(function() {\n // Ignore if we can't load the string. Still init the event list.\n EventList.init(eventListContainer, limits, {}, \"\", config);\n });\n };\n\n /**\n * Initialise the timeline dates view. Begin loading the events\n * if this view is active.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var init = function(root) {\n root = $(root);\n if (root.hasClass('active')) {\n load(root);\n root.data('seen', true);\n }\n };\n\n /**\n * Reset the view back to it's initial state. If this view is active then\n * beging loading the events.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var reset = function(root) {\n root.removeAttr('data-seen');\n if (root.hasClass('active')) {\n load(root);\n root.data('seen', true);\n }\n };\n\n /**\n * Load the events if this is the first time the view is displayed.\n *\n * @param {object} root The root element for the timeline courses view.\n */\n var shown = function(root) {\n if (!root.data('seen')) {\n load(root);\n root.data('seen', true);\n }\n };\n\n return {\n init: init,\n reset: reset,\n shown: shown\n };\n});\n"],"file":"view_dates.min.js"} \ No newline at end of file diff --git a/blocks/timeline/amd/build/view_nav.min.js b/blocks/timeline/amd/build/view_nav.min.js index 09fbfd9400446..cb794f92eb14f 100644 --- a/blocks/timeline/amd/build/view_nav.min.js +++ b/blocks/timeline/amd/build/view_nav.min.js @@ -1 +1,2 @@ -define(["jquery","core/custom_interaction_events","block_timeline/view","core/ajax","core/notification"],function(a,b,c,d,e){var f={TIMELINE_DAY_FILTER:'[data-region="day-filter"]',TIMELINE_DAY_FILTER_OPTION:"[data-from]",TIMELINE_VIEW_SELECTOR:'[data-region="view-selector"]',DATA_DAYS_OFFSET:"[data-days-offset]",DATA_DAYS_LIMIT:"[data-days-limit]"},g=function(a,b){var c={methodname:"core_user_update_user_preferences",args:{preferences:[{type:a,value:b}]}};d.call([c])[0].fail(e.exception)},h=function(d,e){var h=d.find(f.TIMELINE_DAY_FILTER);b.define(h,[b.events.activate]),h.on(b.events.activate,f.TIMELINE_DAY_FILTER_OPTION,function(b,h){var i=a(b.currentTarget).data("filtername"),j="block_timeline_user_filter_preference";g(j,i);var k=a(b.target).closest(f.TIMELINE_DAY_FILTER_OPTION);if(!k.hasClass("active")){var l=k.attr("data-from"),m=k.attr("data-to"),n=d.find(f.DATA_DAYS_OFFSET);n.attr("data-days-offset",l),void 0!=m?n.attr("data-days-limit",m):n.removeAttr("data-days-limit"),c.reset(e),h.originalEvent.preventDefault()}})},i=function(d,e){var h=d.find(f.TIMELINE_VIEW_SELECTOR);h.on("shown shown.bs.tab",function(){c.shown(e)}),b.define(h,[b.events.activate]),h.on(b.events.activate,"[data-toggle='tab']",function(b){var c=a(b.currentTarget).data("filtername"),d="block_timeline_user_sort_preference";g(d,c)})},j=function(b,c){b=a(b),h(b,c),i(b,c)};return{init:j}}); \ No newline at end of file +define ("block_timeline/view_nav",["jquery","core/custom_interaction_events","block_timeline/view","core/ajax","core/notification"],function(a,b,c,d,e){var f={TIMELINE_DAY_FILTER:"[data-region=\"day-filter\"]",TIMELINE_DAY_FILTER_OPTION:"[data-from]",TIMELINE_VIEW_SELECTOR:"[data-region=\"view-selector\"]",DATA_DAYS_OFFSET:"[data-days-offset]",DATA_DAYS_LIMIT:"[data-days-limit]"},g=function(a,b){d.call([{methodname:"core_user_update_user_preferences",args:{preferences:[{type:a,value:b}]}}])[0].fail(e.exception)},h=function(d,h){var i=d.find(f.TIMELINE_DAY_FILTER);b.define(i,[b.events.activate]);i.on(b.events.activate,f.TIMELINE_DAY_FILTER_OPTION,function(b,e){var i=a(b.currentTarget).data("filtername");g("block_timeline_user_filter_preference",i);var j=a(b.target).closest(f.TIMELINE_DAY_FILTER_OPTION);if(j.hasClass("active")){return}var k=j.attr("data-from"),l=j.attr("data-to"),m=d.find(f.DATA_DAYS_OFFSET);m.attr("data-days-offset",k);if(l!=void 0){m.attr("data-days-limit",l)}else{m.removeAttr("data-days-limit")}c.reset(h);e.originalEvent.preventDefault()})},i=function(d,e){var h=d.find(f.TIMELINE_VIEW_SELECTOR);h.on("shown shown.bs.tab",function(){c.shown(e)});b.define(h,[b.events.activate]);h.on(b.events.activate,"[data-toggle='tab']",function(b){var c=a(b.currentTarget).data("filtername");g("block_timeline_user_sort_preference",c)})};return{init:function init(b,c){b=a(b);h(b,c);i(b,c)}}}); +//# sourceMappingURL=view_nav.min.js.map diff --git a/blocks/timeline/amd/build/view_nav.min.js.map b/blocks/timeline/amd/build/view_nav.min.js.map new file mode 100644 index 0000000000000..1e2b36fb0fd9a --- /dev/null +++ b/blocks/timeline/amd/build/view_nav.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view_nav.js"],"names":["define","$","CustomEvents","View","Ajax","Notification","SELECTORS","TIMELINE_DAY_FILTER","TIMELINE_DAY_FILTER_OPTION","TIMELINE_VIEW_SELECTOR","DATA_DAYS_OFFSET","DATA_DAYS_LIMIT","updateUserPreferences","type","value","call","methodname","args","preferences","fail","exception","registerTimelineDaySelector","root","timelineViewRoot","timelineDaySelectorContainer","find","events","activate","on","e","data","filtername","currentTarget","option","target","closest","hasClass","daysOffset","attr","daysLimit","elementsWithDaysOffset","removeAttr","reset","originalEvent","preventDefault","registerViewSelector","viewSelector","shown","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Manage the timeline view navigation for the timeline block.\n *\n * @package block_timeline\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(\n[\n 'jquery',\n 'core/custom_interaction_events',\n 'block_timeline/view',\n 'core/ajax',\n 'core/notification'\n],\nfunction(\n $,\n CustomEvents,\n View,\n Ajax,\n Notification\n) {\n\n var SELECTORS = {\n TIMELINE_DAY_FILTER: '[data-region=\"day-filter\"]',\n TIMELINE_DAY_FILTER_OPTION: '[data-from]',\n TIMELINE_VIEW_SELECTOR: '[data-region=\"view-selector\"]',\n DATA_DAYS_OFFSET: '[data-days-offset]',\n DATA_DAYS_LIMIT: '[data-days-limit]',\n };\n\n /**\n * Generic handler to persist user preferences\n *\n * @param {string} type The name of the attribute you're updating\n * @param {string} value The value of the attribute you're updating\n */\n var updateUserPreferences = function(type, value) {\n var request = {\n methodname: 'core_user_update_user_preferences',\n args: {\n preferences: [\n {\n type: type,\n value: value\n }\n ]\n }\n };\n\n Ajax.call([request])[0]\n .fail(Notification.exception);\n };\n\n /**\n * Event listener for the day selector (\"Next 7 days\", \"Next 30 days\", etc).\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerTimelineDaySelector = function(root, timelineViewRoot) {\n var timelineDaySelectorContainer = root.find(SELECTORS.TIMELINE_DAY_FILTER);\n\n CustomEvents.define(timelineDaySelectorContainer, [CustomEvents.events.activate]);\n timelineDaySelectorContainer.on(\n CustomEvents.events.activate,\n SELECTORS.TIMELINE_DAY_FILTER_OPTION,\n function(e, data) {\n // Update the user preference\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_filter_preference';\n updateUserPreferences(type, filtername);\n\n var option = $(e.target).closest(SELECTORS.TIMELINE_DAY_FILTER_OPTION);\n\n if (option.hasClass('active')) {\n // If it's already active then we don't need to do anything.\n return;\n }\n\n var daysOffset = option.attr('data-from');\n var daysLimit = option.attr('data-to');\n var elementsWithDaysOffset = root.find(SELECTORS.DATA_DAYS_OFFSET);\n\n elementsWithDaysOffset.attr('data-days-offset', daysOffset);\n\n if (daysLimit != undefined) {\n elementsWithDaysOffset.attr('data-days-limit', daysLimit);\n } else {\n elementsWithDaysOffset.removeAttr('data-days-limit');\n }\n\n // Reset the views to reinitialise the event lists now that we've\n // updated the day limits.\n View.reset(timelineViewRoot);\n\n data.originalEvent.preventDefault();\n }\n );\n };\n\n /**\n * Event listener for the \"sort\" button in the timeline navigation that allows for\n * changing between the timeline dates and courses views.\n *\n * On a view change we tell the timeline view module that the view has been shown\n * so that it can handle how to display the appropriate view.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var registerViewSelector = function(root, timelineViewRoot) {\n var viewSelector = root.find(SELECTORS.TIMELINE_VIEW_SELECTOR);\n\n // Listen for when the user changes tab so that we can show the first set of courses\n // and load their events when they request the sort by courses view for the first time.\n viewSelector.on('shown shown.bs.tab', function() {\n View.shown(timelineViewRoot);\n });\n\n // Event selector for user_sort\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(CustomEvents.events.activate, \"[data-toggle='tab']\", function(e) {\n var filtername = $(e.currentTarget).data('filtername');\n var type = 'block_timeline_user_sort_preference';\n updateUserPreferences(type, filtername);\n });\n };\n\n /**\n * Initialise the timeline view navigation by adding event listeners to\n * the navigation elements.\n *\n * @param {object} root The root element for the timeline block\n * @param {object} timelineViewRoot The root element for the timeline view\n */\n var init = function(root, timelineViewRoot) {\n root = $(root);\n registerTimelineDaySelector(root, timelineViewRoot);\n registerViewSelector(root, timelineViewRoot);\n };\n\n return {\n init: init\n };\n});\n"],"file":"view_nav.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/calendar.min.js b/calendar/amd/build/calendar.min.js index b3f1b9087dc3f..2553e0b2fbf81 100644 --- a/calendar/amd/build/calendar.min.js +++ b/calendar/amd/build/calendar.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/str","core/templates","core/notification","core/custom_interaction_events","core/modal_events","core/modal_factory","core_calendar/modal_event_form","core_calendar/summary_modal","core_calendar/repository","core_calendar/events","core_calendar/view_manager","core_calendar/crud","core_calendar/selectors"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p={ROOT:"[data-region='calendar']",DAY:"[data-region='day']",NEW_EVENT_BUTTON:"[data-action='new-event-button']",DAY_CONTENT:"[data-region='day-content']",LOADING_ICON:".loading-icon",VIEW_DAY_LINK:"[data-action='view-day-link']",CALENDAR_MONTH_WRAPPER:".calendarwrapper",TODAY:".today"},q=function(b,c,f,g){var h=null,i=g.attr("data-day-timestamp");f&&(h=f.attr("data-day-timestamp")),f&&h==i||d.render("core/loading",{}).then(function(a,b){g.find(p.DAY_CONTENT).addClass("hidden"),d.appendNodeContents(g,a,b),f&&(f.find(p.DAY_CONTENT).addClass("hidden"),d.appendNodeContents(f,a,b))}).then(function(){return k.updateEventStartDay(c,i)}).then(function(){a("body").trigger(l.eventMoved,[c,f,g])}).always(function(){var a=g.find(p.LOADING_ICON);if(g.find(p.DAY_CONTENT).removeClass("hidden"),d.replaceNode(a,"",""),f){var b=f.find(p.LOADING_ICON);f.find(p.DAY_CONTENT).removeClass("hidden"),d.replaceNode(b,"","")}}).fail(e.exception)},r=function(b,c){var d=a("body");d.on(l.created,function(){m.reloadCurrentMonth(b)}),d.on(l.deleted,function(){m.reloadCurrentMonth(b)}),d.on(l.updated,function(){m.reloadCurrentMonth(b)}),d.on(l.editActionEvent,function(a,b){window.location.assign(b)}),d.on(l.moveEvent,q),d.on(l.eventMoved,function(){m.reloadCurrentMonth(b)}),n.registerEditListeners(b,c)},s=function(b){b.on("click",p.VIEW_DAY_LINK,function(c){var d=a(c.target),f=d.data("year"),g=d.data("month"),h=d.data("day"),i=d.data("courseid"),j=d.data("categoryid");m.refreshDayContent(b,f,g,h,i,j,b,"core_calendar/calendar_day").then(function(){c.preventDefault();var a="?view=day&time="+d.data("timestamp");return window.history.pushState({},"",a)}).fail(e.exception)}),b.on("change",o.elements.courseSelector,function(){var c=a(this),d=c.val();m.reloadCurrentMonth(b,d,null).then(function(){return b.find(o.elements.courseSelector).val(d)}).fail(e.exception)});var c=n.registerEventFormModal(b),d=a(p.CALENDAR_MONTH_WRAPPER).data("context-id");r(b,c),d&&b.on("click",p.DAY,function(b){var d=a(b.target);if(!d.is(p.VIEW_DAY_LINK)){var f=a(this).attr("data-new-event-timestamp");c.then(function(a){var b=d.closest(o.wrapper);a.setCourseId(b.data("courseid"));var c=b.data("categoryid");"undefined"!=typeof c&&a.setCategoryId(c),a.setContextId(b.data("contextId")),a.setStartTime(f),a.show()}).fail(e.exception),b.preventDefault()}})};return{init:function(b){b=a(b),m.init(b),s(b)}}}); \ No newline at end of file +define ("core_calendar/calendar",["jquery","core/ajax","core/str","core/templates","core/notification","core/custom_interaction_events","core/modal_events","core/modal_factory","core_calendar/modal_event_form","core_calendar/summary_modal","core_calendar/repository","core_calendar/events","core_calendar/view_manager","core_calendar/crud","core_calendar/selectors"],function(a,b,c,d,f,g,h,i,j,k,l,m,n,o,p){var q={ROOT:"[data-region='calendar']",DAY:"[data-region='day']",NEW_EVENT_BUTTON:"[data-action='new-event-button']",DAY_CONTENT:"[data-region='day-content']",LOADING_ICON:".loading-icon",VIEW_DAY_LINK:"[data-action='view-day-link']",CALENDAR_MONTH_WRAPPER:".calendarwrapper",TODAY:".today"},r=function(b,c,e,g){var h=null,i=g.attr("data-day-timestamp");if(e){h=e.attr("data-day-timestamp")}if(!e||h!=i){d.render("core/loading",{}).then(function(a,b){g.find(q.DAY_CONTENT).addClass("hidden");d.appendNodeContents(g,a,b);if(e){e.find(q.DAY_CONTENT).addClass("hidden");d.appendNodeContents(e,a,b)}}).then(function(){return l.updateEventStartDay(c,i)}).then(function(){a("body").trigger(m.eventMoved,[c,e,g])}).always(function(){var a=g.find(q.LOADING_ICON);g.find(q.DAY_CONTENT).removeClass("hidden");d.replaceNode(a,"","");if(e){var b=e.find(q.LOADING_ICON);e.find(q.DAY_CONTENT).removeClass("hidden");d.replaceNode(b,"","")}}).fail(f.exception)}},s=function(b,c){var d=a("body");d.on(m.created,function(){n.reloadCurrentMonth(b)});d.on(m.deleted,function(){n.reloadCurrentMonth(b)});d.on(m.updated,function(){n.reloadCurrentMonth(b)});d.on(m.editActionEvent,function(a,b){window.location.assign(b)});d.on(m.moveEvent,r);d.on(m.eventMoved,function(){n.reloadCurrentMonth(b)});o.registerEditListeners(b,c)},t=function(b){b.on("click",q.VIEW_DAY_LINK,function(c){var d=a(c.target),e=d.data("year"),g=d.data("month"),h=d.data("day"),i=d.data("courseid"),j=d.data("categoryid");n.refreshDayContent(b,e,g,h,i,j,b,"core_calendar/calendar_day").then(function(){c.preventDefault();var a="?view=day&time="+d.data("timestamp");return window.history.pushState({},"",a)}).fail(f.exception)});b.on("change",p.elements.courseSelector,function(){var c=a(this),d=c.val();n.reloadCurrentMonth(b,d,null).then(function(){return b.find(p.elements.courseSelector).val(d)}).fail(f.exception)});var c=o.registerEventFormModal(b),d=a(q.CALENDAR_MONTH_WRAPPER).data("context-id");s(b,c);if(d){b.on("click",q.DAY,function(b){var d=a(b.target);if(!d.is(q.VIEW_DAY_LINK)){var e=a(this).attr("data-new-event-timestamp");c.then(function(a){var b=d.closest(p.wrapper);a.setCourseId(b.data("courseid"));var c=b.data("categoryid");if("undefined"!=typeof c){a.setCategoryId(c)}a.setContextId(b.data("contextId"));a.setStartTime(e);a.show()}).fail(f.exception);b.preventDefault()}})}};return{init:function init(b){b=a(b);n.init(b);t(b)}}}); +//# sourceMappingURL=calendar.min.js.map diff --git a/calendar/amd/build/calendar.min.js.map b/calendar/amd/build/calendar.min.js.map new file mode 100644 index 0000000000000..aa84975f2fb54 --- /dev/null +++ b/calendar/amd/build/calendar.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar.js"],"names":["define","$","Ajax","Str","Templates","Notification","CustomEvents","ModalEvents","ModalFactory","ModalEventForm","SummaryModal","CalendarRepository","CalendarEvents","CalendarViewManager","CalendarCrud","CalendarSelectors","SELECTORS","ROOT","DAY","NEW_EVENT_BUTTON","DAY_CONTENT","LOADING_ICON","VIEW_DAY_LINK","CALENDAR_MONTH_WRAPPER","TODAY","handleMoveEvent","e","eventId","originElement","destinationElement","originTimestamp","destinationTimestamp","attr","render","then","html","js","find","addClass","appendNodeContents","updateEventStartDay","trigger","eventMoved","always","destinationLoadingElement","removeClass","replaceNode","originLoadingElement","fail","exception","registerCalendarEventListeners","root","eventFormModalPromise","body","on","created","reloadCurrentMonth","deleted","updated","editActionEvent","url","window","location","assign","moveEvent","registerEditListeners","registerEventListeners","dayLink","target","year","data","month","day","courseId","categoryId","refreshDayContent","preventDefault","history","pushState","elements","courseSelector","selectElement","val","eventFormPromise","registerEventFormModal","contextId","is","startTime","modal","wrapper","closest","setCourseId","setCategoryId","setContextId","setStartTime","show","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @package core_calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/templates',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal_events',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core_calendar/summary_modal',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/crud',\n 'core_calendar/selectors',\n ],\n function(\n $,\n Ajax,\n Str,\n Templates,\n Notification,\n CustomEvents,\n ModalEvents,\n ModalFactory,\n ModalEventForm,\n SummaryModal,\n CalendarRepository,\n CalendarEvents,\n CalendarViewManager,\n CalendarCrud,\n CalendarSelectors\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DAY: \"[data-region='day']\",\n NEW_EVENT_BUTTON: \"[data-action='new-event-button']\",\n DAY_CONTENT: \"[data-region='day-content']\",\n LOADING_ICON: '.loading-icon',\n VIEW_DAY_LINK: \"[data-action='view-day-link']\",\n CALENDAR_MONTH_WRAPPER: \".calendarwrapper\",\n TODAY: '.today',\n };\n\n /**\n * Handler for the drag and drop move event. Provides a loading indicator\n * while the request is sent to the server to update the event start date.\n *\n * Triggers a eventMoved calendar javascript event if the event was successfully\n * updated.\n *\n * @param {event} e The calendar move event\n * @param {int} eventId The event id being moved\n * @param {object|null} originElement The jQuery element for where the event is moving from\n * @param {object} destinationElement The jQuery element for where the event is moving to\n */\n var handleMoveEvent = function(e, eventId, originElement, destinationElement) {\n var originTimestamp = null;\n var destinationTimestamp = destinationElement.attr('data-day-timestamp');\n\n if (originElement) {\n originTimestamp = originElement.attr('data-day-timestamp');\n }\n\n // If the event has actually changed day.\n if (!originElement || originTimestamp != destinationTimestamp) {\n Templates.render('core/loading', {})\n .then(function(html, js) {\n // First we show some loading icons in each of the days being affected.\n destinationElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(destinationElement, html, js);\n\n if (originElement) {\n originElement.find(SELECTORS.DAY_CONTENT).addClass('hidden');\n Templates.appendNodeContents(originElement, html, js);\n }\n return;\n })\n .then(function() {\n // Send a request to the server to make the change.\n return CalendarRepository.updateEventStartDay(eventId, destinationTimestamp);\n })\n .then(function() {\n // If the update was successful then broadcast an event letting the calendar\n // know that an event has been moved.\n $('body').trigger(CalendarEvents.eventMoved, [eventId, originElement, destinationElement]);\n return;\n })\n .always(function() {\n // Always remove the loading icons regardless of whether the update\n // request was successful or not.\n var destinationLoadingElement = destinationElement.find(SELECTORS.LOADING_ICON);\n destinationElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(destinationLoadingElement, '', '');\n\n if (originElement) {\n var originLoadingElement = originElement.find(SELECTORS.LOADING_ICON);\n originElement.find(SELECTORS.DAY_CONTENT).removeClass('hidden');\n Templates.replaceNode(originLoadingElement, '', '');\n }\n return;\n })\n .fail(Notification.exception);\n }\n };\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n * @param {object} eventFormModalPromise A promise reolved with the event form modal\n */\n var registerCalendarEventListeners = function(root, eventFormModalPromise) {\n var body = $('body');\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n body.on(CalendarEvents.editActionEvent, function(e, url) {\n // Action events needs to be edit directly on the course module.\n window.location.assign(url);\n });\n // Handle the event fired by the drag and drop code.\n body.on(CalendarEvents.moveEvent, handleMoveEvent);\n // When an event is successfully moved we should updated the UI.\n body.on(CalendarEvents.eventMoved, function() {\n CalendarViewManager.reloadCurrentMonth(root);\n });\n\n CalendarCrud.registerEditListeners(root, eventFormModalPromise);\n };\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The calendar root element\n */\n var registerEventListeners = function(root) {\n // Listen the click on the day link to render the day view.\n root.on('click', SELECTORS.VIEW_DAY_LINK, function(e) {\n var dayLink = $(e.target);\n var year = dayLink.data('year'),\n month = dayLink.data('month'),\n day = dayLink.data('day'),\n courseId = dayLink.data('courseid'),\n categoryId = dayLink.data('categoryid');\n CalendarViewManager.refreshDayContent(root, year, month, day, courseId, categoryId, root,\n 'core_calendar/calendar_day').then(function() {\n e.preventDefault();\n var url = '?view=day&time=' + dayLink.data('timestamp');\n return window.history.pushState({}, '', url);\n }).fail(Notification.exception);\n });\n\n root.on('change', CalendarSelectors.elements.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager.reloadCurrentMonth(root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.elements.courseSelector).val(courseId);\n })\n .fail(Notification.exception);\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root),\n contextId = $(SELECTORS.CALENDAR_MONTH_WRAPPER).data('context-id');\n registerCalendarEventListeners(root, eventFormPromise);\n\n if (contextId) {\n // Bind click events to calendar days.\n root.on('click', SELECTORS.DAY, function (e) {\n\n var target = $(e.target);\n\n if (!target.is(SELECTORS.VIEW_DAY_LINK)) {\n var startTime = $(this).attr('data-new-event-timestamp');\n eventFormPromise.then(function (modal) {\n var wrapper = target.closest(CalendarSelectors.wrapper);\n modal.setCourseId(wrapper.data('courseid'));\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setStartTime(startTime);\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n }\n });\n }\n };\n\n return {\n init: function(root) {\n root = $(root);\n CalendarViewManager.init(root);\n registerEventListeners(root);\n }\n };\n});\n"],"file":"calendar.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_filter.min.js b/calendar/amd/build/calendar_filter.min.js index ddf2010dcef1d..6a9f95d220296 100644 --- a/calendar/amd/build/calendar_filter.min.js +++ b/calendar/amd/build/calendar_filter.min.js @@ -1 +1,2 @@ -define(["jquery","core_calendar/selectors","core_calendar/events","core/str","core/templates"],function(a,b,c,d,e){var f=function(d){d.on("click",b.eventFilterItem,function(b){var c=a(b.currentTarget);g(c),b.preventDefault()}),a("body").on(c.viewUpdated,function(){var c=d.find(b.eventFilterItem);c.each(function(b,c){if(c=a(c),c.data("eventtype-hidden")){var d=i(c);h(d)}})})},g=function(a){var b=i(a);return b.hidden=!b.hidden,d.get_string("eventtype"+b.eventtype,"calendar").then(function(a){return b.name=a,b}).then(function(a){return e.render("core_calendar/event_filter_key",a)}).then(function(b,c){return e.replaceNode(a,b,c)}).then(function(){h(b)})},h=function(b){M.util.js_pending("month-mini-filterChanged"),a("body").trigger(c.filterChanged,{type:b.eventtype,hidden:b.hidden}),M.util.js_complete("month-mini-filterChanged")},i=function(a){return{eventtype:a.data("eventtype"),hidden:a.data("eventtype-hidden")}};return{init:function(b){b=a(b),f(b)}}}); \ No newline at end of file +define ("core_calendar/calendar_filter",["jquery","core_calendar/selectors","core_calendar/events","core/str","core/templates"],function(a,b,c,d,e){var f=function(d){d.on("click",b.eventFilterItem,function(b){var c=a(b.currentTarget);g(c);b.preventDefault()});a("body").on(c.viewUpdated,function(){var c=d.find(b.eventFilterItem);c.each(function(b,c){c=a(c);if(c.data("eventtype-hidden")){var d=i(c);h(d)}})})},g=function(a){var b=i(a);b.hidden=!b.hidden;return d.get_string("eventtype"+b.eventtype,"calendar").then(function(a){b.name=a;return b}).then(function(a){return e.render("core_calendar/event_filter_key",a)}).then(function(b,c){return e.replaceNode(a,b,c)}).then(function(){h(b)})},h=function(b){M.util.js_pending("month-mini-filterChanged");a("body").trigger(c.filterChanged,{type:b.eventtype,hidden:b.hidden});M.util.js_complete("month-mini-filterChanged")},i=function(a){return{eventtype:a.data("eventtype"),hidden:a.data("eventtype-hidden")}};return{init:function init(b){b=a(b);f(b)}}}); +//# sourceMappingURL=calendar_filter.min.js.map diff --git a/calendar/amd/build/calendar_filter.min.js.map b/calendar/amd/build/calendar_filter.min.js.map new file mode 100644 index 0000000000000..68ce74d5daba9 --- /dev/null +++ b/calendar/amd/build/calendar_filter.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar_filter.js"],"names":["define","$","CalendarSelectors","CalendarEvents","Str","Templates","registerEventListeners","root","on","eventFilterItem","e","target","currentTarget","toggleFilter","preventDefault","viewUpdated","filters","find","each","i","filter","data","getFilterData","fireFilterChangedEvent","hidden","get_string","eventtype","then","nameStr","name","context","render","html","js","replaceNode","M","util","js_pending","trigger","filterChanged","type","js_complete","init"],"mappings":"AAuBAA,OAAM,iCAAC,CACH,QADG,CAEH,yBAFG,CAGH,sBAHG,CAIH,UAJG,CAKH,gBALG,CAAD,CAON,SACIC,CADJ,CAEIC,CAFJ,CAGIC,CAHJ,CAIIC,CAJJ,CAKIC,CALJ,CAME,IAEMC,CAAAA,CAAsB,CAAG,SAASC,CAAT,CAAe,CACxCA,CAAI,CAACC,EAAL,CAAQ,OAAR,CAAiBN,CAAiB,CAACO,eAAnC,CAAoD,SAASC,CAAT,CAAY,CAC5D,GAAIC,CAAAA,CAAM,CAAGV,CAAC,CAACS,CAAC,CAACE,aAAH,CAAd,CAEAC,CAAY,CAACF,CAAD,CAAZ,CAEAD,CAAC,CAACI,cAAF,EACH,CAND,EAQAb,CAAC,CAAC,MAAD,CAAD,CAAUO,EAAV,CAAaL,CAAc,CAACY,WAA5B,CAAyC,UAAW,CAChD,GAAIC,CAAAA,CAAO,CAAGT,CAAI,CAACU,IAAL,CAAUf,CAAiB,CAACO,eAA5B,CAAd,CAEAO,CAAO,CAACE,IAAR,CAAa,SAASC,CAAT,CAAYC,CAAZ,CAAoB,CAC7BA,CAAM,CAAGnB,CAAC,CAACmB,CAAD,CAAV,CACA,GAAIA,CAAM,CAACC,IAAP,CAAY,kBAAZ,CAAJ,CAAqC,CACjC,GAAIA,CAAAA,CAAI,CAAGC,CAAa,CAACF,CAAD,CAAxB,CACAG,CAAsB,CAACF,CAAD,CACzB,CACJ,CAND,CAOH,CAVD,CAWH,CAtBH,CAwBMR,CAAY,CAAG,SAASF,CAAT,CAAiB,CAChC,GAAIU,CAAAA,CAAI,CAAGC,CAAa,CAACX,CAAD,CAAxB,CAGAU,CAAI,CAACG,MAAL,CAAc,CAACH,CAAI,CAACG,MAApB,CAEA,MAAOpB,CAAAA,CAAG,CAACqB,UAAJ,CAAe,YAAcJ,CAAI,CAACK,SAAlC,CAA6C,UAA7C,EACNC,IADM,CACD,SAASC,CAAT,CAAkB,CACpBP,CAAI,CAACQ,IAAL,CAAYD,CAAZ,CAEA,MAAOP,CAAAA,CACV,CALM,EAMNM,IANM,CAMD,SAASG,CAAT,CAAkB,CACpB,MAAOzB,CAAAA,CAAS,CAAC0B,MAAV,CAAiB,gCAAjB,CAAmDD,CAAnD,CACV,CARM,EASNH,IATM,CASD,SAASK,CAAT,CAAeC,CAAf,CAAmB,CACrB,MAAO5B,CAAAA,CAAS,CAAC6B,WAAV,CAAsBvB,CAAtB,CAA8BqB,CAA9B,CAAoCC,CAApC,CACV,CAXM,EAYNN,IAZM,CAYD,UAAW,CACbJ,CAAsB,CAACF,CAAD,CAEzB,CAfM,CAgBV,CA9CH,CAqDME,CAAsB,CAAG,SAASF,CAAT,CAAe,CACxCc,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkB,0BAAlB,EACApC,CAAC,CAAC,MAAD,CAAD,CAAUqC,OAAV,CAAkBnC,CAAc,CAACoC,aAAjC,CAAgD,CAC5CC,IAAI,CAAEnB,CAAI,CAACK,SADiC,CAE5CF,MAAM,CAAEH,CAAI,CAACG,MAF+B,CAAhD,EAIAW,CAAC,CAACC,IAAF,CAAOK,WAAP,CAAmB,0BAAnB,CACH,CA5DH,CAoEMnB,CAAa,CAAG,SAASX,CAAT,CAAiB,CACjC,MAAO,CACHe,SAAS,CAAEf,CAAM,CAACU,IAAP,CAAY,WAAZ,CADR,CAEHG,MAAM,CAAEb,CAAM,CAACU,IAAP,CAAY,kBAAZ,CAFL,CAIV,CAzEH,CA2EE,MAAO,CACHqB,IAAI,CAAE,cAASnC,CAAT,CAAe,CACjBA,CAAI,CAAGN,CAAC,CAACM,CAAD,CAAR,CAEAD,CAAsB,CAACC,CAAD,CACzB,CALE,CAOV,CA/FK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_filter\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/str',\n 'core/templates',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n Str,\n Templates\n) {\n\n var registerEventListeners = function(root) {\n root.on('click', CalendarSelectors.eventFilterItem, function(e) {\n var target = $(e.currentTarget);\n\n toggleFilter(target);\n\n e.preventDefault();\n });\n\n $('body').on(CalendarEvents.viewUpdated, function() {\n var filters = root.find(CalendarSelectors.eventFilterItem);\n\n filters.each(function(i, filter) {\n filter = $(filter);\n if (filter.data('eventtype-hidden')) {\n var data = getFilterData(filter);\n fireFilterChangedEvent(data);\n }\n });\n });\n };\n\n var toggleFilter = function(target) {\n var data = getFilterData(target);\n\n // Toggle the hidden. We need to render the template before we change the value.\n data.hidden = !data.hidden;\n\n return Str.get_string('eventtype' + data.eventtype, 'calendar')\n .then(function(nameStr) {\n data.name = nameStr;\n\n return data;\n })\n .then(function(context) {\n return Templates.render('core_calendar/event_filter_key', context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n fireFilterChangedEvent(data);\n return;\n });\n };\n\n /**\n * Fire the filterChanged event for the specified data.\n *\n * @param {object} data The data to include\n */\n var fireFilterChangedEvent = function(data) {\n M.util.js_pending(\"month-mini-filterChanged\");\n $('body').trigger(CalendarEvents.filterChanged, {\n type: data.eventtype,\n hidden: data.hidden,\n });\n M.util.js_complete(\"month-mini-filterChanged\");\n };\n\n /**\n * Get the filter data for the specified target.\n *\n * @param {jQuery} target The target node\n * @return {Object}\n */\n var getFilterData = function(target) {\n return {\n eventtype: target.data('eventtype'),\n hidden: target.data('eventtype-hidden'),\n };\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerEventListeners(root);\n }\n };\n});\n"],"file":"calendar_filter.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_mini.min.js b/calendar/amd/build/calendar_mini.min.js index 1c3eecfb1ba17..7f9d3ec2f129d 100644 --- a/calendar/amd/build/calendar_mini.min.js +++ b/calendar/amd/build/calendar_mini.min.js @@ -1 +1,2 @@ -define(["jquery","core_calendar/selectors","core_calendar/events","core_calendar/view_manager"],function(a,b,c,d){var e=function(b){var d=a("body"),e="."+b.attr("id");d.on(c.created+e,b,f),d.on(c.deleted+e,b,f),d.on(c.updated+e,b,f),d.on(c.eventMoved+e,b,f)},f=function(b){var e=b.data,f=a("body"),g="."+e.attr("id");e.is(":visible")?d.reloadCurrentMonth(e):(f.off(c.created+g),f.off(c.deleted+g),f.off(c.updated+g),f.off(c.eventMoved+g))},g=function(e){a("body").on(c.filterChanged,function(a,c){var d=e.find(b.eventType[c.type]);d.toggleClass("calendar_event_"+c.type,!c.hidden)});var f="."+e.attr("id");a("body").on("change"+f,b.elements.courseSelector,function(){if(e.is(":visible")){var b=a(this),c=b.val(),g=null;d.reloadCurrentMonth(e,c,g)}else a("body").off("change"+f)})};return{init:function(b,c){b=a(b),d.init(b),g(b),e(b),c&&d.reloadCurrentMonth(b)}}}); \ No newline at end of file +define ("core_calendar/calendar_mini",["jquery","core_calendar/selectors","core_calendar/events","core_calendar/view_manager"],function(a,b,c,d){var e=function(b){var d=a("body"),e="."+b.attr("id");d.on(c.created+e,b,f);d.on(c.deleted+e,b,f);d.on(c.updated+e,b,f);d.on(c.eventMoved+e,b,f)},f=function(b){var e=b.data,f=a("body"),g="."+e.attr("id");if(e.is(":visible")){d.reloadCurrentMonth(e)}else{f.off(c.created+g);f.off(c.deleted+g);f.off(c.updated+g);f.off(c.eventMoved+g)}},g=function(f){a("body").on(c.filterChanged,function(a,c){var d=f.find(b.eventType[c.type]);d.toggleClass("calendar_event_"+c.type,!c.hidden)});var g="."+f.attr("id");a("body").on("change"+g,b.elements.courseSelector,function(){if(f.is(":visible")){var b=a(this),c=b.val();d.reloadCurrentMonth(f,c,null)}else{a("body").off("change"+g)}})};return{init:function init(b,c){b=a(b);d.init(b);g(b);e(b);if(c){d.reloadCurrentMonth(b)}}}}); +//# sourceMappingURL=calendar_mini.min.js.map diff --git a/calendar/amd/build/calendar_mini.min.js.map b/calendar/amd/build/calendar_mini.min.js.map new file mode 100644 index 0000000000000..3137c7d1cfd6b --- /dev/null +++ b/calendar/amd/build/calendar_mini.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar_mini.js"],"names":["define","$","CalendarSelectors","CalendarEvents","CalendarViewManager","registerCalendarEventListeners","root","body","namespace","attr","on","created","reloadMonth","deleted","updated","eventMoved","e","data","is","reloadCurrentMonth","off","registerEventListeners","filterChanged","daysWithEvent","find","eventType","type","toggleClass","hidden","elements","courseSelector","selectElement","courseId","val","init","loadOnInit"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is the highest level module for the calendar. It is\n * responsible for initialising all of the components required for\n * the calendar to run. It also coordinates the interaction between\n * components by listening for and responding to different events\n * triggered within the calendar UI.\n *\n * @module core_calendar/calendar\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n body.on(CalendarEvents.created + namespace, root, reloadMonth);\n body.on(CalendarEvents.deleted + namespace, root, reloadMonth);\n body.on(CalendarEvents.updated + namespace, root, reloadMonth);\n body.on(CalendarEvents.eventMoved + namespace, root, reloadMonth);\n };\n\n /**\n * Reload the month view in this month.\n *\n * @param {EventFacade} e\n */\n var reloadMonth = function(e) {\n var root = e.data;\n var body = $('body');\n var namespace = '.' + root.attr('id');\n\n if (root.is(':visible')) {\n CalendarViewManager.reloadCurrentMonth(root);\n } else {\n // The root has been removed.\n // Remove all events in the namespace.\n body.off(CalendarEvents.created + namespace);\n body.off(CalendarEvents.deleted + namespace);\n body.off(CalendarEvents.updated + namespace);\n body.off(CalendarEvents.eventMoved + namespace);\n }\n };\n\n var registerEventListeners = function(root) {\n $('body').on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n\n daysWithEvent.toggleClass('calendar_event_' + data.type, !data.hidden);\n });\n\n var namespace = '.' + root.attr('id');\n $('body').on('change' + namespace, CalendarSelectors.elements.courseSelector, function() {\n if (root.is(':visible')) {\n var selectElement = $(this);\n var courseId = selectElement.val();\n var categoryId = null;\n\n CalendarViewManager.reloadCurrentMonth(root, courseId, categoryId);\n } else {\n $('body').off('change' + namespace);\n }\n });\n\n };\n\n return {\n init: function(root, loadOnInit) {\n root = $(root);\n\n CalendarViewManager.init(root);\n registerEventListeners(root);\n registerCalendarEventListeners(root);\n\n if (loadOnInit) {\n // The calendar hasn't yet loaded it's events so we\n // should load them as soon as we've initialised.\n CalendarViewManager.reloadCurrentMonth(root);\n }\n\n }\n };\n});\n"],"file":"calendar_mini.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_threemonth.min.js b/calendar/amd/build/calendar_threemonth.min.js index 857d89e422ecb..b3af839d35856 100644 --- a/calendar/amd/build/calendar_threemonth.min.js +++ b/calendar/amd/build/calendar_threemonth.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core_calendar/selectors","core_calendar/events","core/templates","core_calendar/view_manager"],function(a,b,c,d,e,f){var g=function(e){var g=a("body");g.on([d.monthChanged,d.dayChanged].join(" "),function(a,c,d,f,g){e.queue(function(e){return h(a,c,d,f,g).then(function(){return e()}).fail(b.exception)})});var h=function(b,d,g,h,i){var j=e.find('[data-year="'+d+'"][data-month="'+g+'"]'),k=j.closest(c.calendarPeriods.month),l=e.find(c.calendarPeriods.month),m=a(l[0]),n=a(l[2]),o=a("");o.attr("data-template","core_calendar/threemonth_month"),o.attr("data-includenavigation",!1),o.attr("data-mini",!0);var p=a("
        ");p.hide(),p.append(o);var q,r,s;return k.is(m)?(p.insertBefore(m),q=m.data("previousYear"),r=m.data("previousMonth"),s=n):k.is(n)&&(p.insertAfter(n),q=n.data("nextYear"),r=n.data("nextMonth"),s=m),f.refreshMonthContent(o,q,r,h,i,o).then(function(){var b=a.Deferred(),c=a.Deferred();return s.slideUp("fast",function(){a(this).remove(),b.resolve()}),p.slideDown("fast",function(){c.resolve()}),a.when(b,c)})};e.on("click",c.links.miniDayLink,function(b){var d=a(b.target),e=d.data("year"),g=d.data("month"),h=d.text(),i=d.data("courseid"),j=d.data("categoryid"),k=a("body").find(c.calendarMain);f.refreshDayContent(k,e,g,h,i,j,k,"core_calendar/calendar_day"),b.preventDefault(),window.history.pushState({},"","?view=day")})};return{init:function(b){b=a(b),g(b)}}}); \ No newline at end of file +define ("core_calendar/calendar_threemonth",["jquery","core/notification","core_calendar/selectors","core_calendar/events","core/templates","core_calendar/view_manager"],function(a,b,c,d,e,f){var g=function(g){var h=a("body");h.on([d.monthChanged,d.dayChanged].join(" "),function(a,c,d,e,f){g.queue(function(g){return i(a,c,d,e,f).then(function(){return g()}).fail(b.exception)})});var i=function(b,d,e,h,i){var j=g.find("[data-year=\""+d+"\"][data-month=\""+e+"\"]"),k=j.closest(c.calendarPeriods.month),l=g.find(c.calendarPeriods.month),m=a(l[0]),n=a(l[2]),o=a("");o.attr("data-template","core_calendar/threemonth_month");o.attr("data-includenavigation",!1);o.attr("data-mini",!0);var p=a("
        ");p.hide();p.append(o);var q,r,s;if(k.is(m)){p.insertBefore(m);q=m.data("previousYear");r=m.data("previousMonth");s=n}else if(k.is(n)){p.insertAfter(n);q=n.data("nextYear");r=n.data("nextMonth");s=m}return f.refreshMonthContent(o,q,r,h,i,o).then(function(){var b=a.Deferred(),c=a.Deferred();s.slideUp("fast",function(){a(this).remove();b.resolve()});p.slideDown("fast",function(){c.resolve()});return a.when(b,c)})};g.on("click",c.links.miniDayLink,function(b){var d=a(b.target),e=d.data("year"),g=d.data("month"),h=d.text(),i=d.data("courseid"),j=d.data("categoryid"),k=a("body").find(c.calendarMain);f.refreshDayContent(k,e,g,h,i,j,k,"core_calendar/calendar_day");b.preventDefault();window.history.pushState({},"","?view=day")})};return{init:function init(b){b=a(b);g(b)}}}); +//# sourceMappingURL=calendar_threemonth.min.js.map diff --git a/calendar/amd/build/calendar_threemonth.min.js.map b/calendar/amd/build/calendar_threemonth.min.js.map new file mode 100644 index 0000000000000..659183310598d --- /dev/null +++ b/calendar/amd/build/calendar_threemonth.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar_threemonth.js"],"names":["define","$","Notification","CalendarSelectors","CalendarEvents","Templates","CalendarViewManager","registerCalendarEventListeners","root","body","on","monthChanged","dayChanged","join","e","year","month","courseId","categoryId","queue","next","processRequest","then","fail","exception","newCurrentMonth","find","newParent","closest","calendarPeriods","allMonths","previousMonth","nextMonth","placeHolder","attr","placeHolderContainer","hide","append","requestYear","requestMonth","oldMonth","is","insertBefore","data","insertAfter","refreshMonthContent","slideUpPromise","Deferred","slideDownPromise","slideUp","remove","resolve","slideDown","when","links","miniDayLink","target","day","text","calendarRoot","calendarMain","refreshDayContent","preventDefault","window","history","pushState","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module handles display of multiple mini calendars in a view, and\n * movement through them.\n *\n * @module core_calendar/calendar_threemonth\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core/templates',\n 'core_calendar/view_manager',\n],\nfunction(\n $,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n Templates,\n CalendarViewManager\n) {\n\n /**\n * Listen to and handle any calendar events fired by the calendar UI.\n *\n * @method registerCalendarEventListeners\n * @param {object} root The calendar root element\n */\n var registerCalendarEventListeners = function(root) {\n var body = $('body');\n body.on([CalendarEvents.monthChanged, CalendarEvents.dayChanged].join(' '), function(e, year, month, courseId, categoryId) {\n // We have to use a queue here because the calling code is decoupled from these listeners.\n // It's possible for the event to be called multiple times before one call is fully resolved.\n root.queue(function(next) {\n return processRequest(e, year, month, courseId, categoryId)\n .then(function() {\n return next();\n })\n .fail(Notification.exception)\n ;\n });\n });\n\n var processRequest = function(e, year, month, courseId, categoryId) {\n var newCurrentMonth = root.find('[data-year=\"' + year + '\"][data-month=\"' + month + '\"]');\n var newParent = newCurrentMonth.closest(CalendarSelectors.calendarPeriods.month);\n var allMonths = root.find(CalendarSelectors.calendarPeriods.month);\n\n var previousMonth = $(allMonths[0]);\n var nextMonth = $(allMonths[2]);\n\n var placeHolder = $('');\n placeHolder.attr('data-template', 'core_calendar/threemonth_month');\n placeHolder.attr('data-includenavigation', false);\n placeHolder.attr('data-mini', true);\n var placeHolderContainer = $('
        ');\n placeHolderContainer.hide();\n placeHolderContainer.append(placeHolder);\n\n var requestYear;\n var requestMonth;\n var oldMonth;\n\n if (newParent.is(previousMonth)) {\n // Fetch the new previous month.\n placeHolderContainer.insertBefore(previousMonth);\n\n requestYear = previousMonth.data('previousYear');\n requestMonth = previousMonth.data('previousMonth');\n oldMonth = nextMonth;\n } else if (newParent.is(nextMonth)) {\n // Fetch the new next month.\n placeHolderContainer.insertAfter(nextMonth);\n requestYear = nextMonth.data('nextYear');\n requestMonth = nextMonth.data('nextMonth');\n oldMonth = previousMonth;\n }\n\n return CalendarViewManager.refreshMonthContent(\n placeHolder,\n requestYear,\n requestMonth,\n courseId,\n categoryId,\n placeHolder\n )\n .then(function() {\n var slideUpPromise = $.Deferred();\n var slideDownPromise = $.Deferred();\n oldMonth.slideUp('fast', function() {\n $(this).remove();\n slideUpPromise.resolve();\n });\n placeHolderContainer.slideDown('fast', function() {\n slideDownPromise.resolve();\n });\n\n return $.when(slideUpPromise, slideDownPromise);\n });\n };\n\n // Listen for a click on the day link in the three month block to load the day view.\n root.on('click', CalendarSelectors.links.miniDayLink, function(e) {\n\n var miniDayLink = $(e.target);\n var year = miniDayLink.data('year'),\n month = miniDayLink.data('month'),\n day = miniDayLink.text(),\n courseId = miniDayLink.data('courseid'),\n categoryId = miniDayLink.data('categoryid'),\n calendarRoot = $('body').find(CalendarSelectors.calendarMain);\n CalendarViewManager.refreshDayContent(calendarRoot, year, month, day, courseId, categoryId,\n calendarRoot, 'core_calendar/calendar_day');\n e.preventDefault();\n window.history.pushState({}, '', '?view=day');\n });\n };\n\n return {\n init: function(root) {\n root = $(root);\n\n registerCalendarEventListeners(root);\n }\n };\n});\n"],"file":"calendar_threemonth.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/calendar_view.min.js b/calendar/amd/build/calendar_view.min.js index 18416c3e0905b..0c143b4bc434a 100644 --- a/calendar/amd/build/calendar_view.min.js +++ b/calendar/amd/build/calendar_view.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/notification","core_calendar/selectors","core_calendar/events","core_calendar/view_manager","core_calendar/repository","core/modal_factory","core_calendar/modal_event_form","core/modal_events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=function(b,g){var h=a("body");k.registerRemove(b);var i="reloadCurrent"+g.charAt(0).toUpperCase()+g.slice(1);h.on(e.created,function(){f[i](b)}),h.on(e.deleted,function(){f[i](b)}),h.on(e.updated,function(){f[i](b)}),b.on("change",d.courseSelector,function(){var e=a(this),g=e.val();f[i](b,g,null).then(function(){return b.find(d.courseSelector).val(g)}).then(function(){window.history.pushState({},"","?view=upcoming&course="+g)}).fail(c.exception)}),h.on(e.filterChanged,function(a,c){var e=b.find(d.eventType[c.type]);1==c.hidden?e.addClass("hidden"):e.removeClass("hidden")});var j=k.registerEventFormModal(b);k.registerEditListeners(b,j)};return{init:function(b,c){b=a(b),f.init(b,c),l(b,c)}}}); \ No newline at end of file +define ("core_calendar/calendar_view",["jquery","core/str","core/notification","core_calendar/selectors","core_calendar/events","core_calendar/view_manager","core_calendar/repository","core/modal_factory","core_calendar/modal_event_form","core/modal_events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=function(b,g){var h=a("body");k.registerRemove(b);var i="reloadCurrent"+g.charAt(0).toUpperCase()+g.slice(1);h.on(e.created,function(){f[i](b)});h.on(e.deleted,function(){f[i](b)});h.on(e.updated,function(){f[i](b)});b.on("change",d.courseSelector,function(){var e=a(this),g=e.val();f[i](b,g,null).then(function(){return b.find(d.courseSelector).val(g)}).then(function(){window.history.pushState({},"","?view=upcoming&course="+g)}).fail(c.exception)});h.on(e.filterChanged,function(a,c){var e=b.find(d.eventType[c.type]);if(!0==c.hidden){e.addClass("hidden")}else{e.removeClass("hidden")}});var j=k.registerEventFormModal(b);k.registerEditListeners(b,j)};return{init:function init(b,c){b=a(b);f.init(b,c);l(b,c)}}}); +//# sourceMappingURL=calendar_view.min.js.map diff --git a/calendar/amd/build/calendar_view.min.js.map b/calendar/amd/build/calendar_view.min.js.map new file mode 100644 index 0000000000000..59a4e6efde2b6 --- /dev/null +++ b/calendar/amd/build/calendar_view.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/calendar_view.js"],"names":["define","$","Str","Notification","CalendarSelectors","CalendarEvents","CalendarViewManager","CalendarRepository","ModalFactory","ModalEventForm","ModalEvents","CalendarCrud","registerEventListeners","root","type","body","registerRemove","reloadFunction","charAt","toUpperCase","slice","on","created","deleted","updated","courseSelector","selectElement","courseId","val","then","find","window","history","pushState","fail","exception","filterChanged","e","data","daysWithEvent","eventType","hidden","addClass","removeClass","eventFormPromise","registerEventFormModal","registerEditListeners","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is responsible for handle calendar day and upcoming view.\n *\n * @module core_calendar/calendar\n * @package core_calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core_calendar/selectors',\n 'core_calendar/events',\n 'core_calendar/view_manager',\n 'core_calendar/repository',\n 'core/modal_factory',\n 'core_calendar/modal_event_form',\n 'core/modal_events',\n 'core_calendar/crud'\n ],\n function(\n $,\n Str,\n Notification,\n CalendarSelectors,\n CalendarEvents,\n CalendarViewManager,\n CalendarRepository,\n ModalFactory,\n ModalEventForm,\n ModalEvents,\n CalendarCrud\n ) {\n\n var registerEventListeners = function(root, type) {\n var body = $('body');\n\n CalendarCrud.registerRemove(root);\n\n var reloadFunction = 'reloadCurrent' + type.charAt(0).toUpperCase() + type.slice(1);\n\n body.on(CalendarEvents.created, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.deleted, function() {\n CalendarViewManager[reloadFunction](root);\n });\n body.on(CalendarEvents.updated, function() {\n CalendarViewManager[reloadFunction](root);\n });\n\n root.on('change', CalendarSelectors.courseSelector, function() {\n var selectElement = $(this);\n var courseId = selectElement.val();\n CalendarViewManager[reloadFunction](root, courseId, null)\n .then(function() {\n // We need to get the selector again because the content has changed.\n return root.find(CalendarSelectors.courseSelector).val(courseId);\n })\n .then(function() {\n window.history.pushState({}, '', '?view=upcoming&course=' + courseId);\n\n return;\n })\n .fail(Notification.exception);\n });\n\n body.on(CalendarEvents.filterChanged, function(e, data) {\n var daysWithEvent = root.find(CalendarSelectors.eventType[data.type]);\n if (data.hidden == true) {\n daysWithEvent.addClass('hidden');\n } else {\n daysWithEvent.removeClass('hidden');\n }\n });\n\n var eventFormPromise = CalendarCrud.registerEventFormModal(root);\n CalendarCrud.registerEditListeners(root, eventFormPromise);\n };\n\n return {\n init: function(root, type) {\n root = $(root);\n\n CalendarViewManager.init(root, type);\n registerEventListeners(root, type);\n }\n };\n });\n"],"file":"calendar_view.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/crud.min.js b/calendar/amd/build/crud.min.js index 57b54a4a1828a..54e4ac159f4ba 100644 --- a/calendar/amd/build/crud.min.js +++ b/calendar/amd/build/crud.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/modal_event_form","core_calendar/repository","core_calendar/events","core_calendar/modal_delete","core_calendar/selectors"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(d,e,f){var i=[{key:"deleteevent",component:"calendar"}];f=parseInt(f,10);var m,n=f>1;n?(i.push({key:"confirmeventseriesdelete",component:"calendar",param:{name:e,count:f}}),m=g.create({type:l.TYPE})):(i.push({key:"confirmeventdelete",component:"calendar",param:e}),m=g.create({type:g.types.SAVE_CANCEL})),m.then(function(a){a.show()}).fail(c.exception);var o=b.get_strings(i),p=a.when(o,m).then(function(b,e){return e.setTitle(b[0]),e.setBody(b[1]),n||e.setSaveButtonText(b[0]),e.getRoot().on(h.save,function(){j.deleteEvent(d,!1).then(function(){a("body").trigger(k.deleted,[d,!1])})["catch"](c.exception)}),e.getRoot().on(k.deleteAll,function(){j.deleteEvent(d,!0).then(function(){a("body").trigger(k.deleted,[d,!0])})["catch"](c.exception)}),e}).fail(c.exception);return p}function o(b){b.on("click",m.actions.remove,function(b){var c=a(this).closest(m.eventItem),d=c.data("eventId"),e=c.data("eventTitle"),f=c.data("eventCount");n(d,e,f),b.preventDefault()})}function p(b,d){return d.then(function(c){a("body").on(k.editEvent,function(a,d){var e=b.find(m.wrapper);c.setEventId(d),c.setContextId(e.data("contextId")),c.show(),a.stopImmediatePropagation()})}).fail(c.exception),d}var q=function(b){var d=g.create({type:i.TYPE,large:!0});return b.on("click",m.actions.create,function(a){d.then(function(a){var c=b.find(m.wrapper),d=c.data("categoryid");"undefined"!=typeof d&&a.setCategoryId(d);var e=b.find(m.today),f=b.find(m.day);!e.length&&f.length&&a.setStartTime(f.data("newEventTimestamp")),a.setContextId(c.data("contextId")),a.setCourseId(c.data("courseid")),a.show()}).fail(c.exception),a.preventDefault()}),b.on("click",m.actions.edit,function(b){b.preventDefault();var e=a(b.currentTarget),f=e.closest(m.wrapper),g=e.closest(m.eventItem);d.then(function(a){a.setEventId(g.data("eventId")),a.setContextId(f.data("contextId")),a.show(),b.stopImmediatePropagation()}).fail(c.exception)}),d};return{registerRemove:o,registerEditListeners:p,registerEventFormModal:q}}); \ No newline at end of file +define ("core_calendar/crud",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/modal_event_form","core_calendar/repository","core_calendar/events","core_calendar/modal_delete","core_calendar/selectors"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(d,e,f){var i=[{key:"deleteevent",component:"calendar"}];f=parseInt(f,10);var m,n=1.\n\n/**\n * A module to handle CRUD operations within the UI.\n *\n * @module core_calendar/crud\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/modal_event_form',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/modal_delete',\n 'core_calendar/selectors',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n ModalEventForm,\n CalendarRepository,\n CalendarEvents,\n ModalDelete,\n CalendarSelectors\n) {\n\n /**\n * Prepares the action for the summary modal's delete action.\n *\n * @param {Number} eventId The ID of the event.\n * @param {string} eventTitle The event title.\n * @param {Number} eventCount The number of events in the series.\n * @return {Promise}\n */\n function confirmDeletion(eventId, eventTitle, eventCount) {\n var deleteStrings = [\n {\n key: 'deleteevent',\n component: 'calendar'\n },\n ];\n\n eventCount = parseInt(eventCount, 10);\n var deletePromise;\n var isRepeatedEvent = eventCount > 1;\n if (isRepeatedEvent) {\n deleteStrings.push({\n key: 'confirmeventseriesdelete',\n component: 'calendar',\n param: {\n name: eventTitle,\n count: eventCount,\n },\n });\n\n deletePromise = ModalFactory.create(\n {\n type: ModalDelete.TYPE\n }\n );\n } else {\n deleteStrings.push({\n key: 'confirmeventdelete',\n component: 'calendar',\n param: eventTitle\n });\n\n\n deletePromise = ModalFactory.create(\n {\n type: ModalFactory.types.SAVE_CANCEL\n }\n );\n }\n\n deletePromise.then(function(deleteModal) {\n deleteModal.show();\n\n return;\n })\n .fail(Notification.exception);\n\n var stringsPromise = Str.get_strings(deleteStrings);\n\n var finalPromise = $.when(stringsPromise, deletePromise)\n .then(function(strings, deleteModal) {\n deleteModal.setTitle(strings[0]);\n deleteModal.setBody(strings[1]);\n if (!isRepeatedEvent) {\n deleteModal.setSaveButtonText(strings[0]);\n }\n\n deleteModal.getRoot().on(ModalEvents.save, function() {\n CalendarRepository.deleteEvent(eventId, false)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, false]);\n return;\n })\n .catch(Notification.exception);\n });\n\n deleteModal.getRoot().on(CalendarEvents.deleteAll, function() {\n CalendarRepository.deleteEvent(eventId, true)\n .then(function() {\n $('body').trigger(CalendarEvents.deleted, [eventId, true]);\n return;\n })\n .catch(Notification.exception);\n });\n\n return deleteModal;\n })\n .fail(Notification.exception);\n\n return finalPromise;\n }\n\n /**\n * Create the event form modal for creating new events and\n * editing existing events.\n *\n * @method registerEventFormModal\n * @param {object} root The calendar root element\n * @return {object} The create modal promise\n */\n var registerEventFormModal = function(root) {\n var eventFormPromise = ModalFactory.create({\n type: ModalEventForm.TYPE,\n large: true\n });\n\n // Bind click event on the new event button.\n root.on('click', CalendarSelectors.actions.create, function(e) {\n eventFormPromise.then(function(modal) {\n var wrapper = root.find(CalendarSelectors.wrapper);\n\n var categoryId = wrapper.data('categoryid');\n if (typeof categoryId !== 'undefined') {\n modal.setCategoryId(categoryId);\n }\n\n // Attempt to find the cell for today.\n // If it can't be found, then use the start time of the first day on the calendar.\n var today = root.find(CalendarSelectors.today);\n var firstDay = root.find(CalendarSelectors.day);\n if (!today.length && firstDay.length) {\n modal.setStartTime(firstDay.data('newEventTimestamp'));\n }\n\n modal.setContextId(wrapper.data('contextId'));\n modal.setCourseId(wrapper.data('courseid'));\n modal.show();\n return;\n })\n .fail(Notification.exception);\n\n e.preventDefault();\n });\n\n root.on('click', CalendarSelectors.actions.edit, function(e) {\n e.preventDefault();\n var target = $(e.currentTarget),\n calendarWrapper = target.closest(CalendarSelectors.wrapper),\n eventWrapper = target.closest(CalendarSelectors.eventItem);\n\n eventFormPromise.then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n modal.setEventId(eventWrapper.data('eventId'));\n\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.show();\n\n e.stopImmediatePropagation();\n return;\n }).fail(Notification.exception);\n });\n\n\n return eventFormPromise;\n };\n /**\n * Register the listeners required to remove the event.\n *\n * @param {jQuery} root\n */\n function registerRemove(root) {\n root.on('click', CalendarSelectors.actions.remove, function(e) {\n // Fetch the event title, count, and pass them into the new dialogue.\n var eventSource = $(this).closest(CalendarSelectors.eventItem);\n var eventId = eventSource.data('eventId'),\n eventTitle = eventSource.data('eventTitle'),\n eventCount = eventSource.data('eventCount');\n confirmDeletion(eventId, eventTitle, eventCount);\n\n e.preventDefault();\n });\n }\n\n /**\n * Register the listeners required to edit the event.\n *\n * @param {jQuery} root\n * @param {Promise} eventFormModalPromise\n * @returns {Promise}\n */\n function registerEditListeners(root, eventFormModalPromise) {\n eventFormModalPromise\n .then(function(modal) {\n // When something within the calendar tells us the user wants\n // to edit an event then show the event form modal.\n $('body').on(CalendarEvents.editEvent, function(e, eventId) {\n var calendarWrapper = root.find(CalendarSelectors.wrapper);\n modal.setEventId(eventId);\n modal.setContextId(calendarWrapper.data('contextId'));\n modal.show();\n\n e.stopImmediatePropagation();\n });\n return;\n })\n .fail(Notification.exception);\n\n return eventFormModalPromise;\n }\n\n return {\n registerRemove: registerRemove,\n registerEditListeners: registerEditListeners,\n registerEventFormModal: registerEventFormModal\n };\n});\n"],"file":"crud.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/drag_drop_data_store.min.js b/calendar/amd/build/drag_drop_data_store.min.js index 5185c8b54d2bd..092a92cac177d 100644 --- a/calendar/amd/build/drag_drop_data_store.min.js +++ b/calendar/amd/build/drag_drop_data_store.min.js @@ -1 +1,2 @@ -define([],function(){var a=null,b=null,c=null,d=null,e=null,f=null,g=function(b){a=b},h=function(){return a},i=function(){return null!==a},j=function(a){b=a},k=function(){return b},l=function(a){c=a},m=function(){return c},n=function(){return null!==c},o=function(a){d=a},p=function(){return d},q=function(){return null!==d},r=function(a){e=a},s=function(){return e},t=function(a){f=a},u=function(){return f},v=function(){g(null),j(null),l(null),o(null),r(null),t(null)};return{setEventId:g,getEventId:h,hasEventId:i,setDurationDays:j,getDurationDays:k,setMinTimestart:l,getMinTimestart:m,hasMinTimestart:n,setMaxTimestart:o,getMaxTimestart:p,hasMaxTimestart:q,setMinError:r,getMinError:s,setMaxError:t,getMaxError:u,clearAll:v}}); \ No newline at end of file +define ("core_calendar/drag_drop_data_store",[],function(){var a=null,b=null,c=null,d=null,e=null,f=null,g=function(b){a=b},h=function(){return a},i=function(){return null!==a},j=function(a){b=a},k=function(){return b},l=function(a){c=a},m=function(){return c},n=function(){return null!==c},o=function(a){d=a},p=function(){return d},q=function(){return null!==d},r=function(a){e=a},s=function(){return e},t=function(a){f=a},u=function(){return f};return{setEventId:g,getEventId:h,hasEventId:i,setDurationDays:j,getDurationDays:k,setMinTimestart:l,getMinTimestart:m,hasMinTimestart:n,setMaxTimestart:o,getMaxTimestart:p,hasMaxTimestart:q,setMinError:r,getMinError:s,setMaxError:t,getMaxError:u,clearAll:function clearAll(){g(null);j(null);l(null);o(null);r(null);t(null)}}}); +//# sourceMappingURL=drag_drop_data_store.min.js.map diff --git a/calendar/amd/build/drag_drop_data_store.min.js.map b/calendar/amd/build/drag_drop_data_store.min.js.map new file mode 100644 index 0000000000000..82ff858c2492b --- /dev/null +++ b/calendar/amd/build/drag_drop_data_store.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/drag_drop_data_store.js"],"names":["define","eventId","durationDays","minTimestart","maxTimestart","minError","maxError","setEventId","id","getEventId","hasEventId","setDurationDays","days","getDurationDays","setMinTimestart","timestamp","getMinTimestart","hasMinTimestart","setMaxTimestart","getMaxTimestart","hasMaxTimestart","setMinError","message","getMinError","setMaxError","getMaxError","clearAll"],"mappings":"AA2BAA,OAAM,sCAAC,EAAD,CAAK,UAAW,IAEdC,CAAAA,CAAO,CAAG,IAFI,CAIdC,CAAY,CAAG,IAJD,CAMdC,CAAY,CAAG,IAND,CAQdC,CAAY,CAAG,IARD,CAUdC,CAAQ,CAAG,IAVG,CAYdC,CAAQ,CAAG,IAZG,CAmBdC,CAAU,CAAG,SAASC,CAAT,CAAa,CAC1BP,CAAO,CAAGO,CACb,CArBiB,CA4BdC,CAAU,CAAG,UAAW,CACxB,MAAOR,CAAAA,CACV,CA9BiB,CAqCdS,CAAU,CAAG,UAAW,CACxB,MAAmB,KAAZ,GAAAT,CACV,CAvCiB,CA8CdU,CAAe,CAAG,SAASC,CAAT,CAAe,CACjCV,CAAY,CAAGU,CAClB,CAhDiB,CAuDdC,CAAe,CAAG,UAAW,CAC7B,MAAOX,CAAAA,CACV,CAzDiB,CAgEdY,CAAe,CAAG,SAASC,CAAT,CAAoB,CACtCZ,CAAY,CAAGY,CAClB,CAlEiB,CAyEdC,CAAe,CAAG,UAAW,CAC7B,MAAOb,CAAAA,CACV,CA3EiB,CAkFdc,CAAe,CAAG,UAAW,CAC7B,MAAwB,KAAjB,GAAAd,CACV,CApFiB,CA2Fde,CAAe,CAAG,SAASH,CAAT,CAAoB,CACtCX,CAAY,CAAGW,CAClB,CA7FiB,CAoGdI,CAAe,CAAG,UAAW,CAC7B,MAAOf,CAAAA,CACV,CAtGiB,CA6GdgB,CAAe,CAAG,UAAW,CAC7B,MAAwB,KAAjB,GAAAhB,CACV,CA/GiB,CAuHdiB,CAAW,CAAG,SAASC,CAAT,CAAkB,CAChCjB,CAAQ,CAAGiB,CACd,CAzHiB,CAgIdC,CAAW,CAAG,UAAW,CACzB,MAAOlB,CAAAA,CACV,CAlIiB,CA0IdmB,CAAW,CAAG,SAASF,CAAT,CAAkB,CAChChB,CAAQ,CAAGgB,CACd,CA5IiB,CAmJdG,CAAW,CAAG,UAAW,CACzB,MAAOnB,CAAAA,CACV,CArJiB,CAmKlB,MAAO,CACHC,UAAU,CAAEA,CADT,CAEHE,UAAU,CAAEA,CAFT,CAGHC,UAAU,CAAEA,CAHT,CAIHC,eAAe,CAAEA,CAJd,CAKHE,eAAe,CAAEA,CALd,CAMHC,eAAe,CAAEA,CANd,CAOHE,eAAe,CAAEA,CAPd,CAQHC,eAAe,CAAEA,CARd,CASHC,eAAe,CAAEA,CATd,CAUHC,eAAe,CAAEA,CAVd,CAWHC,eAAe,CAAEA,CAXd,CAYHC,WAAW,CAAEA,CAZV,CAaHE,WAAW,CAAEA,CAbV,CAcHC,WAAW,CAAEA,CAdV,CAeHC,WAAW,CAAEA,CAfV,CAgBHC,QAAQ,CAzBG,QAAXA,CAAAA,QAAW,EAAW,CACtBnB,CAAU,CAAC,IAAD,CAAV,CACAI,CAAe,CAAC,IAAD,CAAf,CACAG,CAAe,CAAC,IAAD,CAAf,CACAI,CAAe,CAAC,IAAD,CAAf,CACAG,CAAW,CAAC,IAAD,CAAX,CACAG,CAAW,CAAC,IAAD,CACd,CAEM,CAkBV,CArLK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to store calendar drag and drop data.\n *\n * This module is unfortunately required because of the limitations\n * of the HTML5 drag and drop API and it's ability to provide data\n * between the different stages of the drag/drop lifecycle.\n *\n * @module core_calendar/drag_drop_data_store\n * @package core_calendar\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n /* @var {int|null} eventId The id of the event being dragged */\n var eventId = null;\n /* @var {int|null} durationDays How many days the event spans */\n var durationDays = null;\n /* @var {int|null} minTimestart The earliest valid timestart */\n var minTimestart = null;\n /* @var {int|null} maxTimestart The latest valid tiemstart */\n var maxTimestart = null;\n /* @var {string|null} minError Error message for min timestamp violation */\n var minError = null;\n /* @var {string|null} maxError Error message for max timestamp violation */\n var maxError = null;\n\n /**\n * Store the id of the event being dragged.\n *\n * @param {int} id The event id\n */\n var setEventId = function(id) {\n eventId = id;\n };\n\n /**\n * Get the stored event id.\n *\n * @return {int|null}\n */\n var getEventId = function() {\n return eventId;\n };\n\n /**\n * Check if the store has an event id.\n *\n * @return {bool}\n */\n var hasEventId = function() {\n return eventId !== null;\n };\n\n /**\n * Store the duration (in days) of the event being dragged.\n *\n * @param {int} days Number of days the event spans\n */\n var setDurationDays = function(days) {\n durationDays = days;\n };\n\n /**\n * Get the stored number of days.\n *\n * @return {int|null}\n */\n var getDurationDays = function() {\n return durationDays;\n };\n\n /**\n * Store the minimum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMinTimestart = function(timestamp) {\n minTimestart = timestamp;\n };\n\n /**\n * Get the minimum valid timestart.\n *\n * @return {int|null}\n */\n var getMinTimestart = function() {\n return minTimestart;\n };\n\n /**\n * Check if a minimum timestamp is set.\n *\n * @return {bool}\n */\n var hasMinTimestart = function() {\n return minTimestart !== null;\n };\n\n /**\n * Store the maximum timestart valid for an event being dragged.\n *\n * @param {int} timestamp The unix timstamp\n */\n var setMaxTimestart = function(timestamp) {\n maxTimestart = timestamp;\n };\n\n /**\n * Get the maximum valid timestart.\n *\n * @return {int|null}\n */\n var getMaxTimestart = function() {\n return maxTimestart;\n };\n\n /**\n * Check if a maximum timestamp is set.\n *\n * @return {bool}\n */\n var hasMaxTimestart = function() {\n return maxTimestart !== null;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * earlier than the minimum allowed date.\n *\n * @param {string} message The error message\n */\n var setMinError = function(message) {\n minError = message;\n };\n\n /**\n * Get the error message for a minimum time start violation.\n *\n * @return {string|null}\n */\n var getMinError = function() {\n return minError;\n };\n\n /**\n * Store the error string to display if trying to drag an event\n * later than the maximum allowed date.\n *\n * @param {string} message The error message\n */\n var setMaxError = function(message) {\n maxError = message;\n };\n\n /**\n * Get the error message for a maximum time start violation.\n *\n * @return {string|null}\n */\n var getMaxError = function() {\n return maxError;\n };\n\n /**\n * Reset all of the stored values.\n */\n var clearAll = function() {\n setEventId(null);\n setDurationDays(null);\n setMinTimestart(null);\n setMaxTimestart(null);\n setMinError(null);\n setMaxError(null);\n };\n\n return {\n setEventId: setEventId,\n getEventId: getEventId,\n hasEventId: hasEventId,\n setDurationDays: setDurationDays,\n getDurationDays: getDurationDays,\n setMinTimestart: setMinTimestart,\n getMinTimestart: getMinTimestart,\n hasMinTimestart: hasMinTimestart,\n setMaxTimestart: setMaxTimestart,\n getMaxTimestart: getMaxTimestart,\n hasMaxTimestart: hasMaxTimestart,\n setMinError: setMinError,\n getMinError: getMinError,\n setMaxError: setMaxError,\n getMaxError: getMaxError,\n clearAll: clearAll\n };\n});\n"],"file":"drag_drop_data_store.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/event_form.min.js b/calendar/amd/build/event_form.min.js index 0d3bc5dbfb0ff..5f3070cca336c 100644 --- a/calendar/amd/build/event_form.min.js +++ b/calendar/amd/build/event_form.min.js @@ -1 +1,2 @@ -define(["jquery","core_calendar/repository"],function(a,b){var c={EVENT_GROUP_COURSE_ID:'[name="groupcourseid"]',EVENT_GROUP_ID:'[name="groupid"]',SELECT_OPTION:"option"},d=function(d){var e=d.find(c.EVENT_GROUP_COURSE_ID),f=function(b){var e=d.find(c.EVENT_GROUP_ID),f=e.find(c.SELECT_OPTION),g=a(b);f.remove(),e.prop("disabled",!1),g.each(function(b,c){a(e).append(a("").attr("value",c.id).text(c.name))})};e.on("change",function(){var a=d.find(c.EVENT_GROUP_COURSE_ID).val();b.getCourseGroupsData(a).then(function(a){return f(a)})["catch"](Notification.exception)})},e=function(b){var c=a("#"+b);d(c)};return{init:e}}); \ No newline at end of file +define ("core_calendar/event_form",["jquery","core_calendar/repository"],function(a,b){var c={EVENT_GROUP_COURSE_ID:"[name=\"groupcourseid\"]",EVENT_GROUP_ID:"[name=\"groupid\"]",SELECT_OPTION:"option"},d=function(d){var e=d.find(c.EVENT_GROUP_COURSE_ID),f=function(b){var e=d.find(c.EVENT_GROUP_ID),f=e.find(c.SELECT_OPTION),g=a(b);f.remove();e.prop("disabled",!1);g.each(function(b,c){a(e).append(a("").attr("value",c.id).text(c.name))})};e.on("change",function(){var a=d.find(c.EVENT_GROUP_COURSE_ID).val();b.getCourseGroupsData(a).then(function(a){return f(a)}).catch(Notification.exception)})};return{init:function init(b){var c=a("#"+b);d(c)}}}); +//# sourceMappingURL=event_form.min.js.map diff --git a/calendar/amd/build/event_form.min.js.map b/calendar/amd/build/event_form.min.js.map new file mode 100644 index 0000000000000..32d3877390e57 --- /dev/null +++ b/calendar/amd/build/event_form.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/event_form.js"],"names":["define","$","CalendarRepository","SELECTORS","EVENT_GROUP_COURSE_ID","EVENT_GROUP_ID","SELECT_OPTION","addCourseGroupSelectListeners","formElement","courseGroupSelect","find","loadGroupSelectOptions","groups","groupSelect","groupSelectOptions","courseGroups","remove","prop","each","id","group","append","attr","text","name","on","courseId","val","getCourseGroupsData","then","catch","Notification","exception","init","formId"],"mappings":"AAuBAA,OAAM,4BAAC,CAAC,QAAD,CAAW,0BAAX,CAAD,CAAyC,SAASC,CAAT,CAAYC,CAAZ,CAAgC,IAEvEC,CAAAA,CAAS,CAAG,CACZC,qBAAqB,CAAE,0BADX,CAEZC,cAAc,CAAE,oBAFJ,CAGZC,aAAa,CAAE,QAHH,CAF2D,CAgBvEC,CAA6B,CAAG,SAASC,CAAT,CAAsB,IAClDC,CAAAA,CAAiB,CAAGD,CAAW,CAACE,IAAZ,CAAiBP,CAAS,CAACC,qBAA3B,CAD8B,CAGlDO,CAAsB,CAAG,SAASC,CAAT,CAAiB,CAC1C,GAAIC,CAAAA,CAAW,CAAGL,CAAW,CAACE,IAAZ,CAAiBP,CAAS,CAACE,cAA3B,CAAlB,CACIS,CAAkB,CAAGD,CAAW,CAACH,IAAZ,CAAiBP,CAAS,CAACG,aAA3B,CADzB,CAEIS,CAAY,CAAGd,CAAC,CAACW,CAAD,CAFpB,CAKAE,CAAkB,CAACE,MAAnB,GACAH,CAAW,CAACI,IAAZ,CAAiB,UAAjB,KACAF,CAAY,CAACG,IAAb,CAAkB,SAASC,CAAT,CAAaC,CAAb,CAAoB,CAClCnB,CAAC,CAACY,CAAD,CAAD,CAAeQ,MAAf,CAAsBpB,CAAC,CAAC,mBAAD,CAAD,CAAuBqB,IAAvB,CAA4B,OAA5B,CAAqCF,CAAK,CAACD,EAA3C,EAA+CI,IAA/C,CAAoDH,CAAK,CAACI,IAA1D,CAAtB,CACH,CAFD,CAGH,CAdqD,CAiBtDf,CAAiB,CAACgB,EAAlB,CAAqB,QAArB,CAA+B,UAAW,CACtC,GAAIC,CAAAA,CAAQ,CAAGlB,CAAW,CAACE,IAAZ,CAAiBP,CAAS,CAACC,qBAA3B,EAAkDuB,GAAlD,EAAf,CACAzB,CAAkB,CAAC0B,mBAAnB,CAAuCF,CAAvC,EACKG,IADL,CACU,SAASjB,CAAT,CAAiB,CACnB,MAAOD,CAAAA,CAAsB,CAACC,CAAD,CAChC,CAHL,EAIKkB,KAJL,CAIWC,YAAY,CAACC,SAJxB,CAKH,CAPD,CAQH,CAzC0E,CAsD3E,MAAO,CACHC,IAAI,CANG,QAAPA,CAAAA,IAAO,CAASC,CAAT,CAAiB,CACxB,GAAI1B,CAAAA,CAAW,CAAGP,CAAC,CAAC,IAAMiC,CAAP,CAAnB,CACA3B,CAA6B,CAACC,CAAD,CAChC,CAEM,CAGV,CAzDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to enhance the event form.\n *\n * @module core_calendar/event_form\n * @package core_calendar\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core_calendar/repository'], function($, CalendarRepository) {\n\n var SELECTORS = {\n EVENT_GROUP_COURSE_ID: '[name=\"groupcourseid\"]',\n EVENT_GROUP_ID: '[name=\"groupid\"]',\n SELECT_OPTION: 'option'\n };\n\n /**\n * Listen for when the user changes the group course when configuring\n * a group event and filter the options in the group select to only\n * show the groups available within the course the user has selected.\n *\n * @method addCourseGroupSelectListeners\n * @param {object} formElement The root form element\n */\n var addCourseGroupSelectListeners = function(formElement) {\n var courseGroupSelect = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID);\n\n var loadGroupSelectOptions = function(groups) {\n var groupSelect = formElement.find(SELECTORS.EVENT_GROUP_ID),\n groupSelectOptions = groupSelect.find(SELECTORS.SELECT_OPTION),\n courseGroups = $(groups);\n\n // Let's clear all options first.\n groupSelectOptions.remove();\n groupSelect.prop(\"disabled\", false);\n courseGroups.each(function(id, group) {\n $(groupSelect).append($(\"\").attr(\"value\", group.id).text(group.name));\n });\n };\n\n // If the user choose a course in the selector do a WS request to get groups.\n courseGroupSelect.on('change', function() {\n var courseId = formElement.find(SELECTORS.EVENT_GROUP_COURSE_ID).val();\n CalendarRepository.getCourseGroupsData(courseId)\n .then(function(groups) {\n return loadGroupSelectOptions(groups);\n })\n .catch(Notification.exception);\n });\n };\n\n /**\n * Initialise all of the form enhancements.\n *\n * @method init\n * @param {string} formId The value of the form's id attribute\n */\n var init = function(formId) {\n var formElement = $('#' + formId);\n addCourseGroupSelectListeners(formElement);\n };\n\n return {\n init: init,\n };\n});\n"],"file":"event_form.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/events.min.js b/calendar/amd/build/events.min.js index 2387dee0fec32..31340813bdca1 100644 --- a/calendar/amd/build/events.min.js +++ b/calendar/amd/build/events.min.js @@ -1 +1,2 @@ -define([],function(){return{created:"calendar-events:created",deleted:"calendar-events:deleted",deleteAll:"calendar-events:delete_all",updated:"calendar-events:updated",editEvent:"calendar-events:edit_event",editActionEvent:"calendar-events:edit_action_event",eventMoved:"calendar-events:event_moved",dayChanged:"calendar-events:day_changed",monthChanged:"calendar-events:month_changed",moveEvent:"calendar-events:move_event",filterChanged:"calendar-events:filter_changed",viewUpdated:"calendar-events:view_updated"}}); \ No newline at end of file +define ("core_calendar/events",[],function(){return{created:"calendar-events:created",deleted:"calendar-events:deleted",deleteAll:"calendar-events:delete_all",updated:"calendar-events:updated",editEvent:"calendar-events:edit_event",editActionEvent:"calendar-events:edit_action_event",eventMoved:"calendar-events:event_moved",dayChanged:"calendar-events:day_changed",monthChanged:"calendar-events:month_changed",moveEvent:"calendar-events:move_event",filterChanged:"calendar-events:filter_changed",viewUpdated:"calendar-events:view_updated"}}); +//# sourceMappingURL=events.min.js.map diff --git a/calendar/amd/build/events.min.js.map b/calendar/amd/build/events.min.js.map new file mode 100644 index 0000000000000..e3efce1d56f3f --- /dev/null +++ b/calendar/amd/build/events.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/events.js"],"names":["define","created","deleted","deleteAll","updated","editEvent","editActionEvent","eventMoved","dayChanged","monthChanged","moveEvent","filterChanged","viewUpdated"],"mappings":"AAwBAA,OAAM,wBAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,OAAO,CAAE,yBADN,CAEHC,OAAO,CAAE,yBAFN,CAGHC,SAAS,CAAE,4BAHR,CAIHC,OAAO,CAAE,yBAJN,CAKHC,SAAS,CAAE,4BALR,CAMHC,eAAe,CAAE,mCANd,CAOHC,UAAU,CAAE,6BAPT,CAQHC,UAAU,CAAE,6BART,CASHC,YAAY,CAAE,+BATX,CAUHC,SAAS,CAAE,4BAVR,CAWHC,aAAa,CAAE,gCAXZ,CAYHC,WAAW,CAAE,8BAZV,CAcV,CAfK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Contain the events the calendar component can fire.\n *\n * @module core_calendar/events\n * @class calendar_events\n * @package core_calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n created: 'calendar-events:created',\n deleted: 'calendar-events:deleted',\n deleteAll: 'calendar-events:delete_all',\n updated: 'calendar-events:updated',\n editEvent: 'calendar-events:edit_event',\n editActionEvent: 'calendar-events:edit_action_event',\n eventMoved: 'calendar-events:event_moved',\n dayChanged: 'calendar-events:day_changed',\n monthChanged: 'calendar-events:month_changed',\n moveEvent: 'calendar-events:move_event',\n filterChanged: 'calendar-events:filter_changed',\n viewUpdated: 'calendar-events:view_updated',\n };\n});\n"],"file":"events.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/modal_delete.min.js b/calendar/amd/build/modal_delete.min.js index 78456c61e6c02..184a2836c39d1 100644 --- a/calendar/amd/build/modal_delete.min.js +++ b/calendar/amd/build/modal_delete.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_events","core/modal_registry","core_calendar/events"],function(a,b,c,d,e,f,g){var h=!1,i={DELETE_ONE_BUTTON:'[data-action="deleteone"]',DELETE_ALL_BUTTON:'[data-action="deleteall"]',CANCEL_BUTTON:'[data-action="cancel"]'},j=function(a){d.call(this,a)};return j.TYPE="core_calendar-modal_delete",j.prototype=Object.create(d.prototype),j.prototype.constructor=j,j.prototype.registerEventListeners=function(){d.prototype.registerEventListeners.call(this),this.getModal().on(c.events.activate,i.DELETE_ONE_BUTTON,function(b,c){var d=a.Event(e.save);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this)),this.getModal().on(c.events.activate,i.DELETE_ALL_BUTTON,function(b,c){var d=a.Event(g.deleteAll);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this)),this.getModal().on(c.events.activate,i.CANCEL_BUTTON,function(b,c){var d=a.Event(e.cancel);this.getRoot().trigger(d,this),d.isDefaultPrevented()||(this.hide(),c.originalEvent.preventDefault())}.bind(this))},h||(f.register(j.TYPE,j,"calendar/event_delete_modal"),h=!0),j}); \ No newline at end of file +define ("core_calendar/modal_delete",["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_events","core/modal_registry","core_calendar/events"],function(a,b,c,d,f,g,h){var i=!1,j={DELETE_ONE_BUTTON:"[data-action=\"deleteone\"]",DELETE_ALL_BUTTON:"[data-action=\"deleteall\"]",CANCEL_BUTTON:"[data-action=\"cancel\"]"},k=function(a){d.call(this,a)};k.TYPE="core_calendar-modal_delete";k.prototype=Object.create(d.prototype);k.prototype.constructor=k;k.prototype.registerEventListeners=function(){d.prototype.registerEventListeners.call(this);this.getModal().on(c.events.activate,j.DELETE_ONE_BUTTON,function(b,c){var d=a.Event(f.save);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,j.DELETE_ALL_BUTTON,function(b,c){var d=a.Event(h.deleteAll);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,j.CANCEL_BUTTON,function(b,c){var d=a.Event(f.cancel);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this))};if(!i){g.register(k.TYPE,k,"calendar/event_delete_modal");i=!0}return k}); +//# sourceMappingURL=modal_delete.min.js.map diff --git a/calendar/amd/build/modal_delete.min.js.map b/calendar/amd/build/modal_delete.min.js.map new file mode 100644 index 0000000000000..4a4c1857b158a --- /dev/null +++ b/calendar/amd/build/modal_delete.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/modal_delete.js"],"names":["define","$","Notification","CustomEvents","Modal","ModalEvents","ModalRegistry","CalendarEvents","registered","SELECTORS","DELETE_ONE_BUTTON","DELETE_ALL_BUTTON","CANCEL_BUTTON","ModalDelete","root","call","TYPE","prototype","Object","create","constructor","registerEventListeners","getModal","on","events","activate","e","data","saveEvent","Event","save","getRoot","trigger","isDefaultPrevented","hide","originalEvent","preventDefault","bind","deleteAll","cancelEvent","cancel","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Contain the logic for the save/cancel modal.\n *\n * @module core_calendar/modal_delete\n * @class modal_delete\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_events',\n 'core/modal_registry',\n 'core_calendar/events',\n],\nfunction(\n $,\n Notification,\n CustomEvents,\n Modal,\n ModalEvents,\n ModalRegistry,\n CalendarEvents\n) {\n\n var registered = false;\n var SELECTORS = {\n DELETE_ONE_BUTTON: '[data-action=\"deleteone\"]',\n DELETE_ALL_BUTTON: '[data-action=\"deleteall\"]',\n CANCEL_BUTTON: '[data-action=\"cancel\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalDelete = function(root) {\n Modal.call(this, root);\n };\n\n ModalDelete.TYPE = 'core_calendar-modal_delete';\n ModalDelete.prototype = Object.create(Modal.prototype);\n ModalDelete.prototype.constructor = ModalDelete;\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalDelete.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ONE_BUTTON, function(e, data) {\n var saveEvent = $.Event(ModalEvents.save);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.DELETE_ALL_BUTTON, function(e, data) {\n var saveEvent = $.Event(CalendarEvents.deleteAll);\n this.getRoot().trigger(saveEvent, this);\n\n if (!saveEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n\n this.getModal().on(CustomEvents.events.activate, SELECTORS.CANCEL_BUTTON, function(e, data) {\n var cancelEvent = $.Event(ModalEvents.cancel);\n this.getRoot().trigger(cancelEvent, this);\n\n if (!cancelEvent.isDefaultPrevented()) {\n this.hide();\n data.originalEvent.preventDefault();\n }\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalDelete.TYPE, ModalDelete, 'calendar/event_delete_modal');\n registered = true;\n }\n\n return ModalDelete;\n});\n"],"file":"modal_delete.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/modal_event_form.min.js b/calendar/amd/build/modal_event_form.min.js index 2befc260c127f..334707013c8a0 100644 --- a/calendar/amd/build/modal_event_form.min.js +++ b/calendar/amd/build/modal_event_form.min.js @@ -1 +1,2 @@ -define(["jquery","core/event","core/str","core/notification","core/templates","core/custom_interaction_events","core/modal","core/modal_registry","core/fragment","core_calendar/events","core_calendar/repository"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={SAVE_BUTTON:'[data-action="save"]',LOADING_ICON_CONTAINER:'[data-region="loading-icon-container"]'},n=function(a){g.call(this,a),this.eventId=null,this.startTime=null,this.courseId=null,this.categoryId=null,this.contextId=null,this.reloadingBody=!1,this.reloadingTitle=!1,this.saveButton=this.getFooter().find(m.SAVE_BUTTON)};return n.TYPE="core_calendar-modal_event_form",n.prototype=Object.create(g.prototype),n.prototype.constructor=n,n.prototype.setContextId=function(a){this.contextId=a},n.prototype.getContextId=function(){return this.contextId},n.prototype.setCourseId=function(a){this.courseId=a},n.prototype.getCourseId=function(){return this.courseId},n.prototype.setCategoryId=function(a){this.categoryId=a},n.prototype.getCategoryId=function(){return this.categoryId},n.prototype.hasCourseId=function(){return null!==this.courseId},n.prototype.hasCategoryId=function(){return null!==this.categoryId},n.prototype.setEventId=function(a){this.eventId=a},n.prototype.getEventId=function(){return this.eventId},n.prototype.hasEventId=function(){return null!==this.eventId},n.prototype.setStartTime=function(a){this.startTime=a},n.prototype.getStartTime=function(){return this.startTime},n.prototype.hasStartTime=function(){return null!==this.startTime},n.prototype.getForm=function(){return this.getBody().find("form")},n.prototype.disableButtons=function(){this.saveButton.prop("disabled",!0)},n.prototype.enableButtons=function(){this.saveButton.prop("disabled",!1)},n.prototype.reloadTitleContent=function(){return this.reloadingTitle?this.titlePromise:(this.reloadingTitle=!0,this.hasEventId()?this.titlePromise=c.get_string("editevent","calendar"):this.titlePromise=c.get_string("newevent","calendar"),this.titlePromise.then(function(a){return this.setTitle(a),a}.bind(this)).always(function(){this.reloadingTitle=!1}.bind(this)).fail(d.exception),this.titlePromise)},n.prototype.reloadBodyContent=function(a){if(this.reloadingBody)return this.bodyPromise;this.reloadingBody=!0,this.disableButtons();var b={};return this.hasEventId()&&(b.eventid=this.getEventId()),this.hasStartTime()&&(b.starttime=this.getStartTime()),this.hasCourseId()&&(b.courseid=this.getCourseId()),this.hasCategoryId()&&(b.categoryid=this.getCategoryId()),"undefined"!=typeof a&&(b.formdata=a),this.bodyPromise=i.loadFragment("calendar","event_form",this.getContextId(),b),this.setBody(this.bodyPromise),this.bodyPromise.then(function(){this.enableButtons()}.bind(this)).fail(d.exception).always(function(){this.reloadingBody=!1}.bind(this)).fail(d.exception),this.bodyPromise},n.prototype.reloadAllContent=function(){return a.when(this.reloadTitleContent(),this.reloadBodyContent())},n.prototype.show=function(){this.reloadAllContent(),g.prototype.show.call(this)},n.prototype.hide=function(){g.prototype.hide.call(this),this.setEventId(null),this.setStartTime(null),this.setCourseId(null),this.setCategoryId(null)},n.prototype.getFormData=function(){return this.getForm().serialize()},n.prototype.save=function(){var b,c=this.saveButton.find(m.LOADING_ICON_CONTAINER);if(b=this.getForm().find('[aria-invalid="true"]'),b.length)return void b.first().focus();c.removeClass("hidden"),this.disableButtons();var e=this.getFormData();return k.submitCreateUpdateForm(e).then(function(b){if(b.validationerror)return void this.reloadBodyContent(e);var c=this.hasEventId();this.hide(),c?a("body").trigger(j.updated,[b.event]):a("body").trigger(j.created,[b.event])}.bind(this)).always(function(){c.addClass("hidden"),this.enableButtons()}.bind(this)).fail(d.exception)},n.prototype.registerEventListeners=function(){g.prototype.registerEventListeners.call(this),this.getModal().on(f.events.activate,m.SAVE_BUTTON,function(a,b){this.getForm().submit(),b.originalEvent.preventDefault(),a.stopPropagation()}.bind(this)),this.getModal().on("submit",function(a){b.notifyFormSubmitAjax(this.getForm()[0]),this.save(),a.preventDefault(),a.stopPropagation()}.bind(this))},l||(h.register(n.TYPE,n,"calendar/modal_event_form"),l=!0),n}); \ No newline at end of file +define ("core_calendar/modal_event_form",["jquery","core/event","core/str","core/notification","core/templates","core/custom_interaction_events","core/modal","core/modal_registry","core/fragment","core_calendar/events","core_calendar/repository"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={SAVE_BUTTON:"[data-action=\"save\"]",LOADING_ICON_CONTAINER:"[data-region=\"loading-icon-container\"]"},n=function(a){g.call(this,a);this.eventId=null;this.startTime=null;this.courseId=null;this.categoryId=null;this.contextId=null;this.reloadingBody=!1;this.reloadingTitle=!1;this.saveButton=this.getFooter().find(m.SAVE_BUTTON)};n.TYPE="core_calendar-modal_event_form";n.prototype=Object.create(g.prototype);n.prototype.constructor=n;n.prototype.setContextId=function(a){this.contextId=a};n.prototype.getContextId=function(){return this.contextId};n.prototype.setCourseId=function(a){this.courseId=a};n.prototype.getCourseId=function(){return this.courseId};n.prototype.setCategoryId=function(a){this.categoryId=a};n.prototype.getCategoryId=function(){return this.categoryId};n.prototype.hasCourseId=function(){return null!==this.courseId};n.prototype.hasCategoryId=function(){return null!==this.categoryId};n.prototype.setEventId=function(a){this.eventId=a};n.prototype.getEventId=function(){return this.eventId};n.prototype.hasEventId=function(){return null!==this.eventId};n.prototype.setStartTime=function(a){this.startTime=a};n.prototype.getStartTime=function(){return this.startTime};n.prototype.hasStartTime=function(){return null!==this.startTime};n.prototype.getForm=function(){return this.getBody().find("form")};n.prototype.disableButtons=function(){this.saveButton.prop("disabled",!0)};n.prototype.enableButtons=function(){this.saveButton.prop("disabled",!1)};n.prototype.reloadTitleContent=function(){if(this.reloadingTitle){return this.titlePromise}this.reloadingTitle=!0;if(this.hasEventId()){this.titlePromise=c.get_string("editevent","calendar")}else{this.titlePromise=c.get_string("newevent","calendar")}this.titlePromise.then(function(a){this.setTitle(a);return a}.bind(this)).always(function(){this.reloadingTitle=!1}.bind(this)).fail(d.exception);return this.titlePromise};n.prototype.reloadBodyContent=function(a){if(this.reloadingBody){return this.bodyPromise}this.reloadingBody=!0;this.disableButtons();var b={};if(this.hasEventId()){b.eventid=this.getEventId()}if(this.hasStartTime()){b.starttime=this.getStartTime()}if(this.hasCourseId()){b.courseid=this.getCourseId()}if(this.hasCategoryId()){b.categoryid=this.getCategoryId()}if("undefined"!=typeof a){b.formdata=a}this.bodyPromise=i.loadFragment("calendar","event_form",this.getContextId(),b);this.setBody(this.bodyPromise);this.bodyPromise.then(function(){this.enableButtons()}.bind(this)).fail(d.exception).always(function(){this.reloadingBody=!1}.bind(this)).fail(d.exception);return this.bodyPromise};n.prototype.reloadAllContent=function(){return a.when(this.reloadTitleContent(),this.reloadBodyContent())};n.prototype.show=function(){this.reloadAllContent();g.prototype.show.call(this)};n.prototype.hide=function(){g.prototype.hide.call(this);this.setEventId(null);this.setStartTime(null);this.setCourseId(null);this.setCategoryId(null)};n.prototype.getFormData=function(){return this.getForm().serialize()};n.prototype.save=function(){var b,c=this.saveButton.find(m.LOADING_ICON_CONTAINER);b=this.getForm().find("[aria-invalid=\"true\"]");if(b.length){b.first().focus();return}c.removeClass("hidden");this.disableButtons();var e=this.getFormData();return k.submitCreateUpdateForm(e).then(function(b){if(b.validationerror){this.reloadBodyContent(e)}else{var c=this.hasEventId();this.hide();if(c){a("body").trigger(j.updated,[b.event])}else{a("body").trigger(j.created,[b.event])}}}.bind(this)).always(function(){c.addClass("hidden");this.enableButtons()}.bind(this)).fail(d.exception)};n.prototype.registerEventListeners=function(){g.prototype.registerEventListeners.call(this);this.getModal().on(f.events.activate,m.SAVE_BUTTON,function(a,b){this.getForm().submit();b.originalEvent.preventDefault();a.stopPropagation()}.bind(this));this.getModal().on("submit",function(a){b.notifyFormSubmitAjax(this.getForm()[0]);this.save();a.preventDefault();a.stopPropagation()}.bind(this))};if(!l){h.register(n.TYPE,n,"calendar/modal_event_form");l=!0}return n}); +//# sourceMappingURL=modal_event_form.min.js.map diff --git a/calendar/amd/build/modal_event_form.min.js.map b/calendar/amd/build/modal_event_form.min.js.map new file mode 100644 index 0000000000000..6962097c56825 --- /dev/null +++ b/calendar/amd/build/modal_event_form.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/modal_event_form.js"],"names":["define","$","Event","Str","Notification","Templates","CustomEvents","Modal","ModalRegistry","Fragment","CalendarEvents","Repository","registered","SELECTORS","SAVE_BUTTON","LOADING_ICON_CONTAINER","ModalEventForm","root","call","eventId","startTime","courseId","categoryId","contextId","reloadingBody","reloadingTitle","saveButton","getFooter","find","TYPE","prototype","Object","create","constructor","setContextId","id","getContextId","setCourseId","getCourseId","setCategoryId","getCategoryId","hasCourseId","hasCategoryId","setEventId","getEventId","hasEventId","setStartTime","time","getStartTime","hasStartTime","getForm","getBody","disableButtons","prop","enableButtons","reloadTitleContent","titlePromise","get_string","then","string","setTitle","bind","always","fail","exception","reloadBodyContent","formData","bodyPromise","args","eventid","starttime","courseid","categoryid","formdata","loadFragment","setBody","reloadAllContent","when","show","hide","getFormData","serialize","save","invalid","loadingContainer","length","first","focus","removeClass","submitCreateUpdateForm","response","validationerror","isExisting","trigger","updated","event","created","addClass","registerEventListeners","getModal","on","events","activate","e","data","submit","originalEvent","preventDefault","stopPropagation","notifyFormSubmitAjax","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Contain the logic for the quick add or update event modal.\n *\n * @module calendar/modal_quick_add_event\n * @class modal_quick_add_event\n * @package core\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/event',\n 'core/str',\n 'core/notification',\n 'core/templates',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/fragment',\n 'core_calendar/events',\n 'core_calendar/repository'\n ],\n function(\n $,\n Event,\n Str,\n Notification,\n Templates,\n CustomEvents,\n Modal,\n ModalRegistry,\n Fragment,\n CalendarEvents,\n Repository\n ) {\n\n var registered = false;\n var SELECTORS = {\n SAVE_BUTTON: '[data-action=\"save\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventForm = function(root) {\n Modal.call(this, root);\n this.eventId = null;\n this.startTime = null;\n this.courseId = null;\n this.categoryId = null;\n this.contextId = null;\n this.reloadingBody = false;\n this.reloadingTitle = false;\n this.saveButton = this.getFooter().find(SELECTORS.SAVE_BUTTON);\n };\n\n ModalEventForm.TYPE = 'core_calendar-modal_event_form';\n ModalEventForm.prototype = Object.create(Modal.prototype);\n ModalEventForm.prototype.constructor = ModalEventForm;\n\n /**\n * Set the context id to the given value.\n *\n * @method setContextId\n * @param {Number} id The event id\n */\n ModalEventForm.prototype.setContextId = function(id) {\n this.contextId = id;\n };\n\n /**\n * Retrieve the current context id, if any.\n *\n * @method getContextId\n * @return {Number|null} The event id\n */\n ModalEventForm.prototype.getContextId = function() {\n return this.contextId;\n };\n\n /**\n * Set the course id to the given value.\n *\n * @method setCourseId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCourseId = function(id) {\n this.courseId = id;\n };\n\n /**\n * Retrieve the current course id, if any.\n *\n * @method getCourseId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCourseId = function() {\n return this.courseId;\n };\n\n /**\n * Set the category id to the given value.\n *\n * @method setCategoryId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setCategoryId = function(id) {\n this.categoryId = id;\n };\n\n /**\n * Retrieve the current category id, if any.\n *\n * @method getCategoryId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getCategoryId = function() {\n return this.categoryId;\n };\n\n /**\n * Check if the modal has an course id.\n *\n * @method hasCourseId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCourseId = function() {\n return this.courseId !== null;\n };\n\n /**\n * Check if the modal has an category id.\n *\n * @method hasCategoryId\n * @return {bool}\n */\n ModalEventForm.prototype.hasCategoryId = function() {\n return this.categoryId !== null;\n };\n\n /**\n * Set the event id to the given value.\n *\n * @method setEventId\n * @param {int} id The event id\n */\n ModalEventForm.prototype.setEventId = function(id) {\n this.eventId = id;\n };\n\n /**\n * Retrieve the current event id, if any.\n *\n * @method getEventId\n * @return {int|null} The event id\n */\n ModalEventForm.prototype.getEventId = function() {\n return this.eventId;\n };\n\n /**\n * Check if the modal has an event id.\n *\n * @method hasEventId\n * @return {bool}\n */\n ModalEventForm.prototype.hasEventId = function() {\n return this.eventId !== null;\n };\n\n /**\n * Set the start time to the given value.\n *\n * @method setStartTime\n * @param {int} time The start time\n */\n ModalEventForm.prototype.setStartTime = function(time) {\n this.startTime = time;\n };\n\n /**\n * Retrieve the current start time, if any.\n *\n * @method getStartTime\n * @return {int|null} The start time\n */\n ModalEventForm.prototype.getStartTime = function() {\n return this.startTime;\n };\n\n /**\n * Check if the modal has start time.\n *\n * @method hasStartTime\n * @return {bool}\n */\n ModalEventForm.prototype.hasStartTime = function() {\n return this.startTime !== null;\n };\n\n /**\n * Get the form element from the modal.\n *\n * @method getForm\n * @return {object}\n */\n ModalEventForm.prototype.getForm = function() {\n return this.getBody().find('form');\n };\n\n /**\n * Disable the buttons in the footer.\n *\n * @method disableButtons\n */\n ModalEventForm.prototype.disableButtons = function() {\n this.saveButton.prop('disabled', true);\n };\n\n /**\n * Enable the buttons in the footer.\n *\n * @method enableButtons\n */\n ModalEventForm.prototype.enableButtons = function() {\n this.saveButton.prop('disabled', false);\n };\n\n /**\n * Reload the title for the modal to the appropriate value\n * depending on whether we are creating a new event or\n * editing an existing event.\n *\n * @method reloadTitleContent\n * @return {object} A promise resolved with the new title text\n */\n ModalEventForm.prototype.reloadTitleContent = function() {\n if (this.reloadingTitle) {\n return this.titlePromise;\n }\n\n this.reloadingTitle = true;\n\n if (this.hasEventId()) {\n this.titlePromise = Str.get_string('editevent', 'calendar');\n } else {\n this.titlePromise = Str.get_string('newevent', 'calendar');\n }\n\n this.titlePromise.then(function(string) {\n this.setTitle(string);\n return string;\n }.bind(this))\n .always(function() {\n this.reloadingTitle = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.titlePromise;\n };\n\n /**\n * Send a request to the server to get the event_form in a fragment\n * and render the result in the body of the modal.\n *\n * If serialised form data is provided then it will be sent in the\n * request to the server to have the form rendered with the data. This\n * is used when the form had a server side error and we need the server\n * to re-render it for us to display the error to the user.\n *\n * @method reloadBodyContent\n * @param {string} formData The serialised form data\n * @return {object} A promise resolved with the fragment html and js from\n */\n ModalEventForm.prototype.reloadBodyContent = function(formData) {\n if (this.reloadingBody) {\n return this.bodyPromise;\n }\n\n this.reloadingBody = true;\n this.disableButtons();\n\n var args = {};\n\n if (this.hasEventId()) {\n args.eventid = this.getEventId();\n }\n\n if (this.hasStartTime()) {\n args.starttime = this.getStartTime();\n }\n\n if (this.hasCourseId()) {\n args.courseid = this.getCourseId();\n }\n\n if (this.hasCategoryId()) {\n args.categoryid = this.getCategoryId();\n }\n\n if (typeof formData !== 'undefined') {\n args.formdata = formData;\n }\n\n this.bodyPromise = Fragment.loadFragment('calendar', 'event_form', this.getContextId(), args);\n\n this.setBody(this.bodyPromise);\n\n this.bodyPromise.then(function() {\n this.enableButtons();\n return;\n }.bind(this))\n .fail(Notification.exception)\n .always(function() {\n this.reloadingBody = false;\n return;\n }.bind(this))\n .fail(Notification.exception);\n\n return this.bodyPromise;\n };\n\n /**\n * Reload both the title and body content.\n *\n * @method reloadAllContent\n * @return {object} promise\n */\n ModalEventForm.prototype.reloadAllContent = function() {\n return $.when(this.reloadTitleContent(), this.reloadBodyContent());\n };\n\n /**\n * Kick off a reload the modal content before showing it. This\n * is to allow us to re-use the same modal for creating and\n * editing different events within the page.\n *\n * We do the reload when showing the modal rather than hiding it\n * to save a request to the server if the user closes the modal\n * and never re-opens it.\n *\n * @method show\n */\n ModalEventForm.prototype.show = function() {\n this.reloadAllContent();\n Modal.prototype.show.call(this);\n };\n\n /**\n * Clear the event id from the modal when it's closed so\n * that it is loaded fresh next time it's displayed.\n *\n * The event id will be set by the calling code if it wants\n * to edit a specific event.\n *\n * @method hide\n */\n ModalEventForm.prototype.hide = function() {\n Modal.prototype.hide.call(this);\n this.setEventId(null);\n this.setStartTime(null);\n this.setCourseId(null);\n this.setCategoryId(null);\n };\n\n /**\n * Get the serialised form data.\n *\n * @method getFormData\n * @return {string} serialised form data\n */\n ModalEventForm.prototype.getFormData = function() {\n return this.getForm().serialize();\n };\n\n /**\n * Send the form data to the server to create or update\n * an event.\n *\n * If there is a server side validation error then we re-request the\n * rendered form (with the data) from the server in order to get the\n * server side errors to display.\n *\n * On success the modal is hidden and the page is reloaded so that the\n * new event will display.\n *\n * @method save\n * @return {object} A promise\n */\n ModalEventForm.prototype.save = function() {\n var invalid,\n loadingContainer = this.saveButton.find(SELECTORS.LOADING_ICON_CONTAINER);\n\n // Now the change events have run, see if there are any \"invalid\" form fields.\n invalid = this.getForm().find('[aria-invalid=\"true\"]');\n\n // If we found invalid fields, focus on the first one and do not submit via ajax.\n if (invalid.length) {\n invalid.first().focus();\n return;\n }\n\n loadingContainer.removeClass('hidden');\n this.disableButtons();\n\n var formData = this.getFormData();\n // Send the form data to the server for processing.\n return Repository.submitCreateUpdateForm(formData)\n .then(function(response) {\n if (response.validationerror) {\n // If there was a server side validation error then\n // we need to re-request the rendered form from the server\n // in order to display the error for the user.\n this.reloadBodyContent(formData);\n return;\n } else {\n // Check whether this was a new event or not.\n // The hide function unsets the form data so grab this before the hide.\n var isExisting = this.hasEventId();\n\n // No problemo! Our work here is done.\n this.hide();\n\n // Trigger the appropriate calendar event so that the view can be updated.\n if (isExisting) {\n $('body').trigger(CalendarEvents.updated, [response.event]);\n } else {\n $('body').trigger(CalendarEvents.created, [response.event]);\n }\n }\n\n return;\n }.bind(this))\n .always(function() {\n // Regardless of success or error we should always stop\n // the loading icon and re-enable the buttons.\n loadingContainer.addClass('hidden');\n this.enableButtons();\n\n return;\n }.bind(this))\n .fail(Notification.exception);\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventForm.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // When the user clicks the save button we trigger the form submission. We need to\n // trigger an actual submission because there is some JS code in the form that is\n // listening for this event and doing some stuff (e.g. saving draft areas etc).\n this.getModal().on(CustomEvents.events.activate, SELECTORS.SAVE_BUTTON, function(e, data) {\n this.getForm().submit();\n data.originalEvent.preventDefault();\n e.stopPropagation();\n }.bind(this));\n\n // Catch the submit event before it is actually processed by the browser and\n // prevent the submission. We'll take it from here.\n this.getModal().on('submit', function(e) {\n Event.notifyFormSubmitAjax(this.getForm()[0]);\n\n this.save();\n\n // Stop the form from actually submitting and prevent it's\n // propagation because we have already handled the event.\n e.preventDefault();\n e.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventForm.TYPE, ModalEventForm, 'calendar/modal_event_form');\n registered = true;\n }\n\n return ModalEventForm;\n});\n"],"file":"modal_event_form.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/month_navigation_drag_drop.min.js b/calendar/amd/build/month_navigation_drag_drop.min.js index 6e6cbc371e11b..884ee1b048033 100644 --- a/calendar/amd/build/month_navigation_drag_drop.min.js +++ b/calendar/amd/build/month_navigation_drag_drop.min.js @@ -1 +1,2 @@ -define(["jquery","core_calendar/drag_drop_data_store"],function(a,b){var c={DRAGGABLE:'[draggable="true"][data-region="event-item"]',DROP_ZONE:'[data-drop-zone="nav-link"]'},d="bg-primary text-white",e="drop-target",f=1e3,g=!1,h=null,i=null,j=function(a,b){b?a.addClass(d):a.removeClass(d)},k=function(){i.find(c.DROP_ZONE).addClass(e)},l=function(){i.find(c.DROP_ZONE).removeClass(e)},m=function(b){var d=a(b.target).closest(c.DROP_ZONE);return d.length?d:null},n=function(b){var d=a(b.target).closest(c.DRAGGABLE);d.length&&k()},o=function(a){if(b.hasEventId()){a.preventDefault();var c=m(a);c&&b.hasEventId()&&(h||(h=setTimeout(function(){c.click(),h=null},f)),j(c,!0),l())}},p=function(a){if(b.hasEventId()){var c=m(a);c&&(h&&(clearTimeout(h),h=null),j(c,!1),k(),a.preventDefault())}},q=function(a){if(b.hasEventId()){l();var c=m(a);c&&(j(c,!1),a.preventDefault())}};return{init:function(c){g||(document.addEventListener("dragstart",n,!1),document.addEventListener("dragover",o,!1),document.addEventListener("dragleave",p,!1),document.addEventListener("drop",q,!1),document.addEventListener("dragend",l,!1),g=!0),i=a(c),b.hasEventId()&&k()}}}); \ No newline at end of file +define ("core_calendar/month_navigation_drag_drop",["jquery","core_calendar/drag_drop_data_store"],function(a,b){var c={DRAGGABLE:"[draggable=\"true\"][data-region=\"event-item\"]",DROP_ZONE:"[data-drop-zone=\"nav-link\"]"},d="bg-primary text-white",e="drop-target",f=!1,g=null,h=null,i=function(a,b){if(b){a.addClass(d)}else{a.removeClass(d)}},j=function(){h.find(c.DROP_ZONE).addClass(e)},k=function(){h.find(c.DROP_ZONE).removeClass(e)},l=function(b){var d=a(b.target).closest(c.DROP_ZONE);return d.length?d:null},m=function(b){var d=a(b.target).closest(c.DRAGGABLE);if(d.length){j()}},n=function(a){if(!b.hasEventId()){return}a.preventDefault();var c=l(a);if(!c){return}if(!b.hasEventId()){return}if(!g){g=setTimeout(function(){c.click();g=null},1e3)}i(c,!0);k()},o=function(a){if(!b.hasEventId()){return}var c=l(a);if(!c){return}if(g){clearTimeout(g);g=null}i(c,!1);j();a.preventDefault()},p=function(a){if(!b.hasEventId()){return}k();var c=l(a);if(!c){return}i(c,!1);a.preventDefault()};return{init:function init(c){if(!f){document.addEventListener("dragstart",m,!1);document.addEventListener("dragover",n,!1);document.addEventListener("dragleave",o,!1);document.addEventListener("drop",p,!1);document.addEventListener("dragend",k,!1);f=!0}h=a(c);if(b.hasEventId()){j()}}}}); +//# sourceMappingURL=month_navigation_drag_drop.min.js.map diff --git a/calendar/amd/build/month_navigation_drag_drop.min.js.map b/calendar/amd/build/month_navigation_drag_drop.min.js.map new file mode 100644 index 0000000000000..cf51993632942 --- /dev/null +++ b/calendar/amd/build/month_navigation_drag_drop.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/month_navigation_drag_drop.js"],"names":["define","$","DataStore","SELECTORS","DRAGGABLE","DROP_ZONE","HOVER_CLASS","TARGET_CLASS","registered","hoverTimer","root","updateHoverState","target","hovered","addClass","removeClass","addDropZoneIndicator","find","removeDropZoneIndicator","getTargetFromEvent","e","closest","length","dragstartHandler","eventElement","dragoverHandler","hasEventId","preventDefault","setTimeout","click","dragleaveHandler","clearTimeout","dropHandler","init","rootElement","document","addEventListener"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handle calendar drag and drop in the calendar\n * month view navigation.\n *\n * This code is run each time the calendar month view is re-rendered. We\n * only register the event handlers once per page load so that the in place\n * DOM updates that happen on month change don't continue to register handlers.\n *\n * @module core_calendar/month_navigation_drag_drop\n * @class month_navigation_drag_drop\n * @package core_calendar\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core_calendar/drag_drop_data_store',\n ],\n function(\n $,\n DataStore\n ) {\n\n var SELECTORS = {\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"nav-link\"]',\n };\n var HOVER_CLASS = 'bg-primary text-white';\n var TARGET_CLASS = 'drop-target';\n var HOVER_TIME = 1000; // 1 second hover to change month.\n\n // We store some static variables at the module level because this\n // module is called each time the calendar month view is reloaded but\n // we want some actions to only occur ones.\n\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n /* @var {int} hoverTimer The timeout id of any timeout waiting for hover */\n var hoverTimer = null;\n /* @var {object} root The root nav element we're operating on */\n var root = null;\n\n /**\n * Add or remove the appropriate styling to indicate whether\n * the drop target is being hovered over.\n *\n * @param {object} target The target drop zone element\n * @param {bool} hovered If the element is hovered over ot not\n */\n var updateHoverState = function(target, hovered) {\n if (hovered) {\n target.addClass(HOVER_CLASS);\n } else {\n target.removeClass(HOVER_CLASS);\n }\n };\n\n /**\n * Add some styling to the UI to indicate that the nav links\n * are an acceptable drop target.\n */\n var addDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).addClass(TARGET_CLASS);\n };\n\n /**\n * Remove the styling from the nav links.\n */\n var removeDropZoneIndicator = function() {\n root.find(SELECTORS.DROP_ZONE).removeClass(TARGET_CLASS);\n };\n\n /**\n * Get the drop zone target from the event, if one is found.\n *\n * @param {event} e Javascript event\n * @return {object|null}\n */\n var getTargetFromEvent = function(e) {\n var target = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (target.length) ? target : null;\n };\n\n /**\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is a valid drop zone.\n */\n var dragstartHandler = function(e) {\n // Make sure the drag event is for a calendar event.\n var eventElement = $(e.target).closest(SELECTORS.DRAGGABLE);\n\n if (eventElement.length) {\n addDropZoneIndicator();\n }\n };\n\n /**\n * Update the hover state of the target nav element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which nav link is being hovered.\n *\n * @param {event} e The dragover event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n // If we're not draggin a calendar event then\n // ignore it.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n if (!hoverTimer) {\n hoverTimer = setTimeout(function() {\n target.click();\n hoverTimer = null;\n }, HOVER_TIME);\n }\n\n updateHoverState(target, true);\n removeDropZoneIndicator();\n };\n\n /**\n * Update the hover state of the target nav element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n if (hoverTimer) {\n clearTimeout(hoverTimer);\n hoverTimer = null;\n }\n\n updateHoverState(target, false);\n addDropZoneIndicator();\n e.preventDefault();\n };\n\n /**\n * Remove the visual indicator from the calendar UI that was\n * added by the dragoverHandler.\n *\n * @param {event} e The drop event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n removeDropZoneIndicator();\n var target = getTargetFromEvent(e);\n\n if (!target) {\n return;\n }\n\n updateHoverState(target, false);\n e.preventDefault();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n *\n * @param {object} rootElement The element containing calendar nav links\n */\n init: function(rootElement) {\n // Only register the handlers once on the first load.\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', removeDropZoneIndicator, false);\n registered = true;\n }\n\n // Update the module variable to operate on the given\n // root element.\n root = $(rootElement);\n\n // If we're currently dragging then add the indicators.\n if (DataStore.hasEventId()) {\n addDropZoneIndicator();\n }\n },\n };\n});\n"],"file":"month_navigation_drag_drop.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/month_view_drag_drop.min.js b/calendar/amd/build/month_view_drag_drop.min.js index 53812700409f4..cdee1100f20c9 100644 --- a/calendar/amd/build/month_view_drag_drop.min.js +++ b/calendar/amd/build/month_view_drag_drop.min.js @@ -1 +1,2 @@ -define(["jquery","core/notification","core/str","core_calendar/events","core_calendar/drag_drop_data_store"],function(a,b,c,d,e){var f={ROOT:"[data-region='calendar']",DRAGGABLE:'[draggable="true"][data-region="event-item"]',DROP_ZONE:'[data-drop-zone="month-view-day"]',WEEK:'[data-region="month-view-week"]'},g="bg-faded",h="bg-danger text-white",i="bg-primary text-white",j=g+" "+h+" "+i,k=!1,l=function(b){var c=a(b.target).closest(f.DROP_ZONE);return c.length?c:null},m=function(a){var b=a.attr("data-day-timestamp"),c=e.getMinTimestart(),d=e.getMaxTimestart();return!(c&&c>b)&&!(d&&db?e.getMinError():d&&d0){var k=a.next();if(!k.length){var l=a.closest(f.WEEK).next();l.length&&(k=l.children(f.DROP_ZONE).first())}k.length&&p(k,b,c)}},q=function(){a(f.ROOT).find(f.DROP_ZONE).each(function(b,c){c=a(c),m(c)||p(c,!1)})},r=function(b){var c=a(b.target),d=c.closest(f.DRAGGABLE);if(d.length){var g=d.find("[data-event-id]"),h=g.attr("data-event-id"),i=d.attr("data-min-day-timestamp"),j=d.attr("data-max-day-timestamp"),k=d.attr("data-min-day-error"),l=d.attr("data-max-day-error"),m=f.ROOT+' [data-event-id="'+h+'"]',n=a(m).length;e.setEventId(h),e.setDurationDays(n),i&&e.setMinTimestart(i),j&&e.setMaxTimestart(j),k&&e.setMinError(k),l&&e.setMaxError(l),b.dataTransfer.effectAllowed="move",b.dataTransfer.dropEffect="move",b.dataTransfer.setData("text/plain",h),b.dropEffect="move",q()}},s=function(a){if(e.hasEventId()){a.preventDefault();var b=l(a);b&&p(b,!0)}},t=function(a){if(e.hasEventId()){var b=l(a);b&&(p(b,!1),a.preventDefault())}},u=function(g){if(e.hasEventId()){var h=l(g);if(!h)return e.clearAll(),void o();if(m(h)){var i=e.getEventId(),j=f.ROOT+' [data-event-id="'+i+'"]',k=a(j),p=null;k.length&&(p=k.closest(f.DROP_ZONE)),a("body").trigger(d.moveEvent,[i,p,h])}else{var q=n(h);c.get_string("errorinvaliddate","calendar").then(function(a){b.exception({name:a,message:q||a})})}e.clearAll(),o(),g.preventDefault()}},v=function(){e.clearAll(),o()},w=function(){q()};return{init:function(){k||(document.addEventListener("dragstart",r,!1),document.addEventListener("dragover",s,!1),document.addEventListener("dragleave",t,!1),document.addEventListener("drop",u,!1),document.addEventListener("dragend",v,!1),a("body").on(d.monthChanged,w),k=!0)}}}); \ No newline at end of file +define ("core_calendar/month_view_drag_drop",["jquery","core/notification","core/str","core_calendar/events","core_calendar/drag_drop_data_store"],function(a,b,c,d,f){var g={ROOT:"[data-region='calendar']",DRAGGABLE:"[draggable=\"true\"][data-region=\"event-item\"]",DROP_ZONE:"[data-drop-zone=\"month-view-day\"]",WEEK:"[data-region=\"month-view-week\"]"},h="bg-faded",i="bg-danger text-white",j="bg-primary text-white",k=h+" "+i+" "+j,l=!1,m=function(b){var c=a(b.target).closest(g.DROP_ZONE);return c.length?c:null},n=function(a){var b=a.attr("data-day-timestamp"),c=f.getMinTimestart(),d=f.getMaxTimestart();if(c&&c>b){return!1}if(d&&db){return f.getMinError()}if(d&&d.\n\n/**\n * A javascript module to handle calendar drag and drop in the calendar\n * month view.\n *\n * @module core_calendar/month_view_drag_drop\n * @class month_view_drag_drop\n * @package core_calendar\n * @copyright 2017 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/notification',\n 'core/str',\n 'core_calendar/events',\n 'core_calendar/drag_drop_data_store'\n ],\n function(\n $,\n Notification,\n Str,\n CalendarEvents,\n DataStore\n ) {\n\n var SELECTORS = {\n ROOT: \"[data-region='calendar']\",\n DRAGGABLE: '[draggable=\"true\"][data-region=\"event-item\"]',\n DROP_ZONE: '[data-drop-zone=\"month-view-day\"]',\n WEEK: '[data-region=\"month-view-week\"]',\n };\n var INVALID_DROP_ZONE_CLASS = 'bg-faded';\n var INVALID_HOVER_CLASS = 'bg-danger text-white';\n var VALID_HOVER_CLASS = 'bg-primary text-white';\n var ALL_CLASSES = INVALID_DROP_ZONE_CLASS + ' ' + INVALID_HOVER_CLASS + ' ' + VALID_HOVER_CLASS;\n /* @var {bool} registered If the event listeners have been added */\n var registered = false;\n\n /**\n * Get the correct drop zone element from the given javascript\n * event.\n *\n * @param {event} e The javascript event\n * @return {object|null}\n */\n var getDropZoneFromEvent = function(e) {\n var dropZone = $(e.target).closest(SELECTORS.DROP_ZONE);\n return (dropZone.length) ? dropZone : null;\n };\n\n /**\n * Determine if the given dropzone element is within the acceptable\n * time range.\n *\n * The drop zone timestamp is midnight on that day so we should check\n * that the event's acceptable timestart value\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {bool}\n */\n var isValidDropZone = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return false;\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return false;\n }\n\n return true;\n };\n\n /**\n * Get the error string to display for a given drop zone element\n * if it is invalid.\n *\n * @param {object} dropZone The drop zone day from the calendar\n * @return {string}\n */\n var getDropZoneError = function(dropZone) {\n var dropTimestamp = dropZone.attr('data-day-timestamp');\n var minTimestart = DataStore.getMinTimestart();\n var maxTimestart = DataStore.getMaxTimestart();\n\n if (minTimestart && minTimestart > dropTimestamp) {\n return DataStore.getMinError();\n }\n\n if (maxTimestart && maxTimestart < dropTimestamp) {\n return DataStore.getMaxError();\n }\n\n return null;\n };\n\n /**\n * Remove all of the styling from each of the drop zones in the calendar.\n */\n var clearAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n });\n };\n\n /**\n * Update the hover state for the event in the calendar to reflect\n * which days the event will be moved to.\n *\n * If the drop zone is not being hovered then it will apply some\n * styling to reflect whether the drop zone is a valid or invalid\n * drop place for the current dragging event.\n *\n * This funciton supports events spanning multiple days and will\n * recurse to highlight (or remove highlight) each of the days\n * that the event will be moved to.\n *\n * For example: An event with a duration of 3 days will have\n * 3 days highlighted when it's dragged elsewhere in the calendar.\n * The current drag target and the 2 days following it (including\n * wrapping to the next week if necessary).\n *\n * @param {string|object} target The drag target element\n * @param {bool} hovered If the target is hovered or not\n * @param {int} count How many days to highlight (default to duration)\n */\n var updateHoverState = function(dropZone, hovered, count) {\n if (typeof count === 'undefined') {\n // This is how many days we need to highlight.\n count = DataStore.getDurationDays();\n }\n\n var valid = isValidDropZone(dropZone);\n dropZone.removeClass(ALL_CLASSES);\n\n if (hovered) {\n\n if (valid) {\n dropZone.addClass(VALID_HOVER_CLASS);\n } else {\n dropZone.addClass(INVALID_HOVER_CLASS);\n }\n } else {\n dropZone.removeClass(VALID_HOVER_CLASS + ' ' + INVALID_HOVER_CLASS);\n\n if (!valid) {\n dropZone.addClass(INVALID_DROP_ZONE_CLASS);\n }\n }\n\n count--;\n\n // If we've still got days to highlight then we should\n // find the next day.\n if (count > 0) {\n var nextDropZone = dropZone.next();\n\n // If there are no more days in this week then we\n // need to move down to the next week in the calendar.\n if (!nextDropZone.length) {\n var nextWeek = dropZone.closest(SELECTORS.WEEK).next();\n\n if (nextWeek.length) {\n nextDropZone = nextWeek.children(SELECTORS.DROP_ZONE).first();\n }\n }\n\n // If we found another day then let's recursively\n // update it's hover state.\n if (nextDropZone.length) {\n updateHoverState(nextDropZone, hovered, count);\n }\n }\n };\n\n /**\n * Find all of the calendar event drop zones in the calendar and update the display\n * for the user to indicate which zones are valid and invalid.\n */\n var updateAllDropZonesState = function() {\n $(SELECTORS.ROOT).find(SELECTORS.DROP_ZONE).each(function(index, dropZone) {\n dropZone = $(dropZone);\n\n if (!isValidDropZone(dropZone)) {\n updateHoverState(dropZone, false);\n }\n });\n };\n\n\n /**\n * Set up the module level variables to track which event is being\n * dragged and how many days it spans.\n *\n * @param {event} e The dragstart event\n */\n var dragstartHandler = function(e) {\n var target = $(e.target);\n var draggableElement = target.closest(SELECTORS.DRAGGABLE);\n\n if (!draggableElement.length) {\n return;\n }\n\n var eventElement = draggableElement.find('[data-event-id]');\n var eventId = eventElement.attr('data-event-id');\n var minTimestart = draggableElement.attr('data-min-day-timestamp');\n var maxTimestart = draggableElement.attr('data-max-day-timestamp');\n var minError = draggableElement.attr('data-min-day-error');\n var maxError = draggableElement.attr('data-max-day-error');\n var eventsSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var duration = $(eventsSelector).length;\n\n DataStore.setEventId(eventId);\n DataStore.setDurationDays(duration);\n\n if (minTimestart) {\n DataStore.setMinTimestart(minTimestart);\n }\n\n if (maxTimestart) {\n DataStore.setMaxTimestart(maxTimestart);\n }\n\n if (minError) {\n DataStore.setMinError(minError);\n }\n\n if (maxError) {\n DataStore.setMaxError(maxError);\n }\n\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.dropEffect = \"move\";\n // Firefox requires a value to be set here or the drag won't\n // work and the dragover handler won't fire.\n e.dataTransfer.setData('text/plain', eventId);\n e.dropEffect = \"move\";\n\n updateAllDropZonesState();\n };\n\n /**\n * Update the hover state of the target day element when\n * the user is dragging an event over it.\n *\n * This will add a visual indicator to the calendar UI to\n * indicate which day(s) the event will be moved to.\n *\n * @param {event} e The dragstart event\n */\n var dragoverHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n e.preventDefault();\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, true);\n };\n\n /**\n * Update the hover state of the target day element that was\n * previously dragged over but has is no longer a drag target.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dragleaveHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n return;\n }\n\n updateHoverState(dropZone, false);\n e.preventDefault();\n };\n\n /**\n * Determines the event element, origin day, and destination day\n * once the user drops the calendar event. These three bits of data\n * are provided as the payload to the \"moveEvent\" calendar javascript\n * event that is fired.\n *\n * This will remove the visual indicator from the calendar UI\n * that was added by the dragoverHandler.\n *\n * @param {event} e The dragstart event\n */\n var dropHandler = function(e) {\n // Ignore dragging of non calendar events.\n if (!DataStore.hasEventId()) {\n return;\n }\n\n var dropZone = getDropZoneFromEvent(e);\n\n if (!dropZone) {\n DataStore.clearAll();\n clearAllDropZonesState();\n return;\n }\n\n if (isValidDropZone(dropZone)) {\n var eventId = DataStore.getEventId();\n var eventElementSelector = SELECTORS.ROOT + ' [data-event-id=\"' + eventId + '\"]';\n var eventElement = $(eventElementSelector);\n var origin = null;\n\n if (eventElement.length) {\n origin = eventElement.closest(SELECTORS.DROP_ZONE);\n }\n\n $('body').trigger(CalendarEvents.moveEvent, [eventId, origin, dropZone]);\n } else {\n // If the drop zone is not valid then there is not need for us to\n // try to process it. Instead we can just show an error to the user.\n var message = getDropZoneError(dropZone);\n Str.get_string('errorinvaliddate', 'calendar').then(function(string) {\n Notification.exception({\n name: string,\n message: message || string\n });\n });\n }\n\n DataStore.clearAll();\n clearAllDropZonesState();\n\n e.preventDefault();\n };\n\n /**\n * Clear the data store and remove the drag indicators from the UI\n * when the drag event has finished.\n */\n var dragendHandler = function() {\n DataStore.clearAll();\n clearAllDropZonesState();\n };\n\n /**\n * Re-render the drop zones in the new month to highlight\n * which areas are or aren't acceptable to drop the calendar\n * event.\n */\n var calendarMonthChangedHandler = function() {\n updateAllDropZonesState();\n };\n\n return {\n /**\n * Initialise the event handlers for the drag events.\n */\n init: function() {\n if (!registered) {\n // These handlers are only added the first time the module\n // is loaded because we don't want to have a new listener\n // added each time the \"init\" function is called otherwise we'll\n // end up with lots of stale handlers.\n document.addEventListener('dragstart', dragstartHandler, false);\n document.addEventListener('dragover', dragoverHandler, false);\n document.addEventListener('dragleave', dragleaveHandler, false);\n document.addEventListener('drop', dropHandler, false);\n document.addEventListener('dragend', dragendHandler, false);\n $('body').on(CalendarEvents.monthChanged, calendarMonthChangedHandler);\n registered = true;\n }\n },\n };\n});\n"],"file":"month_view_drag_drop.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/repository.min.js b/calendar/amd/build/repository.min.js index 894dcf99106c2..55d3e1e34b63b 100644 --- a/calendar/amd/build/repository.min.js +++ b/calendar/amd/build/repository.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax"],function(a,b){var c=function(a,c){"undefined"==typeof c&&(c=!1);var d={methodname:"core_calendar_delete_calendar_events",args:{events:[{eventid:a,repeat:c}]}};return b.call([d])[0]},d=function(a){var c={methodname:"core_calendar_get_calendar_event_by_id",args:{eventid:a}};return b.call([c])[0]},e=function(a){var c={methodname:"core_calendar_submit_create_update_form",args:{formdata:a}};return b.call([c])[0]},f=function(a,c,d,e,f,g){var h={methodname:"core_calendar_get_calendar_monthly_view",args:{year:a,month:c,courseid:d,categoryid:e,includenavigation:f,mini:g}};return b.call([h])[0]},g=function(a,c,d,e,f){var g={methodname:"core_calendar_get_calendar_day_view",args:{year:a,month:c,day:d,courseid:e,categoryid:f}};return b.call([g])[0]},h=function(a,c){var d={methodname:"core_calendar_update_event_start_day",args:{eventid:a,daytimestamp:c}};return b.call([d])[0]},i=function(a,c){var d={methodname:"core_calendar_get_calendar_upcoming_view",args:{courseid:a,categoryid:c}};return b.call([d])[0]},j=function(a){var c={methodname:"core_group_get_course_groups",args:{courseid:a}};return b.call([c])[0]};return{getEventById:d,deleteEvent:c,updateEventStartDay:h,submitCreateUpdateForm:e,getCalendarMonthData:f,getCalendarDayData:g,getCalendarUpcomingData:i,getCourseGroupsData:j}}); \ No newline at end of file +define ("core_calendar/repository",["jquery","core/ajax"],function(a,b){return{getEventById:function getEventById(a){return b.call([{methodname:"core_calendar_get_calendar_event_by_id",args:{eventid:a}}])[0]},deleteEvent:function deleteEvent(a,c){if("undefined"==typeof c){c=!1}var d={methodname:"core_calendar_delete_calendar_events",args:{events:[{eventid:a,repeat:c}]}};return b.call([d])[0]},updateEventStartDay:function updateEventStartDay(a,c){return b.call([{methodname:"core_calendar_update_event_start_day",args:{eventid:a,daytimestamp:c}}])[0]},submitCreateUpdateForm:function submitCreateUpdateForm(a){return b.call([{methodname:"core_calendar_submit_create_update_form",args:{formdata:a}}])[0]},getCalendarMonthData:function getCalendarMonthData(a,c,d,e,f,g){return b.call([{methodname:"core_calendar_get_calendar_monthly_view",args:{year:a,month:c,courseid:d,categoryid:e,includenavigation:f,mini:g}}])[0]},getCalendarDayData:function getCalendarDayData(a,c,d,e,f){return b.call([{methodname:"core_calendar_get_calendar_day_view",args:{year:a,month:c,day:d,courseid:e,categoryid:f}}])[0]},getCalendarUpcomingData:function getCalendarUpcomingData(a,c){return b.call([{methodname:"core_calendar_get_calendar_upcoming_view",args:{courseid:a,categoryid:c}}])[0]},getCourseGroupsData:function getCourseGroupsData(a){return b.call([{methodname:"core_group_get_course_groups",args:{courseid:a}}])[0]}}}); +//# sourceMappingURL=repository.min.js.map diff --git a/calendar/amd/build/repository.min.js.map b/calendar/amd/build/repository.min.js.map new file mode 100644 index 0000000000000..368cbd89dc2ea --- /dev/null +++ b/calendar/amd/build/repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/repository.js"],"names":["define","$","Ajax","getEventById","eventId","call","methodname","args","eventid","deleteEvent","deleteSeries","request","events","repeat","updateEventStartDay","dayTimestamp","daytimestamp","submitCreateUpdateForm","formdata","getCalendarMonthData","year","month","courseid","categoryid","includenavigation","mini","getCalendarDayData","day","categoryId","getCalendarUpcomingData","getCourseGroupsData"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handle calendar ajax actions.\n *\n * @module core_calendar/repository\n * @class repository\n * @package core_calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n /**\n * Delete a calendar event.\n *\n * @method deleteEvent\n * @param {int} eventId The event id.\n * @param {bool} deleteSeries Whether to delete all events in the series\n * @return {promise} Resolved with requested calendar event\n */\n var deleteEvent = function(eventId, deleteSeries) {\n if (typeof deleteSeries === 'undefined') {\n deleteSeries = false;\n }\n var request = {\n methodname: 'core_calendar_delete_calendar_events',\n args: {\n events: [{\n eventid: eventId,\n repeat: deleteSeries,\n }]\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get a calendar event by id.\n *\n * @method getEventById\n * @param {int} eventId The event id.\n * @return {promise} Resolved with requested calendar event\n */\n var getEventById = function(eventId) {\n\n var request = {\n methodname: 'core_calendar_get_calendar_event_by_id',\n args: {\n eventid: eventId\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Submit the form data for the event form.\n *\n * @method submitCreateUpdateForm\n * @param {string} formdata The URL encoded values from the form\n * @return {promise} Resolved with the new or edited event\n */\n var submitCreateUpdateForm = function(formdata) {\n var request = {\n methodname: 'core_calendar_submit_create_update_form',\n args: {\n formdata: formdata\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get calendar data for the month view.\n *\n * @method getCalendarMonthData\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} courseid The course id.\n * @param {Number} categoryid The category id.\n * @param {Bool} includenavigation Whether to include navigation.\n * @param {Bool} mini Whether the month is in mini view.\n * @return {promise} Resolved with the month view data.\n */\n var getCalendarMonthData = function(year, month, courseid, categoryid, includenavigation, mini) {\n var request = {\n methodname: 'core_calendar_get_calendar_monthly_view',\n args: {\n year: year,\n month: month,\n courseid: courseid,\n categoryid: categoryid,\n includenavigation: includenavigation,\n mini: mini\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get calendar data for the day view.\n *\n * @method getCalendarDayData\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseid The course id.\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise} Resolved with the day view data.\n */\n var getCalendarDayData = function(year, month, day, courseid, categoryId) {\n var request = {\n methodname: 'core_calendar_get_calendar_day_view',\n args: {\n year: year,\n month: month,\n day: day,\n courseid: courseid,\n categoryid: categoryId,\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Change the start day for the given event id. The day timestamp\n * only has to be any time during the target day because only the\n * date information is extracted, the time of the day is ignored.\n *\n * @param {int} eventId The id of the event to update\n * @param {int} dayTimestamp A timestamp for some time during the target day\n * @return {promise}\n */\n var updateEventStartDay = function(eventId, dayTimestamp) {\n var request = {\n methodname: 'core_calendar_update_event_start_day',\n args: {\n eventid: eventId,\n daytimestamp: dayTimestamp\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get calendar upcoming data.\n *\n * @method getCalendarUpcomingData\n * @param {Number} courseid The course id.\n * @param {Number} categoryid The category id.\n * @return {promise} Resolved with the month view data.\n */\n var getCalendarUpcomingData = function(courseid, categoryid) {\n var request = {\n methodname: 'core_calendar_get_calendar_upcoming_view',\n args: {\n courseid: courseid,\n categoryid: categoryid,\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the groups by course id.\n *\n * @param {Number} courseid The course id to fetch the groups from.\n * @return {promise} Resolved with the course groups.\n */\n var getCourseGroupsData = function(courseid) {\n var request = {\n methodname: 'core_group_get_course_groups',\n args: {\n courseid: courseid\n }\n };\n\n return Ajax.call([request])[0];\n };\n\n return {\n getEventById: getEventById,\n deleteEvent: deleteEvent,\n updateEventStartDay: updateEventStartDay,\n submitCreateUpdateForm: submitCreateUpdateForm,\n getCalendarMonthData: getCalendarMonthData,\n getCalendarDayData: getCalendarDayData,\n getCalendarUpcomingData: getCalendarUpcomingData,\n getCourseGroupsData: getCourseGroupsData\n };\n});\n"],"file":"repository.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/selectors.min.js b/calendar/amd/build/selectors.min.js index d166019e97c85..33e86eafa067d 100644 --- a/calendar/amd/build/selectors.min.js +++ b/calendar/amd/build/selectors.min.js @@ -1 +1,2 @@ -define([],function(){return{eventFilterItem:"[data-action='filter-event-type']",eventType:{site:"[data-eventtype-site]",category:"[data-eventtype-category]",course:"[data-eventtype-course]",group:"[data-eventtype-group]",user:"[data-eventtype-user]"},popoverType:{site:"[data-popover-eventtype-site]",category:"[data-popover-eventtype-category]",course:"[data-popover-eventtype-course]",group:"[data-popover-eventtype-group]",user:"[data-popover-eventtype-user]"},calendarPeriods:{month:"[data-period='month']"},courseSelector:'select[name="course"]',viewSelector:'div[data-region="view-selector"]',actions:{create:'[data-action="new-event-button"]',edit:'[data-action="edit"]',remove:'[data-action="delete"]',viewEvent:'[data-action="view-event"]'},elements:{courseSelector:'select[name="course"]'},today:".today",day:'[data-region="day"]',calendarMain:'[data-region="calendar"]',wrapper:".calendarwrapper",eventItem:'[data-type="event"]',links:{navLink:".calendarwrapper .arrow_link",eventLink:"[data-region='event-item']",miniDayLink:"[data-region='mini-day-link']"},containers:{loadingIcon:'[data-region="overlay-icon-container"]'}}}); \ No newline at end of file +define ("core_calendar/selectors",[],function(){return{eventFilterItem:"[data-action='filter-event-type']",eventType:{site:"[data-eventtype-site]",category:"[data-eventtype-category]",course:"[data-eventtype-course]",group:"[data-eventtype-group]",user:"[data-eventtype-user]"},popoverType:{site:"[data-popover-eventtype-site]",category:"[data-popover-eventtype-category]",course:"[data-popover-eventtype-course]",group:"[data-popover-eventtype-group]",user:"[data-popover-eventtype-user]"},calendarPeriods:{month:"[data-period='month']"},courseSelector:"select[name=\"course\"]",viewSelector:"div[data-region=\"view-selector\"]",actions:{create:"[data-action=\"new-event-button\"]",edit:"[data-action=\"edit\"]",remove:"[data-action=\"delete\"]",viewEvent:"[data-action=\"view-event\"]"},elements:{courseSelector:"select[name=\"course\"]"},today:".today",day:"[data-region=\"day\"]",calendarMain:"[data-region=\"calendar\"]",wrapper:".calendarwrapper",eventItem:"[data-type=\"event\"]",links:{navLink:".calendarwrapper .arrow_link",eventLink:"[data-region='event-item']",miniDayLink:"[data-region='mini-day-link']"},containers:{loadingIcon:"[data-region=\"overlay-icon-container\"]"}}}); +//# sourceMappingURL=selectors.min.js.map diff --git a/calendar/amd/build/selectors.min.js.map b/calendar/amd/build/selectors.min.js.map new file mode 100644 index 0000000000000..b37731a3ff619 --- /dev/null +++ b/calendar/amd/build/selectors.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/selectors.js"],"names":["define","eventFilterItem","eventType","site","category","course","group","user","popoverType","calendarPeriods","month","courseSelector","viewSelector","actions","create","edit","remove","viewEvent","elements","today","day","calendarMain","wrapper","eventItem","links","navLink","eventLink","miniDayLink","containers","loadingIcon"],"mappings":"AAuBAA,OAAM,2BAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,eAAe,CAAE,mCADd,CAEHC,SAAS,CAAE,CACPC,IAAI,CAAE,uBADC,CAEPC,QAAQ,CAAE,2BAFH,CAGPC,MAAM,CAAE,yBAHD,CAIPC,KAAK,CAAE,wBAJA,CAKPC,IAAI,CAAE,uBALC,CAFR,CASHC,WAAW,CAAE,CACTL,IAAI,CAAE,+BADG,CAETC,QAAQ,CAAE,mCAFD,CAGTC,MAAM,CAAE,iCAHC,CAITC,KAAK,CAAE,gCAJE,CAKTC,IAAI,CAAE,+BALG,CATV,CAgBHE,eAAe,CAAE,CACbC,KAAK,CAAE,uBADM,CAhBd,CAmBHC,cAAc,CAAE,yBAnBb,CAoBHC,YAAY,CAAE,oCApBX,CAqBHC,OAAO,CAAE,CACLC,MAAM,CAAE,oCADH,CAELC,IAAI,CAAE,wBAFD,CAGLC,MAAM,CAAE,0BAHH,CAILC,SAAS,CAAE,8BAJN,CArBN,CA2BHC,QAAQ,CAAE,CACNP,cAAc,CAAE,yBADV,CA3BP,CA8BHQ,KAAK,CAAE,QA9BJ,CA+BHC,GAAG,CAAE,uBA/BF,CAgCHC,YAAY,CAAE,4BAhCX,CAiCHC,OAAO,CAAE,kBAjCN,CAkCHC,SAAS,CAAE,uBAlCR,CAmCHC,KAAK,CAAE,CACHC,OAAO,CAAE,8BADN,CAEHC,SAAS,CAAE,4BAFR,CAGHC,WAAW,CAAE,+BAHV,CAnCJ,CAwCHC,UAAU,CAAE,CACRC,WAAW,CAAE,0CADL,CAxCT,CA4CV,CA7CK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module is responsible for the calendar filter.\n *\n * @module core_calendar/calendar_selectors\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n eventFilterItem: \"[data-action='filter-event-type']\",\n eventType: {\n site: \"[data-eventtype-site]\",\n category: \"[data-eventtype-category]\",\n course: \"[data-eventtype-course]\",\n group: \"[data-eventtype-group]\",\n user: \"[data-eventtype-user]\",\n },\n popoverType: {\n site: \"[data-popover-eventtype-site]\",\n category: \"[data-popover-eventtype-category]\",\n course: \"[data-popover-eventtype-course]\",\n group: \"[data-popover-eventtype-group]\",\n user: \"[data-popover-eventtype-user]\",\n },\n calendarPeriods: {\n month: \"[data-period='month']\",\n },\n courseSelector: 'select[name=\"course\"]',\n viewSelector: 'div[data-region=\"view-selector\"]',\n actions: {\n create: '[data-action=\"new-event-button\"]',\n edit: '[data-action=\"edit\"]',\n remove: '[data-action=\"delete\"]',\n viewEvent: '[data-action=\"view-event\"]',\n },\n elements: {\n courseSelector: 'select[name=\"course\"]',\n },\n today: '.today',\n day: '[data-region=\"day\"]',\n calendarMain: '[data-region=\"calendar\"]',\n wrapper: '.calendarwrapper',\n eventItem: '[data-type=\"event\"]',\n links: {\n navLink: '.calendarwrapper .arrow_link',\n eventLink: \"[data-region='event-item']\",\n miniDayLink: \"[data-region='mini-day-link']\",\n },\n containers: {\n loadingIcon: '[data-region=\"overlay-icon-container\"]',\n },\n };\n});\n"],"file":"selectors.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/summary_modal.min.js b/calendar/amd/build/summary_modal.min.js index f13ba37a56873..9413150780507 100644 --- a/calendar/amd/build/summary_modal.min.js +++ b/calendar/amd/build/summary_modal.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/repository","core_calendar/events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={ROOT:"[data-region='summary-modal-container']",EDIT_BUTTON:'[data-action="edit"]',DELETE_BUTTON:'[data-action="delete"]'},n=function(a){e.call(this,a)};return n.TYPE="core_calendar-event_summary",n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.getEditButton=function(){return"undefined"==typeof this.editButton&&(this.editButton=this.getFooter().find(m.EDIT_BUTTON)),this.editButton},n.prototype.getDeleteButton=function(){return"undefined"==typeof this.deleteButton&&(this.deleteButton=this.getFooter().find(m.DELETE_BUTTON)),this.deleteButton},n.prototype.getEventId=function(){return this.getBody().find(m.ROOT).attr("data-event-id")},n.prototype.getEventTitle=function(){return this.getBody().find(m.ROOT).attr("data-event-title")},n.prototype.getEventCount=function(){return this.getBody().find(m.ROOT).attr("data-event-count")},n.prototype.getEditUrl=function(){return this.getBody().find(m.ROOT).attr("data-edit-url")},n.prototype.isActionEvent=function(){return"true"==this.getBody().find(m.ROOT).attr("data-action-event")},n.prototype.registerEventListeners=function(){e.prototype.registerEventListeners.call(this),this.getRoot().on(h.bodyRendered,function(){this.getModal().data({eventTitle:this.getEventTitle(),eventId:this.getEventId(),eventCount:this.getEventCount()}).attr("data-type","event"),k.registerRemove(this.getModal())}.bind(this)),a("body").on(j.deleted,function(){this.hide()}.bind(this)),d.define(this.getEditButton(),[d.events.activate]),this.getEditButton().on(d.events.activate,function(b,c){this.isActionEvent()?a("body").trigger(j.editActionEvent,[this.getEditUrl()]):a("body").trigger(j.editEvent,[this.getEventId()]),this.hide(),b.preventDefault(),b.stopPropagation(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()}.bind(this))},l||(f.register(n.TYPE,n,"core_calendar/event_summary_modal"),l=!0),n}); \ No newline at end of file +define ("core_calendar/summary_modal",["jquery","core/str","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","core/modal_factory","core/modal_events","core_calendar/repository","core_calendar/events","core_calendar/crud"],function(a,b,c,d,e,f,g,h,i,j,k){var l=!1,m={ROOT:"[data-region='summary-modal-container']",EDIT_BUTTON:"[data-action=\"edit\"]",DELETE_BUTTON:"[data-action=\"delete\"]"},n=function(a){e.call(this,a)};n.TYPE="core_calendar-event_summary";n.prototype=Object.create(e.prototype);n.prototype.constructor=n;n.prototype.getEditButton=function(){if("undefined"==typeof this.editButton){this.editButton=this.getFooter().find(m.EDIT_BUTTON)}return this.editButton};n.prototype.getDeleteButton=function(){if("undefined"==typeof this.deleteButton){this.deleteButton=this.getFooter().find(m.DELETE_BUTTON)}return this.deleteButton};n.prototype.getEventId=function(){return this.getBody().find(m.ROOT).attr("data-event-id")};n.prototype.getEventTitle=function(){return this.getBody().find(m.ROOT).attr("data-event-title")};n.prototype.getEventCount=function(){return this.getBody().find(m.ROOT).attr("data-event-count")};n.prototype.getEditUrl=function(){return this.getBody().find(m.ROOT).attr("data-edit-url")};n.prototype.isActionEvent=function(){return"true"==this.getBody().find(m.ROOT).attr("data-action-event")};n.prototype.registerEventListeners=function(){e.prototype.registerEventListeners.call(this);this.getRoot().on(h.bodyRendered,function(){this.getModal().data({eventTitle:this.getEventTitle(),eventId:this.getEventId(),eventCount:this.getEventCount()}).attr("data-type","event");k.registerRemove(this.getModal())}.bind(this));a("body").on(j.deleted,function(){this.hide()}.bind(this));d.define(this.getEditButton(),[d.events.activate]);this.getEditButton().on(d.events.activate,function(b,c){if(this.isActionEvent()){a("body").trigger(j.editActionEvent,[this.getEditUrl()])}else{a("body").trigger(j.editEvent,[this.getEventId()])}this.hide();b.preventDefault();b.stopPropagation();c.originalEvent.preventDefault();c.originalEvent.stopPropagation()}.bind(this))};if(!l){f.register(n.TYPE,n,"core_calendar/event_summary_modal");l=!0}return n}); +//# sourceMappingURL=summary_modal.min.js.map diff --git a/calendar/amd/build/summary_modal.min.js.map b/calendar/amd/build/summary_modal.min.js.map new file mode 100644 index 0000000000000..d0c92b5d7ca9b --- /dev/null +++ b/calendar/amd/build/summary_modal.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/summary_modal.js"],"names":["define","$","Str","Notification","CustomEvents","Modal","ModalRegistry","ModalFactory","ModalEvents","CalendarRepository","CalendarEvents","CalendarCrud","registered","SELECTORS","ROOT","EDIT_BUTTON","DELETE_BUTTON","ModalEventSummary","root","call","TYPE","prototype","Object","create","constructor","getEditButton","editButton","getFooter","find","getDeleteButton","deleteButton","getEventId","getBody","attr","getEventTitle","getEventCount","getEditUrl","isActionEvent","registerEventListeners","getRoot","on","bodyRendered","getModal","data","eventTitle","eventId","eventCount","registerRemove","bind","deleted","hide","events","activate","e","trigger","editActionEvent","editEvent","preventDefault","stopPropagation","originalEvent","register"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handle summary modal.\n *\n * @module core_calendar/summary_modal\n * @package core_calendar\n * @copyright 2017 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/str',\n 'core/notification',\n 'core/custom_interaction_events',\n 'core/modal',\n 'core/modal_registry',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/crud',\n],\nfunction(\n $,\n Str,\n Notification,\n CustomEvents,\n Modal,\n ModalRegistry,\n ModalFactory,\n ModalEvents,\n CalendarRepository,\n CalendarEvents,\n CalendarCrud\n) {\n\n var registered = false;\n var SELECTORS = {\n ROOT: \"[data-region='summary-modal-container']\",\n EDIT_BUTTON: '[data-action=\"edit\"]',\n DELETE_BUTTON: '[data-action=\"delete\"]',\n };\n\n /**\n * Constructor for the Modal.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var ModalEventSummary = function(root) {\n Modal.call(this, root);\n };\n\n ModalEventSummary.TYPE = 'core_calendar-event_summary';\n ModalEventSummary.prototype = Object.create(Modal.prototype);\n ModalEventSummary.prototype.constructor = ModalEventSummary;\n\n /**\n * Get the edit button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getEditButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getEditButton = function() {\n if (typeof this.editButton == 'undefined') {\n this.editButton = this.getFooter().find(SELECTORS.EDIT_BUTTON);\n }\n\n return this.editButton;\n };\n\n /**\n * Get the delete button element from the footer. The button is cached\n * as it's not expected to change.\n *\n * @method getDeleteButton\n * @return {object} button element\n */\n ModalEventSummary.prototype.getDeleteButton = function() {\n if (typeof this.deleteButton == 'undefined') {\n this.deleteButton = this.getFooter().find(SELECTORS.DELETE_BUTTON);\n }\n\n return this.deleteButton;\n };\n\n /**\n * Get the id for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventId\n * @return {int}\n */\n ModalEventSummary.prototype.getEventId = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-id');\n };\n\n /**\n * Get the title for the event being shown in this modal. This value is\n * not cached because it will change depending on which event is\n * being displayed.\n *\n * @method getEventTitle\n * @return {String}\n */\n ModalEventSummary.prototype.getEventTitle = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-title');\n };\n\n /**\n * Get the number of events in the series for the event being shown in\n * this modal. This value is not cached because it will change\n * depending on which event is being displayed.\n *\n * @method getEventCount\n * @return {int}\n */\n ModalEventSummary.prototype.getEventCount = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-event-count');\n };\n\n /**\n * Get the url for the event being shown in this modal.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.getEditUrl = function() {\n return this.getBody().find(SELECTORS.ROOT).attr('data-edit-url');\n };\n\n /**\n * Is this an action event.\n *\n * @method getEventUrl\n * @return {String}\n */\n ModalEventSummary.prototype.isActionEvent = function() {\n return (this.getBody().find(SELECTORS.ROOT).attr('data-action-event') == 'true');\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n ModalEventSummary.prototype.registerEventListeners = function() {\n // Apply parent event listeners.\n Modal.prototype.registerEventListeners.call(this);\n\n // We have to wait for the modal to finish rendering in order to ensure that\n // the data-event-title property is available to use as the modal title.\n this.getRoot().on(ModalEvents.bodyRendered, function() {\n this.getModal().data({\n eventTitle: this.getEventTitle(),\n eventId: this.getEventId(),\n eventCount: this.getEventCount(),\n })\n .attr('data-type', 'event');\n CalendarCrud.registerRemove(this.getModal());\n\n }.bind(this));\n\n $('body').on(CalendarEvents.deleted, function() {\n // Close the dialogue on delete.\n this.hide();\n }.bind(this));\n\n CustomEvents.define(this.getEditButton(), [\n CustomEvents.events.activate\n ]);\n\n this.getEditButton().on(CustomEvents.events.activate, function(e, data) {\n if (this.isActionEvent()) {\n // Action events cannot be edited on the event form and must be redirected to the module UI.\n $('body').trigger(CalendarEvents.editActionEvent, [this.getEditUrl()]);\n } else {\n // When the edit button is clicked we fire an event for the calendar UI to handle.\n // We don't care how the UI chooses to handle it.\n $('body').trigger(CalendarEvents.editEvent, [this.getEventId()]);\n }\n\n // There is nothing else for us to do so let's hide.\n this.hide();\n\n // We've handled this event so no need to propagate it.\n e.preventDefault();\n e.stopPropagation();\n data.originalEvent.preventDefault();\n data.originalEvent.stopPropagation();\n }.bind(this));\n };\n\n // Automatically register with the modal registry the first time this module is imported so that you can create modals\n // of this type using the modal factory.\n if (!registered) {\n ModalRegistry.register(ModalEventSummary.TYPE, ModalEventSummary, 'core_calendar/event_summary_modal');\n registered = true;\n }\n\n return ModalEventSummary;\n});\n"],"file":"summary_modal.min.js"} \ No newline at end of file diff --git a/calendar/amd/build/view_manager.min.js b/calendar/amd/build/view_manager.min.js index e547fd4bab3e5..628c38dedc7db 100644 --- a/calendar/amd/build/view_manager.min.js +++ b/calendar/amd/build/view_manager.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/str","core/notification","core_calendar/repository","core_calendar/events","core_calendar/selectors","core/modal_factory","core/modal_events","core_calendar/summary_modal","core/custom_interaction_events"],function(a,b,c,d,e,f,g,h,i,j,k){var l=function(b){b=a(b),b.on("click",g.links.eventLink,function(b){var c,d=a(b.target),e=null;c=d.is(g.actions.viewEvent)?d:d.closest(g.actions.viewEvent),e=c.length?c.data("eventId"):d.find(g.actions.viewEvent).data("eventId"),e&&(b.preventDefault(),b.stopPropagation(),w(e))}),b.on("click",g.links.navLink,function(c){var d=b.find(g.wrapper),e=d.data("view"),f=d.data("courseid"),h=d.data("categoryid"),i=a(c.currentTarget);"month"===e?(n(b,i.attr("href"),i.data("year"),i.data("month"),f,h),c.preventDefault()):"day"===e&&(r(b,i.attr("href"),i.data("year"),i.data("month"),i.data("day"),f,h),c.preventDefault())});var c=b.find(g.viewSelector);k.define(c,[k.events.activate]),c.on(k.events.activate,function(c){c.preventDefault();var e=a(c.target);if(!e.hasClass("active")){var f=e.data("view"),g=e.data("year"),h=e.data("month"),i=e.data("day"),j=e.data("courseid"),k=e.data("categoryid");"month"==f?m(b,g,h,j,k,b,"core_calendar/calendar_month").then(function(){return window.history.pushState({},"","?view=month")}).fail(d.exception):"day"==f?p(b,g,h,i,j,k,b,"core_calendar/calendar_day").then(function(){return window.history.pushState({},"","?view=day")}).fail(d.exception):"upcoming"==f&&u(b,j,k,b,"core_calendar/calendar_upcoming").then(function(){return window.history.pushState({},"","?view=upcoming")}).fail(d.exception)}})},m=function(c,h,i,j,k,l,m){s(c),l=l||c.find(g.wrapper),m=m||c.attr("data-template"),M.util.js_pending([c.get("id"),h,i,j].join("-"));var n=c.data("includenavigation"),o=c.data("mini");return e.getCalendarMonthData(h,i,j,k,n,o).then(function(a){return a.viewingmonth=!0,b.render(m,a)}).then(function(a,c){return b.replaceNode(l,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){return M.util.js_complete([c.get("id"),h,i,j].join("-")),t(c)}).fail(d.exception)},n=function(b,c,d,e,g,h){return m(b,d,e,g,h).then(function(){return c.length&&"#"!==c&&window.history.pushState({},"",c),arguments}).then(function(){return a("body").trigger(f.monthChanged,[d,e,g,h]),arguments})},o=function(a,b,c){var d=a.find(g.wrapper).data("year"),e=a.find(g.wrapper).data("month");return"undefined"==typeof b&&(b=a.find(g.wrapper).data("courseid")),"undefined"==typeof c&&(c=a.find(g.wrapper).data("categoryid")),m(a,d,e,b,c)},p=function(c,h,i,j,k,l,m,n){s(c),m=m||c.find(g.wrapper),n=n||c.attr("data-template"),M.util.js_pending([c.get("id"),h,i,j,k,l].join("-"));var o=c.data("includenavigation");return e.getCalendarDayData(h,i,j,k,l,o).then(function(a){return a.viewingday=!0,b.render(n,a)}).then(function(a,c){return b.replaceNode(m,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){return M.util.js_complete([c.get("id"),h,i,j,k,l].join("-")),t(c)}).fail(d.exception)},q=function(a,b,c){var d=a.find(g.wrapper),e=d.data("year"),f=d.data("month"),h=d.data("day");return b||(b=a.find(g.wrapper).data("courseid")),"undefined"==typeof c&&(c=a.find(g.wrapper).data("categoryid")),p(a,e,f,h,b,c)},r=function(b,c,d,e,g,h,i){return p(b,d,e,g,h,i).then(function(){return c.length&&"#"!==c&&window.history.pushState({},"",c),arguments}).then(function(){return a("body").trigger(f.dayChanged,[d,e,g,h,i]),arguments})},s=function(a){var b=a.find(g.containers.loadingIcon);b.removeClass("hidden")},t=function(a){var b=a.find(g.containers.loadingIcon);b.addClass("hidden")},u=function(c,h,i,j,k){return s(c),j=j||c.find(g.wrapper),k=k||c.attr("data-template"),"undefined"==typeof h&&(h=c.find(g.wrapper).data("courseid")),"undefined"==typeof i&&(i=c.find(g.wrapper).data("categoryid")),e.getCalendarUpcomingData(h,i).then(function(a){return a.viewingupcoming=!0,b.render(k,a)}).then(function(a,c){return b.replaceNode(j,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){return t(c)}).fail(d.exception)},v=function(a){return"calendar_event_"+a},w=function(a){var c="";e.getEventById(a).then(function(b){if(!b.event)throw new Error("Error encountered while trying to fetch calendar event with ID: "+a);var d=b.event;return c=v(d.normalisedeventtype),d}).then(function(a){var d={title:a.name,type:j.TYPE,body:b.render("core_calendar/event_summary_body",a),templateContext:{canedit:a.canedit,candelete:a.candelete,headerclasses:c,isactionevent:a.isactionevent,url:a.url}};return h.create(d)}).done(function(a){a.getRoot().on(i.hidden,function(){a.destroy()}),a.show()}).fail(d.exception)};return{init:function(a,b){l(a,b)},reloadCurrentMonth:o,changeMonth:n,refreshMonthContent:m,reloadCurrentDay:q,changeDay:r,refreshDayContent:p,reloadCurrentUpcoming:u}}); \ No newline at end of file +define ("core_calendar/view_manager",["jquery","core/templates","core/str","core/notification","core_calendar/repository","core_calendar/events","core_calendar/selectors","core/modal_factory","core/modal_events","core_calendar/summary_modal","core/custom_interaction_events"],function(a,b,c,d,e,f,g,h,i,j,k){var l=function(b){b=a(b);b.on("click",g.links.eventLink,function(b){var c=a(b.target),d=null,e;if(c.is(g.actions.viewEvent)){e=c}else{e=c.closest(g.actions.viewEvent)}if(e.length){d=e.data("eventId")}else{d=c.find(g.actions.viewEvent).data("eventId")}if(d){b.preventDefault();b.stopPropagation();u(d)}});b.on("click",g.links.navLink,function(c){var d=b.find(g.wrapper),e=d.data("view"),f=d.data("courseid"),h=d.data("categoryid"),i=a(c.currentTarget);if("month"===e){n(b,i.attr("href"),i.data("year"),i.data("month"),f,h);c.preventDefault()}else if("day"===e){p(b,i.attr("href"),i.data("year"),i.data("month"),i.data("day"),f,h);c.preventDefault()}});var c=b.find(g.viewSelector);k.define(c,[k.events.activate]);c.on(k.events.activate,function(c){c.preventDefault();var e=a(c.target);if(e.hasClass("active")){return}var f=e.data("view"),g=e.data("year"),h=e.data("month"),i=e.data("day"),j=e.data("courseid"),k=e.data("categoryid");if("month"==f){m(b,g,h,j,k,b,"core_calendar/calendar_month").then(function(){return window.history.pushState({},"","?view=month")}).fail(d.exception)}else if("day"==f){o(b,g,h,i,j,k,b,"core_calendar/calendar_day").then(function(){return window.history.pushState({},"","?view=day")}).fail(d.exception)}else if("upcoming"==f){s(b,j,k,b,"core_calendar/calendar_upcoming").then(function(){return window.history.pushState({},"","?view=upcoming")}).fail(d.exception)}})},m=function(c,h,i,j,k,l,m){q(c);l=l||c.find(g.wrapper);m=m||c.attr("data-template");M.util.js_pending([c.get("id"),h,i,j].join("-"));var n=c.data("includenavigation"),o=c.data("mini");return e.getCalendarMonthData(h,i,j,k,n,o).then(function(a){a.viewingmonth=!0;return b.render(m,a)}).then(function(a,c){return b.replaceNode(l,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){M.util.js_complete([c.get("id"),h,i,j].join("-"));return r(c)}).fail(d.exception)},n=function(b,c,d,e,g,h){return m(b,d,e,g,h).then(function(){if(c.length&&"#"!==c){window.history.pushState({},"",c)}return arguments}).then(function(){a("body").trigger(f.monthChanged,[d,e,g,h]);return arguments})},o=function(c,h,i,j,k,l,m,n){q(c);m=m||c.find(g.wrapper);n=n||c.attr("data-template");M.util.js_pending([c.get("id"),h,i,j,k,l].join("-"));var o=c.data("includenavigation");return e.getCalendarDayData(h,i,j,k,l,o).then(function(a){a.viewingday=!0;return b.render(n,a)}).then(function(a,c){return b.replaceNode(m,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){M.util.js_complete([c.get("id"),h,i,j,k,l].join("-"));return r(c)}).fail(d.exception)},p=function(b,c,d,e,g,h,i){return o(b,d,e,g,h,i).then(function(){if(c.length&&"#"!==c){window.history.pushState({},"",c)}return arguments}).then(function(){a("body").trigger(f.dayChanged,[d,e,g,h,i]);return arguments})},q=function(a){var b=a.find(g.containers.loadingIcon);b.removeClass("hidden")},r=function(a){var b=a.find(g.containers.loadingIcon);b.addClass("hidden")},s=function(c,h,i,j,k){q(c);j=j||c.find(g.wrapper);k=k||c.attr("data-template");if("undefined"==typeof h){h=c.find(g.wrapper).data("courseid")}if("undefined"==typeof i){i=c.find(g.wrapper).data("categoryid")}return e.getCalendarUpcomingData(h,i).then(function(a){a.viewingupcoming=!0;return b.render(k,a)}).then(function(a,c){return b.replaceNode(j,a,c)}).then(function(){a("body").trigger(f.viewUpdated)}).always(function(){return r(c)}).fail(d.exception)},t=function(a){return"calendar_event_"+a},u=function(a){var c="";e.getEventById(a).then(function(b){if(!b.event){throw new Error("Error encountered while trying to fetch calendar event with ID: "+a)}var d=b.event;c=t(d.normalisedeventtype);return d}).then(function(a){var d={title:a.name,type:j.TYPE,body:b.render("core_calendar/event_summary_body",a),templateContext:{canedit:a.canedit,candelete:a.candelete,headerclasses:c,isactionevent:a.isactionevent,url:a.url}};return h.create(d)}).done(function(a){a.getRoot().on(i.hidden,function(){a.destroy()});a.show()}).fail(d.exception)};return{init:function init(a,b){l(a,b)},reloadCurrentMonth:function reloadCurrentMonth(a,b,c){var d=a.find(g.wrapper).data("year"),e=a.find(g.wrapper).data("month");if("undefined"==typeof b){b=a.find(g.wrapper).data("courseid")}if("undefined"==typeof c){c=a.find(g.wrapper).data("categoryid")}return m(a,d,e,b,c)},changeMonth:n,refreshMonthContent:m,reloadCurrentDay:function reloadCurrentDay(a,b,c){var d=a.find(g.wrapper),e=d.data("year"),f=d.data("month"),h=d.data("day");if(!b){b=a.find(g.wrapper).data("courseid")}if("undefined"==typeof c){c=a.find(g.wrapper).data("categoryid")}return o(a,e,f,h,b,c)},changeDay:p,refreshDayContent:o,reloadCurrentUpcoming:s}}); +//# sourceMappingURL=view_manager.min.js.map diff --git a/calendar/amd/build/view_manager.min.js.map b/calendar/amd/build/view_manager.min.js.map new file mode 100644 index 0000000000000..5edaca0ead87e --- /dev/null +++ b/calendar/amd/build/view_manager.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/view_manager.js"],"names":["define","$","Templates","Str","Notification","CalendarRepository","CalendarEvents","CalendarSelectors","ModalFactory","ModalEvents","SummaryModal","CustomEvents","registerEventListeners","root","on","links","eventLink","e","target","eventId","is","actions","viewEvent","closest","length","data","find","preventDefault","stopPropagation","renderEventSummaryModal","navLink","wrapper","view","courseId","categoryId","link","currentTarget","changeMonth","attr","changeDay","viewSelector","events","activate","option","hasClass","year","month","day","refreshMonthContent","then","window","history","pushState","fail","exception","refreshDayContent","reloadCurrentUpcoming","courseid","categoryid","template","startLoading","M","util","js_pending","get","join","includenavigation","mini","getCalendarMonthData","context","viewingmonth","render","html","js","replaceNode","trigger","viewUpdated","always","js_complete","stopLoading","url","arguments","monthChanged","getCalendarDayData","viewingday","dayChanged","loadingIconContainer","containers","loadingIcon","removeClass","addClass","getCalendarUpcomingData","viewingupcoming","getEventTypeClassFromType","eventType","typeClass","getEventById","getEventResponse","event","Error","eventData","normalisedeventtype","modalParams","title","name","type","TYPE","body","templateContext","canedit","candelete","headerclasses","isactionevent","create","done","modal","getRoot","hidden","destroy","show","init","reloadCurrentMonth","reloadCurrentDay"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handler calendar view changes.\n *\n * @module core_calendar/view_manager\n * @package core_calendar\n * @copyright 2017 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n 'core/templates',\n 'core/str',\n 'core/notification',\n 'core_calendar/repository',\n 'core_calendar/events',\n 'core_calendar/selectors',\n 'core/modal_factory',\n 'core/modal_events',\n 'core_calendar/summary_modal',\n 'core/custom_interaction_events',\n], function(\n $,\n Templates,\n Str,\n Notification,\n CalendarRepository,\n CalendarEvents,\n CalendarSelectors,\n ModalFactory,\n ModalEvents,\n SummaryModal,\n CustomEvents\n) {\n\n /**\n * Register event listeners for the module.\n *\n * @param {object} root The root element.\n */\n var registerEventListeners = function(root) {\n root = $(root);\n\n // Bind click events to event links.\n root.on('click', CalendarSelectors.links.eventLink, function(e) {\n var target = $(e.target);\n var eventId = null;\n\n var eventLink;\n if (target.is(CalendarSelectors.actions.viewEvent)) {\n eventLink = target;\n } else {\n eventLink = target.closest(CalendarSelectors.actions.viewEvent);\n }\n\n if (eventLink.length) {\n eventId = eventLink.data('eventId');\n } else {\n eventId = target.find(CalendarSelectors.actions.viewEvent).data('eventId');\n }\n\n if (eventId) {\n // A link was found. Show the modal.\n\n e.preventDefault();\n // We've handled the event so stop it from bubbling\n // and causing the day click handler to fire.\n e.stopPropagation();\n\n renderEventSummaryModal(eventId);\n }\n });\n\n\n root.on('click', CalendarSelectors.links.navLink, function(e) {\n var wrapper = root.find(CalendarSelectors.wrapper);\n var view = wrapper.data('view');\n var courseId = wrapper.data('courseid');\n var categoryId = wrapper.data('categoryid');\n var link = $(e.currentTarget);\n\n if (view === 'month') {\n changeMonth(root, link.attr('href'), link.data('year'), link.data('month'), courseId, categoryId);\n e.preventDefault();\n } else if (view === 'day') {\n changeDay(root, link.attr('href'), link.data('year'), link.data('month'), link.data('day'),\n courseId, categoryId);\n e.preventDefault();\n }\n\n });\n\n var viewSelector = root.find(CalendarSelectors.viewSelector);\n CustomEvents.define(viewSelector, [CustomEvents.events.activate]);\n viewSelector.on(\n CustomEvents.events.activate,\n function(e) {\n e.preventDefault();\n\n var option = $(e.target);\n if (option.hasClass('active')) {\n return;\n }\n\n var view = option.data('view'),\n year = option.data('year'),\n month = option.data('month'),\n day = option.data('day'),\n courseId = option.data('courseid'),\n categoryId = option.data('categoryid');\n\n if (view == 'month') {\n refreshMonthContent(root, year, month, courseId, categoryId, root, 'core_calendar/calendar_month')\n .then(function() {\n return window.history.pushState({}, '', '?view=month');\n }).fail(Notification.exception);\n } else if (view == 'day') {\n refreshDayContent(root, year, month, day, courseId, categoryId, root, 'core_calendar/calendar_day')\n .then(function() {\n return window.history.pushState({}, '', '?view=day');\n }).fail(Notification.exception);\n } else if (view == 'upcoming') {\n reloadCurrentUpcoming(root, courseId, categoryId, root, 'core_calendar/calendar_upcoming')\n .then(function() {\n return window.history.pushState({}, '', '?view=upcoming');\n }).fail(Notification.exception);\n }\n }\n );\n };\n\n /**\n * Refresh the month content.\n *\n * @param {object} root The root element.\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} courseid The id of the course whose events are shown\n * @param {Number} categoryid The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {String} template The template to be rendered.\n * @return {promise}\n */\n var refreshMonthContent = function(root, year, month, courseid, categoryid, target, template) {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, courseid].join('-'));\n var includenavigation = root.data('includenavigation');\n var mini = root.data('mini');\n return CalendarRepository.getCalendarMonthData(year, month, courseid, categoryid, includenavigation, mini)\n .then(function(context) {\n context.viewingmonth = true;\n return Templates.render(template, context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n $('body').trigger(CalendarEvents.viewUpdated);\n return;\n })\n .always(function() {\n M.util.js_complete([root.get('id'), year, month, courseid].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n };\n\n /**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The container element\n * @param {String} url The calendar url to be shown\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} courseid The id of the course whose events are shown\n * @param {Number} categoryid The id of the category whose events are shown\n * @return {promise}\n */\n var changeMonth = function(root, url, year, month, courseid, categoryid) {\n return refreshMonthContent(root, year, month, courseid, categoryid)\n .then(function() {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return arguments;\n })\n .then(function() {\n $('body').trigger(CalendarEvents.monthChanged, [year, month, courseid, categoryid]);\n return arguments;\n });\n };\n\n /**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {Number} courseId The course id.\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\n var reloadCurrentMonth = function(root, courseId, categoryId) {\n var year = root.find(CalendarSelectors.wrapper).data('year');\n var month = root.find(CalendarSelectors.wrapper).data('month');\n\n if (typeof courseId === 'undefined') {\n courseId = root.find(CalendarSelectors.wrapper).data('courseid');\n }\n\n if (typeof categoryId === 'undefined') {\n categoryId = root.find(CalendarSelectors.wrapper).data('categoryid');\n }\n\n return refreshMonthContent(root, year, month, courseId, categoryId);\n };\n\n\n /**\n * Refresh the day content.\n *\n * @param {object} root The root element.\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseid The id of the course whose events are shown\n * @param {Number} categoryId The id of the category whose events are shown\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @param {String} template The template to be rendered.\n *\n * @return {promise}\n */\n var refreshDayContent = function(root, year, month, day, courseid, categoryId, target, template) {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n M.util.js_pending([root.get('id'), year, month, day, courseid, categoryId].join('-'));\n var includenavigation = root.data('includenavigation');\n return CalendarRepository.getCalendarDayData(year, month, day, courseid, categoryId, includenavigation)\n .then(function(context) {\n context.viewingday = true;\n return Templates.render(template, context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n $('body').trigger(CalendarEvents.viewUpdated);\n return;\n })\n .always(function() {\n M.util.js_complete([root.get('id'), year, month, day, courseid, categoryId].join('-'));\n return stopLoading(root);\n })\n .fail(Notification.exception);\n };\n\n /**\n * Reload the current day view data.\n *\n * @param {object} root The container element.\n * @param {Number} courseId The course id.\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\n var reloadCurrentDay = function(root, courseId, categoryId) {\n var wrapper = root.find(CalendarSelectors.wrapper);\n var year = wrapper.data('year');\n var month = wrapper.data('month');\n var day = wrapper.data('day');\n\n if (!courseId) {\n courseId = root.find(CalendarSelectors.wrapper).data('courseid');\n }\n\n if (typeof categoryId === 'undefined') {\n categoryId = root.find(CalendarSelectors.wrapper).data('categoryid');\n }\n\n return refreshDayContent(root, year, month, day, courseId, categoryId);\n };\n\n /**\n * Handle changes to the current calendar view.\n *\n * @param {object} root The root element.\n * @param {String} url The calendar url to be shown\n * @param {Number} year Year\n * @param {Number} month Month\n * @param {Number} day Day\n * @param {Number} courseId The id of the course whose events are shown\n * @param {Number} categoryId The id of the category whose events are shown\n * @return {promise}\n */\n var changeDay = function(root, url, year, month, day, courseId, categoryId) {\n return refreshDayContent(root, year, month, day, courseId, categoryId)\n .then(function() {\n if (url.length && url !== '#') {\n window.history.pushState({}, '', url);\n }\n return arguments;\n })\n .then(function() {\n $('body').trigger(CalendarEvents.dayChanged, [year, month, day, courseId, categoryId]);\n return arguments;\n });\n };\n\n /**\n * Set the element state to loading.\n *\n * @param {object} root The container element\n * @method startLoading\n */\n var startLoading = function(root) {\n var loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.removeClass('hidden');\n };\n\n /**\n * Remove the loading state from the element.\n *\n * @param {object} root The container element\n * @method stopLoading\n */\n var stopLoading = function(root) {\n var loadingIconContainer = root.find(CalendarSelectors.containers.loadingIcon);\n\n loadingIconContainer.addClass('hidden');\n };\n\n /**\n * Reload the current month view data.\n *\n * @param {object} root The container element.\n * @param {Number} courseId The course id.\n * @param {Number} categoryId The id of the category whose events are shown\n * @param {String} template The template to be rendered.\n * @param {object} target The element being replaced. If not specified, the calendarwrapper is used.\n * @return {promise}\n */\n var reloadCurrentUpcoming = function(root, courseId, categoryId, target, template) {\n startLoading(root);\n\n target = target || root.find(CalendarSelectors.wrapper);\n template = template || root.attr('data-template');\n\n if (typeof courseId === 'undefined') {\n courseId = root.find(CalendarSelectors.wrapper).data('courseid');\n }\n\n if (typeof categoryId === 'undefined') {\n categoryId = root.find(CalendarSelectors.wrapper).data('categoryid');\n }\n\n return CalendarRepository.getCalendarUpcomingData(courseId, categoryId)\n .then(function(context) {\n context.viewingupcoming = true;\n return Templates.render(template, context);\n })\n .then(function(html, js) {\n return Templates.replaceNode(target, html, js);\n })\n .then(function() {\n $('body').trigger(CalendarEvents.viewUpdated);\n return;\n })\n .always(function() {\n return stopLoading(root);\n })\n .fail(Notification.exception);\n };\n\n /**\n * Get the CSS class to apply for the given event type.\n *\n * @param {String} eventType The calendar event type\n * @return {String}\n */\n var getEventTypeClassFromType = function(eventType) {\n return 'calendar_event_' + eventType;\n };\n\n /**\n * Render the event summary modal.\n *\n * @param {Number} eventId The calendar event id.\n */\n var renderEventSummaryModal = function(eventId) {\n var typeClass = '';\n\n // Calendar repository promise.\n CalendarRepository.getEventById(eventId).then(function(getEventResponse) {\n if (!getEventResponse.event) {\n throw new Error('Error encountered while trying to fetch calendar event with ID: ' + eventId);\n }\n var eventData = getEventResponse.event;\n typeClass = getEventTypeClassFromType(eventData.normalisedeventtype);\n\n return eventData;\n }).then(function(eventData) {\n // Build the modal parameters from the event data.\n var modalParams = {\n title: eventData.name,\n type: SummaryModal.TYPE,\n body: Templates.render('core_calendar/event_summary_body', eventData),\n templateContext: {\n canedit: eventData.canedit,\n candelete: eventData.candelete,\n headerclasses: typeClass,\n isactionevent: eventData.isactionevent,\n url: eventData.url\n }\n };\n\n // Create the modal.\n return ModalFactory.create(modalParams);\n\n }).done(function(modal) {\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Finally, render the modal!\n modal.show();\n\n }).fail(Notification.exception);\n };\n\n return {\n init: function(root, view) {\n registerEventListeners(root, view);\n },\n reloadCurrentMonth: reloadCurrentMonth,\n changeMonth: changeMonth,\n refreshMonthContent: refreshMonthContent,\n reloadCurrentDay: reloadCurrentDay,\n changeDay: changeDay,\n refreshDayContent: refreshDayContent,\n reloadCurrentUpcoming: reloadCurrentUpcoming\n };\n });\n"],"file":"view_manager.min.js"} \ No newline at end of file diff --git a/course/amd/build/actions.min.js b/course/amd/build/actions.min.js index aed4c3a9d2cd3..1afa46c09f267 100644 --- a/course/amd/build/actions.min.js +++ b/course/amd/build/actions.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/str","core/url","core/yui","core/modal_factory","core/modal_events","core/key_codes"],function(a,b,c,d,e,f,g,h,i,j){var k={EDITINPROGRESS:"editinprogress",SECTIONDRAGGABLE:"sectiondraggable",EDITINGMOVE:"editing_move"},l={ACTIVITYLI:"li.activity",ACTIONAREA:".actions",ACTIVITYACTION:"a.cm-edit-action",MENU:".moodle-actionmenu[data-enhance=moodle-core-actionmenu]",TOGGLE:".toggle-display,.dropdown-toggle",SECTIONLI:"li.section",SECTIONACTIONMENU:".section_action_menu",ADDSECTIONS:"#changenumsections [data-add-sections]"};g.use("moodle-course-coursebase",function(){var a=M.course.format.get_section_selector();a&&(l.SECTIONLI=a)});var m=function(a){var b;return g.use("moodle-course-util",function(c){b=c.Moodle.core_course.util.cm.getId(c.Node(a.get(0)))}),b},n=function(a){var b;return g.use("moodle-course-util",function(c){b=c.Moodle.core_course.util.cm.getName(c.Node(a.get(0)))}),b},o=function(a){a.addClass(k.EDITINPROGRESS);var b=a.find(l.ACTIONAREA).get(0);if(b){var c=M.util.add_spinner(g,g.Node(b));return c.show(),c}return null},p=function(a){a.addClass(k.EDITINPROGRESS);var b=a.find(l.SECTIONACTIONMENU).get(0);if(b){var c=M.util.add_spinner(g,g.Node(b));return c.show(),c}return null},q=function(a){var b=M.util.add_lightbox(g,g.Node(a.get(0)));return b.show(),b},r=function(a,b,c){window.setTimeout(function(){a.removeClass(k.EDITINPROGRESS),b&&b.hide()},c)},s=function(a,b){a&&window.setTimeout(function(){a.hide()},b)},t=function(a){g.use("moodle-course-coursebase",function(){M.course.coursebase.invoke_function("setup_for_resource","#"+a)}),M.core.actionmenu&&M.core.actionmenu.newDOMNode&&M.core.actionmenu.newDOMNode(g.one("#"+a))},u=function(b,c){var d=a("#"+b),e="[data-action="+c+"]";"groupsseparate"!==c&&"groupsvisible"!==c&&"groupsnone"!==c||(e="[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]"),d.find(e).is(":visible")?d.find(e).focus():d.find(l.MENU).find(l.TOGGLE).focus()},v=function(b){var c=a("a:visible"),d=!1,e=null;return c.each(function(){if(a.contains(b[0],this))d=!0;else if(d)return e=this,!1}),e},w=function(c,e,f){var g,h=f.attr("data-action"),i=o(c),j=b.call([{methodname:"core_course_edit_module",args:{id:e,action:h,sectionreturn:f.attr("data-sectionreturn")?f.attr("data-sectionreturn"):0}}],!0);"duplicate"===h&&(g=q(f.closest(l.SECTIONLI))),a.when.apply(a,j).done(function(b){var d=v(c);c.replaceWith(b),a("
        "+b+"
        ").find(l.ACTIVITYLI).each(function(b){t(a(this).attr("id")),0===b&&(u(a(this).attr("id"),h),d=null)}),d&&d.focus(),r(c,i,400),s(g,400),c.trigger(a.Event("coursemoduleedited",{ajaxreturn:b,action:h}))}).fail(function(b){r(c,i),s(g);var e=a.Event("coursemoduleeditfailed",{exception:b,action:h});c.trigger(e),e.isDefaultPrevented()||d.exception(b)})},x=function(c,d,e){var f=o(c),g=b.call([{methodname:"core_course_get_module",args:{id:d,sectionreturn:e}}],!0);a.when.apply(a,g).done(function(a){r(c,f,400),C(a)}).fail(function(){r(c,f)})},y=function(a,b){var c=a.attr("class").match(/modtype_([^\s]*)/)[1],f=n(a);e.get_string("pluginname",c).done(function(a){var c={type:a,name:f};e.get_strings([{key:"confirm"},{key:null===f?"deletechecktype":"deletechecktypename",param:c},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],b)})})},z=function(a,b){e.get_strings([{key:"confirm"},{key:"yes"},{key:"no"}]).done(function(c){d.confirm(c[0],a,c[1],c[2],b)})},A=function(a,b,f,g,h,i,j){var k=[{key:f,component:g}];return e.get_strings(k).then(function(d){return a.find("span.menu-action-text").html(d[0]),c.renderPix(b,"core")}).then(function(b){a.find(".icon").replaceWith(b),a.attr("data-action",j)})["catch"](d.exception)},B=function(b,c,d,e){var f=c.attr("data-action");if("hide"===f||"show"===f){if("hide"===f?(b.addClass("hidden"),A(c,"i/show","showfromothers","format_"+e,null,null,"show")):(b.removeClass("hidden"),A(c,"i/hide","hidefromothers","format_"+e,null,null,"hide")),void 0!==d.modules)for(var g in d.modules)C(d.modules[g]);void 0!==d.section_availability&&b.find(".section_availability").first().replaceWith(d.section_availability)}else if("setmarker"===f){var h=a(l.SECTIONLI+".current"),i=h.find(l.SECTIONACTIONMENU+" a[data-action=removemarker]");h.removeClass("current"),A(i,"i/marker","highlight","core","markthistopic","core","setmarker"),b.addClass("current"),A(c,"i/marked","highlightoff","core","markedthistopic","core","removemarker")}else"removemarker"===f&&(b.removeClass("current"),A(c,"i/marker","highlight","core","markthistopic","core","setmarker"))},C=function(b){a("
        "+b+"
        ").find(l.ACTIVITYLI).each(function(){var c=a(this).attr("id");a(l.ACTIVITYLI+"#"+c).replaceWith(b),t(c)})},D=function(c,e,f,g){var h=f.attr("data-action"),i=f.attr("data-sectionreturn")?f.attr("data-sectionreturn"):0,j=p(c),k=b.call([{methodname:"core_course_edit_section",args:{id:e,action:h,sectionreturn:i}}],!0),m=q(c);a.when.apply(a,k).done(function(b){var d=a.parseJSON(b);r(c,j),s(m),c.find(l.SECTIONACTIONMENU).find(l.TOGGLE).focus();var e=a.Event("coursesectionedited",{ajaxreturn:d,action:h});c.trigger(e),e.isDefaultPrevented()||B(c,f,d,g)}).fail(function(b){r(c,j),s(m);var e=a.Event("coursesectioneditfailed",{exception:b,action:h});c.trigger(e),e.isDefaultPrevented()||d.exception(b)})};return g.use("moodle-course-coursebase",function(){M.course.coursebase.register_module({set_visibility_resource_ui:function(b){var c=a(b.element.getDOMNode()),d=m(c);if(d){var e=c.find("."+k.EDITINGMOVE).attr("data-sectionreturn");x(c,d,e)}}})}),{initCoursePage:function(b){a("body").on("click keypress",l.ACTIVITYLI+" "+l.ACTIVITYACTION+"[data-action]",function(b){if("keypress"!==b.type||13===b.keyCode){var c=a(this),d=c.closest(l.ACTIVITYLI),e=c.attr("data-action"),f=m(d);switch(e){case"moveleft":case"moveright":case"delete":case"duplicate":case"hide":case"stealth":case"show":case"groupsseparate":case"groupsvisible":case"groupsnone":break;default:return}f&&(b.preventDefault(),"delete"===e?y(d,function(){w(d,f,c)}):w(d,f,c))}}),a("body").on("click keypress",l.SECTIONLI+" "+l.SECTIONACTIONMENU+"[data-sectionid] a[data-action]",function(c){if("keypress"!==c.type||13===c.keyCode){var d=a(this),e=d.closest(l.SECTIONLI),f=d.closest(l.SECTIONACTIONMENU).attr("data-sectionid");c.preventDefault(),d.attr("data-confirm")?z(d.attr("data-confirm"),function(){D(e,f,d,b)}):D(e,f,d,b)}}),e.get_string("numberweeks").done(function(b){var c=a(l.ADDSECTIONS),d=c.attr("data-add-sections"),e=c.attr("new-sections"),f=a('
        ');f.find("label").html(b),h.create({title:d,type:h.types.SAVE_CANCEL,body:f.html()},c).done(function(b){var e=a(b.getBody()).find("#add_section_numsections"),f=function(){""+parseInt(e.val())===e.val()&&parseInt(e.val())>=1&&(document.location=c.attr("href")+"&numsections="+parseInt(e.val()))};b.setSaveButtonText(d),b.getRoot().on(i.shown,function(){e.focus().select().on("keydown",function(a){a.keyCode===j.enter&&f()})}),b.getRoot().on(i.save,function(a){a.preventDefault(),f()})})})},replaceSectionActionItem:function(a,b,c,d,e,f,g,h){var i=a.find(l.SECTIONACTIONMENU+" "+b);A(i,c,d,e,f,g,h)}}}); \ No newline at end of file +define ("core_course/actions",["jquery","core/ajax","core/templates","core/notification","core/str","core/url","core/yui","core/modal_factory","core/modal_events","core/key_codes"],function(a,b,c,d,e,f,g,h,i,j){var k={EDITINPROGRESS:"editinprogress",SECTIONDRAGGABLE:"sectiondraggable",EDITINGMOVE:"editing_move"},l={ACTIVITYLI:"li.activity",ACTIONAREA:".actions",ACTIVITYACTION:"a.cm-edit-action",MENU:".moodle-actionmenu[data-enhance=moodle-core-actionmenu]",TOGGLE:".toggle-display,.dropdown-toggle",SECTIONLI:"li.section",SECTIONACTIONMENU:".section_action_menu",ADDSECTIONS:"#changenumsections [data-add-sections]"};g.use("moodle-course-coursebase",function(){var a=M.course.format.get_section_selector();if(a){l.SECTIONLI=a}});var m=function(a){var b;g.use("moodle-course-util",function(c){b=c.Moodle.core_course.util.cm.getId(c.Node(a.get(0)))});return b},n=function(a){var b;g.use("moodle-course-util",function(c){b=c.Moodle.core_course.util.cm.getName(c.Node(a.get(0)))});return b},o=function(a){a.addClass(k.EDITINPROGRESS);var b=a.find(l.ACTIONAREA).get(0);if(b){var c=M.util.add_spinner(g,g.Node(b));c.show();return c}return null},p=function(a){a.addClass(k.EDITINPROGRESS);var b=a.find(l.SECTIONACTIONMENU).get(0);if(b){var c=M.util.add_spinner(g,g.Node(b));c.show();return c}return null},q=function(a){var b=M.util.add_lightbox(g,g.Node(a.get(0)));b.show();return b},r=function(a,b,c){window.setTimeout(function(){a.removeClass(k.EDITINPROGRESS);if(b){b.hide()}},c)},s=function(a,b){if(a){window.setTimeout(function(){a.hide()},b)}},t=function(a){g.use("moodle-course-coursebase",function(){M.course.coursebase.invoke_function("setup_for_resource","#"+a)});if(M.core.actionmenu&&M.core.actionmenu.newDOMNode){M.core.actionmenu.newDOMNode(g.one("#"+a))}},u=function(b,c){var d=a("#"+b),e="[data-action="+c+"]";if("groupsseparate"===c||"groupsvisible"===c||"groupsnone"===c){e="[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]"}if(d.find(e).is(":visible")){d.find(e).focus()}else{d.find(l.MENU).find(l.TOGGLE).focus()}},v=function(b){var c=a("a:visible"),d=!1,e=null;c.each(function(){if(a.contains(b[0],this)){d=!0}else if(d){e=this;return!1}});return e},w=function(c,e,f){var g=f.attr("data-action"),h=o(c),i=b.call([{methodname:"core_course_edit_module",args:{id:e,action:g,sectionreturn:f.attr("data-sectionreturn")?f.attr("data-sectionreturn"):0}}],!0),j;if("duplicate"===g){j=q(f.closest(l.SECTIONLI))}a.when.apply(a,i).done(function(b){var d=v(c);c.replaceWith(b);a("
        "+b+"
        ").find(l.ACTIVITYLI).each(function(b){t(a(this).attr("id"));if(0===b){u(a(this).attr("id"),g);d=null}});if(d){d.focus()}r(c,h,400);s(j,400);c.trigger(a.Event("coursemoduleedited",{ajaxreturn:b,action:g}))}).fail(function(b){r(c,h);s(j);var f=a.Event("coursemoduleeditfailed",{exception:b,action:g});c.trigger(f);if(!f.isDefaultPrevented()){d.exception(b)}})},x=function(c,d,e){var f=o(c),g=b.call([{methodname:"core_course_get_module",args:{id:d,sectionreturn:e}}],!0);a.when.apply(a,g).done(function(a){r(c,f,400);C(a)}).fail(function(){r(c,f)})},y=function(a,b){var c=a.attr("class").match(/modtype_([^\s]*)/)[1],f=n(a);e.get_string("pluginname",c).done(function(a){e.get_strings([{key:"confirm"},{key:null===f?"deletechecktype":"deletechecktypename",param:{type:a,name:f}},{key:"yes"},{key:"no"}]).done(function(a){d.confirm(a[0],a[1],a[2],a[3],b)})})},z=function(a,b){e.get_strings([{key:"confirm"},{key:"yes"},{key:"no"}]).done(function(c){d.confirm(c[0],a,c[1],c[2],b)})},A=function(a,b,f,g,h,i,j){return e.get_strings([{key:f,component:g}]).then(function(d){a.find("span.menu-action-text").html(d[0]);return c.renderPix(b,"core")}).then(function(b){a.find(".icon").replaceWith(b);a.attr("data-action",j)}).catch(d.exception)},B=function(b,c,d,e){var f=c.attr("data-action");if("hide"===f||"show"===f){if("hide"===f){b.addClass("hidden");A(c,"i/show","showfromothers","format_"+e,null,null,"show")}else{b.removeClass("hidden");A(c,"i/hide","hidefromothers","format_"+e,null,null,"hide")}if(d.modules!==void 0){for(var g in d.modules){C(d.modules[g])}}if(d.section_availability!==void 0){b.find(".section_availability").first().replaceWith(d.section_availability)}}else if("setmarker"===f){var h=a(l.SECTIONLI+".current"),i=h.find(l.SECTIONACTIONMENU+" a[data-action=removemarker]");h.removeClass("current");A(i,"i/marker","highlight","core","markthistopic","core","setmarker");b.addClass("current");A(c,"i/marked","highlightoff","core","markedthistopic","core","removemarker")}else if("removemarker"===f){b.removeClass("current");A(c,"i/marker","highlight","core","markthistopic","core","setmarker")}},C=function(b){a("
        "+b+"
        ").find(l.ACTIVITYLI).each(function(){var c=a(this).attr("id");a(l.ACTIVITYLI+"#"+c).replaceWith(b);t(c)})},D=function(c,e,f,g){var h=f.attr("data-action"),i=f.attr("data-sectionreturn")?f.attr("data-sectionreturn"):0,j=p(c),k=b.call([{methodname:"core_course_edit_section",args:{id:e,action:h,sectionreturn:i}}],!0),m=q(c);a.when.apply(a,k).done(function(b){var d=a.parseJSON(b);r(c,j);s(m);c.find(l.SECTIONACTIONMENU).find(l.TOGGLE).focus();var i=a.Event("coursesectionedited",{ajaxreturn:d,action:h});c.trigger(i);if(!i.isDefaultPrevented()){B(c,f,d,g)}}).fail(function(b){r(c,j);s(m);var f=a.Event("coursesectioneditfailed",{exception:b,action:h});c.trigger(f);if(!f.isDefaultPrevented()){d.exception(b)}})};g.use("moodle-course-coursebase",function(){M.course.coursebase.register_module({set_visibility_resource_ui:function set_visibility_resource_ui(b){var c=a(b.element.getDOMNode()),d=m(c);if(d){var e=c.find("."+k.EDITINGMOVE).attr("data-sectionreturn");x(c,d,e)}}})});return{initCoursePage:function initCoursePage(b){a("body").on("click keypress",l.ACTIVITYLI+" "+l.ACTIVITYACTION+"[data-action]",function(b){if("keypress"===b.type&&13!==b.keyCode){return}var c=a(this),d=c.closest(l.ACTIVITYLI),e=c.attr("data-action"),f=m(d);switch(e){case"moveleft":case"moveright":case"delete":case"duplicate":case"hide":case"stealth":case"show":case"groupsseparate":case"groupsvisible":case"groupsnone":break;default:return;}if(!f){return}b.preventDefault();if("delete"===e){y(d,function(){w(d,f,c)})}else{w(d,f,c)}});a("body").on("click keypress",l.SECTIONLI+" "+l.SECTIONACTIONMENU+"[data-sectionid] a[data-action]",function(c){if("keypress"===c.type&&13!==c.keyCode){return}var d=a(this),e=d.closest(l.SECTIONLI),f=d.closest(l.SECTIONACTIONMENU).attr("data-sectionid");c.preventDefault();if(d.attr("data-confirm")){z(d.attr("data-confirm"),function(){D(e,f,d,b)})}else{D(e,f,d,b)}});e.get_string("numberweeks").done(function(b){var c=a(l.ADDSECTIONS),d=c.attr("data-add-sections"),e=c.attr("new-sections"),f=a("
        ");f.find("label").html(b);h.create({title:d,type:h.types.SAVE_CANCEL,body:f.html()},c).done(function(b){var e=a(b.getBody()).find("#add_section_numsections"),f=function(){if(""+parseInt(e.val())===e.val()&&1<=parseInt(e.val())){document.location=c.attr("href")+"&numsections="+parseInt(e.val())}};b.setSaveButtonText(d);b.getRoot().on(i.shown,function(){e.focus().select().on("keydown",function(a){if(a.keyCode===j.enter){f()}})});b.getRoot().on(i.save,function(a){a.preventDefault();f()})})})},replaceSectionActionItem:function replaceSectionActionItem(a,b,c,d,e,f,g,h){var i=a.find(l.SECTIONACTIONMENU+" "+b);A(i,c,d,e,f,g,h)}}}); +//# sourceMappingURL=actions.min.js.map diff --git a/course/amd/build/actions.min.js.map b/course/amd/build/actions.min.js.map new file mode 100644 index 0000000000000..d16a62f6c4568 --- /dev/null +++ b/course/amd/build/actions.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/actions.js"],"names":["define","$","ajax","templates","notification","str","url","Y","ModalFactory","ModalEvents","KeyCodes","CSS","EDITINPROGRESS","SECTIONDRAGGABLE","EDITINGMOVE","SELECTOR","ACTIVITYLI","ACTIONAREA","ACTIVITYACTION","MENU","TOGGLE","SECTIONLI","SECTIONACTIONMENU","ADDSECTIONS","use","courseformatselector","M","course","format","get_section_selector","getModuleId","element","id","Moodle","core_course","util","cm","getId","Node","get","getModuleName","name","getName","addActivitySpinner","activity","addClass","actionarea","find","spinner","add_spinner","show","addSectionSpinner","sectionelement","addSectionLightbox","lightbox","add_lightbox","removeSpinner","delay","window","setTimeout","removeClass","hide","removeLightbox","initActionMenu","elementid","coursebase","invoke_function","core","actionmenu","newDOMNode","one","focusActionItem","elementId","action","mainelement","selector","is","focus","findNextFocusable","mainElement","tabables","isInside","foundElement","each","contains","editModule","moduleElement","cmid","target","attr","promises","call","methodname","args","sectionreturn","closest","when","apply","done","data","elementToFocus","replaceWith","index","trigger","Event","ajaxreturn","fail","ex","e","exception","isDefaultPrevented","refreshModule","activityElement","replaceActivityHtmlWith","confirmDeleteModule","onconfirm","modtypename","match","modulename","get_string","pluginname","get_strings","key","param","type","s","confirm","confirmEditSection","message","replaceActionItem","actionitem","image","stringname","stringcomponent","titlestr","titlecomponent","newaction","component","then","strings","html","renderPix","pixhtml","catch","defaultEditSectionHandler","sectionElement","actionItem","courseformat","modules","i","section_availability","first","oldmarker","oldActionItem","activityHTML","editSection","sectionid","dataencoded","parseJSON","register_module","set_visibility_resource_ui","getDOMNode","initCoursePage","on","keyCode","moduleId","preventDefault","sectionId","strNumberSections","modalTitle","newSections","modalBody","create","title","types","SAVE_CANCEL","body","modal","numSections","getBody","addSections","parseInt","val","document","location","setSaveButtonText","getRoot","shown","select","enter","save","replaceSectionActionItem"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Various actions on modules and sections in the editing mode - hiding, duplicating, deleting, etc.\n *\n * @module core_course/actions\n * @package core\n * @copyright 2016 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.3\n */\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/url', 'core/yui',\n 'core/modal_factory', 'core/modal_events', 'core/key_codes'],\n function($, ajax, templates, notification, str, url, Y, ModalFactory, ModalEvents, KeyCodes) {\n var CSS = {\n EDITINPROGRESS: 'editinprogress',\n SECTIONDRAGGABLE: 'sectiondraggable',\n EDITINGMOVE: 'editing_move'\n };\n var SELECTOR = {\n ACTIVITYLI: 'li.activity',\n ACTIONAREA: '.actions',\n ACTIVITYACTION: 'a.cm-edit-action',\n MENU: '.moodle-actionmenu[data-enhance=moodle-core-actionmenu]',\n TOGGLE: '.toggle-display,.dropdown-toggle',\n SECTIONLI: 'li.section',\n SECTIONACTIONMENU: '.section_action_menu',\n ADDSECTIONS: '#changenumsections [data-add-sections]'\n };\n\n Y.use('moodle-course-coursebase', function() {\n var courseformatselector = M.course.format.get_section_selector();\n if (courseformatselector) {\n SELECTOR.SECTIONLI = courseformatselector;\n }\n });\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getId\n *\n * @param {JQuery} element\n * @returns {Integer}\n */\n var getModuleId = function(element) {\n var id;\n Y.use('moodle-course-util', function(Y) {\n id = Y.Moodle.core_course.util.cm.getId(Y.Node(element.get(0)));\n });\n return id;\n };\n\n /**\n * Wrapper for Y.Moodle.core_course.util.cm.getName\n *\n * @param {JQuery} element\n * @returns {String}\n */\n var getModuleName = function(element) {\n var name;\n Y.use('moodle-course-util', function(Y) {\n name = Y.Moodle.core_course.util.cm.getName(Y.Node(element.get(0)));\n });\n return name;\n };\n\n /**\n * Wrapper for M.util.add_spinner for an activity\n *\n * @param {JQuery} activity\n * @returns {Node}\n */\n var addActivitySpinner = function(activity) {\n activity.addClass(CSS.EDITINPROGRESS);\n var actionarea = activity.find(SELECTOR.ACTIONAREA).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_spinner for a section\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionSpinner = function(sectionelement) {\n sectionelement.addClass(CSS.EDITINPROGRESS);\n var actionarea = sectionelement.find(SELECTOR.SECTIONACTIONMENU).get(0);\n if (actionarea) {\n var spinner = M.util.add_spinner(Y, Y.Node(actionarea));\n spinner.show();\n return spinner;\n }\n return null;\n };\n\n /**\n * Wrapper for M.util.add_lightbox\n *\n * @param {JQuery} sectionelement\n * @returns {Node}\n */\n var addSectionLightbox = function(sectionelement) {\n var lightbox = M.util.add_lightbox(Y, Y.Node(sectionelement.get(0)));\n lightbox.show();\n return lightbox;\n };\n\n /**\n * Removes the spinner element\n *\n * @param {JQuery} element\n * @param {Node} spinner\n * @param {Number} delay\n */\n var removeSpinner = function(element, spinner, delay) {\n window.setTimeout(function() {\n element.removeClass(CSS.EDITINPROGRESS);\n if (spinner) {\n spinner.hide();\n }\n }, delay);\n };\n\n /**\n * Removes the lightbox element\n *\n * @param {Node} lightbox lighbox YUI element returned by addSectionLightbox\n * @param {Number} delay\n */\n var removeLightbox = function(lightbox, delay) {\n if (lightbox) {\n window.setTimeout(function() {\n lightbox.hide();\n }, delay);\n }\n };\n\n /**\n * Initialise action menu for the element (section or module)\n *\n * @param {String} elementid CSS id attribute of the element\n */\n var initActionMenu = function(elementid) {\n // Initialise action menu in the new activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.invoke_function('setup_for_resource', '#' + elementid);\n });\n if (M.core.actionmenu && M.core.actionmenu.newDOMNode) {\n M.core.actionmenu.newDOMNode(Y.one('#' + elementid));\n }\n };\n\n /**\n * Returns focus to the element that was clicked or \"Edit\" link if element is no longer visible.\n *\n * @param {String} elementId CSS id attribute of the element\n * @param {String} action data-action property of the element that was clicked\n */\n var focusActionItem = function(elementId, action) {\n var mainelement = $('#' + elementId);\n var selector = '[data-action=' + action + ']';\n if (action === 'groupsseparate' || action === 'groupsvisible' || action === 'groupsnone') {\n // New element will have different data-action.\n selector = '[data-action=groupsseparate],[data-action=groupsvisible],[data-action=groupsnone]';\n }\n if (mainelement.find(selector).is(':visible')) {\n mainelement.find(selector).focus();\n } else {\n // Element not visible, focus the \"Edit\" link.\n mainelement.find(SELECTOR.MENU).find(SELECTOR.TOGGLE).focus();\n }\n };\n\n /**\n * Find next after the element\n *\n * @param {JQuery} mainElement element that is about to be deleted\n * @returns {JQuery}\n */\n var findNextFocusable = function(mainElement) {\n var tabables = $(\"a:visible\");\n var isInside = false;\n var foundElement = null;\n tabables.each(function() {\n if ($.contains(mainElement[0], this)) {\n isInside = true;\n } else if (isInside) {\n foundElement = this;\n return false; // Returning false in .each() is equivalent to \"break;\" inside the loop in php.\n }\n });\n return foundElement;\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} moduleElement activity element we perform action on\n * @param {Number} cmid\n * @param {JQuery} target the element (menu item) that was clicked\n */\n var editModule = function(moduleElement, cmid, target) {\n var action = target.attr('data-action');\n var spinner = addActivitySpinner(moduleElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_module',\n args: {id: cmid,\n action: action,\n sectionreturn: target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0\n }\n }], true);\n\n var lightbox;\n if (action === 'duplicate') {\n lightbox = addSectionLightbox(target.closest(SELECTOR.SECTIONLI));\n }\n $.when.apply($, promises)\n .done(function(data) {\n var elementToFocus = findNextFocusable(moduleElement);\n moduleElement.replaceWith(data);\n // Initialise action menu for activity(ies) added as a result of this.\n $('
        ' + data + '
        ').find(SELECTOR.ACTIVITYLI).each(function(index) {\n initActionMenu($(this).attr('id'));\n if (index === 0) {\n focusActionItem($(this).attr('id'), action);\n elementToFocus = null;\n }\n });\n // In case of activity deletion focus the next focusable element.\n if (elementToFocus) {\n elementToFocus.focus();\n }\n // Remove spinner and lightbox with a delay.\n removeSpinner(moduleElement, spinner, 400);\n removeLightbox(lightbox, 400);\n // Trigger event that can be observed by course formats.\n moduleElement.trigger($.Event('coursemoduleedited', {ajaxreturn: data, action: action}));\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(moduleElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursemoduleeditfailed', {exception: ex, action: action});\n moduleElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n /**\n * Requests html for the module via WS core_course_get_module and updates the module on the course page\n *\n * Used after d&d of the module to another section\n *\n * @param {JQuery} activityElement\n * @param {Number} cmid\n * @param {Number} sectionreturn\n */\n var refreshModule = function(activityElement, cmid, sectionreturn) {\n var spinner = addActivitySpinner(activityElement);\n var promises = ajax.call([{\n methodname: 'core_course_get_module',\n args: {id: cmid, sectionreturn: sectionreturn}\n }], true);\n\n $.when.apply($, promises)\n .done(function(data) {\n removeSpinner(activityElement, spinner, 400);\n replaceActivityHtmlWith(data);\n }).fail(function() {\n removeSpinner(activityElement, spinner);\n });\n };\n\n /**\n * Displays the delete confirmation to delete a module\n *\n * @param {JQuery} mainelement activity element we perform action on\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmDeleteModule = function(mainelement, onconfirm) {\n var modtypename = mainelement.attr('class').match(/modtype_([^\\s]*)/)[1];\n var modulename = getModuleName(mainelement);\n\n str.get_string('pluginname', modtypename).done(function(pluginname) {\n var plugindata = {\n type: pluginname,\n name: modulename\n };\n str.get_strings([\n {key: 'confirm'},\n {key: modulename === null ? 'deletechecktype' : 'deletechecktypename', param: plugindata},\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], s[1], s[2], s[3], onconfirm);\n }\n );\n });\n };\n\n /**\n * Displays the delete confirmation to delete a section\n *\n * @param {String} message confirmation message\n * @param {function} onconfirm function to execute on confirm\n */\n var confirmEditSection = function(message, onconfirm) {\n str.get_strings([\n {key: 'confirm'}, // TODO link text\n {key: 'yes'},\n {key: 'no'}\n ]).done(function(s) {\n notification.confirm(s[0], message, s[1], s[2], onconfirm);\n }\n );\n };\n\n /**\n * Replaces an action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * @param {JQuery} actionitem\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} titlestr not used\n * @param {String} titlecomponent not used\n * @param {String} newaction new value for data-action attribute of the link\n * @return {Promise} promise which is resolved when the replacement has completed\n */\n var replaceActionItem = function(actionitem, image, stringname,\n stringcomponent, titlestr, titlecomponent, newaction) {\n\n var stringRequests = [{key: stringname, component: stringcomponent}];\n // Do not provide an icon with duplicate, different text to the menu item.\n\n return str.get_strings(stringRequests).then(function(strings) {\n actionitem.find('span.menu-action-text').html(strings[0]);\n\n return templates.renderPix(image, 'core');\n }).then(function(pixhtml) {\n actionitem.find('.icon').replaceWith(pixhtml);\n actionitem.attr('data-action', newaction);\n return;\n }).catch(notification.exception);\n };\n\n /**\n * Default post-processing for section AJAX edit actions.\n *\n * This can be overridden in course formats by listening to event coursesectionedited:\n *\n * $('body').on('coursesectionedited', 'li.section', function(e) {\n * var action = e.action,\n * sectionElement = $(e.target),\n * data = e.ajaxreturn;\n * // ... Do some processing here.\n * e.preventDefault(); // Prevent default handler.\n * });\n *\n * @param {JQuery} sectionElement\n * @param {JQuery} actionItem\n * @param {Object} data\n * @param {String} courseformat\n */\n var defaultEditSectionHandler = function(sectionElement, actionItem, data, courseformat) {\n var action = actionItem.attr('data-action');\n if (action === 'hide' || action === 'show') {\n if (action === 'hide') {\n sectionElement.addClass('hidden');\n replaceActionItem(actionItem, 'i/show',\n 'showfromothers', 'format_' + courseformat, null, null, 'show');\n } else {\n sectionElement.removeClass('hidden');\n replaceActionItem(actionItem, 'i/hide',\n 'hidefromothers', 'format_' + courseformat, null, null, 'hide');\n }\n // Replace the modules with new html (that indicates that they are now hidden or not hidden).\n if (data.modules !== undefined) {\n for (var i in data.modules) {\n replaceActivityHtmlWith(data.modules[i]);\n }\n }\n // Replace the section availability information.\n if (data.section_availability !== undefined) {\n sectionElement.find('.section_availability').first().replaceWith(data.section_availability);\n }\n } else if (action === 'setmarker') {\n var oldmarker = $(SELECTOR.SECTIONLI + '.current'),\n oldActionItem = oldmarker.find(SELECTOR.SECTIONACTIONMENU + ' ' + 'a[data-action=removemarker]');\n oldmarker.removeClass('current');\n replaceActionItem(oldActionItem, 'i/marker',\n 'highlight', 'core', 'markthistopic', 'core', 'setmarker');\n sectionElement.addClass('current');\n replaceActionItem(actionItem, 'i/marked',\n 'highlightoff', 'core', 'markedthistopic', 'core', 'removemarker');\n } else if (action === 'removemarker') {\n sectionElement.removeClass('current');\n replaceActionItem(actionItem, 'i/marker',\n 'highlight', 'core', 'markthistopic', 'core', 'setmarker');\n }\n };\n\n /**\n * Replaces the course module with the new html (used to update module after it was edited or its visibility was changed).\n *\n * @param {String} activityHTML\n */\n var replaceActivityHtmlWith = function(activityHTML) {\n $('
        ' + activityHTML + '
        ').find(SELECTOR.ACTIVITYLI).each(function() {\n // Extract id from the new activity html.\n var id = $(this).attr('id');\n // Find the existing element with the same id and replace its contents with new html.\n $(SELECTOR.ACTIVITYLI + '#' + id).replaceWith(activityHTML);\n // Initialise action menu.\n initActionMenu(id);\n });\n };\n\n /**\n * Performs an action on a module (moving, deleting, duplicating, hiding, etc.)\n *\n * @param {JQuery} sectionElement section element we perform action on\n * @param {Nunmber} sectionid\n * @param {JQuery} target the element (menu item) that was clicked\n * @param {String} courseformat\n */\n var editSection = function(sectionElement, sectionid, target, courseformat) {\n var action = target.attr('data-action'),\n sectionreturn = target.attr('data-sectionreturn') ? target.attr('data-sectionreturn') : 0;\n var spinner = addSectionSpinner(sectionElement);\n var promises = ajax.call([{\n methodname: 'core_course_edit_section',\n args: {id: sectionid, action: action, sectionreturn: sectionreturn}\n }], true);\n\n var lightbox = addSectionLightbox(sectionElement);\n $.when.apply($, promises)\n .done(function(dataencoded) {\n var data = $.parseJSON(dataencoded);\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n sectionElement.find(SELECTOR.SECTIONACTIONMENU).find(SELECTOR.TOGGLE).focus();\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectionedited', {ajaxreturn: data, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n defaultEditSectionHandler(sectionElement, target, data, courseformat);\n }\n }).fail(function(ex) {\n // Remove spinner and lightbox.\n removeSpinner(sectionElement, spinner);\n removeLightbox(lightbox);\n // Trigger event that can be observed by course formats.\n var e = $.Event('coursesectioneditfailed', {exception: ex, action: action});\n sectionElement.trigger(e);\n if (!e.isDefaultPrevented()) {\n notification.exception(ex);\n }\n });\n };\n\n // Register a function to be executed after D&D of an activity.\n Y.use('moodle-course-coursebase', function() {\n M.course.coursebase.register_module({\n // Ignore camelcase eslint rule for the next line because it is an expected name of the callback.\n // eslint-disable-next-line camelcase\n set_visibility_resource_ui: function(args) {\n var mainelement = $(args.element.getDOMNode());\n var cmid = getModuleId(mainelement);\n if (cmid) {\n var sectionreturn = mainelement.find('.' + CSS.EDITINGMOVE).attr('data-sectionreturn');\n refreshModule(mainelement, cmid, sectionreturn);\n }\n }\n });\n });\n\n return /** @alias module:core_course/actions */ {\n\n /**\n * Initialises course page\n *\n * @method init\n * @param {String} courseformat name of the current course format (for fetching strings)\n */\n initCoursePage: function(courseformat) {\n\n // Add a handler for course module actions.\n $('body').on('click keypress', SELECTOR.ACTIVITYLI + ' ' +\n SELECTOR.ACTIVITYACTION + '[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n moduleElement = actionItem.closest(SELECTOR.ACTIVITYLI),\n action = actionItem.attr('data-action'),\n moduleId = getModuleId(moduleElement);\n switch (action) {\n case 'moveleft':\n case 'moveright':\n case 'delete':\n case 'duplicate':\n case 'hide':\n case 'stealth':\n case 'show':\n case 'groupsseparate':\n case 'groupsvisible':\n case 'groupsnone':\n break;\n default:\n // Nothing to do here!\n return;\n }\n if (!moduleId) {\n return;\n }\n e.preventDefault();\n if (action === 'delete') {\n // Deleting requires confirmation.\n confirmDeleteModule(moduleElement, function() {\n editModule(moduleElement, moduleId, actionItem);\n });\n } else {\n editModule(moduleElement, moduleId, actionItem);\n }\n });\n\n // Add a handler for section show/hide actions.\n $('body').on('click keypress', SELECTOR.SECTIONLI + ' ' +\n SELECTOR.SECTIONACTIONMENU + '[data-sectionid] ' +\n 'a[data-action]', function(e) {\n if (e.type === 'keypress' && e.keyCode !== 13) {\n return;\n }\n var actionItem = $(this),\n sectionElement = actionItem.closest(SELECTOR.SECTIONLI),\n sectionId = actionItem.closest(SELECTOR.SECTIONACTIONMENU).attr('data-sectionid');\n e.preventDefault();\n if (actionItem.attr('data-confirm')) {\n // Action requires confirmation.\n confirmEditSection(actionItem.attr('data-confirm'), function() {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n });\n } else {\n editSection(sectionElement, sectionId, actionItem, courseformat);\n }\n });\n\n // Add a handler for \"Add sections\" link to ask for a number of sections to add.\n str.get_string('numberweeks').done(function(strNumberSections) {\n var trigger = $(SELECTOR.ADDSECTIONS),\n modalTitle = trigger.attr('data-add-sections'),\n newSections = trigger.attr('new-sections');\n var modalBody = $('
        ' +\n '
        ');\n modalBody.find('label').html(strNumberSections);\n ModalFactory.create({\n title: modalTitle,\n type: ModalFactory.types.SAVE_CANCEL,\n body: modalBody.html()\n }, trigger)\n .done(function(modal) {\n var numSections = $(modal.getBody()).find('#add_section_numsections'),\n addSections = function() {\n // Check if value of the \"Number of sections\" is a valid positive integer and redirect\n // to adding a section script.\n if ('' + parseInt(numSections.val()) === numSections.val() && parseInt(numSections.val()) >= 1) {\n document.location = trigger.attr('href') + '&numsections=' + parseInt(numSections.val());\n }\n };\n modal.setSaveButtonText(modalTitle);\n modal.getRoot().on(ModalEvents.shown, function() {\n // When modal is shown focus and select the input and add a listener to keypress of \"Enter\".\n numSections.focus().select().on('keydown', function(e) {\n if (e.keyCode === KeyCodes.enter) {\n addSections();\n }\n });\n });\n modal.getRoot().on(ModalEvents.save, function(e) {\n // When modal \"Add\" button is pressed.\n e.preventDefault();\n addSections();\n });\n });\n });\n },\n\n /**\n * Replaces a section action menu item with another one (for example Show->Hide, Set marker->Remove marker)\n *\n * This method can be used by course formats in their listener to the coursesectionedited event\n *\n * @param {JQuery} sectionelement\n * @param {String} selector CSS selector inside the section element, for example \"a[data-action=show]\"\n * @param {String} image new image name (\"i/show\", \"i/hide\", etc.)\n * @param {String} stringname new string for the action menu item\n * @param {String} stringcomponent\n * @param {String} titlestr string for \"title\" attribute (if different from stringname)\n * @param {String} titlecomponent\n * @param {String} newaction new value for data-action attribute of the link\n */\n replaceSectionActionItem: function(sectionelement, selector, image, stringname,\n stringcomponent, titlestr, titlecomponent, newaction) {\n var actionitem = sectionelement.find(SELECTOR.SECTIONACTIONMENU + ' ' + selector);\n replaceActionItem(actionitem, image, stringname, stringcomponent, titlestr, titlecomponent, newaction);\n }\n };\n });\n"],"file":"actions.min.js"} \ No newline at end of file diff --git a/course/amd/build/events.min.js b/course/amd/build/events.min.js index 4ea5c9e3db4ac..1613e4265baee 100644 --- a/course/amd/build/events.min.js +++ b/course/amd/build/events.min.js @@ -1 +1,2 @@ -define([],function(){return{favourited:"core_course:favourited",unfavorited:"core_course:unfavorited"}}); \ No newline at end of file +define ("core_course/events",[],function(){return{favourited:"core_course:favourited",unfavorited:"core_course:unfavorited"}}); +//# sourceMappingURL=events.min.js.map diff --git a/course/amd/build/events.min.js.map b/course/amd/build/events.min.js.map new file mode 100644 index 0000000000000..e451fda7f3ba9 --- /dev/null +++ b/course/amd/build/events.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/events.js"],"names":["define","favourited","unfavorited"],"mappings":"AAuBAA,OAAM,sBAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,UAAU,CAAE,wBADT,CAEHC,WAAW,CAAE,yBAFV,CAIV,CALK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Contain the events the course component can trigger.\n *\n * @module core_course/events\n * @package core_course\n * @copyright 2018 Simey Lameze \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n favourited: 'core_course:favourited',\n unfavorited: 'core_course:unfavorited',\n };\n});"],"file":"events.min.js"} \ No newline at end of file diff --git a/course/amd/build/repository.min.js b/course/amd/build/repository.min.js index 5ea972f7cb2e7..4fc5fff0f1e53 100644 --- a/course/amd/build/repository.min.js +++ b/course/amd/build/repository.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax"],function(a,b){var c=function(a,c,d,e){var f={classification:a};"undefined"!=typeof c&&(f.limit=c),"undefined"!=typeof d&&(f.offset=d),"undefined"!=typeof e&&(f.sort=e);var g={methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:f};return b.call([g])[0]},d=function(a,c,d,e){var f={};"undefined"!=typeof a&&(f.limit=c),"undefined"!=typeof c&&(f.limit=c),"undefined"!=typeof d&&(f.offset=d),"undefined"!=typeof e&&(f.sort=e);var g={methodname:"core_course_get_recent_courses",args:f};return b.call([g])[0]};return{getEnrolledCoursesByTimelineClassification:c,getLastAccessedCourses:d}}); \ No newline at end of file +define ("core_course/repository",["jquery","core/ajax"],function(a,b){return{getEnrolledCoursesByTimelineClassification:function getEnrolledCoursesByTimelineClassification(a,c,d,e){var f={classification:a};if("undefined"!=typeof c){f.limit=c}if("undefined"!=typeof d){f.offset=d}if("undefined"!=typeof e){f.sort=e}return b.call([{methodname:"core_course_get_enrolled_courses_by_timeline_classification",args:f}])[0]},getLastAccessedCourses:function getLastAccessedCourses(a,c,d,e){var f={};if("undefined"!=typeof a){f.limit=c}if("undefined"!=typeof c){f.limit=c}if("undefined"!=typeof d){f.offset=d}if("undefined"!=typeof e){f.sort=e}return b.call([{methodname:"core_course_get_recent_courses",args:f}])[0]}}}); +//# sourceMappingURL=repository.min.js.map diff --git a/course/amd/build/repository.min.js.map b/course/amd/build/repository.min.js.map new file mode 100644 index 0000000000000..11f07a1294804 --- /dev/null +++ b/course/amd/build/repository.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/repository.js"],"names":["define","$","Ajax","getEnrolledCoursesByTimelineClassification","classification","limit","offset","sort","args","call","methodname","getLastAccessedCourses","userid"],"mappings":"AAsBAA,OAAM,0BAAC,CAAC,QAAD,CAAW,WAAX,CAAD,CAA0B,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CA0E9C,MAAO,CACHC,0CAA0C,CA/DG,QAA7CA,CAAAA,0CAA6C,CAASC,CAAT,CAAyBC,CAAzB,CAAgCC,CAAhC,CAAwCC,CAAxC,CAA8C,CAC3F,GAAIC,CAAAA,CAAI,CAAG,CACPJ,cAAc,CAAEA,CADT,CAAX,CAIA,GAAqB,WAAjB,QAAOC,CAAAA,CAAX,CAAkC,CAC9BG,CAAI,CAACH,KAAL,CAAaA,CAChB,CAED,GAAsB,WAAlB,QAAOC,CAAAA,CAAX,CAAmC,CAC/BE,CAAI,CAACF,MAAL,CAAcA,CACjB,CAED,GAAoB,WAAhB,QAAOC,CAAAA,CAAX,CAAiC,CAC7BC,CAAI,CAACD,IAAL,CAAYA,CACf,CAOD,MAAOL,CAAAA,CAAI,CAACO,IAAL,CAAU,CALH,CACVC,UAAU,CAAE,6DADF,CAEVF,IAAI,CAAEA,CAFI,CAKG,CAAV,EAAqB,CAArB,CACV,CAuCM,CAEHG,sBAAsB,CA7BG,QAAzBA,CAAAA,sBAAyB,CAASC,CAAT,CAAiBP,CAAjB,CAAwBC,CAAxB,CAAgCC,CAAhC,CAAsC,CAC/D,GAAIC,CAAAA,CAAI,CAAG,EAAX,CAEA,GAAsB,WAAlB,QAAOI,CAAAA,CAAX,CAAmC,CAC/BJ,CAAI,CAACH,KAAL,CAAaA,CAChB,CAED,GAAqB,WAAjB,QAAOA,CAAAA,CAAX,CAAkC,CAC9BG,CAAI,CAACH,KAAL,CAAaA,CAChB,CAED,GAAsB,WAAlB,QAAOC,CAAAA,CAAX,CAAmC,CAC/BE,CAAI,CAACF,MAAL,CAAcA,CACjB,CAED,GAAoB,WAAhB,QAAOC,CAAAA,CAAX,CAAiC,CAC7BC,CAAI,CAACD,IAAL,CAAYA,CACf,CAOD,MAAOL,CAAAA,CAAI,CAACO,IAAL,CAAU,CALH,CACVC,UAAU,CAAE,gCADF,CAEVF,IAAI,CAAEA,CAFI,CAKG,CAAV,EAAqB,CAArB,CACV,CAEM,CAIV,CA9EK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A javascript module to handle course ajax actions.\n *\n * @module core_course/repository\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n /**\n * Get the list of courses that the logged in user is enrolled in for a given\n * timeline classification.\n *\n * @param {string} classification past, inprogress, or future\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {object} jQuery promise resolved with courses.\n */\n var getEnrolledCoursesByTimelineClassification = function(classification, limit, offset, sort) {\n var args = {\n classification: classification\n };\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n var request = {\n methodname: 'core_course_get_enrolled_courses_by_timeline_classification',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n /**\n * Get the list of courses that the user has most recently accessed.\n *\n * @method getLastAccessedCourses\n * @param {int} userid User from which the courses will be obtained\n * @param {int} limit Only return this many results\n * @param {int} offset Skip this many results from the start of the result set\n * @param {string} sort Column to sort by and direction, e.g. 'shortname asc'\n * @return {promise} Resolved with an array of courses\n */\n var getLastAccessedCourses = function(userid, limit, offset, sort) {\n var args = {};\n\n if (typeof userid !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof limit !== 'undefined') {\n args.limit = limit;\n }\n\n if (typeof offset !== 'undefined') {\n args.offset = offset;\n }\n\n if (typeof sort !== 'undefined') {\n args.sort = sort;\n }\n\n var request = {\n methodname: 'core_course_get_recent_courses',\n args: args\n };\n\n return Ajax.call([request])[0];\n };\n\n return {\n getEnrolledCoursesByTimelineClassification: getEnrolledCoursesByTimelineClassification,\n getLastAccessedCourses: getLastAccessedCourses\n };\n});\n"],"file":"repository.min.js"} \ No newline at end of file diff --git a/customfield/amd/build/form.min.js b/customfield/amd/build/form.min.js index 472d4d4bcca59..84d91f9336bb3 100644 --- a/customfield/amd/build/form.min.js +++ b/customfield/amd/build/form.min.js @@ -1 +1,2 @@ -define(["jquery","core/str","core/notification","core/ajax","core/templates","core/sortable_list","core/inplace_editable"],function(a,b,c,d,e,f){var g=function(f,g,h,i,j){b.get_strings([{key:"confirm"},{key:"confirmdelete"+g,component:"core_customfield"},{key:"yes"},{key:"no"}]).done(function(b){c.confirm(b[0],b[1],b[2],b[3],function(){var b="field"===g?"core_customfield_delete_field":"core_customfield_delete_category";d.call([{methodname:b,args:{id:f}},{methodname:"core_customfield_reload_template",args:{component:h,area:i,itemid:j}}])[1].then(function(a){return e.render("core_customfield/list",a)}).then(function(b,c){return e.replaceNode(a('[data-region="list-page"]'),b,c),null}).fail(c.exception)})}).fail(c.exception)},h=function(b,f,g){var h,i=d.call([{methodname:"core_customfield_create_category",args:{component:b,area:f,itemid:g}},{methodname:"core_customfield_reload_template",args:{component:b,area:f,itemid:g}}]);i[0].then(function(a){return h=a,null}).fail(c.exception),i[1].then(function(a){return e.render("core_customfield/list",a)}).then(function(b,c){return e.replaceNode(a('[data-region="list-page"]'),b,c),window.location.href="#category-"+h,null}).fail(c.exception)};return{init:function(){var e=a("#customfield_catlist"),i=e.attr("data-component"),j=e.attr("data-area"),k=e.attr("data-itemid");a("[data-role=deletefield]").on("click",function(b){g(a(this).attr("data-id"),"field",i,j,k),b.preventDefault()}),a("[data-role=deletecategory]").on("click",function(b){g(a(this).attr("data-id"),"category",i,j,k),b.preventDefault()}),a("[data-role=addnewcategory]").on("click",function(){h(i,j,k)});var l=function(a){return a.closest("[data-category-id]").find("[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]").attr("data-value")},m=new f(a("#customfield_catlist .categorieslist"),{moveHandlerSelector:".movecategory [data-drag-type=move]"});m.getElementName=function(b){return a.Deferred().resolve(l(b))},a("[data-category-id]").on("sortablelist-drop",function(a,b){if(b.positionChanged){var e=d.call([{methodname:"core_customfield_move_category",args:{id:b.element.data("category-id"),beforeid:b.targetNextElement.data("category-id")}}]);e[0].fail(c.exception)}a.stopPropagation()});var n=new f(a("#customfield_catlist .fieldslist tbody"),{moveHandlerSelector:".movefield [data-drag-type=move]"});n.getDestinationName=function(c,d){return d.length?d.attr("data-field-name")?b.get_string("afterfield","customfield",d.attr("data-field-name")):a.Deferred().resolve(""):b.get_string("totopofcategory","customfield",l(c))},a("[data-field-name]").on("sortablelist-drop",function(a,b){if(a.stopPropagation(),b.positionChanged){var e=d.call([{methodname:"core_customfield_move_field",args:{id:b.element.data("field-id"),beforeid:b.targetNextElement.data("field-id"),categoryid:Number(b.targetList.closest("[data-category-id]").attr("data-category-id"))}}]);e[0].fail(c.exception)}}).on("sortablelist-drag",function(d){d.stopPropagation(),b.get_string("therearenofields","core_customfield").then(function(b){return a("#customfield_catlist .categorieslist").children().each(function(){var c=a(this).find(a(".field")),d=a(this).find(a(".nofields"));c.length||d.length||a(this).find("tbody").append(''+b+""),c.length&&d.length&&d.remove()}),null}).fail(c.exception)}),a("[data-category-id], [data-field-name]").on("sortablelist-dragstart",function(b,c){setTimeout(function(){a(".sortable-list-is-dragged").width(c.element.width())},501)})}}}); \ No newline at end of file +define ("core_customfield/form",["jquery","core/str","core/notification","core/ajax","core/templates","core/sortable_list","core/inplace_editable"],function(a,b,c,d,e,f){var g=function(f,g,h,i,j){b.get_strings([{key:"confirm"},{key:"confirmdelete"+g,component:"core_customfield"},{key:"yes"},{key:"no"}]).done(function(b){c.confirm(b[0],b[1],b[2],b[3],function(){var b="field"===g?"core_customfield_delete_field":"core_customfield_delete_category";d.call([{methodname:b,args:{id:f}},{methodname:"core_customfield_reload_template",args:{component:h,area:i,itemid:j}}])[1].then(function(a){return e.render("core_customfield/list",a)}).then(function(b,c){e.replaceNode(a("[data-region=\"list-page\"]"),b,c);return null}).fail(c.exception)})}).fail(c.exception)},h=function(b,f,g){var h=d.call([{methodname:"core_customfield_create_category",args:{component:b,area:f,itemid:g}},{methodname:"core_customfield_reload_template",args:{component:b,area:f,itemid:g}}]),i;h[0].then(function(a){i=a;return null}).fail(c.exception);h[1].then(function(a){return e.render("core_customfield/list",a)}).then(function(b,c){e.replaceNode(a("[data-region=\"list-page\"]"),b,c);window.location.href="#category-"+i;return null}).fail(c.exception)};return{init:function init(){var e=a("#customfield_catlist"),i=e.attr("data-component"),j=e.attr("data-area"),k=e.attr("data-itemid");a("[data-role=deletefield]").on("click",function(b){g(a(this).attr("data-id"),"field",i,j,k);b.preventDefault()});a("[data-role=deletecategory]").on("click",function(b){g(a(this).attr("data-id"),"category",i,j,k);b.preventDefault()});a("[data-role=addnewcategory]").on("click",function(){h(i,j,k)});var l=function(a){return a.closest("[data-category-id]").find("[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]").attr("data-value")},m=new f(a("#customfield_catlist .categorieslist"),{moveHandlerSelector:".movecategory [data-drag-type=move]"});m.getElementName=function(b){return a.Deferred().resolve(l(b))};a("[data-category-id]").on("sortablelist-drop",function(a,b){if(b.positionChanged){var e=d.call([{methodname:"core_customfield_move_category",args:{id:b.element.data("category-id"),beforeid:b.targetNextElement.data("category-id")}}]);e[0].fail(c.exception)}a.stopPropagation()});var n=new f(a("#customfield_catlist .fieldslist tbody"),{moveHandlerSelector:".movefield [data-drag-type=move]"});n.getDestinationName=function(c,d){if(!d.length){return b.get_string("totopofcategory","customfield",l(c))}else if(d.attr("data-field-name")){return b.get_string("afterfield","customfield",d.attr("data-field-name"))}else{return a.Deferred().resolve("")}};a("[data-field-name]").on("sortablelist-drop",function(a,b){a.stopPropagation();if(b.positionChanged){var e=d.call([{methodname:"core_customfield_move_field",args:{id:b.element.data("field-id"),beforeid:b.targetNextElement.data("field-id"),categoryid:+b.targetList.closest("[data-category-id]").attr("data-category-id")}}]);e[0].fail(c.exception)}}).on("sortablelist-drag",function(d){d.stopPropagation();b.get_string("therearenofields","core_customfield").then(function(b){a("#customfield_catlist .categorieslist").children().each(function(){var c=a(this).find(a(".field")),d=a(this).find(a(".nofields"));if(!c.length&&!d.length){a(this).find("tbody").append(""+b+"")}if(c.length&&d.length){d.remove()}});return null}).fail(c.exception)});a("[data-category-id], [data-field-name]").on("sortablelist-dragstart",function(b,c){setTimeout(function(){a(".sortable-list-is-dragged").width(c.element.width())},501)})}}}); +//# sourceMappingURL=form.min.js.map diff --git a/customfield/amd/build/form.min.js.map b/customfield/amd/build/form.min.js.map new file mode 100644 index 0000000000000..70d8bd3fba19d --- /dev/null +++ b/customfield/amd/build/form.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/form.js"],"names":["define","$","Str","Notification","Ajax","Templates","SortableList","confirmDelete","id","type","component","area","itemid","get_strings","done","s","confirm","func","call","methodname","args","then","response","render","html","js","replaceNode","fail","exception","createNewCategory","promises","categoryid","window","location","href","init","mainlist","attr","on","e","preventDefault","categoryName","element","closest","find","sortCat","moveHandlerSelector","getElementName","el","Deferred","resolve","evt","info","positionChanged","data","beforeid","targetNextElement","stopPropagation","sort","getDestinationName","parentElement","afterElement","length","get_string","targetList","children","each","fields","nofields","append","remove","setTimeout","width"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module depends on the real jquery - and returns the non-global version of it.\n *\n * @module core_customfield/form\n * @package core_customfield\n * @copyright 2018 Toni Barbera\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/notification', 'core/ajax', 'core/templates', 'core/sortable_list', 'core/inplace_editable'],\n function(\n $, Str, Notification, Ajax, Templates, SortableList) {\n\n /**\n * Display confirmation dialogue\n *\n * @param {Number} id\n * @param {String} type\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\n var confirmDelete = function(id, type, component, area, itemid) {\n Str.get_strings([\n {'key': 'confirm'},\n {'key': 'confirmdelete' + type, component: 'core_customfield'},\n {'key': 'yes'},\n {'key': 'no'},\n ]).done(function(s) {\n Notification.confirm(s[0], s[1], s[2], s[3], function() {\n var func = (type === 'field') ? 'core_customfield_delete_field' : 'core_customfield_delete_category';\n Ajax.call([\n {methodname: func, args: {id: id}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ])[1].then(function(response) {\n return Templates.render('core_customfield/list', response);\n }).then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n return null;\n }).fail(Notification.exception);\n });\n }).fail(Notification.exception);\n };\n\n /**\n * Creates a new custom fields category with default name and updates the list\n *\n * @param {String} component\n * @param {String} area\n * @param {Number} itemid\n */\n var createNewCategory = function(component, area, itemid) {\n var promises = Ajax.call([\n {methodname: 'core_customfield_create_category', args: {component: component, area: area, itemid: itemid}},\n {methodname: 'core_customfield_reload_template', args: {component: component, area: area, itemid: itemid}}\n ]),\n categoryid;\n\n promises[0].then(function(response) {\n categoryid = response;\n return null;\n }).fail(Notification.exception);\n\n promises[1].then(function(response) {\n return Templates.render('core_customfield/list', response);\n }).then(function(html, js) {\n Templates.replaceNode($('[data-region=\"list-page\"]'), html, js);\n window.location.href = '#category-' + categoryid;\n return null;\n }).fail(Notification.exception);\n };\n\n return {\n /**\n * Initialise the custom fields manager\n */\n init: function() {\n var mainlist = $('#customfield_catlist'),\n component = mainlist.attr('data-component'),\n area = mainlist.attr('data-area'),\n itemid = mainlist.attr('data-itemid');\n $(\"[data-role=deletefield]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'field', component, area, itemid);\n e.preventDefault();\n });\n $(\"[data-role=deletecategory]\").on('click', function(e) {\n confirmDelete($(this).attr('data-id'), 'category', component, area, itemid);\n e.preventDefault();\n });\n $('[data-role=addnewcategory]').on('click', function() {\n createNewCategory(component, area, itemid);\n });\n\n var categoryName = function(element) {\n return element\n .closest('[data-category-id]')\n .find('[data-inplaceeditable][data-itemtype=category][data-component=core_customfield]')\n .attr('data-value');\n };\n\n // Sort category.\n var sortCat = new SortableList(\n $('#customfield_catlist .categorieslist'),\n {moveHandlerSelector: '.movecategory [data-drag-type=move]'}\n );\n\n sortCat.getElementName = function(el) {\n return $.Deferred().resolve(categoryName(el));\n };\n\n $('[data-category-id]').on('sortablelist-drop', function(evt, info) {\n if (info.positionChanged) {\n var promises = Ajax.call([\n {\n methodname: 'core_customfield_move_category',\n args: {\n id: info.element.data('category-id'),\n beforeid: info.targetNextElement.data('category-id')\n }\n\n },\n ]);\n promises[0].fail(Notification.exception);\n }\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n });\n\n // Sort fields.\n var sort = new SortableList(\n $('#customfield_catlist .fieldslist tbody'),\n {moveHandlerSelector: '.movefield [data-drag-type=move]'}\n );\n\n sort.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return Str.get_string('totopofcategory', 'customfield', categoryName(parentElement));\n } else if (afterElement.attr('data-field-name')) {\n return Str.get_string('afterfield', 'customfield', afterElement.attr('data-field-name'));\n } else {\n return $.Deferred().resolve('');\n }\n };\n\n $('[data-field-name]').on('sortablelist-drop', function(evt, info) {\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n if (info.positionChanged) {\n var promises = Ajax.call([\n {\n methodname: 'core_customfield_move_field',\n args: {\n id: info.element.data('field-id'),\n beforeid: info.targetNextElement.data('field-id'),\n categoryid: Number(info.targetList.closest('[data-category-id]').attr('data-category-id'))\n },\n },\n ]);\n promises[0].fail(Notification.exception);\n }\n }).on('sortablelist-drag', function(evt) {\n evt.stopPropagation(); // Important for nested lists to prevent multiple targets.\n // Refreshing fields tables.\n Str.get_string('therearenofields', 'core_customfield').then(function(s) {\n $('#customfield_catlist .categorieslist').children().each(function() {\n var fields = $(this).find($('.field')),\n nofields = $(this).find($('.nofields'));\n if (!fields.length && !nofields.length) {\n $(this).find('tbody').append(\n '' + s + ''\n );\n }\n if (fields.length && nofields.length) {\n nofields.remove();\n }\n });\n return null;\n }).fail(Notification.exception);\n });\n\n $('[data-category-id], [data-field-name]').on('sortablelist-dragstart',\n function(evt, info) {\n setTimeout(function() {\n $('.sortable-list-is-dragged').width(info.element.width());\n }, 501);\n }\n );\n\n }\n };\n});\n"],"file":"form.min.js"} \ No newline at end of file diff --git a/enrol/manual/amd/build/form-potential-user-selector.min.js b/enrol/manual/amd/build/form-potential-user-selector.min.js index bf66147628b8b..3ec5e2c32c304 100644 --- a/enrol/manual/amd/build/form-potential-user-selector.min.js +++ b/enrol/manual/amd/build/form-potential-user-selector.min.js @@ -1 +1,2 @@ -define(["jquery","core/ajax","core/templates","core/str"],function(a,b,c,d){var e=100;return{processResults:function(b,c){var d=[];return a.isArray(c)?(a.each(c,function(a,b){d.push({value:b.id,label:b._label})}),d):c},transport:function(f,g,h,i){var j,k=a(f).attr("courseid"),l=a(f).attr("userfields").split(",");"undefined"==typeof k&&(k="1");var m=a(f).attr("enrolid");"undefined"==typeof m&&(m=""),j=b.call([{methodname:"core_enrol_get_potential_users",args:{courseid:k,enrolid:m,search:g,searchanywhere:!0,page:0,perpage:e+1}}]),j[0].then(function(b){var f=[],g=0;return b.length<=e?(a.each(b,function(b,d){var e=d,g=[];a.each(l,function(a,b){"undefined"!=typeof d[b]&&""!==d[b]&&(e.hasidentity=!0,g.push(d[b]))}),e.identity=g.join(", "),f.push(c.render("enrol_manual/form-user-selector-suggestion",e))}),a.when.apply(a.when,f).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[g],g++}),h(b)})):d.get_string("toomanyuserstoshow","core",">"+e).then(function(a){h(a)})}).fail(i)}}}); \ No newline at end of file +define ("enrol_manual/form-potential-user-selector",["jquery","core/ajax","core/templates","core/str"],function(a,b,c,d){return{processResults:function processResults(b,c){var d=[];if(a.isArray(c)){a.each(c,function(a,b){d.push({value:b.id,label:b._label})});return d}else{return c}},transport:function transport(e,f,g,h){var i,j=a(e).attr("courseid"),k=a(e).attr("userfields").split(",");if("undefined"==typeof j){j="1"}var l=a(e).attr("enrolid");if("undefined"==typeof l){l=""}i=b.call([{methodname:"core_enrol_get_potential_users",args:{courseid:j,enrolid:l,search:f,searchanywhere:!0,page:0,perpage:101}}]);i[0].then(function(b){var e=[],f=0;if(b.length<=100){a.each(b,function(b,d){var f=d,g=[];a.each(k,function(a,b){if("undefined"!=typeof d[b]&&""!==d[b]){f.hasidentity=!0;g.push(d[b])}});f.identity=g.join(", ");e.push(c.render("enrol_manual/form-user-selector-suggestion",f))});return a.when.apply(a.when,e).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[f];f++});g(b)})}else{return d.get_string("toomanyuserstoshow","core",">100").then(function(a){g(a)})}}).fail(h)}}}); +//# sourceMappingURL=form-potential-user-selector.min.js.map diff --git a/enrol/manual/amd/build/form-potential-user-selector.min.js.map b/enrol/manual/amd/build/form-potential-user-selector.min.js.map new file mode 100644 index 0000000000000..d4a96f390bb2e --- /dev/null +++ b/enrol/manual/amd/build/form-potential-user-selector.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/form-potential-user-selector.js"],"names":["define","$","Ajax","Templates","Str","processResults","selector","results","users","isArray","each","index","user","push","value","id","label","_label","transport","query","success","failure","promise","courseid","attr","userfields","split","enrolid","call","methodname","args","search","searchanywhere","page","perpage","then","promises","i","length","ctx","identity","k","hasidentity","join","render","when","apply","arguments","get_string","toomanyuserstoshow","fail"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Potential user selector module.\n *\n * @module enrol_manual/form-potential-user-selector\n * @class form-potential-user-selector\n * @package enrol_manual\n * @copyright 2016 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates', 'core/str'], function($, Ajax, Templates, Str) {\n\n /** @var {Number} Maximum number of users to show. */\n var MAXUSERS = 100;\n\n return /** @alias module:enrol_manual/form-potential-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n if ($.isArray(results)) {\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n var courseid = $(selector).attr('courseid');\n var userfields = $(selector).attr('userfields').split(',');\n if (typeof courseid === \"undefined\") {\n courseid = '1';\n }\n var enrolid = $(selector).attr('enrolid');\n if (typeof enrolid === \"undefined\") {\n enrolid = '';\n }\n\n promise = Ajax.call([{\n methodname: 'core_enrol_get_potential_users',\n args: {\n courseid: courseid,\n enrolid: enrolid,\n search: query,\n searchanywhere: true,\n page: 0,\n perpage: MAXUSERS + 1\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n if (results.length <= MAXUSERS) {\n // Render the label.\n $.each(results, function(index, user) {\n var ctx = user,\n identity = [];\n $.each(userfields, function(i, k) {\n if (typeof user[k] !== 'undefined' && user[k] !== '') {\n ctx.hasidentity = true;\n identity.push(user[k]);\n }\n });\n ctx.identity = identity.join(', ');\n promises.push(Templates.render('enrol_manual/form-user-selector-suggestion', ctx));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n } else {\n return Str.get_string('toomanyuserstoshow', 'core', '>' + MAXUSERS).then(function(toomanyuserstoshow) {\n success(toomanyuserstoshow);\n return;\n });\n }\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"file":"form-potential-user-selector.min.js"} \ No newline at end of file diff --git a/enrol/manual/amd/build/quickenrolment.min.js b/enrol/manual/amd/build/quickenrolment.min.js index 0e86534a11a68..1ae2fd7d24eee 100644 --- a/enrol/manual/amd/build/quickenrolment.min.js +++ b/enrol/manual/amd/build/quickenrolment.min.js @@ -1 +1,2 @@ -define(["core/templates","jquery","core/str","core/config","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g,h){var i={COHORTSELECT:"#id_cohortlist",TRIGGERBUTTONS:".enrolusersbutton.enrol_manual_plugin [type='submit']",UNWANTEDHIDDENFIELDS:":input[value='_qf__force_multiselect_submission']"},j=function(a){this.contextid=a.contextid,this.initModal()};return j.prototype.courseid=0,j.prototype.modal=null,j.prototype.initModal=function(){var a=b(i.TRIGGERBUTTONS);b.when(c.get_strings([{key:"enroluserscohorts",component:"enrol_manual"},{key:"enrolusers",component:"enrol_manual"}]),f.create({type:f.types.SAVE_CANCEL,large:!0},a)).then(function(a,c){this.modal=c,c.setTitle(a[1]),c.setSaveButtonText(a[1]),c.getRoot().on(g.save,this.submitForm.bind(this)),c.getRoot().on("submit","form",this.submitFormAjax.bind(this)),c.getRoot().on(g.hidden,function(){c.setBody("")}),c.getRoot().on(g.shown,function(){var d=this.getBody();d.then(function(d){var e=b(d).find(i.COHORTSELECT).length?0:1;c.setSaveButtonText(a[e])}).fail(e.exception),c.setBody(d)}.bind(this))}.bind(this)).fail(e.exception)},j.prototype.submitForm=function(a){a.preventDefault(),this.modal.getRoot().find("form").submit()},j.prototype.submitFormAjax=function(a){a.preventDefault();var c=this.modal.getRoot().find("form"),f=c.find(i.UNWANTEDHIDDENFIELDS);f.each(function(){b(this).remove()});var g=c.serialize();this.modal.hide();var h={type:"GET",processData:!1,contentType:"application/json"},j=d.wwwroot+"/enrol/manual/ajax.php?"+g;b.ajax(j,h).then(function(a){a.error?e.addNotification({message:a.error,type:"error"}):("undefined"!=typeof window.M.core_formchangechecker&&window.M.core_formchangechecker.reset_form_dirty_state(),window.location.reload())}).fail(e.exception)},j.prototype.getBody=function(){return h.loadFragment("enrol_manual","enrol_users_form",this.contextid,{}).fail(e.exception)},j.prototype.getFooter=function(){return a.render("enrol_manual/enrol_modal_footer",{})},{init:function(a){new j(a)}}}); \ No newline at end of file +define ("enrol_manual/quickenrolment",["core/templates","jquery","core/str","core/config","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,f,g,h,i){var j={COHORTSELECT:"#id_cohortlist",TRIGGERBUTTONS:".enrolusersbutton.enrol_manual_plugin [type='submit']",UNWANTEDHIDDENFIELDS:":input[value='_qf__force_multiselect_submission']"},k=function(a){this.contextid=a.contextid;this.initModal()};k.prototype.courseid=0;k.prototype.modal=null;k.prototype.initModal=function(){var a=b(j.TRIGGERBUTTONS);b.when(c.get_strings([{key:"enroluserscohorts",component:"enrol_manual"},{key:"enrolusers",component:"enrol_manual"}]),g.create({type:g.types.SAVE_CANCEL,large:!0},a)).then(function(a,c){this.modal=c;c.setTitle(a[1]);c.setSaveButtonText(a[1]);c.getRoot().on(h.save,this.submitForm.bind(this));c.getRoot().on("submit","form",this.submitFormAjax.bind(this));c.getRoot().on(h.hidden,function(){c.setBody("")});c.getRoot().on(h.shown,function(){var d=this.getBody();d.then(function(d){var e=b(d).find(j.COHORTSELECT).length?0:1;c.setSaveButtonText(a[e])}).fail(f.exception);c.setBody(d)}.bind(this))}.bind(this)).fail(f.exception)};k.prototype.submitForm=function(a){a.preventDefault();this.modal.getRoot().find("form").submit()};k.prototype.submitFormAjax=function(a){a.preventDefault();var c=this.modal.getRoot().find("form"),e=c.find(j.UNWANTEDHIDDENFIELDS);e.each(function(){b(this).remove()});var g=c.serialize();this.modal.hide();var h=d.wwwroot+"/enrol/manual/ajax.php?"+g;b.ajax(h,{type:"GET",processData:!1,contentType:"application/json"}).then(function(a){if(a.error){f.addNotification({message:a.error,type:"error"})}else{if("undefined"!=typeof window.M.core_formchangechecker){window.M.core_formchangechecker.reset_form_dirty_state()}window.location.reload()}}).fail(f.exception)};k.prototype.getBody=function(){return i.loadFragment("enrol_manual","enrol_users_form",this.contextid,{}).fail(f.exception)};k.prototype.getFooter=function(){return a.render("enrol_manual/enrol_modal_footer",{})};return{init:function init(a){new k(a)}}}); +//# sourceMappingURL=quickenrolment.min.js.map diff --git a/enrol/manual/amd/build/quickenrolment.min.js.map b/enrol/manual/amd/build/quickenrolment.min.js.map new file mode 100644 index 0000000000000..b408f4bd673f1 --- /dev/null +++ b/enrol/manual/amd/build/quickenrolment.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/quickenrolment.js"],"names":["define","Template","$","Str","Config","Notification","ModalFactory","ModalEvents","Fragment","SELECTORS","COHORTSELECT","TRIGGERBUTTONS","UNWANTEDHIDDENFIELDS","QuickEnrolment","options","contextid","initModal","prototype","courseid","modal","triggerButtons","when","get_strings","key","component","create","type","types","SAVE_CANCEL","large","then","strings","setTitle","setSaveButtonText","getRoot","on","save","submitForm","bind","submitFormAjax","hidden","setBody","shown","bodyPromise","getBody","html","stringIndex","find","length","fail","exception","e","preventDefault","submit","form","each","remove","formData","serialize","hide","script","wwwroot","ajax","processData","contentType","response","error","addNotification","message","window","M","core_formchangechecker","reset_form_dirty_state","location","reload","loadFragment","getFooter","render","init","config"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Quick enrolment AMD module.\n *\n * @module enrol_manual/quickenrolment\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/templates',\n 'jquery',\n 'core/str',\n 'core/config',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/fragment',\n ],\n function(Template, $, Str, Config, Notification, ModalFactory, ModalEvents, Fragment) {\n\n /** @type {Object} The list of selectors for the quick enrolment modal. */\n var SELECTORS = {\n COHORTSELECT: \"#id_cohortlist\",\n TRIGGERBUTTONS: \".enrolusersbutton.enrol_manual_plugin [type='submit']\",\n UNWANTEDHIDDENFIELDS: \":input[value='_qf__force_multiselect_submission']\"\n };\n\n /**\n * Constructor\n *\n * @param {Object} options Object containing options. The only valid option at this time is contextid.\n * Each call to templates.render gets it's own instance of this class.\n */\n var QuickEnrolment = function(options) {\n this.contextid = options.contextid;\n\n this.initModal();\n };\n // Class variables and functions.\n\n /** @var {number} courseid - */\n QuickEnrolment.prototype.courseid = 0;\n\n /** @var {Modal} modal */\n QuickEnrolment.prototype.modal = null;\n\n /**\n * Private method\n *\n * @method initModal\n * @private\n */\n QuickEnrolment.prototype.initModal = function() {\n var triggerButtons = $(SELECTORS.TRIGGERBUTTONS);\n\n $.when(\n Str.get_strings([\n {key: 'enroluserscohorts', component: 'enrol_manual'},\n {key: 'enrolusers', component: 'enrol_manual'},\n ]),\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n large: true,\n }, triggerButtons)\n )\n .then(function(strings, modal) {\n this.modal = modal;\n\n modal.setTitle(strings[1]);\n modal.setSaveButtonText(strings[1]);\n\n modal.getRoot().on(ModalEvents.save, this.submitForm.bind(this));\n modal.getRoot().on('submit', 'form', this.submitFormAjax.bind(this));\n\n // We want the reset the form every time it is opened.\n modal.getRoot().on(ModalEvents.hidden, function() {\n modal.setBody('');\n });\n\n modal.getRoot().on(ModalEvents.shown, function() {\n var bodyPromise = this.getBody();\n bodyPromise.then(function(html) {\n var stringIndex = $(html).find(SELECTORS.COHORTSELECT).length ? 0 : 1;\n modal.setSaveButtonText(strings[stringIndex]);\n\n return;\n })\n .fail(Notification.exception);\n\n modal.setBody(bodyPromise);\n }.bind(this));\n\n return;\n }.bind(this))\n .fail(Notification.exception);\n };\n\n /**\n * This triggers a form submission, so that any mform elements can do final tricks before the form submission is processed.\n *\n * @method submitForm\n * @param {Event} e Form submission event.\n * @private\n */\n QuickEnrolment.prototype.submitForm = function(e) {\n e.preventDefault();\n this.modal.getRoot().find('form').submit();\n };\n\n /**\n * Private method\n *\n * @method submitForm\n * @private\n * @param {Event} e Form submission event.\n */\n QuickEnrolment.prototype.submitFormAjax = function(e) {\n // We don't want to do a real form submission.\n e.preventDefault();\n\n var form = this.modal.getRoot().find('form');\n\n // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.\n // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.\n var hidden = form.find(SELECTORS.UNWANTEDHIDDENFIELDS);\n hidden.each(function() {\n $(this).remove();\n });\n\n var formData = form.serialize();\n\n this.modal.hide();\n\n var settings = {\n type: 'GET',\n processData: false,\n contentType: \"application/json\"\n };\n\n var script = Config.wwwroot + '/enrol/manual/ajax.php?' + formData;\n $.ajax(script, settings)\n .then(function(response) {\n\n if (response.error) {\n Notification.addNotification({\n message: response.error,\n type: \"error\"\n });\n } else {\n // Reload the page, don't show changed data warnings.\n if (typeof window.M.core_formchangechecker !== \"undefined\") {\n window.M.core_formchangechecker.reset_form_dirty_state();\n }\n window.location.reload();\n }\n return;\n })\n .fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method getBody\n * @private\n * @return {Promise}\n */\n QuickEnrolment.prototype.getBody = function() {\n return Fragment.loadFragment('enrol_manual', 'enrol_users_form', this.contextid, {}).fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method getFooter\n * @private\n * @return {Promise}\n */\n QuickEnrolment.prototype.getFooter = function() {\n return Template.render('enrol_manual/enrol_modal_footer', {});\n };\n\n return /** @alias module:enrol_manual/quickenrolment */ {\n // Public variables and functions.\n /**\n * Every call to init creates a new instance of the class with it's own event listeners etc.\n *\n * @method init\n * @public\n * @param {object} config - config variables for the module.\n */\n init: function(config) {\n (new QuickEnrolment(config));\n }\n };\n});\n"],"file":"quickenrolment.min.js"} \ No newline at end of file diff --git a/grade/amd/build/edittree_index.min.js b/grade/amd/build/edittree_index.min.js index b960b823421cb..cc73e30640cb5 100644 --- a/grade/amd/build/edittree_index.min.js +++ b/grade/amd/build/edittree_index.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b=function(){a("body").on("change",".itemselect.ignoredirty",b.checkMoveMenuState),a("body").on("click",'[data-action="grade_edittree-index-bulkselect"]',b.toggleAllSelectItems),a("body").on("change",".weightoverride",b.toggleWeightInput),a("#menumoveafter").on("change",function(){var b=a(this).closest("form"),c=b.find("#bulkmoveinput");c.val(1),b.submit()}),b.checkMoveMenuState()};return b.toggleWeightInput=function(b){b.preventDefault();var c=a(this),d=c.closest("tr");a('input[name="weight_'+d.data("itemid")+'"]').prop("disabled",!c.prop("checked"))},b.toggleAllSelectItems=function(c){c.preventDefault();var d=a(this),e=d.closest("tr");a("."+e.data("category")+" .itemselect").prop("checked",d.data("checked")),b.checkMoveMenuState()},b.getMoveMenu=function(){return a("#menumoveafter")},b.checkMoveMenuState=function(){var c=b.getMoveMenu();if(!c.length)return!1;var d;return a(".itemselect").each(function(){return d=a(this).prop("checked"),!d}),c.prop("disabled",!d),d},{enhance:b}}); \ No newline at end of file +define ("core_grades/edittree_index",["jquery"],function(a){var b=function(){a("body").on("change",".itemselect.ignoredirty",b.checkMoveMenuState);a("body").on("click","[data-action=\"grade_edittree-index-bulkselect\"]",b.toggleAllSelectItems);a("body").on("change",".weightoverride",b.toggleWeightInput);a("#menumoveafter").on("change",function(){var b=a(this).closest("form"),c=b.find("#bulkmoveinput");c.val(1);b.submit()});b.checkMoveMenuState()};b.toggleWeightInput=function(b){b.preventDefault();var c=a(this),d=c.closest("tr");a("input[name=\"weight_"+d.data("itemid")+"\"]").prop("disabled",!c.prop("checked"))};b.toggleAllSelectItems=function(c){c.preventDefault();var d=a(this),e=d.closest("tr");a("."+e.data("category")+" .itemselect").prop("checked",d.data("checked"));b.checkMoveMenuState()};b.getMoveMenu=function(){return a("#menumoveafter")};b.checkMoveMenuState=function(){var c=b.getMoveMenu();if(!c.length){return!1}var d;a(".itemselect").each(function(){d=a(this).prop("checked");return!d});c.prop("disabled",!d);return d};return{enhance:b}}); +//# sourceMappingURL=edittree_index.min.js.map diff --git a/grade/amd/build/edittree_index.min.js.map b/grade/amd/build/edittree_index.min.js.map new file mode 100644 index 0000000000000..e3569f3a6acfd --- /dev/null +++ b/grade/amd/build/edittree_index.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/edittree_index.js"],"names":["define","$","edittree","on","checkMoveMenuState","toggleAllSelectItems","toggleWeightInput","form","closest","bulkmove","find","val","submit","e","preventDefault","node","row","data","prop","getMoveMenu","menu","length","selected","each","enhance"],"mappings":"AAuBAA,OAAM,8BAAC,CACH,QADG,CAAD,CAEH,SAASC,CAAT,CAAY,CAMX,GAAIC,CAAAA,CAAQ,CAAG,UAAW,CAEtBD,CAAC,CAAC,MAAD,CAAD,CAAUE,EAAV,CAAa,QAAb,CAAuB,yBAAvB,CAAkDD,CAAQ,CAACE,kBAA3D,EAGAH,CAAC,CAAC,MAAD,CAAD,CAAUE,EAAV,CAAa,OAAb,CAAsB,mDAAtB,CAAyED,CAAQ,CAACG,oBAAlF,EAGAJ,CAAC,CAAC,MAAD,CAAD,CAAUE,EAAV,CAAa,QAAb,CAAuB,iBAAvB,CAA0CD,CAAQ,CAACI,iBAAnD,EAGAL,CAAC,CAAC,gBAAD,CAAD,CAAoBE,EAApB,CAAuB,QAAvB,CAAiC,UAAW,CACxC,GAAII,CAAAA,CAAI,CAAGN,CAAC,CAAC,IAAD,CAAD,CAAQO,OAAR,CAAgB,MAAhB,CAAX,CACIC,CAAQ,CAAGF,CAAI,CAACG,IAAL,CAAU,gBAAV,CADf,CAGAD,CAAQ,CAACE,GAAT,CAAa,CAAb,EACAJ,CAAI,CAACK,MAAL,EACH,CAND,EASAV,CAAQ,CAACE,kBAAT,EACH,CArBD,CA8BAF,CAAQ,CAACI,iBAAT,CAA6B,SAASO,CAAT,CAAY,CACrCA,CAAC,CAACC,cAAF,GACA,GAAIC,CAAAA,CAAI,CAAGd,CAAC,CAAC,IAAD,CAAZ,CACIe,CAAG,CAAGD,CAAI,CAACP,OAAL,CAAa,IAAb,CADV,CAGAP,CAAC,CAAC,uBAAwBe,CAAG,CAACC,IAAJ,CAAS,QAAT,CAAxB,CAA6C,KAA9C,CAAD,CAAqDC,IAArD,CAA0D,UAA1D,CAAsE,CAACH,CAAI,CAACG,IAAL,CAAU,SAAV,CAAvE,CACH,CAND,CAeAhB,CAAQ,CAACG,oBAAT,CAAgC,SAASQ,CAAT,CAAY,CACxCA,CAAC,CAACC,cAAF,GAEA,GAAIC,CAAAA,CAAI,CAAGd,CAAC,CAAC,IAAD,CAAZ,CACIe,CAAG,CAAGD,CAAI,CAACP,OAAL,CAAa,IAAb,CADV,CAEAP,CAAC,CAAC,IAAMe,CAAG,CAACC,IAAJ,CAAS,UAAT,CAAN,CAA6B,cAA9B,CAAD,CAA+CC,IAA/C,CAAoD,SAApD,CAA+DH,CAAI,CAACE,IAAL,CAAU,SAAV,CAA/D,EAEAf,CAAQ,CAACE,kBAAT,EACH,CARD,CAiBAF,CAAQ,CAACiB,WAAT,CAAuB,UAAW,CAC9B,MAAOlB,CAAAA,CAAC,CAAC,gBAAD,CACX,CAFD,CAWAC,CAAQ,CAACE,kBAAT,CAA8B,UAAW,CACrC,GAAIgB,CAAAA,CAAI,CAAGlB,CAAQ,CAACiB,WAAT,EAAX,CACA,GAAI,CAACC,CAAI,CAACC,MAAV,CAAkB,CACd,QACH,CAED,GAAIC,CAAAA,CAAJ,CACArB,CAAC,CAAC,aAAD,CAAD,CAAiBsB,IAAjB,CAAsB,UAAW,CAC7BD,CAAQ,CAAGrB,CAAC,CAAC,IAAD,CAAD,CAAQiB,IAAR,CAAa,SAAb,CAAX,CAGA,MAAO,CAACI,CACX,CALD,EAOAF,CAAI,CAACF,IAAL,CAAU,UAAV,CAAsB,CAACI,CAAvB,EAEA,MAAOA,CAAAA,CACV,CAjBD,CAmBA,MAAuD,CACnDE,OAAO,CAAEtB,CAD0C,CAG1D,CAvGK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Enhance the gradebook tree setup with various facilities.\n *\n * @module core_grades/edittree_index\n * @package core_grades\n * @copyright 2016 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([\n 'jquery',\n], function($) {\n /**\n * Enhance the edittree functionality.\n *\n * @method edittree\n */\n var edittree = function() {\n // Watch items and toggle the move menu accordingly.\n $('body').on('change', '.itemselect.ignoredirty', edittree.checkMoveMenuState);\n\n // Watch for the 'All' and 'None' links.\n $('body').on('click', '[data-action=\"grade_edittree-index-bulkselect\"]', edittree.toggleAllSelectItems);\n\n // Watch for the weight override checkboxes.\n $('body').on('change', '.weightoverride', edittree.toggleWeightInput);\n\n // Watch changes to the bulk move menu and submit.\n $('#menumoveafter').on('change', function() {\n var form = $(this).closest('form'),\n bulkmove = form.find('#bulkmoveinput');\n\n bulkmove.val(1);\n form.submit();\n });\n\n // CHeck the initial state of the move menu.\n edittree.checkMoveMenuState();\n };\n\n /**\n * Toggle the weight input field based on its checkbox.\n *\n * @method toggleWeightInput\n * @param {EventFacade} e\n * @private\n */\n edittree.toggleWeightInput = function(e) {\n e.preventDefault();\n var node = $(this),\n row = node.closest('tr');\n\n $('input[name=\"weight_' + row.data('itemid') + '\"]').prop('disabled', !node.prop('checked'));\n };\n\n /**\n * Toggle all select boxes on or off.\n *\n * @method toggleAllSelectItems\n * @param {EventFacade} e\n * @private\n */\n edittree.toggleAllSelectItems = function(e) {\n e.preventDefault();\n\n var node = $(this),\n row = node.closest('tr');\n $('.' + row.data('category') + ' .itemselect').prop('checked', node.data('checked'));\n\n edittree.checkMoveMenuState();\n };\n\n /**\n * Get the move menu.\n *\n * @method getMoveMenu\n * @private\n * @return {jQuery}\n */\n edittree.getMoveMenu = function() {\n return $('#menumoveafter');\n };\n\n /**\n * Check whether any checkboxes are ticked.\n *\n * @method checkMoveMenuState\n * @private\n * @return {Boolean}\n */\n edittree.checkMoveMenuState = function() {\n var menu = edittree.getMoveMenu();\n if (!menu.length) {\n return false;\n }\n\n var selected;\n $('.itemselect').each(function() {\n selected = $(this).prop('checked');\n\n // Return early if any are checked.\n return !selected;\n });\n\n menu.prop('disabled', !selected);\n\n return selected;\n };\n\n return /** @alias module:core_grades/edittree_index */ {\n enhance: edittree\n };\n});\n"],"file":"edittree_index.min.js"} \ No newline at end of file diff --git a/grade/grading/form/guide/amd/build/comment_chooser.min.js b/grade/grading/form/guide/amd/build/comment_chooser.min.js index 0a44d20612dea..2d0d019e99405 100644 --- a/grade/grading/form/guide/amd/build/comment_chooser.min.js +++ b/grade/grading/form/guide/amd/build/comment_chooser.min.js @@ -1 +1,2 @@ -define(["jquery","core/templates","core/notification","core/yui"],function(a,b,c){return{initialise:function(d,e,f,g){function h(b,c){var e="",g="comment-chooser-"+d+"-cancel",h='",i=new M.core.dialogue({modal:!0,headerContent:e,bodyContent:b,footerContent:h,focusAfterHide:"#"+f,id:"comments-chooser-dialog-"+d});a("#"+g).click(function(){i.hide()}),a.each(c,function(b,c){var e="#comment-option-"+d+"-"+c.id;a(e).click(function(){var b=a("#"+f),d=b.val();""!==a.trim(d)&&(d+="\n"),d+=c.description,b.val(d),i.hide()}),a(document).off("keypress",e).on("keypress",e,function(){var b=event.which||event.keyCode;13!=b&&32!=b||a(e).click()})}),i.after("visibleChange",function(a){a.prevVal&&!a.newVal&&this.destroy()},i),i.show()}function i(){var a={criterionId:d,comments:g};b.render("gradingform_guide/comment_chooser",a).done(function(a){h(a,g)}).fail(c.exception)}a("#"+e).click(function(a){a.preventDefault(),i()})}}}); \ No newline at end of file +define ("gradingform_guide/comment_chooser",["jquery","core/templates","core/notification","core/yui"],function(a,b,c){return{initialise:function initialise(d,e,f,g){function h(b,c){var e="",g="comment-chooser-"+d+"-cancel",h="",i=new M.core.dialogue({modal:!0,headerContent:e,bodyContent:b,footerContent:h,focusAfterHide:"#"+f,id:"comments-chooser-dialog-"+d});a("#"+g).click(function(){i.hide()});a.each(c,function(b,c){var e="#comment-option-"+d+"-"+c.id;a(e).click(function(){var b=a("#"+f),d=b.val();if(""!==a.trim(d)){d+="\n"}d+=c.description;b.val(d);i.hide()});a(document).off("keypress",e).on("keypress",e,function(){var b=event.which||event.keyCode;if(13==b||32==b){a(e).click()}})});i.after("visibleChange",function(a){if(a.prevVal&&!a.newVal){this.destroy()}},i);i.show()}function i(){b.render("gradingform_guide/comment_chooser",{criterionId:d,comments:g}).done(function(a){h(a,g)}).fail(c.exception)}a("#"+e).click(function(a){a.preventDefault();i()})}}}); +//# sourceMappingURL=comment_chooser.min.js.map diff --git a/grade/grading/form/guide/amd/build/comment_chooser.min.js.map b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map new file mode 100644 index 0000000000000..15f5ce1c466f9 --- /dev/null +++ b/grade/grading/form/guide/amd/build/comment_chooser.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/comment_chooser.js"],"names":["define","$","templates","notification","initialise","criterionId","buttonId","remarkId","commentOptions","displayChooserDialog","compiledSource","comments","titleLabel","M","util","get_string","cancelButtonId","cancelButton","chooserDialog","core","dialogue","modal","headerContent","bodyContent","footerContent","focusAfterHide","id","click","hide","each","index","comment","commentOptionId","remarkTextArea","remarkText","val","trim","description","document","off","on","keyCode","event","which","after","e","prevVal","newVal","destroy","show","generateCommentsChooser","render","done","fail","exception","preventDefault"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * AMD code for the frequently used comments chooser for the marking guide grading form.\n *\n * @module gradingform_guide/comment_chooser\n * @class comment_chooser\n * @package core\n * @copyright 2015 Jun Pataleta \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/templates', 'core/notification', 'core/yui'], function($, templates, notification) {\n\n // Private variables and functions.\n\n return /** @alias module:gradingform_guide/comment_chooser */ {\n // Public variables and functions.\n /**\n * Initialises the module.\n *\n * Basically, it performs the binding and handling of the button click event for\n * the 'Insert frequently used comment' button.\n *\n * @param {Integer} criterionId The criterion ID.\n * @param {String} buttonId The element ID of the button which the handler will be bound to.\n * @param {String} remarkId The element ID of the remark text area where the text of the selected comment will be copied to.\n * @param {Array} commentOptions The array of frequently used comments to be used as options.\n */\n initialise: function(criterionId, buttonId, remarkId, commentOptions) {\n /**\n * Display the chooser dialog using the compiled HTML from the mustache template\n * and binds onclick events for the generated comment options.\n *\n * @param {String} compiledSource The compiled HTML from the mustache template\n * @param {Array} comments Array containing comments.\n */\n function displayChooserDialog(compiledSource, comments) {\n var titleLabel = '';\n var cancelButtonId = 'comment-chooser-' + criterionId + '-cancel';\n var cancelButton = '';\n\n // Set dialog's body content.\n var chooserDialog = new M.core.dialogue({\n modal: true,\n headerContent: titleLabel,\n bodyContent: compiledSource,\n footerContent: cancelButton,\n focusAfterHide: '#' + remarkId,\n id: \"comments-chooser-dialog-\" + criterionId\n });\n\n // Bind click event to the cancel button.\n $(\"#\" + cancelButtonId).click(function() {\n chooserDialog.hide();\n });\n\n // Loop over each comment item and bind click events.\n $.each(comments, function(index, comment) {\n var commentOptionId = '#comment-option-' + criterionId + '-' + comment.id;\n\n // Delegate click event for the generated option link.\n $(commentOptionId).click(function() {\n var remarkTextArea = $('#' + remarkId);\n var remarkText = remarkTextArea.val();\n\n // Add line break if the current value of the remark text is not empty.\n if ($.trim(remarkText) !== '') {\n remarkText += '\\n';\n }\n remarkText += comment.description;\n\n remarkTextArea.val(remarkText);\n\n chooserDialog.hide();\n });\n\n // Handle keypress on list items.\n $(document).off('keypress', commentOptionId).on('keypress', commentOptionId, function() {\n var keyCode = event.which || event.keyCode;\n\n // Enter or space key.\n if (keyCode == 13 || keyCode == 32) {\n // Trigger click event.\n $(commentOptionId).click();\n }\n });\n });\n\n // Destroy the dialog when it is hidden to allow the grading section to\n // be loaded as a fragment multiple times within the same page.\n chooserDialog.after('visibleChange', function(e) {\n // Going from visible to hidden.\n if (e.prevVal && !e.newVal) {\n this.destroy();\n }\n }, chooserDialog);\n\n // Show dialog.\n chooserDialog.show();\n }\n\n /**\n * Generates the comments chooser dialog from the grading_form/comment_chooser mustache template.\n */\n function generateCommentsChooser() {\n // Template context.\n var context = {\n criterionId: criterionId,\n comments: commentOptions\n };\n\n // Render the template and display the comment chooser dialog.\n templates.render('gradingform_guide/comment_chooser', context)\n .done(function(compiledSource) {\n displayChooserDialog(compiledSource, commentOptions);\n })\n .fail(notification.exception);\n }\n\n // Bind click event for the comments chooser button.\n $(\"#\" + buttonId).click(function(e) {\n e.preventDefault();\n generateCommentsChooser();\n });\n }\n };\n});\n"],"file":"comment_chooser.min.js"} \ No newline at end of file diff --git a/lib/amd/build/adapter.min.js b/lib/amd/build/adapter.min.js index 08b2c5feff286..1c24ad2fb5458 100644 --- a/lib/amd/build/adapter.min.js +++ b/lib/amd/build/adapter.min.js @@ -1,3 +1,2 @@ -define([],function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g=14393&&a.indexOf("?transport=udp")===-1}),delete a.url,a.urls=e?d[0]:d,!!d.length}})}function f(a,b){var c={codecs:[],headerExtensions:[],fecMechanisms:[]},d=function(a,b){a=parseInt(a,10);for(var c=0;c0;g--)this._iceGatherers.push(new a.RTCIceGatherer({iceServers:c.iceServers,gatherPolicy:c.iceTransportPolicy}));else c.iceCandidatePoolSize=0;this._config=c,this.transceivers=[],this._sdpSessionId=j.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};m.prototype.onicecandidate=null,m.prototype.onaddstream=null,m.prototype.ontrack=null,m.prototype.onremovestream=null,m.prototype.onsignalingstatechange=null,m.prototype.oniceconnectionstatechange=null,m.prototype.onconnectionstatechange=null,m.prototype.onicegatheringstatechange=null,m.prototype.onnegotiationneeded=null,m.prototype.ondatachannel=null,m.prototype._dispatchEvent=function(a,b){this._isClosed||(this.dispatchEvent(b),"function"==typeof this["on"+a]&&this["on"+a](b))},m.prototype._emitGatheringStateChange=function(){var a=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",a)},m.prototype.getConfiguration=function(){return this._config},m.prototype.getLocalStreams=function(){return this.localStreams},m.prototype.getRemoteStreams=function(){return this.remoteStreams},m.prototype._createTransceiver=function(a,b){var c=this.transceivers.length>0,d={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:a,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&c)d.iceTransport=this.transceivers[0].iceTransport,d.dtlsTransport=this.transceivers[0].dtlsTransport;else{var e=this._createIceAndDtlsTransports();d.iceTransport=e.iceTransport,d.dtlsTransport=e.dtlsTransport}return b||this.transceivers.push(d),d},m.prototype.addTrack=function(b,c){if(this._isClosed)throw i("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var d=this.transceivers.find(function(a){return a.track===b});if(d)throw i("InvalidAccessError","Track already exists.");for(var e,f=0;f=15025)a.getTracks().forEach(function(b){c.addTrack(b,a)});else{var d=a.clone();a.getTracks().forEach(function(a,b){var c=d.getTracks()[b];a.addEventListener("enabled",function(a){c.enabled=a.enabled})}),d.getTracks().forEach(function(a){c.addTrack(a,d)})}},m.prototype.removeTrack=function(b){if(this._isClosed)throw i("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(b instanceof a.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var c=this.transceivers.find(function(a){return a.rtpSender===b});if(!c)throw i("InvalidAccessError","Sender was not created by this connection.");var d=c.stream;c.rtpSender.stop(),c.rtpSender=null,c.track=null,c.stream=null;var e=this.transceivers.map(function(a){return a.stream});e.indexOf(d)===-1&&this.localStreams.indexOf(d)>-1&&this.localStreams.splice(this.localStreams.indexOf(d),1),this._maybeFireNegotiationNeeded()},m.prototype.removeStream=function(a){var b=this;a.getTracks().forEach(function(a){var c=b.getSenders().find(function(b){return b.track===a});c&&b.removeTrack(c)})},m.prototype.getSenders=function(){return this.transceivers.filter(function(a){return!!a.rtpSender}).map(function(a){return a.rtpSender})},m.prototype.getReceivers=function(){return this.transceivers.filter(function(a){return!!a.rtpReceiver}).map(function(a){return a.rtpReceiver})},m.prototype._createIceGatherer=function(b,c){var d=this;if(c&&b>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var e=new a.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(e,"state",{value:"new",writable:!0}),this.transceivers[b].bufferedCandidateEvents=[],this.transceivers[b].bufferCandidates=function(a){var c=!a.candidate||0===Object.keys(a.candidate).length;e.state=c?"completed":"gathering",null!==d.transceivers[b].bufferedCandidateEvents&&d.transceivers[b].bufferedCandidateEvents.push(a)},e.addEventListener("localcandidate",this.transceivers[b].bufferCandidates),e},m.prototype._gather=function(b,c){var d=this,e=this.transceivers[c].iceGatherer;if(!e.onlocalcandidate){var f=this.transceivers[c].bufferedCandidateEvents;this.transceivers[c].bufferedCandidateEvents=null,e.removeEventListener("localcandidate",this.transceivers[c].bufferCandidates),e.onlocalcandidate=function(a){if(!(d.usingBundle&&c>0)){var f=new Event("icecandidate");f.candidate={sdpMid:b,sdpMLineIndex:c};var g=a.candidate,h=!g||0===Object.keys(g).length;if(h)"new"!==e.state&&"gathering"!==e.state||(e.state="completed");else{"new"===e.state&&(e.state="gathering"),g.component=1,g.ufrag=e.getLocalParameters().usernameFragment;var i=j.writeCandidate(g);f.candidate=Object.assign(f.candidate,j.parseCandidate(i)),f.candidate.candidate=i,f.candidate.toJSON=function(){return{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex,usernameFragment:f.candidate.usernameFragment}}}var k=j.getMediaSections(d.localDescription.sdp);h?k[f.candidate.sdpMLineIndex]+="a=end-of-candidates\r\n":k[f.candidate.sdpMLineIndex]+="a="+f.candidate.candidate+"\r\n",d.localDescription.sdp=j.getDescription(d.localDescription.sdp)+k.join("");var l=d.transceivers.every(function(a){return a.iceGatherer&&"completed"===a.iceGatherer.state});"gathering"!==d.iceGatheringState&&(d.iceGatheringState="gathering",d._emitGatheringStateChange()),h||d._dispatchEvent("icecandidate",f),l&&(d._dispatchEvent("icecandidate",new Event("icecandidate")),d.iceGatheringState="complete",d._emitGatheringStateChange())}},a.setTimeout(function(){f.forEach(function(a){e.onlocalcandidate(a)})},0)}},m.prototype._createIceAndDtlsTransports=function(){var b=this,c=new a.RTCIceTransport(null);c.onicestatechange=function(){b._updateIceConnectionState(),b._updateConnectionState()};var d=new a.RTCDtlsTransport(c);return d.ondtlsstatechange=function(){b._updateConnectionState()},d.onerror=function(){Object.defineProperty(d,"state",{value:"failed",writable:!0}),b._updateConnectionState()},{iceTransport:c,dtlsTransport:d}},m.prototype._disposeIceAndDtlsTransports=function(a){var b=this.transceivers[a].iceGatherer;b&&(delete b.onlocalcandidate,delete this.transceivers[a].iceGatherer);var c=this.transceivers[a].iceTransport;c&&(delete c.onicestatechange,delete this.transceivers[a].iceTransport);var d=this.transceivers[a].dtlsTransport;d&&(delete d.ondtlsstatechange,delete d.onerror,delete this.transceivers[a].dtlsTransport)},m.prototype._transceive=function(a,c,d){var e=f(a.localCapabilities,a.remoteCapabilities);c&&a.rtpSender&&(e.encodings=a.sendEncodingParameters,e.rtcp={cname:j.localCName,compound:a.rtcpParameters.compound},a.recvEncodingParameters.length&&(e.rtcp.ssrc=a.recvEncodingParameters[0].ssrc),a.rtpSender.send(e)),d&&a.rtpReceiver&&e.codecs.length>0&&("video"===a.kind&&a.recvEncodingParameters&&b<15019&&a.recvEncodingParameters.forEach(function(a){delete a.rtx}),a.recvEncodingParameters.length?e.encodings=a.recvEncodingParameters:e.encodings=[{}],e.rtcp={compound:a.rtcpParameters.compound},a.rtcpParameters.cname&&(e.rtcp.cname=a.rtcpParameters.cname),a.sendEncodingParameters.length&&(e.rtcp.ssrc=a.sendEncodingParameters[0].ssrc),a.rtpReceiver.receive(e))},m.prototype.setLocalDescription=function(a){var b=this;if(["offer","answer"].indexOf(a.type)===-1)return Promise.reject(i("TypeError",'Unsupported type "'+a.type+'"'));if(!g("setLocalDescription",a.type,b.signalingState)||b._isClosed)return Promise.reject(i("InvalidStateError","Can not set local "+a.type+" in state "+b.signalingState));var c,d;if("offer"===a.type)c=j.splitSections(a.sdp),d=c.shift(),c.forEach(function(a,c){var d=j.parseRtpParameters(a);b.transceivers[c].localCapabilities=d}),b.transceivers.forEach(function(a,c){b._gather(a.mid,c)});else if("answer"===a.type){c=j.splitSections(b.remoteDescription.sdp),d=c.shift();var e=j.matchPrefix(d,"a=ice-lite").length>0;c.forEach(function(a,c){var g=b.transceivers[c],h=g.iceGatherer,i=g.iceTransport,k=g.dtlsTransport,l=g.localCapabilities,m=g.remoteCapabilities,n=j.isRejected(a)&&0===j.matchPrefix(a,"a=bundle-only").length;if(!n&&!g.rejected){var o=j.getIceParameters(a,d),p=j.getDtlsParameters(a,d);e&&(p.role="server"),b.usingBundle&&0!==c||(b._gather(g.mid,c),"new"===i.state&&i.start(h,o,e?"controlling":"controlled"),"new"===k.state&&k.start(p));var q=f(l,m);b._transceive(g,q.codecs.length>0,!1)}})}return b.localDescription={type:a.type,sdp:a.sdp},"offer"===a.type?b._updateSignalingState("have-local-offer"):b._updateSignalingState("stable"),Promise.resolve()},m.prototype.setRemoteDescription=function(d){var e=this;if(["offer","answer"].indexOf(d.type)===-1)return Promise.reject(i("TypeError",'Unsupported type "'+d.type+'"'));if(!g("setRemoteDescription",d.type,e.signalingState)||e._isClosed)return Promise.reject(i("InvalidStateError","Can not set remote "+d.type+" in state "+e.signalingState));var f={};e.remoteStreams.forEach(function(a){f[a.id]=a});var m=[],n=j.splitSections(d.sdp),o=n.shift(),p=j.matchPrefix(o,"a=ice-lite").length>0,q=j.matchPrefix(o,"a=group:BUNDLE ").length>0;e.usingBundle=q;var r=j.matchPrefix(o,"a=ice-options:")[0];return r?e.canTrickleIceCandidates=r.substr(14).split(" ").indexOf("trickle")>=0:e.canTrickleIceCandidates=!1,n.forEach(function(g,i){var l=j.splitLines(g),n=j.getKind(g),r=j.isRejected(g)&&0===j.matchPrefix(g,"a=bundle-only").length,s=l[0].substr(2).split(" ")[2],t=j.getDirection(g,o),u=j.parseMsid(g),v=j.getMid(g)||j.generateIdentifier();if("application"===n&&"DTLS/SCTP"===s||r)return void(e.transceivers[i]={mid:v,kind:n,rejected:!0});!r&&e.transceivers[i]&&e.transceivers[i].rejected&&(e.transceivers[i]=e._createTransceiver(n,!0));var w,x,y,z,A,B,C,D,E,F,G,H=j.parseRtpParameters(g);r||(F=j.getIceParameters(g,o),G=j.getDtlsParameters(g,o),G.role="client"),C=j.parseRtpEncodingParameters(g);var I=j.parseRtcpParameters(g),J=j.matchPrefix(g,"a=end-of-candidates",o).length>0,K=j.matchPrefix(g,"a=candidate:").map(function(a){return j.parseCandidate(a)}).filter(function(a){return 1===a.component});if(("offer"===d.type||"answer"===d.type)&&!r&&q&&i>0&&e.transceivers[i]&&(e._disposeIceAndDtlsTransports(i),e.transceivers[i].iceGatherer=e.transceivers[0].iceGatherer,e.transceivers[i].iceTransport=e.transceivers[0].iceTransport,e.transceivers[i].dtlsTransport=e.transceivers[0].dtlsTransport,e.transceivers[i].rtpSender&&e.transceivers[i].rtpSender.setTransport(e.transceivers[0].dtlsTransport),e.transceivers[i].rtpReceiver&&e.transceivers[i].rtpReceiver.setTransport(e.transceivers[0].dtlsTransport)),"offer"!==d.type||r)"answer"!==d.type||r||(w=e.transceivers[i],x=w.iceGatherer,y=w.iceTransport,z=w.dtlsTransport,A=w.rtpReceiver,B=w.sendEncodingParameters,D=w.localCapabilities,e.transceivers[i].recvEncodingParameters=C,e.transceivers[i].remoteCapabilities=H,e.transceivers[i].rtcpParameters=I,K.length&&"new"===y.state&&(!p&&!J||q&&0!==i?K.forEach(function(a){h(w.iceTransport,a)}):y.setRemoteCandidates(K)),q&&0!==i||("new"===y.state&&y.start(x,F,"controlling"),"new"===z.state&&z.start(G)),e._transceive(w,"sendrecv"===t||"recvonly"===t,"sendrecv"===t||"sendonly"===t),!A||"sendrecv"!==t&&"sendonly"!==t?delete w.rtpReceiver:(E=A.track,u?(f[u.stream]||(f[u.stream]=new a.MediaStream),c(E,f[u.stream]),m.push([E,A,f[u.stream]])):(f["default"]||(f["default"]=new a.MediaStream),c(E,f["default"]),m.push([E,A,f["default"]]))));else{w=e.transceivers[i]||e._createTransceiver(n),w.mid=v,w.iceGatherer||(w.iceGatherer=e._createIceGatherer(i,q)),K.length&&"new"===w.iceTransport.state&&(!J||q&&0!==i?K.forEach(function(a){h(w.iceTransport,a)}):w.iceTransport.setRemoteCandidates(K)),D=a.RTCRtpReceiver.getCapabilities(n),b<15019&&(D.codecs=D.codecs.filter(function(a){return"rtx"!==a.name})),B=w.sendEncodingParameters||[{ssrc:1001*(2*i+2)}];var L=!1;if("sendrecv"===t||"sendonly"===t){if(L=!w.rtpReceiver,A=w.rtpReceiver||new a.RTCRtpReceiver(w.dtlsTransport,n),L){var M;E=A.track,u&&"-"===u.stream||(u?(f[u.stream]||(f[u.stream]=new a.MediaStream,Object.defineProperty(f[u.stream],"id",{get:function(){return u.stream}})),Object.defineProperty(E,"id",{get:function(){return u.track}}),M=f[u.stream]):(f["default"]||(f["default"]=new a.MediaStream),M=f["default"])),M&&(c(E,M),w.associatedRemoteMediaStreams.push(M)),m.push([E,A,M])}}else w.rtpReceiver&&w.rtpReceiver.track&&(w.associatedRemoteMediaStreams.forEach(function(a){var b=a.getTracks().find(function(a){return a.id===w.rtpReceiver.track.id});b&&k(b,a)}),w.associatedRemoteMediaStreams=[]);w.localCapabilities=D,w.remoteCapabilities=H,w.rtpReceiver=A,w.rtcpParameters=I,w.sendEncodingParameters=B,w.recvEncodingParameters=C,e._transceive(e.transceivers[i],!1,L)}}),void 0===e._dtlsRole&&(e._dtlsRole="offer"===d.type?"active":"passive"),e.remoteDescription={type:d.type,sdp:d.sdp},"offer"===d.type?e._updateSignalingState("have-remote-offer"):e._updateSignalingState("stable"),Object.keys(f).forEach(function(b){var c=f[b];if(c.getTracks().length){if(e.remoteStreams.indexOf(c)===-1){e.remoteStreams.push(c);var d=new Event("addstream");d.stream=c,a.setTimeout(function(){e._dispatchEvent("addstream",d)})}m.forEach(function(a){var b=a[0],d=a[1];c.id===a[2].id&&l(e,b,d,[c])})}}),m.forEach(function(a){a[2]||l(e,a[0],a[1],[])}),a.setTimeout(function(){e&&e.transceivers&&e.transceivers.forEach(function(a){a.iceTransport&&"new"===a.iceTransport.state&&a.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),a.iceTransport.addRemoteCandidate({}))})},4e3),Promise.resolve()},m.prototype.close=function(){this.transceivers.forEach(function(a){a.iceTransport&&a.iceTransport.stop(),a.dtlsTransport&&a.dtlsTransport.stop(),a.rtpSender&&a.rtpSender.stop(),a.rtpReceiver&&a.rtpReceiver.stop()}),this._isClosed=!0,this._updateSignalingState("closed")},m.prototype._updateSignalingState=function(a){this.signalingState=a;var b=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",b)},m.prototype._maybeFireNegotiationNeeded=function(){var b=this;"stable"===this.signalingState&&this.needNegotiation!==!0&&(this.needNegotiation=!0,a.setTimeout(function(){if(b.needNegotiation){b.needNegotiation=!1;var a=new Event("negotiationneeded");b._dispatchEvent("negotiationneeded",a)}},0))},m.prototype._updateIceConnectionState=function(){var a,b={"new":0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(a){b[a.iceTransport.state]++}),a="new",b.failed>0?a="failed":b.checking>0?a="checking":b.disconnected>0?a="disconnected":b["new"]>0?a="new":b.connected>0?a="connected":b.completed>0&&(a="completed"),a!==this.iceConnectionState){this.iceConnectionState=a;var c=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",c)}},m.prototype._updateConnectionState=function(){var a,b={"new":0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(a){b[a.iceTransport.state]++,b[a.dtlsTransport.state]++}),b.connected+=b.completed,a="new",b.failed>0?a="failed":b.connecting>0?a="connecting":b.disconnected>0?a="disconnected":b["new"]>0?a="new":b.connected>0&&(a="connected"),a!==this.connectionState){this.connectionState=a;var c=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",c)}},m.prototype.createOffer=function(){var c=this;if(c._isClosed)return Promise.reject(i("InvalidStateError","Can not call createOffer after close"));var e=c.transceivers.filter(function(a){return"audio"===a.kind}).length,f=c.transceivers.filter(function(a){return"video"===a.kind}).length,g=arguments[0];if(g){if(g.mandatory||g.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");void 0!==g.offerToReceiveAudio&&(e=g.offerToReceiveAudio===!0?1:g.offerToReceiveAudio===!1?0:g.offerToReceiveAudio),void 0!==g.offerToReceiveVideo&&(f=g.offerToReceiveVideo===!0?1:g.offerToReceiveVideo===!1?0:g.offerToReceiveVideo)}for(c.transceivers.forEach(function(a){"audio"===a.kind?(e--,e<0&&(a.wantReceive=!1)):"video"===a.kind&&(f--,f<0&&(a.wantReceive=!1))});e>0||f>0;)e>0&&(c._createTransceiver("audio"),e--),f>0&&(c._createTransceiver("video"),f--);var h=j.writeSessionBoilerplate(c._sdpSessionId,c._sdpSessionVersion++);c.transceivers.forEach(function(d,e){var f=d.track,g=d.kind,h=d.mid||j.generateIdentifier();d.mid=h,d.iceGatherer||(d.iceGatherer=c._createIceGatherer(e,c.usingBundle));var i=a.RTCRtpSender.getCapabilities(g);b<15019&&(i.codecs=i.codecs.filter(function(a){return"rtx"!==a.name})),i.codecs.forEach(function(a){"H264"===a.name&&void 0===a.parameters["level-asymmetry-allowed"]&&(a.parameters["level-asymmetry-allowed"]="1"),d.remoteCapabilities&&d.remoteCapabilities.codecs&&d.remoteCapabilities.codecs.forEach(function(b){a.name.toLowerCase()===b.name.toLowerCase()&&a.clockRate===b.clockRate&&(a.preferredPayloadType=b.payloadType)})}),i.headerExtensions.forEach(function(a){var b=d.remoteCapabilities&&d.remoteCapabilities.headerExtensions||[];b.forEach(function(b){a.uri===b.uri&&(a.id=b.id)})});var k=d.sendEncodingParameters||[{ssrc:1001*(2*e+1)}];f&&b>=15019&&"video"===g&&!k[0].rtx&&(k[0].rtx={ssrc:k[0].ssrc+1}),d.wantReceive&&(d.rtpReceiver=new a.RTCRtpReceiver(d.dtlsTransport,g)),d.localCapabilities=i,d.sendEncodingParameters=k}),"max-compat"!==c._config.bundlePolicy&&(h+="a=group:BUNDLE "+c.transceivers.map(function(a){return a.mid}).join(" ")+"\r\n"),h+="a=ice-options:trickle\r\n",c.transceivers.forEach(function(a,b){h+=d(a,a.localCapabilities,"offer",a.stream,c._dtlsRole),h+="a=rtcp-rsize\r\n",!a.iceGatherer||"new"===c.iceGatheringState||0!==b&&c.usingBundle||(a.iceGatherer.getLocalCandidates().forEach(function(a){a.component=1,h+="a="+j.writeCandidate(a)+"\r\n"}),"completed"===a.iceGatherer.state&&(h+="a=end-of-candidates\r\n"))});var k=new a.RTCSessionDescription({type:"offer",sdp:h});return Promise.resolve(k)},m.prototype.createAnswer=function(){var c=this;if(c._isClosed)return Promise.reject(i("InvalidStateError","Can not call createAnswer after close"));if("have-remote-offer"!==c.signalingState&&"have-local-pranswer"!==c.signalingState)return Promise.reject(i("InvalidStateError","Can not call createAnswer in signalingState "+c.signalingState));var e=j.writeSessionBoilerplate(c._sdpSessionId,c._sdpSessionVersion++);c.usingBundle&&(e+="a=group:BUNDLE "+c.transceivers.map(function(a){return a.mid}).join(" ")+"\r\n");var g=j.getMediaSections(c.remoteDescription.sdp).length;c.transceivers.forEach(function(a,h){if(!(h+1>g)){if(a.rejected)return"application"===a.kind?e+="m=application 0 DTLS/SCTP 5000\r\n":"audio"===a.kind?e+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\na=rtpmap:0 PCMU/8000\r\n":"video"===a.kind&&(e+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\na=rtpmap:120 VP8/90000\r\n"),void(e+="c=IN IP4 0.0.0.0\r\na=inactive\r\na=mid:"+a.mid+"\r\n");if(a.stream){var i;"audio"===a.kind?i=a.stream.getAudioTracks()[0]:"video"===a.kind&&(i=a.stream.getVideoTracks()[0]),i&&b>=15019&&"video"===a.kind&&!a.sendEncodingParameters[0].rtx&&(a.sendEncodingParameters[0].rtx={ssrc:a.sendEncodingParameters[0].ssrc+1})}var j=f(a.localCapabilities,a.remoteCapabilities),k=j.codecs.filter(function(a){return"rtx"===a.name.toLowerCase()}).length;!k&&a.sendEncodingParameters[0].rtx&&delete a.sendEncodingParameters[0].rtx,e+=d(a,j,"answer",a.stream,c._dtlsRole),a.rtcpParameters&&a.rtcpParameters.reducedSize&&(e+="a=rtcp-rsize\r\n")}});var h=new a.RTCSessionDescription({type:"answer",sdp:e});return Promise.resolve(h)},m.prototype.addIceCandidate=function(a){var b,c=this;return a&&void 0===a.sdpMLineIndex&&!a.sdpMid?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise(function(d,e){if(!c.remoteDescription)return e(i("InvalidStateError","Can not add ICE candidate without a remote description"));if(a&&""!==a.candidate){var f=a.sdpMLineIndex;if(a.sdpMid)for(var g=0;g0?j.parseCandidate(a.candidate):{};if("tcp"===l.protocol&&(0===l.port||9===l.port))return d();if(l.component&&1!==l.component)return d();if((0===f||f>0&&k.iceTransport!==c.transceivers[0].iceTransport)&&!h(k.iceTransport,l))return e(i("OperationError","Can not add ICE candidate"));var m=a.candidate.trim();0===m.indexOf("a=")&&(m=m.substr(2)),b=j.getMediaSections(c.remoteDescription.sdp),b[f]+="a="+(l.type?m:"end-of-candidates")+"\r\n",c.remoteDescription.sdp=j.getDescription(c.remoteDescription.sdp)+b.join("")}else for(var n=0;n0?"m="+a:a).trim()+"\r\n"})},d.getDescription=function(a){var b=d.splitSections(a);return b&&b[0]},d.getMediaSections=function(a){var b=d.splitSections(a);return b.shift(),b},d.matchPrefix=function(a,b){return d.splitLines(a).filter(function(a){return 0===a.indexOf(b)})},d.parseCandidate=function(a){var b;b=0===a.indexOf("a=candidate:")?a.substring(12).split(" "):a.substring(10).split(" ");for(var c={foundation:b[0],component:parseInt(b[1],10),protocol:b[2].toLowerCase(),priority:parseInt(b[3],10),ip:b[4],port:parseInt(b[5],10),type:b[7]},d=8;d0?b[0].split("/")[1]:"sendrecv",uri:b[1]}},d.writeExtmap=function(a){return"a=extmap:"+(a.id||a.preferredId)+(a.direction&&"sendrecv"!==a.direction?"/"+a.direction:"")+" "+a.uri+"\r\n"},d.parseFmtp=function(a){for(var b,c={},d=a.substr(a.indexOf(" ")+1).split(";"),e=0;e-1?(c.attribute=a.substr(b+1,d-b-1),c.value=a.substr(d+1)):c.attribute=a.substr(b+1),c},d.getMid=function(a){var b=d.matchPrefix(a,"a=mid:")[0];if(b)return b.substr(6)},d.parseFingerprint=function(a){var b=a.substr(14).split(" ");return{algorithm:b[0].toLowerCase(),value:b[1]}},d.getDtlsParameters=function(a,b){var c=d.matchPrefix(a+b,"a=fingerprint:");return{role:"auto",fingerprints:c.map(d.parseFingerprint)}},d.writeDtlsParameters=function(a,b){ -var c="a=setup:"+b+"\r\n";return a.fingerprints.forEach(function(a){c+="a=fingerprint:"+a.algorithm+" "+a.value+"\r\n"}),c},d.getIceParameters=function(a,b){var c=d.splitLines(a);c=c.concat(d.splitLines(b));var e={usernameFragment:c.filter(function(a){return 0===a.indexOf("a=ice-ufrag:")})[0].substr(12),password:c.filter(function(a){return 0===a.indexOf("a=ice-pwd:")})[0].substr(10)};return e},d.writeIceParameters=function(a){return"a=ice-ufrag:"+a.usernameFragment+"\r\na=ice-pwd:"+a.password+"\r\n"},d.parseRtpParameters=function(a){for(var b={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},c=d.splitLines(a),e=c[0].split(" "),f=3;f0?"9":"0",c+=" UDP/TLS/RTP/SAVPF ",c+=b.codecs.map(function(a){return void 0!==a.preferredPayloadType?a.preferredPayloadType:a.payloadType}).join(" ")+"\r\n",c+="c=IN IP4 0.0.0.0\r\n",c+="a=rtcp:9 IN IP4 0.0.0.0\r\n",b.codecs.forEach(function(a){c+=d.writeRtpMap(a),c+=d.writeFmtp(a),c+=d.writeRtcpFb(a)});var e=0;return b.codecs.forEach(function(a){a.maxptime>e&&(e=a.maxptime)}),e>0&&(c+="a=maxptime:"+e+"\r\n"),c+="a=rtcp-mux\r\n",b.headerExtensions.forEach(function(a){c+=d.writeExtmap(a)}),c},d.parseRtpEncodingParameters=function(a){var b,c=[],e=d.parseRtpParameters(a),f=e.fecMechanisms.indexOf("RED")!==-1,g=e.fecMechanisms.indexOf("ULPFEC")!==-1,h=d.matchPrefix(a,"a=ssrc:").map(function(a){return d.parseSsrcMedia(a)}).filter(function(a){return"cname"===a.attribute}),i=h.length>0&&h[0].ssrc,j=d.matchPrefix(a,"a=ssrc-group:FID").map(function(a){var b=a.split(" ");return b.shift(),b.map(function(a){return parseInt(a,10)})});j.length>0&&j[0].length>1&&j[0][0]===i&&(b=j[0][1]),e.codecs.forEach(function(a){if("RTX"===a.name.toUpperCase()&&a.parameters.apt){var d={ssrc:i,codecPayloadType:parseInt(a.parameters.apt,10),rtx:{ssrc:b}};c.push(d),f&&(d=JSON.parse(JSON.stringify(d)),d.fec={ssrc:b,mechanism:g?"red+ulpfec":"red"},c.push(d))}}),0===c.length&&i&&c.push({ssrc:i});var k=d.matchPrefix(a,"b=");return k.length&&(k=0===k[0].indexOf("b=TIAS:")?parseInt(k[0].substr(7),10):0===k[0].indexOf("b=AS:")?1e3*parseInt(k[0].substr(5),10)*.95-16e3:void 0,c.forEach(function(a){a.maxBitrate=k})),c},d.parseRtcpParameters=function(a){var b={},c=d.matchPrefix(a,"a=ssrc:").map(function(a){return d.parseSsrcMedia(a)}).filter(function(a){return"cname"===a.attribute})[0];c&&(b.cname=c.value,b.ssrc=c.ssrc);var e=d.matchPrefix(a,"a=rtcp-rsize");b.reducedSize=e.length>0,b.compound=0===e.length;var f=d.matchPrefix(a,"a=rtcp-mux");return b.mux=f.length>0,b},d.parseMsid=function(a){var b,c=d.matchPrefix(a,"a=msid:");if(1===c.length)return b=c[0].substr(7).split(" "),{stream:b[0],track:b[1]};var e=d.matchPrefix(a,"a=ssrc:").map(function(a){return d.parseSsrcMedia(a)}).filter(function(a){return"msid"===a.attribute});return e.length>0?(b=e[0].value.split(" "),{stream:b[0],track:b[1]}):void 0},d.generateSessionId=function(){return Math.random().toString().substr(2,21)},d.writeSessionBoilerplate=function(a,b){var c,e=void 0!==b?b:2;return c=a?a:d.generateSessionId(),"v=0\r\no=thisisadapterortc "+c+" "+e+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},d.writeMediaSection=function(a,b,c,e){var f=d.writeRtpDescription(a.kind,b);if(f+=d.writeIceParameters(a.iceGatherer.getLocalParameters()),f+=d.writeDtlsParameters(a.dtlsTransport.getLocalParameters(),"offer"===c?"actpass":"active"),f+="a=mid:"+a.mid+"\r\n",f+=a.direction?"a="+a.direction+"\r\n":a.rtpSender&&a.rtpReceiver?"a=sendrecv\r\n":a.rtpSender?"a=sendonly\r\n":a.rtpReceiver?"a=recvonly\r\n":"a=inactive\r\n",a.rtpSender){var g="msid:"+e.id+" "+a.rtpSender.track.id+"\r\n";f+="a="+g,f+="a=ssrc:"+a.sendEncodingParameters[0].ssrc+" "+g,a.sendEncodingParameters[0].rtx&&(f+="a=ssrc:"+a.sendEncodingParameters[0].rtx.ssrc+" "+g,f+="a=ssrc-group:FID "+a.sendEncodingParameters[0].ssrc+" "+a.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return f+="a=ssrc:"+a.sendEncodingParameters[0].ssrc+" cname:"+d.localCName+"\r\n",a.rtpSender&&a.sendEncodingParameters[0].rtx&&(f+="a=ssrc:"+a.sendEncodingParameters[0].rtx.ssrc+" cname:"+d.localCName+"\r\n"),f},d.getDirection=function(a,b){for(var c=d.splitLines(a),e=0;e=65)return this.shimAddTrackRemoveTrackWithNative(a);var f=a.RTCPeerConnection.prototype.getLocalStreams;a.RTCPeerConnection.prototype.getLocalStreams=function(){var a=this,b=f.apply(this);return a._reverseStreams=a._reverseStreams||{},b.map(function(b){return a._reverseStreams[b.id]})};var g=a.RTCPeerConnection.prototype.addStream;a.RTCPeerConnection.prototype.addStream=function(b){var c=this;if(c._streams=c._streams||{},c._reverseStreams=c._reverseStreams||{},b.getTracks().forEach(function(a){var b=c.getSenders().find(function(b){return b.track===a});if(b)throw new DOMException("Track already exists.","InvalidAccessError")}),!c._reverseStreams[b.id]){var d=new a.MediaStream(b.getTracks());c._streams[b.id]=d,c._reverseStreams[d.id]=b,b=d}g.apply(c,[b])};var h=a.RTCPeerConnection.prototype.removeStream;a.RTCPeerConnection.prototype.removeStream=function(a){var b=this;b._streams=b._streams||{},b._reverseStreams=b._reverseStreams||{},h.apply(b,[b._streams[a.id]||a]),delete b._reverseStreams[b._streams[a.id]?b._streams[a.id].id:a.id],delete b._streams[a.id]},a.RTCPeerConnection.prototype.addTrack=function(b,c){var d=this;if("closed"===d.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var e=[].slice.call(arguments,1);if(1!==e.length||!e[0].getTracks().find(function(a){return a===b}))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");var f=d.getSenders().find(function(a){return a.track===b});if(f)throw new DOMException("Track already exists.","InvalidAccessError");d._streams=d._streams||{},d._reverseStreams=d._reverseStreams||{};var g=d._streams[c.id];if(g)g.addTrack(b),Promise.resolve().then(function(){d.dispatchEvent(new Event("negotiationneeded"))});else{var h=new a.MediaStream([b]);d._streams[c.id]=h,d._reverseStreams[h.id]=c,d.addStream(h)}return d.getSenders().find(function(a){return a.track===b})},["createOffer","createAnswer"].forEach(function(c){var d=a.RTCPeerConnection.prototype[c];a.RTCPeerConnection.prototype[c]=function(){var a=this,c=arguments,e=arguments.length&&"function"==typeof arguments[0];return e?d.apply(a,[function(d){var e=b(a,d);c[0].apply(null,[e])},function(a){c[1]&&c[1].apply(null,a)},arguments[2]]):d.apply(a,arguments).then(function(c){return b(a,c)})}});var i=a.RTCPeerConnection.prototype.setLocalDescription;a.RTCPeerConnection.prototype.setLocalDescription=function(){var a=this;return arguments.length&&arguments[0].type?(arguments[0]=c(a,arguments[0]),i.apply(a,arguments)):i.apply(a,arguments)};var j=Object.getOwnPropertyDescriptor(a.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(a.RTCPeerConnection.prototype,"localDescription",{get:function(){var a=this,c=j.get.apply(this);return""===c.type?c:b(a,c)}}),a.RTCPeerConnection.prototype.removeTrack=function(a){var b=this;if("closed"===b.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!a._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");var c=a._pc===b;if(!c)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");b._streams=b._streams||{};var d;Object.keys(b._streams).forEach(function(c){var e=b._streams[c].getTracks().find(function(b){return a.track===b});e&&(d=b._streams[c])}),d&&(1===d.getTracks().length?b.removeStream(b._reverseStreams[d.id]):d.removeTrack(a.track),b.dispatchEvent(new Event("negotiationneeded")))}},shimPeerConnection:function(a){var b=d.detectBrowser(a);if(!a.RTCPeerConnection&&a.webkitRTCPeerConnection)a.RTCPeerConnection=function(b,c){return e("PeerConnection"),b&&b.iceTransportPolicy&&(b.iceTransports=b.iceTransportPolicy),new a.webkitRTCPeerConnection(b,c)},a.RTCPeerConnection.prototype=a.webkitRTCPeerConnection.prototype,a.webkitRTCPeerConnection.generateCertificate&&Object.defineProperty(a.RTCPeerConnection,"generateCertificate",{get:function(){return a.webkitRTCPeerConnection.generateCertificate}});else{var c=a.RTCPeerConnection;a.RTCPeerConnection=function(a,b){if(a&&a.iceServers){for(var e=[],f=0;f0&&"function"==typeof a)return f.apply(this,arguments);if(0===f.length&&(0===arguments.length||"function"!=typeof arguments[0]))return f.apply(this,[]);var g=function(a){var b={},c=a.result();return c.forEach(function(a){var c={id:a.id,timestamp:a.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[a.type]||a.type};a.names().forEach(function(b){c[b]=a.stat(b)}),b[c.id]=c}),b},h=function(a){return new Map(Object.keys(a).map(function(b){return[b,a[b]]}))};if(arguments.length>=2){var i=function(a){e[1](h(g(a)))};return f.apply(this,[i,arguments[0]])}return new Promise(function(a,b){f.apply(d,[function(b){a(h(g(b)))},b])}).then(b,c)},b.version<51&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(b){var c=a.RTCPeerConnection.prototype[b];a.RTCPeerConnection.prototype[b]=function(){var a=arguments,b=this,d=new Promise(function(d,e){c.apply(b,[a[0],d,e])});return a.length<2?d:d.then(function(){a[1].apply(null,[])},function(b){a.length>=3&&a[2].apply(null,[b])})}}),b.version<52&&["createOffer","createAnswer"].forEach(function(b){var c=a.RTCPeerConnection.prototype[b];a.RTCPeerConnection.prototype[b]=function(){var a=this;if(arguments.length<1||1===arguments.length&&"object"==typeof arguments[0]){var b=1===arguments.length?arguments[0]:void 0;return new Promise(function(d,e){c.apply(a,[d,e,b])})}return c.apply(this,arguments)}}),["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(b){var c=a.RTCPeerConnection.prototype[b];a.RTCPeerConnection.prototype[b]=function(){return arguments[0]=new("addIceCandidate"===b?a.RTCIceCandidate:a.RTCSessionDescription)(arguments[0]),c.apply(this,arguments)}});var g=a.RTCPeerConnection.prototype.addIceCandidate;a.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?g.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())}}}},{"../utils.js":13,"./getusermedia":6}],6:[function(a,b,c){"use strict";var d=a("../utils.js"),e=d.log;b.exports=function(a){var b=d.detectBrowser(a),c=a&&a.navigator,f=function(a){if("object"!=typeof a||a.mandatory||a.optional)return a;var b={};return Object.keys(a).forEach(function(c){if("require"!==c&&"advanced"!==c&&"mediaSource"!==c){var d="object"==typeof a[c]?a[c]:{ideal:a[c]};void 0!==d.exact&&"number"==typeof d.exact&&(d.min=d.max=d.exact);var e=function(a,b){return a?a+b.charAt(0).toUpperCase()+b.slice(1):"deviceId"===b?"sourceId":b};if(void 0!==d.ideal){b.optional=b.optional||[];var f={};"number"==typeof d.ideal?(f[e("min",c)]=d.ideal,b.optional.push(f),f={},f[e("max",c)]=d.ideal,b.optional.push(f)):(f[e("",c)]=d.ideal,b.optional.push(f))}void 0!==d.exact&&"number"!=typeof d.exact?(b.mandatory=b.mandatory||{},b.mandatory[e("",c)]=d.exact):["min","max"].forEach(function(a){void 0!==d[a]&&(b.mandatory=b.mandatory||{},b.mandatory[e(a,c)]=d[a])})}}),a.advanced&&(b.optional=(b.optional||[]).concat(a.advanced)),b},g=function(a,d){if(b.version>=61)return d(a);if(a=JSON.parse(JSON.stringify(a)),a&&"object"==typeof a.audio){var g=function(a,b,c){b in a&&!(c in a)&&(a[c]=a[b],delete a[b])};a=JSON.parse(JSON.stringify(a)),g(a.audio,"autoGainControl","googAutoGainControl"),g(a.audio,"noiseSuppression","googNoiseSuppression"),a.audio=f(a.audio)}if(a&&"object"==typeof a.video){var h=a.video.facingMode;h=h&&("object"==typeof h?h:{ideal:h});var i=b.version<66;if(h&&("user"===h.exact||"environment"===h.exact||"user"===h.ideal||"environment"===h.ideal)&&(!c.mediaDevices.getSupportedConstraints||!c.mediaDevices.getSupportedConstraints().facingMode||i)){delete a.video.facingMode;var j;if("environment"===h.exact||"environment"===h.ideal?j=["back","rear"]:"user"!==h.exact&&"user"!==h.ideal||(j=["front"]),j)return c.mediaDevices.enumerateDevices().then(function(b){b=b.filter(function(a){return"videoinput"===a.kind});var c=b.find(function(a){return j.some(function(b){return a.label.toLowerCase().indexOf(b)!==-1})});return!c&&b.length&&j.indexOf("back")!==-1&&(c=b[b.length-1]),c&&(a.video.deviceId=h.exact?{exact:c.deviceId}:{ideal:c.deviceId}),a.video=f(a.video),e("chrome: "+JSON.stringify(a)),d(a)})}a.video=f(a.video)}return e("chrome: "+JSON.stringify(a)),d(a)},h=function(a){return{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[a.name]||a.name,message:a.message,constraint:a.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},i=function(a,b,d){g(a,function(a){c.webkitGetUserMedia(a,b,function(a){d&&d(h(a))})})};c.getUserMedia=i;var j=function(a){return new Promise(function(b,d){c.getUserMedia(a,b,d)})};if(c.mediaDevices||(c.mediaDevices={getUserMedia:j,enumerateDevices:function(){return new Promise(function(b){var c={audio:"audioinput",video:"videoinput"};return a.MediaStreamTrack.getSources(function(a){b(a.map(function(a){return{label:a.label,kind:c[a.kind],deviceId:a.id,groupId:""}}))})})},getSupportedConstraints:function(){return{deviceId:!0,echoCancellation:!0,facingMode:!0,frameRate:!0,height:!0,width:!0}}}),c.mediaDevices.getUserMedia){var k=c.mediaDevices.getUserMedia.bind(c.mediaDevices);c.mediaDevices.getUserMedia=function(a){return g(a,function(a){return k(a).then(function(b){if(a.audio&&!b.getAudioTracks().length||a.video&&!b.getVideoTracks().length)throw b.getTracks().forEach(function(a){a.stop()}),new DOMException("","NotFoundError");return b},function(a){return Promise.reject(h(a))})})}}else c.mediaDevices.getUserMedia=function(a){return j(a)};"undefined"==typeof c.mediaDevices.addEventListener&&(c.mediaDevices.addEventListener=function(){e("Dummy mediaDevices.addEventListener called.")}),"undefined"==typeof c.mediaDevices.removeEventListener&&(c.mediaDevices.removeEventListener=function(){e("Dummy mediaDevices.removeEventListener called.")})}},{"../utils.js":13}],7:[function(a,b,c){"use strict";var d=a("sdp"),e=a("./utils");b.exports={shimRTCIceCandidate:function(a){if(a.RTCIceCandidate&&!(a.RTCIceCandidate&&"foundation"in a.RTCIceCandidate.prototype)){var b=a.RTCIceCandidate;a.RTCIceCandidate=function(a){if("object"==typeof a&&a.candidate&&0===a.candidate.indexOf("a=")&&(a=JSON.parse(JSON.stringify(a)),a.candidate=a.candidate.substr(2)),a.candidate&&a.candidate.length){var c=new b(a),e=d.parseCandidate(a.candidate),f=Object.assign(c,e);return f.toJSON=function(){return{candidate:f.candidate,sdpMid:f.sdpMid,sdpMLineIndex:f.sdpMLineIndex,usernameFragment:f.usernameFragment}},f}return new b(a)},a.RTCIceCandidate.prototype=b.prototype,e.wrapPeerConnectionEvent(a,"icecandidate",function(b){return b.candidate&&Object.defineProperty(b,"candidate",{value:new a.RTCIceCandidate(b.candidate),writable:"false"}),b})}},shimCreateObjectURL:function(a){var b=a&&a.URL;if("object"==typeof a&&a.HTMLMediaElement&&"srcObject"in a.HTMLMediaElement.prototype&&b.createObjectURL&&b.revokeObjectURL){var c=b.createObjectURL.bind(b),d=b.revokeObjectURL.bind(b),f=new Map,g=0;b.createObjectURL=function(a){if("getTracks"in a){var b="polyblob:"+ ++g;return f.set(b,a),e.deprecated("URL.createObjectURL(stream)","elem.srcObject = stream"),b}return c(a)},b.revokeObjectURL=function(a){d(a),f["delete"](a)};var h=Object.getOwnPropertyDescriptor(a.HTMLMediaElement.prototype,"src");Object.defineProperty(a.HTMLMediaElement.prototype,"src",{get:function(){return h.get.apply(this)},set:function(a){return this.srcObject=f.get(a)||null,h.set.apply(this,[a])}});var i=a.HTMLMediaElement.prototype.setAttribute;a.HTMLMediaElement.prototype.setAttribute=function(){return 2===arguments.length&&"src"===(""+arguments[0]).toLowerCase()&&(this.srcObject=f.get(arguments[1])||null),i.apply(this,arguments)}}},shimMaxMessageSize:function(a){if(!a.RTCSctpTransport&&a.RTCPeerConnection){var b=e.detectBrowser(a);"sctp"in a.RTCPeerConnection.prototype||Object.defineProperty(a.RTCPeerConnection.prototype,"sctp",{get:function(){return"undefined"==typeof this._sctp?null:this._sctp}});var c=function(a){var b=d.splitSections(a.sdp);return b.shift(),b.some(function(a){var b=d.parseMLine(a);return b&&"application"===b.kind&&b.protocol.indexOf("SCTP")!==-1})},f=function(a){var b=a.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===b||b.length<2)return-1;var c=parseInt(b[1],10);return c!==c?-1:c},g=function(a){var c=65536;return"firefox"===b.browser&&(c=b.version<57?a===-1?16384:2147483637:57===b.version?65535:65536),c},h=function(a,c){var e=65536;"firefox"===b.browser&&57===b.version&&(e=65535);var f=d.matchPrefix(a.sdp,"a=max-message-size:");return f.length>0?e=parseInt(f[0].substr(19),10):"firefox"===b.browser&&c!==-1&&(e=2147483637),e},i=a.RTCPeerConnection.prototype.setRemoteDescription;a.RTCPeerConnection.prototype.setRemoteDescription=function(){var a=this;if(a._sctp=null,c(arguments[0])){var b,d=f(arguments[0]),e=g(d),j=h(arguments[0],d);b=0===e&&0===j?Number.POSITIVE_INFINITY:0===e||0===j?Math.max(e,j):Math.min(e,j);var k={};Object.defineProperty(k,"maxMessageSize",{get:function(){return b}}),a._sctp=k}return i.apply(a,arguments)}}},shimSendThrowTypeError:function(a){if(a.RTCPeerConnection&&"createDataChannel"in a.RTCPeerConnection.prototype){var b=a.RTCPeerConnection.prototype.createDataChannel;a.RTCPeerConnection.prototype.createDataChannel=function(){var a=this,c=b.apply(a,arguments),d=c.send;return c.send=function(){var b=this,c=arguments[0],e=c.length||c.size||c.byteLength;if(e>a.sctp.maxMessageSize)throw new DOMException("Message too large (can send a maximum of "+a.sctp.maxMessageSize+" bytes)","TypeError");return d.apply(b,arguments)},c}}}}},{"./utils":13,sdp:2}],8:[function(a,b,c){"use strict";var d=a("../utils"),e=a("rtcpeerconnection-shim");b.exports={shimGetUserMedia:a("./getusermedia"),shimPeerConnection:function(a){var b=d.detectBrowser(a);if(a.RTCIceGatherer&&(a.RTCIceCandidate||(a.RTCIceCandidate=function(a){return a}),a.RTCSessionDescription||(a.RTCSessionDescription=function(a){return a}),b.version<15025)){var c=Object.getOwnPropertyDescriptor(a.MediaStreamTrack.prototype,"enabled");Object.defineProperty(a.MediaStreamTrack.prototype,"enabled",{set:function(a){c.set.call(this,a);var b=new Event("enabled");b.enabled=a,this.dispatchEvent(b)}})}!a.RTCRtpSender||"dtmf"in a.RTCRtpSender.prototype||Object.defineProperty(a.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=new a.RTCDtmfSender(this):"video"===this.track.kind&&(this._dtmf=null)),this._dtmf}}),a.RTCDtmfSender&&!a.RTCDTMFSender&&(a.RTCDTMFSender=a.RTCDtmfSender),a.RTCPeerConnection=e(a,b.version)},shimReplaceTrack:function(a){!a.RTCRtpSender||"replaceTrack"in a.RTCRtpSender.prototype||(a.RTCRtpSender.prototype.replaceTrack=a.RTCRtpSender.prototype.setTrack)}}},{"../utils":13,"./getusermedia":9,"rtcpeerconnection-shim":1}],9:[function(a,b,c){"use strict";b.exports=function(a){var b=a&&a.navigator,c=function(a){return{name:{PermissionDeniedError:"NotAllowedError"}[a.name]||a.name,message:a.message,constraint:a.constraint,toString:function(){return this.name}}},d=b.mediaDevices.getUserMedia.bind(b.mediaDevices);b.mediaDevices.getUserMedia=function(a){return d(a)["catch"](function(a){return Promise.reject(c(a))})}}},{}],10:[function(a,b,c){"use strict";var d=a("../utils");b.exports={shimGetUserMedia:a("./getusermedia"),shimOnTrack:function(a){"object"!=typeof a||!a.RTCPeerConnection||"ontrack"in a.RTCPeerConnection.prototype||Object.defineProperty(a.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(a){this._ontrack&&(this.removeEventListener("track",this._ontrack),this.removeEventListener("addstream",this._ontrackpoly)),this.addEventListener("track",this._ontrack=a),this.addEventListener("addstream",this._ontrackpoly=function(a){a.stream.getTracks().forEach(function(b){var c=new Event("track");c.track=b,c.receiver={track:b},c.transceiver={receiver:c.receiver},c.streams=[a.stream],this.dispatchEvent(c)}.bind(this))}.bind(this))}}),"object"==typeof a&&a.RTCTrackEvent&&"receiver"in a.RTCTrackEvent.prototype&&!("transceiver"in a.RTCTrackEvent.prototype)&&Object.defineProperty(a.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},shimSourceObject:function(a){"object"==typeof a&&(!a.HTMLMediaElement||"srcObject"in a.HTMLMediaElement.prototype||Object.defineProperty(a.HTMLMediaElement.prototype,"srcObject",{get:function(){return this.mozSrcObject},set:function(a){this.mozSrcObject=a}}))},shimPeerConnection:function(a){var b=d.detectBrowser(a);if("object"==typeof a&&(a.RTCPeerConnection||a.mozRTCPeerConnection)){ -a.RTCPeerConnection||(a.RTCPeerConnection=function(c,d){if(b.version<38&&c&&c.iceServers){for(var e=[],f=0;f55&&"autoGainControl"in c.mediaDevices.getSupportedConstraints())){var l=function(a,b,c){b in a&&!(c in a)&&(a[c]=a[b],delete a[b])},m=c.mediaDevices.getUserMedia.bind(c.mediaDevices);if(c.mediaDevices.getUserMedia=function(a){return"object"==typeof a&&"object"==typeof a.audio&&(a=JSON.parse(JSON.stringify(a)),l(a.audio,"autoGainControl","mozAutoGainControl"),l(a.audio,"noiseSuppression","mozNoiseSuppression")),m(a)},f&&f.prototype.getSettings){var n=f.prototype.getSettings;f.prototype.getSettings=function(){var a=n.apply(this,arguments);return l(a,"mozAutoGainControl","autoGainControl"),l(a,"mozNoiseSuppression","noiseSuppression"),a}}if(f&&f.prototype.applyConstraints){var o=f.prototype.applyConstraints;f.prototype.applyConstraints=function(a){return"audio"===this.kind&&"object"==typeof a&&(a=JSON.parse(JSON.stringify(a)),l(a,"autoGainControl","mozAutoGainControl"),l(a,"noiseSuppression","mozNoiseSuppression")),o.apply(this,[a])}}}c.getUserMedia=function(a,e,f){return b.version<44?h(a,e,f):(d.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),void c.mediaDevices.getUserMedia(a).then(e,f))}}},{"../utils":13}],12:[function(a,b,c){"use strict";var d=a("../utils");b.exports={shimLocalStreamsAPI:function(a){if("object"==typeof a&&a.RTCPeerConnection){if("getLocalStreams"in a.RTCPeerConnection.prototype||(a.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),"getStreamById"in a.RTCPeerConnection.prototype||(a.RTCPeerConnection.prototype.getStreamById=function(a){var b=null;return this._localStreams&&this._localStreams.forEach(function(c){c.id===a&&(b=c)}),this._remoteStreams&&this._remoteStreams.forEach(function(c){c.id===a&&(b=c)}),b}),!("addStream"in a.RTCPeerConnection.prototype)){var b=a.RTCPeerConnection.prototype.addTrack;a.RTCPeerConnection.prototype.addStream=function(a){this._localStreams||(this._localStreams=[]),this._localStreams.indexOf(a)===-1&&this._localStreams.push(a);var c=this;a.getTracks().forEach(function(d){b.call(c,d,a)})},a.RTCPeerConnection.prototype.addTrack=function(a,c){return c&&(this._localStreams?this._localStreams.indexOf(c)===-1&&this._localStreams.push(c):this._localStreams=[c]),b.call(this,a,c)}}"removeStream"in a.RTCPeerConnection.prototype||(a.RTCPeerConnection.prototype.removeStream=function(a){this._localStreams||(this._localStreams=[]);var b=this._localStreams.indexOf(a);if(b!==-1){this._localStreams.splice(b,1);var c=this,d=a.getTracks();this.getSenders().forEach(function(a){d.indexOf(a.track)!==-1&&c.removeTrack(a)})}})}},shimRemoteStreamsAPI:function(a){"object"==typeof a&&a.RTCPeerConnection&&("getRemoteStreams"in a.RTCPeerConnection.prototype||(a.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),"onaddstream"in a.RTCPeerConnection.prototype||Object.defineProperty(a.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(a){var b=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=a),this.addEventListener("track",this._onaddstreampoly=function(a){a.streams.forEach(function(a){if(b._remoteStreams||(b._remoteStreams=[]),!(b._remoteStreams.indexOf(a)>=0)){b._remoteStreams.push(a);var c=new Event("addstream");c.stream=a,b.dispatchEvent(c)}})})}}))},shimCallbacksAPI:function(a){if("object"==typeof a&&a.RTCPeerConnection){var b=a.RTCPeerConnection.prototype,c=b.createOffer,d=b.createAnswer,e=b.setLocalDescription,f=b.setRemoteDescription,g=b.addIceCandidate;b.createOffer=function(a,b){var d=arguments.length>=2?arguments[2]:arguments[0],e=c.apply(this,[d]);return b?(e.then(a,b),Promise.resolve()):e},b.createAnswer=function(a,b){var c=arguments.length>=2?arguments[2]:arguments[0],e=d.apply(this,[c]);return b?(e.then(a,b),Promise.resolve()):e};var h=function(a,b,c){var d=e.apply(this,[a]);return c?(d.then(b,c),Promise.resolve()):d};b.setLocalDescription=h,h=function(a,b,c){var d=f.apply(this,[a]);return c?(d.then(b,c),Promise.resolve()):d},b.setRemoteDescription=h,h=function(a,b,c){var d=g.apply(this,[a]);return c?(d.then(b,c),Promise.resolve()):d},b.addIceCandidate=h}},shimGetUserMedia:function(a){var b=a&&a.navigator;b.getUserMedia||(b.webkitGetUserMedia?b.getUserMedia=b.webkitGetUserMedia.bind(b):b.mediaDevices&&b.mediaDevices.getUserMedia&&(b.getUserMedia=function(a,c,d){b.mediaDevices.getUserMedia(a).then(c,d)}.bind(b)))},shimRTCIceServerUrls:function(a){var b=a.RTCPeerConnection;a.RTCPeerConnection=function(a,c){if(a&&a.iceServers){for(var e=[],f=0;f=c&&parseInt(d[c],10)}function e(a,b,c){if(a.RTCPeerConnection){var d=a.RTCPeerConnection.prototype,e=d.addEventListener;d.addEventListener=function(a,d){if(a!==b)return e.apply(this,arguments);var f=function(a){d(c(a))};return this._eventMap=this._eventMap||{},this._eventMap[d]=f,e.apply(this,[a,f])};var f=d.removeEventListener;d.removeEventListener=function(a,c){if(a!==b||!this._eventMap||!this._eventMap[c])return f.apply(this,arguments);var d=this._eventMap[c];return delete this._eventMap[c],f.apply(this,[a,d])},Object.defineProperty(d,"on"+b,{get:function(){return this["_on"+b]},set:function(a){this["_on"+b]&&(this.removeEventListener(b,this["_on"+b]),delete this["_on"+b]),a&&this.addEventListener(b,this["_on"+b]=a)}})}}var f=!0,g=!0;b.exports={extractVersion:d,wrapPeerConnectionEvent:e,disableLog:function(a){return"boolean"!=typeof a?new Error("Argument type: "+typeof a+". Please use a boolean."):(f=a,a?"adapter.js logging disabled":"adapter.js logging enabled")},disableWarnings:function(a){return"boolean"!=typeof a?new Error("Argument type: "+typeof a+". Please use a boolean."):(g=!a,"adapter.js deprecation warnings "+(a?"disabled":"enabled"))},log:function(){if("object"==typeof window){if(f)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}},deprecated:function(a,b){g&&console.warn(a+" is deprecated, please use "+b+" instead.")},detectBrowser:function(a){var b=a&&a.navigator,c={};if(c.browser=null,c.version=null,"undefined"==typeof a||!a.navigator)return c.browser="Not a browser.",c;if(b.mozGetUserMedia)c.browser="firefox",c.version=d(b.userAgent,/Firefox\/(\d+)\./,1);else if(b.webkitGetUserMedia)c.browser="chrome",c.version=d(b.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(b.mediaDevices&&b.userAgent.match(/Edge\/(\d+).(\d+)$/))c.browser="edge",c.version=d(b.userAgent,/Edge\/(\d+).(\d+)$/,2);else{if(!a.RTCPeerConnection||!b.userAgent.match(/AppleWebKit\/(\d+)\./))return c.browser="Not a supported browser.",c;c.browser="safari",c.version=d(b.userAgent,/AppleWebKit\/(\d+)\./,1)}return c}}},{}]},{},[3])(3)}); \ No newline at end of file +function _typeof(e){if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(e){return typeof e}}else{_typeof=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e}}return _typeof(e)}define ("core/adapter",[],function(){return function d(c,e,t){function r(i,o){if(!e[i]){if(!c[i]){var s="function"==typeof require&&require;if(!o&&s)return s(i,!0);if(n)return n(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=e[i]={exports:{}};c[i][0].call(p.exports,function(t){var e=c[i][1][t];return r(e?e:t)},p,p.exports,d,c,e,t)}return e[i].exports}for(var n="function"==typeof require&&require,a=0;at){e.recvEncodingParameters.forEach(function(e){delete e.rtx})}if(e.recvEncodingParameters.length){i.encodings=e.recvEncodingParameters}else{i.encodings=[{}]}i.rtcp={compound:e.rtcpParameters.compound};if(e.rtcpParameters.cname){i.rtcp.cname=e.rtcpParameters.cname}if(e.sendEncodingParameters.length){i.rtcp.ssrc=e.sendEncodingParameters[0].ssrc}e.rtpReceiver.receive(i)}};l.prototype.setLocalDescription=function(e){var t=this;if(-1===["offer","answer"].indexOf(e.type)){return Promise.reject(s("TypeError","Unsupported type \""+e.type+"\""))}if(!i("setLocalDescription",e.type,t.signalingState)||t._isClosed){return Promise.reject(s("InvalidStateError","Can not set local "+e.type+" in state "+t.signalingState))}var r,a;if("offer"===e.type){r=d.splitSections(e.sdp);a=r.shift();r.forEach(function(e,r){var a=d.parseRtpParameters(e);t.transceivers[r].localCapabilities=a});t.transceivers.forEach(function(e,r){t._gather(e.mid,r)})}else if("answer"===e.type){r=d.splitSections(t.remoteDescription.sdp);a=r.shift();var o=0t){L.codecs=L.codecs.filter(function(e){return"rtx"!==e.name})}_=R.sendEncodingParameters||[{ssrc:1001*(2*s+2)}];var A=!1;if("sendrecv"===y||"sendonly"===y){A=!R.rtpReceiver;b=R.rtpReceiver||new e.RTCRtpReceiver(R.dtlsTransport,f);if(A){var G;M=b.track;if(T&&"-"===T.stream){}else if(T){if(!n[T.stream]){n[T.stream]=new e.MediaStream;Object.defineProperty(n[T.stream],"id",{get:function get(){return T.stream}})}Object.defineProperty(M,"id",{get:function get(){return T.track}});G=n[T.stream]}else{if(!n.default){n.default=new e.MediaStream}G=n.default}if(G){c(M,G);R.associatedRemoteMediaStreams.push(G)}l.push([M,b,G])}}else if(R.rtpReceiver&&R.rtpReceiver.track){R.associatedRemoteMediaStreams.forEach(function(e){var t=e.getTracks().find(function(e){return e.id===R.rtpReceiver.track.id});if(t){p(t,e)}});R.associatedRemoteMediaStreams=[]}R.localCapabilities=L;R.remoteCapabilities=I;R.rtpReceiver=b;R.rtcpParameters=j;R.sendEncodingParameters=_;R.recvEncodingParameters=x;a._transceive(a.transceivers[s],!1,A)}else if("answer"===r.type&&!C){R=a.transceivers[s];P=R.iceGatherer;E=R.iceTransport;k=R.dtlsTransport;b=R.rtpReceiver;_=R.sendEncodingParameters;L=R.localCapabilities;a.transceivers[s].recvEncodingParameters=x;a.transceivers[s].remoteCapabilities=I;a.transceivers[s].rtcpParameters=j;if(U.length&&"new"===E.state){if((h||O)&&(!v||0===s)){E.setRemoteCandidates(U)}else{U.forEach(function(e){o(R.iceTransport,e)})}}if(!v||0===s){if("new"===E.state){E.start(P,w,"controlling")}if("new"===k.state){k.start(D)}}a._transceive(R,"sendrecv"===y||"recvonly"===y,"sendrecv"===y||"sendonly"===y);if(b&&("sendrecv"===y||"sendonly"===y)){M=b.track;if(T){if(!n[T.stream]){n[T.stream]=new e.MediaStream}c(M,n[T.stream]);l.push([M,b,n[T.stream]])}else{if(!n.default){n.default=new e.MediaStream}c(M,n.default);l.push([M,b,n.default])}}else{delete R.rtpReceiver}}});if(a._dtlsRole===void 0){a._dtlsRole="offer"===r.type?"active":"passive"}a.remoteDescription={type:r.type,sdp:r.sdp};if("offer"===r.type){a._updateSignalingState("have-remote-offer")}else{a._updateSignalingState("stable")}Object.keys(n).forEach(function(t){var r=n[t];if(r.getTracks().length){if(-1===a.remoteStreams.indexOf(r)){a.remoteStreams.push(r);var i=new Event("addstream");i.stream=r;e.setTimeout(function(){a._dispatchEvent("addstream",i)})}l.forEach(function(e){var t=e[0],n=e[1];if(r.id!==e[2].id){return}m(a,t,n,[r])})}});l.forEach(function(e){if(e[2]){return}m(a,e[0],e[1],[])});e.setTimeout(function(){if(!(a&&a.transceivers)){return}a.transceivers.forEach(function(e){if(e.iceTransport&&"new"===e.iceTransport.state&&0n){e.wantReceive=!1}}else if("video"===e.kind){i--;if(0>i){e.wantReceive=!1}}});while(0t){c.codecs=c.codecs.filter(function(e){return"rtx"!==e.name})}c.codecs.forEach(function(e){if("H264"===e.name&&e.parameters["level-asymmetry-allowed"]===void 0){e.parameters["level-asymmetry-allowed"]="1"}if(r.remoteCapabilities&&r.remoteCapabilities.codecs){r.remoteCapabilities.codecs.forEach(function(t){if(e.name.toLowerCase()===t.name.toLowerCase()&&e.clockRate===t.clockRate){e.preferredPayloadType=t.payloadType}})}});c.headerExtensions.forEach(function(e){var t=r.remoteCapabilities&&r.remoteCapabilities.headerExtensions||[];t.forEach(function(t){if(e.uri===t.uri){e.id=t.id}})});var p=r.sendEncodingParameters||[{ssrc:1001*(2*n+1)}];if(i){if(15019<=t&&"video"===o&&!p[0].rtx){p[0].rtx={ssrc:p[0].ssrc+1}}}if(r.wantReceive){r.rtpReceiver=new e.RTCRtpReceiver(r.dtlsTransport,o)}r.localCapabilities=c;r.sendEncodingParameters=p});if("max-compat"!==a._config.bundlePolicy){c+="a=group:BUNDLE "+a.transceivers.map(function(e){return e.mid}).join(" ")+"\r\n"}c+="a=ice-options:trickle\r\n";a.transceivers.forEach(function(e,t){c+=r(e,e.localCapabilities,"offer",e.stream,a._dtlsRole);c+="a=rtcp-rsize\r\n";if(e.iceGatherer&&"new"!==a.iceGatheringState&&(0===t||!a.usingBundle)){e.iceGatherer.getLocalCandidates().forEach(function(e){e.component=1;c+="a="+d.writeCandidate(e)+"\r\n"});if("completed"===e.iceGatherer.state){c+="a=end-of-candidates\r\n"}}});var p=new e.RTCSessionDescription({type:"offer",sdp:c});return Promise.resolve(p)};l.prototype.createAnswer=function(){var a=this;if(a._isClosed){return Promise.reject(s("InvalidStateError","Can not call createAnswer after close"))}if(!("have-remote-offer"===a.signalingState||"have-local-pranswer"===a.signalingState)){return Promise.reject(s("InvalidStateError","Can not call createAnswer in signalingState "+a.signalingState))}var i=d.writeSessionBoilerplate(a._sdpSessionId,a._sdpSessionVersion++);if(a.usingBundle){i+="a=group:BUNDLE "+a.transceivers.map(function(e){return e.mid}).join(" ")+"\r\n"}var o=d.getMediaSections(a.remoteDescription.sdp).length;a.transceivers.forEach(function(e,s){if(s+1>o){return}if(e.rejected){if("application"===e.kind){i+="m=application 0 DTLS/SCTP 5000\r\n"}else if("audio"===e.kind){i+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\na=rtpmap:0 PCMU/8000\r\n"}else if("video"===e.kind){i+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\na=rtpmap:120 VP8/90000\r\n"}i+="c=IN IP4 0.0.0.0\r\na=inactive\r\na=mid:"+e.mid+"\r\n";return}if(e.stream){var d;if("audio"===e.kind){d=e.stream.getAudioTracks()[0]}else if("video"===e.kind){d=e.stream.getVideoTracks()[0]}if(d){if(15019<=t&&"video"===e.kind&&!e.sendEncodingParameters[0].rtx){e.sendEncodingParameters[0].rtx={ssrc:e.sendEncodingParameters[0].ssrc+1}}}}var c=n(e.localCapabilities,e.remoteCapabilities),p=c.codecs.filter(function(e){return"rtx"===e.name.toLowerCase()}).length;if(!p&&e.sendEncodingParameters[0].rtx){delete e.sendEncodingParameters[0].rtx}i+=r(e,c,"answer",e.stream,a._dtlsRole);if(e.rtcpParameters&&e.rtcpParameters.reducedSize){i+="a=rtcp-rsize\r\n"}});var c=new e.RTCSessionDescription({type:"answer",sdp:i});return Promise.resolve(c)};l.prototype.addIceCandidate=function(e){var t=this,r;if(e&&!(e.sdpMLineIndex!==void 0||e.sdpMid)){return Promise.reject(new TypeError("sdpMLineIndex or sdpMid required"))}return new Promise(function(a,n){if(!t.remoteDescription){return n(s("InvalidStateError","Can not add ICE candidate without a remote description"))}else if(!e||""===e.candidate){for(var c=0;cn){n=e.maxptime}});if(0t.version){["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){var r=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=function(){var e=arguments,t=this,a=new Promise(function(a,n){r.apply(t,[e[0],a,n])});if(2>e.length){return a}return a.then(function(){e[1].apply(null,[])},function(t){if(3<=e.length){e[2].apply(null,[t])}})}})}if(52>t.version){["createOffer","createAnswer"].forEach(function(t){var r=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=function(){var e=this;if(1>arguments.length||1===arguments.length&&"object"===_typeof(arguments[0])){var t=1===arguments.length?arguments[0]:void 0;return new Promise(function(a,n){r.apply(e,[a,n,t])})}return r.apply(this,arguments)}})}["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){var r=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=function(){arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]);return r.apply(this,arguments)}});var o=e.RTCPeerConnection.prototype.addIceCandidate;e.RTCPeerConnection.prototype.addIceCandidate=function(){if(!arguments[0]){if(arguments[1]){arguments[1].apply(null)}return Promise.resolve()}return o.apply(this,arguments)}}}},{"../utils.js":13,"./getusermedia":6}],6:[function(e,t){'use strict';var r=e("../utils.js"),a=r.log;t.exports=function(e){var t=r.detectBrowser(e),n=e&&e.navigator,i=function(e){if("object"!==_typeof(e)||e.mandatory||e.optional){return e}var t={};Object.keys(e).forEach(function(a){if("require"===a||"advanced"===a||"mediaSource"===a){return}var n="object"===_typeof(e[a])?e[a]:{ideal:e[a]};if(n.exact!==void 0&&"number"==typeof n.exact){n.min=n.max=n.exact}var r=function(e,t){if(e){return e+t.charAt(0).toUpperCase()+t.slice(1)}return"deviceId"===t?"sourceId":t};if(n.ideal!==void 0){t.optional=t.optional||[];var i={};if("number"==typeof n.ideal){i[r("min",a)]=n.ideal;t.optional.push(i);i={};i[r("max",a)]=n.ideal;t.optional.push(i)}else{i[r("",a)]=n.ideal;t.optional.push(i)}}if(n.exact!==void 0&&"number"!=typeof n.exact){t.mandatory=t.mandatory||{};t.mandatory[r("",a)]=n.exact}else{["min","max"].forEach(function(e){if(n[e]!==void 0){t.mandatory=t.mandatory||{};t.mandatory[r(e,a)]=n[e]}})}});if(e.advanced){t.optional=(t.optional||[]).concat(e.advanced)}return t},o=function(e,r){if(61<=t.version){return r(e)}e=JSON.parse(JSON.stringify(e));if(e&&"object"===_typeof(e.audio)){var o=function(e,t,r){if(t in e&&!(r in e)){e[r]=e[t];delete e[t]}};e=JSON.parse(JSON.stringify(e));o(e.audio,"autoGainControl","googAutoGainControl");o(e.audio,"noiseSuppression","googNoiseSuppression");e.audio=i(e.audio)}if(e&&"object"===_typeof(e.video)){var s=e.video.facingMode;s=s&&("object"===_typeof(s)?s:{ideal:s});var d=66>t.version;if(s&&("user"===s.exact||"environment"===s.exact||"user"===s.ideal||"environment"===s.ideal)&&!(n.mediaDevices.getSupportedConstraints&&n.mediaDevices.getSupportedConstraints().facingMode&&!d)){delete e.video.facingMode;var c;if("environment"===s.exact||"environment"===s.ideal){c=["back","rear"]}else if("user"===s.exact||"user"===s.ideal){c=["front"]}if(c){return n.mediaDevices.enumerateDevices().then(function(t){t=t.filter(function(e){return"videoinput"===e.kind});var n=t.find(function(e){return c.some(function(t){return-1!==e.label.toLowerCase().indexOf(t)})});if(!n&&t.length&&-1!==c.indexOf("back")){n=t[t.length-1]}if(n){e.video.deviceId=s.exact?{exact:n.deviceId}:{ideal:n.deviceId}}e.video=i(e.video);a("chrome: "+JSON.stringify(e));return r(e)})}}e.video=i(e.video)}a("chrome: "+JSON.stringify(e));return r(e)},s=function(t){return{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[t.name]||t.name,message:t.message,constraint:t.constraintName,toString:function toString(){return this.name+(this.message&&": ")+this.message}}};n.getUserMedia=function getUserMedia_(e,t,r){o(e,function(e){n.webkitGetUserMedia(e,t,function(t){if(r){r(s(t))}})})};var d=function(e){return new Promise(function(t,r){n.getUserMedia(e,t,r)})};if(!n.mediaDevices){n.mediaDevices={getUserMedia:d,enumerateDevices:function enumerateDevices(){return new Promise(function(t){var r={audio:"audioinput",video:"videoinput"};return e.MediaStreamTrack.getSources(function(e){t(e.map(function(e){return{label:e.label,kind:r[e.kind],deviceId:e.id,groupId:""}}))})})},getSupportedConstraints:function getSupportedConstraints(){return{deviceId:!0,echoCancellation:!0,facingMode:!0,frameRate:!0,height:!0,width:!0}}}}if(!n.mediaDevices.getUserMedia){n.mediaDevices.getUserMedia=function(e){return d(e)}}else{var p=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return o(e,function(e){return p(e).then(function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length){t.getTracks().forEach(function(e){e.stop()});throw new DOMException("","NotFoundError")}return t},function(t){return Promise.reject(s(t))})})}}if("undefined"==typeof n.mediaDevices.addEventListener){n.mediaDevices.addEventListener=function(){a("Dummy mediaDevices.addEventListener called.")}}if("undefined"==typeof n.mediaDevices.removeEventListener){n.mediaDevices.removeEventListener=function(){a("Dummy mediaDevices.removeEventListener called.")}}}},{"../utils.js":13}],7:[function(e,t){'use strict';var r=e("sdp"),a=e("./utils");t.exports={shimRTCIceCandidate:function shimRTCIceCandidate(t){if(!t.RTCIceCandidate||t.RTCIceCandidate&&"foundation"in t.RTCIceCandidate.prototype){return}var n=t.RTCIceCandidate;t.RTCIceCandidate=function(e){if("object"===_typeof(e)&&e.candidate&&0===e.candidate.indexOf("a=")){e=JSON.parse(JSON.stringify(e));e.candidate=e.candidate.substr(2)}if(e.candidate&&e.candidate.length){var t=new n(e),a=r.parseCandidate(e.candidate),i=Object.assign(t,a);i.toJSON=function(){return{candidate:i.candidate,sdpMid:i.sdpMid,sdpMLineIndex:i.sdpMLineIndex,usernameFragment:i.usernameFragment}};return i}return new n(e)};t.RTCIceCandidate.prototype=n.prototype;a.wrapPeerConnectionEvent(t,"icecandidate",function(r){if(r.candidate){Object.defineProperty(r,"candidate",{value:new t.RTCIceCandidate(r.candidate),writable:"false"})}return r})},shimCreateObjectURL:function shimCreateObjectURL(e){var t=e&&e.URL;if(!("object"===_typeof(e)&&e.HTMLMediaElement&&"srcObject"in e.HTMLMediaElement.prototype&&t.createObjectURL&&t.revokeObjectURL)){return}var r=t.createObjectURL.bind(t),n=t.revokeObjectURL.bind(t),i=new Map,o=0;t.createObjectURL=function(e){if("getTracks"in e){var t="polyblob:"+ ++o;i.set(t,e);a.deprecated("URL.createObjectURL(stream)","elem.srcObject = stream");return t}return r(e)};t.revokeObjectURL=function(e){n(e);i.delete(e)};var s=Object.getOwnPropertyDescriptor(e.HTMLMediaElement.prototype,"src");Object.defineProperty(e.HTMLMediaElement.prototype,"src",{get:function get(){return s.get.apply(this)},set:function set(e){this.srcObject=i.get(e)||null;return s.set.apply(this,[e])}});var d=e.HTMLMediaElement.prototype.setAttribute;e.HTMLMediaElement.prototype.setAttribute=function(){if(2===arguments.length&&"src"===(""+arguments[0]).toLowerCase()){this.srcObject=i.get(arguments[1])||null}return d.apply(this,arguments)}},shimMaxMessageSize:function shimMaxMessageSize(e){if(e.RTCSctpTransport||!e.RTCPeerConnection){return}var t=a.detectBrowser(e);if(!("sctp"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get:function get(){return"undefined"==typeof this._sctp?null:this._sctp}})}var n=function(e){var t=r.splitSections(e.sdp);t.shift();return t.some(function(e){var t=r.parseMLine(e);return t&&"application"===t.kind&&-1!==t.protocol.indexOf("SCTP")})},i=function(e){var t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||2>t.length){return-1}var r=parseInt(t[1],10);return r!==r?-1:r},o=function(e){var r=65536;if("firefox"===t.browser){if(57>t.version){if(-1===e){r=16384}else{r=2147483637}}else{r=57===t.version?65535:65536}}return r},s=function(e,a){var n=65536;if("firefox"===t.browser&&57===t.version){n=65535}var i=r.matchPrefix(e.sdp,"a=max-message-size:");if(0e.sctp.maxMessageSize){throw new DOMException("Message too large (can send a maximum of "+e.sctp.maxMessageSize+" bytes)","TypeError")}return a.apply(t,arguments)};return r}}}},{"./utils":13,sdp:2}],8:[function(e,t){'use strict';var r=e("../utils"),a=e("rtcpeerconnection-shim");t.exports={shimGetUserMedia:e("./getusermedia"),shimPeerConnection:function shimPeerConnection(e){var t=r.detectBrowser(e);if(e.RTCIceGatherer){if(!e.RTCIceCandidate){e.RTCIceCandidate=function(e){return e}}if(!e.RTCSessionDescription){e.RTCSessionDescription=function(e){return e}}if(15025>t.version){var n=Object.getOwnPropertyDescriptor(e.MediaStreamTrack.prototype,"enabled");Object.defineProperty(e.MediaStreamTrack.prototype,"enabled",{set:function set(e){n.set.call(this,e);var t=new Event("enabled");t.enabled=e;this.dispatchEvent(t)}})}}if(e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get:function get(){if(this._dtmf===void 0){if("audio"===this.track.kind){this._dtmf=new e.RTCDtmfSender(this)}else if("video"===this.track.kind){this._dtmf=null}}return this._dtmf}})}if(e.RTCDtmfSender&&!e.RTCDTMFSender){e.RTCDTMFSender=e.RTCDtmfSender}e.RTCPeerConnection=a(e,t.version)},shimReplaceTrack:function shimReplaceTrack(e){if(e.RTCRtpSender&&!("replaceTrack"in e.RTCRtpSender.prototype)){e.RTCRtpSender.prototype.replaceTrack=e.RTCRtpSender.prototype.setTrack}}}},{"../utils":13,"./getusermedia":9,"rtcpeerconnection-shim":1}],9:[function(e,t){'use strict';t.exports=function(e){var t=e&&e.navigator,r=function(t){return{name:{PermissionDeniedError:"NotAllowedError"}[t.name]||t.name,message:t.message,constraint:t.constraint,toString:function toString(){return this.name}}},a=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(e){return a(e).catch(function(t){return Promise.reject(r(t))})}}},{}],10:[function(e,t){'use strict';var r=e("../utils");t.exports={shimGetUserMedia:e("./getusermedia"),shimOnTrack:function shimOnTrack(e){if("object"===_typeof(e)&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get:function get(){return this._ontrack},set:function set(e){if(this._ontrack){this.removeEventListener("track",this._ontrack);this.removeEventListener("addstream",this._ontrackpoly)}this.addEventListener("track",this._ontrack=e);this.addEventListener("addstream",this._ontrackpoly=function(t){t.stream.getTracks().forEach(function(e){var r=new Event("track");r.track=e;r.receiver={track:e};r.transceiver={receiver:r.receiver};r.streams=[t.stream];this.dispatchEvent(r)}.bind(this))}.bind(this))}})}if("object"===_typeof(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)){Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function get(){return{receiver:this.receiver}}})}},shimSourceObject:function shimSourceObject(e){if("object"===_typeof(e)){if(e.HTMLMediaElement&&!("srcObject"in e.HTMLMediaElement.prototype)){Object.defineProperty(e.HTMLMediaElement.prototype,"srcObject",{get:function get(){return this.mozSrcObject},set:function set(e){this.mozSrcObject=e}})}}},shimPeerConnection:function shimPeerConnection(e){var t=r.detectBrowser(e);if("object"!==_typeof(e)||!(e.RTCPeerConnection||e.mozRTCPeerConnection)){return}if(!e.RTCPeerConnection){e.RTCPeerConnection=function(r,a){if(38>t.version){if(r&&r.iceServers){for(var n=[],o=0,s;ot.version){a=n(a)}if(53>t.version&&!r){try{a.forEach(function(e){e.type=o[e.type]||e.type})}catch(t){if("TypeError"!==t.name){throw t}a.forEach(function(e,t){a.set(t,Object.assign({},e,{type:o[e.type]||e.type}))})}}return a}).then(r,a)}},shimRemoveStream:function shimRemoveStream(e){if(!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype){return}e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;r.deprecated("removeStream","removeTrack");this.getSenders().forEach(function(r){if(r.track&&-1!==e.getTracks().indexOf(r.track)){t.removeTrack(r)}})}}}},{"../utils":13,"./getusermedia":11}],11:[function(e,t){'use strict';var r=e("../utils"),a=r.log;t.exports=function(e){var t=r.detectBrowser(e),n=e&&e.navigator,i=e&&e.MediaStreamTrack,o=function(t){return{name:{InternalError:"NotReadableError",NotSupportedError:"TypeError",PermissionDeniedError:"NotAllowedError",SecurityError:"NotAllowedError"}[t.name]||t.name,message:{"The operation is insecure.":"The request is not allowed by the user agent or the platform in the current context."}[t.message]||t.message,constraint:t.constraint,toString:function toString(){return this.name+(this.message&&": ")+this.message}}},s=function(e,r,i){var s=function(e){if("object"!==_typeof(e)||e.require){return e}var t=[];Object.keys(e).forEach(function(a){if("require"===a||"advanced"===a||"mediaSource"===a){return}var n=e[a]="object"===_typeof(e[a])?e[a]:{ideal:e[a]};if(n.min!==void 0||n.max!==void 0||n.exact!==void 0){t.push(a)}if(n.exact!==void 0){if("number"==typeof n.exact){n.min=n.max=n.exact}else{e[a]=n.exact}delete n.exact}if(n.ideal!==void 0){e.advanced=e.advanced||[];var r={};if("number"==typeof n.ideal){r[a]={min:n.ideal,max:n.ideal}}else{r[a]=n.ideal}e.advanced.push(r);delete n.ideal;if(!Object.keys(n).length){delete e[a]}}});if(t.length){e.require=t}return e};e=JSON.parse(JSON.stringify(e));if(38>t.version){a("spec: "+JSON.stringify(e));if(e.audio){e.audio=s(e.audio)}if(e.video){e.video=s(e.video)}a("ff37: "+JSON.stringify(e))}return n.mozGetUserMedia(e,r,function(t){i(o(t))})},d=function(e){return new Promise(function(t,r){s(e,t,r)})};if(!n.mediaDevices){n.mediaDevices={getUserMedia:d,addEventListener:function addEventListener(){},removeEventListener:function removeEventListener(){}}}n.mediaDevices.enumerateDevices=n.mediaDevices.enumerateDevices||function(){return new Promise(function(e){e([{kind:"audioinput",deviceId:"default",label:"",groupId:""},{kind:"videoinput",deviceId:"default",label:"",groupId:""}])})};if(41>t.version){var c=n.mediaDevices.enumerateDevices.bind(n.mediaDevices);n.mediaDevices.enumerateDevices=function(){return c().then(void 0,function(t){if("NotFoundError"===t.name){return[]}throw t})}}if(49>t.version){var p=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return p(e).then(function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length){t.getTracks().forEach(function(e){e.stop()});throw new DOMException("The object can not be found here.","NotFoundError")}return t},function(t){return Promise.reject(o(t))})}}if(!(55t.version){return s(e,a,i)}r.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia");n.mediaDevices.getUserMedia(e).then(a,i)}}},{"../utils":13}],12:[function(e,t){'use strict';var r=e("../utils");t.exports={shimLocalStreamsAPI:function shimLocalStreamsAPI(e){if("object"!==_typeof(e)||!e.RTCPeerConnection){return}if(!("getLocalStreams"in e.RTCPeerConnection.prototype)){e.RTCPeerConnection.prototype.getLocalStreams=function(){if(!this._localStreams){this._localStreams=[]}return this._localStreams}}if(!("getStreamById"in e.RTCPeerConnection.prototype)){e.RTCPeerConnection.prototype.getStreamById=function(e){var t=null;if(this._localStreams){this._localStreams.forEach(function(r){if(r.id===e){t=r}})}if(this._remoteStreams){this._remoteStreams.forEach(function(r){if(r.id===e){t=r}})}return t}}if(!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){if(!this._localStreams){this._localStreams=[]}if(-1===this._localStreams.indexOf(e)){this._localStreams.push(e)}var r=this;e.getTracks().forEach(function(a){t.call(r,a,e)})};e.RTCPeerConnection.prototype.addTrack=function(e,r){if(r){if(!this._localStreams){this._localStreams=[r]}else if(-1===this._localStreams.indexOf(r)){this._localStreams.push(r)}}return t.call(this,e,r)}}if(!("removeStream"in e.RTCPeerConnection.prototype)){e.RTCPeerConnection.prototype.removeStream=function(e){if(!this._localStreams){this._localStreams=[]}var t=this._localStreams.indexOf(e);if(-1===t){return}this._localStreams.splice(t,1);var r=this,a=e.getTracks();this.getSenders().forEach(function(e){if(-1!==a.indexOf(e.track)){r.removeTrack(e)}})}}},shimRemoteStreamsAPI:function shimRemoteStreamsAPI(e){if("object"!==_typeof(e)||!e.RTCPeerConnection){return}if(!("getRemoteStreams"in e.RTCPeerConnection.prototype)){e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}}if(!("onaddstream"in e.RTCPeerConnection.prototype)){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get:function get(){return this._onaddstream},set:function set(e){var t=this;if(this._onaddstream){this.removeEventListener("addstream",this._onaddstream);this.removeEventListener("track",this._onaddstreampoly)}this.addEventListener("addstream",this._onaddstream=e);this.addEventListener("track",this._onaddstreampoly=function(r){r.streams.forEach(function(e){if(!t._remoteStreams){t._remoteStreams=[]}if(0<=t._remoteStreams.indexOf(e)){return}t._remoteStreams.push(e);var r=new Event("addstream");r.stream=e;t.dispatchEvent(r)})})}})}},shimCallbacksAPI:function shimCallbacksAPI(e){if("object"!==_typeof(e)||!e.RTCPeerConnection){return}var t=e.RTCPeerConnection.prototype,r=t.createOffer,a=t.createAnswer,n=t.setLocalDescription,i=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){var a=2<=arguments.length?arguments[2]:arguments[0],n=r.apply(this,[a]);if(!t){return n}n.then(e,t);return Promise.resolve()};t.createAnswer=function(e,t){var r=2<=arguments.length?arguments[2]:arguments[0],n=a.apply(this,[r]);if(!t){return n}n.then(e,t);return Promise.resolve()};var s=function(e,t,r){var a=n.apply(this,[e]);if(!r){return a}a.then(t,r);return Promise.resolve()};t.setLocalDescription=s;s=function(e,t,r){var a=i.apply(this,[e]);if(!r){return a}a.then(t,r);return Promise.resolve()};t.setRemoteDescription=s;s=function(e,t,r){var a=o.apply(this,[e]);if(!r){return a}a.then(t,r);return Promise.resolve()};t.addIceCandidate=s},shimGetUserMedia:function shimGetUserMedia(e){var t=e&&e.navigator;if(!t.getUserMedia){if(t.webkitGetUserMedia){t.getUserMedia=t.webkitGetUserMedia.bind(t)}else if(t.mediaDevices&&t.mediaDevices.getUserMedia){t.getUserMedia=function(e,r,a){t.mediaDevices.getUserMedia(e).then(r,a)}.bind(t)}}},shimRTCIceServerUrls:function shimRTCIceServerUrls(e){var t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,a){if(e&&e.iceServers){for(var n=[],o=0,s;o=r&&parseInt(a[r],10)}t.exports={extractVersion:r,wrapPeerConnectionEvent:function(e,t,r){if(!e.RTCPeerConnection){return}var a=e.RTCPeerConnection.prototype,n=a.addEventListener;a.addEventListener=function(e,a){if(e!==t){return n.apply(this,arguments)}var i=function(t){a(r(t))};this._eventMap=this._eventMap||{};this._eventMap[a]=i;return n.apply(this,[e,i])};var i=a.removeEventListener;a.removeEventListener=function(e,r){if(e!==t||!this._eventMap||!this._eventMap[r]){return i.apply(this,arguments)}var a=this._eventMap[r];delete this._eventMap[r];return i.apply(this,[e,a])};Object.defineProperty(a,"on"+t,{get:function get(){return this["_on"+t]},set:function set(e){if(this["_on"+t]){this.removeEventListener(t,this["_on"+t]);delete this["_on"+t]}if(e){this.addEventListener(t,this["_on"+t]=e)}}})},disableLog:function disableLog(e){if("boolean"!=typeof e){return new Error("Argument type: "+_typeof(e)+". Please use a boolean.")}a=e;return e?"adapter.js logging disabled":"adapter.js logging enabled"},disableWarnings:function disableWarnings(e){if("boolean"!=typeof e){return new Error("Argument type: "+_typeof(e)+". Please use a boolean.")}n=!e;return"adapter.js deprecation warnings "+(e?"disabled":"enabled")},log:function log(){if("object"===("undefined"==typeof window?"undefined":_typeof(window))){if(a){return}if("undefined"!=typeof console&&"function"==typeof console.log){console.log.apply(console,arguments)}}},deprecated:function deprecated(e,t){if(!n){return}console.warn(e+" is deprecated, please use "+t+" instead.")},detectBrowser:function detectBrowser(e){var t=e&&e.navigator,a={};a.browser=null;a.version=null;if("undefined"==typeof e||!e.navigator){a.browser="Not a browser.";return a}if(t.mozGetUserMedia){a.browser="firefox";a.version=r(t.userAgent,/Firefox\/(\d+)\./,1)}else if(t.webkitGetUserMedia){a.browser="chrome";a.version=r(t.userAgent,/Chrom(e|ium)\/(\d+)\./,2)}else if(t.mediaDevices&&t.userAgent.match(/Edge\/(\d+).(\d+)$/)){a.browser="edge";a.version=r(t.userAgent,/Edge\/(\d+).(\d+)$/,2)}else if(e.RTCPeerConnection&&t.userAgent.match(/AppleWebKit\/(\d+)\./)){a.browser="safari";a.version=r(t.userAgent,/AppleWebKit\/(\d+)\./,1)}else{a.browser="Not a supported browser.";return a}return a}}},{}]},{},[3])(3)}); +//# sourceMappingURL=adapter.min.js.map diff --git a/lib/amd/build/adapter.min.js.map b/lib/amd/build/adapter.min.js.map new file mode 100644 index 0000000000000..abfd827a5783d --- /dev/null +++ b/lib/amd/build/adapter.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/adapter.js"],"names":["define","e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","module","SDPUtils","writeMediaSection","transceiver","caps","type","stream","dtlsRole","sdp","writeRtpDescription","kind","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","trackId","_initialTrackId","track","id","msid","sendEncodingParameters","ssrc","rtx","localCName","filterIceServers","iceServers","edgeVersion","hasTurn","JSON","parse","stringify","filter","server","urls","url","console","warn","isString","validTurn","indexOf","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","parseInt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","name","toLowerCase","forEach","clockRate","numChannels","Math","min","push","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","find","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","description","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","OperationError","window","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","removeTrackFromStreamAndFireEvent","removeTrack","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","localDescription","remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","prototype","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","sender","stop","map","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","shift","Object","defineProperty","value","writable","bufferedCandidateEvents","bufferCandidates","end","keys","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","assign","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","Promise","reject","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","resolve","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","RTCRtpReceiver","getCapabilities","codec","isNewTrack","MediaStream","get","default","nativeTrack","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","hasRtx","c","reducedSize","addIceCandidate","candidateString","trim","getStats","promises","fixStatsType","stat","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","results","Map","all","then","res","result","set","methods","nativeMethod","args","apply","error","random","toString","blob","line","parts","part","index","prefix","substring","relatedAddress","relatedPort","tcpType","toUpperCase","parseIceOptions","parseRtpMap","parsed","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseFingerprint","algorithm","fingerprints","setupType","fp","concat","iceParameters","password","mline","rtpmapline","fmtps","maxptime","extension","encodingParameters","hasRed","hasUlpfec","ssrcs","primarySsrc","secondarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","obj","rsize","mux","spec","planB","sessId","sessVer","sessionId","version","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","address","global","adapterFactory","self","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","adapter","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimReplaceTrack","shimRTCIceServerUrls","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimCreateOfferLegacy","webkitMediaStream","_ontrack","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","dtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","DOMException","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","oldStream","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","isLegacyCall","err","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","OrigPeerConnection","newIceServers","deprecated","origGetStats","selector","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","stats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","navigator","constraintsToChrome_","cc","ideal","exact","max","oldname_","charAt","oc","mix","advanced","shimConstraints_","constraints","func","audio","remap","b","video","face","facingMode","getSupportedFacingModeLies","mediaDevices","getSupportedConstraints","matches","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","getUserMedia_","onSuccess","onError","webkitGetUserMedia","getUserMediaPromise_","kinds","MediaStreamTrack","getSources","device","groupId","echoCancellation","frameRate","height","width","origGetUserMedia","cs","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","origDataChannelSend","dc","data","size","byteLength","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","replaceTrack","setTrack","catch","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","InternalError","SecurityError","constraintsToFF37_","mozGetUserMedia","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent"],"mappings":"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","sourcesContent":["/**\n * Description of import/upgrade into Moodle:\n *\n * 1. Visit https://github.com/webrtc/adapter/releases.\n * 2. Check if the version has been updated from what is listed in lib/thirdpartylibs.xml in the Moodle wwwroot.\n * 3. If it has -\n * 1. Download the source code.\n * 2. Copy the content of the file release/adapter.js from the archive (ignore the first line).\n * 3. Replace the content below \"return (function e(t,n,r) ..\" in this file with the content you copied.\n * 4. Ensure to update lib/thirdpartylibs.xml with any changes.\n */\n\n// ESLint directives.\n/* eslint-disable */\n\n// JSHint directives.\n/* jshint ignore:start */\n\ndefine([], function() {\nreturn (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldÑ• are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this.localDescription = null;\n this.remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // Ñ•dpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc.localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc.localDescription.sdp =\n SDPUtils.getDescription(pc.localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc.remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc.localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if ((kind === 'application' && protocol === 'DTLS/SCTP') || rejected) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc.remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\nif (transceiver.iceGatherer) {\ntransceiver.iceGatherer.close();\n}\n*/\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n states[transceiver.iceTransport.state]++;\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc.remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc.remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc.remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc.remoteDescription.sdp =\n SDPUtils.getDescription(pc.remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc.remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc.remoteDescription.sdp =\n SDPUtils.getDescription(pc.remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function() {\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n var fixStatsType = function(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n };\n return new Promise(function(resolve) {\n // shim getStats with maplike support\n var results = new Map();\n Promise.all(promises).then(function(res) {\n res.forEach(function(result) {\n Object.keys(result).forEach(function(id) {\n result[id].type = fixStatsType(result[id]);\n results.set(id, result[id]);\n });\n });\n resolve(results);\n });\n });\n };\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n\n},{\"sdp\":2}],2:[function(require,module,exports){\n/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress); // was: relAddr\n sdp.push('rport');\n sdp.push(candidate.relatedPort); // was: relPort\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n}\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n // was: channels\n parsed.numChannels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (codec.numChannels !== 1 ? '/' + codec.numChannels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n params.push(param + '=' + codec.parameters[param]);\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n}\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.splitLines(mediaSection);\n // Search in session part, too.\n lines = lines.concat(SDPUtils.splitLines(sessionpart));\n var iceParameters = {\n usernameFragment: lines.filter(function(line) {\n return line.indexOf('a=ice-ufrag:') === 0;\n })[0].substr(12),\n password: lines.filter(function(line) {\n return line.indexOf('a=ice-pwd:') === 0;\n })[0].substr(10)\n };\n return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.split(' ');\n parts.shift();\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n rtx: {\n ssrc: secondarySsrc\n }\n };\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: secondarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n var cname;\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrÑ–bute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=thisisadapterortc ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n}\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n\n},{}],3:[function(require,module,exports){\n(function (global){\n /*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n /* eslint-env node */\n\n 'use strict';\n\n var adapterFactory = require('./adapter_factory.js');\n module.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":4}],4:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n\n'use strict';\n\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n var window = dependencies && dependencies.window;\n\n var options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n };\n\n for (var key in opts) {\n if (hasOwnProperty.call(opts, key)) {\n options[key] = opts[key];\n }\n }\n\n // Utils.\n var logging = utils.log;\n var browserDetails = utils.detectBrowser(window);\n\n // Uncomment the line below if you want logging to occur, including logging\n // for the switch statement below. Can also be turned on in the browser via\n // adapter.disableLog(false), but then logging from the switch statement below\n // will not appear.\n // require('./utils').disableLog(false);\n\n // Browser shims.\n var chromeShim = require('./chrome/chrome_shim') || null;\n var edgeShim = require('./edge/edge_shim') || null;\n var firefoxShim = require('./firefox/firefox_shim') || null;\n var safariShim = require('./safari/safari_shim') || null;\n var commonShim = require('./common_shim') || null;\n\n // Export to the adapter global object visible in the browser.\n var adapter = {\n browserDetails: browserDetails,\n commonShim: commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n commonShim.shimCreateObjectURL(window);\n\n chromeShim.shimGetUserMedia(window);\n chromeShim.shimMediaStream(window);\n chromeShim.shimSourceObject(window);\n chromeShim.shimPeerConnection(window);\n chromeShim.shimOnTrack(window);\n chromeShim.shimAddTrackRemoveTrack(window);\n chromeShim.shimGetSendersWithDtmf(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n commonShim.shimCreateObjectURL(window);\n\n firefoxShim.shimGetUserMedia(window);\n firefoxShim.shimSourceObject(window);\n firefoxShim.shimPeerConnection(window);\n firefoxShim.shimOnTrack(window);\n firefoxShim.shimRemoveStream(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n commonShim.shimCreateObjectURL(window);\n\n edgeShim.shimGetUserMedia(window);\n edgeShim.shimPeerConnection(window);\n edgeShim.shimReplaceTrack(window);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n commonShim.shimCreateObjectURL(window);\n\n safariShim.shimRTCIceServerUrls(window);\n safariShim.shimCallbacksAPI(window);\n safariShim.shimLocalStreamsAPI(window);\n safariShim.shimRemoteStreamsAPI(window);\n safariShim.shimTrackEventTransceiver(window);\n safariShim.shimGetUserMedia(window);\n safariShim.shimCreateOfferLegacy(window);\n\n commonShim.shimRTCIceCandidate(window);\n commonShim.shimMaxMessageSize(window);\n commonShim.shimSendThrowTypeError(window);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n};\n\n},{\"./chrome/chrome_shim\":5,\"./common_shim\":7,\"./edge/edge_shim\":8,\"./firefox/firefox_shim\":10,\"./safari/safari_shim\":12,\"./utils\":13}],5:[function(require,module,exports){\n\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimMediaStream: function(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n },\n\n shimOnTrack: function(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function() {\n return this._ontrack;\n },\n set: function(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n }\n });\n var origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n var pc = this;\n if (!pc._ontrackpoly) {\n pc._ontrackpoly = function(e) {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', function(te) {\n var receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = pc.getReceivers().find(function(r) {\n return r.track && r.track.id === te.track.id;\n });\n } else {\n receiver = {track: te.track};\n }\n\n var event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver: receiver};\n event.streams = [e.stream];\n pc.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(function(track) {\n var receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = pc.getReceivers().find(function(r) {\n return r.track && r.track.id === track.id;\n });\n } else {\n receiver = {track: track};\n }\n var event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver: receiver};\n event.streams = [e.stream];\n pc.dispatchEvent(event);\n });\n };\n pc.addEventListener('addstream', pc._ontrackpoly);\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n } else if (!('RTCRtpTransceiver' in window)) {\n utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n if (!e.transceiver) {\n e.transceiver = {receiver: e.receiver};\n }\n return e;\n });\n }\n },\n\n shimGetSendersWithDtmf: function(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n var shimSenderWithDtmf = function(pc, track) {\n return {\n track: track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n var pc = this;\n var sender = origAddTrack.apply(pc, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(pc, track);\n pc._senders.push(sender);\n }\n return sender;\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n origRemoveTrack.apply(pc, arguments);\n var idx = pc._senders.indexOf(sender);\n if (idx !== -1) {\n pc._senders.splice(idx, 1);\n }\n };\n }\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n pc._senders = pc._senders || [];\n origAddStream.apply(pc, [stream]);\n stream.getTracks().forEach(function(track) {\n pc._senders.push(shimSenderWithDtmf(pc, track));\n });\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n pc._senders = pc._senders || [];\n origRemoveStream.apply(pc, [stream]);\n\n stream.getTracks().forEach(function(track) {\n var sender = pc._senders.find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function() {\n var pc = this;\n var senders = origGetSenders.apply(pc, []);\n senders.forEach(function(sender) {\n sender._pc = pc;\n });\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n },\n\n shimSourceObject: function(window) {\n var URL = window && window.URL;\n\n if (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n return this._srcObject;\n },\n set: function(stream) {\n var self = this;\n // Use _srcObject as a private property for this shim\n this._srcObject = stream;\n if (this.src) {\n URL.revokeObjectURL(this.src);\n }\n\n if (!stream) {\n this.src = '';\n return undefined;\n }\n this.src = URL.createObjectURL(stream);\n // We need to recreate the blob url when a track is added or\n // removed. Doing it manually since we want to avoid a recursion.\n stream.addEventListener('addtrack', function() {\n if (self.src) {\n URL.revokeObjectURL(self.src);\n }\n self.src = URL.createObjectURL(stream);\n });\n stream.addEventListener('removetrack', function() {\n if (self.src) {\n URL.revokeObjectURL(self.src);\n }\n self.src = URL.createObjectURL(stream);\n });\n }\n });\n }\n }\n },\n\n shimAddTrackRemoveTrackWithNative: function(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams = function() {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n return pc._shimmedLocalStreams[streamId][0];\n });\n };\n\n var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n var sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(function(track) {\n var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n var existingSenders = pc.getSenders();\n origAddStream.apply(this, arguments);\n var newSenders = pc.getSenders().filter(function(newSender) {\n return existingSenders.indexOf(newSender) === -1;\n });\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n pc._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (pc._shimmedLocalStreams[streamId].length === 1) {\n delete pc._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n },\n\n shimAddTrackRemoveTrack: function(window) {\n var browserDetails = utils.detectBrowser(window);\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return this.shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n var origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function() {\n var pc = this;\n var nativeStreams = origGetLocalStreams.apply(this);\n pc._reverseStreams = pc._reverseStreams || {};\n return nativeStreams.map(function(stream) {\n return pc._reverseStreams[stream.id];\n });\n };\n\n var origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n\n stream.getTracks().forEach(function(track) {\n var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!pc._reverseStreams[stream.id]) {\n var newStream = new window.MediaStream(stream.getTracks());\n pc._streams[stream.id] = newStream;\n pc._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(pc, [stream]);\n };\n\n var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n\n origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n delete pc._reverseStreams[(pc._streams[stream.id] ?\n pc._streams[stream.id].id : stream.id)];\n delete pc._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n var pc = this;\n if (pc.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n var streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(function(t) {\n return t === track;\n })) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n var alreadyExists = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n pc._streams = pc._streams || {};\n pc._reverseStreams = pc._reverseStreams || {};\n var oldStream = pc._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(function() {\n pc.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n var newStream = new window.MediaStream([track]);\n pc._streams[stream.id] = newStream;\n pc._reverseStreams[newStream.id] = stream;\n pc.addStream(newStream);\n }\n return pc.getSenders().find(function(s) {\n return s.track === track;\n });\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n var sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n var externalStream = pc._reverseStreams[internalId];\n var internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var pc = this;\n var args = arguments;\n var isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(pc, [\n function(description) {\n var desc = replaceInternalStreamId(pc, description);\n args[0].apply(null, [desc]);\n },\n function(err) {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(pc, arguments)\n .then(function(description) {\n return replaceInternalStreamId(pc, description);\n });\n };\n });\n\n var origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function() {\n var pc = this;\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(pc, arguments);\n }\n arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n return origSetLocalDescription.apply(pc, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n var origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get: function() {\n var pc = this;\n var description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(pc, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n var pc = this;\n if (pc.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n var isLocal = sender._pc === pc;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n pc._streams = pc._streams || {};\n var stream;\n Object.keys(pc._streams).forEach(function(streamid) {\n var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n return sender.track === track;\n });\n if (hasTrack) {\n stream = pc._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n pc.removeStream(pc._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n pc.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n },\n\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n // The RTCPeerConnection object.\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n // Translate iceTransportPolicy to iceTransports,\n // see https://code.google.com/p/webrtc/issues/detail?id=4869\n // this was fixed in M56 along with unprefixing RTCPeerConnection.\n logging('PeerConnection');\n if (pcConfig && pcConfig.iceTransportPolicy) {\n pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n }\n\n return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype =\n window.webkitRTCPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if (window.webkitRTCPeerConnection.generateCertificate) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return window.webkitRTCPeerConnection.generateCertificate;\n }\n });\n }\n } else {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n\n var origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function(selector,\n successCallback, errorCallback) {\n var pc = this;\n var args = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof arguments[0] !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n var fixChromeStats_ = function(response) {\n var standardReport = {};\n var reports = response.result();\n reports.forEach(function(report) {\n var standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(function(name) {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n var makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(function(key) {\n return [key, stats[key]];\n }));\n };\n\n if (arguments.length >= 2) {\n var successCallbackWrapper_ = function(response) {\n args[1](makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n arguments[0]]);\n }\n\n // promise-support\n return new Promise(function(resolve, reject) {\n origGetStats.apply(pc, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(successCallback, errorCallback);\n };\n\n // add promise support -- natively available in Chrome 51\n if (browserDetails.version < 51) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n var pc = this;\n var promise = new Promise(function(resolve, reject) {\n nativeMethod.apply(pc, [args[0], resolve, reject]);\n });\n if (args.length < 2) {\n return promise;\n }\n return promise.then(function() {\n args[1].apply(null, []);\n },\n function(err) {\n if (args.length >= 3) {\n args[2].apply(null, [err]);\n }\n });\n };\n });\n }\n\n // promise support for createOffer and createAnswer. Available (without\n // bugs) since M52: crbug/619289\n if (browserDetails.version < 52) {\n ['createOffer', 'createAnswer'].forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n var pc = this;\n if (arguments.length < 1 || (arguments.length === 1 &&\n typeof arguments[0] === 'object')) {\n var opts = arguments.length === 1 ? arguments[0] : undefined;\n return new Promise(function(resolve, reject) {\n nativeMethod.apply(pc, [resolve, reject, opts]);\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n }\n};\n\n},{\"../utils.js\":13,\"./getusermedia\":6}],6:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n\n var constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n var cc = {};\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n var oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(function(mix) {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n var shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n var remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n var face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n var getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n var matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(function(devices) {\n devices = devices.filter(function(d) {\n return d.kind === 'videoinput';\n });\n var dev = devices.find(function(d) {\n return matches.some(function(match) {\n return d.label.toLowerCase().indexOf(match) !== -1;\n });\n });\n if (!dev && devices.length && matches.indexOf('back') !== -1) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n var shimError_ = function(e) {\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraintName,\n toString: function() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n var getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, function(c) {\n navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n\n navigator.getUserMedia = getUserMedia_;\n\n // Returns the result of getUserMedia as a Promise.\n var getUserMediaPromise_ = function(constraints) {\n return new Promise(function(resolve, reject) {\n navigator.getUserMedia(constraints, resolve, reject);\n });\n };\n\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {\n getUserMedia: getUserMediaPromise_,\n enumerateDevices: function() {\n return new Promise(function(resolve) {\n var kinds = {audio: 'audioinput', video: 'videoinput'};\n return window.MediaStreamTrack.getSources(function(devices) {\n resolve(devices.map(function(device) {\n return {label: device.label,\n kind: kinds[device.kind],\n deviceId: device.id,\n groupId: ''};\n }));\n });\n });\n },\n getSupportedConstraints: function() {\n return {\n deviceId: true, echoCancellation: true, facingMode: true,\n frameRate: true, height: true, width: true\n };\n }\n };\n }\n\n // A shim for getUserMedia method on the mediaDevices object.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (!navigator.mediaDevices.getUserMedia) {\n navigator.mediaDevices.getUserMedia = function(constraints) {\n return getUserMediaPromise_(constraints);\n };\n } else {\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, function(c) {\n return origGetUserMedia(c).then(function(stream) {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function(track) {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, function(e) {\n return Promise.reject(shimError_(e));\n });\n });\n };\n }\n\n // Dummy devicechange event methods.\n // TODO(KaptenJansson) remove once implemented in Chrome stable.\n if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n navigator.mediaDevices.addEventListener = function() {\n logging('Dummy mediaDevices.addEventListener called.');\n };\n }\n if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n navigator.mediaDevices.removeEventListener = function() {\n logging('Dummy mediaDevices.removeEventListener called.');\n };\n }\n};\n\n},{\"../utils.js\":13}],7:[function(require,module,exports){\n/*\n* Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\nvar utils = require('./utils');\n\nmodule.exports = {\n shimRTCIceCandidate: function(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n var NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n var nativeCandidate = new NativeRTCIceCandidate(args);\n var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n var augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', function(e) {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n },\n\n // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n shimCreateObjectURL: function(window) {\n var URL = window && window.URL;\n\n if (!(typeof window === 'object' && window.HTMLMediaElement &&\n 'srcObject' in window.HTMLMediaElement.prototype &&\n URL.createObjectURL && URL.revokeObjectURL)) {\n // Only shim CreateObjectURL using srcObject if srcObject exists.\n return undefined;\n }\n\n var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n var streams = new Map(), newId = 0;\n\n URL.createObjectURL = function(stream) {\n if ('getTracks' in stream) {\n var url = 'polyblob:' + (++newId);\n streams.set(url, stream);\n utils.deprecated('URL.createObjectURL(stream)',\n 'elem.srcObject = stream');\n return url;\n }\n return nativeCreateObjectURL(stream);\n };\n URL.revokeObjectURL = function(url) {\n nativeRevokeObjectURL(url);\n streams.delete(url);\n };\n\n var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n 'src');\n Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n get: function() {\n return dsc.get.apply(this);\n },\n set: function(url) {\n this.srcObject = streams.get(url) || null;\n return dsc.set.apply(this, [url]);\n }\n });\n\n var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n window.HTMLMediaElement.prototype.setAttribute = function() {\n if (arguments.length === 2 &&\n ('' + arguments[0]).toLowerCase() === 'src') {\n this.srcObject = streams.get(arguments[1]) || null;\n }\n return nativeSetAttribute.apply(this, arguments);\n };\n },\n\n shimMaxMessageSize: function(window) {\n if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n return;\n }\n var browserDetails = utils.detectBrowser(window);\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get: function() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n var sctpInDescription = function(description) {\n var sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(function(mediaSection) {\n var mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n var getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n var version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n var getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n var canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n }\n }\n return canSendMaxMessageSize;\n };\n\n var getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n var maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n var match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n var origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n var pc = this;\n pc._sctp = null;\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n var maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n var sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get: function() {\n return maxMessageSize;\n }\n });\n pc._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(pc, arguments);\n };\n },\n\n shimSendThrowTypeError: function(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n var origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function() {\n var pc = this;\n var dataChannel = origCreateDataChannel.apply(pc, arguments);\n var origDataChannelSend = dataChannel.send;\n\n // Patch 'send' method\n dataChannel.send = function() {\n var dc = this;\n var data = arguments[0];\n var length = data.length || data.size || data.byteLength;\n if (length > pc.sctp.maxMessageSize) {\n throw new DOMException('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)', 'TypeError');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n\n return dataChannel;\n };\n }\n};\n\n},{\"./utils\":13,\"sdp\":2}],8:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n var origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set: function(value) {\n origMSTEnabled.set.call(this, value);\n var ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get: function() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n window.RTCPeerConnection =\n shimRTCPeerConnection(window, browserDetails.version);\n },\n shimReplaceTrack: function(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n }\n};\n\n},{\"../utils\":13,\"./getusermedia\":9,\"rtcpeerconnection-shim\":1}],9:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function(window) {\n var navigator = window && window.navigator;\n\n var shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString: function() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(function(e) {\n return Promise.reject(shimError_(e));\n });\n };\n};\n\n},{}],10:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = {\n shimGetUserMedia: require('./getusermedia'),\n shimOnTrack: function(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get: function() {\n return this._ontrack;\n },\n set: function(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n this.removeEventListener('addstream', this._ontrackpoly);\n }\n this.addEventListener('track', this._ontrack = f);\n this.addEventListener('addstream', this._ontrackpoly = function(e) {\n e.stream.getTracks().forEach(function(track) {\n var event = new Event('track');\n event.track = track;\n event.receiver = {track: track};\n event.transceiver = {receiver: event.receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n }.bind(this));\n }.bind(this));\n }\n });\n }\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function() {\n return {receiver: this.receiver};\n }\n });\n }\n },\n\n shimSourceObject: function(window) {\n // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n if (typeof window === 'object') {\n if (window.HTMLMediaElement &&\n !('srcObject' in window.HTMLMediaElement.prototype)) {\n // Shim the srcObject property, once, when HTMLMediaElement is found.\n Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n get: function() {\n return this.mozSrcObject;\n },\n set: function(stream) {\n this.mozSrcObject = stream;\n }\n });\n }\n }\n },\n\n shimPeerConnection: function(window) {\n var browserDetails = utils.detectBrowser(window);\n\n if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n // The RTCPeerConnection object.\n if (!window.RTCPeerConnection) {\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (browserDetails.version < 38) {\n // .urls is not supported in FF < 38.\n // create RTCIceServers with a single url.\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (server.hasOwnProperty('urls')) {\n for (var j = 0; j < server.urls.length; j++) {\n var newServer = {\n url: server.urls[j]\n };\n if (server.urls[j].indexOf('turn') === 0) {\n newServer.username = server.username;\n newServer.credential = server.credential;\n }\n newIceServers.push(newServer);\n }\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n }\n return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype =\n window.mozRTCPeerConnection.prototype;\n\n // wrap static methods. Currently just generateCertificate.\n if (window.mozRTCPeerConnection.generateCertificate) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return window.mozRTCPeerConnection.generateCertificate;\n }\n });\n }\n\n window.RTCSessionDescription = window.mozRTCSessionDescription;\n window.RTCIceCandidate = window.mozRTCIceCandidate;\n }\n\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n var nativeMethod = window.RTCPeerConnection.prototype[method];\n window.RTCPeerConnection.prototype[method] = function() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // support for addIceCandidate(null or undefined)\n var nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n window.RTCPeerConnection.prototype.addIceCandidate = function() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n\n // shim getStats with maplike support\n var makeMapStats = function(stats) {\n var map = new Map();\n Object.keys(stats).forEach(function(key) {\n map.set(key, stats[key]);\n map[key] = stats[key];\n });\n return map;\n };\n\n var modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function(\n selector,\n onSucc,\n onErr\n ) {\n return nativeGetStats.apply(this, [selector || null])\n .then(function(stats) {\n if (browserDetails.version < 48) {\n stats = makeMapStats(stats);\n }\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(function(stat) {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach(function(stat, i) {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n },\n\n shimRemoveStream: function(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(function(sender) {\n if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n pc.removeTrack(sender);\n }\n });\n };\n }\n};\n\n},{\"../utils\":13,\"./getusermedia\":11}],11:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n var browserDetails = utils.detectBrowser(window);\n var navigator = window && window.navigator;\n var MediaStreamTrack = window && window.MediaStreamTrack;\n\n var shimError_ = function(e) {\n return {\n name: {\n InternalError: 'NotReadableError',\n NotSupportedError: 'TypeError',\n PermissionDeniedError: 'NotAllowedError',\n SecurityError: 'NotAllowedError'\n }[e.name] || e.name,\n message: {\n 'The operation is insecure.': 'The request is not allowed by the ' +\n 'user agent or the platform in the current context.'\n }[e.message] || e.message,\n constraint: e.constraint,\n toString: function() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n // getUserMedia constraints shim.\n var getUserMedia_ = function(constraints, onSuccess, onError) {\n var constraintsToFF37_ = function(c) {\n if (typeof c !== 'object' || c.require) {\n return c;\n }\n var require = [];\n Object.keys(c).forEach(function(key) {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n var r = c[key] = (typeof c[key] === 'object') ?\n c[key] : {ideal: c[key]};\n if (r.min !== undefined ||\n r.max !== undefined || r.exact !== undefined) {\n require.push(key);\n }\n if (r.exact !== undefined) {\n if (typeof r.exact === 'number') {\n r. min = r.max = r.exact;\n } else {\n c[key] = r.exact;\n }\n delete r.exact;\n }\n if (r.ideal !== undefined) {\n c.advanced = c.advanced || [];\n var oc = {};\n if (typeof r.ideal === 'number') {\n oc[key] = {min: r.ideal, max: r.ideal};\n } else {\n oc[key] = r.ideal;\n }\n c.advanced.push(oc);\n delete r.ideal;\n if (!Object.keys(r).length) {\n delete c[key];\n }\n }\n });\n if (require.length) {\n c.require = require;\n }\n return c;\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n if (browserDetails.version < 38) {\n logging('spec: ' + JSON.stringify(constraints));\n if (constraints.audio) {\n constraints.audio = constraintsToFF37_(constraints.audio);\n }\n if (constraints.video) {\n constraints.video = constraintsToFF37_(constraints.video);\n }\n logging('ff37: ' + JSON.stringify(constraints));\n }\n return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n onError(shimError_(e));\n });\n };\n\n // Returns the result of getUserMedia as a Promise.\n var getUserMediaPromise_ = function(constraints) {\n return new Promise(function(resolve, reject) {\n getUserMedia_(constraints, resolve, reject);\n });\n };\n\n // Shim for mediaDevices on older versions.\n if (!navigator.mediaDevices) {\n navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n addEventListener: function() { },\n removeEventListener: function() { }\n };\n }\n navigator.mediaDevices.enumerateDevices =\n navigator.mediaDevices.enumerateDevices || function() {\n return new Promise(function(resolve) {\n var infos = [\n {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n ];\n resolve(infos);\n });\n };\n\n if (browserDetails.version < 41) {\n // Work around http://bugzil.la/1169665\n var orgEnumerateDevices =\n navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n navigator.mediaDevices.enumerateDevices = function() {\n return orgEnumerateDevices().then(undefined, function(e) {\n if (e.name === 'NotFoundError') {\n return [];\n }\n throw e;\n });\n };\n }\n if (browserDetails.version < 49) {\n var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).then(function(stream) {\n // Work around https://bugzil.la/802326\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(function(track) {\n track.stop();\n });\n throw new DOMException('The object can not be found here.',\n 'NotFoundError');\n }\n return stream;\n }, function(e) {\n return Promise.reject(shimError_(e));\n });\n };\n }\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n var remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n var obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n if (browserDetails.version < 44) {\n return getUserMedia_(constraints, onSuccess, onError);\n }\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n};\n\n},{\"../utils\":13}],12:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n'use strict';\nvar utils = require('../utils');\n\nmodule.exports = {\n shimLocalStreamsAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams = function() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getStreamById = function(id) {\n var result = null;\n if (this._localStreams) {\n this._localStreams.forEach(function(stream) {\n if (stream.id === id) {\n result = stream;\n }\n });\n }\n if (this._remoteStreams) {\n this._remoteStreams.forEach(function(stream) {\n if (stream.id === id) {\n result = stream;\n }\n });\n }\n return result;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (this._localStreams.indexOf(stream) === -1) {\n this._localStreams.push(stream);\n }\n var pc = this;\n stream.getTracks().forEach(function(track) {\n _addTrack.call(pc, track, stream);\n });\n };\n\n window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (stream) {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (this._localStreams.indexOf(stream) === -1) {\n this._localStreams.push(stream);\n }\n }\n return _addTrack.call(this, track, stream);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream = function(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n var index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n var pc = this;\n var tracks = stream.getTracks();\n this.getSenders().forEach(function(sender) {\n if (tracks.indexOf(sender.track) !== -1) {\n pc.removeTrack(sender);\n }\n });\n };\n }\n },\n shimRemoteStreamsAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get: function() {\n return this._onaddstream;\n },\n set: function(f) {\n var pc = this;\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(function(stream) {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n });\n }\n },\n shimCallbacksAPI: function(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n var prototype = window.RTCPeerConnection.prototype;\n var createOffer = prototype.createOffer;\n var createAnswer = prototype.createAnswer;\n var setLocalDescription = prototype.setLocalDescription;\n var setRemoteDescription = prototype.setRemoteDescription;\n var addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer = function(successCallback, failureCallback) {\n var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n var promise = createOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer = function(successCallback, failureCallback) {\n var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n var promise = createAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n var withCallback = function(description, successCallback, failureCallback) {\n var promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n var promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n var promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n },\n shimGetUserMedia: function(window) {\n var navigator = window && window.navigator;\n\n if (!navigator.getUserMedia) {\n if (navigator.webkitGetUserMedia) {\n navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n } else if (navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n }\n },\n shimRTCIceServerUrls: function(window) {\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n var OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n var newIceServers = [];\n for (var i = 0; i < pcConfig.iceServers.length; i++) {\n var server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in window.RTCPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get: function() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n },\n shimTrackEventTransceiver: function(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCPeerConnection &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n // defined for some reason even when window.RTCTransceiver is not.\n !window.RTCTransceiver) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get: function() {\n return {receiver: this.receiver};\n }\n });\n }\n },\n\n shimCreateOfferLegacy: function(window) {\n var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n var pc = this;\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n }\n var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n return transceiver.sender.track &&\n transceiver.sender.track.kind === 'audio';\n });\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n pc.addTransceiver('audio');\n }\n\n\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n }\n var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n return transceiver.sender.track &&\n transceiver.sender.track.kind === 'video';\n });\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n videoTransceiver.setDirection('sendonly');\n } else if (videoTransceiver.direction === 'recvonly') {\n videoTransceiver.setDirection('inactive');\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n pc.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(pc, arguments);\n };\n }\n};\n\n},{\"../utils\":13}],13:[function(require,module,exports){\n/*\n* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n*\n* Use of this source code is governed by a BSD-style license\n* that can be found in the LICENSE file in the root of the source\n* tree.\n*/\n/* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n var match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object.\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n var proto = window.RTCPeerConnection.prototype;\n var nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n var wrappedCallback = function(e) {\n cb(wrapper(e));\n };\n this._eventMap = this._eventMap || {};\n this._eventMap[cb] = wrappedCallback;\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n var nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[cb]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n var unwrappedCb = this._eventMap[cb];\n delete this._eventMap[cb];\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get: function() {\n return this['_on' + eventNameToWrap];\n },\n set: function(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n }\n });\n}\n\n// Utility methods.\nmodule.exports = {\n extractVersion: extractVersion,\n wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n disableLog: function(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n },\n\n /**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\n disableWarnings: function(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n },\n\n log: function() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n },\n\n /**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\n deprecated: function(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n },\n\n /**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\n detectBrowser: function(window) {\n var navigator = window && window.navigator;\n\n // Returned result object.\n var result = {};\n result.browser = null;\n result.version = null;\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n }\n};\n\n},{}]},{},[3])(3)\n});\n"],"file":"adapter.min.js"} \ No newline at end of file diff --git a/lib/amd/build/addblockmodal.min.js b/lib/amd/build/addblockmodal.min.js index 3467d8a80d8da..350c0056473e8 100644 --- a/lib/amd/build/addblockmodal.min.js +++ b/lib/amd/build/addblockmodal.min.js @@ -1 +1,2 @@ -define(["jquery","core/modal_factory","core/templates","core/str","core/notification"],function(a,b,c,d,e){return{init:function(f){var g=a("[data-key=addblock]"),h=f.blocks.map(function(a){return{key:"pluginname",component:"block_"+a}}),i=d.get_strings(h).then(function(a){return a.map(function(a,b){return{name:f.blocks[b],title:a}})}).then(function(a){return f.blocks=a,c.render("core/add_block_body",f)}).fail(e.exception),j=d.get_string("addblock").fail(e.exception);b.create({title:j,body:i,type:"CANCEL"},g)}}}); \ No newline at end of file +define ("core/addblockmodal",["jquery","core/modal_factory","core/templates","core/str","core/notification"],function(a,b,c,d,e){return{init:function init(f){var g=a("[data-key=addblock]"),h=f.blocks.map(function(a){return{key:"pluginname",component:"block_"+a}}),i=d.get_strings(h).then(function(a){return a.map(function(a,b){return{name:f.blocks[b],title:a}})}).then(function(a){f.blocks=a;return c.render("core/add_block_body",f)}).fail(e.exception),j=d.get_string("addblock").fail(e.exception);b.create({title:j,body:i,type:"CANCEL"},g)}}}); +//# sourceMappingURL=addblockmodal.min.js.map diff --git a/lib/amd/build/addblockmodal.min.js.map b/lib/amd/build/addblockmodal.min.js.map new file mode 100644 index 0000000000000..839aaa5779286 --- /dev/null +++ b/lib/amd/build/addblockmodal.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/addblockmodal.js"],"names":["define","$","ModalFactory","Templates","Str","Notification","init","context","addblocklink","titlerequests","blocks","map","blockName","key","component","bodyPromise","get_strings","then","titles","title","index","name","render","fail","exception","titlePromise","get_string","create","body","type"],"mappings":"AAwBAA,OAAM,sBAAC,CAAC,QAAD,CAAW,oBAAX,CAAiC,gBAAjC,CAAmD,UAAnD,CAA+D,mBAA/D,CAAD,CACC,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAAqCC,CAArC,CAA0CC,CAA1C,CAAwD,CAG3D,MAA+C,CAO3CC,IAAI,CAAE,cAASC,CAAT,CAAkB,IAChBC,CAAAA,CAAY,CAAGP,CAAC,CAAC,qBAAD,CADA,CAIhBQ,CAAa,CAAGF,CAAO,CAACG,MAAR,CAAeC,GAAf,CAAmB,SAASC,CAAT,CAAoB,CACvD,MAAO,CACHC,GAAG,CAAE,YADF,CAEHC,SAAS,CAAE,SAAWF,CAFnB,CAIV,CALmB,CAJA,CAWhBG,CAAW,CAAGX,CAAG,CAACY,WAAJ,CAAgBP,CAAhB,EACjBQ,IADiB,CACZ,SAASC,CAAT,CAAiB,CACnB,MAAOA,CAAAA,CAAM,CAACP,GAAP,CAAW,SAASQ,CAAT,CAAgBC,CAAhB,CAAuB,CACrC,MAAO,CACHC,IAAI,CAAEd,CAAO,CAACG,MAAR,CAAeU,CAAf,CADH,CAEHD,KAAK,CAAEA,CAFJ,CAIV,CALM,CAMV,CARiB,EASjBF,IATiB,CASZ,SAASP,CAAT,CAAiB,CACnBH,CAAO,CAACG,MAAR,CAAiBA,CAAjB,CACA,MAAOP,CAAAA,CAAS,CAACmB,MAAV,CAAiB,qBAAjB,CAAwCf,CAAxC,CACV,CAZiB,EAajBgB,IAbiB,CAaZlB,CAAY,CAACmB,SAbD,CAXE,CA0BhBC,CAAY,CAAGrB,CAAG,CAACsB,UAAJ,CAAe,UAAf,EAClBH,IADkB,CACblB,CAAY,CAACmB,SADA,CA1BC,CA6BpBtB,CAAY,CAACyB,MAAb,CAAoB,CAChBR,KAAK,CAAEM,CADS,CAEhBG,IAAI,CAAEb,CAFU,CAGhBc,IAAI,CAAE,QAHU,CAApB,CAIGrB,CAJH,CAKH,CAzC0C,CA2ClD,CA/CK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Show an add block modal instead of doing it on a separate page.\n *\n * @module core/addblockmodal\n * @class addblockmodal\n * @package core\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/templates', 'core/str', 'core/notification'],\n function($, ModalFactory, Templates, Str, Notification) {\n\n\n return /** @alias module:core/addblockmodal */ {\n /**\n * Global init function for this module.\n *\n * @method init\n * @param {Object} context The template context for rendering this modal body.\n */\n init: function(context) {\n var addblocklink = $('[data-key=addblock]');\n\n // We need the fetch the names of the blocks. It was too much to send in the page.\n var titlerequests = context.blocks.map(function(blockName) {\n return {\n key: 'pluginname',\n component: 'block_' + blockName,\n };\n });\n\n var bodyPromise = Str.get_strings(titlerequests)\n .then(function(titles) {\n return titles.map(function(title, index) {\n return {\n name: context.blocks[index],\n title: title,\n };\n });\n })\n .then(function(blocks) {\n context.blocks = blocks;\n return Templates.render('core/add_block_body', context);\n })\n .fail(Notification.exception);\n\n var titlePromise = Str.get_string('addblock')\n .fail(Notification.exception);\n\n ModalFactory.create({\n title: titlePromise,\n body: bodyPromise,\n type: 'CANCEL',\n }, addblocklink);\n }\n };\n});\n"],"file":"addblockmodal.min.js"} \ No newline at end of file diff --git a/lib/amd/build/ajax.min.js b/lib/amd/build/ajax.min.js index e8ad0a854b227..5d62f2a946ab1 100644 --- a/lib/amd/build/ajax.min.js +++ b/lib/amd/build/ajax.min.js @@ -1 +1,2 @@ -define(["jquery","core/config","core/log","core/url"],function(a,b,c,d){var e=!1,f=function(a){var b,c,e,f=this,g=null,h=0;if(a.error)for(;hq?(s.type="POST",s.data=m):u=v}return d?a.ajax(u,s).done(f).fail(g):(s.success=f,s.error=g,a.ajax(u,s)),n}}}); \ No newline at end of file +define ("core/ajax",["jquery","core/config","core/log","core/url"],function(a,b,c,d){var e=!1,f=function(a){var b=this,c=null,e=0,f,g,h;if(a.error){for(;e=l){l=null}else if(!l){l=null}}if("undefined"==typeof j){j=!1}for(n=0;n=p.length){q=p.sort().join()}else{q=p.length+"-method-calls"}m=JSON.stringify(m);var s={type:"POST",context:c,dataType:"json",processData:!1,async:d,contentType:"application/json",timeout:k},t="service.php",u=b.wwwroot+"/lib/ajax/";if(!h){t="service-nologin.php";u+=t+"?info="+q;if(l){u+="&cachekey="+l;s.type="GET"}}else{u+=t+"?sesskey="+b.sesskey+"&info="+q}if(j){u+="&nosessionupdate=true"}if("POST"===s.type){s.data=m}else{var v=u+"&args="+encodeURIComponent(m);if(v.length>2e3){s.type="POST";s.data=m}else{u=v}}if(d){a.ajax(u,s).done(f).fail(g)}else{s.success=f;s.error=g;a.ajax(u,s)}return o}}}); +//# sourceMappingURL=ajax.min.js.map diff --git a/lib/amd/build/ajax.min.js.map b/lib/amd/build/ajax.min.js.map new file mode 100644 index 0000000000000..c16a4d54cb77e --- /dev/null +++ b/lib/amd/build/ajax.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/ajax.js"],"names":["define","$","config","Log","URL","unloading","requestSuccess","responses","requests","exception","i","request","response","nosessionupdate","error","length","deferred","reject","resolve","data","Error","errorcode","window","location","relativeUrl","forEach","requestFail","jqXHR","textStatus","call","async","loginrequired","timeout","cachekey","bind","ajaxRequestData","promises","methodInfo","requestInfo","parseInt","push","index","methodname","args","Deferred","promise","done","fail","sort","join","JSON","stringify","settings","type","context","dataType","processData","contentType","script","url","wwwroot","sesskey","urlUseGet","encodeURIComponent","ajax","success"],"mappings":"AA2BAA,OAAM,aAAC,CAAC,QAAD,CAAW,aAAX,CAA0B,UAA1B,CAAsC,UAAtC,CAAD,CAAoD,SAASC,CAAT,CAAYC,CAAZ,CAAoBC,CAApB,CAAyBC,CAAzB,CAA8B,IAGhFC,CAAAA,CAAS,GAHuE,CAahFC,CAAc,CAAG,SAASC,CAAT,CAAoB,CAErC,GAAIC,CAAAA,CAAQ,CAAG,IAAf,CACIC,CAAS,CAAG,IADhB,CAEIC,CAAC,CAAG,CAFR,CAGIC,CAHJ,CAIIC,CAJJ,CAKIC,CALJ,CAOA,GAAIN,CAAS,CAACO,KAAd,CAAqB,CAIjB,KAAOJ,CAAC,CAAGF,CAAQ,CAACO,MAApB,CAA4BL,CAAC,EAA7B,CAAiC,CAC7BC,CAAO,CAAGH,CAAQ,CAACE,CAAD,CAAlB,CACAC,CAAO,CAACK,QAAR,CAAiBC,MAAjB,CAAwBV,CAAxB,CACH,CAED,MACH,CAED,IAAKG,CAAC,CAAG,CAAT,CAAYA,CAAC,CAAGF,CAAQ,CAACO,MAAzB,CAAiCL,CAAC,EAAlC,CAAsC,CAClCC,CAAO,CAAGH,CAAQ,CAACE,CAAD,CAAlB,CAEAE,CAAQ,CAAGL,CAAS,CAACG,CAAD,CAApB,CAEA,GAAwB,WAApB,QAAOE,CAAAA,CAAX,CAAqC,CACjC,GAAI,KAAAA,CAAQ,CAACE,KAAb,CAA8B,CAE1BH,CAAO,CAACK,QAAR,CAAiBE,OAAjB,CAAyBN,CAAQ,CAACO,IAAlC,CACH,CAHD,IAGO,CACHV,CAAS,CAAGG,CAAQ,CAACH,SAArB,CACAI,CAAe,CAAGL,CAAQ,CAACE,CAAD,CAAR,CAAYG,eAA9B,CACA,KACH,CACJ,CATD,IASO,CAEHJ,CAAS,CAAG,GAAIW,CAAAA,KAAJ,CAAU,kBAAV,CAAZ,CACA,KACH,CACJ,CAED,GAAkB,IAAd,GAAAX,CAAJ,CAAwB,CAEpB,GAA4B,sBAAxB,GAAAA,CAAS,CAACY,SAAV,EAAkD,CAACR,CAAvD,CAAwE,CACpES,MAAM,CAACC,QAAP,CAAkBnB,CAAG,CAACoB,WAAJ,CAAgB,kBAAhB,CACrB,CAFD,IAEO,CACHhB,CAAQ,CAACiB,OAAT,CAAiB,SAASd,CAAT,CAAkB,CAC/BA,CAAO,CAACK,QAAR,CAAiBC,MAAjB,CAAwBR,CAAxB,CACH,CAFD,CAGH,CACJ,CACJ,CAjEmF,CA4EhFiB,CAAW,CAAG,SAASC,CAAT,CAAgBC,CAAhB,CAA4BnB,CAA5B,CAAuC,IAEjDD,CAAAA,CAAQ,CAAG,IAFsC,CAIjDE,CAAC,CAAG,CAJ6C,CAKrD,IAAKA,CAAC,CAAG,CAAT,CAAYA,CAAC,CAAGF,CAAQ,CAACO,MAAzB,CAAiCL,CAAC,EAAlC,CAAsC,CAClC,GAAIC,CAAAA,CAAO,CAAGH,CAAQ,CAACE,CAAD,CAAtB,CAEA,GAAIL,CAAJ,CAAe,CAEXF,CAAG,CAACW,KAAJ,CAAU,gBAAV,EACAX,CAAG,CAACW,KAAJ,CAAUL,CAAV,CACH,CAJD,IAIO,CACHE,CAAO,CAACK,QAAR,CAAiBC,MAAjB,CAAwBR,CAAxB,CACH,CACJ,CACJ,CA5FmF,CA8FpF,MAAsC,CAwBlCoB,IAAI,CAAE,cAASrB,CAAT,CAAmBsB,CAAnB,CAA0BC,CAA1B,CAAyClB,CAAzC,CAA0DmB,CAA1D,CAAmEC,CAAnE,CAA6E,CAC/EhC,CAAC,CAACqB,MAAD,CAAD,CAAUY,IAAV,CAAe,cAAf,CAA+B,UAAW,CACtC7B,CAAS,GACZ,CAFD,EAD+E,GAI3E8B,CAAAA,CAAe,CAAG,EAJyD,CAK3EzB,CAL2E,CAM3E0B,CAAQ,CAAG,EANgE,CAO3EC,CAAU,CAAG,EAP8D,CAQ3EC,CAAW,CAAG,EAR6D,CAY/E,GAA6B,WAAzB,QAAOP,CAAAA,CAAX,CAA0C,CACtCA,CAAa,GAChB,CACD,GAAqB,WAAjB,QAAOD,CAAAA,CAAX,CAAkC,CAC9BA,CAAK,GACR,CACD,GAAuB,WAAnB,QAAOE,CAAAA,CAAX,CAAoC,CAChCA,CAAO,CAAG,CACb,CACD,GAAwB,WAApB,QAAOC,CAAAA,CAAX,CAAqC,CACjCA,CAAQ,CAAG,IACd,CAFD,IAEO,CACHA,CAAQ,CAAGM,QAAQ,CAACN,CAAD,CAAnB,CACA,GAAgB,CAAZ,EAAAA,CAAJ,CAAmB,CACfA,CAAQ,CAAG,IACd,CAFD,IAEO,IAAI,CAACA,CAAL,CAAe,CAClBA,CAAQ,CAAG,IACd,CACJ,CAED,GAA+B,WAA3B,QAAOpB,CAAAA,CAAX,CAA4C,CACxCA,CAAe,GAClB,CACD,IAAKH,CAAC,CAAG,CAAT,CAAYA,CAAC,CAAGF,CAAQ,CAACO,MAAzB,CAAiCL,CAAC,EAAlC,CAAsC,CAClC,GAAIC,CAAAA,CAAO,CAAGH,CAAQ,CAACE,CAAD,CAAtB,CACAyB,CAAe,CAACK,IAAhB,CAAqB,CACjBC,KAAK,CAAE/B,CADU,CAEjBgC,UAAU,CAAE/B,CAAO,CAAC+B,UAFH,CAGjBC,IAAI,CAAEhC,CAAO,CAACgC,IAHG,CAArB,EAKAhC,CAAO,CAACE,eAAR,CAA0BA,CAA1B,CACAF,CAAO,CAACK,QAAR,CAAmBf,CAAC,CAAC2C,QAAF,EAAnB,CACAR,CAAQ,CAACI,IAAT,CAAc7B,CAAO,CAACK,QAAR,CAAiB6B,OAAjB,EAAd,EAGA,GAA4B,WAAxB,QAAOlC,CAAAA,CAAO,CAACmC,IAAnB,CAAyC,CACrCnC,CAAO,CAACK,QAAR,CAAiB8B,IAAjB,CAAsBnC,CAAO,CAACmC,IAA9B,CACH,CACD,GAA4B,WAAxB,QAAOnC,CAAAA,CAAO,CAACoC,IAAnB,CAAyC,CACrCpC,CAAO,CAACK,QAAR,CAAiB+B,IAAjB,CAAsBpC,CAAO,CAACoC,IAA9B,CACH,CACDpC,CAAO,CAAC8B,KAAR,CAAgB/B,CAAhB,CACA2B,CAAU,CAACG,IAAX,CAAgB7B,CAAO,CAAC+B,UAAxB,CACH,CAED,GAAyB,CAArB,EAAAL,CAAU,CAACtB,MAAf,CAA4B,CACxBuB,CAAW,CAAGD,CAAU,CAACW,IAAX,GAAkBC,IAAlB,EACjB,CAFD,IAEO,CACHX,CAAW,CAAGD,CAAU,CAACtB,MAAX,CAAoB,eACrC,CAEDoB,CAAe,CAAGe,IAAI,CAACC,SAAL,CAAehB,CAAf,CAAlB,CA/D+E,GAgE3EiB,CAAAA,CAAQ,CAAG,CACXC,IAAI,CAAE,MADK,CAEXC,OAAO,CAAE9C,CAFE,CAGX+C,QAAQ,CAAE,MAHC,CAIXC,WAAW,GAJA,CAKX1B,KAAK,CAAEA,CALI,CAMX2B,WAAW,CAAE,kBANF,CAOXzB,OAAO,CAAEA,CAPE,CAhEgE,CA0E3E0B,CAAM,CAAG,aA1EkE,CA2E3EC,CAAG,CAAGzD,CAAM,CAAC0D,OAAP,CAAiB,YA3EoD,CA4E/E,GAAI,CAAC7B,CAAL,CAAoB,CAChB2B,CAAM,CAAG,qBAAT,CACAC,CAAG,EAAID,CAAM,CAAG,QAAT,CAAoBpB,CAA3B,CACA,GAAIL,CAAJ,CAAc,CACV0B,CAAG,EAAI,aAAe1B,CAAtB,CACAmB,CAAQ,CAACC,IAAT,CAAgB,KACnB,CACJ,CAPD,IAOO,CACHM,CAAG,EAAID,CAAM,CAAG,WAAT,CAAuBxD,CAAM,CAAC2D,OAA9B,CAAwC,QAAxC,CAAmDvB,CAC7D,CAED,GAAIzB,CAAJ,CAAqB,CACjB8C,CAAG,EAAI,uBACV,CAED,GAAsB,MAAlB,GAAAP,CAAQ,CAACC,IAAb,CAA8B,CAC1BD,CAAQ,CAACjC,IAAT,CAAgBgB,CACnB,CAFD,IAEO,CACH,GAAI2B,CAAAA,CAAS,CAAGH,CAAG,CAAG,QAAN,CAAiBI,kBAAkB,CAAC5B,CAAD,CAAnD,CAEA,GAAI2B,CAAS,CAAC/C,MAAV,CAtFW,GAsFf,CAAqC,CACjCqC,CAAQ,CAACC,IAAT,CAAgB,MAAhB,CACAD,CAAQ,CAACjC,IAAT,CAAgBgB,CACnB,CAHD,IAGO,CACHwB,CAAG,CAAGG,CACT,CACJ,CAGD,GAAIhC,CAAJ,CAAW,CACP7B,CAAC,CAAC+D,IAAF,CAAOL,CAAP,CAAYP,CAAZ,EACKN,IADL,CACUxC,CADV,EAEKyC,IAFL,CAEUrB,CAFV,CAGH,CAJD,IAIO,CACH0B,CAAQ,CAACa,OAAT,CAAmB3D,CAAnB,CACA8C,CAAQ,CAACtC,KAAT,CAAiBY,CAAjB,CACAzB,CAAC,CAAC+D,IAAF,CAAOL,CAAP,CAAYP,CAAZ,CACH,CAED,MAAOhB,CAAAA,CACV,CA5IiC,CA8IzC,CA5OK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Standard Ajax wrapper for Moodle. It calls the central Ajax script,\n * which can call any existing webservice using the current session.\n * In addition, it can batch multiple requests and return multiple responses.\n *\n * @module core/ajax\n * @class ajax\n * @package core\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery', 'core/config', 'core/log', 'core/url'], function($, config, Log, URL) {\n\n // Keeps track of when the user leaves the page so we know not to show an error.\n var unloading = false;\n\n /**\n * Success handler. Called when the ajax call succeeds. Checks each response and\n * resolves or rejects the deferred from that request.\n *\n * @method requestSuccess\n * @private\n * @param {Object[]} responses Array of responses containing error, exception and data attributes.\n */\n var requestSuccess = function(responses) {\n // Call each of the success handlers.\n var requests = this,\n exception = null,\n i = 0,\n request,\n response,\n nosessionupdate;\n\n if (responses.error) {\n // There was an error with the request as a whole.\n // We need to reject each promise.\n // Unfortunately this may lead to duplicate dialogues, but each Promise must be rejected.\n for (; i < requests.length; i++) {\n request = requests[i];\n request.deferred.reject(responses);\n }\n\n return;\n }\n\n for (i = 0; i < requests.length; i++) {\n request = requests[i];\n\n response = responses[i];\n // We may not have responses for all the requests.\n if (typeof response !== \"undefined\") {\n if (response.error === false) {\n // Call the done handler if it was provided.\n request.deferred.resolve(response.data);\n } else {\n exception = response.exception;\n nosessionupdate = requests[i].nosessionupdate;\n break;\n }\n } else {\n // This is not an expected case.\n exception = new Error('missing response');\n break;\n }\n }\n // Something failed, reject the remaining promises.\n if (exception !== null) {\n // Redirect to the login page.\n if (exception.errorcode === \"servicerequireslogin\" && !nosessionupdate) {\n window.location = URL.relativeUrl(\"/login/index.php\");\n } else {\n requests.forEach(function(request) {\n request.deferred.reject(exception);\n });\n }\n }\n };\n\n /**\n * Fail handler. Called when the ajax call fails. Rejects all deferreds.\n *\n * @method requestFail\n * @private\n * @param {jqXHR} jqXHR The ajax object.\n * @param {string} textStatus The status string.\n * @param {Error|Object} exception The error thrown.\n */\n var requestFail = function(jqXHR, textStatus, exception) {\n // Reject all the promises.\n var requests = this;\n\n var i = 0;\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n\n if (unloading) {\n // No need to trigger an error because we are already navigating.\n Log.error(\"Page unloaded.\");\n Log.error(exception);\n } else {\n request.deferred.reject(exception);\n }\n }\n };\n\n return /** @alias module:core/ajax */ {\n // Public variables and functions.\n /**\n * Make a series of ajax requests and return all the responses.\n *\n * @method call\n * @param {Object[]} requests Array of requests with each containing methodname and args properties.\n * done and fail callbacks can be set for each element in the array, or the\n * can be attached to the promises returned by this function.\n * @param {Boolean} async Optional, defaults to true.\n * If false - this function will not return until the promises are resolved.\n * @param {Boolean} loginrequired Optional, defaults to true.\n * If false - this function will call the faster nologin ajax script - but\n * will fail unless all functions have been marked as 'loginrequired' => false\n * in services.php\n * @param {Boolean} nosessionupdate Optional, defaults to false.\n * If true, the timemodified for the session will not be updated.\n * @param {Integer} timeout number of milliseconds to wait for a response. Defaults to no limit.\n * @param {Integer} cachekey This is used in order to identify the request. If this id changes then we\n * will be sending a different URL and any caching (eg. browser, proxy) knows that it\n * should perform another request and not use the cache. Note - this variable is only\n * used when we are calling 'service-nologin.php'. See MDL-65794.\n * @return {Promise[]} Array of promises that will be resolved when the ajax call returns.\n */\n call: function(requests, async, loginrequired, nosessionupdate, timeout, cachekey) {\n $(window).bind('beforeunload', function() {\n unloading = true;\n });\n var ajaxRequestData = [],\n i,\n promises = [],\n methodInfo = [],\n requestInfo = '';\n\n var maxUrlLength = 2000;\n\n if (typeof loginrequired === \"undefined\") {\n loginrequired = true;\n }\n if (typeof async === \"undefined\") {\n async = true;\n }\n if (typeof timeout === 'undefined') {\n timeout = 0;\n }\n if (typeof cachekey === 'undefined') {\n cachekey = null;\n } else {\n cachekey = parseInt(cachekey);\n if (cachekey <= 0) {\n cachekey = null;\n } else if (!cachekey) {\n cachekey = null;\n }\n }\n\n if (typeof nosessionupdate === \"undefined\") {\n nosessionupdate = false;\n }\n for (i = 0; i < requests.length; i++) {\n var request = requests[i];\n ajaxRequestData.push({\n index: i,\n methodname: request.methodname,\n args: request.args\n });\n request.nosessionupdate = nosessionupdate;\n request.deferred = $.Deferred();\n promises.push(request.deferred.promise());\n // Allow setting done and fail handlers as arguments.\n // This is just a shortcut for the calling code.\n if (typeof request.done !== \"undefined\") {\n request.deferred.done(request.done);\n }\n if (typeof request.fail !== \"undefined\") {\n request.deferred.fail(request.fail);\n }\n request.index = i;\n methodInfo.push(request.methodname);\n }\n\n if (methodInfo.length <= 5) {\n requestInfo = methodInfo.sort().join();\n } else {\n requestInfo = methodInfo.length + '-method-calls';\n }\n\n ajaxRequestData = JSON.stringify(ajaxRequestData);\n var settings = {\n type: 'POST',\n context: requests,\n dataType: 'json',\n processData: false,\n async: async,\n contentType: \"application/json\",\n timeout: timeout\n };\n\n var script = 'service.php';\n var url = config.wwwroot + '/lib/ajax/';\n if (!loginrequired) {\n script = 'service-nologin.php';\n url += script + '?info=' + requestInfo;\n if (cachekey) {\n url += '&cachekey=' + cachekey;\n settings.type = 'GET';\n }\n } else {\n url += script + '?sesskey=' + config.sesskey + '&info=' + requestInfo;\n }\n\n if (nosessionupdate) {\n url += '&nosessionupdate=true';\n }\n\n if (settings.type === 'POST') {\n settings.data = ajaxRequestData;\n } else {\n var urlUseGet = url + '&args=' + encodeURIComponent(ajaxRequestData);\n\n if (urlUseGet.length > maxUrlLength) {\n settings.type = 'POST';\n settings.data = ajaxRequestData;\n } else {\n url = urlUseGet;\n }\n }\n\n // Jquery deprecated done and fail with async=false so we need to do this 2 ways.\n if (async) {\n $.ajax(url, settings)\n .done(requestSuccess)\n .fail(requestFail);\n } else {\n settings.success = requestSuccess;\n settings.error = requestFail;\n $.ajax(url, settings);\n }\n\n return promises;\n }\n };\n});\n"],"file":"ajax.min.js"} \ No newline at end of file diff --git a/lib/amd/build/auto_rows.min.js b/lib/amd/build/auto_rows.min.js index f884f9d7769b1..e05cdc9d07a88 100644 --- a/lib/amd/build/auto_rows.min.js +++ b/lib/amd/build/auto_rows.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b={ELEMENT:"[data-auto-rows]"},c={ROW_CHANGE:"autorows:rowchange"},d=function(a){var b=a.attr("rows"),c=a.data("min-rows"),d=a.attr("data-max-rows"),e=a.height(),f=a.innerHeight(),g=f-e,h=a[0].scrollHeight,i=(h-g)/(e/b);return a.css("height",""),i=d?d:i},e=function(b){var e=a(b.target),f=e.data("min-rows"),g=e.attr("rows");"undefined"==typeof f&&e.data("min-rows",g),e.attr("rows",1);var h=d(e);e.attr("rows",h),h!=g&&e.trigger(c.ROW_CHANGE)},f=function(c){a(c).data("auto-rows")?a(c).on("input propertychange",e.bind(this)):a(c).on("input propertychange",b.ELEMENT,e.bind(this))};return{init:f,events:c}}); \ No newline at end of file +define ("core/auto_rows",["jquery"],function(a){var b={ELEMENT:"[data-auto-rows]"},c={ROW_CHANGE:"autorows:rowchange"},d=function(a){var b=a.attr("rows"),c=a.data("min-rows"),d=a.attr("data-max-rows"),e=a.height(),f=a.innerHeight(),g=a[0].scrollHeight,h=(g-(f-e))/(e/b);a.css("height","");if(h=d){return d}else{return h}},e=function(b){var e=a(b.target),f=e.data("min-rows"),g=e.attr("rows");if("undefined"==typeof f){e.data("min-rows",g)}e.attr("rows",1);var h=d(e);e.attr("rows",h);if(h!=g){e.trigger(c.ROW_CHANGE)}};return{init:function init(c){if(a(c).data("auto-rows")){a(c).on("input propertychange",e.bind(this))}else{a(c).on("input propertychange",b.ELEMENT,e.bind(this))}},events:c}}); +//# sourceMappingURL=auto_rows.min.js.map diff --git a/lib/amd/build/auto_rows.min.js.map b/lib/amd/build/auto_rows.min.js.map new file mode 100644 index 0000000000000..73e40398b6e45 --- /dev/null +++ b/lib/amd/build/auto_rows.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/auto_rows.js"],"names":["define","$","SELECTORS","ELEMENT","EVENTS","ROW_CHANGE","calculateRows","element","currentRows","attr","minRows","data","maxRows","height","innerHeight","scrollHeight","rows","css","changeListener","e","target","trigger","init","root","on","bind","events"],"mappings":"AAyBAA,OAAM,kBAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,IACvBC,CAAAA,CAAS,CAAG,CACZC,OAAO,CAAE,kBADG,CADW,CAKvBC,CAAM,CAAG,CACTC,UAAU,CAAE,oBADH,CALc,CAiBvBC,CAAa,CAAG,SAASC,CAAT,CAAkB,IAC9BC,CAAAA,CAAW,CAAGD,CAAO,CAACE,IAAR,CAAa,MAAb,CADgB,CAE9BC,CAAO,CAAGH,CAAO,CAACI,IAAR,CAAa,UAAb,CAFoB,CAG9BC,CAAO,CAAGL,CAAO,CAACE,IAAR,CAAa,eAAb,CAHoB,CAK9BI,CAAM,CAAGN,CAAO,CAACM,MAAR,EALqB,CAM9BC,CAAW,CAAGP,CAAO,CAACO,WAAR,EANgB,CAS9BC,CAAY,CAAGR,CAAO,CAAC,CAAD,CAAP,CAAWQ,YATI,CAU9BC,CAAI,CAAG,CAACD,CAAY,EAHVD,CAAW,CAAGD,CAGJ,CAAb,GAA4BA,CAAM,CAAGL,CAArC,CAVuB,CAclCD,CAAO,CAACU,GAAR,CAAY,QAAZ,CAAsB,EAAtB,EAEA,GAAID,CAAI,CAAGN,CAAX,CAAoB,CAChB,MAAOA,CAAAA,CACV,CAFD,IAEO,IAAIE,CAAO,EAAII,CAAI,EAAIJ,CAAvB,CAAgC,CACnC,MAAOA,CAAAA,CACV,CAFM,IAEA,CACH,MAAOI,CAAAA,CACV,CACJ,CAxC0B,CAiDvBE,CAAc,CAAG,SAASC,CAAT,CAAY,IACzBZ,CAAAA,CAAO,CAAGN,CAAC,CAACkB,CAAC,CAACC,MAAH,CADc,CAEzBV,CAAO,CAAGH,CAAO,CAACI,IAAR,CAAa,UAAb,CAFe,CAGzBH,CAAW,CAAGD,CAAO,CAACE,IAAR,CAAa,MAAb,CAHW,CAK7B,GAAuB,WAAnB,QAAOC,CAAAA,CAAX,CAAoC,CAChCH,CAAO,CAACI,IAAR,CAAa,UAAb,CAAyBH,CAAzB,CACH,CAIDD,CAAO,CAACE,IAAR,CAAa,MAAb,CAAqB,CAArB,EACA,GAAIO,CAAAA,CAAI,CAAGV,CAAa,CAACC,CAAD,CAAxB,CACAA,CAAO,CAACE,IAAR,CAAa,MAAb,CAAqBO,CAArB,EAEA,GAAIA,CAAI,EAAIR,CAAZ,CAAyB,CACrBD,CAAO,CAACc,OAAR,CAAgBjB,CAAM,CAACC,UAAvB,CACH,CACJ,CAnE0B,CAoF3B,MAAqC,CACjCiB,IAAI,CATG,QAAPA,CAAAA,IAAO,CAASC,CAAT,CAAe,CACtB,GAAItB,CAAC,CAACsB,CAAD,CAAD,CAAQZ,IAAR,CAAa,WAAb,CAAJ,CAA+B,CAC3BV,CAAC,CAACsB,CAAD,CAAD,CAAQC,EAAR,CAAW,sBAAX,CAAmCN,CAAc,CAACO,IAAf,CAAoB,IAApB,CAAnC,CACH,CAFD,IAEO,CACHxB,CAAC,CAACsB,CAAD,CAAD,CAAQC,EAAR,CAAW,sBAAX,CAAmCtB,CAAS,CAACC,OAA7C,CAAsDe,CAAc,CAACO,IAAf,CAAoB,IAApB,CAAtD,CACH,CACJ,CAEoC,CAEjCC,MAAM,CAAEtB,CAFyB,CAIxC,CAxFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Enhance a textarea with auto growing rows to fit the content.\n *\n * @module core/auto_rows\n * @class auto_rows\n * @package core\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery'], function($) {\n var SELECTORS = {\n ELEMENT: '[data-auto-rows]'\n };\n\n var EVENTS = {\n ROW_CHANGE: 'autorows:rowchange',\n };\n\n /**\n * Determine how many rows should be set for the given element.\n *\n * @method calculateRows\n * @param {jQuery} element The textarea element\n * @return {int} The number of rows for the element\n * @private\n */\n var calculateRows = function(element) {\n var currentRows = element.attr('rows');\n var minRows = element.data('min-rows');\n var maxRows = element.attr('data-max-rows');\n\n var height = element.height();\n var innerHeight = element.innerHeight();\n var padding = innerHeight - height;\n\n var scrollHeight = element[0].scrollHeight;\n var rows = (scrollHeight - padding) / (height / currentRows);\n\n // Remove the height styling to let the height be calculated automatically\n // based on the row attribute.\n element.css('height', '');\n\n if (rows < minRows) {\n return minRows;\n } else if (maxRows && rows >= maxRows) {\n return maxRows;\n } else {\n return rows;\n }\n };\n\n /**\n * Listener for change events to trigger resizing of the element.\n *\n * @method changeListener\n * @param {Event} e The triggered event.\n * @private\n */\n var changeListener = function(e) {\n var element = $(e.target);\n var minRows = element.data('min-rows');\n var currentRows = element.attr('rows');\n\n if (typeof minRows === \"undefined\") {\n element.data('min-rows', currentRows);\n }\n\n // Reset element to single row so that the scroll height of the\n // element is correctly calculated each time.\n element.attr('rows', 1);\n var rows = calculateRows(element);\n element.attr('rows', rows);\n\n if (rows != currentRows) {\n element.trigger(EVENTS.ROW_CHANGE);\n }\n };\n\n /**\n * Add the event listeners for all text areas within the given element.\n *\n * @method init\n * @param {jQuery|selector} root The container element of all enhanced text areas\n * @public\n */\n var init = function(root) {\n if ($(root).data('auto-rows')) {\n $(root).on('input propertychange', changeListener.bind(this));\n } else {\n $(root).on('input propertychange', SELECTORS.ELEMENT, changeListener.bind(this));\n }\n };\n\n return /** @module core/auto_rows */ {\n init: init,\n events: EVENTS,\n };\n});\n"],"file":"auto_rows.min.js"} \ No newline at end of file diff --git a/lib/amd/build/autoscroll.min.js b/lib/amd/build/autoscroll.min.js index 32eefc32b1860..33a317edb7312 100644 --- a/lib/amd/build/autoscroll.min.js +++ b/lib/amd/build/autoscroll.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b={SCROLL_THRESHOLD:30,SCROLL_FREQUENCY:1e3/60,SCROLL_SPEED:.5,scrollingId:null,scrollAmount:0,callback:null,start:function(c){a(window).on("mousemove",b.mouseMove),a(window).on("touchmove",b.touchMove),b.callback=c},stop:function(){a(window).off("mousemove",b.mouseMove),a(window).off("touchmove",b.touchMove),null!==b.scrollingId&&b.stopScrolling()},touchMove:function(a){for(var c=0;ca(window).height()-b.SCROLL_THRESHOLD?b.scrollAmount=Math.min(d-(a(window).height()-b.SCROLL_THRESHOLD),b.SCROLL_THRESHOLD):b.scrollAmount=0,b.scrollAmount&&null===b.scrollingId?b.startScrolling():b.scrollAmount||null===b.scrollingId||b.stopScrolling()},startScrolling:function(){var c=a(document).height()-a(window).height();b.scrollingId=window.setInterval(function(){var d=a(window).scrollTop(),e=Math.round(b.scrollAmount*b.SCROLL_SPEED);if(d+e<0&&(e=-d),d+e>c&&(e=c-d),0!==e){a(window).scrollTop(d+e);var f=a(window).scrollTop()-d;0!==f&&b.callback&&b.callback(f)}},b.SCROLL_FREQUENCY)},stopScrolling:function(){window.clearInterval(b.scrollingId),b.scrollingId=null}};return{start:b.start,stop:b.stop}}); \ No newline at end of file +define ("core/autoscroll",["jquery"],function(a){var b={SCROLL_THRESHOLD:30,SCROLL_FREQUENCY:1e3/60,SCROLL_SPEED:.5,scrollingId:null,scrollAmount:0,callback:null,start:function start(c){a(window).on("mousemove",b.mouseMove);a(window).on("touchmove",b.touchMove);b.callback=c},stop:function stop(){a(window).off("mousemove",b.mouseMove);a(window).off("touchmove",b.touchMove);if(null!==b.scrollingId){b.stopScrolling()}},touchMove:function touchMove(a){for(var c=0;ca(window).height()-b.SCROLL_THRESHOLD){b.scrollAmount=Math.min(d-(a(window).height()-b.SCROLL_THRESHOLD),b.SCROLL_THRESHOLD)}else{b.scrollAmount=0}if(b.scrollAmount&&null===b.scrollingId){b.startScrolling()}else if(!b.scrollAmount&&null!==b.scrollingId){b.stopScrolling()}},startScrolling:function startScrolling(){var c=a(document).height()-a(window).height();b.scrollingId=window.setInterval(function(){var d=a(window).scrollTop(),e=Math.round(b.scrollAmount*b.SCROLL_SPEED);if(0>d+e){e=-d}if(d+e>c){e=c-d}if(0===e){return}a(window).scrollTop(d+e);var f=a(window).scrollTop()-d;if(0==f){return}if(b.callback){b.callback(f)}},b.SCROLL_FREQUENCY)},stopScrolling:function stopScrolling(){window.clearInterval(b.scrollingId);b.scrollingId=null}};return{start:b.start,stop:b.stop}}); +//# sourceMappingURL=autoscroll.min.js.map diff --git a/lib/amd/build/autoscroll.min.js.map b/lib/amd/build/autoscroll.min.js.map new file mode 100644 index 0000000000000..ee4da657e02d7 --- /dev/null +++ b/lib/amd/build/autoscroll.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/autoscroll.js"],"names":["define","$","autoscroll","SCROLL_THRESHOLD","SCROLL_FREQUENCY","SCROLL_SPEED","scrollingId","scrollAmount","callback","start","window","on","mouseMove","touchMove","stop","off","stopScrolling","e","i","changedTouches","length","handleMove","clientX","clientY","Math","min","height","startScrolling","maxScroll","document","setInterval","y","scrollTop","offset","round","realOffset","clearInterval"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/*\n * JavaScript to provide automatic scrolling, e.g. during a drag operation.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, since this\n * is usually used in relation to drag-drop, and since you only ever\n * drag one thing at a time, this is not a problem in practice.\n *\n * @module core/autoscroll\n * @class autoscroll\n * @package core\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery'], function($) {\n /**\n * @alias module:core/autoscroll\n */\n var autoscroll = {\n /**\n * Size of area near edge of screen that triggers scrolling.\n * @private\n */\n SCROLL_THRESHOLD: 30,\n\n /**\n * How frequently to scroll window.\n * @private\n */\n SCROLL_FREQUENCY: 1000 / 60,\n\n /**\n * How many pixels to scroll per unit (1 = max scroll 30).\n * @private\n */\n SCROLL_SPEED: 0.5,\n\n /**\n * Set if currently scrolling up/down.\n * @private\n */\n scrollingId: null,\n\n /**\n * Speed we are supposed to scroll (range 1 to SCROLL_THRESHOLD).\n * @private\n */\n scrollAmount: 0,\n\n /**\n * Optional callback called when it scrolls\n * @private\n */\n callback: null,\n\n /**\n * Starts automatically scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: function(callback) {\n $(window).on('mousemove', autoscroll.mouseMove);\n $(window).on('touchmove', autoscroll.touchMove);\n autoscroll.callback = callback;\n },\n\n /**\n * Stops automatically scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: function() {\n $(window).off('mousemove', autoscroll.mouseMove);\n $(window).off('touchmove', autoscroll.touchMove);\n if (autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n for (var i = 0; i < e.changedTouches.length; i++) {\n autoscroll.handleMove(e.changedTouches[i].clientX, e.changedTouches[i].clientY);\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n autoscroll.handleMove(e.clientX, e.clientY);\n },\n\n /**\n * Handles user moving.\n *\n * @private\n * @param {number} clientX X\n * @param {number} clientY Y\n */\n handleMove: function(clientX, clientY) {\n // If near the bottom or top, start auto-scrolling.\n if (clientY < autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = -Math.min(autoscroll.SCROLL_THRESHOLD - clientY, autoscroll.SCROLL_THRESHOLD);\n } else if (clientY > $(window).height() - autoscroll.SCROLL_THRESHOLD) {\n autoscroll.scrollAmount = Math.min(clientY - ($(window).height() - autoscroll.SCROLL_THRESHOLD),\n autoscroll.SCROLL_THRESHOLD);\n } else {\n autoscroll.scrollAmount = 0;\n }\n if (autoscroll.scrollAmount && autoscroll.scrollingId === null) {\n autoscroll.startScrolling();\n } else if (!autoscroll.scrollAmount && autoscroll.scrollingId !== null) {\n autoscroll.stopScrolling();\n }\n },\n\n /**\n * Starts automatic scrolling.\n *\n * @private\n */\n startScrolling: function() {\n var maxScroll = $(document).height() - $(window).height();\n autoscroll.scrollingId = window.setInterval(function() {\n // Work out how much to scroll.\n var y = $(window).scrollTop();\n var offset = Math.round(autoscroll.scrollAmount * autoscroll.SCROLL_SPEED);\n if (y + offset < 0) {\n offset = -y;\n }\n if (y + offset > maxScroll) {\n offset = maxScroll - y;\n }\n if (offset === 0) {\n return;\n }\n\n // Scroll.\n $(window).scrollTop(y + offset);\n var realOffset = $(window).scrollTop() - y;\n if (realOffset === 0) {\n return;\n }\n\n // Inform callback\n if (autoscroll.callback) {\n autoscroll.callback(realOffset);\n }\n\n }, autoscroll.SCROLL_FREQUENCY);\n },\n\n /**\n * Stops the automatic scrolling.\n *\n * @private\n */\n stopScrolling: function() {\n window.clearInterval(autoscroll.scrollingId);\n autoscroll.scrollingId = null;\n }\n };\n\n return {\n /**\n * Starts automatic scrolling if user moves near edge of window.\n * This should be called in response to mouse down or touch start.\n *\n * @public\n * @param {Function} callback Optional callback that is called every time it scrolls\n */\n start: autoscroll.start,\n\n /**\n * Stops automatic scrolling. This should be called in response to mouse up or touch end.\n *\n * @public\n */\n stop: autoscroll.stop\n };\n\n});\n"],"file":"autoscroll.min.js"} \ No newline at end of file diff --git a/lib/amd/build/backoff_timer.min.js b/lib/amd/build/backoff_timer.min.js index bb80b45d1235f..627f4cb3803fd 100644 --- a/lib/amd/build/backoff_timer.min.js +++ b/lib/amd/build/backoff_timer.min.js @@ -1 +1,2 @@ -define(function(){var a=function(a,b){this.callback=a,this.backOffFunction=b};return a.prototype.callback=null,a.prototype.backOffFunction=null,a.prototype.time=null,a.prototype.timeout=null,a.prototype.generateNextTime=function(){var a=this.backOffFunction(this.time);return this.time=a,a},a.prototype.reset=function(){return this.time=null,this.stop(),this},a.prototype.stop=function(){return this.timeout&&(window.clearTimeout(this.timeout),this.timeout=null),this},a.prototype.start=function(){if(!this.timeout){var a=this.generateNextTime();this.timeout=window.setTimeout(function(){this.callback(),this.stop(),this.start()}.bind(this),a)}return this},a.prototype.restart=function(){return this.reset().start()},a.getIncrementalCallback=function(a,b,c,d){return function(e){return e?e+b>c?d:e+b:a}},a}); \ No newline at end of file +define ("core/backoff_timer",function(){var a=function(a,b){this.callback=a;this.backOffFunction=b};a.prototype.callback=null;a.prototype.backOffFunction=null;a.prototype.time=null;a.prototype.timeout=null;a.prototype.generateNextTime=function(){var a=this.backOffFunction(this.time);this.time=a;return a};a.prototype.reset=function(){this.time=null;this.stop();return this};a.prototype.stop=function(){if(this.timeout){window.clearTimeout(this.timeout);this.timeout=null}return this};a.prototype.start=function(){if(!this.timeout){var a=this.generateNextTime();this.timeout=window.setTimeout(function(){this.callback();this.stop();this.start()}.bind(this),a)}return this};a.prototype.restart=function(){return this.reset().start()};a.getIncrementalCallback=function(a,b,c,d){return function(e){if(!e){return a}if(e+b>c){return d}return e+b}};return a}); +//# sourceMappingURL=backoff_timer.min.js.map diff --git a/lib/amd/build/backoff_timer.min.js.map b/lib/amd/build/backoff_timer.min.js.map new file mode 100644 index 0000000000000..81909b8cfea44 --- /dev/null +++ b/lib/amd/build/backoff_timer.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/backoff_timer.js"],"names":["define","BackoffTimer","callback","backoffFunction","backOffFunction","prototype","time","timeout","generateNextTime","newTime","reset","stop","window","clearTimeout","start","setTimeout","bind","restart","getIncrementalCallback","minamount","incrementamount","maxamount","timeoutamount"],"mappings":"AAyBAA,OAAM,sBAAC,UAAW,CAQd,GAAIC,CAAAA,CAAY,CAAG,SAASC,CAAT,CAAmBC,CAAnB,CAAoC,CACnD,KAAKD,QAAL,CAAgBA,CAAhB,CACA,KAAKE,eAAL,CAAuBD,CAC1B,CAHD,CAQAF,CAAY,CAACI,SAAb,CAAuBH,QAAvB,CAAkC,IAAlC,CAKAD,CAAY,CAACI,SAAb,CAAuBD,eAAvB,CAAyC,IAAzC,CAKAH,CAAY,CAACI,SAAb,CAAuBC,IAAvB,CAA8B,IAA9B,CAKAL,CAAY,CAACI,SAAb,CAAuBE,OAAvB,CAAiC,IAAjC,CAYAN,CAAY,CAACI,SAAb,CAAuBG,gBAAvB,CAA0C,UAAW,CACjD,GAAIC,CAAAA,CAAO,CAAG,KAAKL,eAAL,CAAqB,KAAKE,IAA1B,CAAd,CACA,KAAKA,IAAL,CAAYG,CAAZ,CAEA,MAAOA,CAAAA,CACV,CALD,CAaAR,CAAY,CAACI,SAAb,CAAuBK,KAAvB,CAA+B,UAAW,CACtC,KAAKJ,IAAL,CAAY,IAAZ,CACA,KAAKK,IAAL,GAEA,MAAO,KACV,CALD,CAaAV,CAAY,CAACI,SAAb,CAAuBM,IAAvB,CAA8B,UAAW,CACrC,GAAI,KAAKJ,OAAT,CAAkB,CACdK,MAAM,CAACC,YAAP,CAAoB,KAAKN,OAAzB,EACA,KAAKA,OAAL,CAAe,IAClB,CAED,MAAO,KACV,CAPD,CAqBAN,CAAY,CAACI,SAAb,CAAuBS,KAAvB,CAA+B,UAAW,CAEtC,GAAI,CAAC,KAAKP,OAAV,CAAmB,CACf,GAAID,CAAAA,CAAI,CAAG,KAAKE,gBAAL,EAAX,CACA,KAAKD,OAAL,CAAeK,MAAM,CAACG,UAAP,CAAkB,UAAW,CACxC,KAAKb,QAAL,GAEA,KAAKS,IAAL,GAEA,KAAKG,KAAL,EACH,CANgC,CAM/BE,IAN+B,CAM1B,IAN0B,CAAlB,CAMDV,CANC,CAOlB,CAED,MAAO,KACV,CAdD,CAuBAL,CAAY,CAACI,SAAb,CAAuBY,OAAvB,CAAiC,UAAW,CACxC,MAAO,MAAKP,KAAL,GAAaI,KAAb,EACV,CAFD,CAaCb,CAAY,CAACiB,sBAAb,CAAsC,SAASC,CAAT,CAAoBC,CAApB,CAAqCC,CAArC,CAAgDC,CAAhD,CAA+D,CAQlG,MAAO,UAAShB,CAAT,CAAe,CAClB,GAAI,CAACA,CAAL,CAAW,CACP,MAAOa,CAAAA,CACV,CAGD,GAAIb,CAAI,CAAGc,CAAP,CAAyBC,CAA7B,CAAwC,CACpC,MAAOC,CAAAA,CACV,CAED,MAAOhB,CAAAA,CAAI,CAAGc,CACjB,CACJ,CApBA,CAsBD,MAAOnB,CAAAA,CACV,CArJK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A timer that will execute a callback with decreasing frequency. Useful for\n * doing polling on the server without overwhelming it with requests.\n *\n * @module core/backoff_timer\n * @class backoff_timer\n * @package core\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(function() {\n\n /**\n * Constructor for the back off timer.\n *\n * @param {function} callback The function to execute after each tick\n * @param {function} backoffFunction The function to determine what the next timeout value should be\n */\n var BackoffTimer = function(callback, backoffFunction) {\n this.callback = callback;\n this.backOffFunction = backoffFunction;\n };\n\n /**\n * @type {function} callback The function to execute after each tick\n */\n BackoffTimer.prototype.callback = null;\n\n /**\n * @type {function} backoffFunction The function to determine what the next timeout value should be\n */\n BackoffTimer.prototype.backOffFunction = null;\n\n /**\n * @type {int} time The timeout value to use\n */\n BackoffTimer.prototype.time = null;\n\n /**\n * @type {numeric} timeout The timeout identifier\n */\n BackoffTimer.prototype.timeout = null;\n\n /**\n * Generate the next timeout in the back off time sequence\n * for the timer.\n *\n * The back off function is called to calculate the next value.\n * It is given the current value and an array of all previous values.\n *\n * @method generateNextTime\n * @return {int} The new timeout value (in milliseconds)\n */\n BackoffTimer.prototype.generateNextTime = function() {\n var newTime = this.backOffFunction(this.time);\n this.time = newTime;\n\n return newTime;\n };\n\n /**\n * Stop the current timer and clear the previous time values\n *\n * @method reset\n * @return {object} this\n */\n BackoffTimer.prototype.reset = function() {\n this.time = null;\n this.stop();\n\n return this;\n };\n\n /**\n * Clear the current timeout, if one is set.\n *\n * @method stop\n * @return {object} this\n */\n BackoffTimer.prototype.stop = function() {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n this.timeout = null;\n }\n\n return this;\n };\n\n /**\n * Start the current timer by generating the new timeout value and\n * starting the ticks.\n *\n * This function recurses after each tick with a new timeout value\n * generated each time.\n *\n * The callback function is called after each tick.\n *\n * @method start\n * @return {object} this\n */\n BackoffTimer.prototype.start = function() {\n // If we haven't already started.\n if (!this.timeout) {\n var time = this.generateNextTime();\n this.timeout = window.setTimeout(function() {\n this.callback();\n // Clear the existing timer.\n this.stop();\n // Start the next timer.\n this.start();\n }.bind(this), time);\n }\n\n return this;\n };\n\n /**\n * Reset the timer and start it again from the initial timeout\n * values\n *\n * @method restart\n * @return {object} this\n */\n BackoffTimer.prototype.restart = function() {\n return this.reset().start();\n };\n\n /**\n * Returns an incremental function for the timer.\n *\n * @param {int} minamount The minimum amount of time we wait before checking\n * @param {int} incrementamount The amount to increment the timer by\n * @param {int} maxamount The max amount to ever increment to\n * @param {int} timeoutamount The timeout to use once we reach the max amount\n * @return {function}\n */\n BackoffTimer.getIncrementalCallback = function(minamount, incrementamount, maxamount, timeoutamount) {\n\n /**\n * An incremental function for the timer.\n *\n * @param {(int|null)} time The current timeout value or null if none set\n * @return {int} The new timeout value\n */\n return function(time) {\n if (!time) {\n return minamount;\n }\n\n // Don't go over the max amount.\n if (time + incrementamount > maxamount) {\n return timeoutamount;\n }\n\n return time + incrementamount;\n };\n };\n\n return BackoffTimer;\n});\n"],"file":"backoff_timer.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_axis.min.js b/lib/amd/build/chart_axis.min.js index 22ebd64ae9ef0..fa31518b0367e 100644 --- a/lib/amd/build/chart_axis.min.js +++ b/lib/amd/build/chart_axis.min.js @@ -1 +1,2 @@ -define([],function(){function a(){}return a.prototype.POS_DEFAULT=null,a.prototype.POS_BOTTOM="bottom",a.prototype.POS_LEFT="left",a.prototype.POS_RIGHT="right",a.prototype.POS_TOP="top",a.prototype._label=null,a.prototype._labels=null,a.prototype._max=null,a.prototype._min=null,a.prototype._position=null,a.prototype._stepSize=null,a.prototype.create=function(b){var c=new a;return c.setPosition(b.position),c.setLabel(b.label),c.setStepSize(b.stepSize),c.setMax(b.max),c.setMin(b.min),c.setLabels(b.labels),c},a.prototype.getLabel=function(){return this._label},a.prototype.getLabels=function(){return this._labels},a.prototype.getMax=function(){return this._max},a.prototype.getMin=function(){return this._min},a.prototype.getPosition=function(){return this._position},a.prototype.getStepSize=function(){return this._stepSize},a.prototype.setLabel=function(a){this._label=a||null},a.prototype.setLabels=function(a){this._labels=a||null,null===this._labels||null!==this._stepSize||null!==this._min&&0!==this._min||null!==this._max||(this.setStepSize(1),this.setMin(0),this.setMax(a.length-1))},a.prototype.setMax=function(a){this._max="undefined"!=typeof a?a:null},a.prototype.setMin=function(a){this._min="undefined"!=typeof a?a:null},a.prototype.setPosition=function(a){if(a!=this.POS_DEFAULT&&a!=this.POS_BOTTOM&&a!=this.POS_LEFT&&a!=this.POS_RIGHT&&a!=this.POS_TOP)throw new Error("Invalid axis position.");this._position=a},a.prototype.setStepSize=function(a){if("undefined"==typeof a||null===a)a=null;else{if(isNaN(Number(a)))throw new Error("Value for stepSize is not a number.");a=Number(a)}this._stepSize=a},a}); \ No newline at end of file +define ("core/chart_axis",[],function(){function a(){}a.prototype.POS_DEFAULT=null;a.prototype.POS_BOTTOM="bottom";a.prototype.POS_LEFT="left";a.prototype.POS_RIGHT="right";a.prototype.POS_TOP="top";a.prototype._label=null;a.prototype._labels=null;a.prototype._max=null;a.prototype._min=null;a.prototype._position=null;a.prototype._stepSize=null;a.prototype.create=function(b){var c=new a;c.setPosition(b.position);c.setLabel(b.label);c.setStepSize(b.stepSize);c.setMax(b.max);c.setMin(b.min);c.setLabels(b.labels);return c};a.prototype.getLabel=function(){return this._label};a.prototype.getLabels=function(){return this._labels};a.prototype.getMax=function(){return this._max};a.prototype.getMin=function(){return this._min};a.prototype.getPosition=function(){return this._position};a.prototype.getStepSize=function(){return this._stepSize};a.prototype.setLabel=function(a){this._label=a||null};a.prototype.setLabels=function(a){this._labels=a||null;if(null!==this._labels&&null===this._stepSize&&(null===this._min||0===this._min)&&null===this._max){this.setStepSize(1);this.setMin(0);this.setMax(a.length-1)}};a.prototype.setMax=function(a){this._max="undefined"!=typeof a?a:null};a.prototype.setMin=function(a){this._min="undefined"!=typeof a?a:null};a.prototype.setPosition=function(a){if(a!=this.POS_DEFAULT&&a!=this.POS_BOTTOM&&a!=this.POS_LEFT&&a!=this.POS_RIGHT&&a!=this.POS_TOP){throw new Error("Invalid axis position.")}this._position=a};a.prototype.setStepSize=function(a){if("undefined"==typeof a||null===a){a=null}else if(isNaN(+a)){throw new Error("Value for stepSize is not a number.")}else{a=+a}this._stepSize=a};return a}); +//# sourceMappingURL=chart_axis.min.js.map diff --git a/lib/amd/build/chart_axis.min.js.map b/lib/amd/build/chart_axis.min.js.map new file mode 100644 index 0000000000000..4944d3db32dab --- /dev/null +++ b/lib/amd/build/chart_axis.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_axis.js"],"names":["define","Axis","prototype","POS_DEFAULT","POS_BOTTOM","POS_LEFT","POS_RIGHT","POS_TOP","_label","_labels","_max","_min","_position","_stepSize","create","obj","s","setPosition","position","setLabel","label","setStepSize","stepSize","setMax","max","setMin","min","setLabels","labels","getLabel","getLabels","getMax","getMin","getPosition","getStepSize","length","Error","isNaN"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart axis.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_axis\n */\ndefine([], function() {\n\n /**\n * Chart axis class.\n *\n * This is used to represent an axis, whether X or Y.\n *\n * @alias module:core/chart_axis\n * @class\n */\n function Axis() {\n // Please eslint no-empty-function.\n }\n\n /**\n * Default axis position.\n * @const {Null}\n */\n Axis.prototype.POS_DEFAULT = null;\n\n /**\n * Bottom axis position.\n * @const {String}\n */\n Axis.prototype.POS_BOTTOM = 'bottom';\n\n /**\n * Left axis position.\n * @const {String}\n */\n Axis.prototype.POS_LEFT = 'left';\n\n /**\n * Right axis position.\n * @const {String}\n */\n Axis.prototype.POS_RIGHT = 'right';\n\n /**\n * Top axis position.\n * @const {String}\n */\n Axis.prototype.POS_TOP = 'top';\n\n /**\n * Label of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._label = null;\n\n /**\n * Labels of the ticks.\n * @type {String[]}\n * @protected\n */\n Axis.prototype._labels = null;\n\n /**\n * Maximum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._max = null;\n\n /**\n * Minimum value of the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._min = null;\n\n /**\n * Position of the axis.\n * @type {String}\n * @protected\n */\n Axis.prototype._position = null;\n\n /**\n * Steps on the axis.\n * @type {Number}\n * @protected\n */\n Axis.prototype._stepSize = null;\n\n /**\n * Create a new instance of an axis from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the axis.\n * @return {module:core/chart_axis}\n */\n Axis.prototype.create = function(obj) {\n var s = new Axis();\n s.setPosition(obj.position);\n s.setLabel(obj.label);\n s.setStepSize(obj.stepSize);\n s.setMax(obj.max);\n s.setMin(obj.min);\n s.setLabels(obj.labels);\n return s;\n };\n\n /**\n * Get the label of the axis.\n *\n * @method getLabel\n * @return {String}\n */\n Axis.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get the labels of the ticks of the axis.\n *\n * @method getLabels\n * @return {String[]}\n */\n Axis.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get the maximum value of the axis.\n *\n * @method getMax\n * @return {Number}\n */\n Axis.prototype.getMax = function() {\n return this._max;\n };\n\n /**\n * Get the minimum value of the axis.\n *\n * @method getMin\n * @return {Number}\n */\n Axis.prototype.getMin = function() {\n return this._min;\n };\n\n /**\n * Get the position of the axis.\n *\n * @method getPosition\n * @return {String}\n */\n Axis.prototype.getPosition = function() {\n return this._position;\n };\n\n /**\n * Get the step size of the axis.\n *\n * @method getStepSize\n * @return {Number}\n */\n Axis.prototype.getStepSize = function() {\n return this._stepSize;\n };\n\n /**\n * Set the label of the axis.\n *\n * @method setLabel\n * @param {String} label The label.\n */\n Axis.prototype.setLabel = function(label) {\n this._label = label || null;\n };\n\n /**\n * Set the labels of the values on the axis.\n *\n * This automatically sets the [_stepSize]{@link module:core/chart_axis#_stepSize},\n * [_min]{@link module:core/chart_axis#_min} and [_max]{@link module:core/chart_axis#_max}\n * to define a scale from 0 to the number of labels when none of the previously\n * mentioned values have been modified.\n *\n * You can use other values so long that your values in a series are mapped\n * to the values represented by your _min, _max and _stepSize.\n *\n * @method setLabels\n * @param {String[]} labels The labels.\n */\n Axis.prototype.setLabels = function(labels) {\n this._labels = labels || null;\n\n // By default we set the grid according to the labels.\n if (this._labels !== null\n && this._stepSize === null\n && (this._min === null || this._min === 0)\n && this._max === null) {\n this.setStepSize(1);\n this.setMin(0);\n this.setMax(labels.length - 1);\n }\n };\n\n /**\n * Set the maximum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMax\n * @param {Number} max The value.\n */\n Axis.prototype.setMax = function(max) {\n this._max = typeof max !== 'undefined' ? max : null;\n };\n\n /**\n * Set the minimum value on the axis.\n *\n * When this is not set (or set to null) it is left for the output\n * library to best guess what should be used.\n *\n * @method setMin\n * @param {Number} min The value.\n */\n Axis.prototype.setMin = function(min) {\n this._min = typeof min !== 'undefined' ? min : null;\n };\n\n /**\n * Set the position of the axis.\n *\n * This does not validate whether or not the constant used is valid\n * as the axis itself is not aware whether it represents the X or Y axis.\n *\n * The output library has to have a fallback in case the values are incorrect.\n * When this is not set to {@link module:core/chart_axis#POS_DEFAULT} it is up\n * to the output library to choose what position fits best.\n *\n * @method setPosition\n * @param {String} position The value.\n */\n Axis.prototype.setPosition = function(position) {\n if (position != this.POS_DEFAULT\n && position != this.POS_BOTTOM\n && position != this.POS_LEFT\n && position != this.POS_RIGHT\n && position != this.POS_TOP) {\n throw new Error('Invalid axis position.');\n }\n this._position = position;\n };\n\n /**\n * Set the stepSize on the axis.\n *\n * This is used to determine where ticks are displayed on the axis between min and max.\n *\n * @method setStepSize\n * @param {Number} stepSize The value.\n */\n Axis.prototype.setStepSize = function(stepSize) {\n if (typeof stepSize === 'undefined' || stepSize === null) {\n stepSize = null;\n } else if (isNaN(Number(stepSize))) {\n throw new Error('Value for stepSize is not a number.');\n } else {\n stepSize = Number(stepSize);\n }\n\n this._stepSize = stepSize;\n };\n\n return Axis;\n\n});\n"],"file":"chart_axis.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_bar.min.js b/lib/amd/build/chart_bar.min.js index d722a74c86b6b..a7f9a29168e7d 100644 --- a/lib/amd/build/chart_bar.min.js +++ b/lib/amd/build/chart_bar.min.js @@ -1 +1,2 @@ -define(["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}return b.prototype=Object.create(a.prototype),b.prototype._horizontal=!1,b.prototype._stacked=!1,b.prototype.TYPE="bar",b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);return d.setHorizontal(c.horizontal),d.setStacked(c.stacked),d},b.prototype._setDefaults=function(){a.prototype._setDefaults.apply(this,arguments);var b=this.getYAxis(0,!0);b.setMin(0)},b.prototype.getHorizontal=function(){return this._horizontal},b.prototype.getStacked=function(){return this._stacked},b.prototype.setHorizontal=function(a){var b=this.getXAxis(0,!0);null===b.getMin()&&b.setMin(0),this._horizontal=Boolean(a)},b.prototype.setStacked=function(a){this._stacked=Boolean(a)},b}); \ No newline at end of file +define ("core/chart_bar",["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}b.prototype=Object.create(a.prototype);b.prototype._horizontal=!1;b.prototype._stacked=!1;b.prototype.TYPE="bar";b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);d.setHorizontal(c.horizontal);d.setStacked(c.stacked);return d};b.prototype._setDefaults=function(){a.prototype._setDefaults.apply(this,arguments);var b=this.getYAxis(0,!0);b.setMin(0)};b.prototype.getHorizontal=function(){return this._horizontal};b.prototype.getStacked=function(){return this._stacked};b.prototype.setHorizontal=function(a){var b=this.getXAxis(0,!0);if(null===b.getMin()){b.setMin(0)}this._horizontal=!!a};b.prototype.setStacked=function(a){this._stacked=!!a};return b}); +//# sourceMappingURL=chart_bar.min.js.map diff --git a/lib/amd/build/chart_bar.min.js.map b/lib/amd/build/chart_bar.min.js.map new file mode 100644 index 0000000000000..2db8f63d26b56 --- /dev/null +++ b/lib/amd/build/chart_bar.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_bar.js"],"names":["define","Base","Bar","prototype","constructor","apply","arguments","Object","create","_horizontal","_stacked","TYPE","Klass","data","chart","setHorizontal","horizontal","setStacked","stacked","_setDefaults","axis","getYAxis","setMin","getHorizontal","getStacked","getXAxis","getMin"],"mappings":"AAuBAA,OAAM,kBAAC,CAAC,iBAAD,CAAD,CAAsB,SAASC,CAAT,CAAe,CASvC,QAASC,CAAAA,CAAT,EAAe,CACXD,CAAI,CAACE,SAAL,CAAeC,WAAf,CAA2BC,KAA3B,CAAiC,IAAjC,CAAuCC,SAAvC,CACH,CACDJ,CAAG,CAACC,SAAJ,CAAgBI,MAAM,CAACC,MAAP,CAAcP,CAAI,CAACE,SAAnB,CAAhB,CAQAD,CAAG,CAACC,SAAJ,CAAcM,WAAd,IAQAP,CAAG,CAACC,SAAJ,CAAcO,QAAd,IAGAR,CAAG,CAACC,SAAJ,CAAcQ,IAAd,CAAqB,KAArB,CAGAT,CAAG,CAACC,SAAJ,CAAcK,MAAd,CAAuB,SAASI,CAAT,CAAgBC,CAAhB,CAAsB,CACzC,GAAIC,CAAAA,CAAK,CAAGb,CAAI,CAACE,SAAL,CAAeK,MAAf,CAAsBH,KAAtB,CAA4B,IAA5B,CAAkCC,SAAlC,CAAZ,CACAQ,CAAK,CAACC,aAAN,CAAoBF,CAAI,CAACG,UAAzB,EACAF,CAAK,CAACG,UAAN,CAAiBJ,CAAI,CAACK,OAAtB,EACA,MAAOJ,CAAAA,CACV,CALD,CAQAZ,CAAG,CAACC,SAAJ,CAAcgB,YAAd,CAA6B,UAAW,CACpClB,CAAI,CAACE,SAAL,CAAegB,YAAf,CAA4Bd,KAA5B,CAAkC,IAAlC,CAAwCC,SAAxC,EACA,GAAIc,CAAAA,CAAI,CAAG,KAAKC,QAAL,CAAc,CAAd,IAAX,CACAD,CAAI,CAACE,MAAL,CAAY,CAAZ,CACH,CAJD,CAWApB,CAAG,CAACC,SAAJ,CAAcoB,aAAd,CAA8B,UAAW,CACrC,MAAO,MAAKd,WACf,CAFD,CASAP,CAAG,CAACC,SAAJ,CAAcqB,UAAd,CAA2B,UAAW,CAClC,MAAO,MAAKd,QACf,CAFD,CAWAR,CAAG,CAACC,SAAJ,CAAcY,aAAd,CAA8B,SAASC,CAAT,CAAqB,CAC/C,GAAII,CAAAA,CAAI,CAAG,KAAKK,QAAL,CAAc,CAAd,IAAX,CACA,GAAsB,IAAlB,GAAAL,CAAI,CAACM,MAAL,EAAJ,CAA4B,CACxBN,CAAI,CAACE,MAAL,CAAY,CAAZ,CACH,CACD,KAAKb,WAAL,GAA2BO,CAC9B,CAND,CAcAd,CAAG,CAACC,SAAJ,CAAcc,UAAd,CAA2B,SAASC,CAAT,CAAkB,CACzC,KAAKR,QAAL,GAAwBQ,CAC3B,CAFD,CAIA,MAAOhB,CAAAA,CAEV,CA7FK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart bar.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_bar\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Bar chart.\n *\n * @alias module:core/chart_bar\n * @extends {module:core/chart_base}\n * @class\n */\n function Bar() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Bar.prototype = Object.create(Base.prototype);\n\n /**\n * Whether the bars should be displayed horizontally or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._horizontal = false;\n\n /**\n * Whether the bars should be stacked or not.\n *\n * @type {Bool}\n * @protected\n */\n Bar.prototype._stacked = false;\n\n /** @override */\n Bar.prototype.TYPE = 'bar';\n\n /** @override */\n Bar.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setHorizontal(data.horizontal);\n chart.setStacked(data.stacked);\n return chart;\n };\n\n /** @override */\n Bar.prototype._setDefaults = function() {\n Base.prototype._setDefaults.apply(this, arguments);\n var axis = this.getYAxis(0, true);\n axis.setMin(0);\n };\n\n /**\n * Get whether the bars should be displayed horizontally or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getHorizontal = function() {\n return this._horizontal;\n };\n\n /**\n * Get whether the bars should be stacked or not.\n *\n * @returns {Bool}\n */\n Bar.prototype.getStacked = function() {\n return this._stacked;\n };\n\n /**\n * Set whether the bars should be displayed horizontally or not.\n *\n * It sets the X Axis to zero if the min value is null.\n *\n * @param {Bool} horizontal True if the bars should be displayed horizontally, false otherwise.\n */\n Bar.prototype.setHorizontal = function(horizontal) {\n var axis = this.getXAxis(0, true);\n if (axis.getMin() === null) {\n axis.setMin(0);\n }\n this._horizontal = Boolean(horizontal);\n };\n\n /**\n * Set whether the bars should be stacked or not.\n *\n * @method setStacked\n * @param {Bool} stacked True if the chart should be stacked or false otherwise.\n */\n Bar.prototype.setStacked = function(stacked) {\n this._stacked = Boolean(stacked);\n };\n\n return Bar;\n\n});\n"],"file":"chart_bar.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_base.min.js b/lib/amd/build/chart_base.min.js index 118114d0456e7..f6170bb03a05b 100644 --- a/lib/amd/build/chart_base.min.js +++ b/lib/amd/build/chart_base.min.js @@ -1 +1,2 @@ -define(["core/chart_series","core/chart_axis"],function(a,b){function c(){this._series=[],this._labels=[],this._xaxes=[],this._yaxes=[],this._setDefaults()}return c.prototype._series=null,c.prototype._labels=null,c.prototype._title=null,c.prototype._xaxes=null,c.prototype._yaxes=null,c.prototype.COLORSET=["#f3c300","#875692","#f38400","#a1caf1","#be0032","#c2b280","#7f180d","#008856","#e68fac","#0067a5"],c.prototype._configColorSet=null,c.prototype.TYPE=null,c.prototype.addSeries=function(a){if(this._validateSeries(a),this._series.push(a),null===a.getColor()){var b=this.getConfigColorSet()||c.prototype.COLORSET;a.setColor(b[this._series.length%b.length])}},c.prototype.create=function(c,d){var e=new c;return e.setConfigColorSet(d.config_colorset),e.setLabels(d.labels),e.setTitle(d.title),d.series.forEach(function(b){e.addSeries(a.prototype.create(b))}),d.axes.x.forEach(function(a,c){e.setXAxis(b.prototype.create(a),c)}),d.axes.y.forEach(function(a,c){e.setYAxis(b.prototype.create(a),c)}),e},c.prototype.__getAxis=function(a,c,d){var e,f="x"===a?this._xaxes:this._yaxes,g=("x"===a?this.setXAxis:this.setYAxis).bind(this);if(c="undefined"==typeof c?0:c,d="undefined"!=typeof d&&d,e=f[c],"undefined"==typeof e){if(!d)throw new Error("Unknown axis.");e=new b,g(e,c)}return e},c.prototype.getConfigColorSet=function(){return this._configColorSet},c.prototype.getLabels=function(){return this._labels},c.prototype.getSeries=function(){return this._series},c.prototype.getTitle=function(){return this._title},c.prototype.getType=function(){if(!this.TYPE)throw new Error("The TYPE property has not been set.");return this.TYPE},c.prototype.getXAxes=function(){return this._xaxes},c.prototype.getXAxis=function(a,b){return this.__getAxis("x",a,b)},c.prototype.getYAxes=function(){return this._yaxes},c.prototype.getYAxis=function(a,b){return this.__getAxis("y",a,b)},c.prototype.setConfigColorSet=function(a){this._configColorSet=a},c.prototype._setDefaults=function(){},c.prototype.setLabels=function(a){if(a.length&&this._series.length&&this._series[0].length!=a.length)throw new Error("Series must match label values.");this._labels=a},c.prototype.setTitle=function(a){this._title=a},c.prototype.setXAxis=function(a,b){b="undefined"==typeof b?0:b,this._validateAxis("x",a,b),this._xaxes[b]=a},c.prototype.setYAxis=function(a,b){b="undefined"==typeof b?0:b,this._validateAxis("y",a,b),this._yaxes[b]=a},c.prototype._validateAxis=function(a,b,c){if(c="undefined"==typeof c?0:c,c>0){var d="x"==a?this._xaxes:this._yaxes;if("undefined"==typeof d[c-1])throw new Error("Missing "+a+" axis at index lower than "+c)}},c.prototype._validateSeries=function(a){if(this._series.length&&this._series[0].getCount()!=a.getCount())throw new Error("Series do not have an equal number of values.");if(this._labels.length&&this._labels.length!=a.getCount())throw new Error("Series must match label values.")},c}); \ No newline at end of file +define ("core/chart_base",["core/chart_series","core/chart_axis"],function(a,b){function c(){this._series=[];this._labels=[];this._xaxes=[];this._yaxes=[];this._setDefaults()}c.prototype._series=null;c.prototype._labels=null;c.prototype._title=null;c.prototype._xaxes=null;c.prototype._yaxes=null;c.prototype.COLORSET=["#f3c300","#875692","#f38400","#a1caf1","#be0032","#c2b280","#7f180d","#008856","#e68fac","#0067a5"];c.prototype._configColorSet=null;c.prototype.TYPE=null;c.prototype.addSeries=function(a){this._validateSeries(a);this._series.push(a);if(null===a.getColor()){var b=this.getConfigColorSet()||c.prototype.COLORSET;a.setColor(b[this._series.length%b.length])}};c.prototype.create=function(c,d){var e=new c;e.setConfigColorSet(d.config_colorset);e.setLabels(d.labels);e.setTitle(d.title);d.series.forEach(function(b){e.addSeries(a.prototype.create(b))});d.axes.x.forEach(function(a,c){e.setXAxis(b.prototype.create(a),c)});d.axes.y.forEach(function(a,c){e.setYAxis(b.prototype.create(a),c)});return e};c.prototype.__getAxis=function(a,c,d){var e="x"===a?this._xaxes:this._yaxes,f=("x"===a?this.setXAxis:this.setYAxis).bind(this),g;c="undefined"==typeof c?0:c;d="undefined"==typeof d?!1:d;g=e[c];if("undefined"==typeof g){if(!d){throw new Error("Unknown axis.")}g=new b;f(g,c)}return g};c.prototype.getConfigColorSet=function(){return this._configColorSet};c.prototype.getLabels=function(){return this._labels};c.prototype.getSeries=function(){return this._series};c.prototype.getTitle=function(){return this._title};c.prototype.getType=function(){if(!this.TYPE){throw new Error("The TYPE property has not been set.")}return this.TYPE};c.prototype.getXAxes=function(){return this._xaxes};c.prototype.getXAxis=function(a,b){return this.__getAxis("x",a,b)};c.prototype.getYAxes=function(){return this._yaxes};c.prototype.getYAxis=function(a,b){return this.__getAxis("y",a,b)};c.prototype.setConfigColorSet=function(a){this._configColorSet=a};c.prototype._setDefaults=function(){};c.prototype.setLabels=function(a){if(a.length&&this._series.length&&this._series[0].length!=a.length){throw new Error("Series must match label values.")}this._labels=a};c.prototype.setTitle=function(a){this._title=a};c.prototype.setXAxis=function(a,b){b="undefined"==typeof b?0:b;this._validateAxis("x",a,b);this._xaxes[b]=a};c.prototype.setYAxis=function(a,b){b="undefined"==typeof b?0:b;this._validateAxis("y",a,b);this._yaxes[b]=a};c.prototype._validateAxis=function(a,b,c){c="undefined"==typeof c?0:c;if(0.\n\n/**\n * Chart base.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_base\n */\ndefine(['core/chart_series', 'core/chart_axis'], function(Series, Axis) {\n\n /**\n * Chart base.\n *\n * The constructor of a chart must never take any argument.\n *\n * {@link module:core/chart_base#_setDefault} to set the defaults on instantiation.\n *\n * @alias module:core/chart_base\n * @class\n */\n function Base() {\n this._series = [];\n this._labels = [];\n this._xaxes = [];\n this._yaxes = [];\n\n this._setDefaults();\n }\n\n /**\n * The series constituting this chart.\n *\n * @protected\n * @type {module:core/chart_series[]}\n */\n Base.prototype._series = null;\n\n /**\n * The labels of the X axis when categorised.\n *\n * @protected\n * @type {String[]}\n */\n Base.prototype._labels = null;\n\n /**\n * The title of the chart.\n *\n * @protected\n * @type {String}\n */\n Base.prototype._title = null;\n\n /**\n * The X axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._xaxes = null;\n\n /**\n * The Y axes.\n *\n * @protected\n * @type {module:core/chart_axis[]}\n */\n Base.prototype._yaxes = null;\n\n /**\n * Colours to pick from when automatically assigning them.\n *\n * @const\n * @type {String[]}\n */\n Base.prototype.COLORSET = ['#f3c300', '#875692', '#f38400', '#a1caf1', '#be0032', '#c2b280', '#7f180d', '#008856',\n '#e68fac', '#0067a5'];\n\n /**\n * Set of colours defined by setting $CFG->chart_colorset to be picked when automatically assigning them.\n *\n * @type {String[]}\n * @protected\n */\n Base.prototype._configColorSet = null;\n\n /**\n * The type of chart.\n *\n * @abstract\n * @type {String}\n * @const\n */\n Base.prototype.TYPE = null;\n\n /**\n * Add a series to the chart.\n *\n * This will automatically assign a color to the series if it does not have one.\n *\n * @param {module:core/chart_series} series The series to add.\n */\n Base.prototype.addSeries = function(series) {\n this._validateSeries(series);\n this._series.push(series);\n\n // Give a default color from the set.\n if (series.getColor() === null) {\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n series.setColor(configColorSet[this._series.length % configColorSet.length]);\n }\n };\n\n /**\n * Create a new instance of a chart from serialised data.\n *\n * the serialised attributes they offer and support.\n *\n * @static\n * @method create\n * @param {module:core/chart_base} Klass The class oject representing the type of chart to instantiate.\n * @param {Object} data The data of the chart.\n * @return {module:core/chart_base}\n */\n Base.prototype.create = function(Klass, data) {\n // TODO Not convinced about the usage of Klass here but I can't figure out a way\n // to have a reference to the class in the sub classes, in PHP I'd do new self().\n var Chart = new Klass();\n Chart.setConfigColorSet(data.config_colorset);\n Chart.setLabels(data.labels);\n Chart.setTitle(data.title);\n data.series.forEach(function(seriesData) {\n Chart.addSeries(Series.prototype.create(seriesData));\n });\n data.axes.x.forEach(function(axisData, i) {\n Chart.setXAxis(Axis.prototype.create(axisData), i);\n });\n data.axes.y.forEach(function(axisData, i) {\n Chart.setYAxis(Axis.prototype.create(axisData), i);\n });\n return Chart;\n };\n\n /**\n * Get an axis.\n *\n * @private\n * @param {String} xy Accepts the values 'x' or 'y'.\n * @param {Number} [index=0] The index of the axis of its type.\n * @param {Bool} [createIfNotExists=false] When true, create an instance if it does not exist.\n * @return {module:core/chart_axis}\n */\n Base.prototype.__getAxis = function(xy, index, createIfNotExists) {\n var axes = xy === 'x' ? this._xaxes : this._yaxes,\n setAxis = (xy === 'x' ? this.setXAxis : this.setYAxis).bind(this),\n axis;\n\n index = typeof index === 'undefined' ? 0 : index;\n createIfNotExists = typeof createIfNotExists === 'undefined' ? false : createIfNotExists;\n axis = axes[index];\n\n if (typeof axis === 'undefined') {\n if (!createIfNotExists) {\n throw new Error('Unknown axis.');\n }\n axis = new Axis();\n setAxis(axis, index);\n }\n\n return axis;\n };\n\n /**\n * Get colours defined by setting.\n *\n * @return {String[]}\n */\n Base.prototype.getConfigColorSet = function() {\n return this._configColorSet;\n };\n\n /**\n * Get the labels of the X axis.\n *\n * @return {String[]}\n */\n Base.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get the series.\n *\n * @return {module:core/chart_series[]}\n */\n Base.prototype.getSeries = function() {\n return this._series;\n };\n\n /**\n * Get the title of the chart.\n *\n * @return {String}\n */\n Base.prototype.getTitle = function() {\n return this._title;\n };\n\n /**\n * Get the type of chart.\n *\n * @see module:core/chart_base#TYPE\n * @return {String}\n */\n Base.prototype.getType = function() {\n if (!this.TYPE) {\n throw new Error('The TYPE property has not been set.');\n }\n return this.TYPE;\n };\n\n /**\n * Get the X axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getXAxes = function() {\n return this._xaxes;\n };\n\n /**\n * Get an X axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getXAxis = function(index, createIfNotExists) {\n return this.__getAxis('x', index, createIfNotExists);\n };\n\n /**\n * Get the Y axes.\n *\n * @return {module:core/chart_axis[]}\n */\n Base.prototype.getYAxes = function() {\n return this._yaxes;\n };\n\n /**\n * Get an Y axis.\n *\n * @param {Number} [index=0] The index of the axis.\n * @param {Bool} [createIfNotExists=false] Create the instance of it does not exist at index.\n * @return {module:core/chart_axis}\n */\n Base.prototype.getYAxis = function(index, createIfNotExists) {\n return this.__getAxis('y', index, createIfNotExists);\n };\n\n /**\n * Set colours defined by setting.\n *\n * @param {String[]} colorset An array of css colours.\n * @protected\n */\n Base.prototype.setConfigColorSet = function(colorset) {\n this._configColorSet = colorset;\n };\n\n /**\n * Set the defaults for this chart type.\n *\n * Child classes can extend this to set defaults values on instantiation.\n *\n * emphasize and self-document the defaults values set by the chart type.\n *\n * @protected\n */\n Base.prototype._setDefaults = function() {\n // For the children to extend.\n };\n\n /**\n * Set the labels of the X axis.\n *\n * This requires for each series to contain strictly as many values as there\n * are labels.\n *\n * @param {String[]} labels The labels.\n */\n Base.prototype.setLabels = function(labels) {\n if (labels.length && this._series.length && this._series[0].length != labels.length) {\n throw new Error('Series must match label values.');\n }\n this._labels = labels;\n };\n\n /**\n * Set the title of the chart.\n *\n * @param {String} title The title.\n */\n Base.prototype.setTitle = function(title) {\n this._title = title;\n };\n\n /**\n * Set an X axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setXAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('x', axis, index);\n this._xaxes[index] = axis;\n };\n\n /**\n * Set a Y axis.\n *\n * Note that this will override any predefined axis without warning.\n *\n * @param {module:core/chart_axis} axis The axis.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype.setYAxis = function(axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n this._validateAxis('y', axis, index);\n this._yaxes[index] = axis;\n };\n\n /**\n * Validate an axis.\n *\n * @protected\n * @param {String} xy X or Y axis.\n * @param {module:core/chart_axis} axis The axis to validate.\n * @param {Number} [index=0] The index of the axis.\n */\n Base.prototype._validateAxis = function(xy, axis, index) {\n index = typeof index === 'undefined' ? 0 : index;\n if (index > 0) {\n var axes = xy == 'x' ? this._xaxes : this._yaxes;\n if (typeof axes[index - 1] === 'undefined') {\n throw new Error('Missing ' + xy + ' axis at index lower than ' + index);\n }\n }\n };\n\n /**\n * Validate a series.\n *\n * @protected\n * @param {module:core/chart_series} series The series to validate.\n */\n Base.prototype._validateSeries = function(series) {\n if (this._series.length && this._series[0].getCount() != series.getCount()) {\n throw new Error('Series do not have an equal number of values.');\n\n } else if (this._labels.length && this._labels.length != series.getCount()) {\n throw new Error('Series must match label values.');\n }\n };\n\n return Base;\n\n});\n"],"file":"chart_base.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_builder.min.js b/lib/amd/build/chart_builder.min.js index c746f3177494c..2b27c8b0c085f 100644 --- a/lib/amd/build/chart_builder.min.js +++ b/lib/amd/build/chart_builder.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){var b={make:function(b){var c=a.Deferred();return require(["core/chart_"+b.type],function(a){var d=a.prototype.create(a,b);c.resolve(d)}),c.promise()}};return b}); \ No newline at end of file +define ("core/chart_builder",["jquery"],function(a){return{make:function make(b){var c=a.Deferred();require(["core/chart_"+b.type],function(a){var d=a.prototype.create(a,b);c.resolve(d)});return c.promise()}}}); +//# sourceMappingURL=chart_builder.min.js.map diff --git a/lib/amd/build/chart_builder.min.js.map b/lib/amd/build/chart_builder.min.js.map new file mode 100644 index 0000000000000..d5d4fd9ec59ef --- /dev/null +++ b/lib/amd/build/chart_builder.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_builder.js"],"names":["define","$","make","data","deferred","Deferred","require","type","Klass","instance","prototype","create","resolve","promise"],"mappings":"AAsBAA,OAAM,sBAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CA4B3B,MArBa,CAWTC,IAAI,CAAE,cAASC,CAAT,CAAe,CACjB,GAAIC,CAAAA,CAAQ,CAAGH,CAAC,CAACI,QAAF,EAAf,CACAC,OAAO,CAAC,CAAC,cAAgBH,CAAI,CAACI,IAAtB,CAAD,CAA8B,SAASC,CAAT,CAAgB,CACjD,GAAIC,CAAAA,CAAQ,CAAGD,CAAK,CAACE,SAAN,CAAgBC,MAAhB,CAAuBH,CAAvB,CAA8BL,CAA9B,CAAf,CACAC,CAAQ,CAACQ,OAAT,CAAiBH,CAAjB,CACH,CAHM,CAAP,CAIA,MAAOL,CAAAA,CAAQ,CAACS,OAAT,EACV,CAlBQ,CAuBhB,CA9BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart builder.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart builder.\n *\n * @exports core/chart_builder\n */\n var module = {\n\n /**\n * Make a chart instance.\n *\n * This takes data, most likely generated in PHP, and creates a chart instance from it\n * deferring most of the logic to {@link module:core/chart_base.create}.\n *\n * @param {Object} data The data.\n * @return {Promise} A promise resolved with the chart instance.\n */\n make: function(data) {\n var deferred = $.Deferred();\n require(['core/chart_' + data.type], function(Klass) {\n var instance = Klass.prototype.create(Klass, data);\n deferred.resolve(instance);\n });\n return deferred.promise();\n }\n };\n\n return module;\n\n});\n"],"file":"chart_builder.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_line.min.js b/lib/amd/build/chart_line.min.js index 042acb260b4ae..5fc616ed4ae55 100644 --- a/lib/amd/build/chart_line.min.js +++ b/lib/amd/build/chart_line.min.js @@ -1 +1,2 @@ -define(["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}return b.prototype=Object.create(a.prototype),b.prototype.TYPE="line",b.prototype._smooth=!1,b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);return d.setSmooth(c.smooth),d},b.prototype.getSmooth=function(){return this._smooth},b.prototype.setSmooth=function(a){this._smooth=Boolean(a)},b}); \ No newline at end of file +define ("core/chart_line",["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}b.prototype=Object.create(a.prototype);b.prototype.TYPE="line";b.prototype._smooth=!1;b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);d.setSmooth(c.smooth);return d};b.prototype.getSmooth=function(){return this._smooth};b.prototype.setSmooth=function(a){this._smooth=!!a};return b}); +//# sourceMappingURL=chart_line.min.js.map diff --git a/lib/amd/build/chart_line.min.js.map b/lib/amd/build/chart_line.min.js.map new file mode 100644 index 0000000000000..901707cc11d3d --- /dev/null +++ b/lib/amd/build/chart_line.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_line.js"],"names":["define","Base","Line","prototype","constructor","apply","arguments","Object","create","TYPE","_smooth","Klass","data","chart","setSmooth","smooth","getSmooth"],"mappings":"AAuBAA,OAAM,mBAAC,CAAC,iBAAD,CAAD,CAAsB,SAASC,CAAT,CAAe,CASvC,QAASC,CAAAA,CAAT,EAAgB,CACZD,CAAI,CAACE,SAAL,CAAeC,WAAf,CAA2BC,KAA3B,CAAiC,IAAjC,CAAuCC,SAAvC,CACH,CACDJ,CAAI,CAACC,SAAL,CAAiBI,MAAM,CAACC,MAAP,CAAcP,CAAI,CAACE,SAAnB,CAAjB,CAGAD,CAAI,CAACC,SAAL,CAAeM,IAAf,CAAsB,MAAtB,CAUAP,CAAI,CAACC,SAAL,CAAeO,OAAf,IAGAR,CAAI,CAACC,SAAL,CAAeK,MAAf,CAAwB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAC1C,GAAIC,CAAAA,CAAK,CAAGZ,CAAI,CAACE,SAAL,CAAeK,MAAf,CAAsBH,KAAtB,CAA4B,IAA5B,CAAkCC,SAAlC,CAAZ,CACAO,CAAK,CAACC,SAAN,CAAgBF,CAAI,CAACG,MAArB,EACA,MAAOF,CAAAA,CACV,CAJD,CAYAX,CAAI,CAACC,SAAL,CAAea,SAAf,CAA2B,UAAW,CAClC,MAAO,MAAKN,OACf,CAFD,CAUAR,CAAI,CAACC,SAAL,CAAeW,SAAf,CAA2B,SAASC,CAAT,CAAiB,CACxC,KAAKL,OAAL,GAAuBK,CAC1B,CAFD,CAIA,MAAOb,CAAAA,CAEV,CAxDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart line.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_line\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Line chart.\n *\n * @alias module:core/chart_line\n * @extends {module:core/chart_base}\n * @class\n */\n function Line() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Line.prototype = Object.create(Base.prototype);\n\n /** @override */\n Line.prototype.TYPE = 'line';\n\n /**\n * Whether the line should be smooth or not.\n *\n * By default the chart lines are not smooth.\n *\n * @type {Bool}\n * @protected\n */\n Line.prototype._smooth = false;\n\n /** @override */\n Line.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setSmooth(data.smooth);\n return chart;\n };\n\n /**\n * Get whether the line should be smooth or not.\n *\n * @method getSmooth\n * @returns {Bool}\n */\n Line.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Set whether the line should be smooth or not.\n *\n * @method setSmooth\n * @param {Bool} smooth True if the line chart should be smooth, false otherwise.\n */\n Line.prototype.setSmooth = function(smooth) {\n this._smooth = Boolean(smooth);\n };\n\n return Line;\n\n});\n"],"file":"chart_line.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_output.min.js b/lib/amd/build/chart_output.min.js index 65c0f11c85312..7b912253539bc 100644 --- a/lib/amd/build/chart_output.min.js +++ b/lib/amd/build/chart_output.min.js @@ -1 +1,2 @@ -define(["core/chart_output_chartjs"],function(a){var b=a;return b}); \ No newline at end of file +define ("core/chart_output",["core/chart_output_chartjs"],function(a){return a}); +//# sourceMappingURL=chart_output.min.js.map diff --git a/lib/amd/build/chart_output.min.js.map b/lib/amd/build/chart_output.min.js.map new file mode 100644 index 0000000000000..02868bb980f4a --- /dev/null +++ b/lib/amd/build/chart_output.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_output.js"],"names":["define","Output"],"mappings":"AAwBAA,OAAM,qBAAC,CAAC,2BAAD,CAAD,CAAgC,SAASC,CAAT,CAAiB,CAQnD,MAFoBA,CAAAA,CAIvB,CAVK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart output.\n *\n * Proxy to the default output module.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/chart_output_chartjs'], function(Output) {\n\n /**\n * @exports module:core/chart_output\n * @extends {module:core/chart_output_chartjs}\n */\n var defaultModule = Output;\n\n return defaultModule;\n\n});\n"],"file":"chart_output.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_base.min.js b/lib/amd/build/chart_output_base.min.js index 8bdebe61412e6..b390a08128091 100644 --- a/lib/amd/build/chart_output_base.min.js +++ b/lib/amd/build/chart_output_base.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){function b(b,c){this._node=a(b),this._chart=c}return b.prototype.update=function(){throw new Error("Not supported.")},b}); \ No newline at end of file +define ("core/chart_output_base",["jquery"],function(a){function b(b,c){this._node=a(b);this._chart=c}b.prototype.update=function(){throw new Error("Not supported.")};return b}); +//# sourceMappingURL=chart_output_base.min.js.map diff --git a/lib/amd/build/chart_output_base.min.js.map b/lib/amd/build/chart_output_base.min.js.map new file mode 100644 index 0000000000000..34b383e640817 --- /dev/null +++ b/lib/amd/build/chart_output_base.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_output_base.js"],"names":["define","$","Base","node","chart","_node","_chart","prototype","update","Error"],"mappings":"AAyBAA,OAAM,0BAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAmB3B,QAASC,CAAAA,CAAT,CAAcC,CAAd,CAAoBC,CAApB,CAA2B,CACvB,KAAKC,KAAL,CAAaJ,CAAC,CAACE,CAAD,CAAd,CACA,KAAKG,MAAL,CAAcF,CACjB,CAYDF,CAAI,CAACK,SAAL,CAAeC,MAAf,CAAwB,UAAW,CAC/B,KAAM,IAAIC,CAAAA,KAAJ,CAAU,gBAAV,CACT,CAFD,CAIA,MAAOP,CAAAA,CAEV,CAxCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart output base.\n *\n * This takes a chart object and draws it.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_base\n */\ndefine(['jquery'], function($) {\n\n /**\n * Chart output base.\n *\n * The constructor of an output class must instantly generate and display the\n * chart. It is also the responsability of the output module to check that\n * the node received is of the appropriate type, if not a new node can be\n * added within.\n *\n * The output module has total control over the content of the node and can\n * clear it or output anything to it at will. A node should not be shared by\n * two simultaneous output modules.\n *\n * @class\n * @alias module:core/chart_output_base\n * @param {Node} node The node to output with/in.\n * @param {Chart} chart A chart object.\n */\n function Base(node, chart) {\n this._node = $(node);\n this._chart = chart;\n }\n\n /**\n * Update method.\n *\n * This is the public method through which an output instance in informed\n * that the chart instance has been updated and they need to update the\n * chart rendering.\n *\n * @abstract\n * @return {Void}\n */\n Base.prototype.update = function() {\n throw new Error('Not supported.');\n };\n\n return Base;\n\n});\n"],"file":"chart_output_base.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_chartjs.min.js b/lib/amd/build/chart_output_chartjs.min.js index 082274fe417d0..491017c1ce934 100644 --- a/lib/amd/build/chart_output_chartjs.min.js +++ b/lib/amd/build/chart_output_chartjs.min.js @@ -1 +1,2 @@ -define(["jquery","core/chartjs","core/chart_axis","core/chart_bar","core/chart_output_base","core/chart_line","core/chart_pie","core/chart_series"],function(a,b,c,d,e,f,g,h){function i(){e.prototype.constructor.apply(this,arguments),this._canvas=this._node,"CANVAS"!=this._canvas.prop("tagName")&&(this._canvas=a(""),this._node.append(this._canvas)),this._build()}var j=function(a,b){return"axis-"+a+"-"+b};return i.prototype=Object.create(e.prototype),i.prototype._config=null,i.prototype._chartjs=null,i.prototype._canvas=null,i.prototype._build=function(){this._config=this._makeConfig(),this._chartjs=new b(this._canvas[0],this._config)},i.prototype._cleanData=function(b){return b instanceof Array?b.map(function(b){return a("").html(b).text()}):a("").html(b).text()},i.prototype._getChartType=function(){var a=this._chart.getType();return this._chart.getType()===d.prototype.TYPE&&this._chart.getHorizontal()===!0?a="horizontalBar":this._chart.getType()===g.prototype.TYPE&&this._chart.getDoughnut()===!0&&(a="doughnut"),a},i.prototype._makeAxisConfig=function(a,b,d){var e={id:j(b,d)};return a.getPosition()!==c.prototype.POS_DEFAULT&&(e.position=a.getPosition()),null!==a.getLabel()&&(e.scaleLabel={display:!0,labelString:this._cleanData(a.getLabel())}),null!==a.getStepSize()&&(e.ticks=e.ticks||{},e.ticks.stepSize=a.getStepSize()),null!==a.getMax()&&(e.ticks=e.ticks||{},e.ticks.max=a.getMax()),null!==a.getMin()&&(e.ticks=e.ticks||{},e.ticks.min=a.getMin()),e},i.prototype._makeConfig=function(){var a={type:this._getChartType(),data:{labels:this._cleanData(this._chart.getLabels()),datasets:this._makeDatasetsConfig()},options:{title:{display:null!==this._chart.getTitle(),text:this._cleanData(this._chart.getTitle())}}};return this._chart.getXAxes().forEach(function(b,c){var d=b.getLabels();a.options.scales=a.options.scales||{},a.options.scales.xAxes=a.options.scales.xAxes||[],a.options.scales.xAxes[c]=this._makeAxisConfig(b,"x",c),null!==d&&(a.options.scales.xAxes[c].ticks.callback=function(a,b){return d[b]||""}),a.options.scales.xAxes[c].stacked=this._isStacked()}.bind(this)),this._chart.getYAxes().forEach(function(b,c){var d=b.getLabels();a.options.scales=a.options.scales||{},a.options.scales.yAxes=a.options.scales.yAxes||[],a.options.scales.yAxes[c]=this._makeAxisConfig(b,"y",c),null!==d&&(a.options.scales.yAxes[c].ticks.callback=function(a){return d[parseInt(a,10)]||""}),a.options.scales.yAxes[c].stacked=this._isStacked()}.bind(this)),a.options.tooltips={callbacks:{label:this._makeTooltip.bind(this)}},a},i.prototype._makeDatasetsConfig=function(){var a=this._chart.getSeries().map(function(a){var b=a.hasColoredValues()?a.getColors():a.getColor(),c={label:this._cleanData(a.getLabel()),data:a.getValues(),type:a.getType(),fill:!1,backgroundColor:b,borderColor:this._chart.getType()==g.prototype.TYPE?"#fff":b,lineTension:this._isSmooth(a)?.3:0};return null!==a.getXAxis()&&(c.xAxisID=j("x",a.getXAxis())),null!==a.getYAxis()&&(c.yAxisID=j("y",a.getYAxis())),c}.bind(this));return a},i.prototype._makeTooltip=function(a,b){var c=this._chart.getSeries()[a.datasetIndex],d=c.getLabel(),e=c.getLabels(),f=b.datasets[a.datasetIndex].data,g=f[a.index],h=[];if(""==a.xLabel&&""==a.yLabel){var i=this._cleanData(this._chart.getLabels());h.push(i[a.index])}return null!==e?h.push(this._cleanData(e[a.index])):h.push(this._cleanData(d)+": "+g),h},i.prototype._isSmooth=function(a){var b=!1;return this._chart.getType()===f.prototype.TYPE?(b=a.getSmooth(),null===b&&(b=this._chart.getSmooth())):a.getType()===h.prototype.TYPE_LINE&&(b=a.getSmooth()),b},i.prototype._isStacked=function(){var a=!1;return this._chart.getType()===d.prototype.TYPE&&(a=this._chart.getStacked()),a},i.prototype.update=function(){a.extend(!0,this._config,this._makeConfig()),this._chartjs.update()},i}); \ No newline at end of file +define ("core/chart_output_chartjs",["jquery","core/chartjs","core/chart_axis","core/chart_bar","core/chart_output_base","core/chart_line","core/chart_pie","core/chart_series"],function(a,b,c,d,e,f,g,h){var j=function(a,b){return"axis-"+a+"-"+b};function i(){e.prototype.constructor.apply(this,arguments);this._canvas=this._node;if("CANVAS"!=this._canvas.prop("tagName")){this._canvas=a("");this._node.append(this._canvas)}this._build()}i.prototype=Object.create(e.prototype);i.prototype._config=null;i.prototype._chartjs=null;i.prototype._canvas=null;i.prototype._build=function(){this._config=this._makeConfig();this._chartjs=new b(this._canvas[0],this._config)};i.prototype._cleanData=function(b){if(b instanceof Array){return b.map(function(b){return a("").html(b).text()})}else{return a("").html(b).text()}};i.prototype._getChartType=function(){var a=this._chart.getType();if(this._chart.getType()===d.prototype.TYPE&&!0===this._chart.getHorizontal()){a="horizontalBar"}else if(this._chart.getType()===g.prototype.TYPE&&!0===this._chart.getDoughnut()){a="doughnut"}return a};i.prototype._makeAxisConfig=function(a,b,d){var e={id:j(b,d)};if(a.getPosition()!==c.prototype.POS_DEFAULT){e.position=a.getPosition()}if(null!==a.getLabel()){e.scaleLabel={display:!0,labelString:this._cleanData(a.getLabel())}}if(null!==a.getStepSize()){e.ticks=e.ticks||{};e.ticks.stepSize=a.getStepSize()}if(null!==a.getMax()){e.ticks=e.ticks||{};e.ticks.max=a.getMax()}if(null!==a.getMin()){e.ticks=e.ticks||{};e.ticks.min=a.getMin()}return e};i.prototype._makeConfig=function(){var a={type:this._getChartType(),data:{labels:this._cleanData(this._chart.getLabels()),datasets:this._makeDatasetsConfig()},options:{title:{display:null!==this._chart.getTitle(),text:this._cleanData(this._chart.getTitle())}}};this._chart.getXAxes().forEach(function(b,c){var d=b.getLabels();a.options.scales=a.options.scales||{};a.options.scales.xAxes=a.options.scales.xAxes||[];a.options.scales.xAxes[c]=this._makeAxisConfig(b,"x",c);if(null!==d){a.options.scales.xAxes[c].ticks.callback=function(a,b){return d[b]||""}}a.options.scales.xAxes[c].stacked=this._isStacked()}.bind(this));this._chart.getYAxes().forEach(function(b,c){var d=b.getLabels();a.options.scales=a.options.scales||{};a.options.scales.yAxes=a.options.scales.yAxes||[];a.options.scales.yAxes[c]=this._makeAxisConfig(b,"y",c);if(null!==d){a.options.scales.yAxes[c].ticks.callback=function(a){return d[parseInt(a,10)]||""}}a.options.scales.yAxes[c].stacked=this._isStacked()}.bind(this));a.options.tooltips={callbacks:{label:this._makeTooltip.bind(this)}};return a};i.prototype._makeDatasetsConfig=function(){var a=this._chart.getSeries().map(function(a){var b=a.hasColoredValues()?a.getColors():a.getColor(),c={label:this._cleanData(a.getLabel()),data:a.getValues(),type:a.getType(),fill:!1,backgroundColor:b,borderColor:this._chart.getType()==g.prototype.TYPE?"#fff":b,lineTension:this._isSmooth(a)?.3:0};if(null!==a.getXAxis()){c.xAxisID=j("x",a.getXAxis())}if(null!==a.getYAxis()){c.yAxisID=j("y",a.getYAxis())}return c}.bind(this));return a};i.prototype._makeTooltip=function(a,b){var c=this._chart.getSeries()[a.datasetIndex],d=c.getLabel(),e=c.getLabels(),f=b.datasets[a.datasetIndex].data,g=f[a.index],h=[];if(""==a.xLabel&&""==a.yLabel){var i=this._cleanData(this._chart.getLabels());h.push(i[a.index])}if(null!==e){h.push(this._cleanData(e[a.index]))}else{h.push(this._cleanData(d)+": "+g)}return h};i.prototype._isSmooth=function(a){var b=!1;if(this._chart.getType()===f.prototype.TYPE){b=a.getSmooth();if(null===b){b=this._chart.getSmooth()}}else if(a.getType()===h.prototype.TYPE_LINE){b=a.getSmooth()}return b};i.prototype._isStacked=function(){var a=!1;if(this._chart.getType()===d.prototype.TYPE){a=this._chart.getStacked()}return a};i.prototype.update=function(){a.extend(!0,this._config,this._makeConfig());this._chartjs.update()};return i}); +//# sourceMappingURL=chart_output_chartjs.min.js.map diff --git a/lib/amd/build/chart_output_chartjs.min.js.map b/lib/amd/build/chart_output_chartjs.min.js.map new file mode 100644 index 0000000000000..39844cb4d1f51 --- /dev/null +++ b/lib/amd/build/chart_output_chartjs.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_output_chartjs.js"],"names":["define","$","Chartjs","Axis","Bar","Base","Line","Pie","Series","makeAxisId","xy","index","Output","prototype","constructor","apply","arguments","_canvas","_node","prop","append","_build","Object","create","_config","_chartjs","_makeConfig","_cleanData","data","Array","map","value","html","text","_getChartType","type","_chart","getType","TYPE","getHorizontal","getDoughnut","_makeAxisConfig","axis","scaleData","id","getPosition","POS_DEFAULT","position","getLabel","scaleLabel","display","labelString","getStepSize","ticks","stepSize","getMax","max","getMin","min","config","labels","getLabels","datasets","_makeDatasetsConfig","options","title","getTitle","getXAxes","forEach","i","axisLabels","scales","xAxes","callback","stacked","_isStacked","bind","getYAxes","yAxes","parseInt","tooltips","callbacks","label","_makeTooltip","sets","getSeries","series","colors","hasColoredValues","getColors","getColor","dataset","getValues","fill","backgroundColor","borderColor","lineTension","_isSmooth","getXAxis","xAxisID","getYAxis","yAxisID","tooltipItem","datasetIndex","serieLabel","serieLabels","chartData","tooltipData","tooltip","xLabel","yLabel","chartLabels","push","smooth","getSmooth","TYPE_LINE","getStacked","update","extend"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart output for chart.js.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_chartjs\n */\ndefine([\n 'jquery',\n 'core/chartjs',\n 'core/chart_axis',\n 'core/chart_bar',\n 'core/chart_output_base',\n 'core/chart_line',\n 'core/chart_pie',\n 'core/chart_series'\n], function($, Chartjs, Axis, Bar, Base, Line, Pie, Series) {\n\n /**\n * Makes an axis ID.\n *\n * @param {String} xy Accepts 'x' and 'y'.\n * @param {Number} index The axis index.\n * @return {String}\n */\n var makeAxisId = function(xy, index) {\n return 'axis-' + xy + '-' + index;\n };\n\n /**\n * Chart output for Chart.js.\n *\n * @class\n * @alias module:core/chart_output_chartjs\n * @extends {module:core/chart_output_base}\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n\n // Make sure that we've got a canvas tag.\n this._canvas = this._node;\n if (this._canvas.prop('tagName') != 'CANVAS') {\n this._canvas = $('');\n this._node.append(this._canvas);\n }\n\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Reference to the chart config object.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._config = null;\n\n /**\n * Reference to the instance of chart.js.\n *\n * @type {Object}\n * @protected\n */\n Output.prototype._chartjs = null;\n\n /**\n * Reference to the canvas node.\n *\n * @type {Jquery}\n * @protected\n */\n Output.prototype._canvas = null;\n\n /**\n * Builds the config and the chart.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._config = this._makeConfig();\n this._chartjs = new Chartjs(this._canvas[0], this._config);\n };\n\n /**\n * Clean data.\n *\n * @param {(String|String[])} data A single string or an array of strings.\n * @returns {(String|String[])}\n * @protected\n */\n Output.prototype._cleanData = function(data) {\n if (data instanceof Array) {\n return data.map(function(value) {\n return $('').html(value).text();\n });\n } else {\n return $('').html(data).text();\n }\n };\n\n /**\n * Get the chart type and handles the Chart.js specific chart types.\n *\n * By default returns the current chart TYPE value. Also does the handling of specific chart types, for example\n * check if the bar chart should be horizontal and the pie chart should be displayed as a doughnut.\n *\n * @method getChartType\n * @returns {String} the chart type.\n * @protected\n */\n Output.prototype._getChartType = function() {\n var type = this._chart.getType();\n\n // Bars can be displayed vertically and horizontally, defining horizontalBar type.\n if (this._chart.getType() === Bar.prototype.TYPE && this._chart.getHorizontal() === true) {\n type = 'horizontalBar';\n } else if (this._chart.getType() === Pie.prototype.TYPE && this._chart.getDoughnut() === true) {\n // Pie chart can be displayed as doughnut.\n type = 'doughnut';\n }\n\n return type;\n };\n\n /**\n * Make the axis config.\n *\n * @protected\n * @param {module:core/chart_axis} axis The axis.\n * @param {String} xy Accepts 'x' or 'y'.\n * @param {Number} index The axis index.\n * @return {Object} The axis config.\n */\n Output.prototype._makeAxisConfig = function(axis, xy, index) {\n var scaleData = {\n id: makeAxisId(xy, index)\n };\n\n if (axis.getPosition() !== Axis.prototype.POS_DEFAULT) {\n scaleData.position = axis.getPosition();\n }\n\n if (axis.getLabel() !== null) {\n scaleData.scaleLabel = {\n display: true,\n labelString: this._cleanData(axis.getLabel())\n };\n }\n\n if (axis.getStepSize() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.stepSize = axis.getStepSize();\n }\n\n if (axis.getMax() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.max = axis.getMax();\n }\n\n if (axis.getMin() !== null) {\n scaleData.ticks = scaleData.ticks || {};\n scaleData.ticks.min = axis.getMin();\n }\n\n return scaleData;\n };\n\n /**\n * Make the config config.\n *\n * @protected\n * @param {module:core/chart_axis} axis The axis.\n * @return {Object} The axis config.\n */\n Output.prototype._makeConfig = function() {\n var config = {\n type: this._getChartType(),\n data: {\n labels: this._cleanData(this._chart.getLabels()),\n datasets: this._makeDatasetsConfig()\n },\n options: {\n title: {\n display: this._chart.getTitle() !== null,\n text: this._cleanData(this._chart.getTitle())\n }\n }\n };\n\n this._chart.getXAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.xAxes = config.options.scales.xAxes || [];\n config.options.scales.xAxes[i] = this._makeAxisConfig(axis, 'x', i);\n\n if (axisLabels !== null) {\n config.options.scales.xAxes[i].ticks.callback = function(value, index) {\n return axisLabels[index] || '';\n };\n }\n config.options.scales.xAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n this._chart.getYAxes().forEach(function(axis, i) {\n var axisLabels = axis.getLabels();\n\n config.options.scales = config.options.scales || {};\n config.options.scales.yAxes = config.options.scales.yAxes || [];\n config.options.scales.yAxes[i] = this._makeAxisConfig(axis, 'y', i);\n\n if (axisLabels !== null) {\n config.options.scales.yAxes[i].ticks.callback = function(value) {\n return axisLabels[parseInt(value, 10)] || '';\n };\n }\n config.options.scales.yAxes[i].stacked = this._isStacked();\n }.bind(this));\n\n config.options.tooltips = {\n callbacks: {\n label: this._makeTooltip.bind(this)\n }\n };\n\n return config;\n };\n\n /**\n * Get the datasets configurations.\n *\n * @protected\n * @return {Object[]}\n */\n Output.prototype._makeDatasetsConfig = function() {\n var sets = this._chart.getSeries().map(function(series) {\n var colors = series.hasColoredValues() ? series.getColors() : series.getColor();\n var dataset = {\n label: this._cleanData(series.getLabel()),\n data: series.getValues(),\n type: series.getType(),\n fill: false,\n backgroundColor: colors,\n // Pie charts look better without borders.\n borderColor: this._chart.getType() == Pie.prototype.TYPE ? '#fff' : colors,\n lineTension: this._isSmooth(series) ? 0.3 : 0\n };\n\n if (series.getXAxis() !== null) {\n dataset.xAxisID = makeAxisId('x', series.getXAxis());\n }\n if (series.getYAxis() !== null) {\n dataset.yAxisID = makeAxisId('y', series.getYAxis());\n }\n\n return dataset;\n }.bind(this));\n return sets;\n };\n\n /**\n * Get the chart data, add labels and rebuild the tooltip.\n *\n * @param {Object[]} tooltipItem The tooltip item data.\n * @param {Object[]} data The chart data.\n * @returns {String}\n * @protected\n */\n Output.prototype._makeTooltip = function(tooltipItem, data) {\n\n // Get series and chart data to rebuild the tooltip and add labels.\n var series = this._chart.getSeries()[tooltipItem.datasetIndex];\n var serieLabel = series.getLabel();\n var serieLabels = series.getLabels();\n var chartData = data.datasets[tooltipItem.datasetIndex].data;\n var tooltipData = chartData[tooltipItem.index];\n\n // Build default tooltip.\n var tooltip = [];\n\n // Pie and doughnut charts does not have axis.\n if (tooltipItem.xLabel == '' && tooltipItem.yLabel == '') {\n var chartLabels = this._cleanData(this._chart.getLabels());\n tooltip.push(chartLabels[tooltipItem.index]);\n }\n\n // Add series labels to the tooltip if any.\n if (serieLabels !== null) {\n tooltip.push(this._cleanData(serieLabels[tooltipItem.index]));\n } else {\n tooltip.push(this._cleanData(serieLabel) + ': ' + tooltipData);\n }\n\n return tooltip;\n };\n\n /**\n * Verify if the chart line is smooth or not.\n *\n * @protected\n * @param {module:core/chart_series} series The series.\n * @returns {Bool}\n */\n Output.prototype._isSmooth = function(series) {\n var smooth = false;\n if (this._chart.getType() === Line.prototype.TYPE) {\n smooth = series.getSmooth();\n if (smooth === null) {\n smooth = this._chart.getSmooth();\n }\n } else if (series.getType() === Series.prototype.TYPE_LINE) {\n smooth = series.getSmooth();\n }\n\n return smooth;\n };\n\n /**\n * Verify if the bar chart is stacked or not.\n *\n * @protected\n * @returns {Bool}\n */\n Output.prototype._isStacked = function() {\n var stacked = false;\n\n // Stacking is (currently) only supported for bar charts.\n if (this._chart.getType() === Bar.prototype.TYPE) {\n stacked = this._chart.getStacked();\n }\n\n return stacked;\n };\n\n /** @override */\n Output.prototype.update = function() {\n $.extend(true, this._config, this._makeConfig());\n this._chartjs.update();\n };\n\n return Output;\n\n});\n"],"file":"chart_output_chartjs.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_output_htmltable.min.js b/lib/amd/build/chart_output_htmltable.min.js index d34d9051ce2cc..c187ab8dd8c19 100644 --- a/lib/amd/build/chart_output_htmltable.min.js +++ b/lib/amd/build/chart_output_htmltable.min.js @@ -1 +1,2 @@ -define(["jquery","core/chart_output_base"],function(a,b){function c(){b.prototype.constructor.apply(this,arguments),this._build()}return c.prototype=Object.create(b.prototype),c.prototype._build=function(){this._node.empty(),this._node.append(this._makeTable())},c.prototype._makeTable=function(){var b,c,d,e=a(""),f=this._chart,g=f.getLabels(),h=g.length>0,i=f.getSeries(),j=i[0].getCount();e.addClass("chart-output-htmltable generaltable"),null!==f.getTitle()&&e.append(a(""),h&&b.append(a("
        ").text(f.getTitle())),b=a("
        ")),i.forEach(function(c){b.append(a("").text(c.getLabel()).attr("scope","col"))}),e.append(b);for(var k=0;k"),g.length>0&&b.append(a("").text(g[k]).attr("scope","row"));for(var l=0;l").text(c));e.append(b)}return e},c.prototype.update=function(){this._build()},c}); \ No newline at end of file +define ("core/chart_output_htmltable",["jquery","core/chart_output_base"],function(a,b){function c(){b.prototype.constructor.apply(this,arguments);this._build()}c.prototype=Object.create(b.prototype);c.prototype._build=function(){this._node.empty();this._node.append(this._makeTable())};c.prototype._makeTable=function(){var b=a(""),d=this._chart,c,e,f=d.getLabels(),g=0").text(d.getTitle()))}c=a("");if(g){c.append(a("
        "))}h.forEach(function(b){c.append(a("").text(b.getLabel()).attr("scope","col"))});b.append(c);for(var k=0;k");if(0").text(f[k]).attr("scope","row"))}for(var l=0;l").text(e))}b.append(c)}return b};c.prototype.update=function(){this._build()};return c}); +//# sourceMappingURL=chart_output_htmltable.min.js.map diff --git a/lib/amd/build/chart_output_htmltable.min.js.map b/lib/amd/build/chart_output_htmltable.min.js.map new file mode 100644 index 0000000000000..21e305990e0de --- /dev/null +++ b/lib/amd/build/chart_output_htmltable.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chart_output_htmltable.js"],"names":["define","$","Base","Output","prototype","constructor","apply","arguments","_build","Object","create","_node","empty","append","_makeTable","tbl","c","_chart","node","value","labels","getLabels","hasLabel","length","series","getSeries","seriesLabels","rowCount","getCount","addClass","getTitle","text","forEach","serie","getLabel","attr","rowId","serieId","getValues","update"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart output for HTML table.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_output_htmltable\n */\ndefine([\n 'jquery',\n 'core/chart_output_base',\n], function($, Base) {\n\n /**\n * Render a chart as an HTML table.\n *\n * @class\n * @extends {module:core/chart_output_base}\n * @alias module:core/chart_output_htmltable\n */\n function Output() {\n Base.prototype.constructor.apply(this, arguments);\n this._build();\n }\n Output.prototype = Object.create(Base.prototype);\n\n /**\n * Attach the table to the document.\n *\n * @protected\n */\n Output.prototype._build = function() {\n this._node.empty();\n this._node.append(this._makeTable());\n };\n\n /**\n * Builds the table node.\n *\n * @protected\n * @return {Jquery}\n */\n Output.prototype._makeTable = function() {\n var tbl = $(''),\n c = this._chart,\n node,\n value,\n labels = c.getLabels(),\n hasLabel = labels.length > 0,\n series = c.getSeries(),\n seriesLabels,\n rowCount = series[0].getCount();\n\n // Identify the table.\n tbl.addClass('chart-output-htmltable generaltable');\n\n // Set the caption.\n if (c.getTitle() !== null) {\n tbl.append($('');\n if (hasLabel) {\n node.append($('');\n if (labels.length > 0) {\n node.append(\n $(') where each draggable element has a drag handle.\n * The best practice is to use the template core/drag_handle:\n * $OUTPUT->render_from_template('core/drag_handle', ['movetitle' => get_string('movecontent', 'moodle', ELEMENTNAME)]);\n *\n * Attach this JS module to this list:\n *\n * Space between define and ( critical in comment but not allowed in code in order to function\n * correctly with Moodle's requirejs.php\n *\n * define (['jquery', 'core/sortable_list'], function($, SortableList) {\n * var list = new SortableList('ul.my-awesome-list'); // source list (usually
          or
        ) - selector or element\n *\n * // Listen to the events when element is dragged.\n * $('ul.my-awesome-list > *').on(SortableList.EVENTS.DROP, function(evt, info) {\n * console.log(info);\n * });\n *\n * // Advanced usage. Overwrite methods getElementName, getDestinationName, moveDialogueTitle, for example:\n * list.getElementName = function(element) {\n * return $.Deferred().resolve(element.attr('data-name'));\n * }\n * }\n *\n * More details: https://docs.moodle.org/dev/Sortable_list\n *\n * For the full list of possible parameters see var defaultParameters below.\n *\n * The following jQuery events are fired:\n * - SortableList.EVENTS.DRAGSTART : when user started dragging a list element\n * - SortableList.EVENTS.DRAG : when user dragged a list element to a new position\n * - SortableList.EVENTS.DROP : when user dropped a list element\n * - SortableList.EVENTS.DROPEND : when user finished dragging - either fired right after dropping or\n * if \"Esc\" was pressed during dragging\n *\n * @module core/sortable_list\n * @class sortable_list\n * @package core\n * @copyright 2018 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/log', 'core/autoscroll', 'core/str', 'core/modal_factory', 'core/modal_events', 'core/notification'],\nfunction($, log, autoScroll, str, ModalFactory, ModalEvents, Notification) {\n\n /**\n * Default parameters\n *\n * @private\n * @type {Object}\n */\n var defaultParameters = {\n targetListSelector: null,\n moveHandlerSelector: '[data-drag-type=move]',\n isHorizontal: false,\n autoScroll: true\n };\n\n /**\n * Class names for different elements that may be changed during sorting\n *\n * @private\n * @type {Object}\n */\n var CSS = {\n keyboardDragClass: 'dragdrop-keyboard-drag',\n isDraggedClass: 'sortable-list-is-dragged',\n currentPositionClass: 'sortable-list-current-position',\n sourceListClass: 'sortable-list-source',\n targetListClass: 'sortable-list-target',\n overElementClass: 'sortable-list-over-element'\n };\n\n /**\n * Test the browser support for options objects on event listeners.\n * @return {Boolean}\n */\n var eventListenerOptionsSupported = function() {\n var passivesupported = false,\n options,\n testeventname = \"testpassiveeventoptions\";\n\n // Options support testing example from:\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n\n try {\n options = Object.defineProperty({}, \"passive\", {\n get: function() {\n passivesupported = true;\n }\n });\n\n // We use an event name that is not likely to conflict with any real event.\n document.addEventListener(testeventname, options, options);\n // We remove the event listener as we have tested the options already.\n document.removeEventListener(testeventname, options, options);\n } catch (err) {\n // It's already false.\n passivesupported = false;\n }\n return passivesupported;\n };\n\n /**\n * Allow to create non-passive touchstart listeners and prevent page scrolling when dragging\n * From: https://stackoverflow.com/a/48098097\n *\n * @type {Object}\n */\n var registerNotPassiveListeners = function(eventname) {\n return {\n setup: function(x, ns, handle) {\n if (ns.includes('notPassive')) {\n this.addEventListener(eventname, handle, {passive: false});\n return true;\n } else {\n return false;\n }\n }\n };\n };\n\n if (eventListenerOptionsSupported) {\n $.event.special.touchstart = registerNotPassiveListeners('touchstart');\n $.event.special.touchmove = registerNotPassiveListeners('touchmove');\n $.event.special.touchend = registerNotPassiveListeners('touchend');\n }\n\n /**\n * Initialise sortable list.\n *\n * @param {(String|jQuery|Element)} root JQuery/DOM element representing sortable list (i.e.
          ,
        ) or CSS selector\n * @param {Object} config Parameters for the list. See defaultParameters above for examples.\n * @property {(String|jQuery|Element)} config.targetListSelector target lists, by default same as root\n * @property {String} config.moveHandlerSelector CSS selector for a drag handle. By default '[data-drag-type=move]'\n * @property {String} config.targetListSelector CSS selector for target lists. By default the same as root\n * @property {(Boolean|Function)} config.isHorizontal Set to true if the list is horizontal\n * (can also be a callback with list as an argument)\n * @property {Boolean} config.autoScroll Engages autoscroll module for automatic vertical scrolling of the\n * whole page, by default true\n */\n var SortableList = function(root, config) {\n\n this.info = null;\n this.proxy = null;\n this.proxyDelta = null;\n this.dragCounter = 0;\n this.lastEvent = null;\n\n this.config = $.extend({}, defaultParameters, config || {});\n this.config.listSelector = root;\n if (!this.config.targetListSelector) {\n this.config.targetListSelector = root;\n }\n if (typeof this.config.listSelector === 'object') {\n // The root is an element on the page. Register a listener for this element.\n $(this.config.listSelector).on('mousedown touchstart.notPassive', $.proxy(this.dragStartHandler, this));\n } else {\n // The root is a CSS selector. Register a listener that picks up the element dynamically.\n $('body').on('mousedown touchstart.notPassive', this.config.listSelector, $.proxy(this.dragStartHandler, this));\n }\n if (this.config.moveHandlerSelector !== null) {\n $('body').on('click keypress', this.config.moveHandlerSelector, $.proxy(this.clickHandler, this));\n }\n\n };\n\n /**\n * Events fired by this entity\n *\n * @public\n * @type {Object}\n */\n SortableList.EVENTS = {\n DRAGSTART: 'sortablelist-dragstart',\n DRAG: 'sortablelist-drag',\n DROP: 'sortablelist-drop',\n DRAGEND: 'sortablelist-dragend'\n };\n\n /**\n * Resets the temporary classes assigned during dragging\n * @private\n */\n SortableList.prototype.resetDraggedClasses = function() {\n var classes = [\n CSS.isDraggedClass,\n CSS.currentPositionClass,\n CSS.overElementClass,\n CSS.targetListClass,\n ];\n for (var i in classes) {\n $('.' + classes[i]).removeClass(classes[i]);\n }\n if (this.proxy) {\n this.proxy.remove();\n this.proxy = $();\n }\n };\n\n /**\n * Calculates evt.pageX, evt.pageY, evt.clientX and evt.clientY\n *\n * For touch events pageX and pageY are taken from the first touch;\n * For the emulated mousemove event they are taken from the last real event.\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.calculatePositionOnPage = function(evt) {\n\n if (evt.originalEvent && evt.originalEvent.touches && evt.originalEvent.touches[0] !== undefined) {\n // This is a touchmove or touchstart event, get position from the first touch position.\n var touch = evt.originalEvent.touches[0];\n evt.pageX = touch.pageX;\n evt.pageY = touch.pageY;\n }\n\n if (evt.pageX === undefined) {\n // Information is not present in case of touchend or when event was emulated by autoScroll.\n // Take the absolute mouse position from the last event.\n evt.pageX = this.lastEvent.pageX;\n evt.pageY = this.lastEvent.pageY;\n } else {\n this.lastEvent = evt;\n }\n\n if (evt.clientX === undefined) {\n // If not provided in event calculate relative mouse position.\n evt.clientX = Math.round(evt.pageX - $(window).scrollLeft());\n evt.clientY = Math.round(evt.pageY - $(window).scrollTop());\n }\n };\n\n /**\n * Handler from dragstart event\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragStartHandler = function(evt) {\n if (this.info !== null) {\n if (this.info.type === 'click' || this.info.type === 'touchend') {\n // Ignore double click.\n return;\n }\n // Mouse down or touch while already dragging, cancel previous dragging.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n }\n\n if (evt.type === 'mousedown' && evt.which !== 1) {\n // We only need left mouse click. If this is a mousedown event with right/middle click ignore it.\n return;\n }\n\n this.calculatePositionOnPage(evt);\n var movedElement = $(evt.target).closest($(evt.currentTarget).children());\n if (!movedElement.length) {\n // Can't find the element user wants to drag. They clicked on the list but outside of any element of the list.\n return;\n }\n\n // Check that we grabbed the element by the handle.\n if (this.config.moveHandlerSelector !== null) {\n if (!$(evt.target).closest(this.config.moveHandlerSelector, movedElement).length) {\n return;\n }\n }\n\n evt.stopPropagation();\n evt.preventDefault();\n\n // Information about moved element with original location.\n // This object is passed to event observers.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: movedElement.parent(),\n targetNextElement: movedElement.next(),\n targetList: movedElement.parent(),\n type: evt.type,\n dropped: false,\n startX: evt.pageX,\n startY: evt.pageY,\n startTime: new Date().getTime()\n };\n\n $(this.config.targetListSelector).addClass(CSS.targetListClass);\n\n var offset = movedElement.offset();\n movedElement.addClass(CSS.currentPositionClass);\n this.proxyDelta = {x: offset.left - evt.pageX, y: offset.top - evt.pageY};\n this.proxy = $();\n var thisDragCounter = this.dragCounter;\n setTimeout($.proxy(function() {\n // This mousedown event may in fact be a beginning of a 'click' event. Use timeout before showing the\n // dragged object so we can catch click event. When timeout finishes make sure that click event\n // has not happened during this half a second.\n // Verify dragcounter to make sure the user did not manage to do two very fast drag actions one after another.\n if (this.info === null || this.info.type === 'click' || this.info.type === 'keypress'\n || this.dragCounter !== thisDragCounter) {\n return;\n }\n\n // Create a proxy - the copy of the dragged element that moves together with a mouse.\n this.createProxy();\n }, this), 500);\n\n // Start drag.\n $(window).on('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).on('keypress', $.proxy(this.dragcancelHandler, this));\n\n // Start autoscrolling. Every time the page is scrolled emulate the mousemove event.\n if (this.config.autoScroll) {\n autoScroll.start(function() {\n $(window).trigger('mousemove');\n });\n }\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n };\n\n /**\n * Creates a \"proxy\" object - a copy of the element that is being moved that always follows the mouse\n * @private\n */\n SortableList.prototype.createProxy = function() {\n this.proxy = this.info.element.clone();\n this.info.sourceList.append(this.proxy);\n this.proxy.removeAttr('id').removeClass(CSS.currentPositionClass)\n .addClass(CSS.isDraggedClass).css({position: 'fixed'});\n this.proxy.offset({top: this.proxyDelta.y + this.lastEvent.pageY, left: this.proxyDelta.x + this.lastEvent.pageX});\n };\n\n /**\n * Handler for click event - when user clicks on the drag handler or presses Enter on keyboard\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.clickHandler = function(evt) {\n if (evt.type === 'keypress' && evt.originalEvent.keyCode !== 13 && evt.originalEvent.keyCode !== 32) {\n return;\n }\n if (this.info !== null) {\n // Ignore double click.\n return;\n }\n\n // Find the element that this draghandle belongs to.\n var clickedElement = $(evt.target).closest(this.config.moveHandlerSelector),\n sourceList = clickedElement.closest(this.config.listSelector),\n movedElement = clickedElement.closest(sourceList.children());\n if (!movedElement.length) {\n return;\n }\n\n evt.preventDefault();\n evt.stopPropagation();\n\n // Store information about moved element with original location.\n this.dragCounter++;\n this.info = {\n element: movedElement,\n sourceNextElement: movedElement.next(),\n sourceList: sourceList,\n targetNextElement: movedElement.next(),\n targetList: sourceList,\n dropped: false,\n type: evt.type,\n startTime: new Date().getTime()\n };\n\n this.executeCallback(SortableList.EVENTS.DRAGSTART);\n this.displayMoveDialogue(clickedElement);\n };\n\n /**\n * Finds the position of the mouse inside the element - on the top, on the bottom, on the right or on the left\\\n *\n * Used to determine if the moved element should be moved after or before the current element\n *\n * @private\n * @param {Number} pageX\n * @param {Number} pageY\n * @param {jQuery} element\n * @returns {(Object|null)}\n */\n SortableList.prototype.getPositionInNode = function(pageX, pageY, element) {\n if (!element.length) {\n return null;\n }\n var node = element[0],\n offset = 0,\n rect = node.getBoundingClientRect(),\n y = pageY - (rect.top + window.scrollY),\n x = pageX - (rect.left + window.scrollX);\n if (x >= -offset && x <= rect.width + offset && y >= -offset && y <= rect.height + offset) {\n return {\n x: x,\n y: y,\n xRatio: rect.width ? (x / rect.width) : 0,\n yRatio: rect.height ? (y / rect.height) : 0\n };\n }\n return null;\n };\n\n /**\n * Check if list is horizontal\n *\n * @param {jQuery} element\n * @return {Boolean}\n */\n SortableList.prototype.isListHorizontal = function(element) {\n var isHorizontal = this.config.isHorizontal;\n if (isHorizontal === true || isHorizontal === false) {\n return isHorizontal;\n }\n return isHorizontal(element);\n };\n\n /**\n * Handler for events mousemove touchmove mouseup touchend\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragHandler = function(evt) {\n\n evt.preventDefault();\n evt.stopPropagation();\n\n this.calculatePositionOnPage(evt);\n\n // We can not use evt.target here because it will most likely be our proxy.\n // Move the proxy out of the way so we can find the element at the current mouse position.\n this.proxy.offset({top: -1000, left: -1000});\n // Find the element at the current mouse position.\n var element = $(document.elementFromPoint(evt.clientX, evt.clientY));\n\n // Find the list element and the list over the mouse position.\n var mainElement = this.info.element[0],\n isNotSelf = function() {\n return this !== mainElement;\n },\n current = element.closest('.' + CSS.targetListClass + ' > :not(.' + CSS.isDraggedClass + ')').filter(isNotSelf),\n currentList = element.closest('.' + CSS.targetListClass),\n proxy = this.proxy,\n isNotProxy = function() {\n return !proxy || !proxy.length || this !== proxy[0];\n };\n\n // Add the specified class to the list element we are hovering.\n $('.' + CSS.overElementClass).removeClass(CSS.overElementClass);\n current.addClass(CSS.overElementClass);\n\n // Move proxy to the current position.\n this.proxy.offset({top: this.proxyDelta.y + evt.pageY, left: this.proxyDelta.x + evt.pageX});\n\n if (currentList.length && !currentList.children().filter(isNotProxy).length) {\n // Mouse is over an empty list.\n this.moveElement(currentList, $());\n } else if (current.length === 1 && !this.info.element.find(current[0]).length) {\n // Mouse is over an element in a list - find whether we should move the current position\n // above or below this element.\n var coordinates = this.getPositionInNode(evt.pageX, evt.pageY, current);\n if (coordinates) {\n var parent = current.parent(),\n ratio = this.isListHorizontal(parent) ? coordinates.xRatio : coordinates.yRatio,\n subList = current.find('.' + CSS.targetListClass),\n subListEmpty = !subList.children().filter(isNotProxy).filter(isNotSelf).length;\n if (subList.length && subListEmpty && ratio > 0.2 && ratio < 0.8) {\n // This is an element that is a parent of an empty list and we are around the middle of this element.\n // Treat it as if we are over this empty list.\n this.moveElement(subList, $());\n } else if (ratio > 0.5) {\n // Insert after this element.\n this.moveElement(parent, current.next().filter(isNotProxy));\n } else {\n // Insert before this element.\n this.moveElement(parent, current);\n }\n }\n }\n\n if (evt.type === 'mouseup' || evt.type === 'touchend') {\n // Drop the moved element.\n this.info.endX = evt.pageX;\n this.info.endY = evt.pageY;\n this.info.endTime = new Date().getTime();\n this.info.dropped = true;\n this.info.positionChanged = this.hasPositionChanged(this.info);\n var oldinfo = this.info;\n this.executeCallback(SortableList.EVENTS.DROP);\n this.finishDragging();\n\n if (evt.type === 'touchend'\n && this.config.moveHandlerSelector !== null\n && (oldinfo.endTime - oldinfo.startTime < 500)\n && !oldinfo.positionChanged) {\n // The click event is not triggered on touch screens because we call preventDefault in touchstart handler.\n // If the touchend quickly followed touchstart without moving, consider it a \"click\".\n this.clickHandler(evt);\n }\n }\n };\n\n /**\n * Checks if the position of the dragged element in the list has changed\n *\n * @private\n * @param {Object} info\n * @return {Boolean}\n */\n SortableList.prototype.hasPositionChanged = function(info) {\n return info.sourceList[0] !== info.targetList[0] ||\n info.sourceNextElement.length !== info.targetNextElement.length ||\n (info.sourceNextElement.length && info.sourceNextElement[0] !== info.targetNextElement[0]);\n };\n\n /**\n * Moves the current position of the dragged element\n *\n * @private\n * @param {jQuery} parentElement\n * @param {jQuery} beforeElement\n */\n SortableList.prototype.moveElement = function(parentElement, beforeElement) {\n var dragEl = this.info.element;\n if (beforeElement.length && beforeElement[0] === dragEl[0]) {\n // Insert before the current position of the dragged element - nothing to do.\n return;\n }\n if (parentElement[0] === this.info.targetList[0] &&\n beforeElement.length === this.info.targetNextElement.length &&\n beforeElement[0] === this.info.targetNextElement[0]) {\n // Insert in the same location as the current position - nothing to do.\n return;\n }\n\n if (beforeElement.length) {\n // Move the dragged element before the specified element.\n parentElement[0].insertBefore(dragEl[0], beforeElement[0]);\n } else if (this.proxy && this.proxy.parent().length && this.proxy.parent()[0] === parentElement[0]) {\n // We need to move to the end of the list but the last element in this list is a proxy.\n // Always leave the proxy in the end of the list.\n parentElement[0].insertBefore(dragEl[0], this.proxy[0]);\n } else {\n // Insert in the end of a list (when proxy is in another list).\n parentElement[0].appendChild(dragEl[0]);\n }\n\n // Save the current position of the dragged element in the list.\n this.info.targetList = parentElement;\n this.info.targetNextElement = beforeElement;\n this.executeCallback(SortableList.EVENTS.DRAG);\n };\n\n /**\n * Finish dragging (when dropped or cancelled).\n * @private\n */\n SortableList.prototype.finishDragging = function() {\n this.resetDraggedClasses();\n if (this.config.autoScroll) {\n autoScroll.stop();\n }\n $(window).off('mousemove touchmove.notPassive mouseup touchend.notPassive', $.proxy(this.dragHandler, this));\n $(window).off('keypress', $.proxy(this.dragcancelHandler, this));\n this.executeCallback(SortableList.EVENTS.DRAGEND);\n this.info = null;\n };\n\n /**\n * Executes callback specified in sortable list parameters\n *\n * @private\n * @param {String} eventName\n */\n SortableList.prototype.executeCallback = function(eventName) {\n this.info.element.trigger(eventName, this.info);\n };\n\n /**\n * Handler from keypress event (cancel dragging when Esc is pressed)\n *\n * @private\n * @param {Event} evt\n */\n SortableList.prototype.dragcancelHandler = function(evt) {\n if (evt.type !== 'keypress' || evt.originalEvent.keyCode !== 27) {\n // Only cancel dragging when Esc was pressed.\n return;\n }\n // Dragging was cancelled. Return item to the original position.\n this.moveElement(this.info.sourceList, this.info.sourceNextElement);\n this.finishDragging();\n };\n\n /**\n * Returns the name of the current element to be used in the move dialogue\n *\n * @public\n * @param {jQuery} element\n * @return {Promise}\n */\n SortableList.prototype.getElementName = function(element) {\n return $.Deferred().resolve(element.text());\n };\n\n /**\n * Returns the label for the potential move destination, i.e. \"After ElementX\" or \"To the top of the list\"\n *\n * Note that we use \"after\" in the label for better UX\n *\n * @public\n * @param {jQuery} parentElement\n * @param {jQuery} afterElement\n * @return {Promise}\n */\n SortableList.prototype.getDestinationName = function(parentElement, afterElement) {\n if (!afterElement.length) {\n return str.get_string('movecontenttothetop', 'moodle');\n } else {\n return this.getElementName(afterElement)\n .then(function(name) {\n return str.get_string('movecontentafter', 'moodle', name);\n });\n }\n };\n\n /**\n * Returns the title for the move dialogue (\"Move elementY\")\n *\n * @public\n * @param {jQuery} element\n * @param {jQuery} handler\n * @return {Promise}\n */\n SortableList.prototype.getMoveDialogueTitle = function(element, handler) {\n if (handler.attr('title')) {\n return $.Deferred().resolve(handler.attr('title'));\n }\n return this.getElementName(element).then(function(name) {\n return str.get_string('movecontent', 'moodle', name);\n });\n };\n\n /**\n * Returns the list of possible move destinations\n *\n * @private\n * @return {Promise}\n */\n SortableList.prototype.getDestinationsList = function() {\n var addedLists = [],\n targets = $(this.config.targetListSelector),\n destinations = $('
        ').text(c.getTitle()));\n }\n\n // Write the column headers.\n node = $('
        '));\n }\n series.forEach(function(serie) {\n node.append(\n $('')\n .text(serie.getLabel())\n .attr('scope', 'col')\n );\n });\n tbl.append(node);\n\n // Write rows.\n for (var rowId = 0; rowId < rowCount; rowId++) {\n node = $('
        ')\n .text(labels[rowId])\n .attr('scope', 'row')\n );\n }\n for (var serieId = 0; serieId < series.length; serieId++) {\n value = series[serieId].getValues()[rowId];\n seriesLabels = series[serieId].getLabels();\n if (seriesLabels !== null) {\n value = series[serieId].getLabels()[rowId];\n }\n node.append($('').text(value));\n }\n tbl.append(node);\n }\n\n return tbl;\n };\n\n /** @override */\n Output.prototype.update = function() {\n this._build();\n };\n\n return Output;\n\n});\n"],"file":"chart_output_htmltable.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_pie.min.js b/lib/amd/build/chart_pie.min.js index 0d568cd5f828e..5a99d4fcf3efd 100644 --- a/lib/amd/build/chart_pie.min.js +++ b/lib/amd/build/chart_pie.min.js @@ -1 +1,2 @@ -define(["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}return b.prototype=Object.create(a.prototype),b.prototype.TYPE="pie",b.prototype._doughnut=null,b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);return d.setDoughnut(c.doughnut),d},b.prototype.addSeries=function(b){if(null===b.getColor()){for(var c=[],d=this.getConfigColorSet()||a.prototype.COLORSET,e=0;e=1)throw new Error("Pie charts only support one serie.");return a.prototype._validateSeries.apply(this,arguments)},b}); \ No newline at end of file +define ("core/chart_pie",["core/chart_base"],function(a){function b(){a.prototype.constructor.apply(this,arguments)}b.prototype=Object.create(a.prototype);b.prototype.TYPE="pie";b.prototype._doughnut=null;b.prototype.create=function(b,c){var d=a.prototype.create.apply(this,arguments);d.setDoughnut(c.doughnut);return d};b.prototype.addSeries=function(b){if(null===b.getColor()){for(var c=[],d=this.getConfigColorSet()||a.prototype.COLORSET,e=0;e.\n\n/**\n * Chart pie.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_pie\n */\ndefine(['core/chart_base'], function(Base) {\n\n /**\n * Pie chart.\n *\n * @class\n * @alias module:core/chart_pie\n * @extends {module:core/chart_base}\n */\n function Pie() {\n Base.prototype.constructor.apply(this, arguments);\n }\n Pie.prototype = Object.create(Base.prototype);\n\n /** @override */\n Pie.prototype.TYPE = 'pie';\n\n /**\n * Whether the chart should be displayed as doughnut or not.\n *\n * @type {Bool}\n * @protected\n */\n Pie.prototype._doughnut = null;\n\n /** @override */\n Pie.prototype.create = function(Klass, data) {\n var chart = Base.prototype.create.apply(this, arguments);\n chart.setDoughnut(data.doughnut);\n return chart;\n };\n\n /**\n * Overridden to add appropriate colors to the series.\n *\n * @override\n */\n Pie.prototype.addSeries = function(series) {\n if (series.getColor() === null) {\n var colors = [];\n var configColorSet = this.getConfigColorSet() || Base.prototype.COLORSET;\n for (var i = 0; i < series.getCount(); i++) {\n colors.push(configColorSet[i % configColorSet.length]);\n }\n series.setColors(colors);\n }\n return Base.prototype.addSeries.apply(this, arguments);\n };\n\n /**\n * Get whether the chart should be displayed as doughnut or not.\n *\n * @method getDoughnut\n * @returns {Bool}\n */\n Pie.prototype.getDoughnut = function() {\n return this._doughnut;\n };\n\n /**\n * Set whether the chart should be displayed as doughnut or not.\n *\n * @method setDoughnut\n * @param {Bool} doughnut True for doughnut type, false for pie.\n */\n Pie.prototype.setDoughnut = function(doughnut) {\n this._doughnut = Boolean(doughnut);\n };\n\n /**\n * Validate a series.\n *\n * Overrides parent implementation to validate that there is only\n * one series per chart instance.\n *\n * @override\n */\n Pie.prototype._validateSeries = function() {\n if (this._series.length >= 1) {\n throw new Error('Pie charts only support one serie.');\n }\n return Base.prototype._validateSeries.apply(this, arguments);\n };\n\n return Pie;\n\n});\n"],"file":"chart_pie.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chart_series.min.js b/lib/amd/build/chart_series.min.js index c913cdb76b64b..20e78fdd7cb83 100644 --- a/lib/amd/build/chart_series.min.js +++ b/lib/amd/build/chart_series.min.js @@ -1 +1,2 @@ -define([],function(){function a(a,b){if("string"!=typeof a)throw new Error("Invalid label for series.");if("object"!=typeof b)throw new Error("Values for a series must be an array.");if(b.length<1)throw new Error("Invalid values received for series.");this._colors=[],this._label=a,this._values=b}return a.prototype.TYPE_DEFAULT=null,a.prototype.TYPE_LINE="line",a.prototype._colors=null,a.prototype._label=null,a.prototype._labels=null,a.prototype._smooth=!1,a.prototype._type=a.prototype.TYPE_DEFAULT,a.prototype._values=null,a.prototype._xaxis=null,a.prototype._yaxis=null,a.prototype.create=function(b){var c=new a(b.label,b.values);return c.setType(b.type),c.setXAxis(b.axes.x),c.setYAxis(b.axes.y),c.setLabels(b.labels),b.colors&&b.colors.length>1?c.setColors(b.colors):c.setColor(b.colors[0]),c.setSmooth(b.smooth),c},a.prototype.getColor=function(){return this._colors[0]||null},a.prototype.getColors=function(){return this._colors},a.prototype.getCount=function(){return this._values.length},a.prototype.getLabel=function(){return this._label},a.prototype.getLabels=function(){return this._labels},a.prototype.getSmooth=function(){return this._smooth},a.prototype.getType=function(){return this._type},a.prototype.getValues=function(){return this._values},a.prototype.getXAxis=function(){return this._xaxis},a.prototype.getYAxis=function(){return this._yaxis},a.prototype.hasColoredValues=function(){return this._colors.length==this.getCount()},a.prototype.setColor=function(a){this._colors=[a]},a.prototype.setColors=function(a){if(a&&a.length!=this.getCount())throw new Error("When setting multiple colors there must be one per value.");this._colors=a||[]},a.prototype.setLabels=function(a){this._validateLabels(a),a="undefined"==typeof a?null:a,this._labels=a},a.prototype.setSmooth=function(a){a="undefined"==typeof a?null:a,this._smooth=a},a.prototype.setType=function(a){if(a!=this.TYPE_DEFAULT&&a!=this.TYPE_LINE)throw new Error("Invalid serie type.");this._type=a||null},a.prototype.setXAxis=function(a){this._xaxis=a||null},a.prototype.setYAxis=function(a){this._yaxis=a||null},a.prototype._validateLabels=function(a){if(a&&a.length>0&&a.length!=this.getCount())throw new Error("Series labels must match series values.")},a}); \ No newline at end of file +function _typeof(a){if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("core/chart_series",[],function(){function a(a,b){if("string"!=typeof a){throw new Error("Invalid label for series.")}else if("object"!==_typeof(b)){throw new Error("Values for a series must be an array.")}else if(1>b.length){throw new Error("Invalid values received for series.")}this._colors=[];this._label=a;this._values=b}a.prototype.TYPE_DEFAULT=null;a.prototype.TYPE_LINE="line";a.prototype._colors=null;a.prototype._label=null;a.prototype._labels=null;a.prototype._smooth=!1;a.prototype._type=a.prototype.TYPE_DEFAULT;a.prototype._values=null;a.prototype._xaxis=null;a.prototype._yaxis=null;a.prototype.create=function(b){var c=new a(b.label,b.values);c.setType(b.type);c.setXAxis(b.axes.x);c.setYAxis(b.axes.y);c.setLabels(b.labels);if(b.colors&&1.\n\n/**\n * Chart series.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @module core/chart_series\n */\ndefine([], function() {\n\n /**\n * Chart data series.\n *\n * @class\n * @alias module:core/chart_series\n * @param {String} label The series label.\n * @param {Number[]} values The values.\n */\n function Series(label, values) {\n if (typeof label !== 'string') {\n throw new Error('Invalid label for series.');\n\n } else if (typeof values !== 'object') {\n throw new Error('Values for a series must be an array.');\n\n } else if (values.length < 1) {\n throw new Error('Invalid values received for series.');\n }\n\n this._colors = [];\n this._label = label;\n this._values = values;\n }\n\n /**\n * The default type of series.\n *\n * @type {Null}\n * @const\n */\n Series.prototype.TYPE_DEFAULT = null;\n\n /**\n * Type of series 'line'.\n *\n * @type {String}\n * @const\n */\n Series.prototype.TYPE_LINE = 'line';\n\n /**\n * The colors of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._colors = null;\n\n /**\n * The label of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._label = null;\n\n /**\n * The labels for the values of the series.\n *\n * @type {String[]}\n * @protected\n */\n Series.prototype._labels = null;\n\n /**\n * Whether the line of the serie should be smooth or not.\n *\n * @type {Bool}\n * @protected\n */\n Series.prototype._smooth = false;\n\n /**\n * The type of the series.\n *\n * @type {String}\n * @protected\n */\n Series.prototype._type = Series.prototype.TYPE_DEFAULT;\n\n /**\n * The values in the series.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._values = null;\n\n /**\n * The index of the X axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._xaxis = null;\n\n /**\n * The index of the Y axis.\n *\n * @type {Number[]}\n * @protected\n */\n Series.prototype._yaxis = null;\n\n /**\n * Create a new instance of a series from serialised data.\n *\n * @static\n * @method create\n * @param {Object} obj The data of the series.\n * @return {module:core/chart_series}\n */\n Series.prototype.create = function(obj) {\n var s = new Series(obj.label, obj.values);\n s.setType(obj.type);\n s.setXAxis(obj.axes.x);\n s.setYAxis(obj.axes.y);\n s.setLabels(obj.labels);\n\n // Colors are exported as an array with 1, or n values.\n if (obj.colors && obj.colors.length > 1) {\n s.setColors(obj.colors);\n } else {\n s.setColor(obj.colors[0]);\n }\n\n s.setSmooth(obj.smooth);\n return s;\n };\n\n /**\n * Get the color.\n *\n * @return {String}\n */\n Series.prototype.getColor = function() {\n return this._colors[0] || null;\n };\n\n /**\n * Get the colors for each value in the series.\n *\n * @return {String[]}\n */\n Series.prototype.getColors = function() {\n return this._colors;\n };\n\n /**\n * Get the number of values in the series.\n *\n * @return {Number}\n */\n Series.prototype.getCount = function() {\n return this._values.length;\n };\n\n /**\n * Get the series label.\n *\n * @return {String}\n */\n Series.prototype.getLabel = function() {\n return this._label;\n };\n\n /**\n * Get labels for the values of the series.\n *\n * @return {String[]}\n */\n Series.prototype.getLabels = function() {\n return this._labels;\n };\n\n /**\n * Get whether the line of the serie should be smooth or not.\n *\n * @returns {Bool}\n */\n Series.prototype.getSmooth = function() {\n return this._smooth;\n };\n\n /**\n * Get the series type.\n *\n * @return {String}\n */\n Series.prototype.getType = function() {\n return this._type;\n };\n\n /**\n * Get the series values.\n *\n * @return {Number[]}\n */\n Series.prototype.getValues = function() {\n return this._values;\n };\n\n /**\n * Get the index of the X axis.\n *\n * @return {Number}\n */\n Series.prototype.getXAxis = function() {\n return this._xaxis;\n };\n\n /**\n * Get the index of the Y axis.\n *\n * @return {Number}\n */\n Series.prototype.getYAxis = function() {\n return this._yaxis;\n };\n\n /**\n * Whether there is a color per value.\n *\n * @return {Bool}\n */\n Series.prototype.hasColoredValues = function() {\n return this._colors.length == this.getCount();\n };\n\n /**\n * Set the series color.\n *\n * @param {String} color A CSS-compatible color.\n */\n Series.prototype.setColor = function(color) {\n this._colors = [color];\n };\n\n /**\n * Set a color for each value in the series.\n *\n * @param {String[]} colors CSS-compatible colors.\n */\n Series.prototype.setColors = function(colors) {\n if (colors && colors.length != this.getCount()) {\n throw new Error('When setting multiple colors there must be one per value.');\n }\n this._colors = colors || [];\n };\n\n /**\n * Set the labels for the values of the series.\n *\n * @param {String[]} labels the labels of the series values.\n */\n Series.prototype.setLabels = function(labels) {\n this._validateLabels(labels);\n labels = typeof labels === 'undefined' ? null : labels;\n this._labels = labels;\n };\n\n /**\n * Set Whether the line of the serie should be smooth or not.\n *\n * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).\n *\n * @param {Bool} smooth True if the lines should be smooth, false for tensioned lines.\n */\n Series.prototype.setSmooth = function(smooth) {\n smooth = typeof smooth === 'undefined' ? null : smooth;\n this._smooth = smooth;\n };\n\n /**\n * Set the type of the series.\n *\n * @param {String} type A type constant value.\n */\n Series.prototype.setType = function(type) {\n if (type != this.TYPE_DEFAULT && type != this.TYPE_LINE) {\n throw new Error('Invalid serie type.');\n }\n this._type = type || null;\n };\n\n /**\n * Set the index of the X axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setXAxis = function(index) {\n this._xaxis = index || null;\n };\n\n\n /**\n * Set the index of the Y axis.\n *\n * @param {Number} index The index.\n */\n Series.prototype.setYAxis = function(index) {\n this._yaxis = index || null;\n };\n\n /**\n * Validate series labels.\n *\n * @protected\n * @param {String[]} labels The labels of the serie.\n */\n Series.prototype._validateLabels = function(labels) {\n if (labels && labels.length > 0 && labels.length != this.getCount()) {\n throw new Error('Series labels must match series values.');\n }\n };\n\n return Series;\n\n});\n"],"file":"chart_series.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chartjs-lazy.min.js b/lib/amd/build/chartjs-lazy.min.js index b672fc1b05fc0..c656960416fd7 100644 --- a/lib/amd/build/chartjs-lazy.min.js +++ b/lib/amd/build/chartjs-lazy.min.js @@ -1,7 +1,2 @@ -!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.Chart=a()}}(function(){var a;return function c(a,b,d){function e(g,h){if(!b[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=b[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,c,a,b,d)}return b[g].exports}for(var f="function"==typeof require&&require,g=0;gc?(b+.05)/(c+.05):(c+.05)/(b+.05)},level:function(a){var b=this.contrast(a);return b>=7.1?"AAA":b>=4.5?"AA":""},dark:function(){var a=this.values.rgb,b=(299*a[0]+587*a[1]+114*a[2])/1e3;return b<128},light:function(){return!this.dark()},negate:function(){for(var a=[],b=0;b<3;b++)a[b]=255-this.values.rgb[b];return this.setValues("rgb",a),this},lighten:function(a){var b=this.values.hsl;return b[2]+=b[2]*a,this.setValues("hsl",b),this},darken:function(a){var b=this.values.hsl;return b[2]-=b[2]*a,this.setValues("hsl",b),this},saturate:function(a){var b=this.values.hsl;return b[1]+=b[1]*a,this.setValues("hsl",b),this},desaturate:function(a){var b=this.values.hsl;return b[1]-=b[1]*a,this.setValues("hsl",b),this},whiten:function(a){var b=this.values.hwb;return b[1]+=b[1]*a,this.setValues("hwb",b),this},blacken:function(a){var b=this.values.hwb;return b[2]+=b[2]*a,this.setValues("hwb",b),this},greyscale:function(){var a=this.values.rgb,b=.3*a[0]+.59*a[1]+.11*a[2];return this.setValues("rgb",[b,b,b]),this},clearer:function(a){var b=this.values.alpha;return this.setValues("alpha",b-b*a),this},opaquer:function(a){var b=this.values.alpha;return this.setValues("alpha",b+b*a),this},rotate:function(a){var b=this.values.hsl,c=(b[0]+a)%360;return b[0]=c<0?360+c:c,this.setValues("hsl",b),this},mix:function(a,b){var c=this,d=a,e=void 0===b?.5:b,f=2*e-1,g=c.alpha()-d.alpha(),h=((f*g===-1?f:(f+g)/(1+f*g))+1)/2,i=1-h;return this.rgb(h*c.red()+i*d.red(),h*c.green()+i*d.green(),h*c.blue()+i*d.blue()).alpha(c.alpha()*e+d.alpha()*(1-e))},toJSON:function(){return this.rgb()},clone:function(){var a,b,c=new f,d=this.values,e=c.values;for(var g in d)d.hasOwnProperty(g)&&(a=d[g],b={}.toString.call(a),"[object Array]"===b?e[g]=a.slice(0):"[object Number]"===b?e[g]=a:console.error("unexpected color value:",a));return c}},f.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},f.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},f.prototype.getValues=function(a){for(var b=this.values,c={},d=0;d.04045?Math.pow((b+.055)/1.055,2.4):b/12.92,c=c>.04045?Math.pow((c+.055)/1.055,2.4):c/12.92,d=d>.04045?Math.pow((d+.055)/1.055,2.4):d/12.92;var e=.4124*b+.3576*c+.1805*d,f=.2126*b+.7152*c+.0722*d,g=.0193*b+.1192*c+.9505*d;return[100*e,100*f,100*g]}function l(a){var b,c,d,e=k(a),f=e[0],g=e[1],h=e[2];return f/=95.047,g/=100,h/=108.883,f=f>.008856?Math.pow(f,1/3):7.787*f+16/116,g=g>.008856?Math.pow(g,1/3):7.787*g+16/116,h=h>.008856?Math.pow(h,1/3):7.787*h+16/116,b=116*g-16,c=500*(f-g),d=200*(g-h),[b,c,d]}function m(a){return M(l(a))}function n(a){var b,c,d,e,f,g=a[0]/360,h=a[1]/100,i=a[2]/100;if(0==h)return f=255*i,[f,f,f];c=i<.5?i*(1+h):i+h-i*h,b=2*i-c,e=[0,0,0];for(var j=0;j<3;j++)d=g+1/3*-(j-1),d<0&&d++,d>1&&d--,f=6*d<1?b+6*(c-b)*d:2*d<1?c:3*d<2?b+(c-b)*(2/3-d)*6:b,e[j]=255*f;return e}function o(a){var b,c,d=a[0],e=a[1]/100,f=a[2]/100;return 0===f?[0,0,0]:(f*=2,e*=f<=1?f:2-f,c=(f+e)/2,b=2*e/(f+e),[d,100*b,100*c])}function p(a){return h(n(a))}function q(a){return i(n(a))}function s(a){return j(n(a))}function t(a){var b=a[0]/60,c=a[1]/100,d=a[2]/100,e=Math.floor(b)%6,f=b-Math.floor(b),g=255*d*(1-c),h=255*d*(1-c*f),i=255*d*(1-c*(1-f)),d=255*d;switch(e){case 0:return[d,i,g];case 1:return[h,d,g];case 2:return[g,d,i];case 3:return[g,h,d];case 4:return[i,g,d];case 5:return[d,g,h]}}function u(a){var b,c,d=a[0],e=a[1]/100,f=a[2]/100;return c=(2-e)*f,b=e*f,b/=c<=1?c:2-c,b=b||0,c/=2,[d,100*b,100*c]}function v(a){return h(t(a))}function w(a){return i(t(a))}function x(a){return j(t(a))}function y(a){var c,d,e,f,h=a[0]/360,i=a[1]/100,j=a[2]/100,k=i+j;switch(k>1&&(i/=k,j/=k),c=Math.floor(6*h),d=1-j,e=6*h-c,0!=(1&c)&&(e=1-e),f=i+e*(d-i),c){default:case 6:case 0:r=d,g=f,b=i;break;case 1:r=f,g=d,b=i;break;case 2:r=i,g=d,b=f;break;case 3:r=i,g=f,b=d;break;case 4:r=f,g=i,b=d;break;case 5:r=d,g=i,b=f}return[255*r,255*g,255*b]}function z(a){return e(y(a))}function A(a){return f(y(a))}function B(a){return i(y(a))}function C(a){return j(y(a))}function D(a){var b,c,d,e=a[0]/100,f=a[1]/100,g=a[2]/100,h=a[3]/100;return b=1-Math.min(1,e*(1-h)+h),c=1-Math.min(1,f*(1-h)+h),d=1-Math.min(1,g*(1-h)+h),[255*b,255*c,255*d]}function E(a){return e(D(a))}function F(a){return f(D(a))}function G(a){return h(D(a))}function H(a){return j(D(a))}function I(a){var b,c,d,e=a[0]/100,f=a[1]/100,g=a[2]/100;return b=3.2406*e+f*-1.5372+g*-.4986,c=e*-.9689+1.8758*f+.0415*g,d=.0557*e+f*-.204+1.057*g,b=b>.0031308?1.055*Math.pow(b,1/2.4)-.055:b=12.92*b,c=c>.0031308?1.055*Math.pow(c,1/2.4)-.055:c=12.92*c,d=d>.0031308?1.055*Math.pow(d,1/2.4)-.055:d=12.92*d,b=Math.min(Math.max(0,b),1),c=Math.min(Math.max(0,c),1),d=Math.min(Math.max(0,d),1),[255*b,255*c,255*d]}function J(a){var b,c,d,e=a[0],f=a[1],g=a[2];return e/=95.047,f/=100,g/=108.883,e=e>.008856?Math.pow(e,1/3):7.787*e+16/116,f=f>.008856?Math.pow(f,1/3):7.787*f+16/116,g=g>.008856?Math.pow(g,1/3):7.787*g+16/116,b=116*f-16,c=500*(e-f),d=200*(f-g),[b,c,d]}function K(a){return M(J(a))}function L(a){var b,c,d,e,f=a[0],g=a[1],h=a[2];return f<=8?(c=100*f/903.3,e=7.787*(c/100)+16/116):(c=100*Math.pow((f+16)/116,3),e=Math.pow(c/100,1/3)),b=b/95.047<=.008856?b=95.047*(g/500+e-16/116)/7.787:95.047*Math.pow(g/500+e,3),d=d/108.883<=.008859?d=108.883*(e-h/200-16/116)/7.787:108.883*Math.pow(e-h/200,3),[b,c,d]}function M(a){var b,c,d,e=a[0],f=a[1],g=a[2];return b=Math.atan2(g,f),c=360*b/2/Math.PI,c<0&&(c+=360),d=Math.sqrt(f*f+g*g),[e,d,c]}function N(a){return I(L(a))}function O(a){var b,c,d,e=a[0],f=a[1],g=a[2];return d=g/360*2*Math.PI,b=f*Math.cos(d),c=f*Math.sin(d),[e,b,c]}function P(a){return L(O(a))}function Q(a){return N(O(a))}function R(a){return Y[a]}function S(a){return e(R(a))}function T(a){return f(R(a))}function U(a){return h(R(a))}function V(a){return i(R(a))}function W(a){return l(R(a))}function X(a){return k(R(a))}c.exports={rgb2hsl:e,rgb2hsv:f,rgb2hwb:h,rgb2cmyk:i,rgb2keyword:j,rgb2xyz:k,rgb2lab:l,rgb2lch:m,hsl2rgb:n,hsl2hsv:o,hsl2hwb:p,hsl2cmyk:q,hsl2keyword:s,hsv2rgb:t,hsv2hsl:u,hsv2hwb:v,hsv2cmyk:w,hsv2keyword:x,hwb2rgb:y,hwb2hsl:z,hwb2hsv:A,hwb2cmyk:B,hwb2keyword:C,cmyk2rgb:D,cmyk2hsl:E,cmyk2hsv:F,cmyk2hwb:G,cmyk2keyword:H,keyword2rgb:R,keyword2hsl:S,keyword2hsv:T,keyword2hwb:U,keyword2cmyk:V,keyword2lab:W,keyword2xyz:X,xyz2rgb:I,xyz2lab:J,xyz2lch:K,lab2xyz:L,lab2rgb:N,lab2lch:M,lch2lab:O,lch2xyz:P,lch2rgb:Q};var Y={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var $ in Y)Z[JSON.stringify(Y[$])]=$},{}],4:[function(a,b,c){var d=a(3),e=function(){return new j};for(var f in d){e[f+"Raw"]=function(a){return function(b){return"number"==typeof b&&(b=Array.prototype.slice.call(arguments)),d[a](b)}}(f);var g=/(\w+)2(\w+)/.exec(f),h=g[1],i=g[2];e[h]=e[h]||{},e[h][i]=e[f]=function(a){return function(b){"number"==typeof b&&(b=Array.prototype.slice.call(arguments));var c=d[a](b);if("string"==typeof c||void 0===c)return c;for(var e=0;e0)for(c=0;c0?"future":"past"];return B(c)?c(b):c.replace(/%s/i,b)}function L(a,b){var c=a.toLowerCase();Jd[c]=Jd[c+"s"]=Jd[b]=a}function M(a){return"string"==typeof a?Jd[a]||Jd[a.toLowerCase()]:void 0}function N(a){var b,c,d={};for(c in a)l(a,c)&&(b=M(c),b&&(d[b]=a[c]));return d}function O(a,b){Kd[a]=b}function P(a){var b=[];for(var c in a)b.push({unit:c,priority:Kd[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function Q(b,c){return function(d){return null!=d?(S(this,b,d),a.updateOffset(this,c),this):R(this,b)}}function R(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function S(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function T(a){return a=M(a),B(this[a])?this[a]():this}function U(a,b){if("object"==typeof a){a=N(a);for(var c=P(a),d=0;d=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function W(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Od[a]=e),b&&(Od[b[0]]=function(){return V(e.apply(this,arguments),b[1],b[2])}),c&&(Od[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function X(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function Y(a){var b,c,d=a.match(Ld);for(b=0,c=d.length;b=0&&Md.test(a);)a=a.replace(Md,c),Md.lastIndex=0,d-=1;return a}function _(a,b,c){ee[a]=B(b)?b:function(a,d){return a&&c?c:b}}function aa(a,b){return l(ee,a)?ee[a](b._strict,b._locale):new RegExp(ba(a))}function ba(a){return ca(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function ca(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function da(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),i(b)&&(d=function(a,c){c[b]=w(a)}),c=0;c=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function va(a){var b=new Date(Date.UTC.apply(null,arguments));return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function wa(a,b,c){var d=7+b-c,e=(7+va(a,0,d).getUTCDay()-b)%7;return-e+d-1}function xa(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=wa(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=ra(f)+j):j>ra(a)?(f=a+1,g=j-ra(a)):(f=a,g=j),{year:f,dayOfYear:g}}function ya(a,b,c){var d,e,f=wa(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+za(e,b,c)):g>za(a.year(),b,c)?(d=g-za(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function za(a,b,c){var d=wa(a,b,c),e=wa(a+1,b,c);return(ra(a)-d+e)/7}function Aa(a){return ya(a,this._week.dow,this._week.doy).week}function Ba(){return this._week.dow}function Ca(){return this._week.doy}function Da(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ea(a){var b=ya(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function Fa(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ga(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Ha(a,b){return a?e(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:e(this._weekdays)?this._weekdays:this._weekdays.standalone}function Ia(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ja(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ka(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=n([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=pe.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=pe.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=pe.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=pe.call(this._weekdaysParse,g),e!==-1?e:(e=pe.call(this._shortWeekdaysParse,g),e!==-1?e:(e=pe.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=pe.call(this._shortWeekdaysParse,g),e!==-1?e:(e=pe.call(this._weekdaysParse,g),e!==-1?e:(e=pe.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=pe.call(this._minWeekdaysParse,g),e!==-1?e:(e=pe.call(this._weekdaysParse,g),e!==-1?e:(e=pe.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function La(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ka.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){if(e=n([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function Ma(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Fa(a,this.localeData()),this.add(a-b,"d")):b}function Na(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Oa(a){if(!this.isValid())return null!=a?this:NaN;if(null!=a){var b=Ga(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Pa(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Sa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(l(this,"_weekdaysRegex")||(this._weekdaysRegex=Ae),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Qa(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Sa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(l(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Be),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Ra(a){return this._weekdaysParseExact?(l(this,"_weekdaysRegex")||Sa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(l(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ce),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Sa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)c=n([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=ca(h[b]),i[b]=ca(i[b]),j[b]=ca(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function Ta(){return this.hours()%12||12}function Ua(){return this.hours()||24}function Va(a,b){W(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Wa(a,b){return b._meridiemParse}function Xa(a){return"p"===(a+"").toLowerCase().charAt(0)}function Ya(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Za(a){return a?a.toLowerCase().replace("_","-"):a}function $a(a){for(var b,c,d,e,f=0;f0;){if(d=_a(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&x(e,c,!0)>=b-1)break;b--}f++}return null}function _a(a){var d=null;if(!He[a]&&"undefined"!=typeof c&&c&&c.exports)try{d=De._abbr,b("./locale/"+a),ab(d)}catch(e){}return He[a]}function ab(a,b){var c;return a&&(c=h(b)?db(a):bb(a,b),c&&(De=c)),De._abbr}function bb(a,b){if(null!==b){var c=Ge;if(b.abbr=a,null!=He[a])A("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=He[a]._config;else if(null!=b.parentLocale){if(null==He[b.parentLocale])return Ie[b.parentLocale]||(Ie[b.parentLocale]=[]),Ie[b.parentLocale].push({name:a,config:b}),null;c=He[b.parentLocale]._config}return He[a]=new E(D(c,b)),Ie[a]&&Ie[a].forEach(function(a){bb(a.name,a.config)}),ab(a),He[a]}return delete He[a],null}function cb(a,b){if(null!=b){var c,d=Ge;null!=He[a]&&(d=He[a]._config),b=D(d,b),c=new E(b),c.parentLocale=He[a],He[a]=c,ab(a)}else null!=He[a]&&(null!=He[a].parentLocale?He[a]=He[a].parentLocale:null!=He[a]&&delete He[a]);return He[a]}function db(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return De;if(!e(a)){if(b=_a(a))return b;a=[a]}return $a(a)}function eb(){return Cd(He)}function fb(a){var b,c=a._a;return c&&p(a).overflow===-2&&(b=c[he]<0||c[he]>11?he:c[ie]<1||c[ie]>ga(c[ge],c[he])?ie:c[je]<0||c[je]>24||24===c[je]&&(0!==c[ke]||0!==c[le]||0!==c[me])?je:c[ke]<0||c[ke]>59?ke:c[le]<0||c[le]>59?le:c[me]<0||c[me]>999?me:-1,p(a)._overflowDayOfYear&&(bie)&&(b=ie),p(a)._overflowWeeks&&b===-1&&(b=ne),p(a)._overflowWeekday&&b===-1&&(b=oe),p(a).overflow=b),a}function gb(a){var b,c,d,e,f,g,h=a._i,i=Je.exec(h)||Ke.exec(h);if(i){for(p(a).iso=!0,b=0,c=Me.length;b10?"YYYY ":"YY "),f="HH:mm"+(c[4]?":ss":""),c[1]){var l=new Date(c[2]),m=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][l.getDay()];if(c[1].substr(0,3)!==m)return p(a).weekdayMismatch=!0,void(a._isValid=!1)}switch(c[5].length){case 2:0===i?h=" +0000":(i=k.indexOf(c[5][1].toUpperCase())-12,h=(i<0?" -":" +")+(""+i).replace(/^-?/,"0").match(/..$/)[0]+"00");break;case 4:h=j[c[5]];break;default:h=j[" GMT"]}c[5]=h,a._i=c.splice(1).join(""),g=" ZZ",a._f=d+e+f+g,nb(a),p(a).rfc2822=!0}else a._isValid=!1}function ib(b){var c=Oe.exec(b._i);return null!==c?void(b._d=new Date((+c[1]))):(gb(b),void(b._isValid===!1&&(delete b._isValid,hb(b),b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b)))))}function jb(a,b,c){return null!=a?a:null!=b?b:c}function kb(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function lb(a){var b,c,d,e,f=[];if(!a._d){for(d=kb(a),a._w&&null==a._a[ie]&&null==a._a[he]&&mb(a),null!=a._dayOfYear&&(e=jb(a._a[ge],d[ge]),(a._dayOfYear>ra(e)||0===a._dayOfYear)&&(p(a)._overflowDayOfYear=!0),c=va(e,0,a._dayOfYear),a._a[he]=c.getUTCMonth(),a._a[ie]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[je]&&0===a._a[ke]&&0===a._a[le]&&0===a._a[me]&&(a._nextDay=!0,a._a[je]=0),a._d=(a._useUTC?va:ua).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[je]=24)}}function mb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,c=jb(b.GG,a._a[ge],ya(vb(),1,4).year),d=jb(b.W,1),e=jb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=ya(vb(),f,g);c=jb(b.gg,a._a[ge],j.year),d=jb(b.w,j.week),null!=b.d?(e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f}d<1||d>za(c,f,g)?p(a)._overflowWeeks=!0:null!=i?p(a)._overflowWeekday=!0:(h=xa(c,d,e,f,g),a._a[ge]=h.year,a._dayOfYear=h.dayOfYear)}function nb(b){if(b._f===a.ISO_8601)return void gb(b);if(b._f===a.RFC_2822)return void hb(b);b._a=[],p(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=$(b._f,b._locale).match(Ld)||[],c=0;c0&&p(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Od[f]?(d?p(b).empty=!1:p(b).unusedTokens.push(f),fa(f,d,b)):b._strict&&!d&&p(b).unusedTokens.push(f);p(b).charsLeftOver=i-j,h.length>0&&p(b).unusedInput.push(h),b._a[je]<=12&&p(b).bigHour===!0&&b._a[je]>0&&(p(b).bigHour=void 0),p(b).parsedDateParts=b._a.slice(0),p(b).meridiem=b._meridiem,b._a[je]=ob(b._locale,b._a[je],b._meridiem),lb(b),fb(b)}function ob(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}function pb(a){var b,c,d,e,f;if(0===a._f.length)return p(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Qb(){if(!h(this._isDSTShifted))return this._isDSTShifted;var a={};if(s(a,this),a=sb(a),a._a){var b=a._isUTC?n(a._a):vb(a._a);this._isDSTShifted=this.isValid()&&x(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Rb(){return!!this.isValid()&&!this._isUTC}function Sb(){return!!this.isValid()&&this._isUTC}function Tb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ub(a,b){var c,d,e,f=a,g=null;return Db(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:i(a)?(f={},b?f[b]=a:f.milliseconds=a):(g=Ve.exec(a))?(c="-"===g[1]?-1:1,f={y:0,d:w(g[ie])*c,h:w(g[je])*c,m:w(g[ke])*c,s:w(g[le])*c,ms:w(Eb(1e3*g[me]))*c}):(g=We.exec(a))?(c="-"===g[1]?-1:1,f={y:Vb(g[2],c),M:Vb(g[3],c),w:Vb(g[4],c),d:Vb(g[5],c),h:Vb(g[6],c),m:Vb(g[7],c),s:Vb(g[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Xb(vb(f.from),vb(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Cb(f),Db(a)&&l(a,"_locale")&&(d._locale=a._locale),d}function Vb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Wb(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Xb(a,b){var c;return a.isValid()&&b.isValid()?(b=Hb(b,a),a.isBefore(b)?c=Wb(a,b):(c=Wb(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Yb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(A(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ub(c,d),Zb(this,e,a),this}}function Zb(b,c,d,e){var f=c._milliseconds,g=Eb(c._days),h=Eb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&S(b,"Date",R(b,"Date")+g*d),h&&la(b,R(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function $b(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function _b(b,c){var d=b||vb(),e=Hb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(B(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,vb(d)))}function ac(){return new t(this)}function bc(a,b){var c=u(a)?a:vb(a);return!(!this.isValid()||!c.isValid())&&(b=M(h(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()9999?Z(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):B(Date.prototype.toISOString)?this.toDate().toISOString():Z(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function lc(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e="-MM-DD[T]HH:mm:ss.SSS",f=b+'[")]';return this.format(c+d+e+f)}function mc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=Z(this,b);return this.localeData().postformat(c)}function nc(a,b){return this.isValid()&&(u(a)&&a.isValid()||vb(a).isValid())?Ub({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function oc(a){return this.from(vb(),a)}function pc(a,b){return this.isValid()&&(u(a)&&a.isValid()||vb(a).isValid())?Ub({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function qc(a){return this.to(vb(),a)}function rc(a){var b;return void 0===a?this._locale._abbr:(b=db(a),null!=b&&(this._locale=b),this)}function sc(){return this._locale}function tc(a){switch(a=M(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function uc(a){return a=M(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function vc(){return this._d.valueOf()-6e4*(this._offset||0)}function wc(){return Math.floor(this.valueOf()/1e3)}function xc(){return new Date(this.valueOf())}function yc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function zc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function Ac(){return this.isValid()?this.toISOString():null}function Bc(){return q(this)}function Cc(){return m({},p(this))}function Dc(){return p(this).overflow}function Ec(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Fc(a,b){W(0,[a,a.length],0,b)}function Gc(a){return Kc.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Hc(a){return Kc.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Ic(){return za(this.year(),1,4)}function Jc(){var a=this.localeData()._week;return za(this.year(),a.dow,a.doy)}function Kc(a,b,c,d,e){var f;return null==a?ya(this,d,e).year:(f=za(a,d,e),b>f&&(b=f),Lc.call(this,a,b,c,d,e))}function Lc(a,b,c,d,e){var f=xa(a,b,c,d,e),g=va(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Mc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Nc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Oc(a,b){b[me]=w(1e3*("0."+a))}function Pc(){return this._isUTC?"UTC":""}function Qc(){return this._isUTC?"Coordinated Universal Time":""}function Rc(a){return vb(1e3*a)}function Sc(){return vb.apply(null,arguments).parseZone()}function Tc(a){return a}function Uc(a,b,c,d){var e=db(),f=n().set(d,b);return e[c](f,a)}function Vc(a,b,c){if(i(a)&&(b=a,a=void 0),a=a||"",null!=b)return Uc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Uc(a,d,c,"month");return e}function Wc(a,b,c,d){"boolean"==typeof a?(i(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,i(b)&&(c=b,b=void 0),b=b||"");var e=db(),f=a?e._week.dow:0;if(null!=c)return Uc(b,(c+f)%7,d,"day");var g,h=[];for(g=0;g<7;g++)h[g]=Uc(b,(g+f)%7,d,"day");return h}function Xc(a,b){return Vc(a,b,"months")}function Yc(a,b){return Vc(a,b,"monthsShort")}function Zc(a,b,c){return Wc(a,b,c,"weekdays")}function $c(a,b,c){return Wc(a,b,c,"weekdaysShort")}function _c(a,b,c){return Wc(a,b,c,"weekdaysMin")}function ad(){var a=this._data;return this._milliseconds=ff(this._milliseconds),this._days=ff(this._days),this._months=ff(this._months),a.milliseconds=ff(a.milliseconds),a.seconds=ff(a.seconds),a.minutes=ff(a.minutes),a.hours=ff(a.hours),a.months=ff(a.months),a.years=ff(a.years),this}function bd(a,b,c,d){var e=Ub(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function cd(a,b){return bd(this,a,b,1)}function dd(a,b){return bd(this,a,b,-1)}function ed(a){return a<0?Math.floor(a):Math.ceil(a)}function fd(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*ed(hd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=v(f/1e3),i.seconds=a%60,b=v(a/60),i.minutes=b%60,c=v(b/60),i.hours=c%24,g+=v(c/24),e=v(gd(g)),h+=e,g-=ed(hd(e)),d=v(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function gd(a){return 4800*a/146097}function hd(a){return 146097*a/4800}function id(a){if(!this.isValid())return NaN;var b,c,d=this._milliseconds;if(a=M(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+gd(b),"month"===a?c:c/12;switch(b=this._days+Math.round(hd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function jd(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*w(this._months/12):NaN}function kd(a){return function(){return this.as(a)}}function ld(a){return a=M(a),this.isValid()?this[a+"s"]():NaN}function md(a){return function(){return this.isValid()?this._data[a]:NaN}}function nd(){return v(this.days()/7)}function od(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function pd(a,b,c){var d=Ub(a).abs(),e=wf(d.as("s")),f=wf(d.as("m")),g=wf(d.as("h")),h=wf(d.as("d")),i=wf(d.as("M")),j=wf(d.as("y")),k=e<=xf.ss&&["s",e]||e0,k[4]=c,od.apply(null,k)}function qd(a){return void 0===a?wf:"function"==typeof a&&(wf=a,!0)}function rd(a,b){return void 0!==xf[a]&&(void 0===b?xf[a]:(xf[a]=b,"s"===a&&(xf.ss=b-1),!0))}function sd(a){if(!this.isValid())return this.localeData().invalidDate();var b=this.localeData(),c=pd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function td(){if(!this.isValid())return this.localeData().invalidDate();var a,b,c,d=yf(this._milliseconds)/1e3,e=yf(this._days),f=yf(this._months);a=v(d/60),b=v(a/60),d%=60,a%=60,c=v(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var ud,vd;vd=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d68?1900:2e3)};var ve=Q("FullYear",!0);W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),O("week",5),O("isoWeek",5),_("w",Ud),_("ww",Ud,Qd),_("W",Ud),_("WW",Ud,Qd),ea(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=w(a)});var we={dow:0,doy:6};W("d",0,"do","day"),W("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),W("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),W("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),O("day",11),O("weekday",11),O("isoWeekday",11),_("d",Ud),_("e",Ud),_("E",Ud),_("dd",function(a,b){return b.weekdaysMinRegex(a)}),_("ddd",function(a,b){return b.weekdaysShortRegex(a)}),_("dddd",function(a,b){return b.weekdaysRegex(a)}),ea(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:p(c).invalidWeekday=a; -}),ea(["d","e","E"],function(a,b,c,d){b[d]=w(a)});var xe="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ye="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Ae=de,Be=de,Ce=de;W("H",["HH",2],0,"hour"),W("h",["hh",2],0,Ta),W("k",["kk",2],0,Ua),W("hmm",0,0,function(){return""+Ta.apply(this)+V(this.minutes(),2)}),W("hmmss",0,0,function(){return""+Ta.apply(this)+V(this.minutes(),2)+V(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+V(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+V(this.minutes(),2)+V(this.seconds(),2)}),Va("a",!0),Va("A",!1),L("hour","h"),O("hour",13),_("a",Wa),_("A",Wa),_("H",Ud),_("h",Ud),_("k",Ud),_("HH",Ud,Qd),_("hh",Ud,Qd),_("kk",Ud,Qd),_("hmm",Vd),_("hmmss",Wd),_("Hmm",Vd),_("Hmmss",Wd),da(["H","HH"],je),da(["k","kk"],function(a,b,c){var d=w(a);b[je]=24===d?0:d}),da(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),da(["h","hh"],function(a,b,c){b[je]=w(a),p(c).bigHour=!0}),da("hmm",function(a,b,c){var d=a.length-2;b[je]=w(a.substr(0,d)),b[ke]=w(a.substr(d)),p(c).bigHour=!0}),da("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[je]=w(a.substr(0,d)),b[ke]=w(a.substr(d,2)),b[le]=w(a.substr(e)),p(c).bigHour=!0}),da("Hmm",function(a,b,c){var d=a.length-2;b[je]=w(a.substr(0,d)),b[ke]=w(a.substr(d))}),da("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[je]=w(a.substr(0,d)),b[ke]=w(a.substr(d,2)),b[le]=w(a.substr(e))});var De,Ee=/[ap]\.?m?\.?/i,Fe=Q("Hours",!0),Ge={calendar:Dd,longDateFormat:Ed,invalidDate:Fd,ordinal:Gd,dayOfMonthOrdinalParse:Hd,relativeTime:Id,months:re,monthsShort:se,week:we,weekdays:xe,weekdaysMin:ze,weekdaysShort:ye,meridiemParse:Ee},He={},Ie={},Je=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ke=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Le=/Z|[+-]\d\d(?::?\d\d)?/,Me=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ne=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Oe=/^\/?Date\((\-?\d+)/i,Pe=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;a.createFromInputFallback=z("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var Qe=z("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=vb.apply(null,arguments);return this.isValid()&&a.isValid()?athis?this:a:r()}),Se=function(){return Date.now?Date.now():+new Date},Te=["year","quarter","month","week","day","hour","minute","second","millisecond"];Fb("Z",":"),Fb("ZZ",""),_("Z",be),_("ZZ",be),da(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Gb(be,a)});var Ue=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var Ve=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,We=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Ub.fn=Cb.prototype,Ub.invalid=Bb;var Xe=Yb(1,"add"),Ye=Yb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ze=z("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});W(0,["gg",2],0,function(){return this.weekYear()%100}),W(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Fc("gggg","weekYear"),Fc("ggggg","weekYear"),Fc("GGGG","isoWeekYear"),Fc("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),O("weekYear",1),O("isoWeekYear",1),_("G",_d),_("g",_d),_("GG",Ud,Qd),_("gg",Ud,Qd),_("GGGG",Yd,Sd),_("gggg",Yd,Sd),_("GGGGG",Zd,Td),_("ggggg",Zd,Td),ea(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=w(a)}),ea(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),W("Q",0,"Qo","quarter"),L("quarter","Q"),O("quarter",7),_("Q",Pd),da("Q",function(a,b){b[he]=3*(w(a)-1)}),W("D",["DD",2],"Do","date"),L("date","D"),O("date",9),_("D",Ud),_("DD",Ud,Qd),_("Do",function(a,b){return a?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient}),da(["D","DD"],ie),da("Do",function(a,b){b[ie]=w(a.match(Ud)[0],10)});var $e=Q("Date",!0);W("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),O("dayOfYear",4),_("DDD",Xd),_("DDDD",Rd),da(["DDD","DDDD"],function(a,b,c){c._dayOfYear=w(a)}),W("m",["mm",2],0,"minute"),L("minute","m"),O("minute",14),_("m",Ud),_("mm",Ud,Qd),da(["m","mm"],ke);var _e=Q("Minutes",!1);W("s",["ss",2],0,"second"),L("second","s"),O("second",15),_("s",Ud),_("ss",Ud,Qd),da(["s","ss"],le);var af=Q("Seconds",!1);W("S",0,0,function(){return~~(this.millisecond()/100)}),W(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,function(){return 10*this.millisecond()}),W(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),W(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),W(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),W(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),W(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),O("millisecond",16),_("S",Xd,Pd),_("SS",Xd,Qd),_("SSS",Xd,Rd);var bf;for(bf="SSSS";bf.length<=9;bf+="S")_(bf,$d);for(bf="S";bf.length<=9;bf+="S")da(bf,Oc);var cf=Q("Milliseconds",!1);W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var df=t.prototype;df.add=Xe,df.calendar=_b,df.clone=ac,df.diff=hc,df.endOf=uc,df.format=mc,df.from=nc,df.fromNow=oc,df.to=pc,df.toNow=qc,df.get=T,df.invalidAt=Dc,df.isAfter=bc,df.isBefore=cc,df.isBetween=dc,df.isSame=ec,df.isSameOrAfter=fc,df.isSameOrBefore=gc,df.isValid=Bc,df.lang=Ze,df.locale=rc,df.localeData=sc,df.max=Re,df.min=Qe,df.parsingFlags=Cc,df.set=U,df.startOf=tc,df.subtract=Ye,df.toArray=yc,df.toObject=zc,df.toDate=xc,df.toISOString=kc,df.inspect=lc,df.toJSON=Ac,df.toString=jc,df.unix=wc,df.valueOf=vc,df.creationData=Ec,df.year=ve,df.isLeapYear=ta,df.weekYear=Gc,df.isoWeekYear=Hc,df.quarter=df.quarters=Mc,df.month=ma,df.daysInMonth=na,df.week=df.weeks=Da,df.isoWeek=df.isoWeeks=Ea,df.weeksInYear=Jc,df.isoWeeksInYear=Ic,df.date=$e,df.day=df.days=Ma,df.weekday=Na,df.isoWeekday=Oa,df.dayOfYear=Nc,df.hour=df.hours=Fe,df.minute=df.minutes=_e,df.second=df.seconds=af,df.millisecond=df.milliseconds=cf,df.utcOffset=Jb,df.utc=Lb,df.local=Mb,df.parseZone=Nb,df.hasAlignedHourOffset=Ob,df.isDST=Pb,df.isLocal=Rb,df.isUtcOffset=Sb,df.isUtc=Tb,df.isUTC=Tb,df.zoneAbbr=Pc,df.zoneName=Qc,df.dates=z("dates accessor is deprecated. Use date instead.",$e),df.months=z("months accessor is deprecated. Use month instead",ma),df.years=z("years accessor is deprecated. Use year instead",ve),df.zone=z("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Kb),df.isDSTShifted=z("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Qb);var ef=E.prototype;ef.calendar=F,ef.longDateFormat=G,ef.invalidDate=H,ef.ordinal=I,ef.preparse=Tc,ef.postformat=Tc,ef.relativeTime=J,ef.pastFuture=K,ef.set=C,ef.months=ha,ef.monthsShort=ia,ef.monthsParse=ka,ef.monthsRegex=pa,ef.monthsShortRegex=oa,ef.week=Aa,ef.firstDayOfYear=Ca,ef.firstDayOfWeek=Ba,ef.weekdays=Ha,ef.weekdaysMin=Ja,ef.weekdaysShort=Ia,ef.weekdaysParse=La,ef.weekdaysRegex=Pa,ef.weekdaysShortRegex=Qa,ef.weekdaysMinRegex=Ra,ef.isPM=Xa,ef.meridiem=Ya,ab("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===w(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=z("moment.lang is deprecated. Use moment.locale instead.",ab),a.langData=z("moment.langData is deprecated. Use moment.localeData instead.",db);var ff=Math.abs,gf=kd("ms"),hf=kd("s"),jf=kd("m"),kf=kd("h"),lf=kd("d"),mf=kd("w"),nf=kd("M"),of=kd("y"),pf=md("milliseconds"),qf=md("seconds"),rf=md("minutes"),sf=md("hours"),tf=md("days"),uf=md("months"),vf=md("years"),wf=Math.round,xf={ss:44,s:45,m:45,h:22,d:26,M:11},yf=Math.abs,zf=Cb.prototype;return zf.isValid=Ab,zf.abs=ad,zf.add=cd,zf.subtract=dd,zf.as=id,zf.asMilliseconds=gf,zf.asSeconds=hf,zf.asMinutes=jf,zf.asHours=kf,zf.asDays=lf,zf.asWeeks=mf,zf.asMonths=nf,zf.asYears=of,zf.valueOf=jd,zf._bubble=fd,zf.get=ld,zf.milliseconds=pf,zf.seconds=qf,zf.minutes=rf,zf.hours=sf,zf.days=tf,zf.weeks=nd,zf.months=uf,zf.years=vf,zf.humanize=sd,zf.toISOString=td,zf.toString=td,zf.toJSON=td,zf.locale=rc,zf.localeData=sc,zf.toIsoString=z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",td),zf.lang=Ze,W("X",0,0,"unix"),W("x",0,0,"valueOf"),_("x",_d),_("X",ce),da("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),da("x",function(a,b,c){c._d=new Date(w(a))}),a.version="2.18.1",d(vb),a.fn=df,a.min=xb,a.max=yb,a.now=Se,a.utc=n,a.unix=Rc,a.months=Xc,a.isDate=j,a.locale=ab,a.invalid=r,a.duration=Ub,a.isMoment=u,a.weekdays=Zc,a.parseZone=Sc,a.localeData=db,a.isDuration=Db,a.monthsShort=Yc,a.weekdaysMin=_c,a.defineLocale=bb,a.updateLocale=cb,a.locales=eb,a.weekdaysShort=$c,a.normalizeUnits=M,a.relativeTimeRounding=qd,a.relativeTimeThreshold=rd,a.calendarFormat=$b,a.prototype=df,a})},{}],7:[function(a,b,c){var d=a(29)();d.helpers=a(45),a(27)(d),d.defaults=a(25),d.Element=a(26),d.elements=a(40),d.Interaction=a(28),d.platform=a(48),a(31)(d),a(22)(d),a(23)(d),a(24)(d),a(30)(d),a(33)(d),a(32)(d),a(35)(d),a(54)(d),a(52)(d),a(53)(d),a(55)(d),a(56)(d),a(57)(d),a(15)(d),a(16)(d),a(17)(d),a(18)(d),a(19)(d),a(20)(d),a(21)(d),a(8)(d),a(9)(d),a(10)(d),a(11)(d),a(12)(d),a(13)(d),a(14)(d);var e=[];e.push(a(49)(d),a(50)(d),a(51)(d)),d.plugins.register(e),d.platform.initialize(),b.exports=d,"undefined"!=typeof window&&(window.Chart=d),d.canvasHelpers=d.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(a,b,c){"use strict";b.exports=function(a){a.Bar=function(b,c){return c.type="bar",new a(b,c)}}},{}],9:[function(a,b,c){"use strict";b.exports=function(a){a.Bubble=function(b,c){return c.type="bubble",new a(b,c)}}},{}],10:[function(a,b,c){"use strict";b.exports=function(a){a.Doughnut=function(b,c){return c.type="doughnut",new a(b,c)}}},{}],11:[function(a,b,c){"use strict";b.exports=function(a){a.Line=function(b,c){return c.type="line",new a(b,c)}}},{}],12:[function(a,b,c){"use strict";b.exports=function(a){a.PolarArea=function(b,c){return c.type="polarArea",new a(b,c)}}},{}],13:[function(a,b,c){"use strict";b.exports=function(a){a.Radar=function(b,c){return c.type="radar",new a(b,c)}}},{}],14:[function(a,b,c){"use strict";b.exports=function(a){a.Scatter=function(b,c){return c.type="scatter",new a(b,c)}}},{}],15:[function(a,b,c){"use strict";var d=a(25),e=a(40),f=a(45);d._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),d._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(a,b){var c="";return a.length>0&&(a[0].yLabel?c=a[0].yLabel:b.labels.length>0&&a[0].index=0&&e>0)&&(q+=e));return f=l.getPixelForValue(q),g=l.getPixelForValue(q+n),h=(g-f)/2,{size:h,base:f,head:g,center:g+h/2}},calculateBarIndexPixels:function(a,b,c){var d,e,g,h,i,j,k=this,l=c.scale.options,m=k.getStackIndex(a),n=c.pixels,o=n[b],p=n.length,q=c.start,r=c.end;return 1===p?(d=o>q?o-q:r-o,e=o0&&(d=(o-n[b-1])/2,b===p-1&&(e=d)),b');var c=a.data,d=c.datasets,e=c.labels;if(d.length)for(var f=0;f'),e[f]&&b.push(e[f]),b.push("");return b.push(""),b.join("")},legend:{labels:{generateLabels:function(a){var b=a.data;return b.labels.length&&b.datasets.length?b.labels.map(function(c,d){var e=a.getDatasetMeta(0),g=b.datasets[0],h=e.data[d],i=h&&h.custom||{},j=f.valueAtIndexOrDefault,k=a.options.elements.arc,l=i.backgroundColor?i.backgroundColor:j(g.backgroundColor,d,k.backgroundColor),m=i.borderColor?i.borderColor:j(g.borderColor,d,k.borderColor),n=i.borderWidth?i.borderWidth:j(g.borderWidth,d,k.borderWidth);return{text:c,fillStyle:l,strokeStyle:m,lineWidth:n,hidden:isNaN(g.data[d])||e.data[d].hidden,index:d}}):[]}},onClick:function(a,b){var c,d,e,f=b.index,g=this.chart;for(c=0,d=(g.data.datasets||[]).length;c=Math.PI?-1:o<-Math.PI?1:0);var p=o+n,q={x:Math.cos(o),y:Math.sin(o)},r={x:Math.cos(p),y:Math.sin(p)},s=o<=0&&p>=0||o<=2*Math.PI&&2*Math.PI<=p,t=o<=.5*Math.PI&&.5*Math.PI<=p||o<=2.5*Math.PI&&2.5*Math.PI<=p,u=o<=-Math.PI&&-Math.PI<=p||o<=Math.PI&&Math.PI<=p,v=o<=.5*-Math.PI&&.5*-Math.PI<=p||o<=1.5*Math.PI&&1.5*Math.PI<=p,w=m/100,x={x:u?-1:Math.min(q.x*(q.x<0?1:w),r.x*(r.x<0?1:w)),y:v?-1:Math.min(q.y*(q.y<0?1:w),r.y*(r.y<0?1:w))},y={x:s?1:Math.max(q.x*(q.x>0?1:w),r.x*(r.x>0?1:w)),y:t?1:Math.max(q.y*(q.y>0?1:w),r.y*(r.y>0?1:w))},z={width:.5*(y.x-x.x),height:.5*(y.y-x.y)};j=Math.min(h/z.width,i/z.height),k={x:(y.x+x.x)*-.5,y:(y.y+x.y)*-.5}}c.borderWidth=b.getMaxBorderWidth(l.data),c.outerRadius=Math.max((j-c.borderWidth)/2,0),c.innerRadius=Math.max(m?c.outerRadius/100*m:0,0),c.radiusLength=(c.outerRadius-c.innerRadius)/c.getVisibleDatasetCount(),c.offsetX=k.x*c.outerRadius,c.offsetY=k.y*c.outerRadius,l.total=b.calculateTotal(),b.outerRadius=c.outerRadius-c.radiusLength*b.getRingIndex(b.index),b.innerRadius=Math.max(b.outerRadius-c.radiusLength,0),f.each(l.data,function(c,d){b.updateElement(c,d,a)})},updateElement:function(a,b,c){var d=this,e=d.chart,g=e.chartArea,h=e.options,i=h.animation,j=(g.left+g.right)/2,k=(g.top+g.bottom)/2,l=h.rotation,m=h.rotation,n=d.getDataset(),o=c&&i.animateRotate?0:a.hidden?0:d.calculateCircumference(n.data[b])*(h.circumference/(2*Math.PI)),p=c&&i.animateScale?0:d.innerRadius,q=c&&i.animateScale?0:d.outerRadius,r=f.valueAtIndexOrDefault;f.extend(a,{_datasetIndex:d.index,_index:b,_model:{x:j+e.offsetX,y:k+e.offsetY,startAngle:l,endAngle:m,circumference:o,outerRadius:q,innerRadius:p,label:r(n.label,b,e.data.labels[b])}});var s=a._model;this.removeHoverStyle(a),c&&i.animateRotate||(0===b?s.startAngle=h.rotation:s.startAngle=d.getMeta().data[b-1]._model.endAngle,s.endAngle=s.startAngle+s.circumference),a.pivot()},removeHoverStyle:function(b){a.DatasetController.prototype.removeHoverStyle.call(this,b,this.chart.options.elements.arc)},calculateTotal:function(){var a,b=this.getDataset(),c=this.getMeta(),d=0;return f.each(c.data,function(c,e){a=b.data[e],isNaN(a)||c.hidden||(d+=Math.abs(a))}),d},calculateCircumference:function(a){var b=this.getMeta().total;return b>0&&!isNaN(a)?2*Math.PI*(a/b):0},getMaxBorderWidth:function(a){for(var b,c,d=0,e=this.index,f=a.length,g=0;gd?b:d,d=c>d?c:d;return d}})}},{25:25,40:40,45:45}],18:[function(a,b,c){"use strict";var d=a(25),e=a(40),f=a(45);d._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}}),b.exports=function(a){function b(a,b){return f.valueOrDefault(a.showLine,b.showLines)}a.controllers.line=a.DatasetController.extend({datasetElementType:e.Line,dataElementType:e.Point,update:function(a){var c,d,e,g=this,h=g.getMeta(),i=h.dataset,j=h.data||[],k=g.chart.options,l=k.elements.line,m=g.getScaleForId(h.yAxisID),n=g.getDataset(),o=b(n,k);for(o&&(e=i.custom||{},void 0!==n.tension&&void 0===n.lineTension&&(n.lineTension=n.tension),i._scale=m,i._datasetIndex=g.index,i._children=j,i._model={spanGaps:n.spanGaps?n.spanGaps:k.spanGaps,tension:e.tension?e.tension:f.valueOrDefault(n.lineTension,l.tension),backgroundColor:e.backgroundColor?e.backgroundColor:n.backgroundColor||l.backgroundColor,borderWidth:e.borderWidth?e.borderWidth:n.borderWidth||l.borderWidth,borderColor:e.borderColor?e.borderColor:n.borderColor||l.borderColor,borderCapStyle:e.borderCapStyle?e.borderCapStyle:n.borderCapStyle||l.borderCapStyle,borderDash:e.borderDash?e.borderDash:n.borderDash||l.borderDash,borderDashOffset:e.borderDashOffset?e.borderDashOffset:n.borderDashOffset||l.borderDashOffset,borderJoinStyle:e.borderJoinStyle?e.borderJoinStyle:n.borderJoinStyle||l.borderJoinStyle,fill:e.fill?e.fill:void 0!==n.fill?n.fill:l.fill,steppedLine:e.steppedLine?e.steppedLine:f.valueOrDefault(n.steppedLine,l.stepped),cubicInterpolationMode:e.cubicInterpolationMode?e.cubicInterpolationMode:f.valueOrDefault(n.cubicInterpolationMode,l.cubicInterpolationMode)},i.pivot()),c=0,d=j.length;c');var c=a.data,d=c.datasets,e=c.labels;if(d.length)for(var f=0;f'),e[f]&&b.push(e[f]),b.push("");return b.push(""),b.join("")},legend:{labels:{generateLabels:function(a){var b=a.data;return b.labels.length&&b.datasets.length?b.labels.map(function(c,d){var e=a.getDatasetMeta(0),g=b.datasets[0],h=e.data[d],i=h.custom||{},j=f.valueAtIndexOrDefault,k=a.options.elements.arc,l=i.backgroundColor?i.backgroundColor:j(g.backgroundColor,d,k.backgroundColor),m=i.borderColor?i.borderColor:j(g.borderColor,d,k.borderColor),n=i.borderWidth?i.borderWidth:j(g.borderWidth,d,k.borderWidth);return{text:c,fillStyle:l,strokeStyle:m,lineWidth:n,hidden:isNaN(g.data[d])||e.data[d].hidden,index:d}}):[]}},onClick:function(a,b){var c,d,e,f=b.index,g=this.chart;for(c=0,d=(g.data.datasets||[]).length;c0&&!isNaN(a)?2*Math.PI/b:0}})}},{25:25,40:40,45:45}],20:[function(a,b,c){"use strict";var d=a(25),e=a(40),f=a(45);d._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}}),b.exports=function(a){a.controllers.radar=a.DatasetController.extend({datasetElementType:e.Line,dataElementType:e.Point,linkScales:f.noop,update:function(a){var b=this,c=b.getMeta(),d=c.dataset,e=c.data,g=d.custom||{},h=b.getDataset(),i=b.chart.options.elements.line,j=b.chart.scale;void 0!==h.tension&&void 0===h.lineTension&&(h.lineTension=h.tension),f.extend(c.dataset,{_datasetIndex:b.index,_scale:j,_children:e,_loop:!0,_model:{tension:g.tension?g.tension:f.valueOrDefault(h.lineTension,i.tension),backgroundColor:g.backgroundColor?g.backgroundColor:h.backgroundColor||i.backgroundColor,borderWidth:g.borderWidth?g.borderWidth:h.borderWidth||i.borderWidth,borderColor:g.borderColor?g.borderColor:h.borderColor||i.borderColor,fill:g.fill?g.fill:void 0!==h.fill?h.fill:i.fill,borderCapStyle:g.borderCapStyle?g.borderCapStyle:h.borderCapStyle||i.borderCapStyle,borderDash:g.borderDash?g.borderDash:h.borderDash||i.borderDash,borderDashOffset:g.borderDashOffset?g.borderDashOffset:h.borderDashOffset||i.borderDashOffset,borderJoinStyle:g.borderJoinStyle?g.borderJoinStyle:h.borderJoinStyle||i.borderJoinStyle}}),c.dataset.pivot(),f.each(e,function(c,d){b.updateElement(c,d,a)},b),b.updateBezierControlPoints()},updateElement:function(a,b,c){var d=this,e=a.custom||{},g=d.getDataset(),h=d.chart.scale,i=d.chart.options.elements.point,j=h.getPointPositionForValue(b,g.data[b]);void 0!==g.radius&&void 0===g.pointRadius&&(g.pointRadius=g.radius),void 0!==g.hitRadius&&void 0===g.pointHitRadius&&(g.pointHitRadius=g.hitRadius),f.extend(a,{_datasetIndex:d.index,_index:b,_scale:h,_model:{x:c?h.xCenter:j.x,y:c?h.yCenter:j.y,tension:e.tension?e.tension:f.valueOrDefault(g.lineTension,d.chart.options.elements.line.tension),radius:e.radius?e.radius:f.valueAtIndexOrDefault(g.pointRadius,b,i.radius),backgroundColor:e.backgroundColor?e.backgroundColor:f.valueAtIndexOrDefault(g.pointBackgroundColor,b,i.backgroundColor),borderColor:e.borderColor?e.borderColor:f.valueAtIndexOrDefault(g.pointBorderColor,b,i.borderColor),borderWidth:e.borderWidth?e.borderWidth:f.valueAtIndexOrDefault(g.pointBorderWidth,b,i.borderWidth),pointStyle:e.pointStyle?e.pointStyle:f.valueAtIndexOrDefault(g.pointStyle,b,i.pointStyle),hitRadius:e.hitRadius?e.hitRadius:f.valueAtIndexOrDefault(g.pointHitRadius,b,i.hitRadius)}}),a._model.skip=e.skip?e.skip:isNaN(a._model.x)||isNaN(a._model.y)},updateBezierControlPoints:function(){var a=this.chart.chartArea,b=this.getMeta();f.each(b.data,function(c,d){var e=c._model,g=f.splineCurve(f.previousItem(b.data,d,!0)._model,e,f.nextItem(b.data,d,!0)._model,e.tension);e.controlPointPreviousX=Math.max(Math.min(g.previous.x,a.right),a.left),e.controlPointPreviousY=Math.max(Math.min(g.previous.y,a.bottom),a.top),e.controlPointNextX=Math.max(Math.min(g.next.x,a.right),a.left),e.controlPointNextY=Math.max(Math.min(g.next.y,a.bottom),a.top),c.pivot()})},setHoverStyle:function(a){var b=this.chart.data.datasets[a._datasetIndex],c=a.custom||{},d=a._index,e=a._model;e.radius=c.hoverRadius?c.hoverRadius:f.valueAtIndexOrDefault(b.pointHoverRadius,d,this.chart.options.elements.point.hoverRadius),e.backgroundColor=c.hoverBackgroundColor?c.hoverBackgroundColor:f.valueAtIndexOrDefault(b.pointHoverBackgroundColor,d,f.getHoverColor(e.backgroundColor)),e.borderColor=c.hoverBorderColor?c.hoverBorderColor:f.valueAtIndexOrDefault(b.pointHoverBorderColor,d,f.getHoverColor(e.borderColor)),e.borderWidth=c.hoverBorderWidth?c.hoverBorderWidth:f.valueAtIndexOrDefault(b.pointHoverBorderWidth,d,e.borderWidth)},removeHoverStyle:function(a){var b=this.chart.data.datasets[a._datasetIndex],c=a.custom||{},d=a._index,e=a._model,g=this.chart.options.elements.point;e.radius=c.radius?c.radius:f.valueAtIndexOrDefault(b.pointRadius,d,g.radius),e.backgroundColor=c.backgroundColor?c.backgroundColor:f.valueAtIndexOrDefault(b.pointBackgroundColor,d,g.backgroundColor),e.borderColor=c.borderColor?c.borderColor:f.valueAtIndexOrDefault(b.pointBorderColor,d,g.borderColor),e.borderWidth=c.borderWidth?c.borderWidth:f.valueAtIndexOrDefault(b.pointBorderWidth,d,g.borderWidth)}})}},{25:25,40:40,45:45}],21:[function(a,b,c){"use strict";var d=a(25);d._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(a){return"("+a.xLabel+", "+a.yLabel+")"}}}}),b.exports=function(a){a.controllers.scatter=a.controllers.line}},{25:25}],22:[function(a,b,c){"use strict";var d=a(25),e=a(26),f=a(45);d._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:f.noop,onComplete:f.noop}}),b.exports=function(a){a.Animation=e.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),a.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(a,b,c,d){var e,f,g=this.animations;for(b.chart=a,d||(a.animating=!0),e=0,f=g.length;e1&&(c=Math.floor(a.dropFrames),a.dropFrames=a.dropFrames%1),a.advance(1+c);var d=Date.now();a.dropFrames+=(d-b)/a.frameDuration,a.animations.length>0&&a.requestAnimationFrame()},advance:function(a){for(var b,c,d=this.animations,e=0;e=b.numSteps?(f.callback(b.onAnimationComplete,[b],c),c.animating=!1,d.splice(e,1)):++e}},Object.defineProperty(a.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(a.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(a){this.chart=a}})}},{25:25,26:26,45:45}],23:[function(a,b,c){"use strict";var d=a(25),e=a(45),f=a(28),g=a(48);b.exports=function(a){function b(a){a=a||{};var b=a.data=a.data||{};return b.datasets=b.datasets||[],b.labels=b.labels||[],a.options=e.configMerge(d.global,d[a.type],a.options||{}),a}function c(a){var b=a.options;b.scale?a.scale.options=b.scale:b.scales&&b.scales.xAxes.concat(b.scales.yAxes).forEach(function(b){a.scales[b.id].options=b}),a.tooltip._options=b.tooltips}function h(a){return"top"===a||"bottom"===a}var i=a.plugins;a.types={},a.instances={},a.controllers={},e.extend(a.prototype,{construct:function(c,d){var f=this;d=b(d);var h=g.acquireContext(c,d),i=h&&h.canvas,j=i&&i.height,k=i&&i.width;return f.id=e.uid(),f.ctx=h,f.canvas=i,f.config=d,f.width=k,f.height=j,f.aspectRatio=j?k/j:null,f.options=d.options,f._bufferedRender=!1,f.chart=f,f.controller=f,a.instances[f.id]=f,Object.defineProperty(f,"data",{get:function(){return f.config.data},set:function(a){f.config.data=a}}),h&&i?(f.initialize(),void f.update()):void console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var a=this;return i.notify(a,"beforeInit"),e.retinaScale(a,a.options.devicePixelRatio),a.bindEvents(),a.options.responsive&&a.resize(!0),a.ensureScalesHaveIDs(),a.buildScales(),a.initToolTip(),i.notify(a,"afterInit"),a},clear:function(){return e.canvas.clear(this),this},stop:function(){return a.animationService.cancelAnimation(this),this},resize:function(a){var b=this,c=b.options,d=b.canvas,f=c.maintainAspectRatio&&b.aspectRatio||null,g=Math.max(0,Math.floor(e.getMaximumWidth(d))),h=Math.max(0,Math.floor(f?g/f:e.getMaximumHeight(d)));if((b.width!==g||b.height!==h)&&(d.width=b.width=g,d.height=b.height=h,d.style.width=g+"px",d.style.height=h+"px",e.retinaScale(b,c.devicePixelRatio),!a)){var j={width:g,height:h};i.notify(b,"resize",[j]),b.options.onResize&&b.options.onResize(b,j),b.stop(),b.update(b.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var a=this.options,b=a.scales||{},c=a.scale;e.each(b.xAxes,function(a,b){a.id=a.id||"x-axis-"+b}),e.each(b.yAxes,function(a,b){a.id=a.id||"y-axis-"+b}),c&&(c.id=c.id||"scale")},buildScales:function(){var b=this,c=b.options,d=b.scales={},f=[];c.scales&&(f=f.concat((c.scales.xAxes||[]).map(function(a){return{options:a,dtype:"category",dposition:"bottom"}}),(c.scales.yAxes||[]).map(function(a){return{options:a,dtype:"linear",dposition:"left"}}))),c.scale&&f.push({options:c.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),e.each(f,function(c){var f=c.options,g=e.valueOrDefault(f.type,c.dtype),i=a.scaleService.getScaleConstructor(g);if(i){h(f.position)!==h(c.dposition)&&(f.position=c.dposition);var j=new i({id:f.id,options:f,ctx:b.ctx,chart:b});d[j.id]=j,j.mergeTicksOptions(),c.isDefault&&(b.scale=j)}}),a.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var b=this,c=[],d=[];return e.each(b.data.datasets,function(e,f){var g=b.getDatasetMeta(f),h=e.type||b.config.type;if(g.type&&g.type!==h&&(b.destroyDatasetMeta(f),g=b.getDatasetMeta(f)),g.type=h,c.push(g.type),g.controller)g.controller.updateIndex(f);else{var i=a.controllers[g.type];if(void 0===i)throw new Error('"'+g.type+'" is not a chart type.');g.controller=new i(b,f),d.push(g.controller)}},b),d},resetElements:function(){var a=this;e.each(a.data.datasets,function(b,c){a.getDatasetMeta(c).controller.reset()},a)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(a){var b=this;if(a&&"object"==typeof a||(a={duration:a,lazy:arguments[1]}),c(b),i.notify(b,"beforeUpdate")!==!1){b.tooltip._data=b.data;var d=b.buildOrUpdateControllers();e.each(b.data.datasets,function(a,c){b.getDatasetMeta(c).controller.buildOrUpdateElements()},b),b.updateLayout(),e.each(d,function(a){a.reset()}),b.updateDatasets(),i.notify(b,"afterUpdate"),b._bufferedRender?b._bufferedRequest={duration:a.duration,easing:a.easing,lazy:a.lazy}:b.render(a)}},updateLayout:function(){var b=this;i.notify(b,"beforeLayout")!==!1&&(a.layoutService.update(this,this.width,this.height),i.notify(b,"afterScaleUpdate"),i.notify(b,"afterLayout"))},updateDatasets:function(){var a=this;if(i.notify(a,"beforeDatasetsUpdate")!==!1){for(var b=0,c=a.data.datasets.length;b=0;--c)b.isDatasetVisible(c)&&b.drawDataset(c,a);i.notify(b,"afterDatasetsDraw",[a])}},drawDataset:function(a,b){var c=this,d=c.getDatasetMeta(a),e={meta:d,index:a,easingValue:b};i.notify(c,"beforeDatasetDraw",[e])!==!1&&(d.controller.draw(b),i.notify(c,"afterDatasetDraw",[e]))},getElementAtEvent:function(a){return f.modes.single(this,a)},getElementsAtEvent:function(a){return f.modes.label(this,a,{intersect:!0})},getElementsAtXAxis:function(a){return f.modes["x-axis"](this,a,{intersect:!0})},getElementsAtEventForMode:function(a,b,c){var d=f.modes[b];return"function"==typeof d?d(this,a,c):[]},getDatasetAtEvent:function(a){return f.modes.dataset(this,a,{intersect:!0})},getDatasetMeta:function(a){var b=this,c=b.data.datasets[a];c._meta||(c._meta={});var d=c._meta[b.id];return d||(d=c._meta[b.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),d},getVisibleDatasetCount:function(){for(var a=0,b=0,c=this.data.datasets.length;b0||(e.forEach(function(b){delete a[b]}),delete a._chartjs)}}var e=["push","pop","shift","splice","unshift"];a.DatasetController=function(a,b){this.initialize(a,b)},d.extend(a.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(a,b){var c=this;c.chart=a,c.index=b,c.linkScales(),c.addElements()},updateIndex:function(a){this.index=a},linkScales:function(){var a=this,b=a.getMeta(),c=a.getDataset();null===b.xAxisID&&(b.xAxisID=c.xAxisID||a.chart.options.scales.xAxes[0].id),null===b.yAxisID&&(b.yAxisID=c.yAxisID||a.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(a){return this.chart.scales[a]},reset:function(){this.update(!0)},destroy:function(){this._data&&c(this._data,this)},createMetaDataset:function(){var a=this,b=a.datasetElementType;return b&&new b({_chart:a.chart,_datasetIndex:a.index})},createMetaData:function(a){var b=this,c=b.dataElementType;return c&&new c({_chart:b.chart,_datasetIndex:b.index,_index:a})},addElements:function(){var a,b,c=this,d=c.getMeta(),e=c.getDataset().data||[],f=d.data;for(a=0,b=e.length;ad&&a.insertElements(d,e-d)},insertElements:function(a,b){for(var c=0;c=c[b].length&&c[b].push({}),!c[b][g].type||i.type&&i.type!==c[b][g].type?f.merge(c[b][g],[a.scaleService.getScaleDefaults(h),i]):f.merge(c[b][g],i)}else f._merger(b,c,d,e)}})},f.where=function(a,b){if(f.isArray(a)&&Array.prototype.filter)return a.filter(b);var c=[];return f.each(a,function(a){b(a)&&c.push(a)}),c},f.findIndex=Array.prototype.findIndex?function(a,b,c){return a.findIndex(b,c)}:function(a,b,c){c=void 0===c?a:c;for(var d=0,e=a.length;d=0;d--){var e=a[d];if(b(e))return e}},f.inherits=function(a){var b=this,c=a&&a.hasOwnProperty("constructor")?a.constructor:function(){return b.apply(this,arguments)},d=function(){this.constructor=c};return d.prototype=b.prototype,c.prototype=new d,c.extend=f.inherits,a&&f.extend(c.prototype,a),c.__super__=b.prototype,c},f.isNumber=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},f.almostEquals=function(a,b,c){return Math.abs(a-b)a},f.max=function(a){return a.reduce(function(a,b){return isNaN(b)?a:Math.max(a,b)},Number.NEGATIVE_INFINITY)},f.min=function(a){return a.reduce(function(a,b){return isNaN(b)?a:Math.min(a,b)},Number.POSITIVE_INFINITY)},f.sign=Math.sign?function(a){return Math.sign(a)}:function(a){return a=+a,0===a||isNaN(a)?a:a>0?1:-1},f.log10=Math.log10?function(a){return Math.log10(a)}:function(a){return Math.log(a)/Math.LN10},f.toRadians=function(a){return a*(Math.PI/180)},f.toDegrees=function(a){return a*(180/Math.PI)},f.getAngleFromPoint=function(a,b){var c=b.x-a.x,d=b.y-a.y,e=Math.sqrt(c*c+d*d),f=Math.atan2(d,c);return f<-.5*Math.PI&&(f+=2*Math.PI),{angle:f,distance:e}},f.distanceBetweenPoints=function(a,b){return Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2))},f.aliasPixel=function(a){return a%2===0?0:.5},f.splineCurve=function(a,b,c,d){var e=a.skip?b:a,f=b,g=c.skip?b:c,h=Math.sqrt(Math.pow(f.x-e.x,2)+Math.pow(f.y-e.y,2)),i=Math.sqrt(Math.pow(g.x-f.x,2)+Math.pow(g.y-f.y,2)),j=h/(h+i),k=i/(h+i);j=isNaN(j)?0:j,k=isNaN(k)?0:k;var l=d*j,m=d*k;return{previous:{x:f.x-l*(g.x-e.x),y:f.y-l*(g.y-e.y)},next:{x:f.x+m*(g.x-e.x),y:f.y+m*(g.y-e.y)}}},f.EPSILON=Number.EPSILON||1e-14,f.splineCurveMonotone=function(a){var b,c,d,e,g=(a||[]).map(function(a){return{model:a._model,deltaK:0,mK:0}}),h=g.length;for(b=0;b0?g[b-1]:null,e=b0?g[b-1]:null,e=b=a.length-1?a[0]:a[b+1]:b>=a.length-1?a[a.length-1]:a[b+1]},f.previousItem=function(a,b,c){return c?b<=0?a[a.length-1]:a[b-1]:b<=0?a[0]:a[b-1]},f.niceNum=function(a,b){var c,d=Math.floor(f.log10(a)),e=a/Math.pow(10,d);return c=b?e<1.5?1:e<3?2:e<7?5:10:e<=1?1:e<=2?2:e<=5?5:10,c*Math.pow(10,d)},f.requestAnimFrame=function(){return"undefined"==typeof window?function(a){a()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){return window.setTimeout(a,1e3/60)}}(),f.getRelativePosition=function(a,b){var c,d,e=a.originalEvent||a,g=a.currentTarget||a.srcElement,h=g.getBoundingClientRect(),i=e.touches;i&&i.length>0?(c=i[0].clientX,d=i[0].clientY):(c=e.clientX,d=e.clientY);var j=parseFloat(f.getStyle(g,"padding-left")),k=parseFloat(f.getStyle(g,"padding-top")),l=parseFloat(f.getStyle(g,"padding-right")),m=parseFloat(f.getStyle(g,"padding-bottom")),n=h.right-h.left-j-l,o=h.bottom-h.top-k-m;return c=Math.round((c-h.left-j)/n*g.width/b.currentDevicePixelRatio),d=Math.round((d-h.top-k)/o*g.height/b.currentDevicePixelRatio),{x:c,y:d}},f.getConstraintWidth=function(a){return g(a,"max-width","clientWidth")},f.getConstraintHeight=function(a){return g(a,"max-height","clientHeight")},f.getMaximumWidth=function(a){var b=a.parentNode;if(!b)return a.clientWidth;var c=parseInt(f.getStyle(b,"padding-left"),10),d=parseInt(f.getStyle(b,"padding-right"),10),e=b.clientWidth-c-d,g=f.getConstraintWidth(a);return isNaN(g)?e:Math.min(e,g)},f.getMaximumHeight=function(a){var b=a.parentNode;if(!b)return a.clientHeight;var c=parseInt(f.getStyle(b,"padding-top"),10),d=parseInt(f.getStyle(b,"padding-bottom"),10),e=b.clientHeight-c-d,g=f.getConstraintHeight(a);return isNaN(g)?e:Math.min(e,g)},f.getStyle=function(a,b){return a.currentStyle?a.currentStyle[b]:document.defaultView.getComputedStyle(a,null).getPropertyValue(b)},f.retinaScale=function(a,b){var c=a.currentDevicePixelRatio=b||window.devicePixelRatio||1;if(1!==c){var d=a.canvas,e=a.height,f=a.width;d.height=e*c,d.width=f*c,a.ctx.scale(c,c),d.style.height=e+"px",d.style.width=f+"px"}},f.fontString=function(a,b,c){return b+" "+a+"px "+c},f.longestText=function(a,b,c,d){d=d||{};var e=d.data=d.data||{},g=d.garbageCollect=d.garbageCollect||[];d.font!==b&&(e=d.data={},g=d.garbageCollect=[],d.font=b),a.font=b;var h=0;f.each(c,function(b){void 0!==b&&null!==b&&f.isArray(b)!==!0?h=f.measureText(a,e,g,h,b):f.isArray(b)&&f.each(b,function(b){void 0===b||null===b||f.isArray(b)||(h=f.measureText(a,e,g,h,b))})});var i=g.length/2;if(i>c.length){for(var j=0;jd&&(d=f),d},f.numberOfLabelLines=function(a){var b=1;return f.each(a,function(a){f.isArray(a)&&a.length>b&&(b=a.length)}),b},f.color=d?function(a){return a instanceof CanvasGradient&&(a=e.global.defaultColor),d(a)}:function(a){return console.error("Color.js not found!"),a},f.getHoverColor=function(a){return a instanceof CanvasPattern?a:f.color(a).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(a,b,c){"use strict";function d(a,b){return a["native"]?{x:a.x,y:a.y}:j.getRelativePosition(a,b)}function e(a,b){var c,d,e,f,g,h=a.data.datasets;for(d=0,f=h.length;d0&&(j=a.getDatasetMeta(j[0]._datasetIndex).data),j},"x-axis":function(a,b){return i(a,b,{intersect:!0})},point:function(a,b){var c=d(b,a);return f(a,c)},nearest:function(a,b,c){var e=d(b,a);c.axis=c.axis||"xy";var f=h(c.axis),i=g(a,e,c.intersect,f);return i.length>1&&i.sort(function(a,b){var c=a.getArea(),d=b.getArea(),e=c-d;return 0===e&&(e=a._datasetIndex-b._datasetIndex),e}),i.slice(0,1)},x:function(a,b,c){var f=d(b,a),g=[],h=!1;return e(a,function(a){a.inXRange(f.x)&&g.push(a),a.inRange(f.x,f.y)&&(h=!0)}),c.intersect&&!h&&(g=[]), -g},y:function(a,b,c){var f=d(b,a),g=[],h=!1;return e(a,function(a){a.inYRange(f.y)&&g.push(a),a.inRange(f.x,f.y)&&(h=!0)}),c.intersect&&!h&&(g=[]),g}}}},{45:45}],29:[function(a,b,c){"use strict";var d=a(25);d._set("global",{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},layout:{padding:{top:0,right:0,bottom:0,left:0}}}),b.exports=function(){var a=function(a,b){return this.construct(a,b),this};return a.Chart=a,a}},{25:25}],30:[function(a,b,c){"use strict";var d=a(45);b.exports=function(a){function b(a,b){return d.where(a,function(a){return a.position===b})}function c(a,b){a.forEach(function(a,b){return a._tmpIndex_=b,a}),a.sort(function(a,c){var d=b?c:a,e=b?a:c;return d.weight===e.weight?d._tmpIndex_-e._tmpIndex_:d.weight-e.weight}),a.forEach(function(a){delete a._tmpIndex_})}a.layoutService={defaults:{},addBox:function(a,b){a.boxes||(a.boxes=[]),b.fullWidth=b.fullWidth||!1,b.position=b.position||"top",b.weight=b.weight||0,a.boxes.push(b)},removeBox:function(a,b){var c=a.boxes?a.boxes.indexOf(b):-1;c!==-1&&a.boxes.splice(c,1)},configure:function(a,b,c){for(var d,e=["fullWidth","position","weight"],f=e.length,g=0;gn&&ia.maxHeight){i--;break}i++,m=j*l}a.labelRotation=i},afterCalculateTickRotation:function(){h.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){h.callback(this.options.beforeFit,[this])},fit:function(){var a=this,e=a.minSize={width:0,height:0},f=d(a._ticks),g=a.options,j=g.ticks,k=g.scaleLabel,l=g.gridLines,m=g.display,n=a.isHorizontal(),o=c(j),p=g.gridLines.tickMarkLength;if(n?e.width=a.isFullWidth()?a.maxWidth-a.margins.left-a.margins.right:a.maxWidth:e.width=m&&l.drawTicks?p:0,n?e.height=m&&l.drawTicks?p:0:e.height=a.maxHeight,k.display&&m){var q=i(k),r=h.options.toPadding(k.padding),s=q+r.height;n?e.height+=s:e.width+=s}if(j.display&&m){var t=h.longestText(a.ctx,o.font,f,a.longestTextCache),u=h.numberOfLabelLines(f),v=.5*o.size,w=a.options.ticks.padding;if(n){a.longestLabelWidth=t;var x=h.toRadians(a.labelRotation),y=Math.cos(x),z=Math.sin(x),A=z*t+o.size*u+v*(u-1)+v;e.height=Math.min(a.maxHeight,e.height+A+w),a.ctx.font=o.font;var B=b(a.ctx,f[0],o.font),C=b(a.ctx,f[f.length-1],o.font);0!==a.labelRotation?(a.paddingLeft="bottom"===g.position?y*B+3:y*v+3,a.paddingRight="bottom"===g.position?y*v+3:y*C+3):(a.paddingLeft=B/2+3,a.paddingRight=C/2+3)}else j.mirror?t=0:t+=w+v,e.width=Math.min(a.maxWidth,e.width+t),a.paddingTop=o.size/2,a.paddingBottom=o.size/2}a.handleMargins(),a.width=e.width,a.height=e.height},handleMargins:function(){var a=this;a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingTop=Math.max(a.paddingTop-a.margins.top,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0),a.paddingBottom=Math.max(a.paddingBottom-a.margins.bottom,0))},afterFit:function(){h.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(a){if(h.isNullOrUndef(a))return NaN;if("number"==typeof a&&!isFinite(a))return NaN;if(a)if(this.isHorizontal()){if(void 0!==a.x)return this.getRightValue(a.x)}else if(void 0!==a.y)return this.getRightValue(a.y);return a},getLabelForIndex:h.noop,getPixelForValue:h.noop,getValueForPixel:h.noop,getPixelForTick:function(a){var b=this,c=b.options.offset;if(b.isHorizontal()){var d=b.width-(b.paddingLeft+b.paddingRight),e=d/Math.max(b._ticks.length-(c?0:1),1),f=e*a+b.paddingLeft;c&&(f+=e/2);var g=b.left+Math.round(f);return g+=b.isFullWidth()?b.margins.left:0}var h=b.height-(b.paddingTop+b.paddingBottom);return b.top+a*(h/(b._ticks.length-1))},getPixelForDecimal:function(a){var b=this;if(b.isHorizontal()){var c=b.width-(b.paddingLeft+b.paddingRight),d=c*a+b.paddingLeft,e=b.left+Math.round(d);return e+=b.isFullWidth()?b.margins.left:0}return b.top+a*b.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var a=this,b=a.min,c=a.max;return a.beginAtZero?0:b<0&&c<0?c:b>0&&c>0?b:0},_autoSkip:function(a){var b,c,d,e,f,g=this,i=g.isHorizontal(),j=g.options.ticks.minor,k=a.length,l=h.toRadians(g.labelRotation),m=Math.cos(l),n=g.longestLabelWidth*m,o=[];for(j.maxTicksLimit&&(f=j.maxTicksLimit),i&&(b=!1,(n+j.autoSkipPadding)*k>g.width-(g.paddingLeft+g.paddingRight)&&(b=1+Math.floor((n+j.autoSkipPadding)*k/(g.width-(g.paddingLeft+g.paddingRight)))),f&&k>f&&(b=Math.max(b,Math.floor(k/f)))),c=0;c1&&c%b>0||c%b===0&&c+b>=k,(e&&c!==k-1||h.isNullOrUndef(d.label))&&delete d.label,o.push(d);return o},draw:function(a){var b=this,d=b.options;if(d.display){var g=b.ctx,j=f.global,k=d.ticks.minor,l=d.ticks.major||k,m=d.gridLines,n=d.scaleLabel,o=0!==b.labelRotation,p=b.isHorizontal(),q=k.autoSkip?b._autoSkip(b.getTicks()):b.getTicks(),r=h.valueOrDefault(k.fontColor,j.defaultFontColor),s=c(k),t=h.valueOrDefault(l.fontColor,j.defaultFontColor),u=c(l),v=m.drawTicks?m.tickMarkLength:0,w=h.valueOrDefault(n.fontColor,j.defaultFontColor),x=c(n),y=h.options.toPadding(n.padding),z=h.toRadians(b.labelRotation),A=[],B="right"===d.position?b.left:b.right-v,C="right"===d.position?b.left+v:b.right,D="bottom"===d.position?b.top:b.bottom-v,E="bottom"===d.position?b.top+v:b.bottom;if(h.each(q,function(c,f){if(void 0!==c.label){var g,i,l,n,r=c.label;f===b.zeroLineIndex&&d.offset===m.offsetGridLines?(g=m.zeroLineWidth,i=m.zeroLineColor,l=m.zeroLineBorderDash,n=m.zeroLineBorderDashOffset):(g=h.valueAtIndexOrDefault(m.lineWidth,f),i=h.valueAtIndexOrDefault(m.color,f),l=h.valueOrDefault(m.borderDash,j.borderDash),n=h.valueOrDefault(m.borderDashOffset,j.borderDashOffset));var s,t,u,w,x,y,F,G,H,I,J="middle",K="middle",L=k.padding;if(p){var M=v+L;"bottom"===d.position?(K=o?"middle":"top",J=o?"right":"center",I=b.top+M):(K=o?"middle":"bottom",J=o?"left":"center",I=b.bottom-M);var N=e(b,f,m.offsetGridLines&&q.length>1);N1);Q0)c=a.stepSize;else{var f=d.niceNum(b.max-b.min,!1);c=d.niceNum(f/(a.maxTicks-1),!0)}var g=Math.floor(b.min/c)*c,h=Math.ceil(b.max/c)*c;a.min&&a.max&&a.stepSize&&d.almostWhole((a.max-a.min)/a.stepSize,c/1e3)&&(g=a.min,h=a.max);var i=(h-g)/c;i=d.almostEquals(i,Math.round(i),c/1e3)?Math.round(i):Math.ceil(i),e.push(void 0!==a.min?a.min:g);for(var j=1;j3?c[2]-c[1]:c[1]-c[0];Math.abs(e)>1&&a!==Math.floor(a)&&(e=a-Math.floor(a));var f=d.log10(Math.abs(e)),g="";if(0!==a){var h=-1*Math.floor(f);h=Math.max(Math.min(h,20),0),g=a.toFixed(h)}else g="0";return g},logarithmic:function(a,b,c){var e=a/Math.pow(10,Math.floor(d.log10(a)));return 0===a?"0":1===e||2===e||5===e||0===b||b===c.length-1?a.toExponential():""}}}},{45:45}],35:[function(a,b,c){"use strict";var d=a(25),e=a(26),f=a(45);d._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:f.noop,title:function(a,b){var c="",d=b.labels,e=d?d.length:0;if(a.length>0){var f=a[0];f.xLabel?c=f.xLabel:e>0&&f.indexd.height-b.height&&(g="bottom");var h,i,j,k,l,m=(e.left+e.right)/2,n=(e.top+e.bottom)/2;"center"===g?(h=function(a){return a<=m},i=function(a){return a>m}):(h=function(a){return a<=b.width/2},i=function(a){return a>=d.width-b.width/2}),j=function(a){return a+b.width>d.width},k=function(a){return a-b.width<0},l=function(a){return a<=n?"top":"bottom"},h(c.x)?(f="left",j(c.x)&&(f="center",g=l(c.y))):i(c.x)&&(f="right",k(c.x)&&(f="center",g=l(c.y)));var o=a._options;return{xAlign:o.xAlign?o.xAlign:f,yAlign:o.yAlign?o.yAlign:g}}function k(a,b,c){var d=a.x,e=a.y,f=a.caretSize,g=a.caretPadding,h=a.cornerRadius,i=c.xAlign,j=c.yAlign,k=f+g,l=h+g;return"right"===i?d-=b.width:"center"===i&&(d-=b.width/2),"top"===j?e+=k:e-="bottom"===j?b.height+k:b.height/2,"center"===j?"left"===i?d+=k:"right"===i&&(d-=k):"left"===i?d-=l:"right"===i&&(d+=l),{x:d,y:e}}a.Tooltip=e.extend({initialize:function(){this._model=h(this._options)},getTitle:function(){var a=this,b=a._options,d=b.callbacks,e=d.beforeTitle.apply(a,arguments),f=d.title.apply(a,arguments),g=d.afterTitle.apply(a,arguments),h=[];return h=c(h,e),h=c(h,f),h=c(h,g)},getBeforeBody:function(){var a=this._options.callbacks.beforeBody.apply(this,arguments);return f.isArray(a)?a:void 0!==a?[a]:[]},getBody:function(a,b){var d=this,e=d._options.callbacks,g=[];return f.each(a,function(a){var f={before:[],lines:[],after:[]};c(f.before,e.beforeLabel.call(d,a,b)),c(f.lines,e.label.call(d,a,b)),c(f.after,e.afterLabel.call(d,a,b)),g.push(f)}),g},getAfterBody:function(){var a=this._options.callbacks.afterBody.apply(this,arguments);return f.isArray(a)?a:void 0!==a?[a]:[]},getFooter:function(){var a=this,b=a._options.callbacks,d=b.beforeFooter.apply(a,arguments),e=b.footer.apply(a,arguments),f=b.afterFooter.apply(a,arguments),g=[];return g=c(g,d),g=c(g,e),g=c(g,f)},update:function(b){var c,d,e=this,l=e._options,m=e._model,n=e._model=h(l),o=e._active,p=e._data,q={xAlign:m.xAlign,yAlign:m.yAlign},r={x:m.x,y:m.y},s={width:m.width,height:m.height},t={x:m.caretX,y:m.caretY};if(o.length){n.opacity=1;var u=[],v=[];t=a.Tooltip.positioners[l.position](o,e._eventPosition);var w=[];for(c=0,d=o.length;c0&&d.stroke()},draw:function(){var a=this._chart.ctx,b=this._view;if(0!==b.opacity){var c={width:b.width,height:b.height},d={x:b.x,y:b.y},e=Math.abs(b.opacity<.001)?0:b.opacity,f=b.title.length||b.beforeBody.length||b.body.length||b.afterBody.length||b.footer.length;this._options.enabled&&f&&(this.drawBackground(d,b,a,c,e),d.x+=b.xPadding,d.y+=b.yPadding,this.drawTitle(d,b,a,e),this.drawBody(d,b,a,e),this.drawFooter(d,b,a,e))}},handleEvent:function(a){var b=this,c=b._options,d=!1;if(b._lastActive=b._lastActive||[],"mouseout"===a.type?b._active=[]:b._active=b._chart.getElementsAtEventForMode(a,c.mode,c),d=!f.arrayEquals(b._active,b._lastActive),!d)return!1;if(b._lastActive=b._active,c.enabled||c.custom){b._eventPosition={x:a.x,y:a.y};var e=b._model;b.update(!0),b.pivot(),d|=e.x!==b._model.x||e.y!==b._model.y}return d}}),a.Tooltip.positioners={average:function(a){if(!a.length)return!1;var b,c,d=0,e=0,f=0;for(b=0,c=a.length;bi;)e-=2*Math.PI;for(;e=h&&e<=i,k=g>=c.innerRadius&&g<=c.outerRadius;return j&&k}return!1},getCenterPoint:function(){var a=this._view,b=(a.startAngle+a.endAngle)/2,c=(a.innerRadius+a.outerRadius)/2;return{x:a.x+Math.cos(b)*c,y:a.y+Math.sin(b)*c}},getArea:function(){var a=this._view;return Math.PI*((a.endAngle-a.startAngle)/(2*Math.PI))*(Math.pow(a.outerRadius,2)-Math.pow(a.innerRadius,2))},tooltipPosition:function(){var a=this._view,b=a.startAngle+(a.endAngle-a.startAngle)/2,c=(a.outerRadius-a.innerRadius)/2+a.innerRadius;return{x:a.x+Math.cos(b)*c,y:a.y+Math.sin(b)*c}},draw:function(){var a=this._chart.ctx,b=this._view,c=b.startAngle,d=b.endAngle;a.beginPath(),a.arc(b.x,b.y,b.outerRadius,c,d),a.arc(b.x,b.y,b.innerRadius,d,c,!0),a.closePath(),a.strokeStyle=b.borderColor,a.lineWidth=b.borderWidth,a.fillStyle=b.backgroundColor,a.fill(),a.lineJoin="bevel",b.borderWidth&&a.stroke()}})},{25:25,26:26,45:45}],37:[function(a,b,c){"use strict";var d=a(25),e=a(26),f=a(45),g=d.global;d._set("global",{elements:{line:{tension:.4,backgroundColor:g.defaultColor,borderWidth:3,borderColor:g.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),b.exports=e.extend({draw:function(){var a,b,c,d,e=this,h=e._view,i=e._chart.ctx,j=h.spanGaps,k=e._children.slice(),l=g.elements.line,m=-1;for(e._loop&&k.length&&k.push(k[0]),i.save(),i.lineCap=h.borderCapStyle||l.borderCapStyle,i.setLineDash&&i.setLineDash(h.borderDash||l.borderDash),i.lineDashOffset=h.borderDashOffset||l.borderDashOffset,i.lineJoin=h.borderJoinStyle||l.borderJoinStyle,i.lineWidth=h.borderWidth||l.borderWidth,i.strokeStyle=h.borderColor||g.defaultColor,i.beginPath(),m=-1,a=0;ab?1:-1,g=1,h=j.borderSkipped||"left"):(b=j.x-j.width/2,c=j.x+j.width/2,d=j.y,e=j.base,f=1,g=e>d?1:-1,h=j.borderSkipped||"bottom"),k){var l=Math.min(Math.abs(b-c),Math.abs(d-e));k=k>l?l:k;var m=k/2,n=b+("left"!==h?m*f:0),o=c+("right"!==h?-m*f:0),p=d+("top"!==h?m*g:0),q=e+("bottom"!==h?-m*g:0);n!==o&&(d=p,e=q),p!==q&&(b=n,c=o)}i.beginPath(),i.fillStyle=j.backgroundColor,i.strokeStyle=j.borderColor,i.lineWidth=k;var r=[[b,e],[b,d],[c,d],[c,e]],s=["bottom","left","top","right"],t=s.indexOf(h,0);t===-1&&(t=0);var u=a(0);i.moveTo(u[0],u[1]);for(var v=1;v<4;v++)u=a(v),i.lineTo(u[0],u[1]);i.fill(),k&&i.stroke()},height:function(){var a=this._view;return a.base-a.y},inRange:function(a,b){var c=!1;if(this._view){var d=e(this);c=a>=d.left&&a<=d.right&&b>=d.top&&b<=d.bottom}return c},inLabelRange:function(a,b){var c=this;if(!c._view)return!1;var f=!1,g=e(c);return f=d(c)?a>=g.left&&a<=g.right:b>=g.top&&b<=g.bottom},inXRange:function(a){var b=e(this);return a>=b.left&&a<=b.right},inYRange:function(a){var b=e(this);return a>=b.top&&a<=b.bottom},getCenterPoint:function(){var a,b,c=this._view;return d(this)?(a=c.x,b=(c.y+c.base)/2):(a=(c.x+c.base)/2,b=c.y),{x:a,y:b}},getArea:function(){var a=this._view;return a.width*Math.abs(a.y-a.base)},tooltipPosition:function(){var a=this._view;return{x:a.x,y:a.y}}})},{25:25,26:26}],40:[function(a,b,c){"use strict";b.exports={},b.exports.Arc=a(36),b.exports.Line=a(37),b.exports.Point=a(38),b.exports.Rectangle=a(39)},{36:36,37:37,38:38,39:39}],41:[function(a,b,c){"use strict";var d=a(42),c=b.exports={clear:function(a){a.ctx.clearRect(0,0,a.width,a.height)},roundedRect:function(a,b,c,d,e,f){if(f){var g=Math.min(f,d/2),h=Math.min(f,e/2);a.moveTo(b+g,c),a.lineTo(b+d-g,c),a.quadraticCurveTo(b+d,c,b+d,c+h),a.lineTo(b+d,c+e-h),a.quadraticCurveTo(b+d,c+e,b+d-g,c+e),a.lineTo(b+g,c+e),a.quadraticCurveTo(b,c+e,b,c+e-h),a.lineTo(b,c+h),a.quadraticCurveTo(b,c,b+g,c)}else a.rect(b,c,d,e)},drawPoint:function(a,b,c,d,e){var f,g,h,i,j,k;if("object"==typeof b&&(f=b.toString(),"[object HTMLImageElement]"===f||"[object HTMLCanvasElement]"===f))return void a.drawImage(b,d-b.width/2,e-b.height/2,b.width,b.height);if(!(isNaN(c)||c<=0)){switch(b){default:a.beginPath(),a.arc(d,e,c,0,2*Math.PI),a.closePath(),a.fill();break;case"triangle":a.beginPath(),g=3*c/Math.sqrt(3),j=g*Math.sqrt(3)/2,a.moveTo(d-g/2,e+j/3),a.lineTo(d+g/2,e+j/3),a.lineTo(d,e-2*j/3),a.closePath(),a.fill();break;case"rect":k=1/Math.SQRT2*c,a.beginPath(),a.fillRect(d-k,e-k,2*k,2*k),a.strokeRect(d-k,e-k,2*k,2*k);break;case"rectRounded":var l=c/Math.SQRT2,m=d-l,n=e-l,o=Math.SQRT2*c;a.beginPath(),this.roundedRect(a,m,n,o,o,c/2),a.closePath(),a.fill();break;case"rectRot":k=1/Math.SQRT2*c,a.beginPath(),a.moveTo(d-k,e),a.lineTo(d,e+k),a.lineTo(d+k,e),a.lineTo(d,e-k),a.closePath(),a.fill();break;case"cross":a.beginPath(),a.moveTo(d,e+c),a.lineTo(d,e-c),a.moveTo(d-c,e),a.lineTo(d+c,e),a.closePath();break;case"crossRot":a.beginPath(),h=Math.cos(Math.PI/4)*c,i=Math.sin(Math.PI/4)*c,a.moveTo(d-h,e-i),a.lineTo(d+h,e+i),a.moveTo(d-h,e+i),a.lineTo(d+h,e-i),a.closePath();break;case"star":a.beginPath(),a.moveTo(d,e+c),a.lineTo(d,e-c),a.moveTo(d-c,e),a.lineTo(d+c,e),h=Math.cos(Math.PI/4)*c,i=Math.sin(Math.PI/4)*c,a.moveTo(d-h,e-i),a.lineTo(d+h,e+i),a.moveTo(d-h,e+i),a.lineTo(d+h,e-i),a.closePath();break;case"line":a.beginPath(),a.moveTo(d-c,e),a.lineTo(d+c,e),a.closePath();break;case"dash":a.beginPath(),a.moveTo(d,e),a.lineTo(d+c,e),a.closePath()}a.stroke()}},clipArea:function(a,b){a.save(),a.beginPath(),a.rect(b.left,b.top,b.right-b.left,b.bottom-b.top),a.clip()},unclipArea:function(a){a.restore()},lineTo:function(a,b,c,d){return c.steppedLine?("after"===c.steppedLine&&!d||"after"!==c.steppedLine&&d?a.lineTo(b.x,c.y):a.lineTo(c.x,b.y),void a.lineTo(c.x,c.y)):c.tension?void a.bezierCurveTo(d?b.controlPointPreviousX:b.controlPointNextX,d?b.controlPointPreviousY:b.controlPointNextY,d?c.controlPointNextX:c.controlPointPreviousX,d?c.controlPointNextY:c.controlPointPreviousY,c.x,c.y):void a.lineTo(c.x,c.y)}};d.clear=c.clear,d.drawRoundedRectangle=function(a){a.beginPath(),c.roundedRect.apply(c,arguments),a.closePath()}},{42:42}],42:[function(a,b,c){"use strict";var d={noop:function(){},uid:function(){var a=0;return function(){return a++}}(),isNullOrUndef:function(a){return null===a||"undefined"==typeof a},isArray:Array.isArray?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)},isObject:function(a){return null!==a&&"[object Object]"===Object.prototype.toString.call(a)},valueOrDefault:function(a,b){return"undefined"==typeof a?b:a},valueAtIndexOrDefault:function(a,b,c){return d.valueOrDefault(d.isArray(a)?a[b]:a,c)},callback:function(a,b,c){if(a&&"function"==typeof a.call)return a.apply(c,b)},each:function(a,b,c,e){var f,g,h;if(d.isArray(a))if(g=a.length,e)for(f=g-1;f>=0;f--)b.call(c,a[f],f);else for(f=0;f=1?a:-(Math.sqrt(1-a*a)-1)},easeOutCirc:function(a){return Math.sqrt(1-(a-=1)*a)},easeInOutCirc:function(a){return(a/=.5)<1?-.5*(Math.sqrt(1-a*a)-1):.5*(Math.sqrt(1-(a-=2)*a)+1)},easeInElastic:function(a){var b=1.70158,c=0,d=1;return 0===a?0:1===a?1:(c||(c=.3),d<1?(d=1,b=c/4):b=c/(2*Math.PI)*Math.asin(1/d),-(d*Math.pow(2,10*(a-=1))*Math.sin((a-b)*(2*Math.PI)/c)))},easeOutElastic:function(a){var b=1.70158,c=0,d=1;return 0===a?0:1===a?1:(c||(c=.3),d<1?(d=1,b=c/4):b=c/(2*Math.PI)*Math.asin(1/d),d*Math.pow(2,-10*a)*Math.sin((a-b)*(2*Math.PI)/c)+1)},easeInOutElastic:function(a){var b=1.70158,c=0,d=1;return 0===a?0:2===(a/=.5)?1:(c||(c=.45),d<1?(d=1,b=c/4):b=c/(2*Math.PI)*Math.asin(1/d),a<1?-.5*(d*Math.pow(2,10*(a-=1))*Math.sin((a-b)*(2*Math.PI)/c)):d*Math.pow(2,-10*(a-=1))*Math.sin((a-b)*(2*Math.PI)/c)*.5+1)},easeInBack:function(a){var b=1.70158;return a*a*((b+1)*a-b)},easeOutBack:function(a){var b=1.70158;return(a-=1)*a*((b+1)*a+b)+1},easeInOutBack:function(a){var b=1.70158;return(a/=.5)<1?.5*(a*a*(((b*=1.525)+1)*a-b)):.5*((a-=2)*a*(((b*=1.525)+1)*a+b)+2)},easeInBounce:function(a){return 1-e.easeOutBounce(1-a)},easeOutBounce:function(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+.9375:7.5625*(a-=2.625/2.75)*a+.984375},easeInOutBounce:function(a){return a<.5?.5*e.easeInBounce(2*a):.5*e.easeOutBounce(2*a-1)+.5}};b.exports={effects:e},d.easingEffects=e},{42:42}],44:[function(a,b,c){"use strict";var d=a(42);b.exports={toLineHeight:function(a,b){var c=(""+a).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!c||"normal"===c[1])return 1.2*b;switch(a=+c[2],c[3]){case"px":return a;case"%":a/=100}return b*a},toPadding:function(a){var b,c,e,f;return d.isObject(a)?(b=+a.top||0,c=+a.right||0,e=+a.bottom||0,f=+a.left||0):b=c=e=f=+a||0,{top:b,right:c,bottom:e,left:f,height:b+e,width:f+c}},resolve:function(a,b,c){var e,f,g;for(e=0,f=a.length;e
        ';var g=b.childNodes[0],h=b.childNodes[1];b._reset=function(){g.scrollLeft=d,g.scrollTop=d,h.scrollLeft=d,h.scrollTop=d};var i=function(){b._reset(),a()};return f(g,"scroll",i.bind(g,"expand")),f(h,"scroll",i.bind(h,"shrink")),b}function l(a,b){var c=a[r]||(a[r]={}),d=c.renderProxy=function(a){a.animationName===u&&b()};q.each(v,function(b){f(a,b,d)}),a.classList.add(t)}function m(a){var b=a[r]||{},c=b.renderProxy;c&&(q.each(v,function(b){g(a,b,c)}),delete b.renderProxy),a.classList.remove(t)}function n(a,b,c){var d=a[r]||(a[r]={}),e=d.resizer=k(j(function(){if(d.resizer)return b(h("resize",c))}));l(a,function(){if(d.resizer){var b=a.parentNode;b&&b!==e.parentNode&&b.insertBefore(e,b.firstChild),e._reset()}})}function o(a){var b=a[r]||{},c=b.resizer;delete b.resizer,m(a),c&&c.parentNode&&c.parentNode.removeChild(c)}function p(a,b){var c=a._style||document.createElement("style");a._style||(a._style=c,b="/* Chart.js */\n"+b,c.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(c)),c.appendChild(document.createTextNode(b))}var q=a(45),r="$chartjs",s="chartjs-",t=s+"render-monitor",u=s+"render-animation",v=["animationstart","webkitAnimationStart"],w={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},x=function(){var a=!1;try{var b=Object.defineProperty({},"passive",{get:function(){a=!0}});window.addEventListener("e",null,b)}catch(c){}return a}(),y=!!x&&{passive:!0};b.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var a="from{opacity:0.99}to{opacity:1}";p(this,"@-webkit-keyframes "+u+"{"+a+"}@keyframes "+u+"{"+a+"}."+t+"{-webkit-animation:"+u+" 0.001s;animation:"+u+" 0.001s;}")},acquireContext:function(a,b){"string"==typeof a?a=document.getElementById(a):a.length&&(a=a[0]),a&&a.canvas&&(a=a.canvas);var c=a&&a.getContext&&a.getContext("2d");return c&&c.canvas===a?(e(a,b),c):null},releaseContext:function(a){var b=a.canvas;if(b[r]){var c=b[r].initial;["height","width"].forEach(function(a){var d=c[a];q.isNullOrUndef(d)?b.removeAttribute(a):b.setAttribute(a,d)}),q.each(c.style||{},function(a,c){b.style[c]=a}),b.width=b.width,delete b[r]}},addEventListener:function(a,b,c){var d=a.canvas;if("resize"===b)return void n(d,c,a);var e=c[r]||(c[r]={}),g=e.proxies||(e.proxies={}),h=g[a.id+"_"+b]=function(b){c(i(b,a))};f(d,b,h)},removeEventListener:function(a,b,c){var d=a.canvas;if("resize"===b)return void o(d,c);var e=c[r]||{},f=e.proxies||{},h=f[a.id+"_"+b];h&&g(d,b,h)}},q.addEvent=f,q.removeEvent=g},{45:45}],48:[function(a,b,c){"use strict";var d=a(45),e=a(46),f=a(47),g=f._enabled?f:e;b.exports=d.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},g)},{45:45,46:46,47:47}],49:[function(a,b,c){"use strict";var d=a(25),e=a(40),f=a(45);d._set("global",{plugins:{filler:{propagate:!0}}}),b.exports=function(){function a(a,b,c){var d,e=a._model||{},f=e.fill;if(void 0===f&&(f=!!e.backgroundColor),f===!1||null===f)return!1;if(f===!0)return"origin";if(d=parseFloat(f,10),isFinite(d)&&Math.floor(d)===d)return"-"!==f[0]&&"+"!==f[0]||(d=b+d),!(d===b||d<0||d>=c)&&d;switch(f){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return f;default:return!1}}function b(a){var b,c=a.el._model||{},d=a.el._scale||{},e=a.fill,f=null;if(isFinite(e))return null;if("start"===e?f=void 0===c.scaleBottom?d.bottom:c.scaleBottom:"end"===e?f=void 0===c.scaleTop?d.top:c.scaleTop:void 0!==c.scaleZero?f=c.scaleZero:d.getBasePosition?f=d.getBasePosition():d.getBasePixel&&(f=d.getBasePixel()),void 0!==f&&null!==f){if(void 0!==f.x&&void 0!==f.y)return f;if("number"==typeof f&&isFinite(f))return b=d.isHorizontal(),{x:b?f:null,y:b?null:f}}return null}function c(a,b,c){var d,e=a[b],f=e.fill,g=[b];if(!c)return f;for(;f!==!1&&g.indexOf(f)===-1;){if(!isFinite(f))return f;if(d=a[f],!d)return!1;if(d.visible)return f;g.push(f),f=d.fill}return!1}function g(a){var b=a.fill,c="dataset";return b===!1?null:(isFinite(b)||(c="boundary"),k[c](a))}function h(a){return a&&!a.skip}function i(a,b,c,d,e){var g;if(d&&e){for(a.moveTo(b[0].x,b[0].y),g=1;g0;--g)f.canvas.lineTo(a,c[g],c[g-1],!0)}}function j(a,b,c,d,e,f){var g,j,k,l,m,n,o,p=b.length,q=d.spanGaps,r=[],s=[],t=0,u=0;for(a.beginPath(),g=0,j=p+!!f;g');for(var c=0;c'),a.data.datasets[c].label&&b.push(a.data.datasets[c].label),b.push("");return b.push(""),b.join("")}}),b.exports=function(a){function b(a,b){return a.usePointStyle?b*Math.SQRT2:a.boxWidth}function c(b,c){var d=new a.Legend({ctx:b.ctx,options:c,chart:b});g.configure(b,d,c),g.addBox(b,d),b.legend=d}var g=a.layoutService,h=f.noop;return a.Legend=e.extend({initialize:function(a){f.extend(this,a),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:h,update:function(a,b,c){var d=this;return d.beforeUpdate(),d.maxWidth=a,d.maxHeight=b,d.margins=c,d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeBuildLabels(),d.buildLabels(),d.afterBuildLabels(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:h,beforeSetDimensions:h,setDimensions:function(){var a=this;a.isHorizontal()?(a.width=a.maxWidth,a.left=0,a.right=a.width):(a.height=a.maxHeight,a.top=0,a.bottom=a.height),a.paddingLeft=0,a.paddingTop=0,a.paddingRight=0,a.paddingBottom=0,a.minSize={width:0,height:0}},afterSetDimensions:h,beforeBuildLabels:h,buildLabels:function(){var a=this,b=a.options.labels||{},c=f.callback(b.generateLabels,[a.chart],a)||[];b.filter&&(c=c.filter(function(c){return b.filter(c,a.chart.data)})),a.options.reverse&&c.reverse(),a.legendItems=c},afterBuildLabels:h,beforeFit:h,fit:function(){var a=this,c=a.options,e=c.labels,g=c.display,h=a.ctx,i=d.global,j=f.valueOrDefault,k=j(e.fontSize,i.defaultFontSize),l=j(e.fontStyle,i.defaultFontStyle),m=j(e.fontFamily,i.defaultFontFamily),n=f.fontString(k,l,m),o=a.legendHitBoxes=[],p=a.minSize,q=a.isHorizontal();if(q?(p.width=a.maxWidth,p.height=g?10:0):(p.width=g?10:0,p.height=a.maxHeight),g)if(h.font=n,q){var r=a.lineWidths=[0],s=a.legendItems.length?k+e.padding:0;h.textAlign="left",h.textBaseline="top",f.each(a.legendItems,function(c,d){var f=b(e,k),g=f+k/2+h.measureText(c.text).width;r[r.length-1]+g+e.padding>=a.width&&(s+=k+e.padding,r[r.length]=a.left),o[d]={left:0,top:0,width:g,height:k},r[r.length-1]+=g+e.padding}),p.height+=s}else{var t=e.padding,u=a.columnWidths=[],v=e.padding,w=0,x=0,y=k+t;f.each(a.legendItems,function(a,c){var d=b(e,k),f=d+k/2+h.measureText(a.text).width;x+y>p.height&&(v+=w+e.padding,u.push(w),w=0,x=0),w=Math.max(w,f),x+=y,o[c]={left:0,top:0,width:f,height:k}}),v+=w,u.push(w),p.width+=v}a.width=p.width,a.height=p.height},afterFit:h,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,c=a.options,e=c.labels,g=d.global,h=g.elements.line,i=a.width,j=a.lineWidths;if(c.display){var k,l=a.ctx,m=f.valueOrDefault,n=m(e.fontColor,g.defaultFontColor),o=m(e.fontSize,g.defaultFontSize),p=m(e.fontStyle,g.defaultFontStyle),q=m(e.fontFamily,g.defaultFontFamily),r=f.fontString(o,p,q);l.textAlign="left",l.textBaseline="middle",l.lineWidth=.5,l.strokeStyle=n,l.fillStyle=n,l.font=r;var s=b(e,o),t=a.legendHitBoxes,u=function(a,b,d){if(!(isNaN(s)||s<=0)){l.save(),l.fillStyle=m(d.fillStyle,g.defaultColor),l.lineCap=m(d.lineCap,h.borderCapStyle),l.lineDashOffset=m(d.lineDashOffset,h.borderDashOffset),l.lineJoin=m(d.lineJoin,h.borderJoinStyle),l.lineWidth=m(d.lineWidth,h.borderWidth),l.strokeStyle=m(d.strokeStyle,g.defaultColor);var e=0===m(d.lineWidth,h.borderWidth);if(l.setLineDash&&l.setLineDash(m(d.lineDash,h.borderDash)),c.labels&&c.labels.usePointStyle){var i=o*Math.SQRT2/2,j=i/Math.SQRT2,k=a+j,n=b+j;f.canvas.drawPoint(l,d.pointStyle,i,k,n)}else e||l.strokeRect(a,b,s,o),l.fillRect(a,b,s,o);l.restore()}},v=function(a,b,c,d){var e=o/2,f=s+e+a,g=b+e;l.fillText(c.text,f,g),c.hidden&&(l.beginPath(),l.lineWidth=2,l.moveTo(f,g),l.lineTo(f+d,g),l.stroke())},w=a.isHorizontal();k=w?{x:a.left+(i-j[0])/2,y:a.top+e.padding,line:0}:{x:a.left+e.padding,y:a.top+e.padding,line:0};var x=o+e.padding;f.each(a.legendItems,function(b,c){var d=l.measureText(b.text).width,f=s+o/2+d,g=k.x,h=k.y;w?g+f>=i&&(h=k.y+=x,k.line++,g=k.x=a.left+(i-j[k.line])/2):h+x>a.bottom&&(g=k.x=g+a.columnWidths[k.line]+e.padding,h=k.y=a.top+e.padding,k.line++),u(g,h,b),t[c].left=g,t[c].top=h,v(g,h,b,d),w?k.x+=f+e.padding:k.y+=x})}},handleEvent:function(a){var b=this,c=b.options,d="mouseup"===a.type?"click":a.type,e=!1;if("mousemove"===d){if(!c.onHover)return}else{if("click"!==d)return;if(!c.onClick)return}var f=a.x,g=a.y;if(f>=b.left&&f<=b.right&&g>=b.top&&g<=b.bottom)for(var h=b.legendHitBoxes,i=0;i=j.left&&f<=j.left+j.width&&g>=j.top&&g<=j.top+j.height){if("click"===d){c.onClick.call(b,a["native"],b.legendItems[i]),e=!0;break}if("mousemove"===d){c.onHover.call(b,a["native"],b.legendItems[i]),e=!0;break}}}return e}}),{id:"legend",beforeInit:function(a){var b=a.options.legend;b&&c(a,b)},beforeUpdate:function(a){var b=a.options.legend,e=a.legend;b?(f.mergeIf(b,d.global.legend),e?(g.configure(a,e,b),e.options=b):c(a,b)):e&&(g.removeBox(a,e),delete a.legend)},afterEvent:function(a,b){var c=a.legend;c&&c.handleEvent(b)}}}},{25:25,26:26,45:45}],51:[function(a,b,c){"use strict";var d=a(25),e=a(26),f=a(45);d._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}}),b.exports=function(a){function b(b,d){var e=new a.Title({ctx:b.ctx,options:d,chart:b});c.configure(b,e,d),c.addBox(b,e),b.titleBlock=e}var c=a.layoutService,g=f.noop;return a.Title=e.extend({initialize:function(a){var b=this;f.extend(b,a),b.legendHitBoxes=[]},beforeUpdate:g,update:function(a,b,c){var d=this;return d.beforeUpdate(),d.maxWidth=a,d.maxHeight=b,d.margins=c,d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeBuildLabels(),d.buildLabels(),d.afterBuildLabels(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:g,beforeSetDimensions:g,setDimensions:function(){var a=this;a.isHorizontal()?(a.width=a.maxWidth,a.left=0,a.right=a.width):(a.height=a.maxHeight,a.top=0,a.bottom=a.height),a.paddingLeft=0,a.paddingTop=0,a.paddingRight=0,a.paddingBottom=0,a.minSize={width:0,height:0}},afterSetDimensions:g,beforeBuildLabels:g,buildLabels:g,afterBuildLabels:g,beforeFit:g,fit:function(){var a=this,b=f.valueOrDefault,c=a.options,e=c.display,g=b(c.fontSize,d.global.defaultFontSize),h=a.minSize,i=f.isArray(c.text)?c.text.length:1,j=f.options.toLineHeight(c.lineHeight,g),k=e?i*j+2*c.padding:0;a.isHorizontal()?(h.width=a.maxWidth,h.height=k):(h.width=k,h.height=a.maxHeight),a.width=h.width,a.height=h.height},afterFit:g,isHorizontal:function(){var a=this.options.position;return"top"===a||"bottom"===a},draw:function(){var a=this,b=a.ctx,c=f.valueOrDefault,e=a.options,g=d.global;if(e.display){var h,i,j,k=c(e.fontSize,g.defaultFontSize),l=c(e.fontStyle,g.defaultFontStyle),m=c(e.fontFamily,g.defaultFontFamily),n=f.fontString(k,l,m),o=f.options.toLineHeight(e.lineHeight,k),p=o/2+e.padding,q=0,r=a.top,s=a.left,t=a.bottom,u=a.right;b.fillStyle=c(e.fontColor,g.defaultFontColor),b.font=n,a.isHorizontal()?(i=s+(u-s)/2,j=r+p,h=u-s):(i="left"===e.position?s+p:u-p,j=r+(t-r)/2,h=t-r,q=Math.PI*("left"===e.position?-.5:.5)),b.save(),b.translate(i,j),b.rotate(q),b.textAlign="center",b.textBaseline="middle";var v=e.text;if(f.isArray(v))for(var w=0,x=0;xb.max&&(b.max=d))})});b.min=isFinite(b.min)&&!isNaN(b.min)?b.min:i,b.max=isFinite(b.max)&&!isNaN(b.max)?b.max:j,this.handleTickRangeOptions()},getTickLimit:function(){var a,b=this,c=b.options.ticks;if(b.isHorizontal())a=Math.min(c.maxTicksLimit?c.maxTicksLimit:11,Math.ceil(b.width/50));else{var f=e.valueOrDefault(c.fontSize,d.global.defaultFontSize);a=Math.min(c.maxTicksLimit?c.maxTicksLimit:11,Math.ceil(b.height/(2*f)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(a,b){return+this.getRightValue(this.chart.data.datasets[b].data[a])},getPixelForValue:function(a){var b,c=this,d=c.start,e=+c.getRightValue(a),f=c.end-d;return c.isHorizontal()?(b=c.left+c.width/f*(e-d),Math.round(b)):(b=c.bottom-c.height/f*(e-d),Math.round(b))},getValueForPixel:function(a){var b=this,c=b.isHorizontal(),d=c?b.width:b.height,e=(c?a-b.left:b.bottom-a)/d;return b.start+(b.end-b.start)*e},getPixelForTick:function(a){return this.getPixelForValue(this.ticksAsNumbers[a])}});a.scaleService.registerScaleType("linear",c,b)}},{25:25,34:34,45:45}],54:[function(a,b,c){"use strict";var d=a(45),e=a(34);b.exports=function(a){var b=d.noop;a.LinearScaleBase=a.Scale.extend({getRightValue:function(b){return"string"==typeof b?+b:a.Scale.prototype.getRightValue.call(this,b)},handleTickRangeOptions:function(){var a=this,b=a.options,c=b.ticks;if(c.beginAtZero){var e=d.sign(a.min),f=d.sign(a.max);e<0&&f<0?a.max=0:e>0&&f>0&&(a.min=0)}var g=void 0!==c.min||void 0!==c.suggestedMin,h=void 0!==c.max||void 0!==c.suggestedMax;void 0!==c.min?a.min=c.min:void 0!==c.suggestedMin&&(null===a.min?a.min=c.suggestedMin:a.min=Math.min(a.min,c.suggestedMin)),void 0!==c.max?a.max=c.max:void 0!==c.suggestedMax&&(null===a.max?a.max=c.suggestedMax:a.max=Math.max(a.max,c.suggestedMax)),g!==h&&a.min>=a.max&&(g?a.max=a.min+1:a.min=a.max-1),a.min===a.max&&(a.max++,c.beginAtZero||a.min--)},getTickLimit:b,handleDirectionalChanges:b,buildTicks:function(){var a=this,b=a.options,c=b.ticks,f=a.getTickLimit();f=Math.max(2,f);var g={maxTicks:f,min:c.min,max:c.max,stepSize:d.valueOrDefault(c.fixedStepSize,c.stepSize)},h=a.ticks=e.generators.linear(g,a); -a.handleDirectionalChanges(),a.max=d.max(h),a.min=d.min(h),c.reverse?(h.reverse(),a.start=a.max,a.end=a.min):(a.start=a.min,a.end=a.max)},convertTicksToLabels:function(){var b=this;b.ticksAsNumbers=b.ticks.slice(),b.zeroLineIndex=b.ticks.indexOf(0),a.Scale.prototype.convertTicksToLabels.call(b)}})}},{34:34,45:45}],55:[function(a,b,c){"use strict";var d=a(45),e=a(34);b.exports=function(a){var b={position:"left",ticks:{callback:e.formatters.logarithmic}},c=a.Scale.extend({determineDataLimits:function(){function a(a){return j?a.xAxisID===b.id:a.yAxisID===b.id}var b=this,c=b.options,e=c.ticks,f=b.chart,g=f.data,h=g.datasets,i=d.valueOrDefault,j=b.isHorizontal();b.min=null,b.max=null,b.minNotZero=null;var k=c.stacked;if(void 0===k&&d.each(h,function(b,c){if(!k){var d=f.getDatasetMeta(c);f.isDatasetVisible(c)&&a(d)&&void 0!==d.stack&&(k=!0)}}),c.stacked||k){var l={};d.each(h,function(e,g){var h=f.getDatasetMeta(g),i=[h.type,void 0===c.stacked&&void 0===h.stack?g:"",h.stack].join(".");f.isDatasetVisible(g)&&a(h)&&(void 0===l[i]&&(l[i]=[]),d.each(e.data,function(a,d){var e=l[i],f=+b.getRightValue(a);isNaN(f)||h.data[d].hidden||(e[d]=e[d]||0,c.relativePoints?e[d]=100:e[d]+=f)}))}),d.each(l,function(a){var c=d.min(a),e=d.max(a);b.min=null===b.min?c:Math.min(b.min,c),b.max=null===b.max?e:Math.max(b.max,e)})}else d.each(h,function(c,e){var g=f.getDatasetMeta(e);f.isDatasetVisible(e)&&a(g)&&d.each(c.data,function(a,c){var d=+b.getRightValue(a);isNaN(d)||g.data[c].hidden||(null===b.min?b.min=d:db.max&&(b.max=d),0!==d&&(null===b.minNotZero||de?{start:b-c-5,end:b}:{start:b,end:b+c+5}}function i(a){var d,f,i,j=c(a),k=Math.min(a.height/2,a.width/2),l={r:a.width,l:0,t:a.height,b:0},m={};a.ctx.font=j.font,a._pointLabelSizes=[];var n=b(a);for(d=0;dl.r&&(l.r=q.end,m.r=o),r.startl.b&&(l.b=r.end,m.b=o)}a.setReductions(k,l,m)}function j(a){var b=Math.min(a.height/2,a.width/2);a.drawingArea=Math.round(b),a.setCenterPoint(0,0,0,0)}function k(a){return 0===a||180===a?"center":a<180?"left":"right"}function l(a,b,c,d){if(e.isArray(b))for(var f=c.y,g=1.5*d,h=0;h270||a<90)&&(c.y-=b.h)}function n(a){var d=a.ctx,f=e.valueOrDefault,g=a.options,h=g.angleLines,i=g.pointLabels;d.lineWidth=h.lineWidth,d.strokeStyle=h.color;var j=a.getDistanceFromCenterForValue(g.ticks.reverse?a.min:a.max),n=c(a);d.textBaseline="top";for(var o=b(a)-1;o>=0;o--){if(h.display){var p=a.getPointPosition(o,j);d.beginPath(),d.moveTo(a.xCenter,a.yCenter),d.lineTo(p.x,p.y),d.stroke(),d.closePath()}if(i.display){var r=a.getPointPosition(o,j+5),s=f(i.fontColor,q.defaultFontColor);d.font=n.font,d.fillStyle=s;var t=a.getIndexAngle(o),u=e.toDegrees(t);d.textAlign=k(u),m(u,a._pointLabelSizes[o],r),l(d,a.pointLabels[o]||"",r,n.size)}}}function o(a,c,d,f){var g=a.ctx;if(g.strokeStyle=e.valueAtIndexOrDefault(c.color,f-1),g.lineWidth=e.valueAtIndexOrDefault(c.lineWidth,f-1),a.options.gridLines.circular)g.beginPath(),g.arc(a.xCenter,a.yCenter,d,0,2*Math.PI),g.closePath(),g.stroke();else{var h=b(a);if(0===h)return;g.beginPath();var i=a.getPointPosition(0,d);g.moveTo(i.x,i.y);for(var j=1;j0&&c>0?b:0)},draw:function(){var a=this,b=a.options,c=b.gridLines,d=b.ticks,f=e.valueOrDefault;if(b.display){var g=a.ctx,h=this.getIndexAngle(0),i=f(d.fontSize,q.defaultFontSize),j=f(d.fontStyle,q.defaultFontStyle),k=f(d.fontFamily,q.defaultFontFamily),l=e.fontString(i,j,k);e.each(a.ticks,function(b,e){if(e>0||d.reverse){var j=a.getDistanceFromCenterForValue(a.ticksAsNumbers[e]);if(c.display&&0!==e&&o(a,c,j,e),d.display){var k=f(d.fontColor,q.defaultFontColor);if(g.font=l,g.save(),g.translate(a.xCenter,a.yCenter),g.rotate(h),d.showLabelBackdrop){var m=g.measureText(b).width;g.fillStyle=d.backdropColor,g.fillRect(-m/2-d.backdropPaddingX,-j-i/2-d.backdropPaddingY,m+2*d.backdropPaddingX,i+2*d.backdropPaddingY)}g.textAlign="center",g.textBaseline="middle",g.fillStyle=k,g.fillText(b,0,-j),g.restore()}}}),(b.angleLines.display||b.pointLabels.display)&&n(a)}}});a.scaleService.registerScaleType("radialLinear",s,r)}},{25:25,34:34,45:45}],57:[function(a,b,c){"use strict";function d(a,b){return a-b}function e(a){var b,c,d,e={},f=[];for(b=0,c=a.length;bb&&h=0&&g<=h;){if(d=g+h>>1,e=a[d-1]||null,f=a[d],!e)return{lo:null,hi:f};if(f[b]c))return{lo:e,hi:f};h=d-1}}return{lo:f,hi:null}}function h(a,b,c,d){var e=g(a,b,c),f=e.lo?e.hi?e.lo:a[a.length-2]:a[0],h=e.lo?e.hi?e.hi:a[a.length-1]:a[1],i=h[b]-f[b],j=i?(c-f[b])/i:0,k=(h[d]-f[d])*j;return f[d]+k}function i(a,b){var c=b.parser,d=b.parser||b.format;return"function"==typeof c?c(a):"string"==typeof a&&"string"==typeof d?q(a,d):(a instanceof q||(a=q(a)),a.isValid()?a:"function"==typeof d?d(a):a)}function j(a,b){if(s.isNullOrUndef(a))return null;var c=b.options.time,d=i(b.getRightValue(a),c);return d.isValid()?(c.round&&d.startOf(c.round),d.valueOf()):null}function k(a,b,c,d){var e,f,g,h=b-a,i=v[c],j=i.size,k=i.steps;if(!k)return Math.ceil(h/((d||1)*j));for(e=0,f=k.length;e1?b[1]:d,g=b[0],i=(h(a,"time",f,"pos")-h(a,"time",g,"pos"))/2),e.time.max||(f=b[b.length-1],g=b.length>1?b[b.length-2]:c,j=(h(a,"time",f,"pos")-h(a,"time",g,"pos"))/2)),{left:i,right:j}}function p(a,b){var c,d,e,f,g=[];for(c=0,d=a.length;c=e&&c<=g&&u.push(c);return d.min=e,d.max=g,d._unit=r,d._majorUnit=s,d._minorFormat=k[r],d._majorFormat=k[s],d._table=f(d._timestamps.data,e,g,h.distribution),d._offsets=o(d._table,u,e,g,h),p(u,s)},getLabelForIndex:function(a,b){var c=this,d=c.chart.data,e=c.options.time,f=d.labels&&a=0&&at||e[3]&&1>e[3]){return n(e,t)}return"rgb("+e[0]+", "+e[1]+", "+e[2]+")"},rgbaString:n,percentString:function(e,t){if(1>t||e[3]&&1>e[3]){return l(e,t)}var a=Math.round(100*(e[0]/255)),o=Math.round(100*(e[1]/255)),i=Math.round(100*(e[2]/255));return"rgb("+a+"%, "+o+"%, "+i+"%)"},percentaString:l,hslString:function(e,t){if(1>t||e[3]&&1>e[3]){return s(e,t)}return"hsl("+e[0]+", "+e[1]+"%, "+e[2]+"%)"},hslaString:s,hwbString:function(e,t){if(t===void 0){t=e[3]!==void 0?e[3]:1}return"hwb("+e[0]+", "+e[1]+"%, "+e[2]+"%"+(t!==void 0&&1!==t?", "+t:"")+")"},keyword:function(e){return u[e.slice(0,3)]}};function a(e){if(!e){return}var t=/^#([a-fA-F0-9]{3})$/i,o=/^#([a-fA-F0-9]{6})$/i,n=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,l=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i,s=/(\w+)/,c=[0,0,0],u=1,m=e.match(t);if(m){m=m[1];for(var p=0;pt.length?"0"+t:t}var u={};for(var m in h){u[h[m]]=m}},{5:5}],2:[function(e,t){var a=e(4),o=e(1),i=function(e){if(e instanceof i){return e}if(!(this instanceof i)){return new i(e)}this.valid=!1;this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var t;if("string"==typeof e){t=o.getRgba(e);if(t){this.setValues("rgb",t)}else if(t=o.getHsla(e)){this.setValues("hsl",t)}else if(t=o.getHwb(e)){this.setValues("hwb",t)}}else if("object"===_typeof(e)){t=e;if(t.r!==void 0||t.red!==void 0){this.setValues("rgb",t)}else if(t.l!==void 0||t.lightness!==void 0){this.setValues("hsl",t)}else if(t.v!==void 0||t.value!==void 0){this.setValues("hsv",t)}else if(t.w!==void 0||t.whiteness!==void 0){this.setValues("hwb",t)}else if(t.c!==void 0||t.cyan!==void 0){this.setValues("cmyk",t)}}};i.prototype={isValid:function isValid(){return this.valid},rgb:function rgb(){return this.setSpace("rgb",arguments)},hsl:function hsl(){return this.setSpace("hsl",arguments)},hsv:function hsv(){return this.setSpace("hsv",arguments)},hwb:function hwb(){return this.setSpace("hwb",arguments)},cmyk:function cmyk(){return this.setSpace("cmyk",arguments)},rgbArray:function rgbArray(){return this.values.rgb},hslArray:function hslArray(){return this.values.hsl},hsvArray:function hsvArray(){return this.values.hsv},hwbArray:function hwbArray(){var e=this.values;if(1!==e.alpha){return e.hwb.concat([e.alpha])}return e.hwb},cmykArray:function cmykArray(){return this.values.cmyk},rgbaArray:function rgbaArray(){var e=this.values;return e.rgb.concat([e.alpha])},hslaArray:function hslaArray(){var e=this.values;return e.hsl.concat([e.alpha])},alpha:function alpha(e){if(e===void 0){return this.values.alpha}this.setValues("alpha",e);return this},red:function red(e){return this.setChannel("rgb",0,e)},green:function green(e){return this.setChannel("rgb",1,e)},blue:function blue(e){return this.setChannel("rgb",2,e)},hue:function hue(e){if(e){e%=360;e=0>e?360+e:e}return this.setChannel("hsl",0,e)},saturation:function saturation(e){return this.setChannel("hsl",1,e)},lightness:function lightness(e){return this.setChannel("hsl",2,e)},saturationv:function saturationv(e){return this.setChannel("hsv",1,e)},whiteness:function whiteness(e){return this.setChannel("hwb",1,e)},blackness:function blackness(e){return this.setChannel("hwb",2,e)},value:function value(e){return this.setChannel("hsv",2,e)},cyan:function cyan(e){return this.setChannel("cmyk",0,e)},magenta:function magenta(e){return this.setChannel("cmyk",1,e)},yellow:function yellow(e){return this.setChannel("cmyk",2,e)},black:function black(e){return this.setChannel("cmyk",3,e)},hexString:function hexString(){return o.hexString(this.values.rgb)},rgbString:function rgbString(){return o.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function rgbaString(){return o.rgbaString(this.values.rgb,this.values.alpha)},percentString:function percentString(){return o.percentString(this.values.rgb,this.values.alpha)},hslString:function hslString(){return o.hslString(this.values.hsl,this.values.alpha)},hslaString:function hslaString(){return o.hslaString(this.values.hsl,this.values.alpha)},hwbString:function hwbString(){return o.hwbString(this.values.hwb,this.values.alpha)},keyword:function keyword(){return o.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function rgbNumber(){var e=this.values.rgb;return e[0]<<16|e[1]<<8|e[2]},luminosity:function luminosity(){for(var e=this.values.rgb,t=[],a=0,o;a=o?o/12.92:Math.pow((o+.055)/1.055,2.4)}return .2126*t[0]+.7152*t[1]+.0722*t[2]},contrast:function contrast(e){var t=this.luminosity(),a=e.luminosity();if(t>a){return(t+.05)/(a+.05)}return(a+.05)/(t+.05)},level:function level(e){var t=this.contrast(e);if(7.1<=t){return"AAA"}return 4.5<=t?"AA":""},dark:function dark(){var e=this.values.rgb,t=(299*e[0]+587*e[1]+114*e[2])/1e3;return 128>t},light:function light(){return!this.dark()},negate:function negate(){for(var e=[],t=0;3>t;t++){e[t]=255-this.values.rgb[t]}this.setValues("rgb",e);return this},lighten:function lighten(e){var t=this.values.hsl;t[2]+=t[2]*e;this.setValues("hsl",t);return this},darken:function darken(e){var t=this.values.hsl;t[2]-=t[2]*e;this.setValues("hsl",t);return this},saturate:function saturate(e){var t=this.values.hsl;t[1]+=t[1]*e;this.setValues("hsl",t);return this},desaturate:function desaturate(e){var t=this.values.hsl;t[1]-=t[1]*e;this.setValues("hsl",t);return this},whiten:function whiten(e){var t=this.values.hwb;t[1]+=t[1]*e;this.setValues("hwb",t);return this},blacken:function blacken(e){var t=this.values.hwb;t[2]+=t[2]*e;this.setValues("hwb",t);return this},greyscale:function greyscale(){var e=this.values.rgb,t=.3*e[0]+.59*e[1]+.11*e[2];this.setValues("rgb",[t,t,t]);return this},clearer:function clearer(e){var t=this.values.alpha;this.setValues("alpha",t-t*e);return this},opaquer:function opaquer(e){var t=this.values.alpha;this.setValues("alpha",t+t*e);return this},rotate:function rotate(e){var t=this.values.hsl,a=(t[0]+e)%360;t[0]=0>a?360+a:a;this.setValues("hsl",t);return this},mix:function mix(e,t){var o=this,i=e,n=t===void 0?.5:t,l=2*n-1,s=o.alpha()-i.alpha(),a=((-1==l*s?l:(l+s)/(1+l*s))+1)/2,d=1-a;return this.rgb(a*o.red()+d*i.red(),a*o.green()+d*i.green(),a*o.blue()+d*i.blue()).alpha(o.alpha()*n+i.alpha()*(1-n))},toJSON:function toJSON(){return this.rgb()},clone:function clone(){var e=new i,t=this.values,a=e.values,o,n;for(var l in t){if(t.hasOwnProperty(l)){o=t[l];n={}.toString.call(o);if("[object Array]"===n){a[l]=o.slice(0)}else if("[object Number]"===n){a[l]=o}else{console.error("unexpected color value:",o)}}}return e}};i.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]};i.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]};i.prototype.getValues=function(e){for(var t=this.values,a={},o=0;o=o?o:2-o;n=(o+a)/2;i=2*a/(o+a);return[t,100*i,100*n]},hsl2hwb:function(e){return i(c(e))},hsl2cmyk:function(e){return n(c(e))},hsl2keyword:function(e){return l(c(e))},hsv2rgb:h,hsv2hsl:function(e){var t=e[0],a=e[1]/100,o=e[2]/100,i,n;n=(2-a)*o;i=a*o;i/=1>=n?n:2-n;i=i||0;n/=2;return[t,100*i,100*n]},hsv2hwb:function(e){return i(h(e))},hsv2cmyk:function(e){return n(h(e))},hsv2keyword:function(e){return l(h(e))},hwb2rgb:u,hwb2hsl:function(e){return a(u(e))},hwb2hsv:function(e){return o(u(e))},hwb2cmyk:function(e){return n(u(e))},hwb2keyword:function(e){return l(u(e))},cmyk2rgb:m,cmyk2hsl:function(e){return a(m(e))},cmyk2hsv:function(e){return o(m(e))},cmyk2hwb:function(e){return i(m(e))},cmyk2keyword:function(e){return l(m(e))},keyword2rgb:v,keyword2hsl:function(e){return a(v(e))},keyword2hsv:function(e){return o(v(e))},keyword2hwb:function(e){return i(v(e))},keyword2cmyk:function(e){return n(v(e))},keyword2lab:function(e){return d(v(e))},keyword2xyz:function(e){return s(v(e))},xyz2rgb:p,xyz2lab:f,xyz2lch:function(e){return x(f(e))},lab2xyz:y,lab2rgb:k,lab2lch:x,lch2lab:_,lch2xyz:function(e){return y(_(e))},lch2rgb:function(e){return k(_(e))}};function a(e){var t=e[0]/255,a=e[1]/255,o=e[2]/255,i=Math.min(t,a,o),n=Math.max(t,a,o),d=n-i,c,u,m;if(n==i)c=0;else if(t==n)c=(a-o)/d;else if(a==n)c=2+(o-t)/d;else if(o==n)c=4+(t-a)/d;c=Math.min(60*c,360);if(0>c)c+=360;m=(i+n)/2;if(n==i)u=0;else if(.5>=m)u=d/(n+i);else u=d/(2-n-i);return[c,100*u,100*m]}function o(e){var t=e[0],a=e[1],o=e[2],i=Math.min(t,a,o),n=Math.max(t,a,o),l=n-i,d,c,u;if(0==n)c=0;else c=1e3*(l/n)/10;if(n==i)d=0;else if(t==n)d=(a-o)/l;else if(a==n)d=2+(o-t)/l;else if(o==n)d=4+(t-a)/l;d=Math.min(60*d,360);if(0>d)d+=360;u=1e3*(n/255)/10;return[d,c,u]}function i(e){var t=e[0],o=e[1],i=e[2],n=a(e)[0],l=1/255*Math.min(t,Math.min(o,i)),i=1-1/255*Math.max(t,Math.max(o,i));return[n,100*l,100*i]}function n(e){var t=e[0]/255,a=e[1]/255,o=e[2]/255,i,n,l,s;s=Math.min(1-t,1-a,1-o);i=(1-t-s)/(1-s)||0;n=(1-a-s)/(1-s)||0;l=(1-o-s)/(1-s)||0;return[100*i,100*n,100*l,100*s]}function l(e){return w[JSON.stringify(e)]}function s(e){var t=e[0]/255,a=e[1]/255,o=e[2]/255;t=.04045o)l=o*(1+a);else l=o+a-o*a;n=2*o-l;d=[0,0,0];for(var h=0;3>h;h++){s=t+1/3*-(h-1);0>s&&s++;16*s)c=n+6*(l-n)*s;else if(1>2*s)c=l;else if(2>3*s)c=n+6*((l-n)*(2/3-s));else c=n;d[h]=255*c}return d}function h(e){var a=e[0]/60,o=e[1]/100,i=e[2]/100,n=Math.floor(a)%6,l=a-Math.floor(a),s=255*i*(1-o),d=255*i*(1-o*l),c=255*i*(1-o*(1-l)),i=255*i;switch(n){case 0:return[i,c,s];case 1:return[d,i,s];case 2:return[s,i,c];case 3:return[s,d,i];case 4:return[c,s,i];case 5:return[i,s,d];}}function u(e){var t=e[0]/360,a=e[1]/100,o=e[2]/100,l=a+o,s,d,c,h;if(1=t){n=100*t/903.3;s=7.787*(n/100)+16/116}else{n=100*Math.pow((t+16)/116,3);s=Math.pow(n/100,1/3)}i=.008856>=i/95.047?i=95.047*(o/500+s-16/116)/7.787:95.047*Math.pow(o/500+s,3);l=.008859>=l/108.883?l=108.883*(s-a/200-16/116)/7.787:108.883*Math.pow(s-a/200,3);return[i,n,l]}function x(e){var t=e[0],o=e[1],a=e[2],i,n,l;i=Math.atan2(a,o);n=360*i/2/Math.PI;if(0>n){n+=360}l=Math.sqrt(o*o+a*a);return[t,l,n]}function k(e){return p(y(e))}function _(e){var t=e[0],o=e[1],i=e[2],n,l,s;s=2*(i/360)*Math.PI;n=o*Math.cos(s);l=o*Math.sin(s);return[t,n,l]}function v(e){return S[e]}var S={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},w={};for(var D in S){w[JSON.stringify(S[D])]=D}},{}],4:[function(e,t){var a=e(3),o=function(){return new d};for(var i in a){o[i+"Raw"]=function(e){return function(t){if("number"==typeof t)t=Array.prototype.slice.call(arguments);return a[e](t)}}(i);var n=/(\w+)2(\w+)/.exec(i),l=n[1],s=n[2];o[l]=o[l]||{};o[l][s]=o[i]=function(e){return function(t){if("number"==typeof t)t=Array.prototype.slice.call(arguments);var o=a[e](t);if("string"==typeof o||o===void 0)return o;for(var n=0;n>>0,o=0;ot.overflow&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&a);if(e._strict){o=o&&0===t.charsLeftOver&&0===t.unusedTokens.length&&t.bigHour===void 0}if(null==Object.isFrozen||!Object.isFrozen(e)){e._isValid=o}else{return o}}return e._isValid}function k(e){var t=p(NaN);if(null!=e){u(y(t),e)}else{y(t).userInvalidated=!0}return t}var It=e.momentProperties=[];function _(e,t){var a,o,n;if(!l(t._isAMomentObject)){e._isAMomentObject=t._isAMomentObject}if(!l(t._i)){e._i=t._i}if(!l(t._f)){e._f=t._f}if(!l(t._l)){e._l=t._l}if(!l(t._strict)){e._strict=t._strict}if(!l(t._tzm)){e._tzm=t._tzm}if(!l(t._isUTC)){e._isUTC=t._isUTC}if(!l(t._offset)){e._offset=t._offset}if(!l(t._pf)){e._pf=y(t)}if(!l(t._locale)){e._locale=t._locale}if(0e){return Math.ceil(e)||0}else{return Math.floor(e)}}function D(e){var t=+e,a=0;if(0!=t&&isFinite(t)){a=w(t)}return a}function C(e,t,a){var o=Math.min(e.length,t.length),n=Math.abs(e.length-t.length),l=0,s;for(s=0;so;++o){l=p([2e3,o]);this._shortMonthsParse[o]=this.monthsShort(l,"").toLocaleLowerCase();this._longMonthsParse[o]=this.months(l,"").toLocaleLowerCase()}}if(a){if("MMM"===t){n=ma.call(this._shortMonthsParse,s);return-1!==n?n:null}else{n=ma.call(this._longMonthsParse,s);return-1!==n?n:null}}else{if("MMM"===t){n=ma.call(this._shortMonthsParse,s);if(-1!==n){return n}n=ma.call(this._longMonthsParse,s);return-1!==n?n:null}else{n=ma.call(this._longMonthsParse,s);if(-1!==n){return n}n=ma.call(this._shortMonthsParse,s);return-1!==n?n:null}}}function oe(e,t){var a;if(!e.isValid()){return e}if("string"==typeof t){if(/^\d+$/.test(t)){t=D(t)}else{t=e.localeData().monthsParse(t);if(!s(t)){return e}}}a=Math.min(e.date(),te(e.year(),t));e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,a);return e}function ie(t){if(null!=t){oe(this,t);e.updateOffset(this,!0);return this}else{return H(this,"Month")}}function ne(){function e(e,t){return t.length-e.length}var t=[],a=[],o=[],n,l;for(n=0;12>n;n++){l=p([2e3,n]);t.push(this.monthsShort(l,""));a.push(this.months(l,""));o.push(this.months(l,""));o.push(this.monthsShort(l,""))}t.sort(e);a.sort(e);o.sort(e);for(n=0;12>n;n++){t[n]=J(t[n]);a[n]=J(a[n])}for(n=0;24>n;n++){o[n]=J(o[n])}this._monthsRegex=new RegExp("^("+o.join("|")+")","i");this._monthsShortRegex=this._monthsRegex;this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i");this._monthsShortStrictRegex=new RegExp("^("+t.join("|")+")","i")}N("Y",0,0,function(){var e=this.year();return 9999>=e?""+e:"+"+e});N(0,["YY",2],0,function(){return this.year()%100});N(0,["YYYY",4],0,"year");N(0,["YYYYY",5],0,"year");N(0,["YYYYYY",6,!0],0,"year");R("year","y");W("year",1);X("Y",ea);X("YY",Gt,Nt);X("YYYY",Jt,jt);X("YYYYY",Qt,qt);X("YYYYYY",Qt,qt);Q(["YYYYY","YYYYYY"],0);Q("YYYY",function(t,a){a[0]=2===t.length?e.parseTwoDigitYear(t):D(t)});Q("YY",function(t,a){a[0]=e.parseTwoDigitYear(t)});Q("Y",function(e,t){t[0]=parseInt(e,10)});function re(e){return le(e)?366:365}function le(e){return 0==e%4&&0!=e%100||0==e%400}e.parseTwoDigitYear=function(e){return D(e)+(68e&&0<=e&&isFinite(s.getFullYear())){s.setFullYear(e)}return s}function de(e){var t=new Date(Date.UTC.apply(null,arguments));if(100>e&&0<=e&&isFinite(t.getUTCFullYear())){t.setUTCFullYear(e)}return t}function ce(e,t,a){var o=7+t-a,i=(7+de(e,0,o).getUTCDay()-t)%7;return-i+o-1}function he(e,t,a,o,i){var n=ce(e,o,i),l=1+7*(t-1)+(7+a-o)%7+n,s,d;if(0>=l){s=e-1;d=re(s)+l}else if(l>re(e)){s=e+1;d=l-re(e)}else{s=e;d=l}return{year:s,dayOfYear:d}}function ue(e,t,a){var o=ce(e.year(),t,a),i=Math.floor((e.dayOfYear()-o-1)/7)+1,n,l;if(1>i){l=e.year()-1;n=i+ge(l,t,a)}else if(i>ge(e.year(),t,a)){n=i-ge(e.year(),t,a);l=e.year()+1}else{l=e.year();n=i}return{week:n,year:l}}function ge(e,t,a){var o=ce(e,t,a),i=ce(e+1,t,a);return(re(e)-o+i)/7}N("w",["ww",2],"wo","week");N("W",["WW",2],"Wo","isoWeek");R("week","w");R("isoWeek","W");W("week",5);W("isoWeek",5);X("w",Gt);X("ww",Gt,Nt);X("W",Gt);X("WW",Gt,Nt);$(["w","ww","W","WW"],function(e,t,a,o){t[o.substr(0,1)]=D(e)});N("d",0,"do","day");N("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});N("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});N("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});N("e",0,0,"weekday");N("E",0,0,"isoWeekday");R("day","d");R("weekday","e");R("isoWeekday","E");W("day",11);W("weekday",11);W("isoWeekday",11);X("d",Gt);X("e",Gt);X("E",Gt);X("dd",function(e,t){return t.weekdaysMinRegex(e)});X("ddd",function(e,t){return t.weekdaysShortRegex(e)});X("dddd",function(e,t){return t.weekdaysRegex(e)});$(["dd","ddd","dddd"],function(e,t,a,o){var i=a._locale.weekdaysParse(e,o,a._strict);if(null!=i){t.d=i}else{y(a).invalidWeekday=e}});$(["d","e","E"],function(e,t,a,o){t[o]=D(e)});function me(e,t){if("string"!=typeof e){return e}if(!isNaN(e)){return parseInt(e,10)}e=t.weekdaysParse(e);if("number"==typeof e){return e}return null}function pe(e,t){if("string"==typeof e){return t.weekdaysParse(e)%7||7}return isNaN(e)?null:e}function fe(e,t,a){var o,n,l,s=e.toLocaleLowerCase();if(!this._weekdaysParse){this._weekdaysParse=[];this._shortWeekdaysParse=[];this._minWeekdaysParse=[];for(o=0;7>o;++o){l=p([2e3,1]).day(o);this._minWeekdaysParse[o]=this.weekdaysMin(l,"").toLocaleLowerCase();this._shortWeekdaysParse[o]=this.weekdaysShort(l,"").toLocaleLowerCase();this._weekdaysParse[o]=this.weekdays(l,"").toLocaleLowerCase()}}if(a){if("dddd"===t){n=ma.call(this._weekdaysParse,s);return-1!==n?n:null}else if("ddd"===t){n=ma.call(this._shortWeekdaysParse,s);return-1!==n?n:null}else{n=ma.call(this._minWeekdaysParse,s);return-1!==n?n:null}}else{if("dddd"===t){n=ma.call(this._weekdaysParse,s);if(-1!==n){return n}n=ma.call(this._shortWeekdaysParse,s);if(-1!==n){return n}n=ma.call(this._minWeekdaysParse,s);return-1!==n?n:null}else if("ddd"===t){n=ma.call(this._shortWeekdaysParse,s);if(-1!==n){return n}n=ma.call(this._weekdaysParse,s);if(-1!==n){return n}n=ma.call(this._minWeekdaysParse,s);return-1!==n?n:null}else{n=ma.call(this._minWeekdaysParse,s);if(-1!==n){return n}n=ma.call(this._weekdaysParse,s);if(-1!==n){return n}n=ma.call(this._shortWeekdaysParse,s);return-1!==n?n:null}}}function ye(){function e(e,t){return t.length-e.length}var t=[],a=[],o=[],n=[],l,s,d,c,h;for(l=0;7>l;l++){s=p([2e3,1]).day(l);d=this.weekdaysMin(s,"");c=this.weekdaysShort(s,"");h=this.weekdays(s,"");t.push(d);a.push(c);o.push(h);n.push(d);n.push(c);n.push(h)}t.sort(e);a.sort(e);o.sort(e);n.sort(e);for(l=0;7>l;l++){a[l]=J(a[l]);o[l]=J(o[l]);n[l]=J(n[l])}this._weekdaysRegex=new RegExp("^("+n.join("|")+")","i");this._weekdaysShortRegex=this._weekdaysRegex;this._weekdaysMinRegex=this._weekdaysRegex;this._weekdaysStrictRegex=new RegExp("^("+o.join("|")+")","i");this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i");this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function be(){return this.hours()%12||12}N("H",["HH",2],0,"hour");N("h",["hh",2],0,be);N("k",["kk",2],0,function(){return this.hours()||24});N("hmm",0,0,function(){return""+be.apply(this)+V(this.minutes(),2)});N("hmmss",0,0,function(){return""+be.apply(this)+V(this.minutes(),2)+V(this.seconds(),2)});N("Hmm",0,0,function(){return""+this.hours()+V(this.minutes(),2)});N("Hmmss",0,0,function(){return""+this.hours()+V(this.minutes(),2)+V(this.seconds(),2)});function xe(e,t){N(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}xe("a",!0);xe("A",!1);R("hour","h");W("hour",13);function ke(e,t){return t._meridiemParse}X("a",ke);X("A",ke);X("H",Gt);X("h",Gt);X("k",Gt);X("HH",Gt,Nt);X("hh",Gt,Nt);X("kk",Gt,Nt);X("hmm",Xt);X("hmmss",Zt);X("Hmm",Xt);X("Hmmss",Zt);Q(["H","HH"],da);Q(["k","kk"],function(e,t){var a=D(e);t[da]=24===a?0:a});Q(["a","A"],function(e,t,a){a._isPm=a._locale.isPM(e);a._meridiem=e});Q(["h","hh"],function(e,t,a){t[da]=D(e);y(a).bigHour=!0});Q("hmm",function(e,t,a){var o=e.length-2;t[da]=D(e.substr(0,o));t[ca]=D(e.substr(o));y(a).bigHour=!0});Q("hmmss",function(e,t,a){var o=e.length-4,i=e.length-2;t[da]=D(e.substr(0,o));t[ca]=D(e.substr(o,2));t[ha]=D(e.substr(i));y(a).bigHour=!0});Q("Hmm",function(e,t){var a=e.length-2;t[da]=D(e.substr(0,a));t[ca]=D(e.substr(a))});Q("Hmmss",function(e,t){var a=e.length-4,o=e.length-2;t[da]=D(e.substr(0,a));t[ca]=D(e.substr(a,2));t[ha]=D(e.substr(o))});var ya=/[ap]\.?m?\.?/i;var ba=z("Hours",!0),xa={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:Lt,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],week:{dow:0,doy:6},weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],meridiemParse:ya},ka={},_a={},va;function _e(e){return e?e.toLowerCase().replace("_","-"):e}function ve(e){var t=0,a,o,n,l;while(t=a&&C(l,o,!0)>=a-1){break}a--}t++}return null}function Se(e){var o=null;if(!ka[e]&&"undefined"!=typeof a&&a&&a.exports){try{o=va._abbr;t("./locale/"+e);we(o)}catch(t){}}return ka[e]}function we(e,t){var a;if(e){if(l(t)){a=Ce(e)}else{a=De(e,t)}if(a){va=a}}return va._abbr}function De(e,t){if(null!==t){var a=xa;t.abbr=e;if(null!=ka[e]){O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.");a=ka[e]._config}else if(null!=t.parentLocale){if(null!=ka[t.parentLocale]){a=ka[t.parentLocale]._config}else{if(!_a[t.parentLocale]){_a[t.parentLocale]=[]}_a[t.parentLocale].push({name:e,config:t});return null}}ka[e]=new M(A(a,t));if(_a[e]){_a[e].forEach(function(e){De(e.name,e.config)})}we(e);return ka[e]}else{delete ka[e];return null}}function Ce(e){var t;if(e&&e._locale&&e._locale._abbr){e=e._locale._abbr}if(!e){return va}if(!o(e)){t=Se(e);if(t){return t}e=[e]}return ve(e)}function Pe(e){var t,o=e._a;if(o&&-2===y(e).overflow){t=0>o[la]||11o[sa]||o[sa]>te(o[0],o[la])?sa:0>o[da]||24o[ca]||59o[ha]||59o[ua]||999sa)){t=sa}if(y(e)._overflowWeeks&&-1===t){t=7}if(y(e)._overflowWeekday&&-1===t){t=8}y(e).overflow=t}return e}var Sa=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,wa=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Da=/Z|[+-]\d\d(?::?\d\d)?/,Ca=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Pa=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Ta=/^\/?Date\((\-?\d+)/i;function Te(e){var t,a,o=e._i,n=Sa.exec(o)||wa.exec(o),s,d,c,h;if(n){y(e).iso=!0;for(t=0,a=Ca.length;tc?" -":" +")+(""+c).replace(/^-?/,"0").match(/..$/)[0]+"00"}break;case 4:d=s[a[5]];break;default:d=s[" GMT"];}a[5]=d;e._i=a.splice(1).join("");l=" ZZ";e._f=o+i+n+l;Le(e);y(e).rfc2822=!0}else{e._isValid=!1}}function Ie(t){var a=Ta.exec(t._i);if(null!==a){t._d=new Date(+a[1]);return}Te(t);if(!1===t._isValid){delete t._isValid}else{return}Oe(t);if(!1===t._isValid){delete t._isValid}else{return}e.createFromInputFallback(t)}e.createFromInputFallback=T("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))});function Ae(e,t,a){if(null!=e){return e}if(null!=t){return t}return a}function Me(t){var a=new Date(e.now());if(t._useUTC){return[a.getUTCFullYear(),a.getUTCMonth(),a.getUTCDate()]}return[a.getFullYear(),a.getMonth(),a.getDate()]}function Re(e){var t,a,o=[],n,l;if(e._d){return}n=Me(e);if(e._w&&null==e._a[sa]&&null==e._a[la]){Fe(e)}if(null!=e._dayOfYear){l=Ae(e._a[0],n[0]);if(e._dayOfYear>re(l)||0===e._dayOfYear){y(e)._overflowDayOfYear=!0}a=de(l,0,e._dayOfYear);e._a[la]=a.getUTCMonth();e._a[sa]=a.getUTCDate()}for(t=0;3>t&&null==e._a[t];++t){e._a[t]=o[t]=n[t]}for(;7>t;t++){e._a[t]=o[t]=null==e._a[t]?2===t?1:0:e._a[t]}if(24===e._a[da]&&0===e._a[ca]&&0===e._a[ha]&&0===e._a[ua]){e._nextDay=!0;e._a[da]=0}e._d=(e._useUTC?de:se).apply(null,o);if(null!=e._tzm){e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm)}if(e._nextDay){e._a[da]=24}}function Fe(e){var t,a,o,i,n,l,s,d;t=e._w;if(null!=t.GG||null!=t.W||null!=t.E){n=1;l=4;a=Ae(t.GG,e._a[0],ue(Ne(),1,4).year);o=Ae(t.W,1);i=Ae(t.E,1);if(1>i||7i||6t.e||6o||o>ge(a,n,l)){y(e)._overflowWeeks=!0}else if(null!=d){y(e)._overflowWeekday=!0}else{s=he(a,o,i,n,l);e._a[0]=s.year;e._dayOfYear=s.dayOfYear}}e.ISO_8601=function(){};e.RFC_2822=function(){};function Le(t){if(t._f===e.ISO_8601){Te(t);return}if(t._f===e.RFC_2822){Oe(t);return}t._a=[];y(t).empty=!0;var a=""+t._i,o,n,l,s,d,c=a.length,h=0;l=G(t._f,t._locale).match(zt)||[];for(o=0;o=t._a[da]&&!0===y(t).bigHour&&0t){t+=12}if(!o&&12===t){t=0}return t}else{return t}}function Ye(e){var t,a,o,n,l;if(0===e._f.length){y(e).invalidFormat=!0;e._d=new Date(NaN);return}for(n=0;nthis?this:e}else{return k()}});function Ue(e,t){var a,n;if(1===t.length&&o(t[0])){t=t[0]}if(!t.length){return Ne()}a=t[0];for(n=1;ne){return-1*Math.round(-1*e)}else{return Math.round(e)}}function Ze(e,t){N(e,0,0,function(){var e=this.utcOffset(),a="+";if(0>e){e=-e;a="-"}return a+V(~~(e/60),2)+t+V(~~e%60,2)})}Ze("Z",":");Ze("ZZ","");X("Z",aa);X("ZZ",aa);Q(["Z","ZZ"],function(e,t,a){a._useUTC=!0;a._tzm=Ke(aa,e)});var Ra=/([\+\-]|\d\d)/gi;function Ke(e,t){var a=(t||"").match(e);if(null===a){return null}var o=a[a.length-1]||[],i=(o+"").match(Ra)||["-",0,0],n=+(60*i[1])+D(i[2]);return 0===n?0:"+"===i[0]?n:-n}function Je(t,a){var o,i;if(a._isUTC){o=a.clone();i=(S(t)||d(t)?t.valueOf():Ne(t).valueOf())-o.valueOf();o._d.setTime(o._d.valueOf()+i);e.updateOffset(o,!1);return o}else{return Ne(t).local()}}function Qe(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}e.updateOffset=function(){};function $e(){return this.isValid()?this._isUTC&&0===this._offset:!1}var Fa=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,La=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;function et(e,t){var a=e,o=null,i,n,l;if(Ge(e)){a={ms:e._milliseconds,d:e._days,M:e._months}}else if(s(e)){a={};if(t){a[t]=e}else{a.milliseconds=e}}else if(!!(o=Fa.exec(e))){i="-"===o[1]?-1:1;a={y:0,d:D(o[sa])*i,h:D(o[da])*i,m:D(o[ca])*i,s:D(o[ha])*i,ms:D(Xe(1e3*o[ua]))*i}}else if(!!(o=La.exec(e))){i="-"===o[1]?-1:1;a={y:tt(o[2],i),M:tt(o[3],i),w:tt(o[4],i),d:tt(o[5],i),h:tt(o[6],i),m:tt(o[7],i),s:tt(o[8],i)}}else if(null==a){a={}}else if("object"===_typeof(a)&&("from"in a||"to"in a)){l=ot(Ne(a.from),Ne(a.to));a={};a.ms=l.milliseconds;a.M=l.months}n=new qe(a);if(Ge(e)&&h(e,"_locale")){n._locale=e._locale}return n}et.fn=qe.prototype;et.invalid=function(){return et(NaN)};function tt(e,t){var a=e&&parseFloat(e.replace(",","."));return(isNaN(a)?0:a)*t}function at(e,t){var a={milliseconds:0,months:0,months:t.month()-e.month()+12*(t.year()-e.year())};if(e.clone().add(a.months,"M").isAfter(t)){--a.months}a.milliseconds=+t-+e.clone().add(a.months,"M");return a}function ot(e,t){var a;if(!(e.isValid()&&t.isValid())){return{milliseconds:0,months:0}}t=Je(t,e);if(e.isBefore(t)){a=at(e,t)}else{a=at(t,e);a.milliseconds=-a.milliseconds;a.months=-a.months}return a}function it(e,t){return function(a,o){var i,n;if(null!==o&&!isNaN(+o)){O(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.");n=a;a=o;o=n}a="string"==typeof a?+a:a;i=et(a,o);nt(this,i,e);return this}}function nt(t,a,o,i){var n=a._milliseconds,l=Xe(a._days),s=Xe(a._months);if(!t.isValid()){return}i=null==i?!0:i;if(n){t._d.setTime(t._d.valueOf()+n*o)}if(l){B(t,"Date",H(t,"Date")+l*o)}if(s){oe(t,H(t,"Month")+s*o)}if(i){e.updateOffset(t,l||s)}}var Wa=it(1,"add"),Ya=it(-1,"subtract");function rt(e,t){var a=12*(t.year()-e.year())+(t.month()-e.month()),o=e.clone().add(a,"months"),i,n;if(0>t-o){i=e.clone().add(a-1,"months");n=(t-o)/(o-i)}else{i=e.clone().add(a+1,"months");n=(t-o)/(i-o)}return-(a+n)||0}e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";function lt(e){var t;if(e===void 0){return this._locale._abbr}else{t=Ce(e);if(null!=t){this._locale=t}return this}}var za=T("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){if(e===void 0){return this.localeData()}else{return this.locale(e)}});function st(){return this._locale}N(0,["gg",2],0,function(){return this.weekYear()%100});N(0,["GG",2],0,function(){return this.isoWeekYear()%100});function dt(e,t){N(0,[e,e.length],0,t)}dt("gggg","weekYear");dt("ggggg","weekYear");dt("GGGG","isoWeekYear");dt("GGGGG","isoWeekYear");R("weekYear","gg");R("isoWeekYear","GG");W("weekYear",1);W("isoWeekYear",1);X("G",ea);X("g",ea);X("GG",Gt,Nt);X("gg",Gt,Nt);X("GGGG",Jt,jt);X("gggg",Jt,jt);X("GGGGG",Qt,qt);X("ggggg",Qt,qt);$(["gggg","ggggg","GGGG","GGGGG"],function(e,t,a,o){t[o.substr(0,2)]=D(e)});$(["gg","GG"],function(t,a,o,i){a[i]=e.parseTwoDigitYear(t)});function ct(e,t,a,o,i){var n;if(null==e){return ue(this,o,i).year}else{n=ge(e,o,i);if(t>n){t=n}return ht.call(this,e,t,a,o,i)}}function ht(e,t,a,o,i){var n=he(e,t,a,o,i),l=de(n.year,0,n.dayOfYear);this.year(l.getUTCFullYear());this.month(l.getUTCMonth());this.date(l.getUTCDate());return this}N("Q",0,"Qo","quarter");R("quarter","Q");W("quarter",7);X("Q",Vt);Q("Q",function(e,t){t[la]=3*(D(e)-1)});N("D",["DD",2],"Do","date");R("date","D");W("date",9);X("D",Gt);X("DD",Gt,Nt);X("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});Q(["D","DD"],sa);Q("Do",function(e,t){t[sa]=D(e.match(Gt)[0],10)});var Ha=z("Date",!0);N("DDD",["DDDD",3],"DDDo","dayOfYear");R("dayOfYear","DDD");W("dayOfYear",4);X("DDD",Kt);X("DDDD",Ut);Q(["DDD","DDDD"],function(e,t,a){a._dayOfYear=D(e)});N("m",["mm",2],0,"minute");R("minute","m");W("minute",14);X("m",Gt);X("mm",Gt,Nt);Q(["m","mm"],ca);var Ba=z("Minutes",!1);N("s",["ss",2],0,"second");R("second","s");W("second",15);X("s",Gt);X("ss",Gt,Nt);Q(["s","ss"],ha);var Ea=z("Seconds",!1);N("S",0,0,function(){return~~(this.millisecond()/100)});N(0,["SS",2],0,function(){return~~(this.millisecond()/10)});N(0,["SSS",3],0,"millisecond");N(0,["SSSS",4],0,function(){return 10*this.millisecond()});N(0,["SSSSS",5],0,function(){return 100*this.millisecond()});N(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()});N(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()});N(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()});N(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()});R("millisecond","ms");W("millisecond",16);X("S",Kt,Vt);X("SS",Kt,Nt);X("SSS",Kt,Ut);var Va;for(Va="SSSS";9>=Va.length;Va+="S"){X(Va,$t)}function ut(e,t){t[ua]=D(1e3*("0."+e))}for(Va="S";9>=Va.length;Va+="S"){Q(Va,ut)}var Na=z("Milliseconds",!1);N("z",0,0,"zoneAbbr");N("zz",0,0,"zoneName");var Ua=v.prototype;Ua.add=Wa;Ua.calendar=function(t,a){var o=t||Ne(),i=Je(o,this).startOf("day"),n=e.calendarFormat(this,i)||"sameElse",l=a&&(I(a[n])?a[n].call(this,o):a[n]);return this.format(l||this.localeData().calendar(n,this,Ne(o)))};Ua.clone=function(){return new v(this)};Ua.diff=function(e,t,a){var o,i,n,l;if(!this.isValid()){return NaN}o=Je(e,this);if(!o.isValid()){return NaN}i=6e4*(o.utcOffset()-this.utcOffset());t=F(t);if("year"===t||"month"===t||"quarter"===t){l=rt(this,o);if("quarter"===t){l=l/3}else if("year"===t){l=l/12}}else{n=this-o;l="second"===t?n/1e3:"minute"===t?n/6e4:"hour"===t?n/36e5:"day"===t?(n-i)/864e5:"week"===t?(n-i)/6048e5:n}return a?l:w(l)};Ua.endOf=function(e){e=F(e);if(e===void 0||"millisecond"===e){return this}if("date"===e){e="day"}return this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms")};Ua.format=function(t){if(!t){t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat}var a=q(this,t);return this.localeData().postformat(a)};Ua.from=function(e,t){if(this.isValid()&&(S(e)&&e.isValid()||Ne(e).isValid())){return et({to:this,from:e}).locale(this.locale()).humanize(!t)}else{return this.localeData().invalidDate()}};Ua.fromNow=function(e){return this.from(Ne(),e)};Ua.to=function(e,t){if(this.isValid()&&(S(e)&&e.isValid()||Ne(e).isValid())){return et({from:this,to:e}).locale(this.locale()).humanize(!t)}else{return this.localeData().invalidDate()}};Ua.toNow=function(e){return this.to(Ne(),e)};Ua.get=function(e){e=F(e);if(I(this[e])){return this[e]()}return this};Ua.invalidAt=function(){return y(this).overflow};Ua.isAfter=function(e,t){var a=S(e)?e:Ne(e);if(!(this.isValid()&&a.isValid())){return!1}t=F(!l(t)?t:"millisecond");if("millisecond"===t){return this.valueOf()>a.valueOf()}else{return a.valueOf()e.year()||9999=this.year()?"YYYY":"YYYYYY",i=t+"[\")]";return this.format(a+o+"-MM-DD[T]HH:mm:ss.SSS"+i)};Ua.toJSON=function(){return this.isValid()?this.toISOString():null};Ua.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")};Ua.unix=function(){return Math.floor(this.valueOf()/1e3)};Ua.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)};Ua.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}};Ua.year=fa;Ua.isLeapYear=function(){return le(this.year())};Ua.weekYear=function(e){return ct.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)};Ua.isoWeekYear=function(e){return ct.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)};Ua.quarter=Ua.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)};Ua.month=ie;Ua.daysInMonth=function(){return te(this.year(),this.month())};Ua.week=Ua.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")};Ua.isoWeek=Ua.isoWeeks=function(e){var t=ue(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")};Ua.weeksInYear=function(){var e=this.localeData()._week;return ge(this.year(),e.dow,e.doy)};Ua.isoWeeksInYear=function(){return ge(this.year(),1,4)};Ua.date=Ha;Ua.day=Ua.days=function(e){if(!this.isValid()){return null!=e?this:NaN}var t=this._isUTC?this._d.getUTCDay():this._d.getDay();if(null!=e){e=me(e,this.localeData());return this.add(e-t,"d")}else{return t}};Ua.weekday=function(e){if(!this.isValid()){return null!=e?this:NaN}var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")};Ua.isoWeekday=function(e){if(!this.isValid()){return null!=e?this:NaN}if(null!=e){var t=pe(e,this.localeData());return this.day(this.day()%7?t:t-7)}else{return this.day()||7}};Ua.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")};Ua.hour=Ua.hours=ba;Ua.minute=Ua.minutes=Ba;Ua.second=Ua.seconds=Ea;Ua.millisecond=Ua.milliseconds=Na;Ua.utcOffset=function(t,a,o){var i=this._offset||0,n;if(!this.isValid()){return null!=t?this:NaN}if(null!=t){if("string"==typeof t){t=Ke(aa,t);if(null===t){return this}}else if(16>Math.abs(t)&&!o){t=60*t}if(!this._isUTC&&a){n=Qe(this)}this._offset=t;this._isUTC=!0;if(null!=n){this.add(n,"m")}if(i!==t){if(!a||this._changeInProgress){nt(this,et(t-i,"m"),1,!1)}else if(!this._changeInProgress){this._changeInProgress=!0;e.updateOffset(this,!0);this._changeInProgress=null}}return this}else{return this._isUTC?i:Qe(this)}};Ua.utc=function(e){return this.utcOffset(0,e)};Ua.local=function(e){if(this._isUTC){this.utcOffset(0,e);this._isUTC=!1;if(e){this.subtract(Qe(this),"m")}}return this};Ua.parseZone=function(){if(null!=this._tzm){this.utcOffset(this._tzm,!1,!0)}else if("string"==typeof this._i){var e=Ke(ta,this._i);if(null!=e){this.utcOffset(e)}else{this.utcOffset(0,!0)}}return this};Ua.hasAlignedHourOffset=function(e){if(!this.isValid()){return!1}e=e?Ne(e).utcOffset():0;return 0==(this.utcOffset()-e)%60};Ua.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()};Ua.isLocal=function(){return this.isValid()?!this._isUTC:!1};Ua.isUtcOffset=function(){return this.isValid()?this._isUTC:!1};Ua.isUtc=$e;Ua.isUTC=$e;Ua.zoneAbbr=function(){return this._isUTC?"UTC":""};Ua.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""};Ua.dates=T("dates accessor is deprecated. Use date instead.",Ha);Ua.months=T("months accessor is deprecated. Use month instead",ie);Ua.years=T("years accessor is deprecated. Use year instead",fa);Ua.zone=T("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){if(null!=e){if("string"!=typeof e){e=-e}this.utcOffset(e,t);return this}else{return-this.utcOffset()}});Ua.isDSTShifted=T("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted)){return this._isDSTShifted}var e={};_(e,this);e=Be(e);if(e._a){var t=e._isUTC?p(e._a):Ne(e._a);this._isDSTShifted=this.isValid()&&0o;o++){n=p([2e3,o]);if(a&&!this._longMonthsParse[o]){this._longMonthsParse[o]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i");this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")}if(!a&&!this._monthsParse[o]){l="^"+this.months(n,"")+"|^"+this.monthsShort(n,"");this._monthsParse[o]=new RegExp(l.replace(".",""),"i")}if(a&&"MMMM"===t&&this._longMonthsParse[o].test(e)){return o}else if(a&&"MMM"===t&&this._shortMonthsParse[o].test(e)){return o}else if(!a&&this._monthsParse[o].test(e)){return o}}};ja.monthsRegex=function(e){if(this._monthsParseExact){if(!h(this,"_monthsRegex")){ne.call(this)}if(e){return this._monthsStrictRegex}else{return this._monthsRegex}}else{if(!h(this,"_monthsRegex")){this._monthsRegex=ia}return this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex}};ja.monthsShortRegex=function(e){if(this._monthsParseExact){if(!h(this,"_monthsRegex")){ne.call(this)}if(e){return this._monthsShortStrictRegex}else{return this._monthsShortRegex}}else{if(!h(this,"_monthsShortRegex")){this._monthsShortRegex=ia}return this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex}};ja.week=function(e){return ue(e,this._week.dow,this._week.doy).week};ja.firstDayOfYear=function(){return this._week.doy};ja.firstDayOfWeek=function(){return this._week.dow};ja.weekdays=function(e,t){if(!e){return o(this._weekdays)?this._weekdays:this._weekdays.standalone}return o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]};ja.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin};ja.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort};ja.weekdaysParse=function(e,t,a){var o,n,l;if(this._weekdaysParseExact){return fe.call(this,e,t,a)}if(!this._weekdaysParse){this._weekdaysParse=[];this._minWeekdaysParse=[];this._shortWeekdaysParse=[];this._fullWeekdaysParse=[]}for(o=0;7>o;o++){n=p([2e3,1]).day(o);if(a&&!this._fullWeekdaysParse[o]){this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i");this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i");this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")}if(!this._weekdaysParse[o]){l="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,"");this._weekdaysParse[o]=new RegExp(l.replace(".",""),"i")}if(a&&"dddd"===t&&this._fullWeekdaysParse[o].test(e)){return o}else if(a&&"ddd"===t&&this._shortWeekdaysParse[o].test(e)){return o}else if(a&&"dd"===t&&this._minWeekdaysParse[o].test(e)){return o}else if(!a&&this._weekdaysParse[o].test(e)){return o}}};ja.weekdaysRegex=function(e){if(this._weekdaysParseExact){if(!h(this,"_weekdaysRegex")){ye.call(this)}if(e){return this._weekdaysStrictRegex}else{return this._weekdaysRegex}}else{if(!h(this,"_weekdaysRegex")){this._weekdaysRegex=ia}return this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex}};ja.weekdaysShortRegex=function(e){if(this._weekdaysParseExact){if(!h(this,"_weekdaysRegex")){ye.call(this)}if(e){return this._weekdaysShortStrictRegex}else{return this._weekdaysShortRegex}}else{if(!h(this,"_weekdaysShortRegex")){this._weekdaysShortRegex=ia}return this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}};ja.weekdaysMinRegex=function(e){if(this._weekdaysParseExact){if(!h(this,"_weekdaysRegex")){ye.call(this)}if(e){return this._weekdaysMinStrictRegex}else{return this._weekdaysMinRegex}}else{if(!h(this,"_weekdaysMinRegex")){this._weekdaysMinRegex=ia}return this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}};ja.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)};ja.meridiem=function(e,t,a){if(11o;o++){n[o]=mt(e,o,a,"month")}return n}function ft(e,t,a,o){if("boolean"==typeof e){if(s(t)){a=t;t=void 0}t=t||""}else{t=e;a=t;e=!1;if(s(t)){a=t;t=void 0}t=t||""}var n=Ce(),l=e?n._week.dow:0;if(null!=a){return mt(t,(a+l)%7,o,"day")}var d,c=[];for(d=0;7>d;d++){c[d]=mt(t,(d+l)%7,o,"day")}return c}we("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function ordinal(e){var t=e%10,a=1===D(e%100/10)?"th":1==t?"st":2==t?"nd":3==t?"rd":"th";return e+a}});e.lang=T("moment.lang is deprecated. Use moment.locale instead.",we);e.langData=T("moment.langData is deprecated. Use moment.localeData instead.",Ce);var qa=Math.abs;function yt(e,t,a,o){var i=et(t,a);e._milliseconds+=o*i._milliseconds;e._days+=o*i._days;e._months+=o*i._months;return e._bubble()}function bt(e){if(0>e){return Math.floor(e)}else{return Math.ceil(e)}}function xt(e){return 4800*e/146097}function kt(e){return 146097*e/4800}function _t(e){return function(){return this.as(e)}}var Ga=_t("ms"),Xa=_t("s"),Za=_t("m"),Ka=_t("h"),Ja=_t("d"),Qa=_t("w"),$a=_t("M"),eo=_t("y");function vt(e){return function(){return this.isValid()?this._data[e]:NaN}}var to=vt("milliseconds"),ao=vt("seconds"),oo=vt("minutes"),io=vt("hours"),no=vt("days"),ro=vt("months"),lo=vt("years");var so=Math.round,co={ss:44,s:45,m:45,h:22,d:26,M:11};function St(e,t,a,o,i){return i.relativeTime(t||1,!!a,e,o)}function wt(e,t,o){var i=et(e).abs(),n=so(i.as("s")),l=so(i.as("m")),s=so(i.as("h")),d=so(i.as("d")),c=so(i.as("M")),h=so(i.as("y")),u=n<=co.ss&&["s",n]||n=l&&["m"]||l=s&&["h"]||s=d&&["d"]||d=c&&["M"]||c=h&&["y"]||["yy",h];u[2]=t;u[3]=0<+e;u[4]=o;return St.apply(null,u)}function Dt(e){if(e===void 0){return so}if("function"==typeof e){so=e;return!0}return!1}var ho=Math.abs;function Ct(){if(!this.isValid()){return this.localeData().invalidDate()}var e=ho(this._milliseconds)/1e3,t=ho(this._days),a=ho(this._months),o,i,n;o=w(e/60);i=w(o/60);e%=60;o%=60;n=w(a/12);a%=12;var l=n,d=a,c=t,u=i,h=o,m=e,s=this.asSeconds();if(!s){return"P0D"}return(0>s?"-":"")+"P"+(l?l+"Y":"")+(d?d+"M":"")+(c?c+"D":"")+(u||h||m?"T":"")+(u?u+"H":"")+(h?h+"M":"")+(m?m+"S":"")}var uo=qe.prototype;uo.isValid=function(){return this._isValid};uo.abs=function(){var e=this._data;this._milliseconds=qa(this._milliseconds);this._days=qa(this._days);this._months=qa(this._months);e.milliseconds=qa(e.milliseconds);e.seconds=qa(e.seconds);e.minutes=qa(e.minutes);e.hours=qa(e.hours);e.months=qa(e.months);e.years=qa(e.years);return this};uo.add=function(e,t){return yt(this,e,t,1)};uo.subtract=function(e,t){return yt(this,e,t,-1)};uo.as=function(e){if(!this.isValid()){return NaN}var t,a,o=this._milliseconds;e=F(e);if("month"===e||"year"===e){t=this._days+o/864e5;a=this._months+xt(t);return"month"===e?a:a/12}else{t=this._days+Math.round(kt(this._months));switch(e){case"week":return t/7+o/6048e5;case"day":return t+o/864e5;case"hour":return 24*t+o/36e5;case"minute":return 1440*t+o/6e4;case"second":return 86400*t+o/1e3;case"millisecond":return Math.floor(864e5*t)+o;default:throw new Error("Unknown unit "+e);}}};uo.asMilliseconds=Ga;uo.asSeconds=Xa;uo.asMinutes=Za;uo.asHours=Ka;uo.asDays=Ja;uo.asWeeks=Qa;uo.asMonths=$a;uo.asYears=eo;uo.valueOf=function(){if(!this.isValid()){return NaN}return this._milliseconds+864e5*this._days+2592e6*(this._months%12)+31536e6*D(this._months/12)};uo._bubble=function(){var e=this._milliseconds,t=this._days,a=this._months,o=this._data,i,n,l,s,d;if(!(0<=e&&0<=t&&0<=a||0>=e&&0>=t&&0>=a)){e+=864e5*bt(kt(a)+t);t=0;a=0}o.milliseconds=e%1e3;i=w(e/1e3);o.seconds=i%60;n=w(i/60);o.minutes=n%60;l=w(n/60);o.hours=l%24;t+=w(l/24);d=w(xt(t));a+=d;t-=bt(kt(d));s=w(a/12);a%=12;o.days=t;o.months=a;o.years=s;return this};uo.get=function(e){e=F(e);return this.isValid()?this[e+"s"]():NaN};uo.milliseconds=to;uo.seconds=ao;uo.minutes=oo;uo.hours=io;uo.days=no;uo.weeks=function(){return w(this.days()/7)};uo.months=ro;uo.years=lo;uo.humanize=function(e){if(!this.isValid()){return this.localeData().invalidDate()}var t=this.localeData(),a=wt(this,!e,t);if(e){a=t.pastFuture(+this,a)}return t.postformat(a)};uo.toISOString=Ct;uo.toString=Ct;uo.toJSON=Ct;uo.locale=lt;uo.localeData=st;uo.toIsoString=T("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Ct);uo.lang=za;N("X",0,0,"unix");N("x",0,0,"valueOf");X("x",ea);X("X",oa);Q("X",function(e,t,a){a._d=new Date(1e3*parseFloat(e,10))});Q("x",function(e,t,a){a._d=new Date(D(e))});e.version="2.18.1";(function(e){Pt=e})(Ne);e.fn=Ua;e.min=function(){var e=[].slice.call(arguments,0);return Ue("isBefore",e)};e.max=function(){var e=[].slice.call(arguments,0);return Ue("isAfter",e)};e.now=function now(){return Date.now?Date.now():+new Date};e.utc=p;e.unix=function(e){return Ne(1e3*e)};e.months=function(e,t){return pt(e,t,"months")};e.isDate=d;e.locale=we;e.invalid=k;e.duration=et;e.isMoment=S;e.weekdays=function(e,t,a){return ft(e,t,a,"weekdays")};e.parseZone=function(){return Ne.apply(null,arguments).parseZone()};e.localeData=Ce;e.isDuration=Ge;e.monthsShort=function(e,t){return pt(e,t,"monthsShort")};e.weekdaysMin=function(e,t,a){return ft(e,t,a,"weekdaysMin")};e.defineLocale=De;e.updateLocale=function(e,t){if(null!=t){var a,o=xa;if(null!=ka[e]){o=ka[e]._config}t=A(o,t);a=new M(t);a.parentLocale=ka[e];ka[e]=a;we(e)}else{if(null!=ka[e]){if(null!=ka[e].parentLocale){ka[e]=ka[e].parentLocale}else if(null!=ka[e]){delete ka[e]}}}return ka[e]};e.locales=function(){return Ft(ka)};e.weekdaysShort=function(e,t,a){return ft(e,t,a,"weekdaysShort")};e.normalizeUnits=F;e.relativeTimeRounding=Dt;e.relativeTimeThreshold=function(e,t){if(co[e]===void 0){return!1}if(t===void 0){return co[e]}co[e]=t;if("s"===e){co.ss=t-1}return!0};e.calendarFormat=function(e,t){var a=e.diff(t,"days",!0);return-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse"};e.prototype=Ua;return e})},{}],7:[function(e,t){var a=e(29)();a.helpers=e(45);e(27)(a);a.defaults=e(25);a.Element=e(26);a.elements=e(40);a.Interaction=e(28);a.platform=e(48);e(31)(a);e(22)(a);e(23)(a);e(24)(a);e(30)(a);e(33)(a);e(32)(a);e(35)(a);e(54)(a);e(52)(a);e(53)(a);e(55)(a);e(56)(a);e(57)(a);e(15)(a);e(16)(a);e(17)(a);e(18)(a);e(19)(a);e(20)(a);e(21)(a);e(8)(a);e(9)(a);e(10)(a);e(11)(a);e(12)(a);e(13)(a);e(14)(a);var o=[e(49)(a),e(50)(a),e(51)(a)];a.plugins.register(o);a.platform.initialize();t.exports=a;if("undefined"!=typeof window){window.Chart=a}a.canvasHelpers=a.helpers.canvas},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,35:35,40:40,45:45,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,8:8,9:9}],8:[function(e,t){'use strict';t.exports=function(e){e.Bar=function(t,a){a.type="bar";return new e(t,a)}}},{}],9:[function(e,t){'use strict';t.exports=function(e){e.Bubble=function(t,a){a.type="bubble";return new e(t,a)}}},{}],10:[function(e,t){'use strict';t.exports=function(e){e.Doughnut=function(t,a){a.type="doughnut";return new e(t,a)}}},{}],11:[function(e,t){'use strict';t.exports=function(e){e.Line=function(t,a){a.type="line";return new e(t,a)}}},{}],12:[function(e,t){'use strict';t.exports=function(e){e.PolarArea=function(t,a){a.type="polarArea";return new e(t,a)}}},{}],13:[function(e,t){'use strict';t.exports=function(e){e.Radar=function(t,a){a.type="radar";return new e(t,a)}}},{}],14:[function(e,t){'use strict';t.exports=function(e){e.Scatter=function(t,a){a.type="scatter";return new e(t,a)}}},{}],15:[function(e,t){'use strict';var a=e(25),o=e(40),n=e(45);a._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});a._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(e,t){var a="";if(0d&&0>f||0<=d&&0h?d-h:u-d;p=d"],a=e.data,o=a.datasets,n=a.labels;if(o.length){for(var l=0;l");if(n[l]){t.push(n[l])}t.push("")}}t.push("");return t.join("")},legend:{labels:{generateLabels:function generateLabels(e){var t=e.data;if(t.labels.length&&t.datasets.length){return t.labels.map(function(a,o){var i=e.getDatasetMeta(0),l=t.datasets[0],s=i.data[o],d=s&&s.custom||{},c=n.valueAtIndexOrDefault,h=e.options.elements.arc,u=d.backgroundColor?d.backgroundColor:c(l.backgroundColor,o,h.backgroundColor),m=d.borderColor?d.borderColor:c(l.borderColor,o,h.borderColor),p=d.borderWidth?d.borderWidth:c(l.borderWidth,o,h.borderWidth);return{text:a,fillStyle:u,strokeStyle:m,lineWidth:p,hidden:isNaN(l.data[o])||i.data[o].hidden,index:o}})}return[]}},onClick:function onClick(t,e){var a=e.index,o=this.chart,n,l,s;for(n=0,l=(o.data.datasets||[]).length;n=Math.PI?-1:f<-Math.PI?1:0);var y=f+p,x={x:Math.cos(f),y:Math.sin(f)},k={x:Math.cos(y),y:Math.sin(y)},_=0>=f&&0<=y||f<=2*Math.PI&&2*Math.PI<=y,v=f<=.5*Math.PI&&.5*Math.PI<=y||f<=2.5*Math.PI&&2.5*Math.PI<=y,S=f<=-Math.PI&&-Math.PI<=y||f<=Math.PI&&Math.PI<=y,w=f<=.5*-Math.PI&&.5*-Math.PI<=y||f<=1.5*Math.PI&&1.5*Math.PI<=y,D=m/100,C={x:S?-1:Math.min(x.x*(0>x.x?1:D),k.x*(0>k.x?1:D)),y:w?-1:Math.min(x.y*(0>x.y?1:D),k.y*(0>k.y?1:D))},P={x:_?1:Math.max(x.x*(0t?n:t;t=l>t?l:t}return t}})}},{25:25,40:40,45:45}],18:[function(e,t){'use strict';var a=e(25),o=e(40),n=e(45);a._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});t.exports=function(e){function t(e,t){return n.valueOrDefault(e.showLine,t.showLines)}e.controllers.line=e.DatasetController.extend({datasetElementType:o.Line,dataElementType:o.Point,update:function update(e){var a=this,o=a.getMeta(),l=o.dataset,s=o.data||[],d=a.chart.options,c=d.elements.line,h=a.getScaleForId(o.yAxisID),u,m,p,f=a.getDataset(),y=t(f,d);if(y){p=l.custom||{};if(f.tension!==void 0&&f.lineTension===void 0){f.lineTension=f.tension}l._scale=h;l._datasetIndex=a.index;l._children=s;l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:p.tension?p.tension:n.valueOrDefault(f.lineTension,c.tension),backgroundColor:p.backgroundColor?p.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:p.borderWidth?p.borderWidth:f.borderWidth||c.borderWidth,borderColor:p.borderColor?p.borderColor:f.borderColor||c.borderColor,borderCapStyle:p.borderCapStyle?p.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:p.borderDash?p.borderDash:f.borderDash||c.borderDash,borderDashOffset:p.borderDashOffset?p.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:p.borderJoinStyle?p.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:p.fill?p.fill:f.fill!==void 0?f.fill:c.fill,steppedLine:p.steppedLine?p.steppedLine:n.valueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:p.cubicInterpolationMode?p.cubicInterpolationMode:n.valueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)};l.pivot()}for(u=0,m=s.length;up){c+=p||0}else{d+=p||0}}}var f=+s.getRightValue(e);if(0>f){return s.getPixelForValue(c+f)}return s.getPixelForValue(d+f)}return s.getPixelForValue(e)},updateBezierControlPoints:function updateBezierControlPoints(){var t=this,a=t.getMeta(),o=t.chart.chartArea,l=a.data||[],s,d,c,h,u;if(a.dataset._model.spanGaps){l=l.filter(function(e){return!e._model.skip})}function e(e,t,a){return Math.max(Math.min(e,a),t)}if("monotone"===a.dataset._model.cubicInterpolationMode){n.splineCurveMonotone(l)}else{for(s=0,d=l.length;s"],a=e.data,o=a.datasets,n=a.labels;if(o.length){for(var l=0;l");if(n[l]){t.push(n[l])}t.push("")}}t.push("");return t.join("")},legend:{labels:{generateLabels:function generateLabels(e){var t=e.data;if(t.labels.length&&t.datasets.length){return t.labels.map(function(a,o){var i=e.getDatasetMeta(0),l=t.datasets[0],s=i.data[o],d=s.custom||{},c=n.valueAtIndexOrDefault,h=e.options.elements.arc,u=d.backgroundColor?d.backgroundColor:c(l.backgroundColor,o,h.backgroundColor),m=d.borderColor?d.borderColor:c(l.borderColor,o,h.borderColor),p=d.borderWidth?d.borderWidth:c(l.borderWidth,o,h.borderWidth);return{text:a,fillStyle:u,strokeStyle:m,lineWidth:p,hidden:isNaN(l.data[o])||i.data[o].hidden,index:o}})}return[]}},onClick:function onClick(t,e){var a=e.index,o=this.chart,n,l,s;for(n=0,l=(o.data.datasets||[]).length;n=a.numSteps){n.callback(a.onAnimationComplete,[a],o);o.animating=!1;t.splice(l,1)}else{++l}}}};Object.defineProperty(e.Animation.prototype,"animationObject",{get:function get(){return this}});Object.defineProperty(e.Animation.prototype,"chartInstance",{get:function get(){return this.chart},set:function set(e){this.chart=e}})}},{25:25,26:26,45:45}],23:[function(e,t){'use strict';var a=e(25),o=e(45),i=e(28),n=e(48);t.exports=function(e){var d=e.plugins;e.types={};e.instances={};e.controllers={};function t(e){e=e||{};var t=e.data=e.data||{};t.datasets=t.datasets||[];t.labels=t.labels||[];e.options=o.configMerge(a.global,a[e.type],e.options||{});return e}function l(e){var t=e.options;if(t.scale){e.scale.options=t.scale}else if(t.scales){t.scales.xAxes.concat(t.scales.yAxes).forEach(function(t){e.scales[t.id].options=t})}e.tooltip._options=t.tooltips}function s(e){return"top"===e||"bottom"===e}o.extend(e.prototype,{construct:function construct(a,i){var l=this;i=t(i);var s=n.acquireContext(a,i),d=s&&s.canvas,c=d&&d.height,h=d&&d.width;l.id=o.uid();l.ctx=s;l.canvas=d;l.config=i;l.width=h;l.height=c;l.aspectRatio=c?h/c:null;l.options=i.options;l._bufferedRender=!1;l.chart=l;l.controller=l;e.instances[l.id]=l;Object.defineProperty(l,"data",{get:function get(){return l.config.data},set:function set(e){l.config.data=e}});if(!s||!d){console.error("Failed to create chart: can't acquire context from the given item");return}l.initialize();l.update()},initialize:function initialize(){var e=this;d.notify(e,"beforeInit");o.retinaScale(e,e.options.devicePixelRatio);e.bindEvents();if(e.options.responsive){e.resize(!0)}e.ensureScalesHaveIDs();e.buildScales();e.initToolTip();d.notify(e,"afterInit");return e},clear:function clear(){o.canvas.clear(this);return this},stop:function stop(){e.animationService.cancelAnimation(this);return this},resize:function resize(e){var t=this,a=t.options,i=t.canvas,n=a.maintainAspectRatio&&t.aspectRatio||null,l=Math.max(0,Math.floor(o.getMaximumWidth(i))),s=Math.max(0,Math.floor(n?l/n:o.getMaximumHeight(i)));if(t.width===l&&t.height===s){return}i.width=t.width=l;i.height=t.height=s;i.style.width=l+"px";i.style.height=s+"px";o.retinaScale(t,a.devicePixelRatio);if(!e){var c={width:l,height:s};d.notify(t,"resize",[c]);if(t.options.onResize){t.options.onResize(t,c)}t.stop();t.update(t.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function ensureScalesHaveIDs(){var e=this.options,t=e.scales||{},a=e.scale;o.each(t.xAxes,function(e,t){e.id=e.id||"x-axis-"+t});o.each(t.yAxes,function(e,t){e.id=e.id||"y-axis-"+t});if(a){a.id=a.id||"scale"}},buildScales:function buildScales(){var t=this,a=t.options,i=t.scales={},n=[];if(a.scales){n=n.concat((a.scales.xAxes||[]).map(function(e){return{options:e,dtype:"category",dposition:"bottom"}}),(a.scales.yAxes||[]).map(function(e){return{options:e,dtype:"linear",dposition:"left"}}))}if(a.scale){n.push({options:a.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"})}o.each(n,function(a){var n=a.options,l=o.valueOrDefault(n.type,a.dtype),d=e.scaleService.getScaleConstructor(l);if(!d){return}if(s(n.position)!==s(a.dposition)){n.position=a.dposition}var c=new d({id:n.id,options:n,ctx:t.ctx,chart:t});i[c.id]=c;c.mergeTicksOptions();if(a.isDefault){t.scale=c}});e.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function buildOrUpdateControllers(){var t=this,a=[],i=[];o.each(t.data.datasets,function(o,n){var l=t.getDatasetMeta(n),s=o.type||t.config.type;if(l.type&&l.type!==s){t.destroyDatasetMeta(n);l=t.getDatasetMeta(n)}l.type=s;a.push(l.type);if(l.controller){l.controller.updateIndex(n)}else{var d=e.controllers[l.type];if(d===void 0){throw new Error("\""+l.type+"\" is not a chart type.")}l.controller=new d(t,n);i.push(l.controller)}},t);return i},resetElements:function resetElements(){var e=this;o.each(e.data.datasets,function(t,a){e.getDatasetMeta(a).controller.reset()},e)},reset:function reset(){this.resetElements();this.tooltip.initialize()},update:function update(e){var t=this;if(!e||"object"!==_typeof(e)){e={duration:e,lazy:arguments[1]}}l(t);if(!1===d.notify(t,"beforeUpdate")){return}t.tooltip._data=t.data;var a=t.buildOrUpdateControllers();o.each(t.data.datasets,function(e,a){t.getDatasetMeta(a).controller.buildOrUpdateElements()},t);t.updateLayout();o.each(a,function(e){e.reset()});t.updateDatasets();d.notify(t,"afterUpdate");if(t._bufferedRender){t._bufferedRequest={duration:e.duration,easing:e.easing,lazy:e.lazy}}else{t.render(e)}},updateLayout:function updateLayout(){var t=this;if(!1===d.notify(t,"beforeLayout")){return}e.layoutService.update(this,this.width,this.height);d.notify(t,"afterScaleUpdate");d.notify(t,"afterLayout")},updateDatasets:function updateDatasets(){var e=this;if(!1===d.notify(e,"beforeDatasetsUpdate")){return}for(var t=0,a=e.data.datasets.length;to){e.insertElements(o,i-o)}},insertElements:function insertElements(e,t){for(var a=0;a=a[t].length){a[t].push({})}if(!a[t][d].type||h.type&&h.type!==a[t][d].type){n.merge(a[t][d],[e.scaleService.getScaleDefaults(c),h])}else{n.merge(a[t][d],h)}}}else{n._merger(t,a,o,l)}}})};n.where=function(e,t){if(n.isArray(e)&&Array.prototype.filter){return e.filter(t)}var a=[];n.each(e,function(e){if(t(e)){a.push(e)}});return a};n.findIndex=Array.prototype.findIndex?function(e,t,a){return e.findIndex(t,a)}:function(e,t,a){a=a===void 0?e:a;for(var o=0,n=e.length;oe};n.max=function(e){return e.reduce(function(e,t){if(!isNaN(t)){return Math.max(e,t)}return e},Number.NEGATIVE_INFINITY)};n.min=function(e){return e.reduce(function(e,t){if(!isNaN(t)){return Math.min(e,t)}return e},Number.POSITIVE_INFINITY)};n.sign=Math.sign?function(e){return Math.sign(e)}:function(e){e=+e;if(0===e||isNaN(e)){return e}return 0=p){continue}m=3/Math.sqrt(p);s.mK=h*m*s.deltaK;d.mK=u*m*s.deltaK}var f;for(o=0;o=e.length-1?e[0]:e[t+1]}return t>=e.length-1?e[e.length-1]:e[t+1]};n.previousItem=function(e,t,a){if(a){return 0>=t?e[e.length-1]:e[t-1]}return 0>=t?e[0]:e[t-1]};n.niceNum=function(e,t){var a=Math.floor(n.log10(e)),o=e/Math.pow(10,a),i;if(t){if(1.5>o){i=1}else if(3>o){i=2}else if(7>o){i=5}else{i=10}}else if(1>=o){i=1}else if(2>=o){i=2}else if(5>=o){i=5}else{i=10}return i*Math.pow(10,a)};n.requestAnimFrame=function(){if("undefined"==typeof window){return function(e){e()}}return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){return window.setTimeout(e,1e3/60)}}();n.getRelativePosition=function(t,a){var o,i,l=t.originalEvent||t,e=t.currentTarget||t.srcElement,s=e.getBoundingClientRect(),d=l.touches;if(d&&0a.length){for(var h=0;ho){o=n}return o};n.numberOfLabelLines=function(e){var t=1;n.each(e,function(e){if(n.isArray(e)){if(e.length>t){t=e.length}}});return t};n.color=!a?function(e){console.error("Color.js not found!");return e}:function(e){if(e instanceof CanvasGradient){e=o.global.defaultColor}return a(e)};n.getHoverColor=function(e){return e instanceof CanvasPattern?e:n.color(e).saturate(.5).darken(.1).rgbString()}}},{2:2,25:25,45:45}],28:[function(e,t){'use strict';var d=e(45);function a(t,e){if(t.native){return{x:t.x,y:t.y}}return d.getRelativePosition(t,e)}function o(e,t){var a=e.data.datasets,o,n,l,s,d;for(n=0,s=a.length;np&&de.maxHeight){d--;break}d++;h=u*c}}e.labelRotation=d},afterCalculateTickRotation:function afterCalculateTickRotation(){l.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function beforeFit(){l.callback(this.options.beforeFit,[this])},fit:function fit(){var e=this,o=e.minSize={width:0,height:0},i=a(e._ticks),n=e.options,c=n.ticks,h=n.scaleLabel,u=n.gridLines,m=n.display,p=e.isHorizontal(),f=s(c),y=n.gridLines.tickMarkLength;if(p){o.width=e.isFullWidth()?e.maxWidth-e.margins.left-e.margins.right:e.maxWidth}else{o.width=m&&u.drawTicks?y:0}if(p){o.height=m&&u.drawTicks?y:0}else{o.height=e.maxHeight}if(h.display&&m){var x=d(h),k=l.options.toPadding(h.padding),_=x+k.height;if(p){o.height+=_}else{o.width+=_}}if(c.display&&m){var v=l.longestText(e.ctx,f.font,i,e.longestTextCache),S=l.numberOfLabelLines(i),w=.5*f.size,D=e.options.ticks.padding;if(p){e.longestLabelWidth=v;var C=l.toRadians(e.labelRotation),P=Math.cos(C),T=Math.sin(C),O=T*v+f.size*S+w*(S-1)+w;o.height=Math.min(e.maxHeight,o.height+O+D);e.ctx.font=f.font;var I=t(e.ctx,i[0],f.font),A=t(e.ctx,i[i.length-1],f.font);if(0!==e.labelRotation){e.paddingLeft="bottom"===n.position?P*I+3:P*w+3;e.paddingRight="bottom"===n.position?P*w+3:P*A+3}else{e.paddingLeft=I/2+3;e.paddingRight=A/2+3}}else{if(c.mirror){v=0}else{v+=D+w}o.width=Math.min(e.maxWidth,o.width+v);e.paddingTop=f.size/2;e.paddingBottom=f.size/2}}e.handleMargins();e.width=o.width;e.height=o.height},handleMargins:function handleMargins(){var e=this;if(e.margins){e.paddingLeft=Math.max(e.paddingLeft-e.margins.left,0);e.paddingTop=Math.max(e.paddingTop-e.margins.top,0);e.paddingRight=Math.max(e.paddingRight-e.margins.right,0);e.paddingBottom=Math.max(e.paddingBottom-e.margins.bottom,0)}},afterFit:function afterFit(){l.callback(this.options.afterFit,[this])},isHorizontal:function isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function isFullWidth(){return this.options.fullWidth},getRightValue:function getRightValue(e){if(l.isNullOrUndef(e)){return NaN}if("number"==typeof e&&!isFinite(e)){return NaN}if(e){if(this.isHorizontal()){if(e.x!==void 0){return this.getRightValue(e.x)}}else if(e.y!==void 0){return this.getRightValue(e.y)}}return e},getLabelForIndex:l.noop,getPixelForValue:l.noop,getValueForPixel:l.noop,getPixelForTick:function getPixelForTick(e){var t=this,a=t.options.offset;if(t.isHorizontal()){var o=t.width-(t.paddingLeft+t.paddingRight),i=o/Math.max(t._ticks.length-(a?0:1),1),n=i*e+t.paddingLeft;if(a){n+=i/2}var l=t.left+Math.round(n);l+=t.isFullWidth()?t.margins.left:0;return l}var s=t.height-(t.paddingTop+t.paddingBottom);return t.top+e*(s/(t._ticks.length-1))},getPixelForDecimal:function getPixelForDecimal(e){var t=this;if(t.isHorizontal()){var a=t.width-(t.paddingLeft+t.paddingRight),o=a*e+t.paddingLeft,i=t.left+Math.round(o);i+=t.isFullWidth()?t.margins.left:0;return i}return t.top+e*t.height},getBasePixel:function getBasePixel(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function getBaseValue(){var e=this,t=e.min,a=e.max;return e.beginAtZero?0:0>t&&0>a?a:0a.width-(a.paddingLeft+a.paddingRight)){t=1+Math.floor((h+n.autoSkipPadding)*s/(a.width-(a.paddingLeft+a.paddingRight)))}if(y&&s>y){t=Math.max(t,Math.floor(s/y))}}for(m=0;m=s;if(f&&m!==s-1||l.isNullOrUndef(p.label)){delete p.label}u.push(p)}return u},draw:function draw(e){var t=this,a=t.options;if(!a.display){return}var n=t.ctx,c=i.global,h=a.ticks.minor,u=a.ticks.major||h,m=a.gridLines,p=a.scaleLabel,f=0!==t.labelRotation,y=t.isHorizontal(),x=h.autoSkip?t._autoSkip(t.getTicks()):t.getTicks(),k=l.valueOrDefault(h.fontColor,c.defaultFontColor),_=s(h),v=l.valueOrDefault(u.fontColor,c.defaultFontColor),S=s(u),w=m.drawTicks?m.tickMarkLength:0,D=l.valueOrDefault(p.fontColor,c.defaultFontColor),C=s(p),P=l.options.toPadding(p.padding),T=l.toRadians(t.labelRotation),O=[],I="right"===a.position?t.left:t.right-w,A="right"===a.position?t.left+w:t.right,M="bottom"===a.position?t.top:t.bottom-w,R="bottom"===a.position?t.top+w:t.bottom;l.each(x,function(i,n){if(i.label===void 0){return}var s=i.label,d,u,p,k;if(n===t.zeroLineIndex&&a.offset===m.offsetGridLines){d=m.zeroLineWidth;u=m.zeroLineColor;p=m.zeroLineBorderDash;k=m.zeroLineBorderDashOffset}else{d=l.valueAtIndexOrDefault(m.lineWidth,n);u=l.valueAtIndexOrDefault(m.color,n);p=l.valueOrDefault(m.borderDash,c.borderDash);k=l.valueOrDefault(m.borderDashOffset,c.borderDashOffset)}var _,v,S,D,C,P,F,L,W,Y,z="middle",H="middle",B=h.padding;if(y){var E=w+B;if("bottom"===a.position){H=!f?"top":"middle";z=!f?"center":"right";Y=t.top+E}else{H=!f?"bottom":"middle";z=!f?"center":"left";Y=t.bottom-E}var V=o(t,n,m.offsetGridLines&&1o.height-t.height){l="bottom"}var s,d,c,h,u,m=(i.left+i.right)/2,p=(i.top+i.bottom)/2;if("center"===l){s=function(e){return e<=m};d=function(e){return e>m}}else{s=function(e){return e<=t.width/2};d=function(e){return e>=o.width-t.width/2}}c=function(e){return e+t.width>o.width};h=function(e){return 0>e-t.width};u=function(e){return e<=p?"top":"bottom"};if(s(a.x)){n="left";if(c(a.x)){n="center";l=u(a.y)}}else if(d(a.x)){n="right";if(h(a.x)){n="center";l=u(a.y)}}var f=e._options;return{xAlign:f.xAlign?f.xAlign:n,yAlign:f.yAlign?f.yAlign:l}}function h(e,t,a){var o=e.x,i=e.y,n=e.caretSize,l=e.caretPadding,s=e.cornerRadius,d=a.xAlign,c=a.yAlign,h=n+l,u=s+l;if("right"===d){o-=t.width}else if("center"===d){o-=t.width/2}if("top"===c){i+=h}else if("bottom"===c){i-=t.height+h}else{i-=t.height/2}if("center"===c){if("left"===d){o+=h}else if("right"===d){o-=h}}else if("left"===d){o-=u}else if("right"===d){o+=u}return{x:o,y:i}}e.Tooltip=o.extend({initialize:function initialize(){this._model=s(this._options)},getTitle:function getTitle(){var e=this,t=e._options,a=t.callbacks,o=a.beforeTitle.apply(e,arguments),n=a.title.apply(e,arguments),l=a.afterTitle.apply(e,arguments),s=[];s=i(s,o);s=i(s,n);s=i(s,l);return s},getBeforeBody:function getBeforeBody(){var e=this._options.callbacks.beforeBody.apply(this,arguments);return n.isArray(e)?e:e!==void 0?[e]:[]},getBody:function getBody(e,t){var a=this,o=a._options.callbacks,l=[];n.each(e,function(e){var n={before:[],lines:[],after:[]};i(n.before,o.beforeLabel.call(a,e,t));i(n.lines,o.label.call(a,e,t));i(n.after,o.afterLabel.call(a,e,t));l.push(n)});return l},getAfterBody:function getAfterBody(){var e=this._options.callbacks.afterBody.apply(this,arguments);return n.isArray(e)?e:e!==void 0?[e]:[]},getFooter:function getFooter(){var e=this,t=e._options.callbacks,a=t.beforeFooter.apply(e,arguments),o=t.footer.apply(e,arguments),n=t.afterFooter.apply(e,arguments),l=[];l=i(l,a);l=i(l,o);l=i(l,n);return l},update:function update(t){var a=this,o=a._options,u=a._model,m=a._model=s(o),p=a._active,f=a._data,y={xAlign:u.xAlign,yAlign:u.yAlign},x={x:u.x,y:u.y},k={width:u.width,height:u.height},_={x:u.caretX,y:u.caretY},v,S;if(p.length){m.opacity=1;var w=[],D=[];_=e.Tooltip.positioners[o.position](p,a._eventPosition);var C=[];for(v=0,S=p.length;vt.opacity)?0:t.opacity,n=t.title.length||t.beforeBody.length||t.body.length||t.afterBody.length||t.footer.length;if(this._options.enabled&&n){this.drawBackground(o,t,e,a,i);o.x+=t.xPadding;o.y+=t.yPadding;this.drawTitle(o,t,e,i);this.drawBody(o,t,e,i);this.drawFooter(o,t,e,i)}},handleEvent:function handleEvent(t){var e=this,a=e._options,o=!1;e._lastActive=e._lastActive||[];if("mouseout"===t.type){e._active=[]}else{e._active=e._chart.getElementsAtEventForMode(t,a.mode,a)}o=!n.arrayEquals(e._active,e._lastActive);if(!o){return!1}e._lastActive=e._active;if(a.enabled||a.custom){e._eventPosition={x:t.x,y:t.y};var i=e._model;e.update(!0);e.pivot();o|=i.x!==e._model.x||i.y!==e._model.y}return o}});e.Tooltip.positioners={average:function average(e){if(!e.length){return!1}var t,a,o=0,n=0,l=0;for(t=0,a=e.length;td){n-=2*Math.PI}while(n=s&&n<=d,h=l>=a.innerRadius&&l<=a.outerRadius;return c&&h}return!1},getCenterPoint:function getCenterPoint(){var e=this._view,t=(e.startAngle+e.endAngle)/2,a=(e.innerRadius+e.outerRadius)/2;return{x:e.x+Math.cos(t)*a,y:e.y+Math.sin(t)*a}},getArea:function getArea(){var e=this._view;return Math.PI*((e.endAngle-e.startAngle)/(2*Math.PI))*(Math.pow(e.outerRadius,2)-Math.pow(e.innerRadius,2))},tooltipPosition:function tooltipPosition(){var e=this._view,t=e.startAngle+(e.endAngle-e.startAngle)/2,a=(e.outerRadius-e.innerRadius)/2+e.innerRadius;return{x:e.x+Math.cos(t)*a,y:e.y+Math.sin(t)*a}},draw:function draw(){var e=this._chart.ctx,t=this._view,a=t.startAngle,o=t.endAngle;e.beginPath();e.arc(t.x,t.y,t.outerRadius,a,o);e.arc(t.x,t.y,t.innerRadius,o,a,!0);e.closePath();e.strokeStyle=t.borderColor;e.lineWidth=t.borderWidth;e.fillStyle=t.backgroundColor;e.fill();e.lineJoin="bevel";if(t.borderWidth){e.stroke()}}})},{25:25,26:26,45:45}],37:[function(e,t){'use strict';var a=e(25),o=e(26),i=e(45),n=a.global;a._set("global",{elements:{line:{tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});t.exports=o.extend({draw:function draw(){var e=this,t=e._view,a=e._chart.ctx,o=t.spanGaps,l=e._children.slice(),s=n.elements.line,d=-1,c,h,u,m;if(e._loop&&l.length){l.push(l[0])}a.save();a.lineCap=t.borderCapStyle||s.borderCapStyle;if(a.setLineDash){a.setLineDash(t.borderDash||s.borderDash)}a.lineDashOffset=t.borderDashOffset||s.borderDashOffset;a.lineJoin=t.borderJoinStyle||s.borderJoinStyle;a.lineWidth=t.borderWidth||s.borderWidth;a.strokeStyle=t.borderColor||n.defaultColor;a.beginPath();d=-1;for(c=0;cl?1:-1;h=a.borderSkipped||"bottom"}else{o=a.base;n=a.x;l=a.y-a.height/2;s=a.y+a.height/2;d=n>o?1:-1;c=1;h=a.borderSkipped||"left"}if(u){var m=Math.min(Math.abs(o-n),Math.abs(l-s));u=u>m?m:u;var p=u/2,f=o+("left"!==h?p*d:0),y=n+("right"!==h?-p*d:0),x=l+("top"!==h?p*c:0),k=s+("bottom"!==h?-p*c:0);if(f!==y){l=x;s=k}if(x!==k){o=f;n=y}}t.beginPath();t.fillStyle=a.backgroundColor;t.strokeStyle=a.borderColor;t.lineWidth=u;var _=[[o,s],[o,l],[n,l],[n,s]],v=["bottom","left","top","right"].indexOf(h,0);if(-1===v){v=0}function e(e){return _[(v+e)%4]}var S=e(0);t.moveTo(S[0],S[1]);for(var w=1;4>w;w++){S=e(w);t.lineTo(S[0],S[1])}t.fill();if(u){t.stroke()}},height:function height(){var e=this._view;return e.base-e.y},inRange:function(e,t){var a=!1;if(this._view){var i=o(this);a=e>=i.left&&e<=i.right&&t>=i.top&&t<=i.bottom}return a},inLabelRange:function inLabelRange(e,t){var i=this;if(!i._view){return!1}var n=!1,l=o(i);if(a(i)){n=e>=l.left&&e<=l.right}else{n=t>=l.top&&t<=l.bottom}return n},inXRange:function inXRange(e){var t=o(this);return e>=t.left&&e<=t.right},inYRange:function inYRange(e){var t=o(this);return e>=t.top&&e<=t.bottom},getCenterPoint:function getCenterPoint(){var e=this._view,t,o;if(a(this)){t=e.x;o=(e.y+e.base)/2}else{t=(e.x+e.base)/2;o=e.y}return{x:t,y:o}},getArea:function getArea(){var e=this._view;return e.width*Math.abs(e.y-e.base)},tooltipPosition:function tooltipPosition(){var e=this._view;return{x:e.x,y:e.y}}})},{25:25,26:26}],40:[function(e,t){'use strict';t.exports={};t.exports.Arc=e(36);t.exports.Line=e(37);t.exports.Point=e(38);t.exports.Rectangle=e(39)},{36:36,37:37,38:38,39:39}],41:[function(e,t,a){'use strict';var o=e(42),a=t.exports={clear:function clear(e){e.ctx.clearRect(0,0,e.width,e.height)},roundedRect:function roundedRect(e,t,a,o,i,n){if(n){var l=Math.min(n,o/2),s=Math.min(n,i/2);e.moveTo(t+l,a);e.lineTo(t+o-l,a);e.quadraticCurveTo(t+o,a,t+o,a+s);e.lineTo(t+o,a+i-s);e.quadraticCurveTo(t+o,a+i,t+o-l,a+i);e.lineTo(t+l,a+i);e.quadraticCurveTo(t,a+i,t,a+i-s);e.lineTo(t,a+s);e.quadraticCurveTo(t,a,t+l,a)}else{e.rect(t,a,o,i)}},drawPoint:function drawPoint(e,t,a,o,i){var n,l,s,d,c,h;if("object"===_typeof(t)){n=t.toString();if("[object HTMLImageElement]"===n||"[object HTMLCanvasElement]"===n){e.drawImage(t,o-t.width/2,i-t.height/2,t.width,t.height);return}}if(isNaN(a)||0>=a){return}switch(t){default:e.beginPath();e.arc(o,i,a,0,2*Math.PI);e.closePath();e.fill();break;case"triangle":e.beginPath();l=3*a/Math.sqrt(3);c=l*Math.sqrt(3)/2;e.moveTo(o-l/2,i+c/3);e.lineTo(o+l/2,i+c/3);e.lineTo(o,i-2*c/3);e.closePath();e.fill();break;case"rect":h=1/Math.SQRT2*a;e.beginPath();e.fillRect(o-h,i-h,2*h,2*h);e.strokeRect(o-h,i-h,2*h,2*h);break;case"rectRounded":var u=a/Math.SQRT2,m=Math.SQRT2*a;e.beginPath();this.roundedRect(e,o-u,i-u,m,m,a/2);e.closePath();e.fill();break;case"rectRot":h=1/Math.SQRT2*a;e.beginPath();e.moveTo(o-h,i);e.lineTo(o,i+h);e.lineTo(o+h,i);e.lineTo(o,i-h);e.closePath();e.fill();break;case"cross":e.beginPath();e.moveTo(o,i+a);e.lineTo(o,i-a);e.moveTo(o-a,i);e.lineTo(o+a,i);e.closePath();break;case"crossRot":e.beginPath();s=Math.cos(Math.PI/4)*a;d=Math.sin(Math.PI/4)*a;e.moveTo(o-s,i-d);e.lineTo(o+s,i+d);e.moveTo(o-s,i+d);e.lineTo(o+s,i-d);e.closePath();break;case"star":e.beginPath();e.moveTo(o,i+a);e.lineTo(o,i-a);e.moveTo(o-a,i);e.lineTo(o+a,i);s=Math.cos(Math.PI/4)*a;d=Math.sin(Math.PI/4)*a;e.moveTo(o-s,i-d);e.lineTo(o+s,i+d);e.moveTo(o-s,i+d);e.lineTo(o+s,i-d);e.closePath();break;case"line":e.beginPath();e.moveTo(o-a,i);e.lineTo(o+a,i);e.closePath();break;case"dash":e.beginPath();e.moveTo(o,i);e.lineTo(o+a,i);e.closePath();break;}e.stroke()},clipArea:function clipArea(e,t){e.save();e.beginPath();e.rect(t.left,t.top,t.right-t.left,t.bottom-t.top);e.clip()},unclipArea:function unclipArea(e){e.restore()},lineTo:function lineTo(e,t,a,o){if(a.steppedLine){if("after"===a.steppedLine&&!o||"after"!==a.steppedLine&&o){e.lineTo(t.x,a.y)}else{e.lineTo(a.x,t.y)}e.lineTo(a.x,a.y);return}if(!a.tension){e.lineTo(a.x,a.y);return}e.bezierCurveTo(o?t.controlPointPreviousX:t.controlPointNextX,o?t.controlPointPreviousY:t.controlPointNextY,o?a.controlPointNextX:a.controlPointPreviousX,o?a.controlPointNextY:a.controlPointPreviousY,a.x,a.y)}};o.clear=a.clear;o.drawRoundedRectangle=function(e){e.beginPath();a.roundedRect.apply(a,arguments);e.closePath()}},{42:42}],42:[function(e,t){'use strict';var a={noop:function noop(){},uid:function(){var e=0;return function(){return e++}}(),isNullOrUndef:function isNullOrUndef(e){return null===e||"undefined"==typeof e},isArray:Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},isObject:function isObject(e){return null!==e&&"[object Object]"===Object.prototype.toString.call(e)},valueOrDefault:function valueOrDefault(e,t){return"undefined"==typeof e?t:e},valueAtIndexOrDefault:function valueAtIndexOrDefault(e,t,o){return a.valueOrDefault(a.isArray(e)?e[t]:e,o)},callback:function callback(e,t,a){if(e&&"function"==typeof e.call){return e.apply(a,t)}},each:function each(e,t,o,n){var l,s,d;if(a.isArray(e)){s=e.length;if(n){for(l=s-1;0<=l;l--){t.call(o,e[l],l)}}else{for(l=0;l(e/=.5)){return .5*e*e}return-.5*(--e*(e-2)-1)},easeInCubic:function easeInCubic(e){return e*e*e},easeOutCubic:function easeOutCubic(e){return(e=e-1)*e*e+1},easeInOutCubic:function easeInOutCubic(e){if(1>(e/=.5)){return .5*e*e*e}return .5*((e-=2)*e*e+2)},easeInQuart:function easeInQuart(e){return e*e*e*e},easeOutQuart:function easeOutQuart(e){return-((e=e-1)*e*e*e-1)},easeInOutQuart:function easeInOutQuart(e){if(1>(e/=.5)){return .5*e*e*e*e}return-.5*((e-=2)*e*e*e-2)},easeInQuint:function easeInQuint(e){return e*e*e*e*e},easeOutQuint:function easeOutQuint(e){return(e=e-1)*e*e*e*e+1},easeInOutQuint:function easeInOutQuint(e){if(1>(e/=.5)){return .5*e*e*e*e*e}return .5*((e-=2)*e*e*e*e+2)},easeInSine:function easeInSine(e){return-Math.cos(e*(Math.PI/2))+1},easeOutSine:function easeOutSine(e){return Math.sin(e*(Math.PI/2))},easeInOutSine:function easeInOutSine(e){return-.5*(Math.cos(Math.PI*e)-1)},easeInExpo:function easeInExpo(e){return 0===e?0:Math.pow(2,10*(e-1))},easeOutExpo:function easeOutExpo(e){return 1===e?1:-Math.pow(2,-10*e)+1},easeInOutExpo:function easeInOutExpo(e){if(0===e){return 0}if(1===e){return 1}if(1>(e/=.5)){return .5*Math.pow(2,10*(e-1))}return .5*(-Math.pow(2,-10*--e)+2)},easeInCirc:function easeInCirc(e){if(1<=e){return e}return-(Math.sqrt(1-e*e)-1)},easeOutCirc:function easeOutCirc(e){return Math.sqrt(1-(e=e-1)*e)},easeInOutCirc:function easeInOutCirc(e){if(1>(e/=.5)){return-.5*(Math.sqrt(1-e*e)-1)}return .5*(Math.sqrt(1-(e-=2)*e)+1)},easeInElastic:function easeInElastic(e){var o=1.70158,i=0,n=1;if(0===e){return 0}if(1===e){return 1}if(!i){i=.3}if(1>n){n=1;o=i/4}else{o=i/(2*Math.PI)*Math.asin(1/n)}return-(n*Math.pow(2,10*(e-=1))*Math.sin((e-o)*(2*Math.PI)/i))},easeOutElastic:function easeOutElastic(e){var t=1.70158,o=0,i=1;if(0===e){return 0}if(1===e){return 1}if(!o){o=.3}if(1>i){i=1;t=o/4}else{t=o/(2*Math.PI)*Math.asin(1/i)}return i*Math.pow(2,-10*e)*Math.sin((e-t)*(2*Math.PI)/o)+1},easeInOutElastic:function easeInOutElastic(e){var o=1.70158,i=0,n=1;if(0===e){return 0}if(2==(e/=.5)){return 1}if(!i){i=.45}if(1>n){n=1;o=i/4}else{o=i/(2*Math.PI)*Math.asin(1/n)}if(1>e){return-.5*(n*Math.pow(2,10*(e-=1))*Math.sin((e-o)*(2*Math.PI)/i))}return .5*(n*Math.pow(2,-10*(e-=1))*Math.sin((e-o)*(2*Math.PI)/i))+1},easeInBack:function easeInBack(e){var t=1.70158;return e*e*((t+1)*e-t)},easeOutBack:function easeOutBack(e){var a=1.70158;return(e=e-1)*e*((a+1)*e+a)+1},easeInOutBack:function easeInOutBack(e){var a=1.70158;if(1>(e/=.5)){return .5*(e*e*(((a*=1.525)+1)*e-a))}return .5*((e-=2)*e*(((a*=1.525)+1)*e+a)+2)},easeInBounce:function easeInBounce(e){return 1-o.easeOutBounce(1-e)},easeOutBounce:function easeOutBounce(e){if(e<1/2.75){return 7.5625*e*e}if(e<2/2.75){return 7.5625*(e-=1.5/2.75)*e+.75}if(e<2.5/2.75){return 7.5625*(e-=2.25/2.75)*e+.9375}return 7.5625*(e-=2.625/2.75)*e+.984375},easeInOutBounce:function easeInOutBounce(e){if(.5>e){return .5*o.easeInBounce(2*e)}return .5*o.easeOutBounce(2*e-1)+.5}};t.exports={effects:o};a.easingEffects=o},{42:42}],44:[function(e,t){'use strict';var a=e(42);t.exports={toLineHeight:function toLineHeight(e,t){var a=(""+e).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!a||"normal"===a[1]){return 1.2*t}e=+a[2];switch(a[3]){case"px":return e;case"%":e/=100;break;default:break;}return t*e},toPadding:function toPadding(e){var o,i,n,s;if(a.isObject(e)){o=+e.top||0;i=+e.right||0;n=+e.bottom||0;s=+e.left||0}else{o=i=n=s=+e||0}return{top:o,right:i,bottom:n,left:s,height:o+n,width:s+i}},resolve:function resolve(e,t,o){var n,l,s;for(n=0,l=e.length;n
        ";var l=t.childNodes[0],s=t.childNodes[1];t._reset=function(){l.scrollLeft=o;l.scrollTop=o;s.scrollLeft=o;s.scrollTop=o};var d=function(){t._reset();e()};i(l,"scroll",d.bind(l,"expand"));i(s,"scroll",d.bind(s,"shrink"));return t}function h(e,t){var a=e[x]||(e[x]={}),o=a.renderProxy=function(a){if(a.animationName===v){t()}};y.each(S,function(t){i(e,t,o)});e.classList.add(_)}function u(e){var t=e[x]||{},a=t.renderProxy;if(a){y.each(S,function(t){n(e,t,a)});delete t.renderProxy}e.classList.remove(_)}function m(e,t,a){var o=e[x]||(e[x]={}),i=o.resizer=c(d(function(){if(o.resizer){return t(l("resize",a))}}));h(e,function(){if(o.resizer){var t=e.parentNode;if(t&&t!==i.parentNode){t.insertBefore(i,t.firstChild)}i._reset()}})}function p(e){var t=e[x]||{},a=t.resizer;delete t.resizer;u(e);if(a&&a.parentNode){a.parentNode.removeChild(a)}}function f(e,t){var a=e._style||document.createElement("style");if(!e._style){e._style=a;t="/* Chart.js */\n"+t;a.setAttribute("type","text/css");document.getElementsByTagName("head")[0].appendChild(a)}a.appendChild(document.createTextNode(t))}t.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function initialize(){f(this,"@-webkit-keyframes "+v+"{"+"from{opacity:0.99}to{opacity:1}"+"}@keyframes "+v+"{"+"from{opacity:0.99}to{opacity:1}"+"}."+_+"{-webkit-animation:"+v+" 0.001s;animation:"+v+" 0.001s;}")},acquireContext:function acquireContext(e,t){if("string"==typeof e){e=document.getElementById(e)}else if(e.length){e=e[0]}if(e&&e.canvas){e=e.canvas}var a=e&&e.getContext&&e.getContext("2d");if(a&&a.canvas===e){o(e,t);return a}return null},releaseContext:function releaseContext(e){var t=e.canvas;if(!t[x]){return}var a=t[x].initial;["height","width"].forEach(function(e){var o=a[e];if(y.isNullOrUndef(o)){t.removeAttribute(e)}else{t.setAttribute(e,o)}});y.each(a.style||{},function(e,a){t.style[a]=e});t.width=t.width;delete t[x]},addEventListener:function addEventListener(e,t,a){var o=e.canvas;if("resize"===t){m(o,a,e);return}var n=a[x]||(a[x]={}),l=n.proxies||(n.proxies={}),d=l[e.id+"_"+t]=function(t){a(s(t,e))};i(o,t,d)},removeEventListener:function removeEventListener(e,t,a){var o=e.canvas;if("resize"===t){p(o,a);return}var i=a[x]||{},l=i.proxies||{},s=l[e.id+"_"+t];if(!s){return}n(o,t,s)}};y.addEvent=i;y.removeEvent=n},{45:45}],48:[function(e,t){'use strict';var a=e(45),o=e(46),i=e(47),n=i._enabled?i:o;t.exports=a.extend({initialize:function initialize(){},acquireContext:function acquireContext(){},releaseContext:function releaseContext(){},addEventListener:function addEventListener(){},removeEventListener:function removeEventListener(){}},n)},{45:45,46:46,47:47}],49:[function(e,t){'use strict';var a=e(25),o=e(40),n=e(45);a._set("global",{plugins:{filler:{propagate:!0}}});t.exports=function(){var u={dataset:function dataset(e){var t=e.fill,a=e.chart,o=a.getDatasetMeta(t),i=o&&a.isDatasetVisible(t),n=i&&o.dataset._children||[],l=n.length||0;return!l?null:function(e,t){return tn||n>=a){return!1}return n}switch(i){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return i;default:return!1;}}function t(e){var t=e.el._model||{},a=e.el._scale||{},o=e.fill,i=null,n;if(isFinite(o)){return null}if("start"===o){i=t.scaleBottom===void 0?a.bottom:t.scaleBottom}else if("end"===o){i=t.scaleTop===void 0?a.top:t.scaleTop}else if(t.scaleZero!==void 0){i=t.scaleZero}else if(a.getBasePosition){i=a.getBasePosition()}else if(a.getBasePixel){i=a.getBasePixel()}if(i!==void 0&&null!==i){if(i.x!==void 0&&i.y!==void 0){return i}if("number"==typeof i&&isFinite(i)){n=a.isHorizontal();return{x:n?i:null,y:n?null:i}}}return null}function l(e,t,a){var o=e[t],i=o.fill,n=[t],l;if(!a){return i}while(!1!==i&&-1===n.indexOf(i)){if(!isFinite(i)){return i}l=e[i];if(!l){return!1}if(l.visible){return i}n.push(i);i=l.fill}return!1}function s(e){var t=e.fill,a="dataset";if(!1===t){return null}if(!isFinite(t)){a="boundary"}return u[a](e)}function d(e){return e&&!e.skip}function c(e,t,a,o,l){var s;if(!o||!l){return}e.moveTo(t[0].x,t[0].y);for(s=1;s"],a=0;a");if(e.data.datasets[a].label){t.push(e.data.datasets[a].label)}t.push("")}t.push("");return t.join("")}});t.exports=function(e){var l=e.layoutService,s=n.noop;function t(e,t){return e.usePointStyle?t*Math.SQRT2:e.boxWidth}e.Legend=o.extend({initialize:function initialize(e){n.extend(this,e);this.legendHitBoxes=[];this.doughnutMode=!1},beforeUpdate:s,update:function update(e,t,a){var o=this;o.beforeUpdate();o.maxWidth=e;o.maxHeight=t;o.margins=a;o.beforeSetDimensions();o.setDimensions();o.afterSetDimensions();o.beforeBuildLabels();o.buildLabels();o.afterBuildLabels();o.beforeFit();o.fit();o.afterFit();o.afterUpdate();return o.minSize},afterUpdate:s,beforeSetDimensions:s,setDimensions:function setDimensions(){var e=this;if(e.isHorizontal()){e.width=e.maxWidth;e.left=0;e.right=e.width}else{e.height=e.maxHeight;e.top=0;e.bottom=e.height}e.paddingLeft=0;e.paddingTop=0;e.paddingRight=0;e.paddingBottom=0;e.minSize={width:0,height:0}},afterSetDimensions:s,beforeBuildLabels:s,buildLabels:function buildLabels(){var e=this,t=e.options.labels||{},a=n.callback(t.generateLabels,[e.chart],e)||[];if(t.filter){a=a.filter(function(a){return t.filter(a,e.chart.data)})}if(e.options.reverse){a.reverse()}e.legendItems=a},afterBuildLabels:s,beforeFit:s,fit:function fit(){var e=this,o=e.options,l=o.labels,s=o.display,d=e.ctx,c=a.global,h=n.valueOrDefault,u=h(l.fontSize,c.defaultFontSize),m=h(l.fontStyle,c.defaultFontStyle),p=h(l.fontFamily,c.defaultFontFamily),f=n.fontString(u,m,p),y=e.legendHitBoxes=[],x=e.minSize,k=e.isHorizontal();if(k){x.width=e.maxWidth;x.height=s?10:0}else{x.width=s?10:0;x.height=e.maxHeight}if(s){d.font=f;if(k){var _=e.lineWidths=[0],v=e.legendItems.length?u+l.padding:0;d.textAlign="left";d.textBaseline="top";n.each(e.legendItems,function(a,o){var i=t(l,u),n=i+u/2+d.measureText(a.text).width;if(_[_.length-1]+n+l.padding>=e.width){v+=u+l.padding;_[_.length]=e.left}y[o]={left:0,top:0,width:n,height:u};_[_.length-1]+=n+l.padding});x.height+=v}else{var S=l.padding,w=e.columnWidths=[],D=l.padding,C=0,P=0,T=u+S;n.each(e.legendItems,function(e,a){var o=t(l,u),i=o+u/2+d.measureText(e.text).width;if(P+T>x.height){D+=C+l.padding;w.push(C);C=0;P=0}C=Math.max(C,i);P+=T;y[a]={left:0,top:0,width:i,height:u}});D+=C;w.push(C);x.width+=D}}e.width=x.width;e.height=x.height},afterFit:s,isHorizontal:function isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position},draw:function draw(){var e=this,o=e.options,i=o.labels,l=a.global,s=l.elements.line,d=e.width,c=e.lineWidths;if(o.display){var h=e.ctx,u=n.valueOrDefault,m=u(i.fontColor,l.defaultFontColor),p=u(i.fontSize,l.defaultFontSize),f=u(i.fontStyle,l.defaultFontStyle),y=u(i.fontFamily,l.defaultFontFamily),x=n.fontString(p,f,y),k;h.textAlign="left";h.textBaseline="middle";h.lineWidth=.5;h.strokeStyle=m;h.fillStyle=m;h.font=x;var _=t(i,p),v=e.legendHitBoxes,S=function(e,t,a){if(isNaN(_)||0>=_){return}h.save();h.fillStyle=u(a.fillStyle,l.defaultColor);h.lineCap=u(a.lineCap,s.borderCapStyle);h.lineDashOffset=u(a.lineDashOffset,s.borderDashOffset);h.lineJoin=u(a.lineJoin,s.borderJoinStyle);h.lineWidth=u(a.lineWidth,s.borderWidth);h.strokeStyle=u(a.strokeStyle,l.defaultColor);var i=0===u(a.lineWidth,s.borderWidth);if(h.setLineDash){h.setLineDash(u(a.lineDash,s.borderDash))}if(o.labels&&o.labels.usePointStyle){var d=p*Math.SQRT2/2,c=d/Math.SQRT2;n.canvas.drawPoint(h,a.pointStyle,d,e+c,t+c)}else{if(!i){h.strokeRect(e,t,_,p)}h.fillRect(e,t,_,p)}h.restore()},w=function(e,t,a,o){var i=p/2,n=_+i+e,l=t+i;h.fillText(a.text,n,l);if(a.hidden){h.beginPath();h.lineWidth=2;h.moveTo(n,l);h.lineTo(n+o,l);h.stroke()}},D=e.isHorizontal();if(D){k={x:e.left+(d-c[0])/2,y:e.top+i.padding,line:0}}else{k={x:e.left+i.padding,y:e.top+i.padding,line:0}}var C=p+i.padding;n.each(e.legendItems,function(t,a){var o=h.measureText(t.text).width,n=_+p/2+o,l=k.x,s=k.y;if(D){if(l+n>=d){s=k.y+=C;k.line++;l=k.x=e.left+(d-c[k.line])/2}}else if(s+C>e.bottom){l=k.x=l+e.columnWidths[k.line]+i.padding;s=k.y=e.top+i.padding;k.line++}S(l,s,t);v[a].left=l;v[a].top=s;w(l,s,t,o);if(D){k.x+=n+i.padding}else{k.y+=C}})}},handleEvent:function handleEvent(t){var e=this,a=e.options,o="mouseup"===t.type?"click":t.type,n=!1;if("mousemove"===o){if(!a.onHover){return}}else if("click"===o){if(!a.onClick){return}}else{return}var l=t.x,s=t.y;if(l>=e.left&&l<=e.right&&s>=e.top&&s<=e.bottom){for(var d=e.legendHitBoxes,c=0,h;c=h.left&&l<=h.left+h.width&&s>=h.top&&s<=h.top+h.height){if("click"===o){a.onClick.call(e,t.native,e.legendItems[c]);n=!0;break}else if("mousemove"===o){a.onHover.call(e,t.native,e.legendItems[c]);n=!0;break}}}}return n}});function i(t,a){var o=new e.Legend({ctx:t.ctx,options:a,chart:t});l.configure(t,o,a);l.addBox(t,o);t.legend=o}return{id:"legend",beforeInit:function beforeInit(e){var t=e.options.legend;if(t){i(e,t)}},beforeUpdate:function beforeUpdate(e){var t=e.options.legend,o=e.legend;if(t){n.mergeIf(t,a.global.legend);if(o){l.configure(e,o,t);o.options=t}else{i(e,t)}}else if(o){l.removeBox(e,o);delete e.legend}},afterEvent:function afterEvent(t,a){var e=t.legend;if(e){e.handleEvent(a)}}}}},{25:25,26:26,45:45}],51:[function(e,t){'use strict';var a=e(25),o=e(26),n=e(45);a._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}});t.exports=function(e){var i=e.layoutService,l=n.noop;e.Title=o.extend({initialize:function initialize(e){var t=this;n.extend(t,e);t.legendHitBoxes=[]},beforeUpdate:l,update:function update(e,t,a){var o=this;o.beforeUpdate();o.maxWidth=e;o.maxHeight=t;o.margins=a;o.beforeSetDimensions();o.setDimensions();o.afterSetDimensions();o.beforeBuildLabels();o.buildLabels();o.afterBuildLabels();o.beforeFit();o.fit();o.afterFit();o.afterUpdate();return o.minSize},afterUpdate:l,beforeSetDimensions:l,setDimensions:function setDimensions(){var e=this;if(e.isHorizontal()){e.width=e.maxWidth;e.left=0;e.right=e.width}else{e.height=e.maxHeight;e.top=0;e.bottom=e.height}e.paddingLeft=0;e.paddingTop=0;e.paddingRight=0;e.paddingBottom=0;e.minSize={width:0,height:0}},afterSetDimensions:l,beforeBuildLabels:l,buildLabels:l,afterBuildLabels:l,beforeFit:l,fit:function fit(){var e=this,t=n.valueOrDefault,o=e.options,i=o.display,l=t(o.fontSize,a.global.defaultFontSize),s=e.minSize,d=n.isArray(o.text)?o.text.length:1,c=n.options.toLineHeight(o.lineHeight,l),h=i?d*c+2*o.padding:0;if(e.isHorizontal()){s.width=e.maxWidth;s.height=h}else{s.width=h;s.height=e.maxHeight}e.width=s.width;e.height=s.height},afterFit:l,isHorizontal:function isHorizontal(){var e=this.options.position;return"top"===e||"bottom"===e},draw:function draw(){var e=this,t=e.ctx,o=n.valueOrDefault,l=e.options,s=a.global;if(l.display){var d=o(l.fontSize,s.defaultFontSize),c=o(l.fontStyle,s.defaultFontStyle),h=o(l.fontFamily,s.defaultFontFamily),u=n.fontString(d,c,h),m=n.options.toLineHeight(l.lineHeight,d),p=m/2+l.padding,f=0,x=e.top,k=e.left,_=e.bottom,v=e.right,S,w,D;t.fillStyle=o(l.fontColor,s.defaultFontColor);t.font=u;if(e.isHorizontal()){w=k+(v-k)/2;D=x+p;S=v-k}else{w="left"===l.position?k+p:v-p;D=x+(_-x)/2;S=_-x;f=Math.PI*("left"===l.position?-.5:.5)}t.save();t.translate(w,D);t.rotate(f);t.textAlign="center";t.textBaseline="middle";var C=l.text;if(n.isArray(C)){for(var P=0,T=0;T=e){o=0}else{o=Math.round(e/l)}return o+t.minIndex},getBasePixel:function getBasePixel(){return this.bottom}});e.scaleService.registerScaleType("category",t,{position:"bottom"})}},{}],53:[function(e,t){'use strict';var a=e(25),o=e(45),i=e(34);t.exports=function(e){var t={position:"left",ticks:{callback:i.formatters.linear}},n=e.LinearScaleBase.extend({determineDataLimits:function determineDataLimits(){var t=this,a=t.options,i=t.chart,n=i.data,l=n.datasets,s=t.isHorizontal();function e(e){return s?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null;t.max=null;var d=a.stacked;if(d===void 0){o.each(l,function(t,a){if(d){return}var o=i.getDatasetMeta(a);if(i.isDatasetVisible(a)&&e(o)&&o.stack!==void 0){d=!0}})}if(a.stacked||d){var c={};o.each(l,function(n,l){var s=i.getDatasetMeta(l),d=[s.type,a.stacked===void 0&&s.stack===void 0?l:"",s.stack].join(".");if(c[d]===void 0){c[d]={positiveValues:[],negativeValues:[]}}var h=c[d].positiveValues,u=c[d].negativeValues;if(i.isDatasetVisible(l)&&e(s)){o.each(n.data,function(e,o){var i=+t.getRightValue(e);if(isNaN(i)||s.data[o].hidden){return}h[o]=h[o]||0;u[o]=u[o]||0;if(a.relativePoints){h[o]=100}else if(0>i){u[o]+=i}else{h[o]+=i}})}});o.each(c,function(e){var a=e.positiveValues.concat(e.negativeValues),i=o.min(a),n=o.max(a);t.min=null===t.min?i:Math.min(t.min,i);t.max=null===t.max?n:Math.max(t.max,n)})}else{o.each(l,function(a,n){var l=i.getDatasetMeta(n);if(i.isDatasetVisible(n)&&e(l)){o.each(a.data,function(e,a){var o=+t.getRightValue(e);if(isNaN(o)||l.data[a].hidden){return}if(null===t.min){t.min=o}else if(ot.max){t.max=o}})}})}t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0;t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1;this.handleTickRangeOptions()},getTickLimit:function getTickLimit(){var e,t=this,i=t.options.ticks;if(t.isHorizontal()){e=Math.min(i.maxTicksLimit?i.maxTicksLimit:11,Math.ceil(t.width/50))}else{var n=o.valueOrDefault(i.fontSize,a.global.defaultFontSize);e=Math.min(i.maxTicksLimit?i.maxTicksLimit:11,Math.ceil(t.height/(2*n)))}return e},handleDirectionalChanges:function handleDirectionalChanges(){if(!this.isHorizontal()){this.ticks.reverse()}},getLabelForIndex:function getLabelForIndex(e,t){return+this.getRightValue(this.chart.data.datasets[t].data[e])},getPixelForValue:function getPixelForValue(e){var t=this,a=t.start,o=+t.getRightValue(e),i,n=t.end-a;if(t.isHorizontal()){i=t.left+t.width/n*(o-a);return Math.round(i)}i=t.bottom-t.height/n*(o-a);return Math.round(i)},getValueForPixel:function getValueForPixel(e){var t=this,a=t.isHorizontal(),o=a?t.width:t.height,i=(a?e-t.left:t.bottom-e)/o;return t.start+(t.end-t.start)*i},getPixelForTick:function getPixelForTick(e){return this.getPixelForValue(this.ticksAsNumbers[e])}});e.scaleService.registerScaleType("linear",n,t)}},{25:25,34:34,45:45}],54:[function(e,t){'use strict';var a=e(45),o=e(34);t.exports=function(e){var t=a.noop;e.LinearScaleBase=e.Scale.extend({getRightValue:function getRightValue(t){if("string"==typeof t){return+t}return e.Scale.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function handleTickRangeOptions(){var e=this,t=e.options,o=t.ticks;if(o.beginAtZero){var i=a.sign(e.min),n=a.sign(e.max);if(0>i&&0>n){e.max=0}else if(0=e.max){if(l){e.max=e.min+1}else{e.min=e.max-1}}}if(e.min===e.max){e.max++;if(!o.beginAtZero){e.min--}}},getTickLimit:t,handleDirectionalChanges:t,buildTicks:function buildTicks(){var e=this,t=e.options,i=t.ticks,n=e.getTickLimit();n=Math.max(2,n);var l={maxTicks:n,min:i.min,max:i.max,stepSize:a.valueOrDefault(i.fixedStepSize,i.stepSize)},s=e.ticks=o.generators.linear(l,e);e.handleDirectionalChanges();e.max=a.max(s);e.min=a.min(s);if(i.reverse){s.reverse();e.start=e.max;e.end=e.min}else{e.start=e.min;e.end=e.max}},convertTicksToLabels:function convertTicksToLabels(){var t=this;t.ticksAsNumbers=t.ticks.slice();t.zeroLineIndex=t.ticks.indexOf(0);e.Scale.prototype.convertTicksToLabels.call(t)}})}},{34:34,45:45}],55:[function(e,t){'use strict';var a=e(45),o=e(34);t.exports=function(e){var t={position:"left",ticks:{callback:o.formatters.logarithmic}},i=e.Scale.extend({determineDataLimits:function determineDataLimits(){var t=this,o=t.options,i=o.ticks,n=t.chart,l=n.data,s=l.datasets,d=a.valueOrDefault,c=t.isHorizontal();function e(e){return c?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null;t.max=null;t.minNotZero=null;var h=o.stacked;if(h===void 0){a.each(s,function(t,a){if(h){return}var o=n.getDatasetMeta(a);if(n.isDatasetVisible(a)&&e(o)&&o.stack!==void 0){h=!0}})}if(o.stacked||h){var u={};a.each(s,function(i,l){var s=n.getDatasetMeta(l),d=[s.type,o.stacked===void 0&&s.stack===void 0?l:"",s.stack].join(".");if(n.isDatasetVisible(l)&&e(s)){if(u[d]===void 0){u[d]=[]}a.each(i.data,function(e,a){var i=u[d],n=+t.getRightValue(e);if(isNaN(n)||s.data[a].hidden){return}i[a]=i[a]||0;if(o.relativePoints){i[a]=100}else{i[a]+=n}})}});a.each(u,function(e){var o=a.min(e),i=a.max(e);t.min=null===t.min?o:Math.min(t.min,o);t.max=null===t.max?i:Math.max(t.max,i)})}else{a.each(s,function(o,i){var l=n.getDatasetMeta(i);if(n.isDatasetVisible(i)&&e(l)){a.each(o.data,function(e,a){var o=+t.getRightValue(e);if(isNaN(o)||l.data[a].hidden){return}if(null===t.min){t.min=o}else if(ot.max){t.max=o}if(0!=o&&(null===t.minNotZero||oi){return{start:t-a-5,end:t}}return{start:t,end:t+a+5}}function d(e){var a=n(e),d=Math.min(e.height/2,e.width/2),c={r:e.width,l:0,t:e.height,b:0},h={},u,m,p;e.ctx.font=a.font;e._pointLabelSizes=[];var f=t(e);for(u=0;uc.r){c.r=k.end;h.r=y}if(_.startc.b){c.b=_.end;h.b=y}}e.setReductions(d,c,h)}function c(e){var t=Math.min(e.height/2,e.width/2);e.drawingArea=Math.round(t);e.setCenterPoint(0,0,0,0)}function h(e){if(0===e||180===e){return"center"}else if(180>e){return"left"}return"right"}function u(e,t,a,n){if(o.isArray(t)){for(var l=a.y,s=0;se){a.y-=t.h}}function p(e){var a=e.ctx,l=o.valueOrDefault,s=e.options,d=s.angleLines,c=s.pointLabels;a.lineWidth=d.lineWidth;a.strokeStyle=d.color;var p=e.getDistanceFromCenterForValue(s.ticks.reverse?e.min:e.max),f=n(e);a.textBaseline="top";for(var y=t(e)-1;0<=y;y--){if(d.display){var k=e.getPointPosition(y,p);a.beginPath();a.moveTo(e.xCenter,e.yCenter);a.lineTo(k.x,k.y);a.stroke();a.closePath()}if(c.display){var _=e.getPointPosition(y,p+5),v=l(c.fontColor,x.defaultFontColor);a.font=f.font;a.fillStyle=v;var S=e.getIndexAngle(y),w=o.toDegrees(S);a.textAlign=h(w);m(w,e._pointLabelSizes[y],_);u(a,e.pointLabels[y]||"",_,f.size)}}}function f(e,a,n,l){var s=e.ctx;s.strokeStyle=o.valueAtIndexOrDefault(a.color,l-1);s.lineWidth=o.valueAtIndexOrDefault(a.lineWidth,l-1);if(e.options.gridLines.circular){s.beginPath();s.arc(e.xCenter,e.yCenter,n,0,2*Math.PI);s.closePath();s.stroke()}else{var d=t(e);if(0===d){return}s.beginPath();var c=e.getPointPosition(0,n);s.moveTo(c.x,c.y);for(var h=1;ht&&0>a?a:0t&&h>1;l=e[n-1]||null;s=e[n];if(!l){return{lo:null,hi:s}}else if(s[t]a){i=n-1}else{return{lo:l,hi:s}}}return{lo:s,hi:null}}function s(e,t,a,o){var i=l(e,t,a),n=!i.lo?e[0]:!i.hi?e[e.length-2]:i.lo,s=!i.lo?e[1]:!i.hi?e[e.length-1]:i.hi,d=s[t]-n[t],c=d?(a-n[t])/d:0,h=(s[o]-n[o])*c;return n[o]+h}function d(e,t){var a=t.parser,o=t.parser||t.format;if("function"==typeof a){return a(e)}if("string"==typeof e&&"string"==typeof o){return x(e,o)}if(!(e instanceof x)){e=x(e)}if(e.isValid()){return e}if("function"==typeof o){return o(e)}return e}function c(e,t){if(_.isNullOrUndef(e)){return null}var a=t.options.time,o=d(t.getRightValue(e),a);if(!o.isValid()){return null}if(a.round){o.startOf(a.round)}return o.valueOf()}function h(e,t,a,o){var n=t-e,l=w[a],s=l.size,d=l.steps,c,h,u;if(!d){return Math.ceil(n/((o||1)*s))}for(c=0,h=d.length;c=t&&w<=a){_.push(w)}}e.min=t;e.max=a;e._unit=h;e._majorUnit=x;e._minorFormat=s[h];e._majorFormat=s[x];e._table=n(e._timestamps.data,t,a,o.distribution);e._offsets=f(e._table,_,t,a,o);return y(_,x)},getLabelForIndex:function getLabelForIndex(e,t){var a=this,o=a.chart.data,i=a.options.time,n=o.labels&&e lum2) {\n return (lum1 + 0.05) / (lum2 + 0.05);\n }\n return (lum2 + 0.05) / (lum1 + 0.05);\n },\n\n level: function (color2) {\n var contrastRatio = this.contrast(color2);\n if (contrastRatio >= 7.1) {\n return 'AAA';\n }\n\n return (contrastRatio >= 4.5) ? 'AA' : '';\n },\n\n dark: function () {\n // YIQ equation from http://24ways.org/2010/calculating-color-contrast\n var rgb = this.values.rgb;\n var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n return yiq < 128;\n },\n\n light: function () {\n return !this.dark();\n },\n\n negate: function () {\n var rgb = [];\n for (var i = 0; i < 3; i++) {\n rgb[i] = 255 - this.values.rgb[i];\n }\n this.setValues('rgb', rgb);\n return this;\n },\n\n lighten: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] += hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n darken: function (ratio) {\n var hsl = this.values.hsl;\n hsl[2] -= hsl[2] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n saturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] += hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n desaturate: function (ratio) {\n var hsl = this.values.hsl;\n hsl[1] -= hsl[1] * ratio;\n this.setValues('hsl', hsl);\n return this;\n },\n\n whiten: function (ratio) {\n var hwb = this.values.hwb;\n hwb[1] += hwb[1] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n blacken: function (ratio) {\n var hwb = this.values.hwb;\n hwb[2] += hwb[2] * ratio;\n this.setValues('hwb', hwb);\n return this;\n },\n\n greyscale: function () {\n var rgb = this.values.rgb;\n // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n this.setValues('rgb', [val, val, val]);\n return this;\n },\n\n clearer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha - (alpha * ratio));\n return this;\n },\n\n opaquer: function (ratio) {\n var alpha = this.values.alpha;\n this.setValues('alpha', alpha + (alpha * ratio));\n return this;\n },\n\n rotate: function (degrees) {\n var hsl = this.values.hsl;\n var hue = (hsl[0] + degrees) % 360;\n hsl[0] = hue < 0 ? 360 + hue : hue;\n this.setValues('hsl', hsl);\n return this;\n },\n\n /**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n mix: function (mixinColor, weight) {\n var color1 = this;\n var color2 = mixinColor;\n var p = weight === undefined ? 0.5 : weight;\n\n var w = 2 * p - 1;\n var a = color1.alpha() - color2.alpha();\n\n var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n var w2 = 1 - w1;\n\n return this\n .rgb(\n w1 * color1.red() + w2 * color2.red(),\n w1 * color1.green() + w2 * color2.green(),\n w1 * color1.blue() + w2 * color2.blue()\n )\n .alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n },\n\n toJSON: function () {\n return this.rgb();\n },\n\n clone: function () {\n // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n // making the final build way to big to embed in Chart.js. So let's do it manually,\n // assuming that values to clone are 1 dimension arrays containing only numbers,\n // except 'alpha' which is a number.\n var result = new Color();\n var source = this.values;\n var target = result.values;\n var value, type;\n\n for (var prop in source) {\n if (source.hasOwnProperty(prop)) {\n value = source[prop];\n type = ({}).toString.call(value);\n if (type === '[object Array]') {\n target[prop] = value.slice(0);\n } else if (type === '[object Number]') {\n target[prop] = value;\n } else {\n console.error('unexpected color value:', value);\n }\n }\n }\n\n return result;\n }\n };\n\n Color.prototype.spaces = {\n rgb: ['red', 'green', 'blue'],\n hsl: ['hue', 'saturation', 'lightness'],\n hsv: ['hue', 'saturation', 'value'],\n hwb: ['hue', 'whiteness', 'blackness'],\n cmyk: ['cyan', 'magenta', 'yellow', 'black']\n };\n\n Color.prototype.maxes = {\n rgb: [255, 255, 255],\n hsl: [360, 100, 100],\n hsv: [360, 100, 100],\n hwb: [360, 100, 100],\n cmyk: [100, 100, 100, 100]\n };\n\n Color.prototype.getValues = function (space) {\n var values = this.values;\n var vals = {};\n\n for (var i = 0; i < space.length; i++) {\n vals[space.charAt(i)] = values[space][i];\n }\n\n if (values.alpha !== 1) {\n vals.a = values.alpha;\n }\n\n // {r: 255, g: 255, b: 255, a: 0.4}\n return vals;\n };\n\n Color.prototype.setValues = function (space, vals) {\n var values = this.values;\n var spaces = this.spaces;\n var maxes = this.maxes;\n var alpha = 1;\n var i;\n\n this.valid = true;\n\n if (space === 'alpha') {\n alpha = vals;\n } else if (vals.length) {\n // [10, 10, 10]\n values[space] = vals.slice(0, space.length);\n alpha = vals[space.length];\n } else if (vals[space.charAt(0)] !== undefined) {\n // {r: 10, g: 10, b: 10}\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[space.charAt(i)];\n }\n\n alpha = vals.a;\n } else if (vals[spaces[space][0]] !== undefined) {\n // {red: 10, green: 10, blue: 10}\n var chans = spaces[space];\n\n for (i = 0; i < space.length; i++) {\n values[space][i] = vals[chans[i]];\n }\n\n alpha = vals.alpha;\n }\n\n values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n if (space === 'alpha') {\n return false;\n }\n\n var capped;\n\n // cap values of the space prior converting all values\n for (i = 0; i < space.length; i++) {\n capped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n values[space][i] = Math.round(capped);\n }\n\n // convert to all the other color spaces\n for (var sname in spaces) {\n if (sname !== space) {\n values[sname] = convert[space][sname](values[space]);\n }\n }\n\n return true;\n };\n\n Color.prototype.setSpace = function (space, args) {\n var vals = args[0];\n\n if (vals === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n\n // color.rgb(10, 10, 10)\n if (typeof vals === 'number') {\n vals = Array.prototype.slice.call(args);\n }\n\n this.setValues(space, vals);\n return this;\n };\n\n Color.prototype.setChannel = function (space, index, val) {\n var svalues = this.values[space];\n if (val === undefined) {\n // color.red()\n return svalues[index];\n } else if (val === svalues[index]) {\n // color.red(color.red())\n return this;\n }\n\n // color.red(100)\n svalues[index] = val;\n this.setValues(space, svalues);\n\n return this;\n };\n\n if (typeof window !== 'undefined') {\n window.Color = Color;\n }\n\n module.exports = Color;\n\n},{\"1\":1,\"4\":4}],3:[function(require,module,exports){\n\t/* MIT license */\n\n module.exports = {\n rgb2hsl: rgb2hsl,\n rgb2hsv: rgb2hsv,\n rgb2hwb: rgb2hwb,\n rgb2cmyk: rgb2cmyk,\n rgb2keyword: rgb2keyword,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n rgb2lch: rgb2lch,\n\n hsl2rgb: hsl2rgb,\n hsl2hsv: hsl2hsv,\n hsl2hwb: hsl2hwb,\n hsl2cmyk: hsl2cmyk,\n hsl2keyword: hsl2keyword,\n\n hsv2rgb: hsv2rgb,\n hsv2hsl: hsv2hsl,\n hsv2hwb: hsv2hwb,\n hsv2cmyk: hsv2cmyk,\n hsv2keyword: hsv2keyword,\n\n hwb2rgb: hwb2rgb,\n hwb2hsl: hwb2hsl,\n hwb2hsv: hwb2hsv,\n hwb2cmyk: hwb2cmyk,\n hwb2keyword: hwb2keyword,\n\n cmyk2rgb: cmyk2rgb,\n cmyk2hsl: cmyk2hsl,\n cmyk2hsv: cmyk2hsv,\n cmyk2hwb: cmyk2hwb,\n cmyk2keyword: cmyk2keyword,\n\n keyword2rgb: keyword2rgb,\n keyword2hsl: keyword2hsl,\n keyword2hsv: keyword2hsv,\n keyword2hwb: keyword2hwb,\n keyword2cmyk: keyword2cmyk,\n keyword2lab: keyword2lab,\n keyword2xyz: keyword2xyz,\n\n xyz2rgb: xyz2rgb,\n xyz2lab: xyz2lab,\n xyz2lch: xyz2lch,\n\n lab2xyz: lab2xyz,\n lab2rgb: lab2rgb,\n lab2lch: lab2lch,\n\n lch2lab: lch2lab,\n lch2xyz: lch2xyz,\n lch2rgb: lch2rgb\n }\n\n\n function rgb2hsl(rgb) {\n var r = rgb[0]/255,\n g = rgb[1]/255,\n b = rgb[2]/255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, l;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g)/ delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n l = (min + max) / 2;\n\n if (max == min)\n s = 0;\n else if (l <= 0.5)\n s = delta / (max + min);\n else\n s = delta / (2 - max - min);\n\n return [h, s * 100, l * 100];\n }\n\n function rgb2hsv(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n delta = max - min,\n h, s, v;\n\n if (max == 0)\n s = 0;\n else\n s = (delta/max * 1000)/10;\n\n if (max == min)\n h = 0;\n else if (r == max)\n h = (g - b) / delta;\n else if (g == max)\n h = 2 + (b - r) / delta;\n else if (b == max)\n h = 4 + (r - g) / delta;\n\n h = Math.min(h * 60, 360);\n\n if (h < 0)\n h += 360;\n\n v = ((max / 255) * 1000) / 10;\n\n return [h, s, v];\n }\n\n function rgb2hwb(rgb) {\n var r = rgb[0],\n g = rgb[1],\n b = rgb[2],\n h = rgb2hsl(rgb)[0],\n w = 1/255 * Math.min(r, Math.min(g, b)),\n b = 1 - 1/255 * Math.max(r, Math.max(g, b));\n\n return [h, w * 100, b * 100];\n }\n\n function rgb2cmyk(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255,\n c, m, y, k;\n\n k = Math.min(1 - r, 1 - g, 1 - b);\n c = (1 - r - k) / (1 - k) || 0;\n m = (1 - g - k) / (1 - k) || 0;\n y = (1 - b - k) / (1 - k) || 0;\n return [c * 100, m * 100, y * 100, k * 100];\n }\n\n function rgb2keyword(rgb) {\n return reverseKeywords[JSON.stringify(rgb)];\n }\n\n function rgb2xyz(rgb) {\n var r = rgb[0] / 255,\n g = rgb[1] / 255,\n b = rgb[2] / 255;\n\n // assume sRGB\n r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n return [x * 100, y *100, z * 100];\n }\n\n function rgb2lab(rgb) {\n var xyz = rgb2xyz(rgb),\n x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function rgb2lch(args) {\n return lab2lch(rgb2lab(args));\n }\n\n function hsl2rgb(hsl) {\n var h = hsl[0] / 360,\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n t1, t2, t3, rgb, val;\n\n if (s == 0) {\n val = l * 255;\n return [val, val, val];\n }\n\n if (l < 0.5)\n t2 = l * (1 + s);\n else\n t2 = l + s - l * s;\n t1 = 2 * l - t2;\n\n rgb = [0, 0, 0];\n for (var i = 0; i < 3; i++) {\n t3 = h + 1 / 3 * - (i - 1);\n t3 < 0 && t3++;\n t3 > 1 && t3--;\n\n if (6 * t3 < 1)\n val = t1 + (t2 - t1) * 6 * t3;\n else if (2 * t3 < 1)\n val = t2;\n else if (3 * t3 < 2)\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n else\n val = t1;\n\n rgb[i] = val * 255;\n }\n\n return rgb;\n }\n\n function hsl2hsv(hsl) {\n var h = hsl[0],\n s = hsl[1] / 100,\n l = hsl[2] / 100,\n sv, v;\n\n if(l === 0) {\n // no need to do calc on black\n // also avoids divide by 0 error\n return [0, 0, 0];\n }\n\n l *= 2;\n s *= (l <= 1) ? l : 2 - l;\n v = (l + s) / 2;\n sv = (2 * s) / (l + s);\n return [h, sv * 100, v * 100];\n }\n\n function hsl2hwb(args) {\n return rgb2hwb(hsl2rgb(args));\n }\n\n function hsl2cmyk(args) {\n return rgb2cmyk(hsl2rgb(args));\n }\n\n function hsl2keyword(args) {\n return rgb2keyword(hsl2rgb(args));\n }\n\n\n function hsv2rgb(hsv) {\n var h = hsv[0] / 60,\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n hi = Math.floor(h) % 6;\n\n var f = h - Math.floor(h),\n p = 255 * v * (1 - s),\n q = 255 * v * (1 - (s * f)),\n t = 255 * v * (1 - (s * (1 - f))),\n v = 255 * v;\n\n switch(hi) {\n case 0:\n return [v, t, p];\n case 1:\n return [q, v, p];\n case 2:\n return [p, v, t];\n case 3:\n return [p, q, v];\n case 4:\n return [t, p, v];\n case 5:\n return [v, p, q];\n }\n }\n\n function hsv2hsl(hsv) {\n var h = hsv[0],\n s = hsv[1] / 100,\n v = hsv[2] / 100,\n sl, l;\n\n l = (2 - s) * v;\n sl = s * v;\n sl /= (l <= 1) ? l : 2 - l;\n sl = sl || 0;\n l /= 2;\n return [h, sl * 100, l * 100];\n }\n\n function hsv2hwb(args) {\n return rgb2hwb(hsv2rgb(args))\n }\n\n function hsv2cmyk(args) {\n return rgb2cmyk(hsv2rgb(args));\n }\n\n function hsv2keyword(args) {\n return rgb2keyword(hsv2rgb(args));\n }\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n function hwb2rgb(hwb) {\n var h = hwb[0] / 360,\n wh = hwb[1] / 100,\n bl = hwb[2] / 100,\n ratio = wh + bl,\n i, v, f, n;\n\n // wh + bl cant be > 1\n if (ratio > 1) {\n wh /= ratio;\n bl /= ratio;\n }\n\n i = Math.floor(6 * h);\n v = 1 - bl;\n f = 6 * h - i;\n if ((i & 0x01) != 0) {\n f = 1 - f;\n }\n n = wh + f * (v - wh); // linear interpolation\n\n switch (i) {\n default:\n case 6:\n case 0: r = v; g = n; b = wh; break;\n case 1: r = n; g = v; b = wh; break;\n case 2: r = wh; g = v; b = n; break;\n case 3: r = wh; g = n; b = v; break;\n case 4: r = n; g = wh; b = v; break;\n case 5: r = v; g = wh; b = n; break;\n }\n\n return [r * 255, g * 255, b * 255];\n }\n\n function hwb2hsl(args) {\n return rgb2hsl(hwb2rgb(args));\n }\n\n function hwb2hsv(args) {\n return rgb2hsv(hwb2rgb(args));\n }\n\n function hwb2cmyk(args) {\n return rgb2cmyk(hwb2rgb(args));\n }\n\n function hwb2keyword(args) {\n return rgb2keyword(hwb2rgb(args));\n }\n\n function cmyk2rgb(cmyk) {\n var c = cmyk[0] / 100,\n m = cmyk[1] / 100,\n y = cmyk[2] / 100,\n k = cmyk[3] / 100,\n r, g, b;\n\n r = 1 - Math.min(1, c * (1 - k) + k);\n g = 1 - Math.min(1, m * (1 - k) + k);\n b = 1 - Math.min(1, y * (1 - k) + k);\n return [r * 255, g * 255, b * 255];\n }\n\n function cmyk2hsl(args) {\n return rgb2hsl(cmyk2rgb(args));\n }\n\n function cmyk2hsv(args) {\n return rgb2hsv(cmyk2rgb(args));\n }\n\n function cmyk2hwb(args) {\n return rgb2hwb(cmyk2rgb(args));\n }\n\n function cmyk2keyword(args) {\n return rgb2keyword(cmyk2rgb(args));\n }\n\n\n function xyz2rgb(xyz) {\n var x = xyz[0] / 100,\n y = xyz[1] / 100,\n z = xyz[2] / 100,\n r, g, b;\n\n r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n // assume sRGB\n r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n : r = (r * 12.92);\n\n g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n : g = (g * 12.92);\n\n b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n : b = (b * 12.92);\n\n r = Math.min(Math.max(0, r), 1);\n g = Math.min(Math.max(0, g), 1);\n b = Math.min(Math.max(0, b), 1);\n\n return [r * 255, g * 255, b * 255];\n }\n\n function xyz2lab(xyz) {\n var x = xyz[0],\n y = xyz[1],\n z = xyz[2],\n l, a, b;\n\n x /= 95.047;\n y /= 100;\n z /= 108.883;\n\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);\n\n l = (116 * y) - 16;\n a = 500 * (x - y);\n b = 200 * (y - z);\n\n return [l, a, b];\n }\n\n function xyz2lch(args) {\n return lab2lch(xyz2lab(args));\n }\n\n function lab2xyz(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n x, y, z, y2;\n\n if (l <= 8) {\n y = (l * 100) / 903.3;\n y2 = (7.787 * (y / 100)) + (16 / 116);\n } else {\n y = 100 * Math.pow((l + 16) / 116, 3);\n y2 = Math.pow(y / 100, 1/3);\n }\n\n x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);\n\n z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);\n\n return [x, y, z];\n }\n\n function lab2lch(lab) {\n var l = lab[0],\n a = lab[1],\n b = lab[2],\n hr, h, c;\n\n hr = Math.atan2(b, a);\n h = hr * 360 / 2 / Math.PI;\n if (h < 0) {\n h += 360;\n }\n c = Math.sqrt(a * a + b * b);\n return [l, c, h];\n }\n\n function lab2rgb(args) {\n return xyz2rgb(lab2xyz(args));\n }\n\n function lch2lab(lch) {\n var l = lch[0],\n c = lch[1],\n h = lch[2],\n a, b, hr;\n\n hr = h / 360 * 2 * Math.PI;\n a = c * Math.cos(hr);\n b = c * Math.sin(hr);\n return [l, a, b];\n }\n\n function lch2xyz(args) {\n return lab2xyz(lch2lab(args));\n }\n\n function lch2rgb(args) {\n return lab2rgb(lch2lab(args));\n }\n\n function keyword2rgb(keyword) {\n return cssKeywords[keyword];\n }\n\n function keyword2hsl(args) {\n return rgb2hsl(keyword2rgb(args));\n }\n\n function keyword2hsv(args) {\n return rgb2hsv(keyword2rgb(args));\n }\n\n function keyword2hwb(args) {\n return rgb2hwb(keyword2rgb(args));\n }\n\n function keyword2cmyk(args) {\n return rgb2cmyk(keyword2rgb(args));\n }\n\n function keyword2lab(args) {\n return rgb2lab(keyword2rgb(args));\n }\n\n function keyword2xyz(args) {\n return rgb2xyz(keyword2rgb(args));\n }\n\n var cssKeywords = {\n aliceblue: [240,248,255],\n antiquewhite: [250,235,215],\n aqua: [0,255,255],\n aquamarine: [127,255,212],\n azure: [240,255,255],\n beige: [245,245,220],\n bisque: [255,228,196],\n black: [0,0,0],\n blanchedalmond: [255,235,205],\n blue: [0,0,255],\n blueviolet: [138,43,226],\n brown: [165,42,42],\n burlywood: [222,184,135],\n cadetblue: [95,158,160],\n chartreuse: [127,255,0],\n chocolate: [210,105,30],\n coral: [255,127,80],\n cornflowerblue: [100,149,237],\n cornsilk: [255,248,220],\n crimson: [220,20,60],\n cyan: [0,255,255],\n darkblue: [0,0,139],\n darkcyan: [0,139,139],\n darkgoldenrod: [184,134,11],\n darkgray: [169,169,169],\n darkgreen: [0,100,0],\n darkgrey: [169,169,169],\n darkkhaki: [189,183,107],\n darkmagenta: [139,0,139],\n darkolivegreen: [85,107,47],\n darkorange: [255,140,0],\n darkorchid: [153,50,204],\n darkred: [139,0,0],\n darksalmon: [233,150,122],\n darkseagreen: [143,188,143],\n darkslateblue: [72,61,139],\n darkslategray: [47,79,79],\n darkslategrey: [47,79,79],\n darkturquoise: [0,206,209],\n darkviolet: [148,0,211],\n deeppink: [255,20,147],\n deepskyblue: [0,191,255],\n dimgray: [105,105,105],\n dimgrey: [105,105,105],\n dodgerblue: [30,144,255],\n firebrick: [178,34,34],\n floralwhite: [255,250,240],\n forestgreen: [34,139,34],\n fuchsia: [255,0,255],\n gainsboro: [220,220,220],\n ghostwhite: [248,248,255],\n gold: [255,215,0],\n goldenrod: [218,165,32],\n gray: [128,128,128],\n green: [0,128,0],\n greenyellow: [173,255,47],\n grey: [128,128,128],\n honeydew: [240,255,240],\n hotpink: [255,105,180],\n indianred: [205,92,92],\n indigo: [75,0,130],\n ivory: [255,255,240],\n khaki: [240,230,140],\n lavender: [230,230,250],\n lavenderblush: [255,240,245],\n lawngreen: [124,252,0],\n lemonchiffon: [255,250,205],\n lightblue: [173,216,230],\n lightcoral: [240,128,128],\n lightcyan: [224,255,255],\n lightgoldenrodyellow: [250,250,210],\n lightgray: [211,211,211],\n lightgreen: [144,238,144],\n lightgrey: [211,211,211],\n lightpink: [255,182,193],\n lightsalmon: [255,160,122],\n lightseagreen: [32,178,170],\n lightskyblue: [135,206,250],\n lightslategray: [119,136,153],\n lightslategrey: [119,136,153],\n lightsteelblue: [176,196,222],\n lightyellow: [255,255,224],\n lime: [0,255,0],\n limegreen: [50,205,50],\n linen: [250,240,230],\n magenta: [255,0,255],\n maroon: [128,0,0],\n mediumaquamarine: [102,205,170],\n mediumblue: [0,0,205],\n mediumorchid: [186,85,211],\n mediumpurple: [147,112,219],\n mediumseagreen: [60,179,113],\n mediumslateblue: [123,104,238],\n mediumspringgreen: [0,250,154],\n mediumturquoise: [72,209,204],\n mediumvioletred: [199,21,133],\n midnightblue: [25,25,112],\n mintcream: [245,255,250],\n mistyrose: [255,228,225],\n moccasin: [255,228,181],\n navajowhite: [255,222,173],\n navy: [0,0,128],\n oldlace: [253,245,230],\n olive: [128,128,0],\n olivedrab: [107,142,35],\n orange: [255,165,0],\n orangered: [255,69,0],\n orchid: [218,112,214],\n palegoldenrod: [238,232,170],\n palegreen: [152,251,152],\n paleturquoise: [175,238,238],\n palevioletred: [219,112,147],\n papayawhip: [255,239,213],\n peachpuff: [255,218,185],\n peru: [205,133,63],\n pink: [255,192,203],\n plum: [221,160,221],\n powderblue: [176,224,230],\n purple: [128,0,128],\n rebeccapurple: [102, 51, 153],\n red: [255,0,0],\n rosybrown: [188,143,143],\n royalblue: [65,105,225],\n saddlebrown: [139,69,19],\n salmon: [250,128,114],\n sandybrown: [244,164,96],\n seagreen: [46,139,87],\n seashell: [255,245,238],\n sienna: [160,82,45],\n silver: [192,192,192],\n skyblue: [135,206,235],\n slateblue: [106,90,205],\n slategray: [112,128,144],\n slategrey: [112,128,144],\n snow: [255,250,250],\n springgreen: [0,255,127],\n steelblue: [70,130,180],\n tan: [210,180,140],\n teal: [0,128,128],\n thistle: [216,191,216],\n tomato: [255,99,71],\n turquoise: [64,224,208],\n violet: [238,130,238],\n wheat: [245,222,179],\n white: [255,255,255],\n whitesmoke: [245,245,245],\n yellow: [255,255,0],\n yellowgreen: [154,205,50]\n };\n\n var reverseKeywords = {};\n for (var key in cssKeywords) {\n reverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n }\n\n},{}],4:[function(require,module,exports){\n var conversions = require(3);\n\n var convert = function() {\n return new Converter();\n }\n\n for (var func in conversions) {\n // export Raw versions\n convert[func + \"Raw\"] = (function(func) {\n // accept array or plain args\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n return conversions[func](arg);\n }\n })(func);\n\n var pair = /(\\w+)2(\\w+)/.exec(func),\n from = pair[1],\n to = pair[2];\n\n // export rgb2hsl and [\"rgb\"][\"hsl\"]\n convert[from] = convert[from] || {};\n\n convert[from][to] = convert[func] = (function(func) {\n return function(arg) {\n if (typeof arg == \"number\")\n arg = Array.prototype.slice.call(arguments);\n\n var val = conversions[func](arg);\n if (typeof val == \"string\" || val === undefined)\n return val; // keyword\n\n for (var i = 0; i < val.length; i++)\n val[i] = Math.round(val[i]);\n return val;\n }\n })(func);\n }\n\n\n\t/* Converter does lazy conversion and caching */\n var Converter = function() {\n this.convs = {};\n };\n\n\t/* Either get the values for a space or\n\t set the values for a space, depending on args */\n Converter.prototype.routeSpace = function(space, args) {\n var values = args[0];\n if (values === undefined) {\n // color.rgb()\n return this.getValues(space);\n }\n // color.rgb(10, 10, 10)\n if (typeof values == \"number\") {\n values = Array.prototype.slice.call(args);\n }\n\n return this.setValues(space, values);\n };\n\n\t/* Set the values for a space, invalidating cache */\n Converter.prototype.setValues = function(space, values) {\n this.space = space;\n this.convs = {};\n this.convs[space] = values;\n return this;\n };\n\n\t/* Get the values for a space. If there's already\n\t a conversion for the space, fetch it, otherwise\n\t compute it */\n Converter.prototype.getValues = function(space) {\n var vals = this.convs[space];\n if (!vals) {\n var fspace = this.space,\n from = this.convs[fspace];\n vals = convert[fspace][space](from);\n\n this.convs[space] = vals;\n }\n return vals;\n };\n\n [\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function(space) {\n Converter.prototype[space] = function(vals) {\n return this.routeSpace(space, arguments);\n }\n });\n\n module.exports = convert;\n},{\"3\":3}],5:[function(require,module,exports){\n 'use strict'\n\n module.exports = {\n \"aliceblue\": [240, 248, 255],\n \"antiquewhite\": [250, 235, 215],\n \"aqua\": [0, 255, 255],\n \"aquamarine\": [127, 255, 212],\n \"azure\": [240, 255, 255],\n \"beige\": [245, 245, 220],\n \"bisque\": [255, 228, 196],\n \"black\": [0, 0, 0],\n \"blanchedalmond\": [255, 235, 205],\n \"blue\": [0, 0, 255],\n \"blueviolet\": [138, 43, 226],\n \"brown\": [165, 42, 42],\n \"burlywood\": [222, 184, 135],\n \"cadetblue\": [95, 158, 160],\n \"chartreuse\": [127, 255, 0],\n \"chocolate\": [210, 105, 30],\n \"coral\": [255, 127, 80],\n \"cornflowerblue\": [100, 149, 237],\n \"cornsilk\": [255, 248, 220],\n \"crimson\": [220, 20, 60],\n \"cyan\": [0, 255, 255],\n \"darkblue\": [0, 0, 139],\n \"darkcyan\": [0, 139, 139],\n \"darkgoldenrod\": [184, 134, 11],\n \"darkgray\": [169, 169, 169],\n \"darkgreen\": [0, 100, 0],\n \"darkgrey\": [169, 169, 169],\n \"darkkhaki\": [189, 183, 107],\n \"darkmagenta\": [139, 0, 139],\n \"darkolivegreen\": [85, 107, 47],\n \"darkorange\": [255, 140, 0],\n \"darkorchid\": [153, 50, 204],\n \"darkred\": [139, 0, 0],\n \"darksalmon\": [233, 150, 122],\n \"darkseagreen\": [143, 188, 143],\n \"darkslateblue\": [72, 61, 139],\n \"darkslategray\": [47, 79, 79],\n \"darkslategrey\": [47, 79, 79],\n \"darkturquoise\": [0, 206, 209],\n \"darkviolet\": [148, 0, 211],\n \"deeppink\": [255, 20, 147],\n \"deepskyblue\": [0, 191, 255],\n \"dimgray\": [105, 105, 105],\n \"dimgrey\": [105, 105, 105],\n \"dodgerblue\": [30, 144, 255],\n \"firebrick\": [178, 34, 34],\n \"floralwhite\": [255, 250, 240],\n \"forestgreen\": [34, 139, 34],\n \"fuchsia\": [255, 0, 255],\n \"gainsboro\": [220, 220, 220],\n \"ghostwhite\": [248, 248, 255],\n \"gold\": [255, 215, 0],\n \"goldenrod\": [218, 165, 32],\n \"gray\": [128, 128, 128],\n \"green\": [0, 128, 0],\n \"greenyellow\": [173, 255, 47],\n \"grey\": [128, 128, 128],\n \"honeydew\": [240, 255, 240],\n \"hotpink\": [255, 105, 180],\n \"indianred\": [205, 92, 92],\n \"indigo\": [75, 0, 130],\n \"ivory\": [255, 255, 240],\n \"khaki\": [240, 230, 140],\n \"lavender\": [230, 230, 250],\n \"lavenderblush\": [255, 240, 245],\n \"lawngreen\": [124, 252, 0],\n \"lemonchiffon\": [255, 250, 205],\n \"lightblue\": [173, 216, 230],\n \"lightcoral\": [240, 128, 128],\n \"lightcyan\": [224, 255, 255],\n \"lightgoldenrodyellow\": [250, 250, 210],\n \"lightgray\": [211, 211, 211],\n \"lightgreen\": [144, 238, 144],\n \"lightgrey\": [211, 211, 211],\n \"lightpink\": [255, 182, 193],\n \"lightsalmon\": [255, 160, 122],\n \"lightseagreen\": [32, 178, 170],\n \"lightskyblue\": [135, 206, 250],\n \"lightslategray\": [119, 136, 153],\n \"lightslategrey\": [119, 136, 153],\n \"lightsteelblue\": [176, 196, 222],\n \"lightyellow\": [255, 255, 224],\n \"lime\": [0, 255, 0],\n \"limegreen\": [50, 205, 50],\n \"linen\": [250, 240, 230],\n \"magenta\": [255, 0, 255],\n \"maroon\": [128, 0, 0],\n \"mediumaquamarine\": [102, 205, 170],\n \"mediumblue\": [0, 0, 205],\n \"mediumorchid\": [186, 85, 211],\n \"mediumpurple\": [147, 112, 219],\n \"mediumseagreen\": [60, 179, 113],\n \"mediumslateblue\": [123, 104, 238],\n \"mediumspringgreen\": [0, 250, 154],\n \"mediumturquoise\": [72, 209, 204],\n \"mediumvioletred\": [199, 21, 133],\n \"midnightblue\": [25, 25, 112],\n \"mintcream\": [245, 255, 250],\n \"mistyrose\": [255, 228, 225],\n \"moccasin\": [255, 228, 181],\n \"navajowhite\": [255, 222, 173],\n \"navy\": [0, 0, 128],\n \"oldlace\": [253, 245, 230],\n \"olive\": [128, 128, 0],\n \"olivedrab\": [107, 142, 35],\n \"orange\": [255, 165, 0],\n \"orangered\": [255, 69, 0],\n \"orchid\": [218, 112, 214],\n \"palegoldenrod\": [238, 232, 170],\n \"palegreen\": [152, 251, 152],\n \"paleturquoise\": [175, 238, 238],\n \"palevioletred\": [219, 112, 147],\n \"papayawhip\": [255, 239, 213],\n \"peachpuff\": [255, 218, 185],\n \"peru\": [205, 133, 63],\n \"pink\": [255, 192, 203],\n \"plum\": [221, 160, 221],\n \"powderblue\": [176, 224, 230],\n \"purple\": [128, 0, 128],\n \"rebeccapurple\": [102, 51, 153],\n \"red\": [255, 0, 0],\n \"rosybrown\": [188, 143, 143],\n \"royalblue\": [65, 105, 225],\n \"saddlebrown\": [139, 69, 19],\n \"salmon\": [250, 128, 114],\n \"sandybrown\": [244, 164, 96],\n \"seagreen\": [46, 139, 87],\n \"seashell\": [255, 245, 238],\n \"sienna\": [160, 82, 45],\n \"silver\": [192, 192, 192],\n \"skyblue\": [135, 206, 235],\n \"slateblue\": [106, 90, 205],\n \"slategray\": [112, 128, 144],\n \"slategrey\": [112, 128, 144],\n \"snow\": [255, 250, 250],\n \"springgreen\": [0, 255, 127],\n \"steelblue\": [70, 130, 180],\n \"tan\": [210, 180, 140],\n \"teal\": [0, 128, 128],\n \"thistle\": [216, 191, 216],\n \"tomato\": [255, 99, 71],\n \"turquoise\": [64, 224, 208],\n \"violet\": [238, 130, 238],\n \"wheat\": [245, 222, 179],\n \"white\": [255, 255, 255],\n \"whitesmoke\": [245, 245, 245],\n \"yellow\": [255, 255, 0],\n \"yellowgreen\": [154, 205, 50]\n };\n\n},{}],6:[function(require,module,exports){\n//! moment.js\n//! version : 2.18.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n ;(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n global.moment = factory()\n }(this, (function () { 'use strict';\n\n var hookCallback;\n\n function hooks () {\n return hookCallback.apply(null, arguments);\n }\n\n// This is done to register the method called with moment()\n// without creating circular dependencies.\n function setHookCallback (callback) {\n hookCallback = callback;\n }\n\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n\n function isObjectEmpty(obj) {\n var k;\n for (k in obj) {\n // even if its not own property I'd still call it non-empty\n return false;\n }\n return true;\n }\n\n function isUndefined(input) {\n return input === void 0;\n }\n\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n\n function map(arr, fn) {\n var res = [], i;\n for (i = 0; i < arr.length; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n\n return a;\n }\n\n function createUTC (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty : false,\n unusedTokens : [],\n unusedInput : [],\n overflow : -2,\n charsLeftOver : 0,\n nullInput : false,\n invalidMonth : null,\n invalidFormat : false,\n userInvalidated : false,\n iso : false,\n parsedDateParts : [],\n meridiem : null,\n rfc2822 : false,\n weekdayMismatch : false\n };\n }\n\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this);\n var len = t.length >>> 0;\n\n for (var i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n\n return false;\n };\n }\n\n var some$1 = some;\n\n function isValid(m) {\n if (m._isValid == null) {\n var flags = getParsingFlags(m);\n var parsedParts = some$1.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n var isNowValid = !isNaN(m._d.getTime()) &&\n flags.overflow < 0 &&\n !flags.empty &&\n !flags.invalidMonth &&\n !flags.invalidWeekday &&\n !flags.nullInput &&\n !flags.invalidFormat &&\n !flags.userInvalidated &&\n (!flags.meridiem || (flags.meridiem && parsedParts));\n\n if (m._strict) {\n isNowValid = isNowValid &&\n flags.charsLeftOver === 0 &&\n flags.unusedTokens.length === 0 &&\n flags.bigHour === undefined;\n }\n\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n }\n else {\n return isNowValid;\n }\n }\n return m._isValid;\n }\n\n function createInvalid (flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n }\n else {\n getParsingFlags(m).userInvalidated = true;\n }\n\n return m;\n }\n\n// Plugins that add properties should also add the key here (null value),\n// so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [];\n\n function copyConfig(to, from) {\n var i, prop, val;\n\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n\n if (momentProperties.length > 0) {\n for (i = 0; i < momentProperties.length; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n\n return to;\n }\n\n var updateInProgress = false;\n\n// Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n\n function isMoment (obj) {\n return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n }\n\n function absFloor (number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n\n return value;\n }\n\n// compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if ((dontConvert && array1[i] !== array2[i]) ||\n (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false &&\n (typeof console !== 'undefined') && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n\n function deprecate(msg, fn) {\n var firstTime = true;\n\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [];\n var arg;\n for (var i = 0; i < arguments.length; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (var key in arguments[0]) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n\n var deprecations = {};\n\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n\n function isFunction(input) {\n return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n\n function set (config) {\n var prop, i;\n for (i in config) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp(\n (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n '|' + (/\\d{1,2}/).source);\n }\n\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig), prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) &&\n !hasOwnProp(childConfig, prop) &&\n isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n\n var keys;\n\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i, res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n\n var keys$1 = keys;\n\n var defaultCalendar = {\n sameDay : '[Today at] LT',\n nextDay : '[Tomorrow at] LT',\n nextWeek : 'dddd [at] LT',\n lastDay : '[Yesterday at] LT',\n lastWeek : '[Last] dddd [at] LT',\n sameElse : 'L'\n };\n\n function calendar (key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n\n var defaultLongDateFormat = {\n LTS : 'h:mm:ss A',\n LT : 'h:mm A',\n L : 'MM/DD/YYYY',\n LL : 'MMMM D, YYYY',\n LLL : 'MMMM D, YYYY h:mm A',\n LLLL : 'dddd, MMMM D, YYYY h:mm A'\n };\n\n function longDateFormat (key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n\n if (format || !formatUpper) {\n return format;\n }\n\n this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n return val.slice(1);\n });\n\n return this._longDateFormat[key];\n }\n\n var defaultInvalidDate = 'Invalid date';\n\n function invalidDate () {\n return this._invalidDate;\n }\n\n var defaultOrdinal = '%d';\n var defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n function ordinal (number) {\n return this._ordinal.replace('%d', number);\n }\n\n var defaultRelativeTime = {\n future : 'in %s',\n past : '%s ago',\n s : 'a few seconds',\n ss : '%d seconds',\n m : 'a minute',\n mm : '%d minutes',\n h : 'an hour',\n hh : '%d hours',\n d : 'a day',\n dd : '%d days',\n M : 'a month',\n MM : '%d months',\n y : 'a year',\n yy : '%d years'\n };\n\n function relativeTime (number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return (isFunction(output)) ?\n output(number, withoutSuffix, string, isFuture) :\n output.replace(/%d/i, number);\n }\n\n function pastFuture (diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n\n var aliases = {};\n\n function addUnitAlias (unit, shorthand) {\n var lowerCase = unit.toLowerCase();\n aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n }\n\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n\n return normalizedInput;\n }\n\n var priorities = {};\n\n function addUnitPriority(unit, priority) {\n priorities[unit] = priority;\n }\n\n function getPrioritizedUnits(unitsObj) {\n var units = [];\n for (var u in unitsObj) {\n units.push({unit: u, priority: priorities[u]});\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n\n function makeGetSet (unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n\n function get (mom, unit) {\n return mom.isValid() ?\n mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n }\n\n function set$1 (mom, unit, value) {\n if (mom.isValid()) {\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n }\n }\n\n// MOMENTS\n\n function stringGet (units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n\n\n function stringSet (units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units);\n for (var i = 0; i < prioritized.length; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? (forceSign ? '+' : '') : '-') +\n Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n var formatFunctions = {};\n\n var formatTokenFunctions = {};\n\n// token: 'M'\n// padded: ['MM', 2]\n// ordinal: 'Mo'\n// callback: function () { this.month() + 1 }\n function addFormatToken (token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens), i, length;\n\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n\n return function (mom) {\n var output = '', i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n// format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n return formatFunctions[format](m);\n }\n\n function expandFormat(format, locale) {\n var i = 5;\n\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n\n return format;\n }\n\n var match1 = /\\d/; // 0 - 9\n var match2 = /\\d\\d/; // 00 - 99\n var match3 = /\\d{3}/; // 000 - 999\n var match4 = /\\d{4}/; // 0000 - 9999\n var match6 = /[+-]?\\d{6}/; // -999999 - 999999\n var match1to2 = /\\d\\d?/; // 0 - 99\n var match3to4 = /\\d\\d\\d\\d?/; // 999 - 9999\n var match5to6 = /\\d\\d\\d\\d\\d\\d?/; // 99999 - 999999\n var match1to3 = /\\d{1,3}/; // 0 - 999\n var match1to4 = /\\d{1,4}/; // 0 - 9999\n var match1to6 = /[+-]?\\d{1,6}/; // -999999 - 999999\n\n var matchUnsigned = /\\d+/; // 0 - inf\n var matchSigned = /[+-]?\\d+/; // -inf - inf\n\n var matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n// any word (or two) characters or numbers including two/three word month in arabic.\n// includes scottish gaelic two word and hyphenated months\n var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\n var regexes = {};\n\n function addRegexToken (token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return (isStrict && strictRegex) ? strictRegex : regex;\n };\n }\n\n function getParseRegexForToken (token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n\n return regexes[token](config._strict, config._locale);\n }\n\n// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n\n var tokens = {};\n\n function addParseToken (token, callback) {\n var i, func = callback;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n for (i = 0; i < token.length; i++) {\n tokens[token[i]] = func;\n }\n }\n\n function addWeekParseToken (token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n\n var YEAR = 0;\n var MONTH = 1;\n var DATE = 2;\n var HOUR = 3;\n var MINUTE = 4;\n var SECOND = 5;\n var MILLISECOND = 6;\n var WEEK = 7;\n var WEEKDAY = 8;\n\n var indexOf;\n\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n\n var indexOf$1 = indexOf;\n\n function daysInMonth(year, month) {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n }\n\n// FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n// ALIASES\n\n addUnitAlias('month', 'M');\n\n// PRIORITY\n\n addUnitPriority('month', 8);\n\n// PARSING\n\n addRegexToken('M', match1to2);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n// LOCALES\n\n var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n function localeMonths (m, format) {\n if (!m) {\n return isArray(this._months) ? this._months :\n this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] :\n this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n function localeMonthsShort (m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort :\n this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n\n function handleStrictParse(monthName, format, strict) {\n var i, ii, mom, llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeMonthsParse (monthName, format, strict) {\n var i, mom, regex;\n\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function setMonth (mom, value) {\n var dayOfMonth;\n\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n\n dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n return mom;\n }\n\n function getSetMonth (value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n\n function getDaysInMonth () {\n return daysInMonth(this.year(), this.month());\n }\n\n var defaultMonthsShortRegex = matchWord;\n function monthsShortRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ?\n this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n\n var defaultMonthsRegex = matchWord;\n function monthsRegex (isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ?\n this._monthsStrictRegex : this._monthsRegex;\n }\n }\n\n function computeMonthsParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortPieces.push(this.monthsShort(mom, ''));\n longPieces.push(this.months(mom, ''));\n mixedPieces.push(this.months(mom, ''));\n mixedPieces.push(this.monthsShort(mom, ''));\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 12; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n }\n for (i = 0; i < 24; i++) {\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? '' + y : '+' + y;\n });\n\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n// ALIASES\n\n addUnitAlias('year', 'y');\n\n// PRIORITIES\n\n addUnitPriority('year', 1);\n\n// PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n// HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n function isLeapYear(year) {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n// HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n// MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n\n function getIsLeapYear () {\n return isLeapYear(this.year());\n }\n\n function createDate (y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date = new Date(y, m, d, h, M, s, ms);\n\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n return date;\n }\n\n function createUTCDate (y) {\n var date = new Date(Date.UTC.apply(null, arguments));\n\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n return date;\n }\n\n// start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n return -fwdlw + fwd - 1;\n }\n\n// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear, resDayOfYear;\n\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek, resYear;\n\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n\n return {\n week: resWeek,\n year: resYear\n };\n }\n\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n// FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n// ALIASES\n\n addUnitAlias('week', 'w');\n addUnitAlias('isoWeek', 'W');\n\n// PRIORITIES\n\n addUnitPriority('week', 5);\n addUnitPriority('isoWeek', 5);\n\n// PARSING\n\n addRegexToken('w', match1to2);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2);\n addRegexToken('WW', match1to2, match2);\n\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n// HELPERS\n\n// LOCALES\n\n function localeWeek (mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n\n var defaultLocaleWeek = {\n dow : 0, // Sunday is the first day of the week.\n doy : 6 // The week that contains Jan 1st is the first week of the year.\n };\n\n function localeFirstDayOfWeek () {\n return this._week.dow;\n }\n\n function localeFirstDayOfYear () {\n return this._week.doy;\n }\n\n// MOMENTS\n\n function getSetWeek (input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n function getSetISOWeek (input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n// FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n// ALIASES\n\n addUnitAlias('day', 'd');\n addUnitAlias('weekday', 'e');\n addUnitAlias('isoWeekday', 'E');\n\n// PRIORITY\n addUnitPriority('day', 11);\n addUnitPriority('weekday', 11);\n addUnitPriority('isoWeekday', 11);\n\n// PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n// HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n\n return null;\n }\n\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n// LOCALES\n\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n function localeWeekdays (m, format) {\n if (!m) {\n return isArray(this._weekdays) ? this._weekdays :\n this._weekdays['standalone'];\n }\n return isArray(this._weekdays) ? this._weekdays[m.day()] :\n this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n }\n\n var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n function localeWeekdaysShort (m) {\n return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n\n var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n function localeWeekdaysMin (m) {\n return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n\n function handleStrictParse$1(weekdayName, format, strict) {\n var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf$1.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf$1.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n\n function localeWeekdaysParse (weekdayName, format, strict) {\n var i, mom, regex;\n\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n// MOMENTS\n\n function getSetDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n\n function getSetLocaleDayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n\n function getSetISODayOfWeek (input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n\n var defaultWeekdaysRegex = matchWord;\n function weekdaysRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ?\n this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n\n var defaultWeekdaysShortRegex = matchWord;\n function weekdaysShortRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ?\n this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n\n var defaultWeekdaysMinRegex = matchWord;\n function weekdaysMinRegex (isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ?\n this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n\n\n function computeWeekdaysParse () {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n\n var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n i, mom, minp, shortp, longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = this.weekdaysMin(mom, '');\n shortp = this.weekdaysShort(mom, '');\n longp = this.weekdays(mom, '');\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n for (i = 0; i < 7; i++) {\n shortPieces[i] = regexEscape(shortPieces[i]);\n longPieces[i] = regexEscape(longPieces[i]);\n mixedPieces[i] = regexEscape(mixedPieces[i]);\n }\n\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n// FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n\n function kFormat() {\n return this.hours() || 24;\n }\n\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) +\n zeroFill(this.seconds(), 2);\n });\n\n function meridiem (token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n\n meridiem('a', true);\n meridiem('A', false);\n\n// ALIASES\n\n addUnitAlias('hour', 'h');\n\n// PRIORITY\n addUnitPriority('hour', 13);\n\n// PARSING\n\n function matchMeridiem (isStrict, locale) {\n return locale._meridiemParse;\n }\n\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2);\n addRegexToken('h', match1to2);\n addRegexToken('k', match1to2);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4;\n var pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n// LOCALES\n\n function localeIsPM (input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return ((input + '').toLowerCase().charAt(0) === 'p');\n }\n\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n function localeMeridiem (hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n\n\n// MOMENTS\n\n// Setting the hour should keep the time, because the user explicitly\n// specified which hour he wants. So trying to maintain the same hour (in\n// a new timezone) makes sense. Adding/subtracting hours does not follow\n// this rule.\n var getSetHour = makeGetSet('Hours', true);\n\n// months\n// week\n// weekdays\n// meridiem\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n\n week: defaultLocaleWeek,\n\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n// internal storage for locale config files\n var locales = {};\n var localeFamilies = {};\n var globalLocale;\n\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n// pick the locale from the array\n// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0, j, next, locale, split;\n\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return null;\n }\n\n function loadLocale(name) {\n var oldLocale = null;\n // TODO: Find a better way to register and load all the locales in Node\n if (!locales[name] && (typeof module !== 'undefined') &&\n module && module.exports) {\n try {\n oldLocale = globalLocale._abbr;\n require('./locale/' + name);\n // because defineLocale currently also sets the global locale, we\n // want to undo that for lazy loaded locales\n getSetGlobalLocale(oldLocale);\n } catch (e) { }\n }\n return locales[name];\n }\n\n// This function will load locale and then set the global locale. If\n// no arguments are passed in, it will simply return the current global\n// locale key.\n function getSetGlobalLocale (key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n }\n else {\n data = defineLocale(key, values);\n }\n\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n }\n }\n\n return globalLocale._abbr;\n }\n\n function defineLocale (name, config) {\n if (config !== null) {\n var parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride',\n 'use moment.updateLocale(localeName, config) to change ' +\n 'an existing locale. moment.defineLocale(localeName, ' +\n 'config) should only be used for creating a new locale ' +\n 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n\n\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n\n function updateLocale(name, config) {\n if (config != null) {\n var locale, parentConfig = baseConfig;\n // MERGE\n if (locales[name] != null) {\n parentConfig = locales[name]._config;\n }\n config = mergeConfigs(parentConfig, config);\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n// returns locale data\n function getLocale (key) {\n var locale;\n\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n\n if (!key) {\n return globalLocale;\n }\n\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n\n return chooseLocale(key);\n }\n\n function listLocales() {\n return keys$1(locales);\n }\n\n function checkOverflow (m) {\n var overflow;\n var a = m._a;\n\n if (a && getParsingFlags(m).overflow === -2) {\n overflow =\n a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :\n a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :\n a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :\n a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n -1;\n\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n\n getParsingFlags(m).overflow = overflow;\n }\n\n return m;\n }\n\n// iso 8601 regex\n// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;\n\n var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n var isoDates = [\n ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n ['YYYY-DDD', /\\d{4}-\\d{3}/],\n ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n ['YYYYYYMMDD', /[+-]\\d{10}/],\n ['YYYYMMDD', /\\d{8}/],\n // YYYYMM is NOT allowed by the standard\n ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n ['YYYYDDD', /\\d{7}/]\n ];\n\n// iso time formats and regexes\n var isoTimes = [\n ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n ['HH:mm', /\\d\\d:\\d\\d/],\n ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n ['HHmm', /\\d\\d\\d\\d/],\n ['HH', /\\d\\d/]\n ];\n\n var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n// date from iso format\n function configFromISO(config) {\n var i, l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime, dateFormat, timeFormat, tzFormat;\n\n if (match) {\n getParsingFlags(config).iso = true;\n\n for (i = 0, l = isoDates.length; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimes.length; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n\n// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d?\\d\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(?:\\d\\d)?\\d\\d\\s)(\\d\\d:\\d\\d)(\\:\\d\\d)?(\\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\\d{4}))$/;\n\n// date and time from ref 2822 format\n function configFromRFC2822(config) {\n var string, match, dayFormat,\n dateFormat, timeFormat, tzFormat;\n var timezones = {\n ' GMT': ' +0000',\n ' EDT': ' -0400',\n ' EST': ' -0500',\n ' CDT': ' -0500',\n ' CST': ' -0600',\n ' MDT': ' -0600',\n ' MST': ' -0700',\n ' PDT': ' -0700',\n ' PST': ' -0800'\n };\n var military = 'YXWVUTSRQPONZABCDEFGHIKLM';\n var timezone, timezoneIndex;\n\n string = config._i\n .replace(/\\([^\\)]*\\)|[\\n\\t]/g, ' ') // Remove comments and folding whitespace\n .replace(/(\\s\\s+)/g, ' ') // Replace multiple-spaces with a single space\n .replace(/^\\s|\\s$/g, ''); // Remove leading and trailing spaces\n match = basicRfcRegex.exec(string);\n\n if (match) {\n dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';\n dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');\n timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');\n\n // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.\n if (match[1]) { // day of week given\n var momentDate = new Date(match[2]);\n var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];\n\n if (match[1].substr(0,3) !== momentDay) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return;\n }\n }\n\n switch (match[5].length) {\n case 2: // military\n if (timezoneIndex === 0) {\n timezone = ' +0000';\n } else {\n timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;\n timezone = ((timezoneIndex < 0) ? ' -' : ' +') +\n (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';\n }\n break;\n case 4: // Zone\n timezone = timezones[match[5]];\n break;\n default: // UT or +/-9999\n timezone = timezones[' GMT'];\n }\n match[5] = timezone;\n config._i = match.splice(1).join('');\n tzFormat = ' ZZ';\n config._f = dayFormat + dateFormat + timeFormat + tzFormat;\n configFromStringAndFormat(config);\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n// date from iso format or fallback\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n\n hooks.createFromInputFallback = deprecate(\n 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n 'discouraged and will be removed in an upcoming major release. Please refer to ' +\n 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n }\n );\n\n// Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n// convert an array to a date.\n// the array should mirror the parameters below\n// note: all values past the year are optional and will default to the lowest possible value.\n// [year, month, day , hour, minute, second, millisecond]\n function configFromArray (config) {\n var i, date, input = [], currentDate, yearToUse;\n\n if (config._d) {\n return;\n }\n\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 &&\n config._a[MINUTE] === 0 &&\n config._a[SECOND] === 0 &&\n config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n }\n\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n\n var curWeek = weekOfYear(createLocal(), dow, doy);\n\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from begining of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to begining of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n// constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n// constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n// date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i, parsedInput, tokens, token, skipped,\n stringLength = string.length,\n totalParsedInputLength = 0;\n\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n // console.log('token', token, 'parsedInput', parsedInput,\n // 'regex', getParseRegexForToken(token, config));\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n }\n else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n }\n else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 &&\n getParsingFlags(config).bigHour === true &&\n config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n configFromArray(config);\n checkOverflow(config);\n }\n\n\n function meridiemFixWrap (locale, hour, meridiem) {\n var isPm;\n\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n// date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n\n scoreToBeat,\n i,\n currentScore;\n\n if (config._f.length === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n\n for (i = 0; i < config._f.length; i++) {\n currentScore = 0;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n\n if (!isValid(tempConfig)) {\n continue;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n getParsingFlags(tempConfig).score = currentScore;\n\n if (scoreToBeat == null || currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n\n extend(config, bestMoment || tempConfig);\n }\n\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n\n var i = normalizeObjectUnits(config._i);\n config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n\n configFromArray(config);\n }\n\n function createFromConfig (config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n\n return res;\n }\n\n function prepareConfig (config) {\n var input = config._i,\n format = config._f;\n\n config._locale = config._locale || getLocale(config._l);\n\n if (input === null || (format === undefined && input === '')) {\n return createInvalid({nullInput: true});\n }\n\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n\n if (!isValid(config)) {\n config._d = null;\n }\n\n return config;\n }\n\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n\n function createLocalOrUTC (input, format, locale, strict, isUTC) {\n var c = {};\n\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n\n if ((isObject(input) && isObjectEmpty(input)) ||\n (isArray(input) && input.length === 0)) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n\n return createFromConfig(c);\n }\n\n function createLocal (input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n\n var prototypeMin = deprecate(\n 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n var prototypeMax = deprecate(\n 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n }\n );\n\n// Pick a moment m from moments so that m[fn](other) is true for all\n// other. This relies on the function fn to be transitive.\n//\n// moments should either be an array of moment objects or an array, whose\n// first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n// TODO: Use [].sort instead?\n function min () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isBefore', args);\n }\n\n function max () {\n var args = [].slice.call(arguments, 0);\n\n return pickBy('isAfter', args);\n }\n\n var now = function () {\n return Date.now ? Date.now() : +(new Date());\n };\n\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n\n function isDurationValid(m) {\n for (var key in m) {\n if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n\n var unitHasDecimal = false;\n for (var i = 0; i < ordering.length; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n\n return true;\n }\n\n function isValid$1() {\n return this._isValid;\n }\n\n function createInvalid$1() {\n return createDuration(NaN);\n }\n\n function Duration (duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds +\n seconds * 1e3 + // 1000\n minutes * 6e4 + // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days +\n weeks * 7;\n // It is impossible translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months +\n quarters * 3 +\n years * 12;\n\n this._data = {};\n\n this._locale = getLocale();\n\n this._bubble();\n }\n\n function isDuration (obj) {\n return obj instanceof Duration;\n }\n\n function absRound (number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n// FORMATTING\n\n function offset (token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset();\n var sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n });\n }\n\n offset('Z', ':');\n offset('ZZ', '');\n\n// PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n// HELPERS\n\n// timezone chunker\n// '+10:00' > ['10', '00']\n// '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher);\n\n if (matches === null) {\n return null;\n }\n\n var chunk = matches[matches.length - 1] || [];\n var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n return minutes === 0 ?\n 0 :\n parts[0] === '+' ? minutes : -minutes;\n }\n\n// Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n\n function getDateOffset (m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n }\n\n// HOOKS\n\n// This function will be called whenever a moment is mutated.\n// It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n// MOMENTS\n\n// keepLocalTime = true means only change the timezone, without\n// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n// +0200, so we adjust the time as needed, to be valid.\n//\n// Keeping the time actually adds/subtracts (one hour)\n// from the actual represented time. That is why we call updateOffset\n// a second time. In case it wants us to change the offset again\n// _changeInProgress == true case, then we have to adjust, because\n// there is no such time in the given timezone.\n function getSetOffset (input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n\n function getSetZone (input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n\n this.utcOffset(input, keepLocalTime);\n\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n\n function setOffsetToUTC (keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n\n function setOffsetToLocal (keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n\n function setOffsetToParsedOffset () {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n }\n else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n\n function hasAlignedHourOffset (input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n\n return (this.utcOffset() - input) % 60 === 0;\n }\n\n function isDaylightSavingTime () {\n return (\n this.utcOffset() > this.clone().month(0).utcOffset() ||\n this.utcOffset() > this.clone().month(5).utcOffset()\n );\n }\n\n function isDaylightSavingTimeShifted () {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n\n var c = {};\n\n copyConfig(c, this);\n c = prepareConfig(c);\n\n if (c._a) {\n var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() &&\n compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n\n return this._isDSTShifted;\n }\n\n function isLocal () {\n return this.isValid() ? !this._isUTC : false;\n }\n\n function isUtcOffset () {\n return this.isValid() ? this._isUTC : false;\n }\n\n function isUtc () {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n// ASP.NET json date format regex\n var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n// and further modified to allow for strings containing both week and day\n var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\n function createDuration (input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n\n if (isDuration(input)) {\n duration = {\n ms : input._milliseconds,\n d : input._days,\n M : input._months\n };\n } else if (isNumber(input)) {\n duration = {};\n if (key) {\n duration[key] = input;\n } else {\n duration.milliseconds = input;\n }\n } else if (!!(match = aspNetRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : 0,\n d : toInt(match[DATE]) * sign,\n h : toInt(match[HOUR]) * sign,\n m : toInt(match[MINUTE]) * sign,\n s : toInt(match[SECOND]) * sign,\n ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (!!(match = isoRegex.exec(input))) {\n sign = (match[1] === '-') ? -1 : 1;\n duration = {\n y : parseIso(match[2], sign),\n M : parseIso(match[3], sign),\n w : parseIso(match[4], sign),\n d : parseIso(match[5], sign),\n h : parseIso(match[6], sign),\n m : parseIso(match[7], sign),\n s : parseIso(match[8], sign)\n };\n } else if (duration == null) {// checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n\n ret = new Duration(duration);\n\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n\n return ret;\n }\n\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n\n function parseIso (inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n\n function positiveMomentsDifference(base, other) {\n var res = {milliseconds: 0, months: 0};\n\n res.months = other.month() - base.month() +\n (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n\n res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n return res;\n }\n\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {milliseconds: 0, months: 0};\n }\n\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n\n return res;\n }\n\n// TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val; val = period; period = tmp;\n }\n\n val = typeof val === 'string' ? +val : val;\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n\n function addSubtract (mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n\n if (!mom.isValid()) {\n // No op\n return;\n }\n\n updateOffset = updateOffset == null ? true : updateOffset;\n\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n\n var add = createAdder(1, 'add');\n var subtract = createAdder(-1, 'subtract');\n\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' :\n diff < -1 ? 'lastWeek' :\n diff < 0 ? 'lastDay' :\n diff < 1 ? 'sameDay' :\n diff < 2 ? 'nextDay' :\n diff < 7 ? 'nextWeek' : 'sameElse';\n }\n\n function calendar$1 (time, formats) {\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse';\n\n var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n\n function clone () {\n return new Moment(this);\n }\n\n function isAfter (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n\n function isBefore (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n\n function isBetween (from, to, units, inclusivity) {\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n }\n\n function isSame (input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units || 'millisecond');\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n\n function isSameOrAfter (input, units) {\n return this.isSame(input, units) || this.isAfter(input,units);\n }\n\n function isSameOrBefore (input, units) {\n return this.isSame(input, units) || this.isBefore(input,units);\n }\n\n function diff (input, units, asFloat) {\n var that,\n zoneDelta,\n delta, output;\n\n if (!this.isValid()) {\n return NaN;\n }\n\n that = cloneWithOffset(input, this);\n\n if (!that.isValid()) {\n return NaN;\n }\n\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n units = normalizeUnits(units);\n\n if (units === 'year' || units === 'month' || units === 'quarter') {\n output = monthDiff(this, that);\n if (units === 'quarter') {\n output = output / 3;\n } else if (units === 'year') {\n output = output / 12;\n }\n } else {\n delta = this - that;\n output = units === 'second' ? delta / 1e3 : // 1000\n units === 'minute' ? delta / 6e4 : // 1000 * 60\n units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n delta;\n }\n return asFloat ? output : absFloor(output);\n }\n\n function monthDiff (a, b) {\n // difference in months\n var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2, adjust;\n\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n function toString () {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n\n function toISOString() {\n if (!this.isValid()) {\n return null;\n }\n var m = this.clone().utc();\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n return this.toDate().toISOString();\n }\n return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect () {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment';\n var zone = '';\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n var prefix = '[' + func + '(\"]';\n var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';\n var datetime = '-MM-DD[T]HH:mm:ss.SSS';\n var suffix = zone + '[\")]';\n\n return this.format(prefix + year + datetime + suffix);\n }\n\n function format (inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n\n function from (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function fromNow (withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n\n function to (time, withoutSuffix) {\n if (this.isValid() &&\n ((isMoment(time) && time.isValid()) ||\n createLocal(time).isValid())) {\n return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n\n function toNow (withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n// If passed a locale key, it will set the locale for this\n// instance. Otherwise, it will return the locale configuration\n// variables for this instance.\n function locale (key) {\n var newLocaleData;\n\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n\n var lang = deprecate(\n 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n }\n );\n\n function localeData () {\n return this._locale;\n }\n\n function startOf (units) {\n units = normalizeUnits(units);\n // the following switch intentionally omits break keywords\n // to utilize falling through the cases.\n switch (units) {\n case 'year':\n this.month(0);\n\t\t\t\t/* falls through */\n case 'quarter':\n case 'month':\n this.date(1);\n\t\t\t\t/* falls through */\n case 'week':\n case 'isoWeek':\n case 'day':\n case 'date':\n this.hours(0);\n\t\t\t\t/* falls through */\n case 'hour':\n this.minutes(0);\n\t\t\t\t/* falls through */\n case 'minute':\n this.seconds(0);\n\t\t\t\t/* falls through */\n case 'second':\n this.milliseconds(0);\n }\n\n // weeks are a special case\n if (units === 'week') {\n this.weekday(0);\n }\n if (units === 'isoWeek') {\n this.isoWeekday(1);\n }\n\n // quarters are also special\n if (units === 'quarter') {\n this.month(Math.floor(this.month() / 3) * 3);\n }\n\n return this;\n }\n\n function endOf (units) {\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond') {\n return this;\n }\n\n // 'date' is an alias for 'day', so it should be considered as such.\n if (units === 'date') {\n units = 'day';\n }\n\n return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n }\n\n function valueOf () {\n return this._d.valueOf() - ((this._offset || 0) * 60000);\n }\n\n function unix () {\n return Math.floor(this.valueOf() / 1000);\n }\n\n function toDate () {\n return new Date(this.valueOf());\n }\n\n function toArray () {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n\n function toObject () {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n\n function toJSON () {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n\n function isValid$2 () {\n return isValid(this);\n }\n\n function parsingFlags () {\n return extend({}, getParsingFlags(this));\n }\n\n function invalidAt () {\n return getParsingFlags(this).overflow;\n }\n\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n\n// FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n\n function addWeekYearFormatToken (token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n// ALIASES\n\n addUnitAlias('weekYear', 'gg');\n addUnitAlias('isoWeekYear', 'GG');\n\n// PRIORITY\n\n addUnitPriority('weekYear', 1);\n addUnitPriority('isoWeekYear', 1);\n\n\n// PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n// MOMENTS\n\n function getSetWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input,\n this.week(),\n this.weekday(),\n this.localeData()._week.dow,\n this.localeData()._week.doy);\n }\n\n function getSetISOWeekYear (input) {\n return getSetWeekYearHelper.call(this,\n input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n\n function getISOWeeksInYear () {\n return weeksInYear(this.year(), 1, 4);\n }\n\n function getWeeksInYear () {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n// FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n// ALIASES\n\n addUnitAlias('quarter', 'Q');\n\n// PRIORITY\n\n addUnitPriority('quarter', 7);\n\n// PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n// MOMENTS\n\n function getSetQuarter (input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n// FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n// ALIASES\n\n addUnitAlias('date', 'D');\n\n// PRIOROITY\n addUnitPriority('date', 9);\n\n// PARSING\n\n addRegexToken('D', match1to2);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ?\n (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :\n locale._dayOfMonthOrdinalParseLenient;\n });\n\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0], 10);\n });\n\n// MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n// FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n// ALIASES\n\n addUnitAlias('dayOfYear', 'DDD');\n\n// PRIORITY\n addUnitPriority('dayOfYear', 4);\n\n// PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n// HELPERS\n\n// MOMENTS\n\n function getSetDayOfYear (input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n }\n\n// FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n// ALIASES\n\n addUnitAlias('minute', 'm');\n\n// PRIORITY\n\n addUnitPriority('minute', 14);\n\n// PARSING\n\n addRegexToken('m', match1to2);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n// MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n// FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n// ALIASES\n\n addUnitAlias('second', 's');\n\n// PRIORITY\n\n addUnitPriority('second', 15);\n\n// PARSING\n\n addRegexToken('s', match1to2);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n// MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n// FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n\n// ALIASES\n\n addUnitAlias('millisecond', 'ms');\n\n// PRIORITY\n\n addUnitPriority('millisecond', 16);\n\n// PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n\n var token;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n// MOMENTS\n\n var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n// FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n// MOMENTS\n\n function getZoneAbbr () {\n return this._isUTC ? 'UTC' : '';\n }\n\n function getZoneName () {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n\n var proto = Moment.prototype;\n\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n\n// Year\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n\n// Week Year\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n\n// Quarter\n proto.quarter = proto.quarters = getSetQuarter;\n\n// Month\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n\n// Week\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n\n// Day\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n\n// Hour\n proto.hour = proto.hours = getSetHour;\n\n// Minute\n proto.minute = proto.minutes = getSetMinute;\n\n// Second\n proto.second = proto.seconds = getSetSecond;\n\n// Millisecond\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n\n// Offset\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n\n// Timezone\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n\n// Deprecations\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n function createUnix (input) {\n return createLocal(input * 1000);\n }\n\n function createInZone () {\n return createLocal.apply(null, arguments).parseZone();\n }\n\n function preParsePostFormat (string) {\n return string;\n }\n\n var proto$1 = Locale.prototype;\n\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n\n// Month\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n\n// Week\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n// Day of Week\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n// Hours\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n\n function get$1 (format, index, field, setter) {\n var locale = getLocale();\n var utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n\n function listMonthsImpl (format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n// ()\n// (5)\n// (fmt, 5)\n// (fmt)\n// (true)\n// (true, 5)\n// (true, fmt, 5)\n// (true, fmt)\n function listWeekdaysImpl (localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n\n format = format || '';\n }\n\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0;\n\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n\n var i;\n var out = [];\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n\n function listMonths (format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n\n function listMonthsShort (format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n\n function listWeekdays (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n\n function listWeekdaysShort (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n\n function listWeekdaysMin (localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n\n getSetGlobalLocale('en', {\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal : function (number) {\n var b = number % 10,\n output = (toInt(number % 100 / 10) === 1) ? 'th' :\n (b === 1) ? 'st' :\n (b === 2) ? 'nd' :\n (b === 3) ? 'rd' : 'th';\n return number + output;\n }\n });\n\n// Side effect imports\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n\n var mathAbs = Math.abs;\n\n function abs () {\n var data = this._data;\n\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n\n return this;\n }\n\n function addSubtract$1 (duration, input, value, direction) {\n var other = createDuration(input, value);\n\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n\n return duration._bubble();\n }\n\n// supports only 2.0-style add(1, 's') or add(duration)\n function add$1 (input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n// supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1 (input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n\n function absCeil (number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n\n function bubble () {\n var milliseconds = this._milliseconds;\n var days = this._days;\n var months = this._months;\n var data = this._data;\n var seconds, minutes, hours, years, monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n (milliseconds <= 0 && days <= 0 && months <= 0))) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n data.days = days;\n data.months = months;\n data.years = years;\n\n return this;\n }\n\n function daysToMonths (days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n\n function monthsToDays (months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n\n function as (units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days;\n var months;\n var milliseconds = this._milliseconds;\n\n units = normalizeUnits(units);\n\n if (units === 'month' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n return units === 'month' ? months : months / 12;\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week' : return days / 7 + milliseconds / 6048e5;\n case 'day' : return days + milliseconds / 864e5;\n case 'hour' : return days * 24 + milliseconds / 36e5;\n case 'minute' : return days * 1440 + milliseconds / 6e4;\n case 'second' : return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n default: throw new Error('Unknown unit ' + units);\n }\n }\n }\n\n// TODO: Use this.as('ms')?\n function valueOf$1 () {\n if (!this.isValid()) {\n return NaN;\n }\n return (\n this._milliseconds +\n this._days * 864e5 +\n (this._months % 12) * 2592e6 +\n toInt(this._months / 12) * 31536e6\n );\n }\n\n function makeAs (alias) {\n return function () {\n return this.as(alias);\n };\n }\n\n var asMilliseconds = makeAs('ms');\n var asSeconds = makeAs('s');\n var asMinutes = makeAs('m');\n var asHours = makeAs('h');\n var asDays = makeAs('d');\n var asWeeks = makeAs('w');\n var asMonths = makeAs('M');\n var asYears = makeAs('y');\n\n function get$2 (units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n\n var milliseconds = makeGetter('milliseconds');\n var seconds = makeGetter('seconds');\n var minutes = makeGetter('minutes');\n var hours = makeGetter('hours');\n var days = makeGetter('days');\n var months = makeGetter('months');\n var years = makeGetter('years');\n\n function weeks () {\n return absFloor(this.days() / 7);\n }\n\n var round = Math.round;\n var thresholds = {\n ss: 44, // a few seconds to seconds\n s : 45, // seconds to minute\n m : 45, // minutes to hour\n h : 22, // hours to day\n d : 26, // days to month\n M : 11 // months to year\n };\n\n// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n\n function relativeTime$1 (posNegDuration, withoutSuffix, locale) {\n var duration = createDuration(posNegDuration).abs();\n var seconds = round(duration.as('s'));\n var minutes = round(duration.as('m'));\n var hours = round(duration.as('h'));\n var days = round(duration.as('d'));\n var months = round(duration.as('M'));\n var years = round(duration.as('y'));\n\n var a = seconds <= thresholds.ss && ['s', seconds] ||\n seconds < thresholds.s && ['ss', seconds] ||\n minutes <= 1 && ['m'] ||\n minutes < thresholds.m && ['mm', minutes] ||\n hours <= 1 && ['h'] ||\n hours < thresholds.h && ['hh', hours] ||\n days <= 1 && ['d'] ||\n days < thresholds.d && ['dd', days] ||\n months <= 1 && ['M'] ||\n months < thresholds.M && ['MM', months] ||\n years <= 1 && ['y'] || ['yy', years];\n\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n// This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding (roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof(roundingFunction) === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n// This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold (threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n\n function humanize (withSuffix) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var locale = this.localeData();\n var output = relativeTime$1(this, !withSuffix, locale);\n\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n\n return locale.postformat(output);\n }\n\n var abs$1 = Math.abs;\n\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n\n var seconds = abs$1(this._milliseconds) / 1000;\n var days = abs$1(this._days);\n var months = abs$1(this._months);\n var minutes, hours, years;\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n var Y = years;\n var M = months;\n var D = days;\n var h = hours;\n var m = minutes;\n var s = seconds;\n var total = this.asSeconds();\n\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n return (total < 0 ? '-' : '') +\n 'P' +\n (Y ? Y + 'Y' : '') +\n (M ? M + 'M' : '') +\n (D ? D + 'D' : '') +\n ((h || m || s) ? 'T' : '') +\n (h ? h + 'H' : '') +\n (m ? m + 'M' : '') +\n (s ? s + 'S' : '');\n }\n\n var proto$2 = Duration.prototype;\n\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n\n// Deprecations\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n// Side effect imports\n\n// FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n// PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input, 10) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n// Side effect imports\n\n\n hooks.version = '2.18.1';\n\n setHookCallback(createLocal);\n\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n return hooks;\n\n })));\n\n},{}],7:[function(require,module,exports){\n /**\n * @namespace Chart\n */\n var Chart = require(29)();\n\n Chart.helpers = require(45);\n\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n require(27)(Chart);\n\n Chart.defaults = require(25);\n Chart.Element = require(26);\n Chart.elements = require(40);\n Chart.Interaction = require(28);\n Chart.platform = require(48);\n\n require(31)(Chart);\n require(22)(Chart);\n require(23)(Chart);\n require(24)(Chart);\n require(30)(Chart);\n require(33)(Chart);\n require(32)(Chart);\n require(35)(Chart);\n\n require(54)(Chart);\n require(52)(Chart);\n require(53)(Chart);\n require(55)(Chart);\n require(56)(Chart);\n require(57)(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\n require(15)(Chart);\n require(16)(Chart);\n require(17)(Chart);\n require(18)(Chart);\n require(19)(Chart);\n require(20)(Chart);\n require(21)(Chart);\n\n require(8)(Chart);\n require(9)(Chart);\n require(10)(Chart);\n require(11)(Chart);\n require(12)(Chart);\n require(13)(Chart);\n require(14)(Chart);\n\n// Loading built-it plugins\n var plugins = [];\n\n plugins.push(\n require(49)(Chart),\n require(50)(Chart),\n require(51)(Chart)\n );\n\n Chart.plugins.register(plugins);\n\n Chart.platform.initialize();\n\n module.exports = Chart;\n if (typeof window !== 'undefined') {\n window.Chart = Chart;\n }\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.canvasHelpers = Chart.helpers.canvas;\n\n},{\"10\":10,\"11\":11,\"12\":12,\"13\":13,\"14\":14,\"15\":15,\"16\":16,\"17\":17,\"18\":18,\"19\":19,\"20\":20,\"21\":21,\"22\":22,\"23\":23,\"24\":24,\"25\":25,\"26\":26,\"27\":27,\"28\":28,\"29\":29,\"30\":30,\"31\":31,\"32\":32,\"33\":33,\"35\":35,\"40\":40,\"45\":45,\"48\":48,\"49\":49,\"50\":50,\"51\":51,\"52\":52,\"53\":53,\"54\":54,\"55\":55,\"56\":56,\"57\":57,\"8\":8,\"9\":9}],8:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bar = function(context, config) {\n config.type = 'bar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],9:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Bubble = function(context, config) {\n config.type = 'bubble';\n return new Chart(context, config);\n };\n\n };\n\n},{}],10:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Doughnut = function(context, config) {\n config.type = 'doughnut';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],11:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Line = function(context, config) {\n config.type = 'line';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],12:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.PolarArea = function(context, config) {\n config.type = 'polarArea';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],13:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n Chart.Radar = function(context, config) {\n config.type = 'radar';\n\n return new Chart(context, config);\n };\n\n };\n\n},{}],14:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n Chart.Scatter = function(context, config) {\n config.type = 'scatter';\n return new Chart(context, config);\n };\n };\n\n},{}],15:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bar', {\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n\n // Specific to Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }],\n\n yAxes: [{\n type: 'linear'\n }]\n }\n });\n\n defaults._set('horizontalBar', {\n hover: {\n mode: 'index',\n axis: 'y'\n },\n\n scales: {\n xAxes: [{\n type: 'linear',\n position: 'bottom'\n }],\n\n yAxes: [{\n position: 'left',\n type: 'category',\n\n // Specific to Horizontal Bar Controller\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n\n // offset settings\n offset: true,\n\n // grid line settings\n gridLines: {\n offsetGridLines: true\n }\n }]\n },\n\n elements: {\n rectangle: {\n borderSkipped: 'left'\n }\n },\n\n tooltips: {\n callbacks: {\n title: function(item, data) {\n // Pick first xLabel for now\n var title = '';\n\n if (item.length > 0) {\n if (item[0].yLabel) {\n title = item[0].yLabel;\n } else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n title = data.labels[item[0].index];\n }\n }\n\n return title;\n },\n\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n return datasetLabel + ': ' + item.xLabel;\n }\n },\n mode: 'index',\n axis: 'y'\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.bar = Chart.DatasetController.extend({\n\n dataElementType: elements.Rectangle,\n\n initialize: function() {\n var me = this;\n var meta;\n\n Chart.DatasetController.prototype.initialize.apply(me, arguments);\n\n meta = me.getMeta();\n meta.stack = me.getDataset().stack;\n meta.bar = true;\n },\n\n update: function(reset) {\n var me = this;\n var rects = me.getMeta().data;\n var i, ilen;\n\n me._ruler = me.getRuler();\n\n for (i = 0, ilen = rects.length; i < ilen; ++i) {\n me.updateElement(rects[i], i, reset);\n }\n },\n\n updateElement: function(rectangle, index, reset) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n var custom = rectangle.custom || {};\n var rectangleOptions = chart.options.elements.rectangle;\n\n rectangle._xScale = me.getScaleForId(meta.xAxisID);\n rectangle._yScale = me.getScaleForId(meta.yAxisID);\n rectangle._datasetIndex = me.index;\n rectangle._index = index;\n\n rectangle._model = {\n datasetLabel: dataset.label,\n label: chart.data.labels[index],\n borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n };\n\n me.updateElementGeometry(rectangle, index, reset);\n\n rectangle.pivot();\n },\n\n /**\n * @private\n */\n updateElementGeometry: function(rectangle, index, reset) {\n var me = this;\n var model = rectangle._model;\n var vscale = me.getValueScale();\n var base = vscale.getBasePixel();\n var horizontal = vscale.isHorizontal();\n var ruler = me._ruler || me.getRuler();\n var vpixels = me.calculateBarValuePixels(me.index, index);\n var ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n model.horizontal = horizontal;\n model.base = reset ? base : vpixels.base;\n model.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n model.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n model.height = horizontal ? ipixels.size : undefined;\n model.width = horizontal ? undefined : ipixels.size;\n },\n\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().yAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getValueScale: function() {\n return this.getScaleForId(this.getValueScaleId());\n },\n\n /**\n * @private\n */\n getIndexScale: function() {\n return this.getScaleForId(this.getIndexScaleId());\n },\n\n /**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n getStackCount: function(last) {\n var me = this;\n var chart = me.chart;\n var scale = me.getIndexScale();\n var stacked = scale.options.stacked;\n var ilen = last === undefined ? chart.data.datasets.length : last + 1;\n var stacks = [];\n var i, meta;\n\n for (i = 0; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n if (meta.bar && chart.isDatasetVisible(i) &&\n (stacked === false ||\n (stacked === true && stacks.indexOf(meta.stack) === -1) ||\n (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n stacks.push(meta.stack);\n }\n }\n\n return stacks.length;\n },\n\n /**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @private\n */\n getStackIndex: function(datasetIndex) {\n return this.getStackCount(datasetIndex) - 1;\n },\n\n /**\n * @private\n */\n getRuler: function() {\n var me = this;\n var scale = me.getIndexScale();\n var stackCount = me.getStackCount();\n var datasetIndex = me.index;\n var pixels = [];\n var isHorizontal = scale.isHorizontal();\n var start = isHorizontal ? scale.left : scale.top;\n var end = start + (isHorizontal ? scale.width : scale.height);\n var i, ilen;\n\n for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n pixels.push(scale.getPixelForValue(null, i, datasetIndex));\n }\n\n return {\n pixels: pixels,\n start: start,\n end: end,\n stackCount: stackCount,\n scale: scale\n };\n },\n\n /**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n calculateBarValuePixels: function(datasetIndex, index) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var scale = me.getValueScale();\n var datasets = chart.data.datasets;\n var value = scale.getRightValue(datasets[datasetIndex].data[index]);\n var stacked = scale.options.stacked;\n var stack = meta.stack;\n var start = 0;\n var i, imeta, ivalue, base, head, size;\n\n if (stacked || (stacked === undefined && stack !== undefined)) {\n for (i = 0; i < datasetIndex; ++i) {\n imeta = chart.getDatasetMeta(i);\n\n if (imeta.bar &&\n imeta.stack === stack &&\n imeta.controller.getValueScaleId() === scale.id &&\n chart.isDatasetVisible(i)) {\n\n ivalue = scale.getRightValue(datasets[i].data[index]);\n if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n start += ivalue;\n }\n }\n }\n }\n\n base = scale.getPixelForValue(start);\n head = scale.getPixelForValue(start + value);\n size = (head - base) / 2;\n\n return {\n size: size,\n base: base,\n head: head,\n center: head + size / 2\n };\n },\n\n /**\n * @private\n */\n calculateBarIndexPixels: function(datasetIndex, index, ruler) {\n var me = this;\n var options = ruler.scale.options;\n var stackIndex = me.getStackIndex(datasetIndex);\n var pixels = ruler.pixels;\n var base = pixels[index];\n var length = pixels.length;\n var start = ruler.start;\n var end = ruler.end;\n var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size;\n\n if (length === 1) {\n leftSampleSize = base > start ? base - start : end - base;\n rightSampleSize = base < end ? end - base : base - start;\n } else {\n if (index > 0) {\n leftSampleSize = (base - pixels[index - 1]) / 2;\n if (index === length - 1) {\n rightSampleSize = leftSampleSize;\n }\n }\n if (index < length - 1) {\n rightSampleSize = (pixels[index + 1] - base) / 2;\n if (index === 0) {\n leftSampleSize = rightSampleSize;\n }\n }\n }\n\n leftCategorySize = leftSampleSize * options.categoryPercentage;\n rightCategorySize = rightSampleSize * options.categoryPercentage;\n fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount;\n size = fullBarSize * options.barPercentage;\n\n size = Math.min(\n helpers.valueOrDefault(options.barThickness, size),\n helpers.valueOrDefault(options.maxBarThickness, Infinity));\n\n base -= leftCategorySize;\n base += fullBarSize * stackIndex;\n base += (fullBarSize - size) / 2;\n\n return {\n size: size,\n base: base,\n head: base + size,\n center: base + size / 2\n };\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var scale = me.getValueScale();\n var rects = me.getMeta().data;\n var dataset = me.getDataset();\n var ilen = rects.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n for (; i < ilen; ++i) {\n if (!isNaN(scale.getRightValue(dataset.data[i]))) {\n rects[i].draw();\n }\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n },\n\n setHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(rectangle) {\n var dataset = this.chart.data.datasets[rectangle._datasetIndex];\n var index = rectangle._index;\n var custom = rectangle.custom || {};\n var model = rectangle._model;\n var rectangleElementOptions = this.chart.options.elements.rectangle;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n }\n });\n\n Chart.controllers.horizontalBar = Chart.controllers.bar.extend({\n /**\n * @private\n */\n getValueScaleId: function() {\n return this.getMeta().xAxisID;\n },\n\n /**\n * @private\n */\n getIndexScaleId: function() {\n return this.getMeta().yAxisID;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],16:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('bubble', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n type: 'linear', // bubble should probably use a linear scale by default\n position: 'bottom',\n id: 'x-axis-0' // need an ID so datasets can reference the scale\n }],\n yAxes: [{\n type: 'linear',\n position: 'left',\n id: 'y-axis-0'\n }]\n },\n\n tooltips: {\n callbacks: {\n title: function() {\n // Title doesn't make sense for scatter since we format the data as a point\n return '';\n },\n label: function(item, data) {\n var datasetLabel = data.datasets[item.datasetIndex].label || '';\n var dataPoint = data.datasets[item.datasetIndex].data[item.index];\n return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n }\n }\n }\n });\n\n\n module.exports = function(Chart) {\n\n Chart.controllers.bubble = Chart.DatasetController.extend({\n /**\n * @protected\n */\n dataElementType: elements.Point,\n\n /**\n * @protected\n */\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var points = meta.data;\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n });\n },\n\n /**\n * @protected\n */\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var xScale = me.getScaleForId(meta.xAxisID);\n var yScale = me.getScaleForId(meta.yAxisID);\n var options = me._resolveElementOptions(point, index);\n var data = me.getDataset().data[index];\n var dsIndex = me.index;\n\n var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\n var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n point._xScale = xScale;\n point._yScale = yScale;\n point._options = options;\n point._datasetIndex = dsIndex;\n point._index = index;\n point._model = {\n backgroundColor: options.backgroundColor,\n borderColor: options.borderColor,\n borderWidth: options.borderWidth,\n hitRadius: options.hitRadius,\n pointStyle: options.pointStyle,\n radius: reset ? 0 : options.radius,\n skip: custom.skip || isNaN(x) || isNaN(y),\n x: x,\n y: y,\n };\n\n point.pivot();\n },\n\n /**\n * @protected\n */\n setHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n model.radius = options.radius + options.hoverRadius;\n },\n\n /**\n * @protected\n */\n removeHoverStyle: function(point) {\n var model = point._model;\n var options = point._options;\n\n model.backgroundColor = options.backgroundColor;\n model.borderColor = options.borderColor;\n model.borderWidth = options.borderWidth;\n model.radius = options.radius;\n },\n\n /**\n * @private\n */\n _resolveElementOptions: function(point, index) {\n var me = this;\n var chart = me.chart;\n var datasets = chart.data.datasets;\n var dataset = datasets[me.index];\n var custom = point.custom || {};\n var options = chart.options.elements.point;\n var resolve = helpers.options.resolve;\n var data = dataset.data[index];\n var values = {};\n var i, ilen, key;\n\n // Scriptable options\n var context = {\n chart: chart,\n dataIndex: index,\n dataset: dataset,\n datasetIndex: me.index\n };\n\n var keys = [\n 'backgroundColor',\n 'borderColor',\n 'borderWidth',\n 'hoverBackgroundColor',\n 'hoverBorderColor',\n 'hoverBorderWidth',\n 'hoverRadius',\n 'hitRadius',\n 'pointStyle'\n ];\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n values[key] = resolve([\n custom[key],\n dataset[key],\n options[key]\n ], context, index);\n }\n\n // Custom radius resolution\n values.radius = resolve([\n custom.radius,\n data ? data.r : undefined,\n dataset.radius,\n options.radius\n ], context, index);\n\n return values;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],17:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('doughnut', {\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\n animateScale: false\n },\n hover: {\n mode: 'single'\n },\n legendCallback: function(chart) {\n var text = [];\n text.push('
          ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
        • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
        • ');\n }\n }\n\n text.push('
        ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc && arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n // toggle visibility of index if exists\n if (meta.data[index]) {\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n }\n\n chart.update();\n }\n },\n\n // The percentage of the chart that we cut out of the middle.\n cutoutPercentage: 50,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: Math.PI * -0.5,\n\n // The total circumference of the chart.\n circumference: Math.PI * 2.0,\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(tooltipItem, data) {\n var dataLabel = data.labels[tooltipItem.index];\n var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n if (helpers.isArray(dataLabel)) {\n // show value on first line of multiline label\n // need to clone because we are changing the value\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n\n return dataLabel;\n }\n }\n }\n });\n\n defaults._set('pie', helpers.clone(defaults.doughnut));\n defaults._set('pie', {\n cutoutPercentage: 0\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n getRingIndex: function(datasetIndex) {\n var ringIndex = 0;\n\n for (var j = 0; j < datasetIndex; ++j) {\n if (this.chart.isDatasetVisible(j)) {\n ++ringIndex;\n }\n }\n\n return ringIndex;\n },\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n var minSize = Math.min(availableWidth, availableHeight);\n var offset = {x: 0, y: 0};\n var meta = me.getMeta();\n var cutoutPercentage = opts.cutoutPercentage;\n var circumference = opts.circumference;\n\n // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n if (circumference < Math.PI * 2.0) {\n var startAngle = opts.rotation % (Math.PI * 2.0);\n startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n var endAngle = startAngle + circumference;\n var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n var cutout = cutoutPercentage / 100.0;\n var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n minSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n }\n\n chart.borderWidth = me.getMaxBorderWidth(meta.data);\n chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n chart.offsetX = offset.x * chart.outerRadius;\n chart.offsetY = offset.y * chart.outerRadius;\n\n meta.total = me.calculateTotal();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var opts = chart.options;\n var animationOpts = opts.animation;\n var centerX = (chartArea.left + chartArea.right) / 2;\n var centerY = (chartArea.top + chartArea.bottom) / 2;\n var startAngle = opts.rotation; // non reset case handled later\n var endAngle = opts.rotation; // non reset case handled later\n var dataset = me.getDataset();\n var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n\n // Desired view properties\n _model: {\n x: centerX + chart.offsetX,\n y: centerY + chart.offsetY,\n startAngle: startAngle,\n endAngle: endAngle,\n circumference: circumference,\n outerRadius: outerRadius,\n innerRadius: innerRadius,\n label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n }\n });\n\n var model = arc._model;\n // Resets the visual styles\n this.removeHoverStyle(arc);\n\n // Set correct angles if not resetting\n if (!reset || !animationOpts.animateRotate) {\n if (index === 0) {\n model.startAngle = opts.rotation;\n } else {\n model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n }\n\n model.endAngle = model.startAngle + model.circumference;\n }\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n calculateTotal: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var total = 0;\n var value;\n\n helpers.each(meta.data, function(element, index) {\n value = dataset.data[index];\n if (!isNaN(value) && !element.hidden) {\n total += Math.abs(value);\n }\n });\n\n\t\t\t\t/* if (total === 0) {\n\t\t\t\t total = NaN;\n\t\t\t\t }*/\n\n return total;\n },\n\n calculateCircumference: function(value) {\n var total = this.getMeta().total;\n if (total > 0 && !isNaN(value)) {\n return (Math.PI * 2.0) * (value / total);\n }\n return 0;\n },\n\n // gets the max border or hover width to properly scale pie charts\n getMaxBorderWidth: function(arcs) {\n var max = 0;\n var index = this.index;\n var length = arcs.length;\n var borderWidth;\n var hoverWidth;\n\n for (var i = 0; i < length; i++) {\n borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n max = borderWidth > max ? borderWidth : max;\n max = hoverWidth > max ? hoverWidth : max;\n }\n return max;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],18:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('line', {\n showLines: true,\n spanGaps: false,\n\n hover: {\n mode: 'label'\n },\n\n scales: {\n xAxes: [{\n type: 'category',\n id: 'x-axis-0'\n }],\n yAxes: [{\n type: 'linear',\n id: 'y-axis-0'\n }]\n }\n });\n\n module.exports = function(Chart) {\n\n function lineEnabled(dataset, options) {\n return helpers.valueOrDefault(dataset.showLine, options.showLines);\n }\n\n Chart.controllers.line = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data || [];\n var options = me.chart.options;\n var lineElementOptions = options.elements.line;\n var scale = me.getScaleForId(meta.yAxisID);\n var i, ilen, custom;\n var dataset = me.getDataset();\n var showLine = lineEnabled(dataset, options);\n\n // Update Line\n if (showLine) {\n custom = line.custom || {};\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n // Utility\n line._scale = scale;\n line._datasetIndex = me.index;\n // Data\n line._children = points;\n // Model\n line._model = {\n // Appearance\n // The default behavior of lines is to break at null values, according\n // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n // This option gives lines the ability to span gaps\n spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n };\n\n line.pivot();\n }\n\n // Update Points\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n me.updateElement(points[i], i, reset);\n }\n\n if (showLine && line._model.tension !== 0) {\n me.updateBezierControlPoints();\n }\n\n // Now pivot the point for animation\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n points[i].pivot();\n }\n },\n\n getPointBackgroundColor: function(point, index) {\n var backgroundColor = this.chart.options.elements.point.backgroundColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.backgroundColor) {\n backgroundColor = custom.backgroundColor;\n } else if (dataset.pointBackgroundColor) {\n backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n } else if (dataset.backgroundColor) {\n backgroundColor = dataset.backgroundColor;\n }\n\n return backgroundColor;\n },\n\n getPointBorderColor: function(point, index) {\n var borderColor = this.chart.options.elements.point.borderColor;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (custom.borderColor) {\n borderColor = custom.borderColor;\n } else if (dataset.pointBorderColor) {\n borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n } else if (dataset.borderColor) {\n borderColor = dataset.borderColor;\n }\n\n return borderColor;\n },\n\n getPointBorderWidth: function(point, index) {\n var borderWidth = this.chart.options.elements.point.borderWidth;\n var dataset = this.getDataset();\n var custom = point.custom || {};\n\n if (!isNaN(custom.borderWidth)) {\n borderWidth = custom.borderWidth;\n } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n } else if (!isNaN(dataset.borderWidth)) {\n borderWidth = dataset.borderWidth;\n }\n\n return borderWidth;\n },\n\n updateElement: function(point, index, reset) {\n var me = this;\n var meta = me.getMeta();\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var datasetIndex = me.index;\n var value = dataset.data[index];\n var yScale = me.getScaleForId(meta.yAxisID);\n var xScale = me.getScaleForId(meta.xAxisID);\n var pointOptions = me.chart.options.elements.point;\n var x, y;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\n y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n // Utility\n point._xScale = xScale;\n point._yScale = yScale;\n point._datasetIndex = datasetIndex;\n point._index = index;\n\n // Desired view properties\n point._model = {\n x: x,\n y: y,\n skip: custom.skip || isNaN(x) || isNaN(y),\n // Appearance\n radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n backgroundColor: me.getPointBackgroundColor(point, index),\n borderColor: me.getPointBorderColor(point, index),\n borderWidth: me.getPointBorderWidth(point, index),\n tension: meta.dataset._model ? meta.dataset._model.tension : 0,\n steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n // Tooltip\n hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n };\n },\n\n calculatePointY: function(value, index, datasetIndex) {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var yScale = me.getScaleForId(meta.yAxisID);\n var sumPos = 0;\n var sumNeg = 0;\n var i, ds, dsMeta;\n\n if (yScale.options.stacked) {\n for (i = 0; i < datasetIndex; i++) {\n ds = chart.data.datasets[i];\n dsMeta = chart.getDatasetMeta(i);\n if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n var stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n if (stackedRightValue < 0) {\n sumNeg += stackedRightValue || 0;\n } else {\n sumPos += stackedRightValue || 0;\n }\n }\n }\n\n var rightValue = Number(yScale.getRightValue(value));\n if (rightValue < 0) {\n return yScale.getPixelForValue(sumNeg + rightValue);\n }\n return yScale.getPixelForValue(sumPos + rightValue);\n }\n\n return yScale.getPixelForValue(value);\n },\n\n updateBezierControlPoints: function() {\n var me = this;\n var meta = me.getMeta();\n var area = me.chart.chartArea;\n var points = (meta.data || []);\n var i, ilen, point, model, controlPoints;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (meta.dataset._model.spanGaps) {\n points = points.filter(function(pt) {\n return !pt._model.skip;\n });\n }\n\n function capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n }\n\n if (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n helpers.splineCurveMonotone(points);\n } else {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n model = point._model;\n controlPoints = helpers.splineCurve(\n helpers.previousItem(points, i)._model,\n model,\n helpers.nextItem(points, i)._model,\n meta.dataset._model.tension\n );\n model.controlPointPreviousX = controlPoints.previous.x;\n model.controlPointPreviousY = controlPoints.previous.y;\n model.controlPointNextX = controlPoints.next.x;\n model.controlPointNextY = controlPoints.next.y;\n }\n }\n\n if (me.chart.options.elements.line.capBezierPoints) {\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n model = points[i]._model;\n model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n }\n }\n },\n\n draw: function() {\n var me = this;\n var chart = me.chart;\n var meta = me.getMeta();\n var points = meta.data || [];\n var area = chart.chartArea;\n var ilen = points.length;\n var i = 0;\n\n helpers.canvas.clipArea(chart.ctx, area);\n\n if (lineEnabled(me.getDataset(), chart.options)) {\n meta.dataset.draw();\n }\n\n helpers.canvas.unclipArea(chart.ctx);\n\n // Draw the points\n for (; i < ilen; ++i) {\n points[i].draw(area);\n }\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var me = this;\n var dataset = me.chart.data.datasets[point._datasetIndex];\n var index = point._index;\n var custom = point.custom || {};\n var model = point._model;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n\n model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n model.backgroundColor = me.getPointBackgroundColor(point, index);\n model.borderColor = me.getPointBorderColor(point, index);\n model.borderWidth = me.getPointBorderWidth(point, index);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],19:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('polarArea', {\n scale: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n gridLines: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n ticks: {\n beginAtZero: true\n }\n },\n\n // Boolean - Whether to animate the rotation of the chart\n animation: {\n animateRotate: true,\n animateScale: true\n },\n\n startAngle: -0.5 * Math.PI,\n legendCallback: function(chart) {\n var text = [];\n text.push('
          ');\n\n var data = chart.data;\n var datasets = data.datasets;\n var labels = data.labels;\n\n if (datasets.length) {\n for (var i = 0; i < datasets[0].data.length; ++i) {\n text.push('
        • ');\n if (labels[i]) {\n text.push(labels[i]);\n }\n text.push('
        • ');\n }\n }\n\n text.push('
        ');\n return text.join('');\n },\n legend: {\n labels: {\n generateLabels: function(chart) {\n var data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map(function(label, i) {\n var meta = chart.getDatasetMeta(0);\n var ds = data.datasets[0];\n var arc = meta.data[i];\n var custom = arc.custom || {};\n var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n var arcOpts = chart.options.elements.arc;\n var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n return {\n text: label,\n fillStyle: fill,\n strokeStyle: stroke,\n lineWidth: bw,\n hidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick: function(e, legendItem) {\n var index = legendItem.index;\n var chart = this.chart;\n var i, ilen, meta;\n\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n meta = chart.getDatasetMeta(i);\n meta.data[index].hidden = !meta.data[index].hidden;\n }\n\n chart.update();\n }\n },\n\n // Need to override these to give a nice default\n tooltips: {\n callbacks: {\n title: function() {\n return '';\n },\n label: function(item, data) {\n return data.labels[item.index] + ': ' + item.yLabel;\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.polarArea = Chart.DatasetController.extend({\n\n dataElementType: elements.Arc,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var chart = me.chart;\n var chartArea = chart.chartArea;\n var meta = me.getMeta();\n var opts = chart.options;\n var arcOpts = opts.elements.arc;\n var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n me.innerRadius = me.outerRadius - chart.radiusLength;\n\n meta.count = me.countVisibleElements();\n\n helpers.each(meta.data, function(arc, index) {\n me.updateElement(arc, index, reset);\n });\n },\n\n updateElement: function(arc, index, reset) {\n var me = this;\n var chart = me.chart;\n var dataset = me.getDataset();\n var opts = chart.options;\n var animationOpts = opts.animation;\n var scale = chart.scale;\n var labels = chart.data.labels;\n\n var circumference = me.calculateCircumference(dataset.data[index]);\n var centerX = scale.xCenter;\n var centerY = scale.yCenter;\n\n // If there is NaN data before us, we need to calculate the starting angle correctly.\n // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n var visibleCount = 0;\n var meta = me.getMeta();\n for (var i = 0; i < index; ++i) {\n if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n ++visibleCount;\n }\n }\n\n // var negHalfPI = -0.5 * Math.PI;\n var datasetStartAngle = opts.startAngle;\n var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n var startAngle = datasetStartAngle + (circumference * visibleCount);\n var endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n helpers.extend(arc, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius: reset ? resetRadius : distance,\n startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n label: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n }\n });\n\n // Apply border and fill style\n me.removeHoverStyle(arc);\n\n arc.pivot();\n },\n\n removeHoverStyle: function(arc) {\n Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n },\n\n countVisibleElements: function() {\n var dataset = this.getDataset();\n var meta = this.getMeta();\n var count = 0;\n\n helpers.each(meta.data, function(element, index) {\n if (!isNaN(dataset.data[index]) && !element.hidden) {\n count++;\n }\n });\n\n return count;\n },\n\n calculateCircumference: function(value) {\n var count = this.getMeta().count;\n if (count > 0 && !isNaN(value)) {\n return (2 * Math.PI) / count;\n }\n return 0;\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],20:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('radar', {\n scale: {\n type: 'radialLinear'\n },\n elements: {\n line: {\n tension: 0 // no bezier in radar\n }\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.controllers.radar = Chart.DatasetController.extend({\n\n datasetElementType: elements.Line,\n\n dataElementType: elements.Point,\n\n linkScales: helpers.noop,\n\n update: function(reset) {\n var me = this;\n var meta = me.getMeta();\n var line = meta.dataset;\n var points = meta.data;\n var custom = line.custom || {};\n var dataset = me.getDataset();\n var lineElementOptions = me.chart.options.elements.line;\n var scale = me.chart.scale;\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n dataset.lineTension = dataset.tension;\n }\n\n helpers.extend(meta.dataset, {\n // Utility\n _datasetIndex: me.index,\n _scale: scale,\n // Data\n _children: points,\n _loop: true,\n // Model\n _model: {\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n }\n });\n\n meta.dataset.pivot();\n\n // Update Points\n helpers.each(points, function(point, index) {\n me.updateElement(point, index, reset);\n }, me);\n\n // Update bezier control points\n me.updateBezierControlPoints();\n },\n updateElement: function(point, index, reset) {\n var me = this;\n var custom = point.custom || {};\n var dataset = me.getDataset();\n var scale = me.chart.scale;\n var pointElementOptions = me.chart.options.elements.point;\n var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n // Compatibility: If the properties are defined with only the old name, use those values\n if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n dataset.pointRadius = dataset.radius;\n }\n if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n dataset.pointHitRadius = dataset.hitRadius;\n }\n\n helpers.extend(point, {\n // Utility\n _datasetIndex: me.index,\n _index: index,\n _scale: scale,\n\n // Desired view properties\n _model: {\n x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n y: reset ? scale.yCenter : pointPosition.y,\n\n // Appearance\n tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n // Tooltip\n hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n }\n });\n\n point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n },\n updateBezierControlPoints: function() {\n var chartArea = this.chart.chartArea;\n var meta = this.getMeta();\n\n helpers.each(meta.data, function(point, index) {\n var model = point._model;\n var controlPoints = helpers.splineCurve(\n helpers.previousItem(meta.data, index, true)._model,\n model,\n helpers.nextItem(meta.data, index, true)._model,\n model.tension\n );\n\n // Prevent the bezier going outside of the bounds of the graph\n model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n // Now pivot the point for animation\n point.pivot();\n });\n },\n\n setHoverStyle: function(point) {\n // Point\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n\n model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n },\n\n removeHoverStyle: function(point) {\n var dataset = this.chart.data.datasets[point._datasetIndex];\n var custom = point.custom || {};\n var index = point._index;\n var model = point._model;\n var pointElementOptions = this.chart.options.elements.point;\n\n model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n }\n });\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],21:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('scatter', {\n hover: {\n mode: 'single'\n },\n\n scales: {\n xAxes: [{\n id: 'x-axis-1', // need an ID so datasets can reference the scale\n type: 'linear', // scatter should not use a category axis\n position: 'bottom'\n }],\n yAxes: [{\n id: 'y-axis-1',\n type: 'linear',\n position: 'left'\n }]\n },\n\n showLines: false,\n\n tooltips: {\n callbacks: {\n title: function() {\n return ''; // doesn't make sense for scatter since data are formatted as a point\n },\n label: function(item) {\n return '(' + item.xLabel + ', ' + item.yLabel + ')';\n }\n }\n }\n });\n\n module.exports = function(Chart) {\n\n // Scatter charts use line controllers\n Chart.controllers.scatter = Chart.controllers.line;\n\n };\n\n},{\"25\":25}],22:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n animation: {\n duration: 1000,\n easing: 'easeOutQuart',\n onProgress: helpers.noop,\n onComplete: helpers.noop\n }\n });\n\n module.exports = function(Chart) {\n\n Chart.Animation = Element.extend({\n chart: null, // the animation associated chart instance\n currentStep: 0, // the current animation step\n numSteps: 60, // default number of steps\n easing: '', // the easing to use for this animation\n render: null, // render function used by the animation service\n\n onAnimationProgress: null, // user specified callback to fire on each step of the animation\n onAnimationComplete: null, // user specified callback to fire when the animation finishes\n });\n\n Chart.animationService = {\n frameDuration: 17,\n animations: [],\n dropFrames: 0,\n request: null,\n\n /**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {Number} duration - The animation duration in ms.\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n addAnimation: function(chart, animation, duration, lazy) {\n var animations = this.animations;\n var i, ilen;\n\n animation.chart = chart;\n\n if (!lazy) {\n chart.animating = true;\n }\n\n for (i = 0, ilen = animations.length; i < ilen; ++i) {\n if (animations[i].chart === chart) {\n animations[i] = animation;\n return;\n }\n }\n\n animations.push(animation);\n\n // If there are no animations queued, manually kickstart a digest, for lack of a better word\n if (animations.length === 1) {\n this.requestAnimationFrame();\n }\n },\n\n cancelAnimation: function(chart) {\n var index = helpers.findIndex(this.animations, function(animation) {\n return animation.chart === chart;\n });\n\n if (index !== -1) {\n this.animations.splice(index, 1);\n chart.animating = false;\n }\n },\n\n requestAnimationFrame: function() {\n var me = this;\n if (me.request === null) {\n // Skip animation frame requests until the active one is executed.\n // This can happen when processing mouse events, e.g. 'mousemove'\n // and 'mouseout' events will trigger multiple renders.\n me.request = helpers.requestAnimFrame.call(window, function() {\n me.request = null;\n me.startDigest();\n });\n }\n },\n\n /**\n * @private\n */\n startDigest: function() {\n var me = this;\n var startTime = Date.now();\n var framesToDrop = 0;\n\n if (me.dropFrames > 1) {\n framesToDrop = Math.floor(me.dropFrames);\n me.dropFrames = me.dropFrames % 1;\n }\n\n me.advance(1 + framesToDrop);\n\n var endTime = Date.now();\n\n me.dropFrames += (endTime - startTime) / me.frameDuration;\n\n // Do we have more stuff to animate?\n if (me.animations.length > 0) {\n me.requestAnimationFrame();\n }\n },\n\n /**\n * @private\n */\n advance: function(count) {\n var animations = this.animations;\n var animation, chart;\n var i = 0;\n\n while (i < animations.length) {\n animation = animations[i];\n chart = animation.chart;\n\n animation.currentStep = (animation.currentStep || 0) + count;\n animation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n helpers.callback(animation.render, [chart, animation], chart);\n helpers.callback(animation.onAnimationProgress, [animation], chart);\n\n if (animation.currentStep >= animation.numSteps) {\n helpers.callback(animation.onAnimationComplete, [animation], chart);\n chart.animating = false;\n animations.splice(i, 1);\n } else {\n ++i;\n }\n }\n }\n };\n\n /**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n Object.defineProperty(Chart.Animation.prototype, 'animationObject', {\n get: function() {\n return this;\n }\n });\n\n /**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n Object.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n get: function() {\n return this.chart;\n },\n set: function(value) {\n this.chart = value;\n }\n });\n\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],23:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Interaction = require(28);\n var platform = require(48);\n\n module.exports = function(Chart) {\n var plugins = Chart.plugins;\n\n // Create a dictionary of chart types, to allow for extension of existing types\n Chart.types = {};\n\n // Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n // Destroy method on the chart will remove the instance of the chart from this reference.\n Chart.instances = {};\n\n // Controllers available for dataset visualization eg. bar, line, slice, etc.\n Chart.controllers = {};\n\n /**\n * Initializes the given config with global and chart default values.\n */\n function initConfig(config) {\n config = config || {};\n\n // Do NOT use configMerge() for the data object because this method merges arrays\n // and so would change references to labels and datasets, preventing data updates.\n var data = config.data = config.data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n\n config.options = helpers.configMerge(\n defaults.global,\n defaults[config.type],\n config.options || {});\n\n return config;\n }\n\n /**\n * Updates the config of the chart\n * @param chart {Chart} chart to update the options for\n */\n function updateConfig(chart) {\n var newOptions = chart.options;\n\n // Update Scale(s) with options\n if (newOptions.scale) {\n chart.scale.options = newOptions.scale;\n } else if (newOptions.scales) {\n newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n chart.scales[scaleOptions.id].options = scaleOptions;\n });\n }\n\n // Tooltip\n chart.tooltip._options = newOptions.tooltips;\n }\n\n function positionIsHorizontal(position) {\n return position === 'top' || position === 'bottom';\n }\n\n helpers.extend(Chart.prototype, /** @lends Chart */ {\n /**\n * @private\n */\n construct: function(item, config) {\n var me = this;\n\n config = initConfig(config);\n\n var context = platform.acquireContext(item, config);\n var canvas = context && context.canvas;\n var height = canvas && canvas.height;\n var width = canvas && canvas.width;\n\n me.id = helpers.uid();\n me.ctx = context;\n me.canvas = canvas;\n me.config = config;\n me.width = width;\n me.height = height;\n me.aspectRatio = height ? width / height : null;\n me.options = config.options;\n me._bufferedRender = false;\n\n /**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n me.chart = me;\n me.controller = me; // chart.chart.controller #inception\n\n // Add the chart instance to the global namespace\n Chart.instances[me.id] = me;\n\n // Define alias to the config data: `chart.data === chart.config.data`\n Object.defineProperty(me, 'data', {\n get: function() {\n return me.config.data;\n },\n set: function(value) {\n me.config.data = value;\n }\n });\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n me.initialize();\n me.update();\n },\n\n /**\n * @private\n */\n initialize: function() {\n var me = this;\n\n // Before init plugin notification\n plugins.notify(me, 'beforeInit');\n\n helpers.retinaScale(me, me.options.devicePixelRatio);\n\n me.bindEvents();\n\n if (me.options.responsive) {\n // Initial resize before chart draws (must be silent to preserve initial animations).\n me.resize(true);\n }\n\n // Make sure scales have IDs and are built before we build any controllers.\n me.ensureScalesHaveIDs();\n me.buildScales();\n me.initToolTip();\n\n // After init plugin notification\n plugins.notify(me, 'afterInit');\n\n return me;\n },\n\n clear: function() {\n helpers.canvas.clear(this);\n return this;\n },\n\n stop: function() {\n // Stops any current animation loop occurring\n Chart.animationService.cancelAnimation(this);\n return this;\n },\n\n resize: function(silent) {\n var me = this;\n var options = me.options;\n var canvas = me.canvas;\n var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n // the canvas render width and height will be casted to integers so make sure that\n // the canvas display style uses the same integer values to avoid blurring effect.\n\n // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased\n var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n if (me.width === newWidth && me.height === newHeight) {\n return;\n }\n\n canvas.width = me.width = newWidth;\n canvas.height = me.height = newHeight;\n canvas.style.width = newWidth + 'px';\n canvas.style.height = newHeight + 'px';\n\n helpers.retinaScale(me, options.devicePixelRatio);\n\n if (!silent) {\n // Notify any plugins about the resize\n var newSize = {width: newWidth, height: newHeight};\n plugins.notify(me, 'resize', [newSize]);\n\n // Notify of resize\n if (me.options.onResize) {\n me.options.onResize(me, newSize);\n }\n\n me.stop();\n me.update(me.options.responsiveAnimationDuration);\n }\n },\n\n ensureScalesHaveIDs: function() {\n var options = this.options;\n var scalesOptions = options.scales || {};\n var scaleOptions = options.scale;\n\n helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n });\n\n helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n });\n\n if (scaleOptions) {\n scaleOptions.id = scaleOptions.id || 'scale';\n }\n },\n\n /**\n * Builds a map of scale ID to scale object for future lookup.\n */\n buildScales: function() {\n var me = this;\n var options = me.options;\n var scales = me.scales = {};\n var items = [];\n\n if (options.scales) {\n items = items.concat(\n (options.scales.xAxes || []).map(function(xAxisOptions) {\n return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n }),\n (options.scales.yAxes || []).map(function(yAxisOptions) {\n return {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n })\n );\n }\n\n if (options.scale) {\n items.push({\n options: options.scale,\n dtype: 'radialLinear',\n isDefault: true,\n dposition: 'chartArea'\n });\n }\n\n helpers.each(items, function(item) {\n var scaleOptions = item.options;\n var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n var scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n if (!scaleClass) {\n return;\n }\n\n if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n\n var scale = new scaleClass({\n id: scaleOptions.id,\n options: scaleOptions,\n ctx: me.ctx,\n chart: me\n });\n\n scales[scale.id] = scale;\n scale.mergeTicksOptions();\n\n // TODO(SB): I think we should be able to remove this custom case (options.scale)\n // and consider it as a regular scale part of the \"scales\"\" map only! This would\n // make the logic easier and remove some useless? custom code.\n if (item.isDefault) {\n me.scale = scale;\n }\n });\n\n Chart.scaleService.addScalesToLayout(this);\n },\n\n buildOrUpdateControllers: function() {\n var me = this;\n var types = [];\n var newControllers = [];\n\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n var meta = me.getDatasetMeta(datasetIndex);\n var type = dataset.type || me.config.type;\n\n if (meta.type && meta.type !== type) {\n me.destroyDatasetMeta(datasetIndex);\n meta = me.getDatasetMeta(datasetIndex);\n }\n meta.type = type;\n\n types.push(meta.type);\n\n if (meta.controller) {\n meta.controller.updateIndex(datasetIndex);\n } else {\n var ControllerClass = Chart.controllers[meta.type];\n if (ControllerClass === undefined) {\n throw new Error('\"' + meta.type + '\" is not a chart type.');\n }\n\n meta.controller = new ControllerClass(me, datasetIndex);\n newControllers.push(meta.controller);\n }\n }, me);\n\n return newControllers;\n },\n\n /**\n * Reset the elements of all datasets\n * @private\n */\n resetElements: function() {\n var me = this;\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n },\n\n /**\n * Resets the chart back to it's state before the initial animation\n */\n reset: function() {\n this.resetElements();\n this.tooltip.initialize();\n },\n\n update: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n updateConfig(me);\n\n if (plugins.notify(me, 'beforeUpdate') === false) {\n return;\n }\n\n // In case the entire data object changed\n me.tooltip._data = me.data;\n\n // Make sure dataset controllers are updated and new controllers are reset\n var newControllers = me.buildOrUpdateControllers();\n\n // Make sure all dataset controllers have correct meta data counts\n helpers.each(me.data.datasets, function(dataset, datasetIndex) {\n me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n }, me);\n\n me.updateLayout();\n\n // Can only reset the new controllers after the scales have been updated\n helpers.each(newControllers, function(controller) {\n controller.reset();\n });\n\n me.updateDatasets();\n\n // Do this before render so that any plugins that need final scale updates can use it\n plugins.notify(me, 'afterUpdate');\n\n if (me._bufferedRender) {\n me._bufferedRequest = {\n duration: config.duration,\n easing: config.easing,\n lazy: config.lazy\n };\n } else {\n me.render(config);\n }\n },\n\n /**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n updateLayout: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeLayout') === false) {\n return;\n }\n\n Chart.layoutService.update(this, this.width, this.height);\n\n /**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n plugins.notify(me, 'afterScaleUpdate');\n plugins.notify(me, 'afterLayout');\n },\n\n /**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n updateDatasets: function() {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n return;\n }\n\n for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.updateDataset(i);\n }\n\n plugins.notify(me, 'afterDatasetsUpdate');\n },\n\n /**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n updateDataset: function(index) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index\n };\n\n if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n return;\n }\n\n meta.controller.update();\n\n plugins.notify(me, 'afterDatasetUpdate', [args]);\n },\n\n render: function(config) {\n var me = this;\n\n if (!config || typeof config !== 'object') {\n // backwards compatibility\n config = {\n duration: config,\n lazy: arguments[1]\n };\n }\n\n var duration = config.duration;\n var lazy = config.lazy;\n\n if (plugins.notify(me, 'beforeRender') === false) {\n return;\n }\n\n var animationOptions = me.options.animation;\n var onComplete = function(animation) {\n plugins.notify(me, 'afterRender');\n helpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n };\n\n if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n var animation = new Chart.Animation({\n numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n easing: config.easing || animationOptions.easing,\n\n render: function(chart, animationObject) {\n var easingFunction = helpers.easing.effects[animationObject.easing];\n var currentStep = animationObject.currentStep;\n var stepDecimal = currentStep / animationObject.numSteps;\n\n chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n },\n\n onAnimationProgress: animationOptions.onProgress,\n onAnimationComplete: onComplete\n });\n\n Chart.animationService.addAnimation(me, animation, duration, lazy);\n } else {\n me.draw();\n\n // See https://github.com/chartjs/Chart.js/issues/3781\n onComplete(new Chart.Animation({numSteps: 0, chart: me}));\n }\n\n return me;\n },\n\n draw: function(easingValue) {\n var me = this;\n\n me.clear();\n\n if (helpers.isNullOrUndef(easingValue)) {\n easingValue = 1;\n }\n\n me.transition(easingValue);\n\n if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw all the scales\n helpers.each(me.boxes, function(box) {\n box.draw(me.chartArea);\n }, me);\n\n if (me.scale) {\n me.scale.draw();\n }\n\n me.drawDatasets(easingValue);\n\n // Finally draw the tooltip\n me.tooltip.draw();\n\n plugins.notify(me, 'afterDraw', [easingValue]);\n },\n\n /**\n * @private\n */\n transition: function(easingValue) {\n var me = this;\n\n for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n if (me.isDatasetVisible(i)) {\n me.getDatasetMeta(i).controller.transition(easingValue);\n }\n }\n\n me.tooltip.transition(easingValue);\n },\n\n /**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n drawDatasets: function(easingValue) {\n var me = this;\n\n if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n return;\n }\n\n // Draw datasets reversed to support proper line stacking\n for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n if (me.isDatasetVisible(i)) {\n me.drawDataset(i, easingValue);\n }\n }\n\n plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n },\n\n /**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n drawDataset: function(index, easingValue) {\n var me = this;\n var meta = me.getDatasetMeta(index);\n var args = {\n meta: meta,\n index: index,\n easingValue: easingValue\n };\n\n if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n return;\n }\n\n meta.controller.draw(easingValue);\n\n plugins.notify(me, 'afterDatasetDraw', [args]);\n },\n\n // Get the single element that was clicked on\n // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n getElementAtEvent: function(e) {\n return Interaction.modes.single(this, e);\n },\n\n getElementsAtEvent: function(e) {\n return Interaction.modes.label(this, e, {intersect: true});\n },\n\n getElementsAtXAxis: function(e) {\n return Interaction.modes['x-axis'](this, e, {intersect: true});\n },\n\n getElementsAtEventForMode: function(e, mode, options) {\n var method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options);\n }\n\n return [];\n },\n\n getDatasetAtEvent: function(e) {\n return Interaction.modes.dataset(this, e, {intersect: true});\n },\n\n getDatasetMeta: function(datasetIndex) {\n var me = this;\n var dataset = me.data.datasets[datasetIndex];\n if (!dataset._meta) {\n dataset._meta = {};\n }\n\n var meta = dataset._meta[me.id];\n if (!meta) {\n meta = dataset._meta[me.id] = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\n xAxisID: null,\n yAxisID: null\n };\n }\n\n return meta;\n },\n\n getVisibleDatasetCount: function() {\n var count = 0;\n for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n if (this.isDatasetVisible(i)) {\n count++;\n }\n }\n return count;\n },\n\n isDatasetVisible: function(datasetIndex) {\n var meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n },\n\n generateLegend: function() {\n return this.options.legendCallback(this);\n },\n\n /**\n * @private\n */\n destroyDatasetMeta: function(datasetIndex) {\n var id = this.id;\n var dataset = this.data.datasets[datasetIndex];\n var meta = dataset._meta && dataset._meta[id];\n\n if (meta) {\n meta.controller.destroy();\n delete dataset._meta[id];\n }\n },\n\n destroy: function() {\n var me = this;\n var canvas = me.canvas;\n var i, ilen;\n\n me.stop();\n\n // dataset controllers need to cleanup associated data\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me.destroyDatasetMeta(i);\n }\n\n if (canvas) {\n me.unbindEvents();\n helpers.canvas.clear(me);\n platform.releaseContext(me.ctx);\n me.canvas = null;\n me.ctx = null;\n }\n\n plugins.notify(me, 'destroy');\n\n delete Chart.instances[me.id];\n },\n\n toBase64Image: function() {\n return this.canvas.toDataURL.apply(this.canvas, arguments);\n },\n\n initToolTip: function() {\n var me = this;\n me.tooltip = new Chart.Tooltip({\n _chart: me,\n _chartInstance: me, // deprecated, backward compatibility\n _data: me.data,\n _options: me.options.tooltips\n }, me);\n },\n\n /**\n * @private\n */\n bindEvents: function() {\n var me = this;\n var listeners = me._listeners = {};\n var listener = function() {\n me.eventHandler.apply(me, arguments);\n };\n\n helpers.each(me.options.events, function(type) {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n });\n\n // Elements used to detect size change should not be injected for non responsive charts.\n // See https://github.com/chartjs/Chart.js/issues/2210\n if (me.options.responsive) {\n listener = function() {\n me.resize();\n };\n\n platform.addEventListener(me, 'resize', listener);\n listeners.resize = listener;\n }\n },\n\n /**\n * @private\n */\n unbindEvents: function() {\n var me = this;\n var listeners = me._listeners;\n if (!listeners) {\n return;\n }\n\n delete me._listeners;\n helpers.each(listeners, function(listener, type) {\n platform.removeEventListener(me, type, listener);\n });\n },\n\n updateHoverStyle: function(elements, mode, enabled) {\n var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n var element, i, ilen;\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n element = elements[i];\n if (element) {\n this.getDatasetMeta(element._datasetIndex).controller[method](element);\n }\n }\n },\n\n /**\n * @private\n */\n eventHandler: function(e) {\n var me = this;\n var tooltip = me.tooltip;\n\n if (plugins.notify(me, 'beforeEvent', [e]) === false) {\n return;\n }\n\n // Buffer any update calls so that renders do not occur\n me._bufferedRender = true;\n me._bufferedRequest = null;\n\n var changed = me.handleEvent(e);\n changed |= tooltip && tooltip.handleEvent(e);\n\n plugins.notify(me, 'afterEvent', [e]);\n\n var bufferedRequest = me._bufferedRequest;\n if (bufferedRequest) {\n // If we have an update that was triggered, we need to do a normal render\n me.render(bufferedRequest);\n } else if (changed && !me.animating) {\n // If entering, leaving, or changing elements, animate the change via pivot\n me.stop();\n\n // We only need to render at this point. Updating will cause scales to be\n // recomputed generating flicker & using more memory than necessary.\n me.render(me.options.hover.animationDuration, true);\n }\n\n me._bufferedRender = false;\n me._bufferedRequest = null;\n\n return me;\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {Boolean} true if the chart needs to re-render\n */\n handleEvent: function(e) {\n var me = this;\n var options = me.options || {};\n var hoverOptions = options.hover;\n var changed = false;\n\n me.lastActive = me.lastActive || [];\n\n // Find Active Elements for hover and tooltips\n if (e.type === 'mouseout') {\n me.active = [];\n } else {\n me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n }\n\n // Invoke onHover hook\n // Need to call with native event here to not break backwards compatibility\n helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n if (e.type === 'mouseup' || e.type === 'click') {\n if (options.onClick) {\n // Use e.native here for backwards compatibility\n options.onClick.call(me, e.native, me.active);\n }\n }\n\n // Remove styling for last active (even if it may still be active)\n if (me.lastActive.length) {\n me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n }\n\n // Built in hover styling\n if (me.active.length && hoverOptions.mode) {\n me.updateHoverStyle(me.active, hoverOptions.mode, true);\n }\n\n changed = !helpers.arrayEquals(me.active, me.lastActive);\n\n // Remember Last Actives\n me.lastActive = me.active;\n\n return changed;\n }\n });\n\n /**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n Chart.Controller = Chart;\n };\n\n},{\"25\":25,\"28\":28,\"45\":45,\"48\":48}],24:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n /**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\n function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach(function(key) {\n var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n var base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value: function() {\n var args = Array.prototype.slice.call(arguments);\n var res = base.apply(this, args);\n\n helpers.each(array._chartjs.listeners, function(object) {\n if (typeof object[method] === 'function') {\n object[method].apply(object, args);\n }\n });\n\n return res;\n }\n });\n });\n }\n\n /**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\n function unlistenArrayEvents(array, listener) {\n var stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n var listeners = stub.listeners;\n var index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach(function(key) {\n delete array[key];\n });\n\n delete array._chartjs;\n }\n\n // Base class for all dataset controllers (line, bar, etc)\n Chart.DatasetController = function(chart, datasetIndex) {\n this.initialize(chart, datasetIndex);\n };\n\n helpers.extend(Chart.DatasetController.prototype, {\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n datasetElementType: null,\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n dataElementType: null,\n\n initialize: function(chart, datasetIndex) {\n var me = this;\n me.chart = chart;\n me.index = datasetIndex;\n me.linkScales();\n me.addElements();\n },\n\n updateIndex: function(datasetIndex) {\n this.index = datasetIndex;\n },\n\n linkScales: function() {\n var me = this;\n var meta = me.getMeta();\n var dataset = me.getDataset();\n\n if (meta.xAxisID === null) {\n meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n }\n if (meta.yAxisID === null) {\n meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n }\n },\n\n getDataset: function() {\n return this.chart.data.datasets[this.index];\n },\n\n getMeta: function() {\n return this.chart.getDatasetMeta(this.index);\n },\n\n getScaleForId: function(scaleID) {\n return this.chart.scales[scaleID];\n },\n\n reset: function() {\n this.update(true);\n },\n\n /**\n * @private\n */\n destroy: function() {\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n },\n\n createMetaDataset: function() {\n var me = this;\n var type = me.datasetElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index\n });\n },\n\n createMetaData: function(index) {\n var me = this;\n var type = me.dataElementType;\n return type && new type({\n _chart: me.chart,\n _datasetIndex: me.index,\n _index: index\n });\n },\n\n addElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data || [];\n var metaData = meta.data;\n var i, ilen;\n\n for (i = 0, ilen = data.length; i < ilen; ++i) {\n metaData[i] = metaData[i] || me.createMetaData(i);\n }\n\n meta.dataset = meta.dataset || me.createMetaDataset();\n },\n\n addElementAndReset: function(index) {\n var element = this.createMetaData(index);\n this.getMeta().data.splice(index, 0, element);\n this.updateElement(element, index, true);\n },\n\n buildOrUpdateElements: function() {\n var me = this;\n var dataset = me.getDataset();\n var data = dataset.data || (dataset.data = []);\n\n // In order to correctly handle data addition/deletion animation (an thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal meta data accordingly.\n if (me._data !== data) {\n if (me._data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(me._data, me);\n }\n\n listenArrayEvents(data, me);\n me._data = data;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n me.resyncElements();\n },\n\n update: helpers.noop,\n\n transition: function(easingValue) {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n for (; i < ilen; ++i) {\n elements[i].transition(easingValue);\n }\n\n if (meta.dataset) {\n meta.dataset.transition(easingValue);\n }\n },\n\n draw: function() {\n var meta = this.getMeta();\n var elements = meta.data || [];\n var ilen = elements.length;\n var i = 0;\n\n if (meta.dataset) {\n meta.dataset.draw();\n }\n\n for (; i < ilen; ++i) {\n elements[i].draw();\n }\n },\n\n removeHoverStyle: function(element, elementOpts) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var model = element._model;\n\n model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n },\n\n setHoverStyle: function(element) {\n var dataset = this.chart.data.datasets[element._datasetIndex];\n var index = element._index;\n var custom = element.custom || {};\n var valueOrDefault = helpers.valueAtIndexOrDefault;\n var getHoverColor = helpers.getHoverColor;\n var model = element._model;\n\n model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n },\n\n /**\n * @private\n */\n resyncElements: function() {\n var me = this;\n var meta = me.getMeta();\n var data = me.getDataset().data;\n var numMeta = meta.data.length;\n var numData = data.length;\n\n if (numData < numMeta) {\n meta.data.splice(numData, numMeta - numData);\n } else if (numData > numMeta) {\n me.insertElements(numMeta, numData - numMeta);\n }\n },\n\n /**\n * @private\n */\n insertElements: function(start, count) {\n for (var i = 0; i < count; ++i) {\n this.addElementAndReset(start + i);\n }\n },\n\n /**\n * @private\n */\n onDataPush: function() {\n this.insertElements(this.getDataset().data.length - 1, arguments.length);\n },\n\n /**\n * @private\n */\n onDataPop: function() {\n this.getMeta().data.pop();\n },\n\n /**\n * @private\n */\n onDataShift: function() {\n this.getMeta().data.shift();\n },\n\n /**\n * @private\n */\n onDataSplice: function(start, count) {\n this.getMeta().data.splice(start, count);\n this.insertElements(start, arguments.length - 2);\n },\n\n /**\n * @private\n */\n onDataUnshift: function() {\n this.insertElements(0, arguments.length);\n }\n });\n\n Chart.DatasetController.extend = helpers.inherits;\n };\n\n},{\"45\":45}],25:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = {\n /**\n * @private\n */\n _set: function(scope, values) {\n return helpers.merge(this[scope] || (this[scope] = {}), values);\n }\n };\n\n},{\"45\":45}],26:[function(require,module,exports){\n 'use strict';\n\n var color = require(2);\n var helpers = require(45);\n\n function interpolate(start, view, model, ease) {\n var keys = Object.keys(model);\n var i, ilen, key, actual, origin, target, type, c0, c1;\n\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n\n target = model[key];\n\n // if a value is added to the model after pivot() has been called, the view\n // doesn't contain it, so let's initialize the view to the target value.\n if (!view.hasOwnProperty(key)) {\n view[key] = target;\n }\n\n actual = view[key];\n\n if (actual === target || key[0] === '_') {\n continue;\n }\n\n if (!start.hasOwnProperty(key)) {\n start[key] = actual;\n }\n\n origin = start[key];\n\n type = typeof target;\n\n if (type === typeof origin) {\n if (type === 'string') {\n c0 = color(origin);\n if (c0.valid) {\n c1 = color(target);\n if (c1.valid) {\n view[key] = c1.mix(c0, ease).rgbString();\n continue;\n }\n }\n } else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n view[key] = origin + (target - origin) * ease;\n continue;\n }\n }\n\n view[key] = target;\n }\n }\n\n var Element = function(configuration) {\n helpers.extend(this, configuration);\n this.initialize.apply(this, arguments);\n };\n\n helpers.extend(Element.prototype, {\n\n initialize: function() {\n this.hidden = false;\n },\n\n pivot: function() {\n var me = this;\n if (!me._view) {\n me._view = helpers.clone(me._model);\n }\n me._start = {};\n return me;\n },\n\n transition: function(ease) {\n var me = this;\n var model = me._model;\n var start = me._start;\n var view = me._view;\n\n // No animation -> No Transition\n if (!model || ease === 1) {\n me._view = model;\n me._start = null;\n return me;\n }\n\n if (!view) {\n view = me._view = {};\n }\n\n if (!start) {\n start = me._start = {};\n }\n\n interpolate(start, view, model, ease);\n\n return me;\n },\n\n tooltipPosition: function() {\n return {\n x: this._model.x,\n y: this._model.y\n };\n },\n\n hasValue: function() {\n return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n }\n });\n\n Element.extend = helpers.inherits;\n\n module.exports = Element;\n\n},{\"2\":2,\"45\":45}],27:[function(require,module,exports){\n\t/* global window: false */\n\t/* global document: false */\n 'use strict';\n\n var color = require(2);\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n // -- Basic js utility methods\n\n helpers.extend = function(base) {\n var setFn = function(value, key) {\n base[key] = value;\n };\n for (var i = 1, ilen = arguments.length; i < ilen; i++) {\n helpers.each(arguments[i], setFn);\n }\n return base;\n };\n\n helpers.configMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n var tval = target[key] || {};\n var sval = source[key];\n\n if (key === 'scales') {\n // scale config merging is complex. Add our own function here for that\n target[key] = helpers.scaleMerge(tval, sval);\n } else if (key === 'scale') {\n // used in polar area & radar charts since there is only one scale\n target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]);\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.scaleMerge = function(/* objects ... */) {\n return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n merger: function(key, target, source, options) {\n if (key === 'xAxes' || key === 'yAxes') {\n var slen = source[key].length;\n var i, type, scale;\n\n if (!target[key]) {\n target[key] = [];\n }\n\n for (i = 0; i < slen; ++i) {\n scale = source[key][i];\n type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n if (i >= target[key].length) {\n target[key].push({});\n }\n\n if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\n // new/untyped scale or type changed: let's apply the new defaults\n // then merge source scale to correctly overwrite the defaults.\n helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]);\n } else {\n // scales type are the same\n helpers.merge(target[key][i], scale);\n }\n }\n } else {\n helpers._merger(key, target, source, options);\n }\n }\n });\n };\n\n helpers.where = function(collection, filterCallback) {\n if (helpers.isArray(collection) && Array.prototype.filter) {\n return collection.filter(filterCallback);\n }\n var filtered = [];\n\n helpers.each(collection, function(item) {\n if (filterCallback(item)) {\n filtered.push(item);\n }\n });\n\n return filtered;\n };\n helpers.findIndex = Array.prototype.findIndex ?\n function(array, callback, scope) {\n return array.findIndex(callback, scope);\n } :\n function(array, callback, scope) {\n scope = scope === undefined ? array : scope;\n for (var i = 0, ilen = array.length; i < ilen; ++i) {\n if (callback.call(scope, array[i], i, array)) {\n return i;\n }\n }\n return -1;\n };\n helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to start of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = -1;\n }\n for (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n // Default to end of the array\n if (helpers.isNullOrUndef(startIndex)) {\n startIndex = arrayToSearch.length;\n }\n for (var i = startIndex - 1; i >= 0; i--) {\n var currentItem = arrayToSearch[i];\n if (filterCallback(currentItem)) {\n return currentItem;\n }\n }\n };\n helpers.inherits = function(extensions) {\n // Basic javascript inheritance based on the model created in Backbone.js\n var me = this;\n var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n return me.apply(this, arguments);\n };\n\n var Surrogate = function() {\n this.constructor = ChartElement;\n };\n Surrogate.prototype = me.prototype;\n ChartElement.prototype = new Surrogate();\n\n ChartElement.extend = helpers.inherits;\n\n if (extensions) {\n helpers.extend(ChartElement.prototype, extensions);\n }\n\n ChartElement.__super__ = me.prototype;\n\n return ChartElement;\n };\n // -- Math methods\n helpers.isNumber = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n helpers.almostEquals = function(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n };\n helpers.almostWhole = function(x, epsilon) {\n var rounded = Math.round(x);\n return (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n };\n helpers.max = function(array) {\n return array.reduce(function(max, value) {\n if (!isNaN(value)) {\n return Math.max(max, value);\n }\n return max;\n }, Number.NEGATIVE_INFINITY);\n };\n helpers.min = function(array) {\n return array.reduce(function(min, value) {\n if (!isNaN(value)) {\n return Math.min(min, value);\n }\n return min;\n }, Number.POSITIVE_INFINITY);\n };\n helpers.sign = Math.sign ?\n function(x) {\n return Math.sign(x);\n } :\n function(x) {\n x = +x; // convert to a number\n if (x === 0 || isNaN(x)) {\n return x;\n }\n return x > 0 ? 1 : -1;\n };\n helpers.log10 = Math.log10 ?\n function(x) {\n return Math.log10(x);\n } :\n function(x) {\n return Math.log(x) / Math.LN10;\n };\n helpers.toRadians = function(degrees) {\n return degrees * (Math.PI / 180);\n };\n helpers.toDegrees = function(radians) {\n return radians * (180 / Math.PI);\n };\n // Gets the angle from vertical upright to the point about a centre.\n helpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n var distanceFromXCenter = anglePoint.x - centrePoint.x;\n var distanceFromYCenter = anglePoint.y - centrePoint.y;\n var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * Math.PI)) {\n angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle: angle,\n distance: radialDistanceFromCenter\n };\n };\n helpers.distanceBetweenPoints = function(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n };\n helpers.aliasPixel = function(pixelWidth) {\n return (pixelWidth % 2 === 0) ? 0 : 0.5;\n };\n helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\n var previous = firstPoint.skip ? middlePoint : firstPoint;\n var current = middlePoint;\n var next = afterPoint.skip ? middlePoint : afterPoint;\n\n var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n var s01 = d01 / (d01 + d12);\n var s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n var fa = t * s01; // scaling factor for triangle Ta\n var fb = t * s12;\n\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n };\n helpers.EPSILON = Number.EPSILON || 1e-14;\n helpers.splineCurveMonotone = function(points) {\n // This function calculates Bézier control points in a similar way than |splineCurve|,\n // but preserves monotonicity of the provided data and ensures no local extremums are added\n // between the dataset discrete points due to the interpolation.\n // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n var pointsWithTangents = (points || []).map(function(point) {\n return {\n model: point._model,\n deltaK: 0,\n mK: 0\n };\n });\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n var pointsLen = pointsWithTangents.length;\n var i, pointBefore, pointCurrent, pointAfter;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointAfter && !pointAfter.model.skip) {\n var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n }\n\n if (!pointBefore || pointBefore.model.skip) {\n pointCurrent.mK = pointCurrent.deltaK;\n } else if (!pointAfter || pointAfter.model.skip) {\n pointCurrent.mK = pointBefore.deltaK;\n } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n pointCurrent.mK = 0;\n } else {\n pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n }\n }\n\n // Adjust tangents to ensure monotonic properties\n var alphaK, betaK, tauK, squaredMagnitude;\n for (i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointsWithTangents[i];\n pointAfter = pointsWithTangents[i + 1];\n if (pointCurrent.model.skip || pointAfter.model.skip) {\n continue;\n }\n\n if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n pointCurrent.mK = pointAfter.mK = 0;\n continue;\n }\n\n alphaK = pointCurrent.mK / pointCurrent.deltaK;\n betaK = pointAfter.mK / pointCurrent.deltaK;\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n\n tauK = 3 / Math.sqrt(squaredMagnitude);\n pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n pointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n }\n\n // Compute control points\n var deltaX;\n for (i = 0; i < pointsLen; ++i) {\n pointCurrent = pointsWithTangents[i];\n if (pointCurrent.model.skip) {\n continue;\n }\n\n pointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n if (pointBefore && !pointBefore.model.skip) {\n deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n }\n if (pointAfter && !pointAfter.model.skip) {\n deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n }\n }\n };\n helpers.nextItem = function(collection, index, loop) {\n if (loop) {\n return index >= collection.length - 1 ? collection[0] : collection[index + 1];\n }\n return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n };\n helpers.previousItem = function(collection, index, loop) {\n if (loop) {\n return index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n }\n return index <= 0 ? collection[0] : collection[index - 1];\n };\n // Implementation of the nice number algorithm used in determining where axis labels will go\n helpers.niceNum = function(range, round) {\n var exponent = Math.floor(helpers.log10(range));\n var fraction = range / Math.pow(10, exponent);\n var niceFraction;\n\n if (round) {\n if (fraction < 1.5) {\n niceFraction = 1;\n } else if (fraction < 3) {\n niceFraction = 2;\n } else if (fraction < 7) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n } else if (fraction <= 1.0) {\n niceFraction = 1;\n } else if (fraction <= 2) {\n niceFraction = 2;\n } else if (fraction <= 5) {\n niceFraction = 5;\n } else {\n niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n };\n // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n helpers.requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n callback();\n };\n }\n return window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) {\n return window.setTimeout(callback, 1000 / 60);\n };\n }());\n // -- DOM methods\n helpers.getRelativePosition = function(evt, chart) {\n var mouseX, mouseY;\n var e = evt.originalEvent || evt;\n var canvas = evt.currentTarget || evt.srcElement;\n var boundingRect = canvas.getBoundingClientRect();\n\n var touches = e.touches;\n if (touches && touches.length > 0) {\n mouseX = touches[0].clientX;\n mouseY = touches[0].clientY;\n\n } else {\n mouseX = e.clientX;\n mouseY = e.clientY;\n }\n\n // Scale mouse coordinates into canvas coordinates\n // by following the pattern laid out by 'jerryj' in the comments of\n // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n return {\n x: mouseX,\n y: mouseY\n };\n\n };\n\n // Private helper function to convert max-width/max-height values that may be percentages into a number\n function parseMaxStyle(styleValue, node, parentProperty) {\n var valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n }\n\n /**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n function isConstrainedValue(value) {\n return value !== undefined && value !== null && value !== 'none';\n }\n\n // Private helper to get a constraint dimension\n // @param domNode : the node to check the constraint on\n // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n // @param percentageProperty : property of parent to use when calculating width as a percentage\n // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n function getConstraintDimension(domNode, maxStyle, percentageProperty) {\n var view = document.defaultView;\n var parentNode = domNode.parentNode;\n var constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n var hasCNode = isConstrainedValue(constrainedNode);\n var hasCContainer = isConstrainedValue(constrainedContainer);\n var infinity = Number.POSITIVE_INFINITY;\n\n if (hasCNode || hasCContainer) {\n return Math.min(\n hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n }\n\n return 'none';\n }\n // returns Number or undefined if no constraint\n helpers.getConstraintWidth = function(domNode) {\n return getConstraintDimension(domNode, 'max-width', 'clientWidth');\n };\n // returns Number or undefined if no constraint\n helpers.getConstraintHeight = function(domNode) {\n return getConstraintDimension(domNode, 'max-height', 'clientHeight');\n };\n helpers.getMaximumWidth = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientWidth;\n }\n\n var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n var w = container.clientWidth - paddingLeft - paddingRight;\n var cw = helpers.getConstraintWidth(domNode);\n return isNaN(cw) ? w : Math.min(w, cw);\n };\n helpers.getMaximumHeight = function(domNode) {\n var container = domNode.parentNode;\n if (!container) {\n return domNode.clientHeight;\n }\n\n var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n var h = container.clientHeight - paddingTop - paddingBottom;\n var ch = helpers.getConstraintHeight(domNode);\n return isNaN(ch) ? h : Math.min(h, ch);\n };\n helpers.getStyle = function(el, property) {\n return el.currentStyle ?\n el.currentStyle[property] :\n document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n };\n helpers.retinaScale = function(chart, forceRatio) {\n var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1;\n if (pixelRatio === 1) {\n return;\n }\n\n var canvas = chart.canvas;\n var height = chart.height;\n var width = chart.width;\n\n canvas.height = height * pixelRatio;\n canvas.width = width * pixelRatio;\n chart.ctx.scale(pixelRatio, pixelRatio);\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n canvas.style.height = height + 'px';\n canvas.style.width = width + 'px';\n };\n // -- Canvas methods\n helpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n };\n helpers.longestText = function(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n var data = cache.data = cache.data || {};\n var gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.font = font;\n var longest = 0;\n helpers.each(arrayOfThings, function(thing) {\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n longest = helpers.measureText(ctx, data, gc, longest, thing);\n } else if (helpers.isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n helpers.each(thing, function(nestedThing) {\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n longest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n }\n });\n }\n });\n\n var gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (var i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n };\n helpers.measureText = function(ctx, data, gc, longest, string) {\n var textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n };\n helpers.numberOfLabelLines = function(arrayOfThings) {\n var numberOfLines = 1;\n helpers.each(arrayOfThings, function(thing) {\n if (helpers.isArray(thing)) {\n if (thing.length > numberOfLines) {\n numberOfLines = thing.length;\n }\n }\n });\n return numberOfLines;\n };\n\n helpers.color = !color ?\n function(value) {\n console.error('Color.js not found!');\n return value;\n } :\n function(value) {\n\t\t\t\t/* global CanvasGradient */\n if (value instanceof CanvasGradient) {\n value = defaults.global.defaultColor;\n }\n\n return color(value);\n };\n\n helpers.getHoverColor = function(colorValue) {\n\t\t\t/* global CanvasPattern */\n return (colorValue instanceof CanvasPattern) ?\n colorValue :\n helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n };\n };\n\n},{\"2\":2,\"25\":25,\"45\":45}],28:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n /**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\n function getRelativePosition(e, chart) {\n if (e.native) {\n return {\n x: e.x,\n y: e.y\n };\n }\n\n return helpers.getRelativePosition(e, chart);\n }\n\n /**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\n function parseVisibleItems(chart, handler) {\n var datasets = chart.data.datasets;\n var meta, i, j, ilen, jlen;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n if (!chart.isDatasetVisible(i)) {\n continue;\n }\n\n meta = chart.getDatasetMeta(i);\n for (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n var element = meta.data[j];\n if (!element._view.skip) {\n handler(element);\n }\n }\n }\n }\n\n /**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n function getIntersectItems(chart, position) {\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n }\n });\n\n return elements;\n }\n\n /**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n function getNearestItems(chart, position, intersect, distanceMetric) {\n var minDistance = Number.POSITIVE_INFINITY;\n var nearestItems = [];\n\n parseVisibleItems(chart, function(element) {\n if (intersect && !element.inRange(position.x, position.y)) {\n return;\n }\n\n var center = element.getCenterPoint();\n var distance = distanceMetric(position, center);\n\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n });\n\n return nearestItems;\n }\n\n /**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\n function getDistanceMetricForAxis(axis) {\n var useX = axis.indexOf('x') !== -1;\n var useY = axis.indexOf('y') !== -1;\n\n return function(pt1, pt2) {\n var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n }\n\n function indexMode(chart, e, options) {\n var position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n options.axis = options.axis || 'x';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n var elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.data.datasets.forEach(function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var element = meta.data[items[0]._index];\n\n // don't count items that are skipped (null data)\n if (element && !element._view.skip) {\n elements.push(element);\n }\n }\n });\n\n return elements;\n }\n\n /**\n * @interface IInteractionOptions\n */\n /**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n /**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\n module.exports = {\n // Helper function for different modes\n modes: {\n single: function(chart, e) {\n var position = getRelativePosition(e, chart);\n var elements = [];\n\n parseVisibleItems(chart, function(element) {\n if (element.inRange(position.x, position.y)) {\n elements.push(element);\n return elements;\n }\n });\n\n return elements.slice(0, 1);\n },\n\n /**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n label: indexMode,\n\n /**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n index: indexMode,\n\n /**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n dataset: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n if (items.length > 0) {\n items = chart.getDatasetMeta(items[0]._datasetIndex).data;\n }\n\n return items;\n },\n\n /**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n 'x-axis': function(chart, e) {\n return indexMode(chart, e, {intersect: true});\n },\n\n /**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n point: function(chart, e) {\n var position = getRelativePosition(e, chart);\n return getIntersectItems(chart, position);\n },\n\n /**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n nearest: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n options.axis = options.axis || 'xy';\n var distanceMetric = getDistanceMetricForAxis(options.axis);\n var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n // We have multiple items at the same distance from the event. Now sort by smallest\n if (nearestItems.length > 1) {\n nearestItems.sort(function(a, b) {\n var sizeA = a.getArea();\n var sizeB = b.getArea();\n var ret = sizeA - sizeB;\n\n if (ret === 0) {\n // if equal sort by dataset index\n ret = a._datasetIndex - b._datasetIndex;\n }\n\n return ret;\n });\n }\n\n // Return only 1 item\n return nearestItems.slice(0, 1);\n },\n\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n x: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inXRange(position.x)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n y: function(chart, e, options) {\n var position = getRelativePosition(e, chart);\n var items = [];\n var intersectsItem = false;\n\n parseVisibleItems(chart, function(element) {\n if (element.inYRange(position.y)) {\n items.push(element);\n }\n\n if (element.inRange(position.x, position.y)) {\n intersectsItem = true;\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (options.intersect && !intersectsItem) {\n items = [];\n }\n return items;\n }\n }\n };\n\n},{\"45\":45}],29:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n\n defaults._set('global', {\n responsive: true,\n responsiveAnimationDuration: 0,\n maintainAspectRatio: true,\n events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n hover: {\n onHover: null,\n mode: 'nearest',\n intersect: true,\n animationDuration: 400\n },\n onClick: null,\n defaultColor: 'rgba(0,0,0,0.1)',\n defaultFontColor: '#666',\n defaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n defaultFontSize: 12,\n defaultFontStyle: 'normal',\n showLines: true,\n\n // Element defaults defined in element extensions\n elements: {},\n\n // Layout options such as padding\n layout: {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n }\n });\n\n module.exports = function() {\n\n // Occupy the global variable of Chart, and create a simple base class\n var Chart = function(item, config) {\n this.construct(item, config);\n return this;\n };\n\n Chart.Chart = Chart;\n\n return Chart;\n };\n\n},{\"25\":25}],30:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n function filterByPosition(array, position) {\n return helpers.where(array, function(v) {\n return v.position === position;\n });\n }\n\n function sortByWeight(array, reverse) {\n array.forEach(function(v, i) {\n v._tmpIndex_ = i;\n return v;\n });\n array.sort(function(a, b) {\n var v0 = reverse ? b : a;\n var v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0._tmpIndex_ - v1._tmpIndex_ :\n v0.weight - v1.weight;\n });\n array.forEach(function(v) {\n delete v._tmpIndex_;\n });\n }\n\n /**\n * @interface ILayoutItem\n * @prop {String} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n * @prop {Function} getPadding - Returns an object with padding on the edges\n * @prop {Number} width - Width of item. Must be valid after update()\n * @prop {Number} height - Height of item. Must be valid after update()\n * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n // The layout service is very self explanatory. It's responsible for the layout within a chart.\n // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n // It is this service's responsibility of carrying out that layout.\n Chart.layoutService = {\n defaults: {},\n\n /**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n addBox: function(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullWidth = item.fullWidth || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n\n chart.boxes.push(item);\n },\n\n /**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {Object} layoutItem - the item to remove from the layout\n */\n removeBox: function(chart, layoutItem) {\n var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n\n /**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {Object} item - the item to configure with the given options\n * @param {Object} options - the new item options.\n */\n configure: function(chart, item, options) {\n var props = ['fullWidth', 'position', 'weight'];\n var ilen = props.length;\n var i = 0;\n var prop;\n\n for (; i < ilen; ++i) {\n prop = props[i];\n if (options.hasOwnProperty(prop)) {\n item[prop] = options[prop];\n }\n }\n },\n\n /**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {Number} width - the width to fit into\n * @param {Number} height - the height to fit into\n */\n update: function(chart, width, height) {\n if (!chart) {\n return;\n }\n\n var layoutOptions = chart.options.layout || {};\n var padding = helpers.options.toPadding(layoutOptions.padding);\n var leftPadding = padding.left;\n var rightPadding = padding.right;\n var topPadding = padding.top;\n var bottomPadding = padding.bottom;\n\n var leftBoxes = filterByPosition(chart.boxes, 'left');\n var rightBoxes = filterByPosition(chart.boxes, 'right');\n var topBoxes = filterByPosition(chart.boxes, 'top');\n var bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n // Sort boxes by weight. A higher weight is further away from the chart area\n sortByWeight(leftBoxes, true);\n sortByWeight(rightBoxes, false);\n sortByWeight(topBoxes, true);\n sortByWeight(bottomBoxes, false);\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n // What we do to find the best sizing, we do the following\n // 1. Determine the minimum size of the chart area.\n // 2. Split the remaining width equally between each vertical axis\n // 3. Split the remaining height equally between each horizontal axis\n // 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n // 5. Adjust the sizes of each axis based on it's minimum reported size.\n // 6. Refit each axis\n // 7. Position each axis in the final location\n // 8. Tell the chart the final location of the chart area\n // 9. Tell any axes that overlay the chart area the positions of the chart area\n\n // Step 1\n var chartWidth = width - leftPadding - rightPadding;\n var chartHeight = height - topPadding - bottomPadding;\n var chartAreaWidth = chartWidth / 2; // min 50%\n var chartAreaHeight = chartHeight / 2; // min 50%\n\n // Step 2\n var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n // Step 3\n var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n // Step 4\n var maxChartAreaWidth = chartWidth;\n var maxChartAreaHeight = chartHeight;\n var minBoxSizes = [];\n\n function getMinimumBoxSize(box) {\n var minSize;\n var isHorizontal = box.isHorizontal();\n\n if (isHorizontal) {\n minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n maxChartAreaHeight -= minSize.height;\n } else {\n minSize = box.update(verticalBoxWidth, chartAreaHeight);\n maxChartAreaWidth -= minSize.width;\n }\n\n minBoxSizes.push({\n horizontal: isHorizontal,\n minSize: minSize,\n box: box,\n });\n }\n\n helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n var maxHorizontalLeftPadding = 0;\n var maxHorizontalRightPadding = 0;\n var maxVerticalTopPadding = 0;\n var maxVerticalBottomPadding = 0;\n\n helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n if (horizontalBox.getPadding) {\n var boxPadding = horizontalBox.getPadding();\n maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n }\n });\n\n helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n if (verticalBox.getPadding) {\n var boxPadding = verticalBox.getPadding();\n maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n }\n });\n\n // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n // be if the axes are drawn at their minimum sizes.\n // Steps 5 & 6\n var totalLeftBoxesWidth = leftPadding;\n var totalRightBoxesWidth = rightPadding;\n var totalTopBoxesHeight = topPadding;\n var totalBottomBoxesHeight = bottomPadding;\n\n // Function to fit a box\n function fitBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n return minBox.box === box;\n });\n\n if (minBoxSize) {\n if (box.isHorizontal()) {\n var scaleMargin = {\n left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n top: 0,\n bottom: 0\n };\n\n // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n // on the margin. Sometimes they need to increase in size slightly\n box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n } else {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight);\n }\n }\n }\n\n // Update, and calculate the left and right margins for the horizontal boxes\n helpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n // Set the Left and Right margins for the horizontal boxes\n helpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n // Figure out how much margin is on the top and bottom of the vertical boxes\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n function finalFitVerticalBox(box) {\n var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n return minSize.box === box;\n });\n\n var scaleMargin = {\n left: 0,\n right: 0,\n top: totalTopBoxesHeight,\n bottom: totalBottomBoxesHeight\n };\n\n if (minBoxSize) {\n box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n }\n }\n\n // Let the left layout know the final margin\n helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n totalLeftBoxesWidth = leftPadding;\n totalRightBoxesWidth = rightPadding;\n totalTopBoxesHeight = topPadding;\n totalBottomBoxesHeight = bottomPadding;\n\n helpers.each(leftBoxes, function(box) {\n totalLeftBoxesWidth += box.width;\n });\n\n helpers.each(rightBoxes, function(box) {\n totalRightBoxesWidth += box.width;\n });\n\n helpers.each(topBoxes, function(box) {\n totalTopBoxesHeight += box.height;\n });\n helpers.each(bottomBoxes, function(box) {\n totalBottomBoxesHeight += box.height;\n });\n\n // We may be adding some padding to account for rotated x axis labels\n var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n totalLeftBoxesWidth += leftPaddingAddition;\n totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n totalTopBoxesHeight += topPaddingAddition;\n totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n // Figure out if our chart area changed. This would occur if the dataset layout label rotation\n // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n // without calling `fit` again\n var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n helpers.each(leftBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(rightBoxes, function(box) {\n box.height = newMaxChartAreaHeight;\n });\n\n helpers.each(topBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n helpers.each(bottomBoxes, function(box) {\n if (!box.fullWidth) {\n box.width = newMaxChartAreaWidth;\n }\n });\n\n maxChartAreaHeight = newMaxChartAreaHeight;\n maxChartAreaWidth = newMaxChartAreaWidth;\n }\n\n // Step 7 - Position the boxes\n var left = leftPadding + leftPaddingAddition;\n var top = topPadding + topPaddingAddition;\n\n function placeBox(box) {\n if (box.isHorizontal()) {\n box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n box.top = top;\n box.bottom = top + box.height;\n\n // Move to next point\n top = box.bottom;\n\n } else {\n\n box.left = left;\n box.right = left + box.width;\n box.top = totalTopBoxesHeight;\n box.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n // Move to next point\n left = box.right;\n }\n }\n\n helpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n // Account for chart width and height\n left += maxChartAreaWidth;\n top += maxChartAreaHeight;\n\n helpers.each(rightBoxes, placeBox);\n helpers.each(bottomBoxes, placeBox);\n\n // Step 8\n chart.chartArea = {\n left: totalLeftBoxesWidth,\n top: totalTopBoxesHeight,\n right: totalLeftBoxesWidth + maxChartAreaWidth,\n bottom: totalTopBoxesHeight + maxChartAreaHeight\n };\n\n // Step 9\n helpers.each(chartAreaBoxes, function(box) {\n box.left = chart.chartArea.left;\n box.top = chart.chartArea.top;\n box.right = chart.chartArea.right;\n box.bottom = chart.chartArea.bottom;\n\n box.update(maxChartAreaWidth, maxChartAreaHeight);\n });\n }\n };\n };\n\n},{\"45\":45}],31:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {}\n });\n\n module.exports = function(Chart) {\n\n /**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n Chart.plugins = {\n /**\n * Globally registered plugins.\n * @private\n */\n _plugins: [],\n\n /**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n _cacheId: 0,\n\n /**\n * Registers the given plugin(s) if not already registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n register: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n if (p.indexOf(plugin) === -1) {\n p.push(plugin);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Unregisters the given plugin(s) only if registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n unregister: function(plugins) {\n var p = this._plugins;\n ([]).concat(plugins).forEach(function(plugin) {\n var idx = p.indexOf(plugin);\n if (idx !== -1) {\n p.splice(idx, 1);\n }\n });\n\n this._cacheId++;\n },\n\n /**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n clear: function() {\n this._plugins = [];\n this._cacheId++;\n },\n\n /**\n * Returns the number of registered plugins?\n * @returns {Number}\n * @since 2.1.5\n */\n count: function() {\n return this._plugins.length;\n },\n\n /**\n * Returns all registered plugin instances.\n * @returns {Array} array of plugin objects.\n * @since 2.1.5\n */\n getAll: function() {\n return this._plugins;\n },\n\n /**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Object} chart - The chart instance for which plugins should be called.\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {Boolean} false if any of the plugins return false, else returns true.\n */\n notify: function(chart, hook, args) {\n var descriptors = this.descriptors(chart);\n var ilen = descriptors.length;\n var i, descriptor, plugin, params, method;\n\n for (i = 0; i < ilen; ++i) {\n descriptor = descriptors[i];\n plugin = descriptor.plugin;\n method = plugin[hook];\n if (typeof method === 'function') {\n params = [chart].concat(args || []);\n params.push(descriptor.options);\n if (method.apply(plugin, params) === false) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {Array} [{ plugin, options }]\n * @private\n */\n descriptors: function(chart) {\n var cache = chart._plugins || (chart._plugins = {});\n if (cache.id === this._cacheId) {\n return cache.descriptors;\n }\n\n var plugins = [];\n var descriptors = [];\n var config = (chart && chart.config) || {};\n var options = (config.options && config.options.plugins) || {};\n\n this._plugins.concat(config.plugins || []).forEach(function(plugin) {\n var idx = plugins.indexOf(plugin);\n if (idx !== -1) {\n return;\n }\n\n var id = plugin.id;\n var opts = options[id];\n if (opts === false) {\n return;\n }\n\n if (opts === true) {\n opts = helpers.clone(defaults.global.plugins[id]);\n }\n\n plugins.push(plugin);\n descriptors.push({\n plugin: plugin,\n options: opts || {}\n });\n });\n\n cache.descriptors = descriptors;\n cache.id = this._cacheId;\n return descriptors;\n }\n };\n\n /**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n /**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n /**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n /**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n /**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n /**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n /**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n /**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n /**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\n /**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n Chart.pluginService = Chart.plugins;\n\n /**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n Chart.PluginBase = Element.extend({});\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],32:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n var Ticks = require(34);\n\n defaults._set('scale', {\n display: true,\n position: 'left',\n offset: false,\n\n // grid line settings\n gridLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickMarkLength: 10,\n zeroLineWidth: 1,\n zeroLineColor: 'rgba(0,0,0,0.25)',\n zeroLineBorderDash: [],\n zeroLineBorderDashOffset: 0.0,\n offsetGridLines: false,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n // scale label\n scaleLabel: {\n // display property\n display: false,\n\n // actual label\n labelString: '',\n\n // line height\n lineHeight: 1.2,\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\n ticks: {\n beginAtZero: false,\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n padding: 0,\n reverse: false,\n display: true,\n autoSkip: true,\n autoSkipPadding: 0,\n labelOffset: 0,\n // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {}\n }\n });\n\n function labelsFromTicks(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(ticks[i].label);\n }\n\n return labels;\n }\n\n function getLineValue(scale, index, offsetGridLines) {\n var lineValue = scale.getPixelForTick(index);\n\n if (offsetGridLines) {\n if (index === 0) {\n lineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n }\n }\n return lineValue;\n }\n\n module.exports = function(Chart) {\n\n function computeTextSize(context, tick, font) {\n return helpers.isArray(tick) ?\n helpers.longestText(context, font, tick) :\n context.measureText(tick).width;\n }\n\n function parseFontOptions(options) {\n var valueOrDefault = helpers.valueOrDefault;\n var globalDefaults = defaults.global;\n var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n return {\n size: size,\n style: style,\n family: family,\n font: helpers.fontString(size, style, family)\n };\n }\n\n function parseLineHeight(options) {\n return helpers.options.toLineHeight(\n helpers.valueOrDefault(options.lineHeight, 1.2),\n helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n }\n\n Chart.Scale = Element.extend({\n /**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n getPadding: function() {\n var me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n },\n\n /**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n getTicks: function() {\n return this._ticks;\n },\n\n // These methods are ordered by lifecyle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n mergeTicksOptions: function() {\n var ticks = this.options.ticks;\n if (ticks.minor === false) {\n ticks.minor = {\n display: false\n };\n }\n if (ticks.major === false) {\n ticks.major = {\n display: false\n };\n }\n for (var key in ticks) {\n if (key !== 'major' && key !== 'minor') {\n if (typeof ticks.minor[key] === 'undefined') {\n ticks.minor[key] = ticks[key];\n }\n if (typeof ticks.major[key] === 'undefined') {\n ticks.major[key] = ticks[key];\n }\n }\n }\n },\n beforeUpdate: function() {\n helpers.callback(this.options.beforeUpdate, [this]);\n },\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n var i, ilen, labels, label, ticks, tick;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = helpers.extend({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.longestTextCache = me.longestTextCache || {};\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n\n // Data min/max\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n\n // Ticks - `this.ticks` is now DEPRECATED!\n // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n // and must not be accessed directly from outside this class. `this.ticks` being\n // around for long time and not marked as private, we can't change its structure\n // without unexpected breaking changes. If you need to access the scale ticks,\n // use scale.getTicks() instead.\n\n me.beforeBuildTicks();\n\n // New implementations should return an array of objects but for BACKWARD COMPAT,\n // we still support no return (`this.ticks` internally set by calling this method).\n ticks = me.buildTicks() || [];\n\n me.afterBuildTicks();\n\n me.beforeTickToLabelConversion();\n\n // New implementations should return the formatted tick labels but for BACKWARD\n // COMPAT, we still support no return (`this.ticks` internally changed by calling\n // this method and supposed to contain only string values).\n labels = me.convertTicksToLabels(ticks) || me.ticks;\n\n me.afterTickToLabelConversion();\n\n me.ticks = labels; // BACKWARD COMPATIBILITY\n\n // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n tick = ticks[i];\n if (!tick) {\n ticks.push(tick = {\n label: label,\n major: false\n });\n } else {\n tick.label = label;\n }\n }\n\n me._ticks = ticks;\n\n // Tick Rotation\n me.beforeCalculateTickRotation();\n me.calculateTickRotation();\n me.afterCalculateTickRotation();\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: function() {\n helpers.callback(this.options.afterUpdate, [this]);\n },\n\n //\n\n beforeSetDimensions: function() {\n helpers.callback(this.options.beforeSetDimensions, [this]);\n },\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n },\n afterSetDimensions: function() {\n helpers.callback(this.options.afterSetDimensions, [this]);\n },\n\n // Data limits\n beforeDataLimits: function() {\n helpers.callback(this.options.beforeDataLimits, [this]);\n },\n determineDataLimits: helpers.noop,\n afterDataLimits: function() {\n helpers.callback(this.options.afterDataLimits, [this]);\n },\n\n //\n beforeBuildTicks: function() {\n helpers.callback(this.options.beforeBuildTicks, [this]);\n },\n buildTicks: helpers.noop,\n afterBuildTicks: function() {\n helpers.callback(this.options.afterBuildTicks, [this]);\n },\n\n beforeTickToLabelConversion: function() {\n helpers.callback(this.options.beforeTickToLabelConversion, [this]);\n },\n convertTicksToLabels: function() {\n var me = this;\n // Convert ticks to strings\n var tickOpts = me.options.ticks;\n me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n },\n afterTickToLabelConversion: function() {\n helpers.callback(this.options.afterTickToLabelConversion, [this]);\n },\n\n //\n\n beforeCalculateTickRotation: function() {\n helpers.callback(this.options.beforeCalculateTickRotation, [this]);\n },\n calculateTickRotation: function() {\n var me = this;\n var context = me.ctx;\n var tickOpts = me.options.ticks;\n var labels = labelsFromTicks(me._ticks);\n\n // Get the width of each grid by calculating the difference\n // between x offsets between 0 and 1.\n var tickFont = parseFontOptions(tickOpts);\n context.font = tickFont.font;\n\n var labelRotation = tickOpts.minRotation || 0;\n\n if (labels.length && me.options.display && me.isHorizontal()) {\n var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n var labelWidth = originalLabelWidth;\n var cosRotation, sinRotation;\n\n // Allow 3 pixels x2 padding either side for label readability\n var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n // Max label rotation can be set or default to 90 - also act as a loop counter\n while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n var angleRadians = helpers.toRadians(labelRotation);\n cosRotation = Math.cos(angleRadians);\n sinRotation = Math.sin(angleRadians);\n\n if (sinRotation * originalLabelWidth > me.maxHeight) {\n // go back one step\n labelRotation--;\n break;\n }\n\n labelRotation++;\n labelWidth = cosRotation * originalLabelWidth;\n }\n }\n\n me.labelRotation = labelRotation;\n },\n afterCalculateTickRotation: function() {\n helpers.callback(this.options.afterCalculateTickRotation, [this]);\n },\n\n //\n\n beforeFit: function() {\n helpers.callback(this.options.beforeFit, [this]);\n },\n fit: function() {\n var me = this;\n // Reset\n var minSize = me.minSize = {\n width: 0,\n height: 0\n };\n\n var labels = labelsFromTicks(me._ticks);\n\n var opts = me.options;\n var tickOpts = opts.ticks;\n var scaleLabelOpts = opts.scaleLabel;\n var gridLineOpts = opts.gridLines;\n var display = opts.display;\n var isHorizontal = me.isHorizontal();\n\n var tickFont = parseFontOptions(tickOpts);\n var tickMarkLength = opts.gridLines.tickMarkLength;\n\n // Width\n if (isHorizontal) {\n // subtract the margins to line up with the chartArea if we are a full width scale\n minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n } else {\n minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n }\n\n // height\n if (isHorizontal) {\n minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n } else {\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Are we showing a title for the scale?\n if (scaleLabelOpts.display && display) {\n var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n if (isHorizontal) {\n minSize.height += deltaHeight;\n } else {\n minSize.width += deltaHeight;\n }\n }\n\n // Don't bother fitting the ticks if we are not showing them\n if (tickOpts.display && display) {\n var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n var lineSpace = tickFont.size * 0.5;\n var tickPadding = me.options.ticks.padding;\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n me.longestLabelWidth = largestTextWidth;\n\n var angleRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(angleRadians);\n var sinRotation = Math.sin(angleRadians);\n\n // TODO - improve this calculation\n var labelHeight = (sinRotation * largestTextWidth)\n + (tickFont.size * tallestLabelHeightInLines)\n + (lineSpace * (tallestLabelHeightInLines - 1))\n + lineSpace; // padding\n\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n me.ctx.font = tickFont.font;\n var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\n if (me.labelRotation !== 0) {\n me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3;\n } else {\n me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n me.paddingRight = lastLabelWidth / 2 + 3;\n }\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n if (tickOpts.mirror) {\n largestTextWidth = 0;\n } else {\n // use lineSpace for consistency with horizontal axis\n // tickPadding is not implemented for horizontal\n largestTextWidth += tickPadding + lineSpace;\n }\n\n minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n me.paddingTop = tickFont.size / 2;\n me.paddingBottom = tickFont.size / 2;\n }\n }\n\n me.handleMargins();\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n\n /**\n * Handle margins and padding interactions\n * @private\n */\n handleMargins: function() {\n var me = this;\n if (me.margins) {\n me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n }\n },\n\n afterFit: function() {\n helpers.callback(this.options.afterFit, [this]);\n },\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n isFullWidth: function() {\n return (this.options.fullWidth);\n },\n\n // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n getRightValue: function(rawValue) {\n // Null and undefined values first\n if (helpers.isNullOrUndef(rawValue)) {\n return NaN;\n }\n // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n if (typeof rawValue === 'number' && !isFinite(rawValue)) {\n return NaN;\n }\n // If it is in fact an object, dive in one more level\n if (rawValue) {\n if (this.isHorizontal()) {\n if (rawValue.x !== undefined) {\n return this.getRightValue(rawValue.x);\n }\n } else if (rawValue.y !== undefined) {\n return this.getRightValue(rawValue.y);\n }\n }\n\n // Value is good, return it\n return rawValue;\n },\n\n // Used to get the value to display in the tooltip for the data at the given index\n // function getLabelForIndex(index, datasetIndex)\n getLabelForIndex: helpers.noop,\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: helpers.noop,\n\n // Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n getValueForPixel: helpers.noop,\n\n // Used for tick location, should\n getPixelForTick: function(index) {\n var me = this;\n var offset = me.options.offset;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var pixel = (tickWidth * index) + me.paddingLeft;\n\n if (offset) {\n pixel += tickWidth / 2;\n }\n\n var finalVal = me.left + Math.round(pixel);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n return me.top + (index * (innerHeight / (me._ticks.length - 1)));\n },\n\n // Utility for getting the pixel location of a percentage of scale\n getPixelForDecimal: function(decimal) {\n var me = this;\n if (me.isHorizontal()) {\n var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n var valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n var finalVal = me.left + Math.round(valueOffset);\n finalVal += me.isFullWidth() ? me.margins.left : 0;\n return finalVal;\n }\n return me.top + (decimal * me.height);\n },\n\n getBasePixel: function() {\n return this.getPixelForValue(this.getBaseValue());\n },\n\n getBaseValue: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n },\n\n /**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n _autoSkip: function(ticks) {\n var skipRatio;\n var me = this;\n var isHorizontal = me.isHorizontal();\n var optionTicks = me.options.ticks.minor;\n var tickCount = ticks.length;\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n var cosRotation = Math.cos(labelRotationRadians);\n var longestRotatedLabel = me.longestLabelWidth * cosRotation;\n var result = [];\n var i, tick, shouldSkip;\n\n // figure out the maximum number of gridlines to show\n var maxTicks;\n if (optionTicks.maxTicksLimit) {\n maxTicks = optionTicks.maxTicksLimit;\n }\n\n if (isHorizontal) {\n skipRatio = false;\n\n if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) {\n skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight)));\n }\n\n // if they defined a max number of optionTicks,\n // increase skipRatio until that number is met\n if (maxTicks && tickCount > maxTicks) {\n skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n }\n }\n\n for (i = 0; i < tickCount; i++) {\n tick = ticks[i];\n\n // Since we always show the last tick,we need may need to hide the last shown one before\n shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount);\n if (shouldSkip && i !== tickCount - 1 || helpers.isNullOrUndef(tick.label)) {\n // leave tick in place but make sure it's not displayed (#4635)\n delete tick.label;\n }\n result.push(tick);\n }\n return result;\n },\n\n // Actually draw the scale on the canvas\n // @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n draw: function(chartArea) {\n var me = this;\n var options = me.options;\n if (!options.display) {\n return;\n }\n\n var context = me.ctx;\n var globalDefaults = defaults.global;\n var optionTicks = options.ticks.minor;\n var optionMajorTicks = options.ticks.major || optionTicks;\n var gridLines = options.gridLines;\n var scaleLabel = options.scaleLabel;\n\n var isRotated = me.labelRotation !== 0;\n var isHorizontal = me.isHorizontal();\n\n var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n var tickFont = parseFontOptions(optionTicks);\n var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n var majorTickFont = parseFontOptions(optionMajorTicks);\n\n var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n var scaleLabelFont = parseFontOptions(scaleLabel);\n var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n var labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n var itemsToDraw = [];\n\n var xTickStart = options.position === 'right' ? me.left : me.right - tl;\n var xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n helpers.each(ticks, function(tick, index) {\n // autoskipper skipped this tick (#4635)\n if (tick.label === undefined) {\n return;\n }\n\n var label = tick.label;\n var lineWidth, lineColor, borderDash, borderDashOffset;\n if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n // Draw the first index specially\n lineWidth = gridLines.zeroLineWidth;\n lineColor = gridLines.zeroLineColor;\n borderDash = gridLines.zeroLineBorderDash;\n borderDashOffset = gridLines.zeroLineBorderDashOffset;\n } else {\n lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n }\n\n // Common properties\n var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n var textAlign = 'middle';\n var textBaseline = 'middle';\n var tickPadding = optionTicks.padding;\n\n if (isHorizontal) {\n var labelYOffset = tl + tickPadding;\n\n if (options.position === 'bottom') {\n // bottom\n textBaseline = !isRotated ? 'top' : 'middle';\n textAlign = !isRotated ? 'center' : 'right';\n labelY = me.top + labelYOffset;\n } else {\n // top\n textBaseline = !isRotated ? 'bottom' : 'middle';\n textAlign = !isRotated ? 'center' : 'left';\n labelY = me.bottom - labelYOffset;\n }\n\n var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (xLineValue < me.left) {\n lineColor = 'rgba(0,0,0,0)';\n }\n xLineValue += helpers.aliasPixel(lineWidth);\n\n labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n tx1 = tx2 = x1 = x2 = xLineValue;\n ty1 = yTickStart;\n ty2 = yTickEnd;\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n } else {\n var isLeft = options.position === 'left';\n var labelXOffset;\n\n if (optionTicks.mirror) {\n textAlign = isLeft ? 'left' : 'right';\n labelXOffset = tickPadding;\n } else {\n textAlign = isLeft ? 'right' : 'left';\n labelXOffset = tl + tickPadding;\n }\n\n labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n if (yLineValue < me.top) {\n lineColor = 'rgba(0,0,0,0)';\n }\n yLineValue += helpers.aliasPixel(lineWidth);\n\n labelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n tx1 = xTickStart;\n tx2 = xTickEnd;\n x1 = chartArea.left;\n x2 = chartArea.right;\n ty1 = ty2 = y1 = y2 = yLineValue;\n }\n\n itemsToDraw.push({\n tx1: tx1,\n ty1: ty1,\n tx2: tx2,\n ty2: ty2,\n x1: x1,\n y1: y1,\n x2: x2,\n y2: y2,\n labelX: labelX,\n labelY: labelY,\n glWidth: lineWidth,\n glColor: lineColor,\n glBorderDash: borderDash,\n glBorderDashOffset: borderDashOffset,\n rotation: -1 * labelRotationRadians,\n label: label,\n major: tick.major,\n textBaseline: textBaseline,\n textAlign: textAlign\n });\n });\n\n // Draw all of the tick labels, tick marks, and grid lines at the correct places\n helpers.each(itemsToDraw, function(itemToDraw) {\n if (gridLines.display) {\n context.save();\n context.lineWidth = itemToDraw.glWidth;\n context.strokeStyle = itemToDraw.glColor;\n if (context.setLineDash) {\n context.setLineDash(itemToDraw.glBorderDash);\n context.lineDashOffset = itemToDraw.glBorderDashOffset;\n }\n\n context.beginPath();\n\n if (gridLines.drawTicks) {\n context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n }\n\n if (gridLines.drawOnChartArea) {\n context.moveTo(itemToDraw.x1, itemToDraw.y1);\n context.lineTo(itemToDraw.x2, itemToDraw.y2);\n }\n\n context.stroke();\n context.restore();\n }\n\n if (optionTicks.display) {\n // Make sure we draw text in the correct color and font\n context.save();\n context.translate(itemToDraw.labelX, itemToDraw.labelY);\n context.rotate(itemToDraw.rotation);\n context.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n context.textBaseline = itemToDraw.textBaseline;\n context.textAlign = itemToDraw.textAlign;\n\n var label = itemToDraw.label;\n if (helpers.isArray(label)) {\n for (var i = 0, y = 0; i < label.length; ++i) {\n // We just make sure the multiline element is a string here..\n context.fillText('' + label[i], 0, y);\n // apply same lineSpacing as calculated @ L#320\n y += (tickFont.size * 1.5);\n }\n } else {\n context.fillText(label, 0, 0);\n }\n context.restore();\n }\n });\n\n if (scaleLabel.display) {\n // Draw the scale label\n var scaleLabelX;\n var scaleLabelY;\n var rotation = 0;\n var halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n if (isHorizontal) {\n scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n scaleLabelY = options.position === 'bottom'\n ? me.bottom - halfLineHeight - scaleLabelPadding.bottom\n : me.top + halfLineHeight + scaleLabelPadding.top;\n } else {\n var isLeft = options.position === 'left';\n scaleLabelX = isLeft\n ? me.left + halfLineHeight + scaleLabelPadding.top\n : me.right - halfLineHeight - scaleLabelPadding.top;\n scaleLabelY = me.top + ((me.bottom - me.top) / 2);\n rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n }\n\n context.save();\n context.translate(scaleLabelX, scaleLabelY);\n context.rotate(rotation);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.fillStyle = scaleLabelFontColor; // render in correct colour\n context.font = scaleLabelFont.font;\n context.fillText(scaleLabel.labelString, 0, 0);\n context.restore();\n }\n\n if (gridLines.drawBorder) {\n // Draw the line at the edge of the axis\n context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n var x1 = me.left;\n var x2 = me.right;\n var y1 = me.top;\n var y2 = me.bottom;\n\n var aliasPixel = helpers.aliasPixel(context.lineWidth);\n if (isHorizontal) {\n y1 = y2 = options.position === 'top' ? me.bottom : me.top;\n y1 += aliasPixel;\n y2 += aliasPixel;\n } else {\n x1 = x2 = options.position === 'left' ? me.right : me.left;\n x1 += aliasPixel;\n x2 += aliasPixel;\n }\n\n context.beginPath();\n context.moveTo(x1, y1);\n context.lineTo(x2, y2);\n context.stroke();\n }\n }\n });\n };\n\n},{\"25\":25,\"26\":26,\"34\":34,\"45\":45}],33:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n\n module.exports = function(Chart) {\n\n Chart.scaleService = {\n // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n // use the new chart options to grab the correct scale\n constructors: {},\n // Use a registration function so that we can move to an ES6 map when we no longer need to support\n // old browsers\n\n // Scale config defaults\n defaults: {},\n registerScaleType: function(type, scaleConstructor, scaleDefaults) {\n this.constructors[type] = scaleConstructor;\n this.defaults[type] = helpers.clone(scaleDefaults);\n },\n getScaleConstructor: function(type) {\n return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n },\n getScaleDefaults: function(type) {\n // Return the scale defaults merged with the global settings so that we always use the latest ones\n return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n },\n updateScaleDefaults: function(type, additions) {\n var me = this;\n if (me.defaults.hasOwnProperty(type)) {\n me.defaults[type] = helpers.extend(me.defaults[type], additions);\n }\n },\n addScalesToLayout: function(chart) {\n // Adds each scale to the chart.boxes array to be sized accordingly\n helpers.each(chart.scales, function(scale) {\n // Set ILayoutItem parameters for backwards compatibility\n scale.fullWidth = scale.options.fullWidth;\n scale.position = scale.options.position;\n scale.weight = scale.options.weight;\n Chart.layoutService.addBox(chart, scale);\n });\n }\n };\n };\n\n},{\"25\":25,\"45\":45}],34:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n\n /**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n module.exports = {\n /**\n * Namespace to hold generators for different types of ticks\n * @namespace Chart.Ticks.generators\n */\n generators: {\n /**\n * Interface for the options provided to the numeric tick generator\n * @interface INumericTickGenerationOptions\n */\n /**\n * The maximum number of ticks to display\n * @name INumericTickGenerationOptions#maxTicks\n * @type Number\n */\n /**\n * The distance between each tick.\n * @name INumericTickGenerationOptions#stepSize\n * @type Number\n * @optional\n */\n /**\n * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n * @name INumericTickGenerationOptions#min\n * @type Number\n * @optional\n */\n /**\n * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n * @name INumericTickGenerationOptions#max\n * @type Number\n * @optional\n */\n\n /**\n * Generate a set of linear ticks\n * @method Chart.Ticks.generators.linear\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n linear: function(generationOptions, dataRange) {\n var ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\n var spacing;\n if (generationOptions.stepSize && generationOptions.stepSize > 0) {\n spacing = generationOptions.stepSize;\n } else {\n var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n }\n var niceMin = Math.floor(dataRange.min / spacing) * spacing;\n var niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n // If min, max and stepSize is set and they make an evenly spaced scale use it.\n if (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n // If very close to our whole number, use it.\n if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n niceMin = generationOptions.min;\n niceMax = generationOptions.max;\n }\n }\n\n var numSpaces = (niceMax - niceMin) / spacing;\n // If very close to our rounded value, use it.\n if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n\n // Put the values into the ticks array\n ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n for (var j = 1; j < numSpaces; ++j) {\n ticks.push(niceMin + (j * spacing));\n }\n ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n return ticks;\n },\n\n /**\n * Generate a set of logarithmic ticks\n * @method Chart.Ticks.generators.logarithmic\n * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n * @param dataRange {IRange} the range of the data\n * @returns {Array} array of tick values\n */\n logarithmic: function(generationOptions, dataRange) {\n var ticks = [];\n var valueOrDefault = helpers.valueOrDefault;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph\n var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n var endExp = Math.floor(helpers.log10(dataRange.max));\n var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n var exp, significand;\n\n if (tickVal === 0) {\n exp = Math.floor(helpers.log10(dataRange.minNotZero));\n significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n ticks.push(tickVal);\n tickVal = significand * Math.pow(10, exp);\n } else {\n exp = Math.floor(helpers.log10(tickVal));\n significand = Math.floor(tickVal / Math.pow(10, exp));\n }\n\n do {\n ticks.push(tickVal);\n\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n }\n\n tickVal = significand * Math.pow(10, exp);\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n var lastTick = valueOrDefault(generationOptions.max, tickVal);\n ticks.push(lastTick);\n\n return ticks;\n }\n },\n\n /**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n formatters: {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {String|Array} the label to display\n */\n values: function(value) {\n return helpers.isArray(value) ? value : '' + value;\n },\n\n /**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {Number} the value to be formatted\n * @param index {Number} the position of the tickValue parameter in the ticks array\n * @param ticks {Array} the list of ticks being converted\n * @return {String} string representation of the tickValue parameter\n */\n linear: function(tickValue, index, ticks) {\n // If we have lots of ticks, don't use the ones\n var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) > 1) {\n if (tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n }\n\n var logDelta = helpers.log10(Math.abs(delta));\n var tickString = '';\n\n if (tickValue !== 0) {\n var numDecimal = -1 * Math.floor(logDelta);\n numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n tickString = tickValue.toFixed(numDecimal);\n } else {\n tickString = '0'; // never show decimal places for 0\n }\n\n return tickString;\n },\n\n logarithmic: function(tickValue, index, ticks) {\n var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n if (tickValue === 0) {\n return '0';\n } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n return tickValue.toExponential();\n }\n return '';\n }\n }\n };\n\n},{\"45\":45}],35:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n tooltips: {\n enabled: true,\n custom: null,\n mode: 'nearest',\n position: 'average',\n intersect: true,\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleFontStyle: 'bold',\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleFontColor: '#fff',\n titleAlign: 'left',\n bodySpacing: 2,\n bodyFontColor: '#fff',\n bodyAlign: 'left',\n footerFontStyle: 'bold',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFontColor: '#fff',\n footerAlign: 'left',\n yPadding: 6,\n xPadding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n callbacks: {\n // Args are: (tooltipItems, data)\n beforeTitle: helpers.noop,\n title: function(tooltipItems, data) {\n // Pick first xLabel for now\n var title = '';\n var labels = data.labels;\n var labelCount = labels ? labels.length : 0;\n\n if (tooltipItems.length > 0) {\n var item = tooltipItems[0];\n\n if (item.xLabel) {\n title = item.xLabel;\n } else if (labelCount > 0 && item.index < labelCount) {\n title = labels[item.index];\n }\n }\n\n return title;\n },\n afterTitle: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: helpers.noop,\n\n // Args are: (tooltipItem, data)\n beforeLabel: helpers.noop,\n label: function(tooltipItem, data) {\n var label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n if (label) {\n label += ': ';\n }\n label += tooltipItem.yLabel;\n return label;\n },\n labelColor: function(tooltipItem, chart) {\n var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n var activeElement = meta.data[tooltipItem.index];\n var view = activeElement._view;\n return {\n borderColor: view.borderColor,\n backgroundColor: view.backgroundColor\n };\n },\n labelTextColor: function() {\n return this._options.bodyFontColor;\n },\n afterLabel: helpers.noop,\n\n // Args are: (tooltipItems, data)\n afterBody: helpers.noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: helpers.noop,\n footer: helpers.noop,\n afterFooter: helpers.noop\n }\n }\n });\n\n module.exports = function(Chart) {\n\n /**\n * Helper method to merge the opacity into a color\n */\n function mergeOpacity(colorString, opacity) {\n var color = helpers.color(colorString);\n return color.alpha(opacity * color.alpha()).rgbaString();\n }\n\n // Helper to push or concat based on if the 2nd parameter is an array or not\n function pushOrConcat(base, toPush) {\n if (toPush) {\n if (helpers.isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n }\n\n // Private helper to create a tooltip item model\n // @param element : the chart element (point, arc, bar) to create the tooltip item for\n // @return : new tooltip item\n function createTooltipItem(element) {\n var xScale = element._xScale;\n var yScale = element._yScale || element._scale; // handle radar || polarArea charts\n var index = element._index;\n var datasetIndex = element._datasetIndex;\n\n return {\n xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n index: index,\n datasetIndex: datasetIndex,\n x: element._model.x,\n y: element._model.y\n };\n }\n\n /**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {Object} the tooltip options\n */\n function getBaseModel(tooltipOpts) {\n var globalDefaults = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n\n return {\n // Positioning\n xPadding: tooltipOpts.xPadding,\n yPadding: tooltipOpts.yPadding,\n xAlign: tooltipOpts.xAlign,\n yAlign: tooltipOpts.yAlign,\n\n // Body\n bodyFontColor: tooltipOpts.bodyFontColor,\n _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n _bodyAlign: tooltipOpts.bodyAlign,\n bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n bodySpacing: tooltipOpts.bodySpacing,\n\n // Title\n titleFontColor: tooltipOpts.titleFontColor,\n _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n _titleAlign: tooltipOpts.titleAlign,\n titleSpacing: tooltipOpts.titleSpacing,\n titleMarginBottom: tooltipOpts.titleMarginBottom,\n\n // Footer\n footerFontColor: tooltipOpts.footerFontColor,\n _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n _footerAlign: tooltipOpts.footerAlign,\n footerSpacing: tooltipOpts.footerSpacing,\n footerMarginTop: tooltipOpts.footerMarginTop,\n\n // Appearance\n caretSize: tooltipOpts.caretSize,\n cornerRadius: tooltipOpts.cornerRadius,\n backgroundColor: tooltipOpts.backgroundColor,\n opacity: 0,\n legendColorBackground: tooltipOpts.multiKeyBackground,\n displayColors: tooltipOpts.displayColors,\n borderColor: tooltipOpts.borderColor,\n borderWidth: tooltipOpts.borderWidth\n };\n }\n\n /**\n * Get the size of the tooltip\n */\n function getTooltipSize(tooltip, model) {\n var ctx = tooltip._chart.ctx;\n\n var height = model.yPadding * 2; // Tooltip Padding\n var width = 0;\n\n // Count of all lines in the body\n var body = model.body;\n var combinedBodyLength = body.reduce(function(count, bodyItem) {\n return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n }, 0);\n combinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n var titleLineCount = model.title.length;\n var footerLineCount = model.footer.length;\n var titleFontSize = model.titleFontSize;\n var bodyFontSize = model.bodyFontSize;\n var footerFontSize = model.footerFontSize;\n\n height += titleLineCount * titleFontSize; // Title Lines\n height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n height += combinedBodyLength * bodyFontSize; // Body Lines\n height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n height += footerLineCount * (footerFontSize); // Footer Lines\n height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n // Title width\n var widthPadding = 0;\n var maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n helpers.each(model.title, maxLineWidth);\n\n // Body width\n ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n helpers.each(body, function(bodyItem) {\n helpers.each(bodyItem.before, maxLineWidth);\n helpers.each(bodyItem.lines, maxLineWidth);\n helpers.each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n helpers.each(model.footer, maxLineWidth);\n\n // Add padding\n width += 2 * model.xPadding;\n\n return {\n width: width,\n height: height\n };\n }\n\n /**\n * Helper to get the alignment of a tooltip given the size\n */\n function determineAlignment(tooltip, size) {\n var model = tooltip._model;\n var chart = tooltip._chart;\n var chartArea = tooltip._chart.chartArea;\n var xAlign = 'center';\n var yAlign = 'center';\n\n if (model.y < size.height) {\n yAlign = 'top';\n } else if (model.y > (chart.height - size.height)) {\n yAlign = 'bottom';\n }\n\n var lf, rf; // functions to determine left, right alignment\n var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n var midX = (chartArea.left + chartArea.right) / 2;\n var midY = (chartArea.top + chartArea.bottom) / 2;\n\n if (yAlign === 'center') {\n lf = function(x) {\n return x <= midX;\n };\n rf = function(x) {\n return x > midX;\n };\n } else {\n lf = function(x) {\n return x <= (size.width / 2);\n };\n rf = function(x) {\n return x >= (chart.width - (size.width / 2));\n };\n }\n\n olf = function(x) {\n return x + size.width > chart.width;\n };\n orf = function(x) {\n return x - size.width < 0;\n };\n yf = function(y) {\n return y <= midY ? 'top' : 'bottom';\n };\n\n if (lf(model.x)) {\n xAlign = 'left';\n\n // Is tooltip too wide and goes over the right side of the chart.?\n if (olf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n } else if (rf(model.x)) {\n xAlign = 'right';\n\n // Is tooltip too wide and goes outside left edge of canvas?\n if (orf(model.x)) {\n xAlign = 'center';\n yAlign = yf(model.y);\n }\n }\n\n var opts = tooltip._options;\n return {\n xAlign: opts.xAlign ? opts.xAlign : xAlign,\n yAlign: opts.yAlign ? opts.yAlign : yAlign\n };\n }\n\n /**\n * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n function getBackgroundPoint(vm, size, alignment) {\n // Background Position\n var x = vm.x;\n var y = vm.y;\n\n var caretSize = vm.caretSize;\n var caretPadding = vm.caretPadding;\n var cornerRadius = vm.cornerRadius;\n var xAlign = alignment.xAlign;\n var yAlign = alignment.yAlign;\n var paddingAndSize = caretSize + caretPadding;\n var radiusAndPadding = cornerRadius + caretPadding;\n\n if (xAlign === 'right') {\n x -= size.width;\n } else if (xAlign === 'center') {\n x -= (size.width / 2);\n }\n\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= size.height + paddingAndSize;\n } else {\n y -= (size.height / 2);\n }\n\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n\n return {\n x: x,\n y: y\n };\n }\n\n Chart.Tooltip = Element.extend({\n initialize: function() {\n this._model = getBaseModel(this._options);\n },\n\n // Get the title\n // Args are: (tooltipItem, data)\n getTitle: function() {\n var me = this;\n var opts = me._options;\n var callbacks = opts.callbacks;\n\n var beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n var title = callbacks.title.apply(me, arguments);\n var afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeTitle);\n lines = pushOrConcat(lines, title);\n lines = pushOrConcat(lines, afterTitle);\n\n return lines;\n },\n\n // Args are: (tooltipItem, data)\n getBeforeBody: function() {\n var lines = this._options.callbacks.beforeBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Args are: (tooltipItem, data)\n getBody: function(tooltipItems, data) {\n var me = this;\n var callbacks = me._options.callbacks;\n var bodyItems = [];\n\n helpers.each(tooltipItems, function(tooltipItem) {\n var bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n },\n\n // Args are: (tooltipItem, data)\n getAfterBody: function() {\n var lines = this._options.callbacks.afterBody.apply(this, arguments);\n return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n },\n\n // Get the footer and beforeFooter and afterFooter lines\n // Args are: (tooltipItem, data)\n getFooter: function() {\n var me = this;\n var callbacks = me._options.callbacks;\n\n var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n var footer = callbacks.footer.apply(me, arguments);\n var afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n var lines = [];\n lines = pushOrConcat(lines, beforeFooter);\n lines = pushOrConcat(lines, footer);\n lines = pushOrConcat(lines, afterFooter);\n\n return lines;\n },\n\n update: function(changed) {\n var me = this;\n var opts = me._options;\n\n // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n // which breaks any animations.\n var existingModel = me._model;\n var model = me._model = getBaseModel(opts);\n var active = me._active;\n\n var data = me._data;\n\n // In the case where active.length === 0 we need to keep these at existing values for good animations\n var alignment = {\n xAlign: existingModel.xAlign,\n yAlign: existingModel.yAlign\n };\n var backgroundPoint = {\n x: existingModel.x,\n y: existingModel.y\n };\n var tooltipSize = {\n width: existingModel.width,\n height: existingModel.height\n };\n var tooltipPosition = {\n x: existingModel.caretX,\n y: existingModel.caretY\n };\n\n var i, len;\n\n if (active.length) {\n model.opacity = 1;\n\n var labelColors = [];\n var labelTextColors = [];\n tooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n var tooltipItems = [];\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (opts.filter) {\n tooltipItems = tooltipItems.filter(function(a) {\n return opts.filter(a, data);\n });\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (opts.itemSort) {\n tooltipItems = tooltipItems.sort(function(a, b) {\n return opts.itemSort(a, b, data);\n });\n }\n\n // Determine colors for boxes\n helpers.each(tooltipItems, function(tooltipItem) {\n labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n });\n\n\n // Build the Text Lines\n model.title = me.getTitle(tooltipItems, data);\n model.beforeBody = me.getBeforeBody(tooltipItems, data);\n model.body = me.getBody(tooltipItems, data);\n model.afterBody = me.getAfterBody(tooltipItems, data);\n model.footer = me.getFooter(tooltipItems, data);\n\n // Initial positioning and colors\n model.x = Math.round(tooltipPosition.x);\n model.y = Math.round(tooltipPosition.y);\n model.caretPadding = opts.caretPadding;\n model.labelColors = labelColors;\n model.labelTextColors = labelTextColors;\n\n // data points\n model.dataPoints = tooltipItems;\n\n // We need to determine alignment of the tooltip\n tooltipSize = getTooltipSize(this, model);\n alignment = determineAlignment(this, tooltipSize);\n // Final Size and Position\n backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n } else {\n model.opacity = 0;\n }\n\n model.xAlign = alignment.xAlign;\n model.yAlign = alignment.yAlign;\n model.x = backgroundPoint.x;\n model.y = backgroundPoint.y;\n model.width = tooltipSize.width;\n model.height = tooltipSize.height;\n\n // Point where the caret on the tooltip points to\n model.caretX = tooltipPosition.x;\n model.caretY = tooltipPosition.y;\n\n me._model = model;\n\n if (changed && opts.custom) {\n opts.custom.call(me, model);\n }\n\n return me;\n },\n drawCaret: function(tooltipPoint, size) {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n },\n getCaretPosition: function(tooltipPoint, size, vm) {\n var x1, x2, x3, y1, y2, y3;\n var caretSize = vm.caretSize;\n var cornerRadius = vm.cornerRadius;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var ptX = tooltipPoint.x;\n var ptY = tooltipPoint.y;\n var width = size.width;\n var height = size.height;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n x3 = x1;\n\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n x3 = x1;\n\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n x2 = ptX + (width / 2);\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n y3 = y1;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n y3 = y1;\n // invert drawing order\n var tmp = x3;\n x3 = x1;\n x1 = tmp;\n }\n }\n return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n },\n drawTitle: function(pt, vm, ctx, opacity) {\n var title = vm.title;\n\n if (title.length) {\n ctx.textAlign = vm._titleAlign;\n ctx.textBaseline = 'top';\n\n var titleFontSize = vm.titleFontSize;\n var titleSpacing = vm.titleSpacing;\n\n ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n var i, len;\n for (i = 0, len = title.length; i < len; ++i) {\n ctx.fillText(title[i], pt.x, pt.y);\n pt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n if (i + 1 === title.length) {\n pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n },\n drawBody: function(pt, vm, ctx, opacity) {\n var bodyFontSize = vm.bodyFontSize;\n var bodySpacing = vm.bodySpacing;\n var body = vm.body;\n\n ctx.textAlign = vm._bodyAlign;\n ctx.textBaseline = 'top';\n ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n // Before Body\n var xLinePadding = 0;\n var fillLineOfText = function(line) {\n ctx.fillText(line, pt.x + xLinePadding, pt.y);\n pt.y += bodyFontSize + bodySpacing;\n };\n\n // Before body lines\n helpers.each(vm.beforeBody, fillLineOfText);\n\n var drawColorBoxes = vm.displayColors;\n xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n // Draw body lines now\n helpers.each(body, function(bodyItem, i) {\n helpers.each(bodyItem.before, fillLineOfText);\n\n helpers.each(bodyItem.lines, function(line) {\n // Draw Legend-like boxes if needed\n if (drawColorBoxes) {\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Border\n ctx.lineWidth = 1;\n ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n // Inner square\n ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n var textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n ctx.fillStyle = textColor;\n }\n\n fillLineOfText(line);\n });\n\n helpers.each(bodyItem.after, fillLineOfText);\n });\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n\n // After body lines\n helpers.each(vm.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n },\n drawFooter: function(pt, vm, ctx, opacity) {\n var footer = vm.footer;\n\n if (footer.length) {\n pt.y += vm.footerMarginTop;\n\n ctx.textAlign = vm._footerAlign;\n ctx.textBaseline = 'top';\n\n ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n helpers.each(footer, function(line) {\n ctx.fillText(line, pt.x, pt.y);\n pt.y += vm.footerFontSize + vm.footerSpacing;\n });\n }\n },\n drawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n ctx.lineWidth = vm.borderWidth;\n var xAlign = vm.xAlign;\n var yAlign = vm.yAlign;\n var x = pt.x;\n var y = pt.y;\n var width = tooltipSize.width;\n var height = tooltipSize.height;\n var radius = vm.cornerRadius;\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, tooltipSize);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (vm.borderWidth > 0) {\n ctx.stroke();\n }\n },\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n\n if (vm.opacity === 0) {\n return;\n }\n\n var tooltipSize = {\n width: vm.width,\n height: vm.height\n };\n var pt = {\n x: vm.x,\n y: vm.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n // Truthy/falsey value for empty tooltip\n var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n if (this._options.enabled && hasTooltipContent) {\n // Draw Background\n this.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n // Draw Title, Body, and Footer\n pt.x += vm.xPadding;\n pt.y += vm.yPadding;\n\n // Titles\n this.drawTitle(pt, vm, ctx, opacity);\n\n // Body\n this.drawBody(pt, vm, ctx, opacity);\n\n // Footer\n this.drawFooter(pt, vm, ctx, opacity);\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {Boolean} true if the tooltip changed\n */\n handleEvent: function(e) {\n var me = this;\n var options = me._options;\n var changed = false;\n\n me._lastActive = me._lastActive || [];\n\n // Find Active Elements for tooltips\n if (e.type === 'mouseout') {\n me._active = [];\n } else {\n me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n }\n\n // Remember Last Actives\n changed = !helpers.arrayEquals(me._active, me._lastActive);\n\n // If tooltip didn't change, do not handle the target event\n if (!changed) {\n return false;\n }\n\n me._lastActive = me._active;\n\n if (options.enabled || options.custom) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n var model = me._model;\n me.update(true);\n me.pivot();\n\n // See if our tooltip position changed\n changed |= (model.x !== me._model.x) || (model.y !== me._model.y);\n }\n\n return changed;\n }\n });\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n Chart.Tooltip.positioners = {\n /**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {Point} tooltip position\n */\n average: function(elements) {\n if (!elements.length) {\n return false;\n }\n\n var i, len;\n var x = 0;\n var y = 0;\n var count = 0;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n\n return {\n x: Math.round(x / count),\n y: Math.round(y / count)\n };\n },\n\n /**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */\n nearest: function(elements, eventPosition) {\n var x = eventPosition.x;\n var y = eventPosition.y;\n var minDistance = Number.POSITIVE_INFINITY;\n var i, len, nearestElement;\n\n for (i = 0, len = elements.length; i < len; ++i) {\n var el = elements[i];\n if (el && el.hasValue()) {\n var center = el.getCenterPoint();\n var d = helpers.distanceBetweenPoints(eventPosition, center);\n\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n var tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x: x,\n y: y\n };\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],36:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n elements: {\n arc: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: '#fff',\n borderWidth: 2\n }\n }\n });\n\n module.exports = Element.extend({\n inLabelRange: function(mouseX) {\n var vm = this._view;\n\n if (vm) {\n return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n }\n return false;\n },\n\n inRange: function(chartX, chartY) {\n var vm = this._view;\n\n if (vm) {\n var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY});\n var\tangle = pointRelativePosition.angle;\n var distance = pointRelativePosition.distance;\n\n // Sanitise angle range\n var startAngle = vm.startAngle;\n var endAngle = vm.endAngle;\n while (endAngle < startAngle) {\n endAngle += 2.0 * Math.PI;\n }\n while (angle > endAngle) {\n angle -= 2.0 * Math.PI;\n }\n while (angle < startAngle) {\n angle += 2.0 * Math.PI;\n }\n\n // Check if within the range of the open/close angle\n var betweenAngles = (angle >= startAngle && angle <= endAngle);\n var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n return (betweenAngles && withinRadius);\n }\n return false;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var halfAngle = (vm.startAngle + vm.endAngle) / 2;\n var halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n return {\n x: vm.x + Math.cos(halfAngle) * halfRadius,\n y: vm.y + Math.sin(halfAngle) * halfRadius\n };\n },\n\n getArea: function() {\n var vm = this._view;\n return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\n var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n return {\n x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n };\n },\n\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var sA = vm.startAngle;\n var eA = vm.endAngle;\n\n ctx.beginPath();\n\n ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n ctx.closePath();\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = vm.borderWidth;\n\n ctx.fillStyle = vm.backgroundColor;\n\n ctx.fill();\n ctx.lineJoin = 'bevel';\n\n if (vm.borderWidth) {\n ctx.stroke();\n }\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],37:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var globalDefaults = defaults.global;\n\n defaults._set('global', {\n elements: {\n line: {\n tension: 0.4,\n backgroundColor: globalDefaults.defaultColor,\n borderWidth: 3,\n borderColor: globalDefaults.defaultColor,\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0.0,\n borderJoinStyle: 'miter',\n capBezierPoints: true,\n fill: true, // do we fill in the area between the line and its base axis\n }\n }\n });\n\n module.exports = Element.extend({\n draw: function() {\n var me = this;\n var vm = me._view;\n var ctx = me._chart.ctx;\n var spanGaps = vm.spanGaps;\n var points = me._children.slice(); // clone array\n var globalOptionLineElements = globalDefaults.elements.line;\n var lastDrawnIndex = -1;\n var index, current, previous, currentVM;\n\n // If we are looping, adding the first point again\n if (me._loop && points.length) {\n points.push(points[0]);\n }\n\n ctx.save();\n\n // Stroke Line Options\n ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n // IE 9 and 10 do not support line dash\n if (ctx.setLineDash) {\n ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n }\n\n ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n // Stroke Line\n ctx.beginPath();\n lastDrawnIndex = -1;\n\n for (index = 0; index < points.length; ++index) {\n current = points[index];\n previous = helpers.previousItem(points, index);\n currentVM = current._view;\n\n // First point moves to it's starting position no matter what\n if (index === 0) {\n if (!currentVM.skip) {\n ctx.moveTo(currentVM.x, currentVM.y);\n lastDrawnIndex = index;\n }\n } else {\n previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n if (!currentVM.skip) {\n if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n // There was a gap and this is the first point after the gap\n ctx.moveTo(currentVM.x, currentVM.y);\n } else {\n // Line to next point\n helpers.canvas.lineTo(ctx, previous._view, current._view);\n }\n lastDrawnIndex = index;\n }\n }\n }\n\n ctx.stroke();\n ctx.restore();\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],38:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n var defaultColor = defaults.global.defaultColor;\n\n defaults._set('global', {\n elements: {\n point: {\n radius: 3,\n pointStyle: 'circle',\n backgroundColor: defaultColor,\n borderColor: defaultColor,\n borderWidth: 1,\n // Hover\n hitRadius: 1,\n hoverRadius: 4,\n hoverBorderWidth: 1\n }\n }\n });\n\n function xRange(mouseX) {\n var vm = this._view;\n return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n function yRange(mouseY) {\n var vm = this._view;\n return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n }\n\n module.exports = Element.extend({\n inRange: function(mouseX, mouseY) {\n var vm = this._view;\n return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n },\n\n inLabelRange: xRange,\n inXRange: xRange,\n inYRange: yRange,\n\n getCenterPoint: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n },\n\n getArea: function() {\n return Math.PI * Math.pow(this._view.radius, 2);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y,\n padding: vm.radius + vm.borderWidth\n };\n },\n\n draw: function(chartArea) {\n var vm = this._view;\n var model = this._model;\n var ctx = this._chart.ctx;\n var pointStyle = vm.pointStyle;\n var radius = vm.radius;\n var x = vm.x;\n var y = vm.y;\n var color = helpers.color;\n var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n var ratio = 0;\n\n if (vm.skip) {\n return;\n }\n\n ctx.strokeStyle = vm.borderColor || defaultColor;\n ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n ctx.fillStyle = vm.backgroundColor || defaultColor;\n\n // Cliping for Points.\n // going out from inner charArea?\n if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) {\n // Point fade out\n if (model.x < chartArea.left) {\n ratio = (x - model.x) / (chartArea.left - model.x);\n } else if (chartArea.right * errMargin < model.x) {\n ratio = (model.x - x) / (model.x - chartArea.right);\n } else if (model.y < chartArea.top) {\n ratio = (y - model.y) / (chartArea.top - model.y);\n } else if (chartArea.bottom * errMargin < model.y) {\n ratio = (model.y - y) / (model.y - chartArea.bottom);\n }\n ratio = Math.round(ratio * 100) / 100;\n ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n }\n\n helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y);\n }\n });\n\n},{\"25\":25,\"26\":26,\"45\":45}],39:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n\n defaults._set('global', {\n elements: {\n rectangle: {\n backgroundColor: defaults.global.defaultColor,\n borderColor: defaults.global.defaultColor,\n borderSkipped: 'bottom',\n borderWidth: 0\n }\n }\n });\n\n function isVertical(bar) {\n return bar._view.width !== undefined;\n }\n\n /**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\n function getBarBounds(bar) {\n var vm = bar._view;\n var x1, x2, y1, y2;\n\n if (isVertical(bar)) {\n // vertical\n var halfWidth = vm.width / 2;\n x1 = vm.x - halfWidth;\n x2 = vm.x + halfWidth;\n y1 = Math.min(vm.y, vm.base);\n y2 = Math.max(vm.y, vm.base);\n } else {\n // horizontal bar\n var halfHeight = vm.height / 2;\n x1 = Math.min(vm.x, vm.base);\n x2 = Math.max(vm.x, vm.base);\n y1 = vm.y - halfHeight;\n y2 = vm.y + halfHeight;\n }\n\n return {\n left: x1,\n top: y1,\n right: x2,\n bottom: y2\n };\n }\n\n module.exports = Element.extend({\n draw: function() {\n var ctx = this._chart.ctx;\n var vm = this._view;\n var left, right, top, bottom, signX, signY, borderSkipped;\n var borderWidth = vm.borderWidth;\n\n if (!vm.horizontal) {\n // bar\n left = vm.x - vm.width / 2;\n right = vm.x + vm.width / 2;\n top = vm.y;\n bottom = vm.base;\n signX = 1;\n signY = bottom > top ? 1 : -1;\n borderSkipped = vm.borderSkipped || 'bottom';\n } else {\n // horizontal bar\n left = vm.base;\n right = vm.x;\n top = vm.y - vm.height / 2;\n bottom = vm.y + vm.height / 2;\n signX = right > left ? 1 : -1;\n signY = 1;\n borderSkipped = vm.borderSkipped || 'left';\n }\n\n // Canvas doesn't allow us to stroke inside the width so we can\n // adjust the sizes to fit if we're setting a stroke on the line\n if (borderWidth) {\n // borderWidth shold be less than bar width and bar height.\n var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n borderWidth = borderWidth > barSize ? barSize : borderWidth;\n var halfStroke = borderWidth / 2;\n // Adjust borderWidth when bar top position is near vm.base(zero).\n var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n // not become a vertical line?\n if (borderLeft !== borderRight) {\n top = borderTop;\n bottom = borderBottom;\n }\n // not become a horizontal line?\n if (borderTop !== borderBottom) {\n left = borderLeft;\n right = borderRight;\n }\n }\n\n ctx.beginPath();\n ctx.fillStyle = vm.backgroundColor;\n ctx.strokeStyle = vm.borderColor;\n ctx.lineWidth = borderWidth;\n\n // Corner points, from bottom-left to bottom-right clockwise\n // | 1 2 |\n // | 0 3 |\n var corners = [\n [left, bottom],\n [left, top],\n [right, top],\n [right, bottom]\n ];\n\n // Find first (starting) corner with fallback to 'bottom'\n var borders = ['bottom', 'left', 'top', 'right'];\n var startCorner = borders.indexOf(borderSkipped, 0);\n if (startCorner === -1) {\n startCorner = 0;\n }\n\n function cornerAt(index) {\n return corners[(startCorner + index) % 4];\n }\n\n // Draw rectangle from 'startCorner'\n var corner = cornerAt(0);\n ctx.moveTo(corner[0], corner[1]);\n\n for (var i = 1; i < 4; i++) {\n corner = cornerAt(i);\n ctx.lineTo(corner[0], corner[1]);\n }\n\n ctx.fill();\n if (borderWidth) {\n ctx.stroke();\n }\n },\n\n height: function() {\n var vm = this._view;\n return vm.base - vm.y;\n },\n\n inRange: function(mouseX, mouseY) {\n var inRange = false;\n\n if (this._view) {\n var bounds = getBarBounds(this);\n inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inLabelRange: function(mouseX, mouseY) {\n var me = this;\n if (!me._view) {\n return false;\n }\n\n var inRange = false;\n var bounds = getBarBounds(me);\n\n if (isVertical(me)) {\n inRange = mouseX >= bounds.left && mouseX <= bounds.right;\n } else {\n inRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n }\n\n return inRange;\n },\n\n inXRange: function(mouseX) {\n var bounds = getBarBounds(this);\n return mouseX >= bounds.left && mouseX <= bounds.right;\n },\n\n inYRange: function(mouseY) {\n var bounds = getBarBounds(this);\n return mouseY >= bounds.top && mouseY <= bounds.bottom;\n },\n\n getCenterPoint: function() {\n var vm = this._view;\n var x, y;\n if (isVertical(this)) {\n x = vm.x;\n y = (vm.y + vm.base) / 2;\n } else {\n x = (vm.x + vm.base) / 2;\n y = vm.y;\n }\n\n return {x: x, y: y};\n },\n\n getArea: function() {\n var vm = this._view;\n return vm.width * Math.abs(vm.y - vm.base);\n },\n\n tooltipPosition: function() {\n var vm = this._view;\n return {\n x: vm.x,\n y: vm.y\n };\n }\n });\n\n},{\"25\":25,\"26\":26}],40:[function(require,module,exports){\n 'use strict';\n\n module.exports = {};\n module.exports.Arc = require(36);\n module.exports.Line = require(37);\n module.exports.Point = require(38);\n module.exports.Rectangle = require(39);\n\n},{\"36\":36,\"37\":37,\"38\":38,\"39\":39}],41:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @namespace Chart.helpers.canvas\n */\n var exports = module.exports = {\n /**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n clear: function(chart) {\n chart.ctx.clearRect(0, 0, chart.width, chart.height);\n },\n\n /**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {Number} width - The rectangle's width.\n * @param {Number} height - The rectangle's height.\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n roundedRect: function(ctx, x, y, width, height, radius) {\n if (radius) {\n var rx = Math.min(radius, width / 2);\n var ry = Math.min(radius, height / 2);\n\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + width - rx, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + ry);\n ctx.lineTo(x + width, y + height - ry);\n ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height);\n ctx.lineTo(x + rx, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - ry);\n ctx.lineTo(x, y + ry);\n ctx.quadraticCurveTo(x, y, x + rx, y);\n } else {\n ctx.rect(x, y, width, height);\n }\n },\n\n drawPoint: function(ctx, style, radius, x, y) {\n var type, edgeLength, xOffset, yOffset, height, size;\n\n if (typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n return;\n }\n }\n\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n switch (style) {\n // Default includes circle\n default:\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.beginPath();\n edgeLength = 3 * radius / Math.sqrt(3);\n height = edgeLength * Math.sqrt(3) / 2;\n ctx.moveTo(x - edgeLength / 2, y + height / 3);\n ctx.lineTo(x + edgeLength / 2, y + height / 3);\n ctx.lineTo(x, y - 2 * height / 3);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rect':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n break;\n case 'rectRounded':\n var offset = radius / Math.SQRT2;\n var leftX = x - offset;\n var topY = y - offset;\n var sideSize = Math.SQRT2 * radius;\n ctx.beginPath();\n this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n ctx.closePath();\n ctx.fill();\n break;\n case 'rectRot':\n size = 1 / Math.SQRT2 * radius;\n ctx.beginPath();\n ctx.moveTo(x - size, y);\n ctx.lineTo(x, y + size);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x, y - size);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'crossRot':\n ctx.beginPath();\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'star':\n ctx.beginPath();\n ctx.moveTo(x, y + radius);\n ctx.lineTo(x, y - radius);\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n xOffset = Math.cos(Math.PI / 4) * radius;\n yOffset = Math.sin(Math.PI / 4) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x - xOffset, y + yOffset);\n ctx.lineTo(x + xOffset, y - yOffset);\n ctx.closePath();\n break;\n case 'line':\n ctx.beginPath();\n ctx.moveTo(x - radius, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n case 'dash':\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + radius, y);\n ctx.closePath();\n break;\n }\n\n ctx.stroke();\n },\n\n clipArea: function(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n },\n\n unclipArea: function(ctx) {\n ctx.restore();\n },\n\n lineTo: function(ctx, previous, target, flip) {\n if (target.steppedLine) {\n if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n if (!target.tension) {\n ctx.lineTo(target.x, target.y);\n return;\n }\n\n ctx.bezierCurveTo(\n flip ? previous.controlPointPreviousX : previous.controlPointNextX,\n flip ? previous.controlPointPreviousY : previous.controlPointNextY,\n flip ? target.controlPointNextX : target.controlPointPreviousX,\n flip ? target.controlPointNextY : target.controlPointPreviousY,\n target.x,\n target.y);\n }\n };\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.clear = exports.clear;\n\n /**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.drawRoundedRectangle = function(ctx) {\n ctx.beginPath();\n exports.roundedRect.apply(exports, arguments);\n ctx.closePath();\n };\n\n},{\"42\":42}],42:[function(require,module,exports){\n 'use strict';\n\n /**\n * @namespace Chart.helpers\n */\n var helpers = {\n /**\n * An empty function that can be used, for example, for optional callback.\n */\n noop: function() {},\n\n /**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {Number}\n * @function\n */\n uid: (function() {\n var id = 0;\n return function() {\n return id++;\n };\n }()),\n\n /**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isNullOrUndef: function(value) {\n return value === null || typeof value === 'undefined';\n },\n\n /**\n * Returns true if `value` is an array, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @function\n */\n isArray: Array.isArray ? Array.isArray : function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n /**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n isObject: function(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n },\n\n /**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n valueOrDefault: function(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n },\n\n /**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {Number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n valueAtIndexOrDefault: function(value, index, defaultValue) {\n return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n },\n\n /**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {Function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n callback: function(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n },\n\n /**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {Object|Array} loopable - The object or array to be iterated.\n * @param {Function} fn - The function to call for each item.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n */\n each: function(loopable, fn, thisArg, reverse) {\n var i, len, keys;\n if (helpers.isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (helpers.isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n },\n\n /**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see http://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {Boolean}\n */\n arrayEquals: function(a0, a1) {\n var i, ilen, v0, v1;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0 instanceof Array && v1 instanceof Array) {\n if (!helpers.arrayEquals(v0, v1)) {\n return false;\n }\n } else if (v0 !== v1) {\n // NOTE: two different object instances will never be equal: {x:20} != {x:20}\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n clone: function(source) {\n if (helpers.isArray(source)) {\n return source.map(helpers.clone);\n }\n\n if (helpers.isObject(source)) {\n var target = {};\n var keys = Object.keys(source);\n var klen = keys.length;\n var k = 0;\n\n for (; k < klen; ++k) {\n target[keys[k]] = helpers.clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n },\n\n /**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n * @private\n */\n _merger: function(key, target, source, options) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.merge(tval, sval, options);\n } else {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n _mergerIf: function(key, target, source) {\n var tval = target[key];\n var sval = source[key];\n\n if (helpers.isObject(tval) && helpers.isObject(sval)) {\n helpers.mergeIf(tval, sval);\n } else if (!target.hasOwnProperty(key)) {\n target[key] = helpers.clone(sval);\n }\n },\n\n /**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @param {Object} [options] - Merging options:\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\n * @returns {Object} The `target` object.\n */\n merge: function(target, source, options) {\n var sources = helpers.isArray(source) ? source : [source];\n var ilen = sources.length;\n var merge, i, keys, klen, k;\n\n if (!helpers.isObject(target)) {\n return target;\n }\n\n options = options || {};\n merge = options.merger || helpers._merger;\n\n for (i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!helpers.isObject(source)) {\n continue;\n }\n\n keys = Object.keys(source);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n merge(keys[k], target, source, options);\n }\n }\n\n return target;\n },\n\n /**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @returns {Object} The `target` object.\n */\n mergeIf: function(target, source) {\n return helpers.merge(target, source, {merger: helpers._mergerIf});\n }\n };\n\n module.exports = helpers;\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n helpers.callCallback = helpers.callback;\n\n /**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.indexOf = function(array, item, fromIndex) {\n return Array.prototype.indexOf.call(array, item, fromIndex);\n };\n\n /**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.getValueOrDefault = helpers.valueOrDefault;\n\n /**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n},{}],43:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\n var effects = {\n linear: function(t) {\n return t;\n },\n\n easeInQuad: function(t) {\n return t * t;\n },\n\n easeOutQuad: function(t) {\n return -t * (t - 2);\n },\n\n easeInOutQuad: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t;\n }\n return -0.5 * ((--t) * (t - 2) - 1);\n },\n\n easeInCubic: function(t) {\n return t * t * t;\n },\n\n easeOutCubic: function(t) {\n return (t = t - 1) * t * t + 1;\n },\n\n easeInOutCubic: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t + 2);\n },\n\n easeInQuart: function(t) {\n return t * t * t * t;\n },\n\n easeOutQuart: function(t) {\n return -((t = t - 1) * t * t * t - 1);\n },\n\n easeInOutQuart: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t;\n }\n return -0.5 * ((t -= 2) * t * t * t - 2);\n },\n\n easeInQuint: function(t) {\n return t * t * t * t * t;\n },\n\n easeOutQuint: function(t) {\n return (t = t - 1) * t * t * t * t + 1;\n },\n\n easeInOutQuint: function(t) {\n if ((t /= 0.5) < 1) {\n return 0.5 * t * t * t * t * t;\n }\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n },\n\n easeInSine: function(t) {\n return -Math.cos(t * (Math.PI / 2)) + 1;\n },\n\n easeOutSine: function(t) {\n return Math.sin(t * (Math.PI / 2));\n },\n\n easeInOutSine: function(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n },\n\n easeInExpo: function(t) {\n return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\n },\n\n easeOutExpo: function(t) {\n return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\n },\n\n easeInOutExpo: function(t) {\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if ((t /= 0.5) < 1) {\n return 0.5 * Math.pow(2, 10 * (t - 1));\n }\n return 0.5 * (-Math.pow(2, -10 * --t) + 2);\n },\n\n easeInCirc: function(t) {\n if (t >= 1) {\n return t;\n }\n return -(Math.sqrt(1 - t * t) - 1);\n },\n\n easeOutCirc: function(t) {\n return Math.sqrt(1 - (t = t - 1) * t);\n },\n\n easeInOutCirc: function(t) {\n if ((t /= 0.5) < 1) {\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n },\n\n easeInElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n },\n\n easeOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if (t === 1) {\n return 1;\n }\n if (!p) {\n p = 0.3;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n },\n\n easeInOutElastic: function(t) {\n var s = 1.70158;\n var p = 0;\n var a = 1;\n if (t === 0) {\n return 0;\n }\n if ((t /= 0.5) === 2) {\n return 1;\n }\n if (!p) {\n p = 0.45;\n }\n if (a < 1) {\n a = 1;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(1 / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n }\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n },\n easeInBack: function(t) {\n var s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack: function(t) {\n var s = 1.70158;\n return (t = t - 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack: function(t) {\n var s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n\n easeInBounce: function(t) {\n return 1 - effects.easeOutBounce(1 - t);\n },\n\n easeOutBounce: function(t) {\n if (t < (1 / 2.75)) {\n return 7.5625 * t * t;\n }\n if (t < (2 / 2.75)) {\n return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\n }\n if (t < (2.5 / 2.75)) {\n return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\n }\n return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\n },\n\n easeInOutBounce: function(t) {\n if (t < 0.5) {\n return effects.easeInBounce(t * 2) * 0.5;\n }\n return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n }\n };\n\n module.exports = {\n effects: effects\n };\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.easingEffects = effects;\n\n},{\"42\":42}],44:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(42);\n\n /**\n * @alias Chart.helpers.options\n * @namespace\n */\n module.exports = {\n /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n toLineHeight: function(value, size) {\n var matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n },\n\n /**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n toPadding: function(value) {\n var t, r, b, l;\n\n if (helpers.isObject(value)) {\n t = +value.top || 0;\n r = +value.right || 0;\n b = +value.bottom || 0;\n l = +value.left || 0;\n } else {\n t = r = b = l = +value || 0;\n }\n\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n height: t + b,\n width: l + r\n };\n },\n\n /**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array[]} inputs - An array of values, falling back to the last value.\n * @param {Object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {Number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n resolve: function(inputs, context, index) {\n var i, ilen, value;\n\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n }\n if (index !== undefined && helpers.isArray(value)) {\n value = value[index];\n }\n if (value !== undefined) {\n return value;\n }\n }\n }\n };\n\n},{\"42\":42}],45:[function(require,module,exports){\n 'use strict';\n\n module.exports = require(42);\n module.exports.easing = require(43);\n module.exports.canvas = require(41);\n module.exports.options = require(44);\n\n},{\"41\":41,\"42\":42,\"43\":43,\"44\":44}],46:[function(require,module,exports){\n /**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n module.exports = {\n acquireContext: function(item) {\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n return item && item.getContext('2d') || null;\n }\n };\n\n},{}],47:[function(require,module,exports){\n /**\n * Chart.Platform implementation for targeting a web browser\n */\n\n 'use strict';\n\n var helpers = require(45);\n\n var EXPANDO_KEY = '$chartjs';\n var CSS_PREFIX = 'chartjs-';\n var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n /**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\n var EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n };\n\n /**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\n function readUsedSize(element, property) {\n var value = helpers.getStyle(element, property);\n var matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? Number(matches[1]) : undefined;\n }\n\n /**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\n function initCanvas(canvas, config) {\n var style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n var renderHeight = canvas.getAttribute('height');\n var renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n\n if (renderWidth === null || renderWidth === '') {\n var displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (renderHeight === null || renderHeight === '') {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n canvas.height = canvas.width / (config.options.aspectRatio || 2);\n } else {\n var displayHeight = readUsedSize(canvas, 'height');\n if (displayWidth !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n\n return canvas;\n }\n\n /**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\n var supportsEventListenerOptions = (function() {\n var supports = false;\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function() {\n supports = true;\n }\n });\n window.addEventListener('e', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return supports;\n }());\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\n var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\n function addEventListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n\n function removeEventListener(node, type, listener) {\n node.removeEventListener(type, listener, eventListenerOptions);\n }\n\n function createEvent(type, chart, x, y, nativeEvent) {\n return {\n type: type,\n chart: chart,\n native: nativeEvent || null,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n }\n\n function fromNativeEvent(event, chart) {\n var type = EVENT_TYPES[event.type] || event.type;\n var pos = helpers.getRelativePosition(event, chart);\n return createEvent(type, chart, pos.x, pos.y, event);\n }\n\n function throttled(fn, thisArg) {\n var ticking = false;\n var args = [];\n\n return function() {\n args = Array.prototype.slice.call(arguments);\n thisArg = thisArg || this;\n\n if (!ticking) {\n ticking = true;\n helpers.requestAnimFrame.call(window, function() {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n }\n\n// Implementation based on https://github.com/marcj/css-element-queries\n function createResizer(handler) {\n var resizer = document.createElement('div');\n var cls = CSS_PREFIX + 'size-monitor';\n var maxSize = 1000000;\n var style =\n 'position:absolute;' +\n 'left:0;' +\n 'top:0;' +\n 'right:0;' +\n 'bottom:0;' +\n 'overflow:hidden;' +\n 'pointer-events:none;' +\n 'visibility:hidden;' +\n 'z-index:-1;';\n\n resizer.style.cssText = style;\n resizer.className = cls;\n resizer.innerHTML =\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ' +\n '
        ';\n\n var expand = resizer.childNodes[0];\n var shrink = resizer.childNodes[1];\n\n resizer._reset = function() {\n expand.scrollLeft = maxSize;\n expand.scrollTop = maxSize;\n shrink.scrollLeft = maxSize;\n shrink.scrollTop = maxSize;\n };\n var onScroll = function() {\n resizer._reset();\n handler();\n };\n\n addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n return resizer;\n }\n\n// https://davidwalsh.name/detect-node-insertion\n function watchForRender(node, handler) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n var proxy = expando.renderProxy = function(e) {\n if (e.animationName === CSS_RENDER_ANIMATION) {\n handler();\n }\n };\n\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n addEventListener(node, type, proxy);\n });\n\n node.classList.add(CSS_RENDER_MONITOR);\n }\n\n function unwatchForRender(node) {\n var expando = node[EXPANDO_KEY] || {};\n var proxy = expando.renderProxy;\n\n if (proxy) {\n helpers.each(ANIMATION_START_EVENTS, function(type) {\n removeEventListener(node, type, proxy);\n });\n\n delete expando.renderProxy;\n }\n\n node.classList.remove(CSS_RENDER_MONITOR);\n }\n\n function addResizeListener(node, listener, chart) {\n var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n // Let's keep track of this added resizer and thus avoid DOM query when removing it.\n var resizer = expando.resizer = createResizer(throttled(function() {\n if (expando.resizer) {\n return listener(createEvent('resize', chart));\n }\n }));\n\n // The resizer needs to be attached to the node parent, so we first need to be\n // sure that `node` is attached to the DOM before injecting the resizer element.\n watchForRender(node, function() {\n if (expando.resizer) {\n var container = node.parentNode;\n if (container && container !== resizer.parentNode) {\n container.insertBefore(resizer, container.firstChild);\n }\n\n // The container size might have changed, let's reset the resizer state.\n resizer._reset();\n }\n });\n }\n\n function removeResizeListener(node) {\n var expando = node[EXPANDO_KEY] || {};\n var resizer = expando.resizer;\n\n delete expando.resizer;\n unwatchForRender(node);\n\n if (resizer && resizer.parentNode) {\n resizer.parentNode.removeChild(resizer);\n }\n }\n\n function injectCSS(platform, css) {\n // http://stackoverflow.com/q/3922139\n var style = platform._style || document.createElement('style');\n if (!platform._style) {\n platform._style = style;\n css = '/* Chart.js */\\n' + css;\n style.setAttribute('type', 'text/css');\n document.getElementsByTagName('head')[0].appendChild(style);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n\n module.exports = {\n /**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n _enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n initialize: function() {\n var keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n injectCSS(this,\n // DOM rendering detection\n // https://davidwalsh.name/detect-node-insertion\n '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' +\n '.' + CSS_RENDER_MONITOR + '{' +\n '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' +\n '}'\n );\n },\n\n acquireContext: function(item, config) {\n if (typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n var context = item && item.getContext && item.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the item has a context2D which has item as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === item) {\n initCanvas(item, config);\n return context;\n }\n\n return null;\n },\n\n releaseContext: function(context) {\n var canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return;\n }\n\n var initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach(function(prop) {\n var value = initial[prop];\n if (helpers.isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n\n helpers.each(initial.style || {}, function(value, key) {\n canvas.style[key] = value;\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n },\n\n addEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n addResizeListener(canvas, listener, chart);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n var proxies = expando.proxies || (expando.proxies = {});\n var proxy = proxies[chart.id + '_' + type] = function(event) {\n listener(fromNativeEvent(event, chart));\n };\n\n addEventListener(canvas, type, proxy);\n },\n\n removeEventListener: function(chart, type, listener) {\n var canvas = chart.canvas;\n if (type === 'resize') {\n // Note: the resize event is not supported on all browsers.\n removeResizeListener(canvas, listener);\n return;\n }\n\n var expando = listener[EXPANDO_KEY] || {};\n var proxies = expando.proxies || {};\n var proxy = proxies[chart.id + '_' + type];\n if (!proxy) {\n return;\n }\n\n removeEventListener(canvas, type, proxy);\n }\n };\n\n// DEPRECATIONS\n\n /**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.addEvent = addEventListener;\n\n /**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n helpers.removeEvent = removeEventListener;\n\n},{\"45\":45}],48:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var basic = require(46);\n var dom = require(47);\n\n// @TODO Make possible to select another platform at build time.\n var implementation = dom._enabled ? dom : basic;\n\n /**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n module.exports = helpers.extend({\n /**\n * @since 2.7.0\n */\n initialize: function() {},\n\n /**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {Object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n acquireContext: function() {},\n\n /**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {Boolean} true if the method succeeded, else false\n */\n releaseContext: function() {},\n\n /**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {String} type - The ({@link IEvent}) type to listen for\n * @param {Function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n addEventListener: function() {},\n\n /**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart -Chart from which to remove the listener\n * @param {String} type - The ({@link IEvent}) type to remove\n * @param {Function} listener - The listener function to remove from the event target.\n */\n removeEventListener: function() {}\n\n }, implementation);\n\n /**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n /**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\n},{\"45\":45,\"46\":46,\"47\":47}],49:[function(require,module,exports){\n /**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n 'use strict';\n\n var defaults = require(25);\n var elements = require(40);\n var helpers = require(45);\n\n defaults._set('global', {\n plugins: {\n filler: {\n propagate: true\n }\n }\n });\n\n module.exports = function() {\n\n var mappers = {\n dataset: function(source) {\n var index = source.fill;\n var chart = source.chart;\n var meta = chart.getDatasetMeta(index);\n var visible = meta && chart.isDatasetVisible(index);\n var points = (visible && meta.dataset._children) || [];\n var length = points.length || 0;\n\n return !length ? null : function(point, i) {\n return (i < length && points[i]._view) || null;\n };\n },\n\n boundary: function(source) {\n var boundary = source.boundary;\n var x = boundary ? boundary.x : null;\n var y = boundary ? boundary.y : null;\n\n return function(point) {\n return {\n x: x === null ? point.x : x,\n y: y === null ? point.y : y,\n };\n };\n }\n };\n\n // @todo if (fill[0] === '#')\n function decodeFill(el, index, count) {\n var model = el._model || {};\n var fill = model.fill;\n var target;\n\n if (fill === undefined) {\n fill = !!model.backgroundColor;\n }\n\n if (fill === false || fill === null) {\n return false;\n }\n\n if (fill === true) {\n return 'origin';\n }\n\n target = parseFloat(fill, 10);\n if (isFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n\n return target;\n }\n\n switch (fill) {\n // compatibility\n case 'bottom':\n return 'start';\n case 'top':\n return 'end';\n case 'zero':\n return 'origin';\n // supported boundaries\n case 'origin':\n case 'start':\n case 'end':\n return fill;\n // invalid fill values\n default:\n return false;\n }\n }\n\n function computeBoundary(source) {\n var model = source.el._model || {};\n var scale = source.el._scale || {};\n var fill = source.fill;\n var target = null;\n var horizontal;\n\n if (isFinite(fill)) {\n return null;\n }\n\n // Backward compatibility: until v3, we still need to support boundary values set on\n // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n // controllers might still use it (e.g. the Smith chart).\n\n if (fill === 'start') {\n target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n } else if (fill === 'end') {\n target = model.scaleTop === undefined ? scale.top : model.scaleTop;\n } else if (model.scaleZero !== undefined) {\n target = model.scaleZero;\n } else if (scale.getBasePosition) {\n target = scale.getBasePosition();\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n\n if (target !== undefined && target !== null) {\n if (target.x !== undefined && target.y !== undefined) {\n return target;\n }\n\n if (typeof target === 'number' && isFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n }\n\n return null;\n }\n\n function resolveTarget(sources, index, propagate) {\n var source = sources[index];\n var fill = source.fill;\n var visited = [index];\n var target;\n\n if (!propagate) {\n return fill;\n }\n\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isFinite(fill)) {\n return fill;\n }\n\n target = sources[fill];\n if (!target) {\n return false;\n }\n\n if (target.visible) {\n return fill;\n }\n\n visited.push(fill);\n fill = target.fill;\n }\n\n return false;\n }\n\n function createMapper(source) {\n var fill = source.fill;\n var type = 'dataset';\n\n if (fill === false) {\n return null;\n }\n\n if (!isFinite(fill)) {\n type = 'boundary';\n }\n\n return mappers[type](source);\n }\n\n function isDrawable(point) {\n return point && !point.skip;\n }\n\n function drawArea(ctx, curve0, curve1, len0, len1) {\n var i;\n\n if (!len0 || !len1) {\n return;\n }\n\n // building first area curve (normal)\n ctx.moveTo(curve0[0].x, curve0[0].y);\n for (i = 1; i < len0; ++i) {\n helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n }\n\n // joining the two area curves\n ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n // building opposite area curve (reverse)\n for (i = len1 - 1; i > 0; --i) {\n helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n }\n }\n\n function doFill(ctx, points, mapper, view, color, loop) {\n var count = points.length;\n var span = view.spanGaps;\n var curve0 = [];\n var curve1 = [];\n var len0 = 0;\n var len1 = 0;\n var i, ilen, index, p0, p1, d0, d1;\n\n ctx.beginPath();\n\n for (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n index = i % count;\n p0 = points[index]._view;\n p1 = mapper(p0, index, view);\n d0 = isDrawable(p0);\n d1 = isDrawable(p1);\n\n if (d0 && d1) {\n len0 = curve0.push(p0);\n len1 = curve1.push(p1);\n } else if (len0 && len1) {\n if (!span) {\n drawArea(ctx, curve0, curve1, len0, len1);\n len0 = len1 = 0;\n curve0 = [];\n curve1 = [];\n } else {\n if (d0) {\n curve0.push(p0);\n }\n if (d1) {\n curve1.push(p1);\n }\n }\n }\n }\n\n drawArea(ctx, curve0, curve1, len0, len1);\n\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n }\n\n return {\n id: 'filler',\n\n afterDatasetsUpdate: function(chart, options) {\n var count = (chart.data.datasets || []).length;\n var propagate = options.propagate;\n var sources = [];\n var meta, i, el, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n el = meta.dataset;\n source = null;\n\n if (el && el._model && el instanceof elements.Line) {\n source = {\n visible: chart.isDatasetVisible(i),\n fill: decodeFill(el, i, count),\n chart: chart,\n el: el\n };\n }\n\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source) {\n continue;\n }\n\n source.fill = resolveTarget(sources, i, propagate);\n source.boundary = computeBoundary(source);\n source.mapper = createMapper(source);\n }\n },\n\n beforeDatasetDraw: function(chart, args) {\n var meta = args.meta.$filler;\n if (!meta) {\n return;\n }\n\n var ctx = chart.ctx;\n var el = meta.el;\n var view = el._view;\n var points = el._children || [];\n var mapper = meta.mapper;\n var color = view.backgroundColor || defaults.global.defaultColor;\n\n if (mapper && color && points.length) {\n helpers.canvas.clipArea(ctx, chart.chartArea);\n doFill(ctx, points, mapper, view, color, el._loop);\n helpers.canvas.unclipArea(ctx);\n }\n }\n };\n };\n\n},{\"25\":25,\"40\":40,\"45\":45}],50:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n legend: {\n display: true,\n position: 'top',\n fullWidth: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\n onClick: function(e, legendItem) {\n var index = legendItem.datasetIndex;\n var ci = this.chart;\n var meta = ci.getDatasetMeta(index);\n\n // See controller.isDatasetVisible comment\n meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n // We hid a dataset ... rerender the chart\n ci.update();\n },\n\n onHover: null,\n\n labels: {\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels: function(chart) {\n var data = chart.data;\n return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n return {\n text: dataset.label,\n fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n hidden: !chart.isDatasetVisible(i),\n lineCap: dataset.borderCapStyle,\n lineDash: dataset.borderDash,\n lineDashOffset: dataset.borderDashOffset,\n lineJoin: dataset.borderJoinStyle,\n lineWidth: dataset.borderWidth,\n strokeStyle: dataset.borderColor,\n pointStyle: dataset.pointStyle,\n\n // Below is extra data used for toggling the datasets\n datasetIndex: i\n };\n }, this) : [];\n }\n }\n },\n\n legendCallback: function(chart) {\n var text = [];\n text.push('
          ');\n for (var i = 0; i < chart.data.datasets.length; i++) {\n text.push('
        • ');\n if (chart.data.datasets[i].label) {\n text.push(chart.data.datasets[i].label);\n }\n text.push('
        • ');\n }\n text.push('
        ');\n return text.join('');\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n /**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\n function getBoxWidth(labelOpts, fontSize) {\n return labelOpts.usePointStyle ?\n fontSize * Math.SQRT2 :\n labelOpts.boxWidth;\n }\n\n Chart.Legend = Element.extend({\n\n initialize: function(config) {\n helpers.extend(this, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all legend types.\n // Any function can be extended by the legend type\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: function() {\n var me = this;\n var labelOpts = me.options.labels || {};\n var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter(function(item) {\n return labelOpts.filter(item, me.chart.data);\n });\n }\n\n if (me.options.reverse) {\n legendItems.reverse();\n }\n\n me.legendItems = legendItems;\n },\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var display = opts.display;\n\n var ctx = me.ctx;\n\n var globalDefault = defaults.global;\n var valueOrDefault = helpers.valueOrDefault;\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n // Reset hit boxes\n var hitboxes = me.legendHitBoxes = [];\n\n var minSize = me.minSize;\n var isHorizontal = me.isHorizontal();\n\n if (isHorizontal) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = display ? 10 : 0;\n } else {\n minSize.width = display ? 10 : 0;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n // Increase sizes here\n if (display) {\n ctx.font = labelFont;\n\n if (isHorizontal) {\n // Labels\n\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n var lineWidths = me.lineWidths = [0];\n var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n totalHeight += fontSize + (labelOpts.padding);\n lineWidths[lineWidths.length] = me.left;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: width,\n height: fontSize\n };\n\n lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n });\n\n minSize.height += totalHeight;\n\n } else {\n var vPadding = labelOpts.padding;\n var columnWidths = me.columnWidths = [];\n var totalWidth = labelOpts.padding;\n var currentColWidth = 0;\n var currentColHeight = 0;\n var itemHeight = fontSize + vPadding;\n\n helpers.each(me.legendItems, function(legendItem, i) {\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n // If too tall, go to new column\n if (currentColHeight + itemHeight > minSize.height) {\n totalWidth += currentColWidth + labelOpts.padding;\n columnWidths.push(currentColWidth); // previous column width\n\n currentColWidth = 0;\n currentColHeight = 0;\n }\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight;\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {\n left: 0,\n top: 0,\n width: itemWidth,\n height: fontSize\n };\n });\n\n totalWidth += currentColWidth;\n columnWidths.push(currentColWidth);\n minSize.width += totalWidth;\n }\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n },\n\n // Actually draw the legend on the canvas\n draw: function() {\n var me = this;\n var opts = me.options;\n var labelOpts = opts.labels;\n var globalDefault = defaults.global;\n var lineDefault = globalDefault.elements.line;\n var legendWidth = me.width;\n var lineWidths = me.lineWidths;\n\n if (opts.display) {\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var cursor;\n\n // Canvas setup\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.strokeStyle = fontColor; // for strikethrough effect\n ctx.fillStyle = fontColor; // render in correct colour\n ctx.font = labelFont;\n\n var boxWidth = getBoxWidth(labelOpts, fontSize);\n var hitboxes = me.legendHitBoxes;\n\n // current position\n var drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n if (ctx.setLineDash) {\n // IE 9 and 10 do not support line dash\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n }\n\n if (opts.labels && opts.labels.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n var radius = fontSize * Math.SQRT2 / 2;\n var offSet = radius / Math.SQRT2;\n var centerX = x + offSet;\n var centerY = y + offSet;\n\n // Draw pointStyle as legend symbol\n helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n } else {\n // Draw box as legend symbol\n if (!isLineWidthZero) {\n ctx.strokeRect(x, y, boxWidth, fontSize);\n }\n ctx.fillRect(x, y, boxWidth, fontSize);\n }\n\n ctx.restore();\n };\n var fillText = function(x, y, legendItem, textWidth) {\n var halfFontSize = fontSize / 2;\n var xLeft = boxWidth + halfFontSize + x;\n var yMiddle = y + halfFontSize;\n\n ctx.fillText(legendItem.text, xLeft, yMiddle);\n\n if (legendItem.hidden) {\n // Strikethrough the text if hidden\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.moveTo(xLeft, yMiddle);\n ctx.lineTo(xLeft + textWidth, yMiddle);\n ctx.stroke();\n }\n };\n\n // Horizontal\n var isHorizontal = me.isHorizontal();\n if (isHorizontal) {\n cursor = {\n x: me.left + ((legendWidth - lineWidths[0]) / 2),\n y: me.top + labelOpts.padding,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + labelOpts.padding,\n y: me.top + labelOpts.padding,\n line: 0\n };\n }\n\n var itemHeight = fontSize + labelOpts.padding;\n helpers.each(me.legendItems, function(legendItem, i) {\n var textWidth = ctx.measureText(legendItem.text).width;\n var width = boxWidth + (fontSize / 2) + textWidth;\n var x = cursor.x;\n var y = cursor.y;\n\n if (isHorizontal) {\n if (x + width >= legendWidth) {\n y = cursor.y += itemHeight;\n cursor.line++;\n x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n }\n } else if (y + itemHeight > me.bottom) {\n x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n y = cursor.y = me.top + labelOpts.padding;\n cursor.line++;\n }\n\n drawLegendBox(x, y, legendItem);\n\n hitboxes[i].left = x;\n hitboxes[i].top = y;\n\n // Fill the actual label\n fillText(x, y, legendItem, textWidth);\n\n if (isHorizontal) {\n cursor.x += width + (labelOpts.padding);\n } else {\n cursor.y += itemHeight;\n }\n\n });\n }\n },\n\n /**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @return {Boolean} true if a change occured\n */\n handleEvent: function(e) {\n var me = this;\n var opts = me.options;\n var type = e.type === 'mouseup' ? 'click' : e.type;\n var changed = false;\n\n if (type === 'mousemove') {\n if (!opts.onHover) {\n return;\n }\n } else if (type === 'click') {\n if (!opts.onClick) {\n return;\n }\n } else {\n return;\n }\n\n // Chart event already has relative position in it\n var x = e.x;\n var y = e.y;\n\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n // See if we are touching one of the dataset boxes\n var lh = me.legendHitBoxes;\n for (var i = 0; i < lh.length; ++i) {\n var hitBox = lh[i];\n\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n // Touching an element\n if (type === 'click') {\n // use e.native for backwards compatibility\n opts.onClick.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n } else if (type === 'mousemove') {\n // use e.native for backwards compatibility\n opts.onHover.call(me, e.native, me.legendItems[i]);\n changed = true;\n break;\n }\n }\n }\n }\n\n return changed;\n }\n });\n\n function createNewLegendAndAttach(chart, legendOpts) {\n var legend = new Chart.Legend({\n ctx: chart.ctx,\n options: legendOpts,\n chart: chart\n });\n\n layout.configure(chart, legend, legendOpts);\n layout.addBox(chart, legend);\n chart.legend = legend;\n }\n\n return {\n id: 'legend',\n\n beforeInit: function(chart) {\n var legendOpts = chart.options.legend;\n\n if (legendOpts) {\n createNewLegendAndAttach(chart, legendOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var legendOpts = chart.options.legend;\n var legend = chart.legend;\n\n if (legendOpts) {\n helpers.mergeIf(legendOpts, defaults.global.legend);\n\n if (legend) {\n layout.configure(chart, legend, legendOpts);\n legend.options = legendOpts;\n } else {\n createNewLegendAndAttach(chart, legendOpts);\n }\n } else if (legend) {\n layout.removeBox(chart, legend);\n delete chart.legend;\n }\n },\n\n afterEvent: function(chart, e) {\n var legend = chart.legend;\n if (legend) {\n legend.handleEvent(e);\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],51:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var Element = require(26);\n var helpers = require(45);\n\n defaults._set('global', {\n title: {\n display: false,\n fontStyle: 'bold',\n fullWidth: true,\n lineHeight: 1.2,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000 // by default greater than legend (1000) to be above\n }\n });\n\n module.exports = function(Chart) {\n\n var layout = Chart.layoutService;\n var noop = helpers.noop;\n\n Chart.Title = Element.extend({\n initialize: function(config) {\n var me = this;\n helpers.extend(me, config);\n\n // Contains hit boxes for each dataset (in dataset order)\n me.legendHitBoxes = [];\n },\n\n // These methods are ordered by lifecycle. Utilities then follow.\n\n beforeUpdate: noop,\n update: function(maxWidth, maxHeight, margins) {\n var me = this;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n me.beforeUpdate();\n\n // Absorb the master measurements\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me.margins = margins;\n\n // Dimensions\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n // Labels\n me.beforeBuildLabels();\n me.buildLabels();\n me.afterBuildLabels();\n\n // Fit\n me.beforeFit();\n me.fit();\n me.afterFit();\n //\n me.afterUpdate();\n\n return me.minSize;\n\n },\n afterUpdate: noop,\n\n //\n\n beforeSetDimensions: noop,\n setDimensions: function() {\n var me = this;\n // Set the unconstrained dimension before label rotation\n if (me.isHorizontal()) {\n // Reset position before calculating rotation\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n\n // Reset position before calculating rotation\n me.top = 0;\n me.bottom = me.height;\n }\n\n // Reset padding\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n\n // Reset minSize\n me.minSize = {\n width: 0,\n height: 0\n };\n },\n afterSetDimensions: noop,\n\n //\n\n beforeBuildLabels: noop,\n buildLabels: noop,\n afterBuildLabels: noop,\n\n //\n\n beforeFit: noop,\n fit: function() {\n var me = this;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var display = opts.display;\n var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n var minSize = me.minSize;\n var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0;\n\n if (me.isHorizontal()) {\n minSize.width = me.maxWidth; // fill all the width\n minSize.height = textSize;\n } else {\n minSize.width = textSize;\n minSize.height = me.maxHeight; // fill all the height\n }\n\n me.width = minSize.width;\n me.height = minSize.height;\n\n },\n afterFit: noop,\n\n // Shared Methods\n isHorizontal: function() {\n var pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n },\n\n // Actually draw the title block on the canvas\n draw: function() {\n var me = this;\n var ctx = me.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = me.options;\n var globalDefaults = defaults.global;\n\n if (opts.display) {\n var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n var offset = lineHeight / 2 + opts.padding;\n var rotation = 0;\n var top = me.top;\n var left = me.left;\n var bottom = me.bottom;\n var right = me.right;\n var maxWidth, titleX, titleY;\n\n ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n ctx.font = titleFont;\n\n // Horizontal\n if (me.isHorizontal()) {\n titleX = left + ((right - left) / 2); // midpoint of the width\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n titleX = opts.position === 'left' ? left + offset : right - offset;\n titleY = top + ((bottom - top) / 2);\n maxWidth = bottom - top;\n rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n }\n\n ctx.save();\n ctx.translate(titleX, titleY);\n ctx.rotate(rotation);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n var text = opts.text;\n if (helpers.isArray(text)) {\n var y = 0;\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], 0, y, maxWidth);\n y += lineHeight;\n }\n } else {\n ctx.fillText(text, 0, 0, maxWidth);\n }\n\n ctx.restore();\n }\n }\n });\n\n function createNewTitleBlockAndAttach(chart, titleOpts) {\n var title = new Chart.Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart: chart\n });\n\n layout.configure(chart, title, titleOpts);\n layout.addBox(chart, title);\n chart.titleBlock = title;\n }\n\n return {\n id: 'title',\n\n beforeInit: function(chart) {\n var titleOpts = chart.options.title;\n\n if (titleOpts) {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n },\n\n beforeUpdate: function(chart) {\n var titleOpts = chart.options.title;\n var titleBlock = chart.titleBlock;\n\n if (titleOpts) {\n helpers.mergeIf(titleOpts, defaults.global.title);\n\n if (titleBlock) {\n layout.configure(chart, titleBlock, titleOpts);\n titleBlock.options = titleOpts;\n } else {\n createNewTitleBlockAndAttach(chart, titleOpts);\n }\n } else if (titleBlock) {\n Chart.layoutService.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n }\n }\n };\n };\n\n},{\"25\":25,\"26\":26,\"45\":45}],52:[function(require,module,exports){\n 'use strict';\n\n module.exports = function(Chart) {\n\n // Default config for a category scale\n var defaultConfig = {\n position: 'bottom'\n };\n\n var DatasetScale = Chart.Scale.extend({\n /**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n getLabels: function() {\n var data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n },\n\n determineDataLimits: function() {\n var me = this;\n var labels = me.getLabels();\n me.minIndex = 0;\n me.maxIndex = labels.length - 1;\n var findIndex;\n\n if (me.options.ticks.min !== undefined) {\n // user specified min value\n findIndex = labels.indexOf(me.options.ticks.min);\n me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n }\n\n if (me.options.ticks.max !== undefined) {\n // user specified max value\n findIndex = labels.indexOf(me.options.ticks.max);\n me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n }\n\n me.min = labels[me.minIndex];\n me.max = labels[me.maxIndex];\n },\n\n buildTicks: function() {\n var me = this;\n var labels = me.getLabels();\n // If we are viewing some subset of labels, slice the original array\n me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var isHorizontal = me.isHorizontal();\n\n if (data.yLabels && !isHorizontal) {\n return me.getRightValue(data.datasets[datasetIndex].data[index]);\n }\n return me.ticks[index - me.minIndex];\n },\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue: function(value, index) {\n var me = this;\n var offset = me.options.offset;\n // 1 is added because we need the length but we have the indexes\n var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1);\n\n // If value is a data object, then index is the index in the data array,\n // not the index of the scale. We need to change that.\n var valueCategory;\n if (value !== undefined && value !== null) {\n valueCategory = me.isHorizontal() ? value.x : value.y;\n }\n if (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n var labels = me.getLabels();\n value = valueCategory || value;\n var idx = labels.indexOf(value);\n index = idx !== -1 ? idx : index;\n }\n\n if (me.isHorizontal()) {\n var valueWidth = me.width / offsetAmt;\n var widthOffset = (valueWidth * (index - me.minIndex));\n\n if (offset) {\n widthOffset += (valueWidth / 2);\n }\n\n return me.left + Math.round(widthOffset);\n }\n var valueHeight = me.height / offsetAmt;\n var heightOffset = (valueHeight * (index - me.minIndex));\n\n if (offset) {\n heightOffset += (valueHeight / 2);\n }\n\n return me.top + Math.round(heightOffset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var offset = me.options.offset;\n var value;\n var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1);\n var horz = me.isHorizontal();\n var valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n pixel -= horz ? me.left : me.top;\n\n if (offset) {\n pixel -= (valueDimension / 2);\n }\n\n if (pixel <= 0) {\n value = 0;\n } else {\n value = Math.round(pixel / valueDimension);\n }\n\n return value + me.minIndex;\n },\n getBasePixel: function() {\n return this.bottom;\n }\n });\n\n Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n };\n\n},{}],53:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n ticks: {\n callback: Ticks.formatters.linear\n }\n };\n\n var LinearScale = Chart.LinearScaleBase.extend({\n\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var isHorizontal = me.isHorizontal();\n var DEFAULT_MIN = 0;\n var DEFAULT_MAX = 1;\n\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // First Calculate the range\n me.min = null;\n me.max = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = {\n positiveValues: [],\n negativeValues: []\n };\n }\n\n // Store these per type\n var positiveValues = valuesPerStack[key].positiveValues;\n var negativeValues = valuesPerStack[key].negativeValues;\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n positiveValues[index] = positiveValues[index] || 0;\n negativeValues[index] = negativeValues[index] || 0;\n\n if (opts.relativePoints) {\n positiveValues[index] = 100;\n } else if (value < 0) {\n negativeValues[index] += value;\n } else {\n positiveValues[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n var minVal = helpers.min(values);\n var maxVal = helpers.max(values);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n });\n }\n });\n }\n\n me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n this.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var maxTicks;\n var me = this;\n var tickOpts = me.options.ticks;\n\n if (me.isHorizontal()) {\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n } else {\n // The factor of 2 used to scale the font size has been experimentally determined.\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n }\n\n return maxTicks;\n },\n // Called after the ticks are built. We need\n handleDirectionalChanges: function() {\n if (!this.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n this.ticks.reverse();\n }\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n // Utils\n getPixelForValue: function(value) {\n // This must be called after fit has been run so that\n // this.left, this.top, this.right, and this.bottom have been defined\n var me = this;\n var start = me.start;\n\n var rightValue = +me.getRightValue(value);\n var pixel;\n var range = me.end - start;\n\n if (me.isHorizontal()) {\n pixel = me.left + (me.width / range * (rightValue - start));\n return Math.round(pixel);\n }\n\n pixel = me.bottom - (me.height / range * (rightValue - start));\n return Math.round(pixel);\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var isHorizontal = me.isHorizontal();\n var innerDimension = isHorizontal ? me.width : me.height;\n var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n return me.start + ((me.end - me.start) * offset);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.ticksAsNumbers[index]);\n }\n });\n Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],54:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var noop = helpers.noop;\n\n Chart.LinearScaleBase = Chart.Scale.extend({\n getRightValue: function(value) {\n if (typeof value === 'string') {\n return +value;\n }\n return Chart.Scale.prototype.getRightValue.call(this, value);\n },\n\n handleTickRangeOptions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n // do nothing since that would make the chart weird. If the user really wants a weird chart\n // axis, they can manually override it\n if (tickOpts.beginAtZero) {\n var minSign = helpers.sign(me.min);\n var maxSign = helpers.sign(me.max);\n\n if (minSign < 0 && maxSign < 0) {\n // move the top up to 0\n me.max = 0;\n } else if (minSign > 0 && maxSign > 0) {\n // move the bottom down to 0\n me.min = 0;\n }\n }\n\n var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n if (tickOpts.min !== undefined) {\n me.min = tickOpts.min;\n } else if (tickOpts.suggestedMin !== undefined) {\n if (me.min === null) {\n me.min = tickOpts.suggestedMin;\n } else {\n me.min = Math.min(me.min, tickOpts.suggestedMin);\n }\n }\n\n if (tickOpts.max !== undefined) {\n me.max = tickOpts.max;\n } else if (tickOpts.suggestedMax !== undefined) {\n if (me.max === null) {\n me.max = tickOpts.suggestedMax;\n } else {\n me.max = Math.max(me.max, tickOpts.suggestedMax);\n }\n }\n\n if (setMin !== setMax) {\n // We set the min or the max but not both.\n // So ensure that our range is good\n // Inverted or 0 length range can happen when\n // ticks.min is set, and no datasets are visible\n if (me.min >= me.max) {\n if (setMin) {\n me.max = me.min + 1;\n } else {\n me.min = me.max - 1;\n }\n }\n }\n\n if (me.min === me.max) {\n me.max++;\n\n if (!tickOpts.beginAtZero) {\n me.min--;\n }\n }\n },\n getTickLimit: noop,\n handleDirectionalChanges: noop,\n\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n var maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\n var numericGeneratorOptions = {\n maxTicks: maxTicks,\n min: tickOpts.min,\n max: tickOpts.max,\n stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n };\n var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me);\n\n me.handleDirectionalChanges();\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n var me = this;\n me.ticksAsNumbers = me.ticks.slice();\n me.zeroLineIndex = me.ticks.indexOf(0);\n\n Chart.Scale.prototype.convertTicksToLabels.call(me);\n }\n });\n };\n\n},{\"34\":34,\"45\":45}],55:[function(require,module,exports){\n 'use strict';\n\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'left',\n\n // label settings\n ticks: {\n callback: Ticks.formatters.logarithmic\n }\n };\n\n var LogarithmicScale = Chart.Scale.extend({\n determineDataLimits: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n var chart = me.chart;\n var data = chart.data;\n var datasets = data.datasets;\n var valueOrDefault = helpers.valueOrDefault;\n var isHorizontal = me.isHorizontal();\n function IDMatches(meta) {\n return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n }\n\n // Calculate Range\n me.min = null;\n me.max = null;\n me.minNotZero = null;\n\n var hasStacks = opts.stacked;\n if (hasStacks === undefined) {\n helpers.each(datasets, function(dataset, datasetIndex) {\n if (hasStacks) {\n return;\n }\n\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n meta.stack !== undefined) {\n hasStacks = true;\n }\n });\n }\n\n if (opts.stacked || hasStacks) {\n var valuesPerStack = {};\n\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n var key = [\n meta.type,\n // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n meta.stack\n ].join('.');\n\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n if (valuesPerStack[key] === undefined) {\n valuesPerStack[key] = [];\n }\n\n helpers.each(dataset.data, function(rawValue, index) {\n var values = valuesPerStack[key];\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n values[index] = values[index] || 0;\n\n if (opts.relativePoints) {\n values[index] = 100;\n } else {\n // Don't need to split positive and negative since the log scale can't handle a 0 crossing\n values[index] += value;\n }\n });\n }\n });\n\n helpers.each(valuesPerStack, function(valuesForType) {\n var minVal = helpers.min(valuesForType);\n var maxVal = helpers.max(valuesForType);\n me.min = me.min === null ? minVal : Math.min(me.min, minVal);\n me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n });\n\n } else {\n helpers.each(datasets, function(dataset, datasetIndex) {\n var meta = chart.getDatasetMeta(datasetIndex);\n if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n if (me.min === null) {\n me.min = value;\n } else if (value < me.min) {\n me.min = value;\n }\n\n if (me.max === null) {\n me.max = value;\n } else if (value > me.max) {\n me.max = value;\n }\n\n if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n me.minNotZero = value;\n }\n });\n }\n });\n }\n\n me.min = valueOrDefault(tickOpts.min, me.min);\n me.max = valueOrDefault(tickOpts.max, me.max);\n\n if (me.min === me.max) {\n if (me.min !== 0 && me.min !== null) {\n me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n } else {\n me.min = 1;\n me.max = 10;\n }\n }\n },\n buildTicks: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n\n var generationOptions = {\n min: tickOpts.min,\n max: tickOpts.max\n };\n var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me);\n\n if (!me.isHorizontal()) {\n // We are in a vertical orientation. The top value is the highest. So reverse the array\n ticks.reverse();\n }\n\n // At this point, we need to update our max and min given the tick values since we have expanded the\n // range of the scale\n me.max = helpers.max(ticks);\n me.min = helpers.min(ticks);\n\n if (tickOpts.reverse) {\n ticks.reverse();\n\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n },\n convertTicksToLabels: function() {\n this.tickValues = this.ticks.slice();\n\n Chart.Scale.prototype.convertTicksToLabels.call(this);\n },\n // Get the correct tooltip label\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n getPixelForTick: function(index) {\n return this.getPixelForValue(this.tickValues[index]);\n },\n getPixelForValue: function(value) {\n var me = this;\n var start = me.start;\n var newVal = +me.getRightValue(value);\n var opts = me.options;\n var tickOpts = opts.ticks;\n var innerDimension, pixel, range;\n\n if (me.isHorizontal()) {\n range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n if (newVal === 0) {\n pixel = me.left;\n } else {\n innerDimension = me.width;\n pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n } else {\n // Bottom - top since pixels increase downward on a screen\n innerDimension = me.height;\n if (start === 0 && !tickOpts.reverse) {\n range = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n if (newVal === start) {\n pixel = me.bottom;\n } else if (newVal === me.minNotZero) {\n pixel = me.bottom - innerDimension * 0.02;\n } else {\n pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (me.end === 0 && tickOpts.reverse) {\n range = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n if (newVal === me.end) {\n pixel = me.top;\n } else if (newVal === me.minNotZero) {\n pixel = me.top + innerDimension * 0.02;\n } else {\n pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero)));\n }\n } else if (newVal === 0) {\n pixel = tickOpts.reverse ? me.top : me.bottom;\n } else {\n range = helpers.log10(me.end) - helpers.log10(start);\n innerDimension = me.height;\n pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n }\n }\n return pixel;\n },\n getValueForPixel: function(pixel) {\n var me = this;\n var range = helpers.log10(me.end) - helpers.log10(me.start);\n var value, innerDimension;\n\n if (me.isHorizontal()) {\n innerDimension = me.width;\n value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n } else { // todo: if start === 0\n innerDimension = me.height;\n value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n }\n return value;\n }\n });\n Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n };\n\n},{\"34\":34,\"45\":45}],56:[function(require,module,exports){\n 'use strict';\n\n var defaults = require(25);\n var helpers = require(45);\n var Ticks = require(34);\n\n module.exports = function(Chart) {\n\n var globalDefaults = defaults.global;\n\n var defaultConfig = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n color: 'rgba(0, 0, 0, 0.1)',\n lineWidth: 1\n },\n\n gridLines: {\n circular: false\n },\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n // String - The colour of the label backdrop\n backdropColor: 'rgba(255,255,255,0.75)',\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPaddingY: 2,\n\n // Number - The backdrop padding to the side of the label in pixels\n backdropPaddingX: 2,\n\n callback: Ticks.formatters.linear\n },\n\n pointLabels: {\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n fontSize: 10,\n\n // Function - Used to convert point labels\n callback: function(label) {\n return label;\n }\n }\n };\n\n function getValueCount(scale) {\n var opts = scale.options;\n return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n }\n\n function getPointLabelFontOptions(scale) {\n var pointLabelOptions = scale.options.pointLabels;\n var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n var font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n return {\n size: fontSize,\n style: fontStyle,\n family: fontFamily,\n font: font\n };\n }\n\n function measureLabelSize(ctx, fontSize, label) {\n if (helpers.isArray(label)) {\n return {\n w: helpers.longestText(ctx, ctx.font, label),\n h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n };\n }\n\n return {\n w: ctx.measureText(label).width,\n h: fontSize\n };\n }\n\n function determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size - 5,\n end: pos\n };\n }\n\n return {\n start: pos,\n end: pos + size + 5\n };\n }\n\n /**\n * Helper function to fit a radial linear scale with point labels\n */\n function fitWithPointLabels(scale) {\n\t\t\t/*\n\t\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t\t *\n\t\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t\t *\n\t\t\t * Solution:\n\t\t\t *\n\t\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t\t * at each index we check if the text overlaps.\n\t\t\t *\n\t\t\t * Where it does, we store that angle and that index.\n\t\t\t *\n\t\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t\t * from the shape radius to move the point inwards by that x.\n\t\t\t *\n\t\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t\t * along with labels.\n\t\t\t *\n\t\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t\t *\n\t\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t\t * and position it in the most space efficient manner\n\t\t\t *\n\t\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t\t */\n\n var plFont = getPointLabelFontOptions(scale);\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n var furthestLimits = {\n r: scale.width,\n l: 0,\n t: scale.height,\n b: 0\n };\n var furthestAngles = {};\n var i, textSize, pointPosition;\n\n scale.ctx.font = plFont.font;\n scale._pointLabelSizes = [];\n\n var valueCount = getValueCount(scale);\n for (i = 0; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, largestPossibleRadius);\n textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n scale._pointLabelSizes[i] = textSize;\n\n // Add quarter circle to make degree 0 mean top of circle\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians) % 360;\n var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n\n scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n }\n\n /**\n * Helper function to fit a radial linear scale with no point labels\n */\n function fit(scale) {\n var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n scale.drawingArea = Math.round(largestPossibleRadius);\n scale.setCenterPoint(0, 0, 0, 0);\n }\n\n function getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n }\n\n function fillText(ctx, text, position, fontSize) {\n if (helpers.isArray(text)) {\n var y = position.y;\n var spacing = 1.5 * fontSize;\n\n for (var i = 0; i < text.length; ++i) {\n ctx.fillText(text[i], position.x, y);\n y += spacing;\n }\n } else {\n ctx.fillText(text, position.x, position.y);\n }\n }\n\n function adjustPointPositionForLabelHeight(angle, textSize, position) {\n if (angle === 90 || angle === 270) {\n position.y -= (textSize.h / 2);\n } else if (angle > 270 || angle < 90) {\n position.y -= textSize.h;\n }\n }\n\n function drawPointLabels(scale) {\n var ctx = scale.ctx;\n var valueOrDefault = helpers.valueOrDefault;\n var opts = scale.options;\n var angleLineOpts = opts.angleLines;\n var pointLabelOpts = opts.pointLabels;\n\n ctx.lineWidth = angleLineOpts.lineWidth;\n ctx.strokeStyle = angleLineOpts.color;\n\n var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n // Point Label Font\n var plFont = getPointLabelFontOptions(scale);\n\n ctx.textBaseline = 'top';\n\n for (var i = getValueCount(scale) - 1; i >= 0; i--) {\n if (angleLineOpts.display) {\n var outerPosition = scale.getPointPosition(i, outerDistance);\n ctx.beginPath();\n ctx.moveTo(scale.xCenter, scale.yCenter);\n ctx.lineTo(outerPosition.x, outerPosition.y);\n ctx.stroke();\n ctx.closePath();\n }\n\n if (pointLabelOpts.display) {\n // Extra 3px out for some label spacing\n var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n // Keep this in loop since we may support array properties here\n var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = plFont.font;\n ctx.fillStyle = pointLabelFontColor;\n\n var angleRadians = scale.getIndexAngle(i);\n var angle = helpers.toDegrees(angleRadians);\n ctx.textAlign = getTextAlignForAngle(angle);\n adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n }\n }\n }\n\n function drawRadiusLine(scale, gridLineOpts, radius, index) {\n var ctx = scale.ctx;\n ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n if (scale.options.gridLines.circular) {\n // Draw circular arcs between the points\n ctx.beginPath();\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n ctx.closePath();\n ctx.stroke();\n } else {\n // Draw straight lines connecting each index\n var valueCount = getValueCount(scale);\n\n if (valueCount === 0) {\n return;\n }\n\n ctx.beginPath();\n var pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (var i = 1; i < valueCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n\n ctx.closePath();\n ctx.stroke();\n }\n }\n\n function numberOrZero(param) {\n return helpers.isNumber(param) ? param : 0;\n }\n\n var LinearRadialScale = Chart.LinearScaleBase.extend({\n setDimensions: function() {\n var me = this;\n var opts = me.options;\n var tickOpts = opts.ticks;\n // Set the unconstrained dimension before label rotation\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.xCenter = Math.round(me.width / 2);\n me.yCenter = Math.round(me.height / 2);\n\n var minSize = helpers.min([me.height, me.width]);\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n },\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var min = Number.POSITIVE_INFINITY;\n var max = Number.NEGATIVE_INFINITY;\n\n helpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n if (chart.isDatasetVisible(datasetIndex)) {\n var meta = chart.getDatasetMeta(datasetIndex);\n\n helpers.each(dataset.data, function(rawValue, index) {\n var value = +me.getRightValue(rawValue);\n if (isNaN(value) || meta.data[index].hidden) {\n return;\n }\n\n min = Math.min(value, min);\n max = Math.max(value, max);\n });\n }\n });\n\n me.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n me.handleTickRangeOptions();\n },\n getTickLimit: function() {\n var tickOpts = this.options.ticks;\n var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n },\n convertTicksToLabels: function() {\n var me = this;\n\n Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n // Point labels\n me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n },\n getLabelForIndex: function(index, datasetIndex) {\n return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n },\n fit: function() {\n if (this.options.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n fit(this);\n }\n },\n /**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n var me = this;\n var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n me.drawingArea = Math.min(\n Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n },\n setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n var me = this;\n var maxRight = me.width - rightMovement - me.drawingArea;\n var maxLeft = leftMovement + me.drawingArea;\n var maxTop = topMovement + me.drawingArea;\n var maxBottom = me.height - bottomMovement - me.drawingArea;\n\n me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n },\n\n getIndexAngle: function(index) {\n var angleMultiplier = (Math.PI * 2) / getValueCount(this);\n var startAngle = this.chart.options && this.chart.options.startAngle ?\n this.chart.options.startAngle :\n 0;\n\n var startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n // Start from the top instead of right, so remove a quarter of the circle\n return index * angleMultiplier + startAngleRadians;\n },\n getDistanceFromCenterForValue: function(value) {\n var me = this;\n\n if (value === null) {\n return 0; // null always in center\n }\n\n // Take into account half font size + the yPadding of the top value\n var scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.ticks.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n },\n getPointPosition: function(index, distanceFromCenter) {\n var me = this;\n var thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n return {\n x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n };\n },\n getPointPositionForValue: function(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n },\n\n getBasePosition: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n\n return me.getPointPositionForValue(0,\n me.beginAtZero ? 0 :\n min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0);\n },\n\n draw: function() {\n var me = this;\n var opts = me.options;\n var gridLineOpts = opts.gridLines;\n var tickOpts = opts.ticks;\n var valueOrDefault = helpers.valueOrDefault;\n\n if (opts.display) {\n var ctx = me.ctx;\n var startAngle = this.getIndexAngle(0);\n\n // Tick Font\n var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n helpers.each(me.ticks, function(label, index) {\n // Don't draw a centre value (if it is minimum)\n if (index > 0 || tickOpts.reverse) {\n var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n // Draw circular lines around the scale\n if (gridLineOpts.display && index !== 0) {\n drawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n }\n\n if (tickOpts.display) {\n var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n ctx.font = tickLabelFont;\n\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n\n if (tickOpts.showLabelBackdrop) {\n var labelWidth = ctx.measureText(label).width;\n ctx.fillStyle = tickOpts.backdropColor;\n ctx.fillRect(\n -labelWidth / 2 - tickOpts.backdropPaddingX,\n -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY,\n labelWidth + tickOpts.backdropPaddingX * 2,\n tickFontSize + tickOpts.backdropPaddingY * 2\n );\n }\n\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = tickFontColor;\n ctx.fillText(label, 0, -yCenterOffset);\n ctx.restore();\n }\n }\n });\n\n if (opts.angleLines.display || opts.pointLabels.display) {\n drawPointLabels(me);\n }\n }\n }\n });\n Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n };\n\n},{\"25\":25,\"34\":34,\"45\":45}],57:[function(require,module,exports){\n\t/* global window: false */\n 'use strict';\n\n var moment = require(6);\n moment = typeof moment === 'function' ? moment : window.moment;\n\n var defaults = require(25);\n var helpers = require(45);\n\n// Integer constants are from the ES6 spec.\n var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n var INTERVALS = {\n millisecond: {\n major: true,\n size: 1,\n steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n },\n second: {\n major: true,\n size: 1000,\n steps: [1, 2, 5, 10, 30]\n },\n minute: {\n major: true,\n size: 60000,\n steps: [1, 2, 5, 10, 30]\n },\n hour: {\n major: true,\n size: 3600000,\n steps: [1, 2, 3, 6, 12]\n },\n day: {\n major: true,\n size: 86400000,\n steps: [1, 2, 5]\n },\n week: {\n major: false,\n size: 604800000,\n steps: [1, 2, 3, 4]\n },\n month: {\n major: true,\n size: 2.628e9,\n steps: [1, 2, 3]\n },\n quarter: {\n major: false,\n size: 7.884e9,\n steps: [1, 2, 3, 4]\n },\n year: {\n major: true,\n size: 3.154e10\n }\n };\n\n var UNITS = Object.keys(INTERVALS);\n\n function sorter(a, b) {\n return a - b;\n }\n\n function arrayUnique(items) {\n var hash = {};\n var out = [];\n var i, ilen, item;\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n if (!hash[item]) {\n hash[item] = true;\n out.push(item);\n }\n }\n\n return out;\n }\n\n /**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n function buildLookupTable(timestamps, min, max, distribution) {\n if (distribution === 'linear' || !timestamps.length) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n\n var table = [];\n var items = [min];\n var i, ilen, prev, curr, next;\n\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr > min && curr < max) {\n items.push(curr);\n }\n }\n\n items.push(max);\n\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n\n // only add points that breaks the scale linearity\n if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n\n return table;\n }\n\n// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n function lookup(table, key, value) {\n var lo = 0;\n var hi = table.length - 1;\n var mid, i0, i1;\n\n while (lo >= 0 && lo <= hi) {\n mid = (lo + hi) >> 1;\n i0 = table[mid - 1] || null;\n i1 = table[mid];\n\n if (!i0) {\n // given value is outside table (before first item)\n return {lo: null, hi: i1};\n } else if (i1[key] < value) {\n lo = mid + 1;\n } else if (i0[key] > value) {\n hi = mid - 1;\n } else {\n return {lo: i0, hi: i1};\n }\n }\n\n // given value is outside table (after last item)\n return {lo: i1, hi: null};\n }\n\n /**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n function interpolate(table, skey, sval, tkey) {\n var range = lookup(table, skey, sval);\n\n // Note: the lookup table ALWAYS contains at least 2 items (min and max)\n var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n var span = next[skey] - prev[skey];\n var ratio = span ? (sval - prev[skey]) / span : 0;\n var offset = (next[tkey] - prev[tkey]) * ratio;\n\n return prev[tkey] + offset;\n }\n\n /**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\n function momentify(value, options) {\n var parser = options.parser;\n var format = options.parser || options.format;\n\n if (typeof parser === 'function') {\n return parser(value);\n }\n\n if (typeof value === 'string' && typeof format === 'string') {\n return moment(value, format);\n }\n\n if (!(value instanceof moment)) {\n value = moment(value);\n }\n\n if (value.isValid()) {\n return value;\n }\n\n // Labels are in an incompatible moment format and no `parser` has been provided.\n // The user might still use the deprecated `format` option to convert his inputs.\n if (typeof format === 'function') {\n return format(value);\n }\n\n return value;\n }\n\n function parse(input, scale) {\n if (helpers.isNullOrUndef(input)) {\n return null;\n }\n\n var options = scale.options.time;\n var value = momentify(scale.getRightValue(input), options);\n if (!value.isValid()) {\n return null;\n }\n\n if (options.round) {\n value.startOf(options.round);\n }\n\n return value.valueOf();\n }\n\n /**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n function determineStepSize(min, max, unit, capacity) {\n var range = max - min;\n var interval = INTERVALS[unit];\n var milliseconds = interval.size;\n var steps = interval.steps;\n var i, ilen, factor;\n\n if (!steps) {\n return Math.ceil(range / ((capacity || 1) * milliseconds));\n }\n\n for (i = 0, ilen = steps.length; i < ilen; ++i) {\n factor = steps[i];\n if (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n break;\n }\n }\n\n return factor;\n }\n\n function determineUnit(minUnit, min, max, capacity) {\n var ilen = UNITS.length;\n var i, interval, factor;\n\n for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n interval = INTERVALS[UNITS[i]];\n factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n if (Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n }\n\n function determineMajorUnit(unit) {\n for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].major) {\n return UNITS[i];\n }\n }\n }\n\n /**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n function generate(min, max, minor, major, capacity, options) {\n var timeOpts = options.time;\n var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n var weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n var majorTicksEnabled = options.ticks.major.enabled;\n var interval = INTERVALS[minor];\n var first = moment(min);\n var last = moment(max);\n var ticks = [];\n var time;\n\n if (!stepSize) {\n stepSize = determineStepSize(min, max, minor, capacity);\n }\n\n // For 'week' unit, handle the first day of week option\n if (weekday) {\n first = first.isoWeekday(weekday);\n last = last.isoWeekday(weekday);\n }\n\n // Align first/last ticks on unit\n first = first.startOf(weekday ? 'day' : minor);\n last = last.startOf(weekday ? 'day' : minor);\n\n // Make sure that the last tick include max\n if (last < max) {\n last.add(1, minor);\n }\n\n time = moment(first);\n\n if (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n // Align the first tick on the previous `minor` unit aligned on the `major` unit:\n // we first aligned time on the previous `major` unit then add the number of full\n // stepSize there is between first and the previous major time.\n time.startOf(major);\n time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n }\n\n for (; time < last; time.add(stepSize, minor)) {\n ticks.push(+time);\n }\n\n ticks.push(+time);\n\n return ticks;\n }\n\n /**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\n function computeOffsets(table, ticks, min, max, options) {\n var left = 0;\n var right = 0;\n var upper, lower;\n\n if (options.offset && ticks.length) {\n if (!options.time.min) {\n upper = ticks.length > 1 ? ticks[1] : max;\n lower = ticks[0];\n left = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n if (!options.time.max) {\n upper = ticks[ticks.length - 1];\n lower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n right = (\n interpolate(table, 'time', upper, 'pos') -\n interpolate(table, 'time', lower, 'pos')\n ) / 2;\n }\n }\n\n return {left: left, right: right};\n }\n\n function ticksFromTimestamps(values, majorUnit) {\n var ticks = [];\n var i, ilen, value, major;\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n value = values[i];\n major = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n ticks.push({\n value: value,\n major: major\n });\n }\n\n return ticks;\n }\n\n module.exports = function(Chart) {\n\n var defaultConfig = {\n position: 'bottom',\n\n /**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n distribution: 'linear',\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n time: {\n parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n displayFormat: false, // DEPRECATED\n isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n minUnit: 'millisecond',\n\n // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n displayFormats: {\n millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n second: 'h:mm:ss a', // 11:20:01 AM\n minute: 'h:mm a', // 11:20 AM\n hour: 'hA', // 5PM\n day: 'MMM D', // Sep 4\n week: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n month: 'MMM YYYY', // Sept 2015\n quarter: '[Q]Q - YYYY', // Q3\n year: 'YYYY' // 2015\n },\n },\n ticks: {\n autoSkip: false,\n\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n major: {\n enabled: false\n }\n }\n };\n\n var TimeScale = Chart.Scale.extend({\n initialize: function() {\n if (!moment) {\n throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n }\n\n this.mergeTicksOptions();\n\n Chart.Scale.prototype.initialize.call(this);\n },\n\n update: function() {\n var me = this;\n var options = me.options;\n\n // DEPRECATIONS: output a message only one time per update\n if (options.time && options.time.format) {\n console.warn('options.time.format is deprecated and replaced by options.time.parser.');\n }\n\n return Chart.Scale.prototype.update.apply(me, arguments);\n },\n\n /**\n * Allows data to be referenced via 't' attribute\n */\n getRightValue: function(rawValue) {\n if (rawValue && rawValue.t !== undefined) {\n rawValue = rawValue.t;\n }\n return Chart.Scale.prototype.getRightValue.call(this, rawValue);\n },\n\n determineDataLimits: function() {\n var me = this;\n var chart = me.chart;\n var timeOpts = me.options.time;\n var min = parse(timeOpts.min, me) || MAX_INTEGER;\n var max = parse(timeOpts.max, me) || MIN_INTEGER;\n var timestamps = [];\n var datasets = [];\n var labels = [];\n var i, j, ilen, jlen, data, timestamp;\n\n // Convert labels to timestamps\n for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n labels.push(parse(chart.data.labels[i], me));\n }\n\n // Convert data to timestamps\n for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n data = chart.data.datasets[i].data;\n\n // Let's consider that all data have the same format.\n if (helpers.isObject(data[0])) {\n datasets[i] = [];\n\n for (j = 0, jlen = data.length; j < jlen; ++j) {\n timestamp = parse(data[j], me);\n timestamps.push(timestamp);\n datasets[i][j] = timestamp;\n }\n } else {\n timestamps.push.apply(timestamps, labels);\n datasets[i] = labels.slice(0);\n }\n } else {\n datasets[i] = [];\n }\n }\n\n if (labels.length) {\n // Sort labels **after** data have been converted\n labels = arrayUnique(labels).sort(sorter);\n min = Math.min(min, labels[0]);\n max = Math.max(max, labels[labels.length - 1]);\n }\n\n if (timestamps.length) {\n timestamps = arrayUnique(timestamps).sort(sorter);\n min = Math.min(min, timestamps[0]);\n max = Math.max(max, timestamps[timestamps.length - 1]);\n }\n\n // In case there is no valid min/max, let's use today limits\n min = min === MAX_INTEGER ? +moment().startOf('day') : min;\n max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max;\n\n // Make sure that max is strictly higher than min (required by the lookup table)\n me.min = Math.min(min, max);\n me.max = Math.max(min + 1, max);\n\n // PRIVATE\n me._horizontal = me.isHorizontal();\n me._table = [];\n me._timestamps = {\n data: timestamps,\n datasets: datasets,\n labels: labels\n };\n },\n\n buildTicks: function() {\n var me = this;\n var min = me.min;\n var max = me.max;\n var options = me.options;\n var timeOpts = options.time;\n var formats = timeOpts.displayFormats;\n var capacity = me.getLabelCapacity(min);\n var unit = timeOpts.unit || determineUnit(timeOpts.minUnit, min, max, capacity);\n var majorUnit = determineMajorUnit(unit);\n var timestamps = [];\n var ticks = [];\n var i, ilen, timestamp;\n\n switch (options.ticks.source) {\n case 'data':\n timestamps = me._timestamps.data;\n break;\n case 'labels':\n timestamps = me._timestamps.labels;\n break;\n case 'auto':\n default:\n timestamps = generate(min, max, unit, majorUnit, capacity, options);\n }\n\n if (options.bounds === 'ticks' && timestamps.length) {\n min = timestamps[0];\n max = timestamps[timestamps.length - 1];\n }\n\n // Enforce limits with user min/max options\n min = parse(timeOpts.min, me) || min;\n max = parse(timeOpts.max, me) || max;\n\n // Remove ticks outside the min/max range\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n timestamp = timestamps[i];\n if (timestamp >= min && timestamp <= max) {\n ticks.push(timestamp);\n }\n }\n\n me.min = min;\n me.max = max;\n\n // PRIVATE\n me._unit = unit;\n me._majorUnit = majorUnit;\n me._minorFormat = formats[unit];\n me._majorFormat = formats[majorUnit];\n me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n me._offsets = computeOffsets(me._table, ticks, min, max, options);\n\n return ticksFromTimestamps(ticks, majorUnit);\n },\n\n getLabelForIndex: function(index, datasetIndex) {\n var me = this;\n var data = me.chart.data;\n var timeOpts = me.options.time;\n var label = data.labels && index < data.labels.length ? data.labels[index] : '';\n var value = data.datasets[datasetIndex].data[index];\n\n if (helpers.isObject(value)) {\n label = me.getRightValue(value);\n }\n if (timeOpts.tooltipFormat) {\n label = momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n }\n\n return label;\n },\n\n /**\n * Function to format an individual tick mark\n * @private\n */\n tickFormatFunction: function(tick, index, ticks) {\n var me = this;\n var options = me.options;\n var time = tick.valueOf();\n var majorUnit = me._majorUnit;\n var majorFormat = me._majorFormat;\n var majorTime = tick.clone().startOf(me._majorUnit).valueOf();\n var majorTickOpts = options.ticks.major;\n var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n var label = tick.format(major ? majorFormat : me._minorFormat);\n var tickOpts = major ? majorTickOpts : options.ticks.minor;\n var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n return formatter ? formatter(label, index, ticks) : label;\n },\n\n convertTicksToLabels: function(ticks) {\n var labels = [];\n var i, ilen;\n\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n }\n\n return labels;\n },\n\n /**\n * @private\n */\n getPixelForOffset: function(time) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = interpolate(me._table, 'time', time, 'pos');\n\n return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n },\n\n getPixelForValue: function(value, index, datasetIndex) {\n var me = this;\n var time = null;\n\n if (index !== undefined && datasetIndex !== undefined) {\n time = me._timestamps.datasets[datasetIndex][index];\n }\n\n if (time === null) {\n time = parse(value, me);\n }\n\n if (time !== null) {\n return me.getPixelForOffset(time);\n }\n },\n\n getPixelForTick: function(index) {\n var ticks = this.getTicks();\n return index >= 0 && index < ticks.length ?\n this.getPixelForOffset(ticks[index].value) :\n null;\n },\n\n getValueForPixel: function(pixel) {\n var me = this;\n var size = me._horizontal ? me.width : me.height;\n var start = me._horizontal ? me.left : me.top;\n var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n var time = interpolate(me._table, 'pos', pos, 'time');\n\n return moment(time);\n },\n\n /**\n * Crude approximation of what the label width might be\n * @private\n */\n getLabelWidth: function(label) {\n var me = this;\n var ticksOpts = me.options.ticks;\n var tickLabelWidth = me.ctx.measureText(label).width;\n var angle = helpers.toRadians(ticksOpts.maxRotation);\n var cosRotation = Math.cos(angle);\n var sinRotation = Math.sin(angle);\n var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n },\n\n /**\n * @private\n */\n getLabelCapacity: function(exampleTime) {\n var me = this;\n\n me._minorFormat = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\n var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, []);\n var tickLabelWidth = me.getLabelWidth(exampleLabel);\n var innerWidth = me.isHorizontal() ? me.width : me.height;\n\n return Math.floor(innerWidth / tickLabelWidth);\n }\n });\n\n Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n };\n\n},{\"25\":25,\"45\":45,\"6\":6}]},{},[7])(7)\n});"],"file":"chartjs-lazy.min.js"} \ No newline at end of file diff --git a/lib/amd/build/chartjs.min.js b/lib/amd/build/chartjs.min.js index c085a291b1c3c..c48751effc55b 100644 --- a/lib/amd/build/chartjs.min.js +++ b/lib/amd/build/chartjs.min.js @@ -1 +1,2 @@ -define(["core/chartjs-lazy"],function(a){return a}); \ No newline at end of file +define ("core/chartjs",["core/chartjs-lazy"],function(a){return a}); +//# sourceMappingURL=chartjs.min.js.map diff --git a/lib/amd/build/chartjs.min.js.map b/lib/amd/build/chartjs.min.js.map new file mode 100644 index 0000000000000..8e3f9891218d3 --- /dev/null +++ b/lib/amd/build/chartjs.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/chartjs.js"],"names":["define","ChartJS"],"mappings":"AAsBAA,OAAM,gBAAC,CAAC,mBAAD,CAAD,CAAwB,SAASC,CAAT,CAAkB,CAC5C,MAAOA,CAAAA,CACV,CAFK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Chart.js loader.\n *\n * @package core\n * @copyright 2016 Frédéric Massart - FMCorz.net\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/chartjs-lazy'], function(ChartJS) {\n return ChartJS;\n});\n"],"file":"chartjs.min.js"} \ No newline at end of file diff --git a/lib/amd/build/checkbox-toggleall.min.js b/lib/amd/build/checkbox-toggleall.min.js index b52290f8197c9..be9c0aebddd69 100644 --- a/lib/amd/build/checkbox-toggleall.min.js +++ b/lib/amd/build/checkbox-toggleall.min.js @@ -1 +1,2 @@ -define(["jquery","core/pubsub"],function(a,b){var c=!1,d={checkboxToggled:"core/checkbox-toggleall:checkboxToggled"},e=function(a,b,c){return c?a.find('[data-action="toggle"][data-togglegroup="'+b+'"]'):a.find('[data-action="toggle"][data-togglegroup^="'+b+'"]')},f=function(a,b){return e(a,b,!1).filter('[data-toggle="slave"]')},g=function(a,b,c){return e(a,b,c).filter('[data-toggle="master"]')},h=function(a,b){return e(a,b,!0).filter('[data-toggle="action"]')},i=function(c){var e,g=c.data.root,h=a(c.target),i=h.data("togglegroup");e=h.is(":checkbox")?h.is(":checked"):1===h.data("checkall");var j=f(g,i),k=j.filter(":checked");l(g,i,e,!1),j.prop("checked",e),j.trigger("change"),b.publish(d.checkboxToggled,{root:g,toggleGroupName:i,slaves:j,checkedSlaves:k,anyChecked:e})},j=function(c){var e=c.data.root,g=a(c.target),h=g.data("togglegroup").split(" "),i=[],j="";h.forEach(function(a){j+=" "+a,i.push(j.trim())}),i.forEach(function(a){var c=f(e,a),g=c.filter(":checked"),h=c.length===g.length;l(e,a,h,!0),k(e,a,!g.length),b.publish(d.checkboxToggled,{root:e,toggleGroupName:a,slaves:c,checkedSlaves:g,anyChecked:!!g.length})})},k=function(a,b,c){h(a,b).prop("disabled",c)},l=function(b,c,d,e){var f=g(b,c,e);f.prop("checked",d),f.each(function(c,e){e=a(e);var f;if(f=d?e.data("toggle-deselectall"):e.data("toggle-selectall"),e.is(":checkbox")){var g=b.find('[for="'+e.attr("id")+'"]');g.length&&g.html()!==f&&g.html(f)}else e.text(f),e.data("checkall",d?0:1)})},m=function(){if(!c){c=!0;var b=a(document.body);b.on("click",'[data-action="toggle"][data-toggle="master"]',{root:b},i),b.on("change",'[data-action="toggle"][data-toggle="slave"]',{root:b},j)}};return{init:function(){m()},events:d}}); \ No newline at end of file +define ("core/checkbox-toggleall",["jquery","core/pubsub"],function(a,b){var c=!1,d={checkboxToggled:"core/checkbox-toggleall:checkboxToggled"},e=function(a,b,c){if(c){return a.find("[data-action=\"toggle\"][data-togglegroup=\""+b+"\"]")}else{return a.find("[data-action=\"toggle\"][data-togglegroup^=\""+b+"\"]")}},f=function(a,b){return e(a,b,!1).filter("[data-toggle=\"slave\"]")},g=function(a,b,c){return e(a,b,c).filter("[data-toggle=\"master\"]")},h=function(a,b){return e(a,b,!0).filter("[data-toggle=\"action\"]")},i=function(c){var e=c.data.root,g=a(c.target),h=g.data("togglegroup"),i;if(g.is(":checkbox")){i=g.is(":checked")}else{i=1===g.data("checkall")}var j=f(e,h),k=j.filter(":checked");l(e,h,i,!1);j.prop("checked",i);j.trigger("change");b.publish(d.checkboxToggled,{root:e,toggleGroupName:h,slaves:j,checkedSlaves:k,anyChecked:i})},j=function(c){var e=c.data.root,g=a(c.target),h=g.data("togglegroup").split(" "),i=[],j="";h.forEach(function(a){j+=" "+a;i.push(j.trim())});i.forEach(function(a){var c=f(e,a),g=c.filter(":checked"),h=c.length===g.length;l(e,a,h,!0);k(e,a,!g.length);b.publish(d.checkboxToggled,{root:e,toggleGroupName:a,slaves:c,checkedSlaves:g,anyChecked:!!g.length})})},k=function(a,b,c){h(a,b).prop("disabled",c)},l=function(b,c,d,e){var f=g(b,c,e);f.prop("checked",d);f.each(function(c,e){e=a(e);var f;if(d){f=e.data("toggle-deselectall")}else{f=e.data("toggle-selectall")}if(e.is(":checkbox")){var g=b.find("[for=\""+e.attr("id")+"\"]");if(g.length){if(g.html()!==f){g.html(f)}}}else{e.text(f);e.data("checkall",d?0:1)}})},m=function(){if(!c){c=!0;var b=a(document.body);b.on("click","[data-action=\"toggle\"][data-toggle=\"master\"]",{root:b},i);b.on("change","[data-action=\"toggle\"][data-toggle=\"slave\"]",{root:b},j)}};return{init:function init(){m()},events:d}}); +//# sourceMappingURL=checkbox-toggleall.min.js.map diff --git a/lib/amd/build/checkbox-toggleall.min.js.map b/lib/amd/build/checkbox-toggleall.min.js.map new file mode 100644 index 0000000000000..846842132f38c --- /dev/null +++ b/lib/amd/build/checkbox-toggleall.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/checkbox-toggleall.js"],"names":["define","$","PubSub","registered","events","checkboxToggled","getToggleGroupElements","root","toggleGroup","exactMatch","find","getAllSlaveCheckboxes","filter","getControlCheckboxes","getActionElements","toggleSlavesFromMasters","e","data","target","toggleGroupName","targetState","is","slaves","checkedSlaves","setMasterStates","prop","trigger","publish","anyChecked","toggleMastersFromSlaves","toggleGroups","split","toggleGroupLevels","toggleGroupLevel","forEach","push","trim","length","setActionElementStates","disableActionElements","masters","each","i","masterElement","targetString","masterLabel","attr","html","text","registerListeners","document","body","on","init"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * A module to help with toggle select/deselect all.\n *\n * @module core/checkbox-toggleall\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/pubsub'], function($, PubSub) {\n\n /**\n * Whether event listeners have already been registered.\n *\n * @private\n * @type {boolean}\n */\n var registered = false;\n\n /**\n * List of custom events that this module publishes.\n *\n * @private\n * @type {{checkboxToggled: string}}\n */\n var events = {\n checkboxToggled: 'core/checkbox-toggleall:checkboxToggled',\n };\n\n /**\n * Fetches elements that are member of a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name that we're searching form.\n * @param {boolean} exactMatch Whether we want an exact match we just want to match toggle groups that start with the given\n * toggle group name.\n * @returns {jQuery} The elements matching the given toggle group.\n */\n var getToggleGroupElements = function(root, toggleGroup, exactMatch) {\n if (exactMatch) {\n return root.find('[data-action=\"toggle\"][data-togglegroup=\"' + toggleGroup + '\"]');\n } else {\n return root.find('[data-action=\"toggle\"][data-togglegroup^=\"' + toggleGroup + '\"]');\n }\n };\n\n /**\n * Fetches the slave checkboxes for a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The slave checkboxes belonging to the toggle group.\n */\n var getAllSlaveCheckboxes = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, false).filter('[data-toggle=\"slave\"]');\n };\n\n /**\n * Fetches the master elements (checkboxes or buttons) that control the slave checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @param {boolean} exactMatch\n * @returns {jQuery} The control elements belonging to the toggle group.\n */\n var getControlCheckboxes = function(root, toggleGroup, exactMatch) {\n return getToggleGroupElements(root, toggleGroup, exactMatch).filter('[data-toggle=\"master\"]');\n };\n\n /**\n * Fetches the action elements that perform actions on the selected checkboxes in a given toggle group.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroup The toggle group name.\n * @returns {jQuery} The action elements belonging to the toggle group.\n */\n var getActionElements = function(root, toggleGroup) {\n return getToggleGroupElements(root, toggleGroup, true).filter('[data-toggle=\"action\"]');\n };\n\n /**\n * Toggles the slave checkboxes in a given toggle group when a master element in that toggle group is toggled.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleSlavesFromMasters = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n\n var toggleGroupName = target.data('togglegroup');\n var targetState;\n if (target.is(':checkbox')) {\n targetState = target.is(':checked');\n } else {\n targetState = target.data('checkall') === 1;\n }\n\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n var checkedSlaves = slaves.filter(':checked');\n\n setMasterStates(root, toggleGroupName, targetState, false);\n\n // Set the slave checkboxes from the masters.\n slaves.prop('checked', targetState);\n // Trigger 'change' event to toggle other master checkboxes (e.g. parent master checkboxes) and action elements.\n slaves.trigger('change');\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: targetState,\n });\n };\n\n /**\n * Toggles the master checkboxes in a given toggle group when all or none of the slave checkboxes in the same toggle group\n * have been selected.\n *\n * @private\n * @param {Object} e The event object.\n */\n var toggleMastersFromSlaves = function(e) {\n var root = e.data.root;\n var target = $(e.target);\n\n var toggleGroups = target.data('togglegroup').split(' ');\n var toggleGroupLevels = [];\n var toggleGroupLevel = '';\n toggleGroups.forEach(function(toggleGroupName) {\n toggleGroupLevel += ' ' + toggleGroupName;\n toggleGroupLevels.push(toggleGroupLevel.trim());\n });\n\n toggleGroupLevels.forEach(function(toggleGroupName) {\n var slaves = getAllSlaveCheckboxes(root, toggleGroupName);\n var checkedSlaves = slaves.filter(':checked');\n var targetState = (slaves.length === checkedSlaves.length);\n\n // Make sure to toggle the exact master checkbox.\n setMasterStates(root, toggleGroupName, targetState, true);\n\n // Enable action elements when there's at least one checkbox checked. Disable otherwise.\n setActionElementStates(root, toggleGroupName, !checkedSlaves.length);\n\n PubSub.publish(events.checkboxToggled, {\n root: root,\n toggleGroupName: toggleGroupName,\n slaves: slaves,\n checkedSlaves: checkedSlaves,\n anyChecked: !!checkedSlaves.length,\n });\n });\n };\n\n /**\n * Enables or disables the action elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the action element(s).\n * @param {boolean} disableActionElements Whether to disable or to enable the action elements.\n */\n var setActionElementStates = function(root, toggleGroupName, disableActionElements) {\n getActionElements(root, toggleGroupName).prop('disabled', disableActionElements);\n };\n\n /**\n * Selects or deselects the master elements.\n *\n * @private\n * @param {jQuery} root The root jQuery element.\n * @param {string} toggleGroupName The toggle group name of the master element(s).\n * @param {boolean} targetState Whether to select (true) or deselect (false).\n * @param {boolean} exactMatch Whether to do an exact match for the toggle group name or not.\n */\n var setMasterStates = function(root, toggleGroupName, targetState, exactMatch) {\n // Set the master checkboxes value and ARIA labels..\n var masters = getControlCheckboxes(root, toggleGroupName, exactMatch);\n masters.prop('checked', targetState);\n masters.each(function(i, masterElement) {\n masterElement = $(masterElement);\n\n var targetString;\n if (targetState) {\n targetString = masterElement.data('toggle-deselectall');\n } else {\n targetString = masterElement.data('toggle-selectall');\n }\n\n if (masterElement.is(':checkbox')) {\n var masterLabel = root.find('[for=\"' + masterElement.attr('id') + '\"]');\n if (masterLabel.length) {\n if (masterLabel.html() !== targetString) {\n masterLabel.html(targetString);\n }\n }\n } else {\n masterElement.text(targetString);\n // Set the checkall data attribute.\n masterElement.data('checkall', targetState ? 0 : 1);\n }\n });\n };\n\n /**\n * Registers the event listeners.\n *\n * @private\n */\n var registerListeners = function() {\n if (!registered) {\n registered = true;\n\n var root = $(document.body);\n root.on('click', '[data-action=\"toggle\"][data-toggle=\"master\"]', {root: root}, toggleSlavesFromMasters);\n root.on('change', '[data-action=\"toggle\"][data-toggle=\"slave\"]', {root: root}, toggleMastersFromSlaves);\n }\n };\n\n return {\n init: function() {\n registerListeners();\n },\n events: events,\n };\n});\n"],"file":"checkbox-toggleall.min.js"} \ No newline at end of file diff --git a/lib/amd/build/config.min.js b/lib/amd/build/config.min.js index 03f444f27b12d..66996530576d5 100644 --- a/lib/amd/build/config.min.js +++ b/lib/amd/build/config.min.js @@ -1 +1,2 @@ -define(function(){return M.cfg}); \ No newline at end of file +define ("core/config",function(){return M.cfg}); +//# sourceMappingURL=config.min.js.map diff --git a/lib/amd/build/config.min.js.map b/lib/amd/build/config.min.js.map new file mode 100644 index 0000000000000..fe10adc5ef6d7 --- /dev/null +++ b/lib/amd/build/config.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/config.js"],"names":["define","M","cfg"],"mappings":"AAyBAA,OAAM,eAAC,UAAW,CAGd,MAAwCC,CAAAA,CAAC,CAACC,GAC7C,CAJK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Expose the M.cfg global variable.\n *\n * @module core/config\n * @class config\n * @package core\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(function() {\n\n // This module exposes only the raw data from M.cfg;\n return /** @alias module:core/config */ M.cfg;\n});\n"],"file":"config.min.js"} \ No newline at end of file diff --git a/lib/amd/build/custom_interaction_events.min.js b/lib/amd/build/custom_interaction_events.min.js index 8c7b7b15c95b6..969d782603344 100644 --- a/lib/amd/build/custom_interaction_events.min.js +++ b/lib/amd/build/custom_interaction_events.min.js @@ -1 +1,2 @@ -define(["jquery","core/key_codes"],function(a,b){var c={activate:"cie:activate",keyboardActivate:"cie:keyboardactivate",escape:"cie:escape",down:"cie:down",up:"cie:up",home:"cie:home",end:"cie:end",next:"cie:next",previous:"cie:previous",asterix:"cie:asterix",scrollLock:"cie:scrollLock",scrollTop:"cie:scrollTop",scrollBottom:"cie:scrollBottom",ctrlPageUp:"cie:ctrlPageUp",ctrlPageDown:"cie:ctrlPageDown",enter:"cie:enter"},d={},e=function(a,b){return b=b||[],!(!b.length||b.indexOf(a)===-1)},f=function(a){return a.shiftKey||a.metaKey||a.altKey||a.ctrlKey},g=function(b,c){var e="";return c.hasOwnProperty("originalEvent")?(e="triggeredCustom_"+b,c.originalEvent.hasOwnProperty(e)?void 0:(c.originalEvent[e]=!0,void a(c.target).trigger(b,[{originalEvent:c}]))):(e=""+b+c.type+c.timeStamp,void(d.hasOwnProperty(e)||(d[e]=!0,a(c.target).trigger(b,[{originalEvent:c}]))))},h=function(a,b,c){a.off("keydown."+b).on("keydown."+b,function(a){f(a)||a.keyCode==c&&g(b,a)})},i=function(a){a.off("click.cie.activate").on("click.cie.activate",function(a){g(c.activate,a)}),a.off("keydown.cie.activate").on("keydown.cie.activate",function(a){f(a)||a.keyCode!=b.enter&&a.keyCode!=b.space||g(c.activate,a)})},j=function(a){a.off("keydown.cie.keyboardactivate").on("keydown.cie.keyboardactivate",function(a){f(a)||a.keyCode!=b.enter&&a.keyCode!=b.space||g(c.keyboardActivate,a)})},k=function(a){h(a,c.escape,b.escape)},l=function(a){h(a,c.down,b.arrowDown)},m=function(a){h(a,c.up,b.arrowUp)},n=function(a){h(a,c.home,b.home)},o=function(a){h(a,c.end,b.end)},p=function(d){var e="rtl"==a("html").attr("dir")?b.arrowLeft:b.arrowRight;h(d,c.next,e)},q=function(d){var e="rtl"==a("html").attr("dir")?b.arrowRight:b.arrowLeft;h(d,c.previous,e)},r=function(a){h(a,c.asterix,b.asterix)},s=function(a){a.off("scroll.cie.scrollTop").on("scroll.cie.scrollTop",function(b){var d=a.scrollTop();0===d&&g(c.scrollTop,b)})},t=function(a){a.off("scroll.cie.scrollBottom").on("scroll.cie.scrollBottom",function(b){var d=a.scrollTop(),e=a.innerHeight(),f=a[0].scrollHeight;d+e>=f&&g(c.scrollBottom,b)})},u=function(a){a.off("DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock").on("DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock",function(b){var d=a.scrollTop(),e=a[0].scrollHeight,f=a.height(),h="DOMMouseScroll"==b.type?b.originalEvent.detail*-40:b.originalEvent.wheelDelta,i=h>0;return!i&&-h>e-f-d?(a.scrollTop(e),b.stopPropagation(),b.preventDefault(),b.returnValue=!1,g(c.scrollLock,b),!1):!(i&&h>d)||(a.scrollTop(0),b.stopPropagation(),b.preventDefault(),b.returnValue=!1,g(c.scrollLock,b),!1)})},v=function(a){a.off("keydown.cie.ctrlpageup").on("keydown.cie.ctrlpageup",function(a){a.ctrlKey&&a.keyCode==b.pageUp&&g(c.ctrlPageUp,a)})},w=function(a){a.off("keydown.cie.ctrlpagedown").on("keydown.cie.ctrlpagedown",function(a){a.ctrlKey&&a.keyCode==b.pageDown&&g(c.ctrlPageDown,a)})},x=function(a){h(a,c.enter,b.enter)},y=function(){var a={};return a[c.activate]=i,a[c.keyboardActivate]=j,a[c.escape]=k,a[c.down]=l,a[c.up]=m,a[c.home]=n,a[c.end]=o,a[c.next]=p,a[c.previous]=q,a[c.asterix]=r,a[c.scrollLock]=u,a[c.scrollTop]=s,a[c.scrollBottom]=t,a[c.ctrlPageUp]=v,a[c.ctrlPageDown]=w,a[c.enter]=x,a},z=function(b,c){b=a(b),c=c||[],b.length&&c.length&&a.each(y(),function(a,d){e(a,c)&&d(b)})};return{define:z,events:c}}); \ No newline at end of file +define ("core/custom_interaction_events",["jquery","core/key_codes"],function(a,b){var c={activate:"cie:activate",keyboardActivate:"cie:keyboardactivate",escape:"cie:escape",down:"cie:down",up:"cie:up",home:"cie:home",end:"cie:end",next:"cie:next",previous:"cie:previous",asterix:"cie:asterix",scrollLock:"cie:scrollLock",scrollTop:"cie:scrollTop",scrollBottom:"cie:scrollBottom",ctrlPageUp:"cie:ctrlPageUp",ctrlPageDown:"cie:ctrlPageDown",enter:"cie:enter"},d={},e=function(a,b){b=b||[];if(b.length&&-1!==b.indexOf(a)){return!0}return!1},f=function(a){return a.shiftKey||a.metaKey||a.altKey||a.ctrlKey},g=function(b,c){var e="";if(!c.hasOwnProperty("originalEvent")){e=""+b+c.type+c.timeStamp;if(!d.hasOwnProperty(e)){d[e]=!0;a(c.target).trigger(b,[{originalEvent:c}])}return}e="triggeredCustom_"+b;if(!c.originalEvent.hasOwnProperty(e)){c.originalEvent[e]=!0;a(c.target).trigger(b,[{originalEvent:c}])}},h=function(a,b,c){a.off("keydown."+b).on("keydown."+b,function(a){if(!f(a)){if(a.keyCode==c){g(b,a)}}})},i=function(a){a.off("click.cie.activate").on("click.cie.activate",function(a){g(c.activate,a)});a.off("keydown.cie.activate").on("keydown.cie.activate",function(a){if(!f(a)){if(a.keyCode==b.enter||a.keyCode==b.space){g(c.activate,a)}}})},j=function(a){a.off("keydown.cie.keyboardactivate").on("keydown.cie.keyboardactivate",function(a){if(!f(a)){if(a.keyCode==b.enter||a.keyCode==b.space){g(c.keyboardActivate,a)}}})},k=function(a){h(a,c.escape,b.escape)},l=function(a){h(a,c.down,b.arrowDown)},m=function(a){h(a,c.up,b.arrowUp)},n=function(a){h(a,c.home,b.home)},o=function(a){h(a,c.end,b.end)},p=function(d){var e="rtl"==a("html").attr("dir")?b.arrowLeft:b.arrowRight;h(d,c.next,e)},q=function(d){var e="rtl"==a("html").attr("dir")?b.arrowRight:b.arrowLeft;h(d,c.previous,e)},r=function(a){h(a,c.asterix,b.asterix)},s=function(a){a.off("scroll.cie.scrollTop").on("scroll.cie.scrollTop",function(b){var d=a.scrollTop();if(0===d){g(c.scrollTop,b)}})},t=function(a){a.off("scroll.cie.scrollBottom").on("scroll.cie.scrollBottom",function(b){var d=a.scrollTop(),e=a.innerHeight(),f=a[0].scrollHeight;if(d+e>=f){g(c.scrollBottom,b)}})},u=function(a){a.off("DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock").on("DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock",function(b){var d=a.scrollTop(),e=a[0].scrollHeight,f=a.height(),h="DOMMouseScroll"==b.type?-40*b.originalEvent.detail:b.originalEvent.wheelDelta,i=0e-f-d){a.scrollTop(e);b.stopPropagation();b.preventDefault();b.returnValue=!1;g(c.scrollLock,b);return!1}else if(i&&h>d){a.scrollTop(0);b.stopPropagation();b.preventDefault();b.returnValue=!1;g(c.scrollLock,b);return!1}return!0})},v=function(a){a.off("keydown.cie.ctrlpageup").on("keydown.cie.ctrlpageup",function(a){if(a.ctrlKey){if(a.keyCode==b.pageUp){g(c.ctrlPageUp,a)}}})},w=function(a){a.off("keydown.cie.ctrlpagedown").on("keydown.cie.ctrlpagedown",function(a){if(a.ctrlKey){if(a.keyCode==b.pageDown){g(c.ctrlPageDown,a)}}})},x=function(a){h(a,c.enter,b.enter)},y=function(){var a={};a[c.activate]=i;a[c.keyboardActivate]=j;a[c.escape]=k;a[c.down]=l;a[c.up]=m;a[c.home]=n;a[c.end]=o;a[c.next]=p;a[c.previous]=q;a[c.asterix]=r;a[c.scrollLock]=u;a[c.scrollTop]=s;a[c.scrollBottom]=t;a[c.ctrlPageUp]=v;a[c.ctrlPageDown]=w;a[c.enter]=x;return a};return{define:function define(b,c){b=a(b);c=c||[];if(!b.length||!c.length){return}a.each(y(),function(a,d){if(e(a,c)){d(b)}})},events:c}}); +//# sourceMappingURL=custom_interaction_events.min.js.map diff --git a/lib/amd/build/custom_interaction_events.min.js.map b/lib/amd/build/custom_interaction_events.min.js.map new file mode 100644 index 0000000000000..5db844539b3fa --- /dev/null +++ b/lib/amd/build/custom_interaction_events.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/custom_interaction_events.js"],"names":["define","$","keyCodes","events","activate","keyboardActivate","escape","down","up","home","end","next","previous","asterix","scrollLock","scrollTop","scrollBottom","ctrlPageUp","ctrlPageDown","enter","triggeredEvents","shouldAddEvent","eventType","include","length","indexOf","isModifierPressed","e","shiftKey","metaKey","altKey","ctrlKey","triggerEvent","eventName","eventTypeKey","hasOwnProperty","type","timeStamp","target","trigger","originalEvent","addKeyboardEvent","element","event","keyCode","off","on","addActivateListener","space","addKeyboardActivateListener","addEscapeListener","addDownListener","arrowDown","addUpListener","arrowUp","addHomeListener","addEndListener","addNextListener","attr","arrowLeft","arrowRight","addPreviousListener","addAsterixListener","addScrollTopListener","addScrollBottomListener","innerHeight","scrollHeight","addScrollLockListener","height","delta","detail","wheelDelta","stopPropagation","preventDefault","returnValue","addCtrlPageUpListener","pageUp","addCtrlPageDownListener","pageDown","addEnterListener","getHandlers","handlers","each","handler"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This module provides a wrapper to encapsulate a lot of the common combinations of\n * user interaction we use in Moodle.\n *\n * @module core/custom_interaction_events\n * @class custom_interaction_events\n * @package core\n * @copyright 2016 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.2\n */\ndefine(['jquery', 'core/key_codes'], function($, keyCodes) {\n // The list of events provided by this module. Namespaced to avoid clashes.\n var events = {\n activate: 'cie:activate',\n keyboardActivate: 'cie:keyboardactivate',\n escape: 'cie:escape',\n down: 'cie:down',\n up: 'cie:up',\n home: 'cie:home',\n end: 'cie:end',\n next: 'cie:next',\n previous: 'cie:previous',\n asterix: 'cie:asterix',\n scrollLock: 'cie:scrollLock',\n scrollTop: 'cie:scrollTop',\n scrollBottom: 'cie:scrollBottom',\n ctrlPageUp: 'cie:ctrlPageUp',\n ctrlPageDown: 'cie:ctrlPageDown',\n enter: 'cie:enter',\n };\n // Static cache of jQuery events that have been handled. This should\n // only be populated by JavaScript generated events (which will keep it\n // fairly small).\n var triggeredEvents = {};\n\n /**\n * Check if the caller has asked for the given event type to be\n * registered.\n *\n * @method shouldAddEvent\n * @private\n * @param {string} eventType name of the event (see events above)\n * @param {array} include the list of events to be added\n * @return {bool} true if the event should be added, false otherwise.\n */\n var shouldAddEvent = function(eventType, include) {\n include = include || [];\n\n if (include.length && include.indexOf(eventType) !== -1) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Check if any of the modifier keys have been pressed on the event.\n *\n * @method isModifierPressed\n * @private\n * @param {event} e jQuery event\n * @return {bool} true if shift, meta (command on Mac), alt or ctrl are pressed\n */\n var isModifierPressed = function(e) {\n return (e.shiftKey || e.metaKey || e.altKey || e.ctrlKey);\n };\n\n /**\n * Trigger the custom event for the given jQuery event.\n *\n * This function will only fire the custom event if one hasn't already been\n * fired for the jQuery event.\n *\n * This is to prevent multiple custom event handlers triggering multiple\n * custom events for a single jQuery event as it bubbles up the stack.\n *\n * @param {string} eventName The name of the custom event\n * @param {event} e The jQuery event\n * @return {void}\n */\n var triggerEvent = function(eventName, e) {\n var eventTypeKey = \"\";\n\n if (!e.hasOwnProperty('originalEvent')) {\n // This is a jQuery event generated from JavaScript not a browser event so\n // we need to build the cache key for the event.\n eventTypeKey = \"\" + eventName + e.type + e.timeStamp;\n\n if (!triggeredEvents.hasOwnProperty(eventTypeKey)) {\n // If we haven't seen this jQuery event before then fire a custom\n // event for it and remember the event for later.\n triggeredEvents[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n }\n return;\n }\n\n eventTypeKey = \"triggeredCustom_\" + eventName;\n if (!e.originalEvent.hasOwnProperty(eventTypeKey)) {\n // If this is a jQuery event generated by the browser then set a\n // property on the original event to track that we've seen it before.\n // The property is set on the original event because it's the only part\n // of the jQuery event that is maintained through multiple event handlers.\n e.originalEvent[eventTypeKey] = true;\n $(e.target).trigger(eventName, [{originalEvent: e}]);\n return;\n }\n };\n\n /**\n * Register a keyboard event that ignores modifier keys.\n *\n * @method addKeyboardEvent\n * @private\n * @param {object} element A jQuery object of the element to bind events to\n * @param {string} event The custom interaction event name\n * @param {int} keyCode The key code.\n */\n var addKeyboardEvent = function(element, event, keyCode) {\n element.off('keydown.' + event).on('keydown.' + event, function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCode) {\n triggerEvent(event, e);\n }\n }\n });\n };\n\n /**\n * Trigger the activate event on the given element if it is clicked or the enter\n * or space key are pressed without a modifier key.\n *\n * @method addActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addActivateListener = function(element) {\n element.off('click.cie.activate').on('click.cie.activate', function(e) {\n triggerEvent(events.activate, e);\n });\n element.off('keydown.cie.activate').on('keydown.cie.activate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.activate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the keyboard activate event on the given element if the enter\n * or space key are pressed without a modifier key.\n *\n * @method addKeyboardActivateListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addKeyboardActivateListener = function(element) {\n element.off('keydown.cie.keyboardactivate').on('keydown.cie.keyboardactivate', function(e) {\n if (!isModifierPressed(e)) {\n if (e.keyCode == keyCodes.enter || e.keyCode == keyCodes.space) {\n triggerEvent(events.keyboardActivate, e);\n }\n }\n });\n };\n\n /**\n * Trigger the escape event on the given element if the escape key is pressed\n * without a modifier key.\n *\n * @method addEscapeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEscapeListener = function(element) {\n addKeyboardEvent(element, events.escape, keyCodes.escape);\n };\n\n /**\n * Trigger the down event on the given element if the down arrow key is pressed\n * without a modifier key.\n *\n * @method addDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addDownListener = function(element) {\n addKeyboardEvent(element, events.down, keyCodes.arrowDown);\n };\n\n /**\n * Trigger the up event on the given element if the up arrow key is pressed\n * without a modifier key.\n *\n * @method addUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addUpListener = function(element) {\n addKeyboardEvent(element, events.up, keyCodes.arrowUp);\n };\n\n /**\n * Trigger the home event on the given element if the home key is pressed\n * without a modifier key.\n *\n * @method addHomeListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addHomeListener = function(element) {\n addKeyboardEvent(element, events.home, keyCodes.home);\n };\n\n /**\n * Trigger the end event on the given element if the end key is pressed\n * without a modifier key.\n *\n * @method addEndListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEndListener = function(element) {\n addKeyboardEvent(element, events.end, keyCodes.end);\n };\n\n /**\n * Trigger the next event on the given element if the right arrow key is pressed\n * without a modifier key in LTR mode or left arrow key in RTL mode.\n *\n * @method addNextListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addNextListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowLeft : keyCodes.arrowRight;\n\n addKeyboardEvent(element, events.next, keyCode);\n };\n\n /**\n * Trigger the previous event on the given element if the left arrow key is pressed\n * without a modifier key in LTR mode or right arrow key in RTL mode.\n *\n * @method addPreviousListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addPreviousListener = function(element) {\n // Left and right are flipped in RTL mode.\n var keyCode = $('html').attr('dir') == \"rtl\" ? keyCodes.arrowRight : keyCodes.arrowLeft;\n\n addKeyboardEvent(element, events.previous, keyCode);\n };\n\n /**\n * Trigger the asterix event on the given element if the asterix key is pressed\n * without a modifier key.\n *\n * @method addAsterixListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addAsterixListener = function(element) {\n addKeyboardEvent(element, events.asterix, keyCodes.asterix);\n };\n\n\n /**\n * Trigger the scrollTop event on the given element if the user scrolls to\n * the top of the given element.\n *\n * @method addScrollTopListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollTopListener = function(element) {\n element.off('scroll.cie.scrollTop').on('scroll.cie.scrollTop', function(e) {\n var scrollTop = element.scrollTop();\n if (scrollTop === 0) {\n triggerEvent(events.scrollTop, e);\n }\n });\n };\n\n /**\n * Trigger the scrollBottom event on the given element if the user scrolls to\n * the bottom of the given element.\n *\n * @method addScrollBottomListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addScrollBottomListener = function(element) {\n element.off('scroll.cie.scrollBottom').on('scroll.cie.scrollBottom', function(e) {\n var scrollTop = element.scrollTop();\n var innerHeight = element.innerHeight();\n var scrollHeight = element[0].scrollHeight;\n\n if (scrollTop + innerHeight >= scrollHeight) {\n triggerEvent(events.scrollBottom, e);\n }\n });\n };\n\n /**\n * Trigger the scrollLock event on the given element if the user scrolls to\n * the bottom or top of the given element.\n *\n * @method addScrollLockListener\n * @private\n * @param {jQuery} element jQuery object to add event listeners to\n */\n var addScrollLockListener = function(element) {\n // Lock mousewheel scrolling within the element to stop the annoying window scroll.\n element.off('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock')\n .on('DOMMouseScroll.cie.DOMMouseScrollLock mousewheel.cie.mousewheelLock', function(e) {\n var scrollTop = element.scrollTop();\n var scrollHeight = element[0].scrollHeight;\n var height = element.height();\n var delta = (e.type == 'DOMMouseScroll' ?\n e.originalEvent.detail * -40 :\n e.originalEvent.wheelDelta);\n var up = delta > 0;\n\n if (!up && -delta > scrollHeight - height - scrollTop) {\n // Scrolling down past the bottom.\n element.scrollTop(scrollHeight);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n } else if (up && delta > scrollTop) {\n // Scrolling up past the top.\n element.scrollTop(0);\n e.stopPropagation();\n e.preventDefault();\n e.returnValue = false;\n // Fire the scroll lock event.\n triggerEvent(events.scrollLock, e);\n\n return false;\n }\n\n return true;\n });\n };\n\n /**\n * Trigger the ctrlPageUp event on the given element if the user presses the\n * control and page up key.\n *\n * @method addCtrlPageUpListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageUpListener = function(element) {\n element.off('keydown.cie.ctrlpageup').on('keydown.cie.ctrlpageup', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageUp) {\n triggerEvent(events.ctrlPageUp, e);\n }\n }\n });\n };\n\n /**\n * Trigger the ctrlPageDown event on the given element if the user presses the\n * control and page down key.\n *\n * @method addCtrlPageDownListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addCtrlPageDownListener = function(element) {\n element.off('keydown.cie.ctrlpagedown').on('keydown.cie.ctrlpagedown', function(e) {\n if (e.ctrlKey) {\n if (e.keyCode == keyCodes.pageDown) {\n triggerEvent(events.ctrlPageDown, e);\n }\n }\n });\n };\n\n /**\n * Trigger the enter event on the given element if the enter key is pressed\n * without a modifier key.\n *\n * @method addEnterListener\n * @private\n * @param {object} element jQuery object to add event listeners to\n */\n var addEnterListener = function(element) {\n addKeyboardEvent(element, events.enter, keyCodes.enter);\n };\n\n /**\n * Get the list of events and their handlers.\n *\n * @method getHandlers\n * @private\n * @return {object} object key of event names and value of handler functions\n */\n var getHandlers = function() {\n var handlers = {};\n\n handlers[events.activate] = addActivateListener;\n handlers[events.keyboardActivate] = addKeyboardActivateListener;\n handlers[events.escape] = addEscapeListener;\n handlers[events.down] = addDownListener;\n handlers[events.up] = addUpListener;\n handlers[events.home] = addHomeListener;\n handlers[events.end] = addEndListener;\n handlers[events.next] = addNextListener;\n handlers[events.previous] = addPreviousListener;\n handlers[events.asterix] = addAsterixListener;\n handlers[events.scrollLock] = addScrollLockListener;\n handlers[events.scrollTop] = addScrollTopListener;\n handlers[events.scrollBottom] = addScrollBottomListener;\n handlers[events.ctrlPageUp] = addCtrlPageUpListener;\n handlers[events.ctrlPageDown] = addCtrlPageDownListener;\n handlers[events.enter] = addEnterListener;\n\n return handlers;\n };\n\n /**\n * Add all of the listeners on the given element for the requested events.\n *\n * @method define\n * @public\n * @param {object} element the DOM element to register event listeners on\n * @param {array} include the array of events to be triggered\n */\n var define = function(element, include) {\n element = $(element);\n include = include || [];\n\n if (!element.length || !include.length) {\n return;\n }\n\n $.each(getHandlers(), function(eventType, handler) {\n if (shouldAddEvent(eventType, include)) {\n handler(element);\n }\n });\n };\n\n return /** @module core/custom_interaction_events */ {\n define: define,\n events: events,\n };\n});\n"],"file":"custom_interaction_events.min.js"} \ No newline at end of file diff --git a/lib/amd/build/dragdrop.min.js b/lib/amd/build/dragdrop.min.js index 77654f2958a0b..4bff458af3cb4 100644 --- a/lib/amd/build/dragdrop.min.js +++ b/lib/amd/build/dragdrop.min.js @@ -1 +1,2 @@ -define(["jquery","core/autoscroll"],function(a,b){var c={eventCaptureOptions:{passive:!1,capture:!0},dragProxy:null,onMove:null,onDrop:null,initialPosition:null,initialX:null,initialY:null,touching:null,prepare:function(a){a.preventDefault();var b;if(b="touchstart"===a.type?null===c.touching&&a.changedTouches.length>0:1===a.which){var d=c.getEventXY(a);return d.start=!0,d}return{start:!1}},start:function(a,d,e,f){var g=c.getEventXY(a);switch(c.initialX=g.x,c.initialY=g.y,c.initialPosition=d.offset(),c.dragProxy=d,c.onMove=e,c.onDrop=f,a.type){case"mousedown":c.addEventSpecial("mousemove",c.mouseMove),c.addEventSpecial("mouseup",c.mouseUp);break;case"touchstart":c.addEventSpecial("touchend",c.touchEnd),c.addEventSpecial("touchcancel",c.touchEnd),c.addEventSpecial("touchmove",c.touchMove),c.touching=a.changedTouches[0].identifier;break;default:throw new Error("Unexpected event type: "+a.type)}b.start(c.scroll)},addEventSpecial:function(a,b){try{window.addEventListener(a,b,c.eventCaptureOptions)}catch(d){c.eventCaptureOptions=!0,window.addEventListener(a,b,c.eventCaptureOptions)}},getEventXY:function(a){switch(a.type){case"touchstart":return{x:a.changedTouches[0].pageX,y:a.changedTouches[0].pageY};case"mousedown":return{x:a.pageX,y:a.pageY};default:throw new Error("Unexpected event type: "+a.type)}},touchMove:function(a){a.preventDefault();for(var b=0;b.\n\n/*\n * JavaScript to handle drag operations, including automatic scrolling.\n *\n * Note: this module is defined statically. It is a singleton. You\n * can only have one use of it active at any time. However, you\n * can only drag one thing at a time, this is not a problem in practice.\n *\n * @module core/dragdrop\n * @class dragdrop\n * @package core\n * @copyright 2016 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.6\n */\ndefine(['jquery', 'core/autoscroll'], function($, autoScroll) {\n /**\n * @alias module:core/dragdrop\n */\n var dragdrop = {\n /**\n * A boolean or options argument depending on whether browser supports passive events.\n * @private\n */\n eventCaptureOptions: {passive: false, capture: true},\n\n /**\n * Drag proxy if any.\n * @private\n */\n dragProxy: null,\n\n /**\n * Function called on move.\n * @private\n */\n onMove: null,\n\n /**\n * Function called on drop.\n * @private\n */\n onDrop: null,\n\n /**\n * Initial position of proxy at drag start.\n */\n initialPosition: null,\n\n /**\n * Initial page X of cursor at drag start.\n */\n initialX: null,\n\n /**\n * Initial page Y of cursor at drag start.\n */\n initialY: null,\n\n /**\n * If touch event is in progress, this will be the id, otherwise null\n */\n touching: null,\n\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: function(event) {\n event.preventDefault();\n var start;\n if (event.type === 'touchstart') {\n // For touch, start if there's at least one touch and we are not currently doing\n // a touch event.\n start = (dragdrop.touching === null) && event.changedTouches.length > 0;\n } else {\n // For mousedown, start if it's the left button.\n start = event.which === 1;\n }\n if (start) {\n var details = dragdrop.getEventXY(event);\n details.start = true;\n return details;\n } else {\n return {start: false};\n }\n },\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @public\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: function(event, dragProxy, onMove, onDrop) {\n var xy = dragdrop.getEventXY(event);\n dragdrop.initialX = xy.x;\n dragdrop.initialY = xy.y;\n dragdrop.initialPosition = dragProxy.offset();\n dragdrop.dragProxy = dragProxy;\n dragdrop.onMove = onMove;\n dragdrop.onDrop = onDrop;\n\n switch (event.type) {\n case 'mousedown':\n // Cannot use jQuery 'on' because events need to not be passive.\n dragdrop.addEventSpecial('mousemove', dragdrop.mouseMove);\n dragdrop.addEventSpecial('mouseup', dragdrop.mouseUp);\n break;\n case 'touchstart':\n dragdrop.addEventSpecial('touchend', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchcancel', dragdrop.touchEnd);\n dragdrop.addEventSpecial('touchmove', dragdrop.touchMove);\n dragdrop.touching = event.changedTouches[0].identifier;\n break;\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n autoScroll.start(dragdrop.scroll);\n },\n\n /**\n * Adds an event listener with special event capture options (capture, not passive). If the\n * browser does not support passive events, it will fall back to the boolean for capture.\n *\n * @private\n * @param {Object} event Event type string\n * @param {Object} handler Handler function\n */\n addEventSpecial: function(event, handler) {\n try {\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n } catch (ex) {\n dragdrop.eventCaptureOptions = true;\n window.addEventListener(event, handler, dragdrop.eventCaptureOptions);\n }\n },\n\n /**\n * Gets X/Y co-ordinates of an event, which can be either touchstart or mousedown.\n *\n * @private\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} X/Y co-ordinates\n */\n getEventXY: function(event) {\n switch (event.type) {\n case 'touchstart':\n return {x: event.changedTouches[0].pageX,\n y: event.changedTouches[0].pageY};\n case 'mousedown':\n return {x: event.pageX, y: event.pageY};\n default:\n throw new Error('Unexpected event type: ' + event.type);\n }\n },\n\n /**\n * Event handler for touch move.\n *\n * @private\n * @param {Object} e Event\n */\n touchMove: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleMove(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse move.\n *\n * @private\n * @param {Object} e Event\n */\n mouseMove: function(e) {\n dragdrop.handleMove(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for move event (mouse or touch).\n *\n * @private\n * @param {number} pageX X co-ordinate\n * @param {number} pageY Y co-ordinate\n */\n handleMove: function(pageX, pageY) {\n // Move the drag proxy, not letting you move it out of screen or window bounds.\n var current = dragdrop.dragProxy.offset();\n var topOffset = current.top - parseInt(dragdrop.dragProxy.css('top'));\n var leftOffset = current.left - parseInt(dragdrop.dragProxy.css('left'));\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight() - topOffset;\n var maxX = $(document).width() - dragdrop.dragProxy.outerWidth() - leftOffset;\n var minY = -topOffset;\n var minX = -leftOffset;\n var initial = dragdrop.initialPosition;\n var position = {\n top: Math.max(minY, Math.min(maxY, initial.top + (pageY - dragdrop.initialY) - topOffset)),\n left: Math.max(minX, Math.min(maxX, initial.left + (pageX - dragdrop.initialX) - leftOffset))\n };\n dragdrop.dragProxy.css(position);\n\n // Trigger move handler.\n dragdrop.onMove(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Event handler for touch end.\n *\n * @private\n * @param {Object} e Event\n */\n touchEnd: function(e) {\n e.preventDefault();\n for (var i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === dragdrop.touching) {\n dragdrop.handleEnd(e.changedTouches[i].pageX, e.changedTouches[i].pageY);\n }\n }\n },\n\n /**\n * Event handler for mouse up.\n *\n * @private\n * @param {Object} e Event\n */\n mouseUp: function(e) {\n dragdrop.handleEnd(e.pageX, e.pageY);\n },\n\n /**\n * Shared handler for end drag (mouse or touch).\n *\n * @private\n * @param {number} pageX X\n * @param {number} pageY Y\n */\n handleEnd: function(pageX, pageY) {\n if (dragdrop.touching !== null) {\n window.removeEventListener('touchend', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchcancel', dragdrop.touchEnd, dragdrop.eventCaptureOptions);\n window.removeEventListener('touchmove', dragdrop.touchMove, dragdrop.eventCaptureOptions);\n dragdrop.touching = null;\n } else {\n window.removeEventListener('mousemove', dragdrop.mouseMove, dragdrop.eventCaptureOptions);\n window.removeEventListener('mouseup', dragdrop.mouseUp, dragdrop.eventCaptureOptions);\n }\n autoScroll.stop();\n dragdrop.onDrop(pageX, pageY, dragdrop.dragProxy);\n },\n\n /**\n * Called when the page scrolls.\n *\n * @private\n * @param {number} offset Amount of scroll\n */\n scroll: function(offset) {\n // Move the proxy to match.\n var maxY = $(document).height() - dragdrop.dragProxy.outerHeight();\n var currentPosition = dragdrop.dragProxy.offset();\n currentPosition.top = Math.min(maxY, currentPosition.top + offset);\n dragdrop.dragProxy.css(currentPosition);\n }\n };\n\n return {\n /**\n * Prepares to begin a drag operation - call with a mousedown or touchstart event.\n *\n * If the returned object has 'start' true, then you can set up a drag proxy, and call\n * start. This function will call preventDefault automatically regardless of whether\n * starting or not.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @return {Object} Object with start (boolean flag) and x, y (only if flag true) values\n */\n prepare: dragdrop.prepare,\n\n /**\n * Call to start a drag operation, in response to a mouse down or touch start event.\n * Normally call this after calling prepare and receiving start true (you can probably\n * skip prepare if only supporting drag not touch).\n *\n * Note: The caller is responsible for creating a 'drag proxy' which is the\n * thing that actually gets dragged. At present, this doesn't really work\n * properly unless it is added directly within the body tag.\n *\n * You also need to ensure that there is CSS so the proxy is absolutely positioned,\n * and styled to look like it is floating.\n *\n * You also need to absolutely position the proxy where you want it to start.\n *\n * @param {Object} event Event (should be either mousedown or touchstart)\n * @param {jQuery} dragProxy An absolute-positioned element for dragging\n * @param {Object} onMove Function that receives X and Y page locations for a move\n * @param {Object} onDrop Function that receives X and Y page locations when dropped\n */\n start: dragdrop.start\n };\n});\n"],"file":"dragdrop.min.js"} \ No newline at end of file diff --git a/lib/amd/build/event.min.js b/lib/amd/build/event.min.js index e39e807e852b3..3541d3199fb34 100644 --- a/lib/amd/build/event.min.js +++ b/lib/amd/build/event.min.js @@ -1 +1,2 @@ -define(["jquery","core/yui"],function(a,b){return{Events:{FORM_FIELD_VALIDATION:"core_form-field-validation"},getLegacyEvents:function(){var c=a.Deferred();return b.use("event","moodle-core-event",function(){c.resolve(window.M.core.event)}),c.promise()},notifyFilterContentUpdated:function(c){c=a(c),b.use("event","moodle-core-event",function(b){a(document).trigger(M.core.event.FILTER_CONTENT_UPDATED,[c]);var d=new b.NodeList(c.get());b.fire(M.core.event.FILTER_CONTENT_UPDATED,{nodes:d})})},notifyFormSubmitAjax:function(c,d){d=d||!1,b.use("event","moodle-core-event",function(b){d&&(window.skipClientValidation=!0),a(c).trigger(M.core.event.FORM_SUBMIT_AJAX),b.one(c).fire(M.core.event.FORM_SUBMIT_AJAX,{currentTarget:b.one(c)}),d&&(window.skipClientValidation=!1)})},notifyEditorContentRestored:function(){b.use("event","moodle-core-event",function(b){a(document).trigger(M.core.event.EDITOR_CONTENT_RESTORED),b.fire(M.core.event.EDITOR_CONTENT_RESTORED)})}}}); \ No newline at end of file +define ("core/event",["jquery","core/yui"],function(a,b){return{Events:{FORM_FIELD_VALIDATION:"core_form-field-validation"},getLegacyEvents:function getLegacyEvents(){var c=a.Deferred();b.use("event","moodle-core-event",function(){c.resolve(window.M.core.event)});return c.promise()},notifyFilterContentUpdated:function notifyFilterContentUpdated(c){c=a(c);b.use("event","moodle-core-event",function(b){a(document).trigger(M.core.event.FILTER_CONTENT_UPDATED,[c]);var d=new b.NodeList(c.get());b.fire(M.core.event.FILTER_CONTENT_UPDATED,{nodes:d})})},notifyFormSubmitAjax:function notifyFormSubmitAjax(c,d){d=d||!1;b.use("event","moodle-core-event",function(b){if(d){window.skipClientValidation=!0}a(c).trigger(M.core.event.FORM_SUBMIT_AJAX);b.one(c).fire(M.core.event.FORM_SUBMIT_AJAX,{currentTarget:b.one(c)});if(d){window.skipClientValidation=!1}})},notifyEditorContentRestored:function notifyEditorContentRestored(){b.use("event","moodle-core-event",function(b){a(document).trigger(M.core.event.EDITOR_CONTENT_RESTORED);b.fire(M.core.event.EDITOR_CONTENT_RESTORED)})}}}); +//# sourceMappingURL=event.min.js.map diff --git a/lib/amd/build/event.min.js.map b/lib/amd/build/event.min.js.map new file mode 100644 index 0000000000000..38e1a2d518d73 --- /dev/null +++ b/lib/amd/build/event.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/event.js"],"names":["define","$","Y","Events","FORM_FIELD_VALIDATION","getLegacyEvents","result","Deferred","use","resolve","window","M","core","event","promise","notifyFilterContentUpdated","nodes","document","trigger","FILTER_CONTENT_UPDATED","yuiNodes","NodeList","get","fire","notifyFormSubmitAjax","form","skipValidation","skipClientValidation","FORM_SUBMIT_AJAX","one","currentTarget","notifyEditorContentRestored","EDITOR_CONTENT_RESTORED"],"mappings":"AAyBAA,OAAM,cAAC,CAAC,QAAD,CAAW,UAAX,CAAD,CACC,SAASC,CAAT,CAAYC,CAAZ,CAAe,CAElB,MAAuC,CAKnCC,MAAM,CAAE,CACJC,qBAAqB,CAAE,4BADnB,CAL2B,CAenCC,eAAe,CAAE,0BAAW,CACxB,GAAIC,CAAAA,CAAM,CAAGL,CAAC,CAACM,QAAF,EAAb,CACAL,CAAC,CAACM,GAAF,CAAM,OAAN,CAAe,mBAAf,CAAoC,UAAW,CAC3CF,CAAM,CAACG,OAAP,CAAeC,MAAM,CAACC,CAAP,CAASC,IAAT,CAAcC,KAA7B,CACH,CAFD,EAGA,MAAOP,CAAAA,CAAM,CAACQ,OAAP,EACV,CArBkC,CA6BnCC,0BAA0B,CAAE,oCAASC,CAAT,CAAgB,CACxCA,CAAK,CAAGf,CAAC,CAACe,CAAD,CAAT,CACAd,CAAC,CAACM,GAAF,CAAM,OAAN,CAAe,mBAAf,CAAoC,SAASN,CAAT,CAAY,CAE5CD,CAAC,CAACgB,QAAD,CAAD,CAAYC,OAAZ,CAAoBP,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAaM,sBAAjC,CAAyD,CAACH,CAAD,CAAzD,EAGA,GAAII,CAAAA,CAAQ,CAAG,GAAIlB,CAAAA,CAAC,CAACmB,QAAN,CAAeL,CAAK,CAACM,GAAN,EAAf,CAAf,CAGApB,CAAC,CAACqB,IAAF,CAAOZ,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAaM,sBAApB,CAA4C,CAACH,KAAK,CAAEI,CAAR,CAA5C,CACH,CATD,CAUH,CAzCkC,CAkDnCI,oBAAoB,CAAE,8BAASC,CAAT,CAAeC,CAAf,CAA+B,CAGjDA,CAAc,CAAGA,CAAc,IAA/B,CAEAxB,CAAC,CAACM,GAAF,CAAM,OAAN,CAAe,mBAAf,CAAoC,SAASN,CAAT,CAAY,CAC5C,GAAIwB,CAAJ,CAAoB,CAChBhB,MAAM,CAACiB,oBAAP,GACH,CAED1B,CAAC,CAACwB,CAAD,CAAD,CAAQP,OAAR,CAAgBP,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAae,gBAA7B,EAGA1B,CAAC,CAAC2B,GAAF,CAAMJ,CAAN,EAAYF,IAAZ,CAAiBZ,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAae,gBAA9B,CAAgD,CAACE,aAAa,CAAE5B,CAAC,CAAC2B,GAAF,CAAMJ,CAAN,CAAhB,CAAhD,EAEA,GAAIC,CAAJ,CAAoB,CAChBhB,MAAM,CAACiB,oBAAP,GACH,CACJ,CAbD,CAcH,CArEkC,CA6EnCI,2BAA2B,CAAE,sCAAW,CACpC7B,CAAC,CAACM,GAAF,CAAM,OAAN,CAAe,mBAAf,CAAoC,SAASN,CAAT,CAAY,CAE5CD,CAAC,CAACgB,QAAD,CAAD,CAAYC,OAAZ,CAAoBP,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAamB,uBAAjC,EAGA9B,CAAC,CAACqB,IAAF,CAAOZ,CAAC,CAACC,IAAF,CAAOC,KAAP,CAAamB,uBAApB,CACH,CAND,CAOH,CArFkC,CAuF1C,CA1FK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Global registry of core events that can be triggered/listened for.\n *\n * @module core/event\n * @package core\n * @class event\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\ndefine(['jquery', 'core/yui'],\n function($, Y) {\n\n return /** @alias module:core/event */ {\n\n\n // Public variables and functions.\n // These are AMD only events - no backwards compatibility for new things.\n Events: {\n FORM_FIELD_VALIDATION: \"core_form-field-validation\"\n },\n\n /**\n * Load the legacy YUI module which defines events in M.core.event and return it.\n *\n * @method getLegacyEvents\n * @return {Promise}\n */\n getLegacyEvents: function() {\n var result = $.Deferred();\n Y.use('event', 'moodle-core-event', function() {\n result.resolve(window.M.core.event);\n });\n return result.promise();\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFilterContentUpdated\n * @param {string|JQuery} nodes - Selector or list of elements that were inserted.\n */\n notifyFilterContentUpdated: function(nodes) {\n nodes = $(nodes);\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.FILTER_CONTENT_UPDATED, [nodes]);\n\n // Create a YUI NodeList from our JQuery Object.\n var yuiNodes = new Y.NodeList(nodes.get());\n\n // And again for YUI.\n Y.fire(M.core.event.FILTER_CONTENT_UPDATED, {nodes: yuiNodes});\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n *\n * @method notifyFormSubmittedAjax\n * @param {DOMElement} form\n * @param {boolean} skipValidation Submit the form without validation. E.g. \"Cancel\".\n */\n notifyFormSubmitAjax: function(form, skipValidation) {\n\n // Argument is optional.\n skipValidation = skipValidation || false;\n\n Y.use('event', 'moodle-core-event', function(Y) {\n if (skipValidation) {\n window.skipClientValidation = true;\n }\n // Trigger it the JQuery way.\n $(form).trigger(M.core.event.FORM_SUBMIT_AJAX);\n\n // And again for YUI.\n Y.one(form).fire(M.core.event.FORM_SUBMIT_AJAX, {currentTarget: Y.one(form)});\n\n if (skipValidation) {\n window.skipClientValidation = false;\n }\n });\n },\n\n /**\n * Trigger an event using both JQuery and YUI\n * This event alerts the world that the editor has restored some content.\n *\n * @method notifyEditorContentRestored\n */\n notifyEditorContentRestored: function() {\n Y.use('event', 'moodle-core-event', function(Y) {\n // Trigger it the JQuery way.\n $(document).trigger(M.core.event.EDITOR_CONTENT_RESTORED);\n\n // And again for YUI.\n Y.fire(M.core.event.EDITOR_CONTENT_RESTORED);\n });\n },\n };\n});\n"],"file":"event.min.js"} \ No newline at end of file diff --git a/lib/amd/build/first.min.js b/lib/amd/build/first.min.js index 7d7c42d7eb07d..cc205363887d0 100644 --- a/lib/amd/build/first.min.js +++ b/lib/amd/build/first.min.js @@ -1 +1,2 @@ -define(["jquery"],function(a){a(document).bind("ajaxStart",function(){M.util.js_pending("jq")}).bind("ajaxStop",function(){M.util.js_complete("jq")})}); \ No newline at end of file +define ("core/first",["jquery"],function(a){a(document).bind("ajaxStart",function(){M.util.js_pending("jq")}).bind("ajaxStop",function(){M.util.js_complete("jq")})}); +//# sourceMappingURL=first.min.js.map diff --git a/lib/amd/build/first.min.js.map b/lib/amd/build/first.min.js.map new file mode 100644 index 0000000000000..97014b6fa2a99 --- /dev/null +++ b/lib/amd/build/first.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/first.js"],"names":["define","$","document","bind","M","util","js_pending","js_complete"],"mappings":"AA6BAA,OAAM,cAAC,CAAC,QAAD,CAAD,CAAa,SAASC,CAAT,CAAY,CAC3BA,CAAC,CAACC,QAAD,CAAD,CAAYC,IAAZ,CAAiB,WAAjB,CAA8B,UAAW,CACrCC,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkB,IAAlB,CACH,CAFD,EAEGH,IAFH,CAEQ,UAFR,CAEoB,UAAW,CAC3BC,CAAC,CAACC,IAAF,CAAOE,WAAP,CAAmB,IAAnB,CACH,CAJD,CAKH,CANK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * This is an empty module, that is required before all other modules.\n * Because every module is returned from a request for any other module, this\n * forces the loading of all modules with a single request.\n *\n * This function also sets up the listeners for ajax requests so we can tell\n * if any requests are still in progress.\n *\n * @module core/first\n * @package core\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine(['jquery'], function($) {\n $(document).bind(\"ajaxStart\", function() {\n M.util.js_pending('jq');\n }).bind(\"ajaxStop\", function() {\n M.util.js_complete('jq');\n });\n});\n"],"file":"first.min.js"} \ No newline at end of file diff --git a/lib/amd/build/form-autocomplete.min.js b/lib/amd/build/form-autocomplete.min.js index 23b1517f2d20b..c6a2fc1fc6a71 100644 --- a/lib/amd/build/form-autocomplete.min.js +++ b/lib/amd/build/form-autocomplete.min.js @@ -1 +1,2 @@ -define(["jquery","core/log","core/str","core/templates","core/notification","core/loadingicon"],function(a,b,c,d,e,f){var g={DOWN:40,ENTER:13,SPACE:32,ESCAPE:27,COMMA:44,UP:38},h=Date.now(),i=function(b,c){var d=a(document.getElementById(c.selectionId)),e=d.children("[aria-selected=true]").length;for(b%=e;b<0;)b+=e;var f=a(d.children("[aria-selected=true]").get(b)),g=c.selectionId+"-"+b;return d.children().attr("data-active-selection",!1).attr("id",""),f.attr("data-active-selection",!0).attr("id",g),d.attr("aria-activedescendant",g),a.Deferred().resolve()},j=function(b,c,f){var g="form-autocomplete-updateSelectionList-"+c.inputId;M.util.js_pending(g);var h=[],j=a(document.getElementById(c.selectionId)),k=j.attr("aria-activedescendant"),l=!1;k&&(l=a(document.getElementById(k)).attr("data-value")),f.children("option").each(function(b,c){if(a(c).prop("selected")){var d;d=a(c).data("html")?a(c).data("html"):a(c).html(),h.push({label:d,value:a(c).attr("value")})}});var m=a.extend({items:h},b,c);return d.render("core/form_autocomplete_selection",m).then(function(b,e){return d.replaceNodeContents(j,b,e),l!==!1&&j.children("[aria-selected=true]").each(function(b,d){a(d).attr("data-value")===l&&i(b,c)}),l}).then(function(){return M.util.js_complete(g)})["catch"](e.exception)},k=function(a){"undefined"!=typeof M.core_formchangechecker&&M.core_formchangechecker.set_form_changed(),a.change()},l=function(b,c,d,e){var f=a(d).attr("data-value");return b.multiple&&e.children("option").each(function(b,c){a(c).attr("value")==f&&(a(c).prop("selected",!1),a(c).attr("data-iscustom")&&a(c).remove())}),j(b,c,e).then(function(){k(e)})},m=function(b,c){var d=a(document.getElementById(c.inputId)),e=a(document.getElementById(c.suggestionsId)),f=e.children("[aria-hidden=false]").length;for(b%=f;b<0;)b+=f;var g=a(e.children("[aria-hidden=false]").get(b)),h=a(e.children("[role=option]")).index(g),i=c.suggestionsId+"-"+h;e.children().attr("aria-selected",!1).attr("id",""),g.attr("aria-selected",!0).attr("id",i),d.attr("aria-activedescendant",i);var j=g.offset().top-e.offset().top+e.scrollTop()-e.height()/2;return e.animate({scrollTop:j},100).promise()},n=function(b){var c=a(document.getElementById(b.suggestionsId)),d=c.children("[aria-selected=true]"),e=c.children("[aria-hidden=false]").index(d);return m(e+1,b)},o=function(b){var c=a(document.getElementById(b.selectionId)),d=c.children("[data-active-selection=true]");if(!d)return i(0,b);var e=c.children("[aria-selected=true]").index(d);return i(e-1,b)},p=function(b){var c=a(document.getElementById(b.selectionId)),d=c.children("[data-active-selection=true]"),e=0;return d?(e=c.children("[aria-selected=true]").index(d),e+=1):e=0,i(e,b)},q=function(b){var c=a(document.getElementById(b.suggestionsId)),d=c.children("[aria-selected=true]"),e=c.children("[aria-hidden=false]").index(d);return m(e-1,b)},r=function(b){var c=a(document.getElementById(b.inputId)),d=a(document.getElementById(b.suggestionsId));return c.attr("aria-expanded",!1).attr("aria-activedescendant",b.selectionId),d.hide().attr("aria-hidden",!0),a.Deferred().resolve()},s=function(b,f,g,h){var i="form-autocomplete-updateSuggestions-"+f.inputId;M.util.js_pending(i);var j=a(document.getElementById(f.inputId)),k=a(document.getElementById(f.suggestionsId)),l=!1,n=[];h.children("option").each(function(b,c){a(c).prop("selected")!==!0&&(n[n.length]={label:c.innerHTML,value:a(c).attr("value")})});var o=f.caseSensitive?g:g.toLocaleLowerCase(),p=a.extend({options:n},b,f),q=d.render("core/form_autocomplete_suggestions",p).then(function(e,g){return d.replaceNode(k,e,g),k=a(document.getElementById(f.suggestionsId)),k.show().attr("aria-hidden",!1),k.children().each(function(c,d){d=a(d),b.caseSensitive&&d.text().indexOf(o)>-1||!b.caseSensitive&&d.text().toLocaleLowerCase().indexOf(o)>-1?(d.show().attr("aria-hidden",!1),l=!0):d.hide().attr("aria-hidden",!0)}),j.attr("aria-expanded",!0),h.attr("data-notice")?k.html(h.attr("data-notice")):l?b.tags||m(0,f):c.get_string("nosuggestions","form").done(function(a){k.html(a)}),k}).then(function(){return M.util.js_complete(i)})["catch"](e.exception);return q},t=function(b,c,d){var e=a(document.getElementById(c.inputId)),f=e.val(),g=f.split(","),h=!1;return a.each(g,function(c,e){if(e=e.trim(),""!==e&&(b.multiple||d.children("option").prop("selected",!1),d.children("option").each(function(b,c){a(c).attr("value")==e&&(h=!0,a(c).prop("selected",!0))}),!h)){var f=a("