From 3a964fe2370e949c764ec52ba6c87708ee8a586b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gauvain=20Boich=C3=A9?= Date: Sat, 4 Apr 2020 18:27:27 +0200 Subject: [PATCH] Ajout d'une extension --- ext/phpbbstudio/aps/acp/main_info.php | 47 + ext/phpbbstudio/aps/acp/main_module.php | 192 + ext/phpbbstudio/aps/actions/manager.php | 593 ++ ext/phpbbstudio/aps/actions/type/action.php | 116 + ext/phpbbstudio/aps/actions/type/base.php | 159 + ext/phpbbstudio/aps/actions/type/birthday.php | 109 + ext/phpbbstudio/aps/actions/type/change.php | 101 + ext/phpbbstudio/aps/actions/type/copy.php | 95 + ext/phpbbstudio/aps/actions/type/delete.php | 131 + ext/phpbbstudio/aps/actions/type/edit.php | 95 + ext/phpbbstudio/aps/actions/type/lock.php | 131 + ext/phpbbstudio/aps/actions/type/merge.php | 113 + ext/phpbbstudio/aps/actions/type/move.php | 127 + ext/phpbbstudio/aps/actions/type/pm.php | 202 + ext/phpbbstudio/aps/actions/type/post.php | 211 + ext/phpbbstudio/aps/actions/type/queue.php | 140 + ext/phpbbstudio/aps/actions/type/register.php | 91 + ext/phpbbstudio/aps/actions/type/topic.php | 243 + .../aps/actions/type/topic_type.php | 132 + ext/phpbbstudio/aps/actions/type/vote.php | 117 + ext/phpbbstudio/aps/actions/type/warn.php | 104 + .../aps/adm/style/aps_display.html | 117 + .../aps/adm/style/aps_locations.html | 81 + ext/phpbbstudio/aps/adm/style/aps_logs.html | 42 + .../aps/adm/style/aps_logs_list.html | 50 + ext/phpbbstudio/aps/adm/style/aps_points.html | 99 + .../aps/adm/style/aps_points_copy.html | 37 + .../aps/adm/style/aps_points_list.html | 17 + .../aps/adm/style/aps_settings.html | 54 + .../aps/adm/style/css/aps_common.css | 115 + .../aps/adm/style/css/aps_form.css | 211 + .../aps/adm/style/css/aps_iconpicker.css | 78 + .../aps/adm/style/css/aps_locations.css | 94 + .../style/css/fontawesome-iconpicker.min.css | 10 + .../event/acp_forums_custom_settings.html | 47 + .../acp_users_overview_options_append.html | 4 + .../aps/adm/style/js/aps_common.js | 13 + .../aps/adm/style/js/aps_display.js | 12 + ext/phpbbstudio/aps/adm/style/js/aps_forum.js | 83 + .../style/js/fontawesome-iconpicker.min.js | 1 + .../adm/style/js/jquery-ui-sortable.min.js | 7 + ext/phpbbstudio/aps/composer.json | 32 + ext/phpbbstudio/aps/config/actions.yml | 139 + ext/phpbbstudio/aps/config/constants.yml | 21 + ext/phpbbstudio/aps/config/parameters.yml | 5 + ext/phpbbstudio/aps/config/routing.yml | 17 + ext/phpbbstudio/aps/config/services.yml | 73 + .../aps/config/services_controllers.yml | 58 + ext/phpbbstudio/aps/config/services_core.yml | 78 + .../aps/config/services_listeners.yml | 67 + .../aps/controller/acp_controller.php | 940 +++ .../aps/controller/main_controller.php | 578 ++ .../aps/controller/mcp_controller.php | 617 ++ ext/phpbbstudio/aps/core/acp.php | 236 + ext/phpbbstudio/aps/core/blocks.php | 647 ++ ext/phpbbstudio/aps/core/dbal.php | 119 + ext/phpbbstudio/aps/core/functions.php | 501 ++ ext/phpbbstudio/aps/core/language.php | 106 + ext/phpbbstudio/aps/core/log.php | 560 ++ ext/phpbbstudio/aps/core/template.php | 104 + ext/phpbbstudio/aps/cron/task/birthday.php | 122 + ext/phpbbstudio/aps/docs/.htaccess | 4 + ext/phpbbstudio/aps/docs/CHANGELOG.md | 53 + ext/phpbbstudio/aps/docs/EVENTS.txt | 19 + ext/phpbbstudio/aps/docs/FEATURES.md | 9 + ext/phpbbstudio/aps/docs/README.md | 81 + ext/phpbbstudio/aps/docs/images/aps.png | Bin 0 -> 26707 bytes .../aps/docs/images/dice_rolls.png | Bin 0 -> 915 bytes .../aps/docs/images/highlight_posts.png | Bin 0 -> 1053 bytes .../aps/docs/images/subglobal_topic.png | Bin 0 -> 993 bytes .../aps/docs/images/topic_cement.png | Bin 0 -> 787 bytes .../aps/docs/images/topic_events.png | Bin 0 -> 910 bytes .../aps/docs/images/who_read_what.png | Bin 0 -> 1055 bytes ext/phpbbstudio/aps/docs/index.html | 14 + ext/phpbbstudio/aps/event/acp.php | 266 + ext/phpbbstudio/aps/event/actions.php | 528 ++ ext/phpbbstudio/aps/event/check.php | 275 + ext/phpbbstudio/aps/event/display.php | 200 + ext/phpbbstudio/aps/event/modules.php | 83 + ext/phpbbstudio/aps/event/permissions.php | 67 + ext/phpbbstudio/aps/ext.php | 159 + .../aps/language/en/aps_acp_common.php | 148 + .../aps/language/en/aps_common.php | 30 + .../aps/language/en/aps_display.php | 73 + ext/phpbbstudio/aps/language/en/aps_ext.php | 28 + .../aps/language/en/info_acp_aps.php | 49 + .../aps/language/en/info_mcp_aps.php | 39 + .../aps/language/en/info_ucp_aps.php | 26 + .../aps/language/en/permissions_aps.php | 41 + .../language/en/phpbbstudio_aps_actions.php | 155 + ext/phpbbstudio/aps/license.txt | 280 + ext/phpbbstudio/aps/mcp/main_info.php | 42 + ext/phpbbstudio/aps/mcp/main_module.php | 48 + .../aps/migrations/install_acp_module.php | 78 + .../aps/migrations/install_configuration.php | 84 + .../aps/migrations/install_mcp_module.php | 78 + .../aps/migrations/install_permissions.php | 117 + .../aps/migrations/install_ucp_module.php | 79 + .../aps/migrations/install_user_schema.php | 142 + .../aps/migrations/update_configuration.php | 58 + .../aps/migrations/update_permissions.php | 75 + .../aps/migrations/v105_configuration.php | 58 + .../aps/notification/type/adjust.php | 250 + ext/phpbbstudio/aps/points/blockader.php | 158 + ext/phpbbstudio/aps/points/distributor.php | 206 + ext/phpbbstudio/aps/points/reasoner.php | 193 + ext/phpbbstudio/aps/points/valuator.php | 378 + .../prosilver/template/aps_display.html | 50 + .../template/aps_display_search.html | 36 + .../prosilver/template/aps_display_sort.html | 16 + .../styles/prosilver/template/aps_main.html | 79 + .../prosilver/template/blocks/base.html | 28 + .../template/blocks/points_actions.html | 104 + .../template/blocks/points_adjustments.html | 79 + .../template/blocks/points_forums.html | 18 + .../template/blocks/points_groups.html | 16 + .../template/blocks/points_growth.html | 22 + .../template/blocks/points_random.html | 13 + .../template/blocks/points_search.html | 29 + .../template/blocks/points_settings.html | 18 + .../prosilver/template/blocks/points_top.html | 36 + .../template/blocks/points_trade_off.html | 28 + ...emberlist_view_user_statistics_before.html | 2 + .../navbar_header_profile_list_after.html | 7 + .../navbar_header_profile_list_before.html | 7 + .../navbar_header_quick_links_after.html | 7 + .../navbar_header_quick_links_before.html | 7 + .../navbar_header_user_profile_append.html | 7 + .../navbar_header_user_profile_prepend.html | 7 + .../overall_footer_breadcrumb_append.html | 7 + .../event/overall_footer_teamlink_after.html | 7 + .../event/overall_footer_teamlink_before.html | 7 + .../event/overall_footer_timezone_after.html | 7 + .../event/overall_footer_timezone_before.html | 7 + .../overall_header_navigation_append.html | 7 + .../overall_header_navigation_prepend.html | 7 + .../event/ucp_pm_viewmessage_rank_after.html | 2 + .../viewtopic_body_postrow_rank_after.html | 2 + .../prosilver/template/js/aps_display.js | 255 + .../styles/prosilver/template/js/aps_mcp.js | 23 + .../prosilver/template/js/chart.bundle.min.js | 10 + .../template/js/jquery-ui-sortable.min.js | 7 + .../styles/prosilver/template/js/palette.js | 1501 ++++ .../template/js/sweetalert2.all.min.js | 2 + .../template/mcp/mcp_aps_change.html | 81 + .../template/mcp/mcp_aps_find_username.html | 42 + .../prosilver/template/mcp/mcp_aps_front.html | 56 + .../prosilver/template/mcp/mcp_aps_logs.html | 40 + .../template/mcp/mcp_aps_logs_list.html | 38 + .../styles/prosilver/theme/aps_display.css | 738 ++ .../aps/styles/prosilver/theme/aps_form.css | 184 + ext/phpbbstudio/ass/acp/main_info.php | 57 + ext/phpbbstudio/ass/acp/main_module.php | 51 + ext/phpbbstudio/ass/adm/style/ass_errors.html | 14 + ext/phpbbstudio/ass/adm/style/ass_files.html | 199 + .../ass/adm/style/ass_inventory.html | 206 + .../ass/adm/style/ass_item_form.html | 351 + ext/phpbbstudio/ass/adm/style/ass_items.html | 208 + ext/phpbbstudio/ass/adm/style/ass_logs.html | 113 + .../ass/adm/style/ass_overview.html | 440 ++ .../ass/adm/style/ass_settings.html | 350 + .../ass/adm/style/css/ass_common.css | 590 ++ .../ass/adm/style/css/daterangepicker.css | 410 + ext/phpbbstudio/ass/adm/style/css/select2.css | 481 ++ .../ass/adm/style/css/select2.min.css | 1 + ext/phpbbstudio/ass/adm/style/items/file.html | 6 + .../ass/adm/style/items/points.html | 6 + .../ass/adm/style/js/ass_common.js | 326 + ext/phpbbstudio/ass/adm/style/js/ass_help.js | 91 + .../ass/adm/style/js/daterangepicker.js | 1565 ++++ ext/phpbbstudio/ass/adm/style/js/i18n/af.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ar.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/az.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/bg.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/bn.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/bs.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ca.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/cs.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/da.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/de.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/dsb.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/el.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/en.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/es.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/et.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/eu.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/fa.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/fi.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/fr.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/gl.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/he.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/hi.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/hr.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/hsb.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/hu.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/hy.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/id.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/is.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/it.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ja.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ka.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/km.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ko.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/lt.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/lv.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/mk.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ms.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/nb.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ne.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/nl.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/pl.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ps.js | 3 + .../ass/adm/style/js/i18n/pt-BR.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/pt.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ro.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/ru.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/sk.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/sl.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/sq.js | 3 + .../ass/adm/style/js/i18n/sr-Cyrl.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/sr.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/sv.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/th.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/tk.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/tr.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/uk.js | 3 + ext/phpbbstudio/ass/adm/style/js/i18n/vi.js | 3 + .../ass/adm/style/js/i18n/zh-CN.js | 3 + .../ass/adm/style/js/i18n/zh-TW.js | 3 + .../ass/adm/style/js/moment.min.js | 1 + .../ass/adm/style/js/select2.full.js | 6749 +++++++++++++++++ .../ass/adm/style/js/select2.full.min.js | 2 + ext/phpbbstudio/ass/adm/style/js/select2.js | 6037 +++++++++++++++ .../ass/adm/style/js/select2.min.js | 2 + ext/phpbbstudio/ass/composer.json | 32 + ext/phpbbstudio/ass/config/routing.yml | 54 + ext/phpbbstudio/ass/config/services.yml | 11 + .../ass/config/services_controllers.yml | 139 + .../ass/config/services_helpers.yml | 45 + ext/phpbbstudio/ass/config/services_items.yml | 50 + .../ass/config/services_listeners.yml | 30 + .../ass/config/services_notifications.yml | 29 + .../ass/config/services_objects.yml | 75 + ext/phpbbstudio/ass/config/tables.yml | 5 + .../ass/controller/acp_files_controller.php | 295 + .../controller/acp_inventory_controller.php | 604 ++ .../ass/controller/acp_items_controller.php | 703 ++ .../ass/controller/acp_logs_controller.php | 246 + .../controller/acp_overview_controller.php | 444 ++ .../controller/acp_settings_controller.php | 341 + .../ass/controller/inventory_controller.php | 968 +++ .../ass/controller/shop_controller.php | 333 + ext/phpbbstudio/ass/docs/.htaccess | 4 + ext/phpbbstudio/ass/docs/CHANGELOG.md | 79 + ext/phpbbstudio/ass/docs/EVENTS.txt | 19 + ext/phpbbstudio/ass/docs/FEATURES.md | 8 + ext/phpbbstudio/ass/docs/README.md | 86 + ext/phpbbstudio/ass/docs/images/ass.png | Bin 0 -> 26816 bytes .../ass/docs/images/dice_rolls.png | Bin 0 -> 915 bytes .../ass/docs/images/highlight_posts.png | Bin 0 -> 1053 bytes ext/phpbbstudio/ass/docs/images/shop1.png | Bin 0 -> 204226 bytes ext/phpbbstudio/ass/docs/images/shop2.png | Bin 0 -> 102369 bytes ext/phpbbstudio/ass/docs/images/shop3.png | Bin 0 -> 475778 bytes ext/phpbbstudio/ass/docs/images/shop4.png | Bin 0 -> 92332 bytes ext/phpbbstudio/ass/docs/images/shop5.png | Bin 0 -> 233397 bytes .../ass/docs/images/subglobal_topic.png | Bin 0 -> 993 bytes .../ass/docs/images/topic_cement.png | Bin 0 -> 787 bytes .../ass/docs/images/topic_events.png | Bin 0 -> 910 bytes .../ass/docs/images/who_read_what.png | Bin 0 -> 1055 bytes ext/phpbbstudio/ass/docs/index.html | 14 + ext/phpbbstudio/ass/entity/category.php | 345 + .../ass/entity/category_interface.php | 193 + ext/phpbbstudio/ass/entity/item.php | 1269 ++++ ext/phpbbstudio/ass/entity/item_interface.php | 785 ++ ext/phpbbstudio/ass/event/blocks_listener.php | 95 + .../ass/event/exception_listener.php | 168 + ext/phpbbstudio/ass/event/setup_listener.php | 149 + .../ass/exceptions/shop_exception.php | 18 + .../exceptions/shop_inactive_exception.php | 18 + .../ass/exceptions/shop_item_exception.php | 18 + ext/phpbbstudio/ass/ext.php | 176 + ext/phpbbstudio/ass/helper/controller.php | 276 + ext/phpbbstudio/ass/helper/files.php | 471 ++ ext/phpbbstudio/ass/helper/log.php | 213 + ext/phpbbstudio/ass/helper/router.php | 137 + ext/phpbbstudio/ass/helper/time.php | 183 + ext/phpbbstudio/ass/items/manager.php | 83 + ext/phpbbstudio/ass/items/type/base.php | 180 + ext/phpbbstudio/ass/items/type/file.php | 89 + ext/phpbbstudio/ass/items/type/item_type.php | 115 + ext/phpbbstudio/ass/items/type/points.php | 120 + .../ass/language/en/ass_acp_common.php | 250 + .../ass/language/en/ass_acp_files.php | 44 + .../ass/language/en/ass_acp_help.php | 355 + .../ass/language/en/ass_common.php | 222 + .../ass/language/en/ass_display.php | 33 + ext/phpbbstudio/ass/language/en/ass_ext.php | 28 + ext/phpbbstudio/ass/language/en/ass_lang.php | 34 + .../ass/language/en/info_acp_ass.php | 56 + .../ass/language/en/permissions_ass.php | 41 + ext/phpbbstudio/ass/license.txt | 280 + .../ass/migrations/install_acp_module.php | 73 + .../ass/migrations/install_configuration.php | 120 + .../ass/migrations/install_directories.php | 64 + .../ass/migrations/install_permissions.php | 55 + .../ass/migrations/install_roles.php | 96 + .../ass/migrations/install_tables.php | 175 + .../ass/migrations/update_acp_module.php | 68 + .../ass/migrations/update_permissions.php | 43 + .../ass/migrations/update_roles.php | 70 + .../ass/migrations/update_tables.php | 83 + .../migrations/v111_update_configuration.php | 69 + .../migrations/v111_update_permissions.php | 72 + .../ass/migrations/v111_update_tables.php | 75 + .../migrations/v112_update_configuration.php | 53 + .../migrations/v113_update_configuration.php | 53 + .../ass/notification/notification.php | 147 + .../ass/notification/type/gift.php | 229 + .../ass/notification/type/stock.php | 220 + ext/phpbbstudio/ass/operator/blocks.php | 262 + ext/phpbbstudio/ass/operator/category.php | 236 + ext/phpbbstudio/ass/operator/inventory.php | 334 + ext/phpbbstudio/ass/operator/item.php | 657 ++ .../ass/styles/all/template/ass_carousel.html | 8 + .../ass/styles/all/template/ass_category.html | 235 + .../styles/all/template/ass_confirm_body.html | 3 + .../styles/all/template/ass_exception.html | 70 + .../ass/styles/all/template/ass_history.html | 156 + .../styles/all/template/ass_inventory.html | 136 + .../ass/styles/all/template/ass_item.html | 286 + .../all/template/ass_item_carousel.html | 37 + .../all/template/ass_item_inventory.html | 185 + .../styles/all/template/ass_item_panel.html | 47 + .../ass/styles/all/template/ass_message.html | 1 + .../styles/all/template/ass_pagination.html | 45 + .../ass/styles/all/template/ass_purchase.html | 191 + .../all/template/ass_purchase_ajax.html | 144 + .../ass/styles/all/template/ass_shop.html | 64 + .../styles/all/template/blocks/available.html | 27 + .../styles/all/template/blocks/buyers.html | 13 + .../styles/all/template/blocks/charts.html | 18 + .../styles/all/template/blocks/featured.html | 27 + .../styles/all/template/blocks/gifters.html | 13 + .../styles/all/template/blocks/limited.html | 23 + .../styles/all/template/blocks/purchases.html | 23 + .../template/blocks/purchases_category.html | 18 + .../all/template/blocks/purchases_group.html | 18 + .../styles/all/template/blocks/recent.html | 27 + .../ass/styles/all/template/blocks/sale.html | 27 + .../styles/all/template/blocks/spenders.html | 13 + .../navbar_header_profile_list_after.html | 7 + .../navbar_header_profile_list_before.html | 7 + .../navbar_header_quick_links_after.html | 7 + .../navbar_header_quick_links_before.html | 7 + .../navbar_header_user_profile_append.html | 7 + .../navbar_header_user_profile_prepend.html | 7 + .../template/event/overall_footer_after.html | 5 + .../overall_footer_breadcrumb_append.html | 7 + .../event/overall_footer_teamlink_after.html | 7 + .../event/overall_footer_teamlink_before.html | 7 + .../event/overall_footer_timezone_after.html | 7 + .../event/overall_footer_timezone_before.html | 7 + .../overall_header_navigation_append.html | 7 + .../overall_header_navigation_prepend.html | 7 + .../event/phpbbstudio_aps_menu_append.html | 16 + .../ass/styles/all/template/js/ass_common.js | 640 ++ .../ass/styles/all/template/js/jquery-ui.js | 2814 +++++++ .../styles/all/template/js/jquery-ui.min.js | 7 + .../ass/styles/all/template/js/sketch.js | 631 ++ .../ass/styles/all/template/js/sketch.min.js | 2 + .../ass/styles/all/template/js/slick.min.js | 1 + .../ass/styles/all/theme/ajax-loader.gif | Bin 0 -> 4178 bytes .../ass/styles/all/theme/ass_common.css | 1090 +++ .../ass/styles/all/theme/ass_exception.css | 347 + .../ass/styles/all/theme/ass_item.css | 314 + .../ass/styles/all/theme/fonts/slick.eot | Bin 0 -> 2048 bytes .../ass/styles/all/theme/fonts/slick.svg | 14 + .../ass/styles/all/theme/fonts/slick.ttf | Bin 0 -> 1892 bytes .../ass/styles/all/theme/fonts/slick.woff | Bin 0 -> 1380 bytes .../ass/styles/all/theme/images/gold-pot.svg | 1 + .../all/theme/images/mountain-summit.svg | 7 + .../styles/all/theme/images/rising-graph.svg | 8 + .../ass/styles/all/theme/images/tree.svg | 4 + .../ass/styles/all/theme/images/trees.svg | 5 + .../ass/styles/all/theme/jquery-ui.css | 440 ++ .../ass/styles/all/theme/jquery-ui.min.css | 7 + .../ass/styles/all/theme/slick.css | 119 + 387 files changed, 58921 insertions(+) create mode 100644 ext/phpbbstudio/aps/acp/main_info.php create mode 100644 ext/phpbbstudio/aps/acp/main_module.php create mode 100644 ext/phpbbstudio/aps/actions/manager.php create mode 100644 ext/phpbbstudio/aps/actions/type/action.php create mode 100644 ext/phpbbstudio/aps/actions/type/base.php create mode 100644 ext/phpbbstudio/aps/actions/type/birthday.php create mode 100644 ext/phpbbstudio/aps/actions/type/change.php create mode 100644 ext/phpbbstudio/aps/actions/type/copy.php create mode 100644 ext/phpbbstudio/aps/actions/type/delete.php create mode 100644 ext/phpbbstudio/aps/actions/type/edit.php create mode 100644 ext/phpbbstudio/aps/actions/type/lock.php create mode 100644 ext/phpbbstudio/aps/actions/type/merge.php create mode 100644 ext/phpbbstudio/aps/actions/type/move.php create mode 100644 ext/phpbbstudio/aps/actions/type/pm.php create mode 100644 ext/phpbbstudio/aps/actions/type/post.php create mode 100644 ext/phpbbstudio/aps/actions/type/queue.php create mode 100644 ext/phpbbstudio/aps/actions/type/register.php create mode 100644 ext/phpbbstudio/aps/actions/type/topic.php create mode 100644 ext/phpbbstudio/aps/actions/type/topic_type.php create mode 100644 ext/phpbbstudio/aps/actions/type/vote.php create mode 100644 ext/phpbbstudio/aps/actions/type/warn.php create mode 100644 ext/phpbbstudio/aps/adm/style/aps_display.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_locations.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_logs.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_logs_list.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_points.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_points_copy.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_points_list.html create mode 100644 ext/phpbbstudio/aps/adm/style/aps_settings.html create mode 100644 ext/phpbbstudio/aps/adm/style/css/aps_common.css create mode 100644 ext/phpbbstudio/aps/adm/style/css/aps_form.css create mode 100644 ext/phpbbstudio/aps/adm/style/css/aps_iconpicker.css create mode 100644 ext/phpbbstudio/aps/adm/style/css/aps_locations.css create mode 100644 ext/phpbbstudio/aps/adm/style/css/fontawesome-iconpicker.min.css create mode 100644 ext/phpbbstudio/aps/adm/style/event/acp_forums_custom_settings.html create mode 100644 ext/phpbbstudio/aps/adm/style/event/acp_users_overview_options_append.html create mode 100644 ext/phpbbstudio/aps/adm/style/js/aps_common.js create mode 100644 ext/phpbbstudio/aps/adm/style/js/aps_display.js create mode 100644 ext/phpbbstudio/aps/adm/style/js/aps_forum.js create mode 100644 ext/phpbbstudio/aps/adm/style/js/fontawesome-iconpicker.min.js create mode 100644 ext/phpbbstudio/aps/adm/style/js/jquery-ui-sortable.min.js create mode 100644 ext/phpbbstudio/aps/composer.json create mode 100644 ext/phpbbstudio/aps/config/actions.yml create mode 100644 ext/phpbbstudio/aps/config/constants.yml create mode 100644 ext/phpbbstudio/aps/config/parameters.yml create mode 100644 ext/phpbbstudio/aps/config/routing.yml create mode 100644 ext/phpbbstudio/aps/config/services.yml create mode 100644 ext/phpbbstudio/aps/config/services_controllers.yml create mode 100644 ext/phpbbstudio/aps/config/services_core.yml create mode 100644 ext/phpbbstudio/aps/config/services_listeners.yml create mode 100644 ext/phpbbstudio/aps/controller/acp_controller.php create mode 100644 ext/phpbbstudio/aps/controller/main_controller.php create mode 100644 ext/phpbbstudio/aps/controller/mcp_controller.php create mode 100644 ext/phpbbstudio/aps/core/acp.php create mode 100644 ext/phpbbstudio/aps/core/blocks.php create mode 100644 ext/phpbbstudio/aps/core/dbal.php create mode 100644 ext/phpbbstudio/aps/core/functions.php create mode 100644 ext/phpbbstudio/aps/core/language.php create mode 100644 ext/phpbbstudio/aps/core/log.php create mode 100644 ext/phpbbstudio/aps/core/template.php create mode 100644 ext/phpbbstudio/aps/cron/task/birthday.php create mode 100644 ext/phpbbstudio/aps/docs/.htaccess create mode 100644 ext/phpbbstudio/aps/docs/CHANGELOG.md create mode 100644 ext/phpbbstudio/aps/docs/EVENTS.txt create mode 100644 ext/phpbbstudio/aps/docs/FEATURES.md create mode 100644 ext/phpbbstudio/aps/docs/README.md create mode 100644 ext/phpbbstudio/aps/docs/images/aps.png create mode 100644 ext/phpbbstudio/aps/docs/images/dice_rolls.png create mode 100644 ext/phpbbstudio/aps/docs/images/highlight_posts.png create mode 100644 ext/phpbbstudio/aps/docs/images/subglobal_topic.png create mode 100644 ext/phpbbstudio/aps/docs/images/topic_cement.png create mode 100644 ext/phpbbstudio/aps/docs/images/topic_events.png create mode 100644 ext/phpbbstudio/aps/docs/images/who_read_what.png create mode 100644 ext/phpbbstudio/aps/docs/index.html create mode 100644 ext/phpbbstudio/aps/event/acp.php create mode 100644 ext/phpbbstudio/aps/event/actions.php create mode 100644 ext/phpbbstudio/aps/event/check.php create mode 100644 ext/phpbbstudio/aps/event/display.php create mode 100644 ext/phpbbstudio/aps/event/modules.php create mode 100644 ext/phpbbstudio/aps/event/permissions.php create mode 100644 ext/phpbbstudio/aps/ext.php create mode 100644 ext/phpbbstudio/aps/language/en/aps_acp_common.php create mode 100644 ext/phpbbstudio/aps/language/en/aps_common.php create mode 100644 ext/phpbbstudio/aps/language/en/aps_display.php create mode 100644 ext/phpbbstudio/aps/language/en/aps_ext.php create mode 100644 ext/phpbbstudio/aps/language/en/info_acp_aps.php create mode 100644 ext/phpbbstudio/aps/language/en/info_mcp_aps.php create mode 100644 ext/phpbbstudio/aps/language/en/info_ucp_aps.php create mode 100644 ext/phpbbstudio/aps/language/en/permissions_aps.php create mode 100644 ext/phpbbstudio/aps/language/en/phpbbstudio_aps_actions.php create mode 100644 ext/phpbbstudio/aps/license.txt create mode 100644 ext/phpbbstudio/aps/mcp/main_info.php create mode 100644 ext/phpbbstudio/aps/mcp/main_module.php create mode 100644 ext/phpbbstudio/aps/migrations/install_acp_module.php create mode 100644 ext/phpbbstudio/aps/migrations/install_configuration.php create mode 100644 ext/phpbbstudio/aps/migrations/install_mcp_module.php create mode 100644 ext/phpbbstudio/aps/migrations/install_permissions.php create mode 100644 ext/phpbbstudio/aps/migrations/install_ucp_module.php create mode 100644 ext/phpbbstudio/aps/migrations/install_user_schema.php create mode 100644 ext/phpbbstudio/aps/migrations/update_configuration.php create mode 100644 ext/phpbbstudio/aps/migrations/update_permissions.php create mode 100644 ext/phpbbstudio/aps/migrations/v105_configuration.php create mode 100644 ext/phpbbstudio/aps/notification/type/adjust.php create mode 100644 ext/phpbbstudio/aps/points/blockader.php create mode 100644 ext/phpbbstudio/aps/points/distributor.php create mode 100644 ext/phpbbstudio/aps/points/reasoner.php create mode 100644 ext/phpbbstudio/aps/points/valuator.php create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/aps_display.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/aps_display_search.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/aps_display_sort.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/aps_main.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/base.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_actions.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_adjustments.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_forums.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_groups.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_growth.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_random.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_search.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_settings.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_top.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_trade_off.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/memberlist_view_user_statistics_before.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_before.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_before.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_append.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_prepend.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_breadcrumb_append.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_before.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_before.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_append.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_prepend.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/ucp_pm_viewmessage_rank_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/event/viewtopic_body_postrow_rank_after.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/aps_display.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/aps_mcp.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/chart.bundle.min.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/jquery-ui-sortable.min.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/palette.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/js/sweetalert2.all.min.js create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_change.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_find_username.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_front.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs_list.html create mode 100644 ext/phpbbstudio/aps/styles/prosilver/theme/aps_display.css create mode 100644 ext/phpbbstudio/aps/styles/prosilver/theme/aps_form.css create mode 100644 ext/phpbbstudio/ass/acp/main_info.php create mode 100644 ext/phpbbstudio/ass/acp/main_module.php create mode 100644 ext/phpbbstudio/ass/adm/style/ass_errors.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_files.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_inventory.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_item_form.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_items.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_logs.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_overview.html create mode 100644 ext/phpbbstudio/ass/adm/style/ass_settings.html create mode 100644 ext/phpbbstudio/ass/adm/style/css/ass_common.css create mode 100644 ext/phpbbstudio/ass/adm/style/css/daterangepicker.css create mode 100644 ext/phpbbstudio/ass/adm/style/css/select2.css create mode 100644 ext/phpbbstudio/ass/adm/style/css/select2.min.css create mode 100644 ext/phpbbstudio/ass/adm/style/items/file.html create mode 100644 ext/phpbbstudio/ass/adm/style/items/points.html create mode 100644 ext/phpbbstudio/ass/adm/style/js/ass_common.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/ass_help.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/daterangepicker.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/af.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ar.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/az.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/bg.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/bn.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/bs.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ca.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/cs.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/da.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/de.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/dsb.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/el.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/en.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/es.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/et.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/eu.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/fa.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/fi.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/fr.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/gl.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/he.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/hi.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/hr.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/hsb.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/hu.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/hy.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/id.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/is.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/it.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ja.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ka.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/km.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ko.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/lt.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/lv.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/mk.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ms.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/nb.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ne.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/nl.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/pl.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ps.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/pt-BR.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/pt.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ro.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/ru.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sk.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sl.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sq.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sr-Cyrl.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sr.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/sv.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/th.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/tk.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/tr.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/uk.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/vi.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/zh-CN.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/i18n/zh-TW.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/moment.min.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/select2.full.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/select2.full.min.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/select2.js create mode 100644 ext/phpbbstudio/ass/adm/style/js/select2.min.js create mode 100644 ext/phpbbstudio/ass/composer.json create mode 100644 ext/phpbbstudio/ass/config/routing.yml create mode 100644 ext/phpbbstudio/ass/config/services.yml create mode 100644 ext/phpbbstudio/ass/config/services_controllers.yml create mode 100644 ext/phpbbstudio/ass/config/services_helpers.yml create mode 100644 ext/phpbbstudio/ass/config/services_items.yml create mode 100644 ext/phpbbstudio/ass/config/services_listeners.yml create mode 100644 ext/phpbbstudio/ass/config/services_notifications.yml create mode 100644 ext/phpbbstudio/ass/config/services_objects.yml create mode 100644 ext/phpbbstudio/ass/config/tables.yml create mode 100644 ext/phpbbstudio/ass/controller/acp_files_controller.php create mode 100644 ext/phpbbstudio/ass/controller/acp_inventory_controller.php create mode 100644 ext/phpbbstudio/ass/controller/acp_items_controller.php create mode 100644 ext/phpbbstudio/ass/controller/acp_logs_controller.php create mode 100644 ext/phpbbstudio/ass/controller/acp_overview_controller.php create mode 100644 ext/phpbbstudio/ass/controller/acp_settings_controller.php create mode 100644 ext/phpbbstudio/ass/controller/inventory_controller.php create mode 100644 ext/phpbbstudio/ass/controller/shop_controller.php create mode 100644 ext/phpbbstudio/ass/docs/.htaccess create mode 100644 ext/phpbbstudio/ass/docs/CHANGELOG.md create mode 100644 ext/phpbbstudio/ass/docs/EVENTS.txt create mode 100644 ext/phpbbstudio/ass/docs/FEATURES.md create mode 100644 ext/phpbbstudio/ass/docs/README.md create mode 100644 ext/phpbbstudio/ass/docs/images/ass.png create mode 100644 ext/phpbbstudio/ass/docs/images/dice_rolls.png create mode 100644 ext/phpbbstudio/ass/docs/images/highlight_posts.png create mode 100644 ext/phpbbstudio/ass/docs/images/shop1.png create mode 100644 ext/phpbbstudio/ass/docs/images/shop2.png create mode 100644 ext/phpbbstudio/ass/docs/images/shop3.png create mode 100644 ext/phpbbstudio/ass/docs/images/shop4.png create mode 100644 ext/phpbbstudio/ass/docs/images/shop5.png create mode 100644 ext/phpbbstudio/ass/docs/images/subglobal_topic.png create mode 100644 ext/phpbbstudio/ass/docs/images/topic_cement.png create mode 100644 ext/phpbbstudio/ass/docs/images/topic_events.png create mode 100644 ext/phpbbstudio/ass/docs/images/who_read_what.png create mode 100644 ext/phpbbstudio/ass/docs/index.html create mode 100644 ext/phpbbstudio/ass/entity/category.php create mode 100644 ext/phpbbstudio/ass/entity/category_interface.php create mode 100644 ext/phpbbstudio/ass/entity/item.php create mode 100644 ext/phpbbstudio/ass/entity/item_interface.php create mode 100644 ext/phpbbstudio/ass/event/blocks_listener.php create mode 100644 ext/phpbbstudio/ass/event/exception_listener.php create mode 100644 ext/phpbbstudio/ass/event/setup_listener.php create mode 100644 ext/phpbbstudio/ass/exceptions/shop_exception.php create mode 100644 ext/phpbbstudio/ass/exceptions/shop_inactive_exception.php create mode 100644 ext/phpbbstudio/ass/exceptions/shop_item_exception.php create mode 100644 ext/phpbbstudio/ass/ext.php create mode 100644 ext/phpbbstudio/ass/helper/controller.php create mode 100644 ext/phpbbstudio/ass/helper/files.php create mode 100644 ext/phpbbstudio/ass/helper/log.php create mode 100644 ext/phpbbstudio/ass/helper/router.php create mode 100644 ext/phpbbstudio/ass/helper/time.php create mode 100644 ext/phpbbstudio/ass/items/manager.php create mode 100644 ext/phpbbstudio/ass/items/type/base.php create mode 100644 ext/phpbbstudio/ass/items/type/file.php create mode 100644 ext/phpbbstudio/ass/items/type/item_type.php create mode 100644 ext/phpbbstudio/ass/items/type/points.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_acp_common.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_acp_files.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_acp_help.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_common.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_display.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_ext.php create mode 100644 ext/phpbbstudio/ass/language/en/ass_lang.php create mode 100644 ext/phpbbstudio/ass/language/en/info_acp_ass.php create mode 100644 ext/phpbbstudio/ass/language/en/permissions_ass.php create mode 100644 ext/phpbbstudio/ass/license.txt create mode 100644 ext/phpbbstudio/ass/migrations/install_acp_module.php create mode 100644 ext/phpbbstudio/ass/migrations/install_configuration.php create mode 100644 ext/phpbbstudio/ass/migrations/install_directories.php create mode 100644 ext/phpbbstudio/ass/migrations/install_permissions.php create mode 100644 ext/phpbbstudio/ass/migrations/install_roles.php create mode 100644 ext/phpbbstudio/ass/migrations/install_tables.php create mode 100644 ext/phpbbstudio/ass/migrations/update_acp_module.php create mode 100644 ext/phpbbstudio/ass/migrations/update_permissions.php create mode 100644 ext/phpbbstudio/ass/migrations/update_roles.php create mode 100644 ext/phpbbstudio/ass/migrations/update_tables.php create mode 100644 ext/phpbbstudio/ass/migrations/v111_update_configuration.php create mode 100644 ext/phpbbstudio/ass/migrations/v111_update_permissions.php create mode 100644 ext/phpbbstudio/ass/migrations/v111_update_tables.php create mode 100644 ext/phpbbstudio/ass/migrations/v112_update_configuration.php create mode 100644 ext/phpbbstudio/ass/migrations/v113_update_configuration.php create mode 100644 ext/phpbbstudio/ass/notification/notification.php create mode 100644 ext/phpbbstudio/ass/notification/type/gift.php create mode 100644 ext/phpbbstudio/ass/notification/type/stock.php create mode 100644 ext/phpbbstudio/ass/operator/blocks.php create mode 100644 ext/phpbbstudio/ass/operator/category.php create mode 100644 ext/phpbbstudio/ass/operator/inventory.php create mode 100644 ext/phpbbstudio/ass/operator/item.php create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_carousel.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_category.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_confirm_body.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_exception.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_history.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_inventory.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_item.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_item_carousel.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_item_inventory.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_item_panel.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_message.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_pagination.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_purchase.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_purchase_ajax.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/ass_shop.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/available.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/buyers.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/charts.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/featured.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/gifters.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/limited.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/purchases.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/purchases_category.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/purchases_group.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/recent.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/sale.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/blocks/spenders.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_profile_list_after.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_profile_list_before.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_quick_links_after.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_quick_links_before.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_user_profile_append.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/navbar_header_user_profile_prepend.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_after.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_breadcrumb_append.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_teamlink_after.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_teamlink_before.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_timezone_after.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_footer_timezone_before.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_header_navigation_append.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/overall_header_navigation_prepend.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/event/phpbbstudio_aps_menu_append.html create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/ass_common.js create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/jquery-ui.js create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/jquery-ui.min.js create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/sketch.js create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/sketch.min.js create mode 100644 ext/phpbbstudio/ass/styles/all/template/js/slick.min.js create mode 100644 ext/phpbbstudio/ass/styles/all/theme/ajax-loader.gif create mode 100644 ext/phpbbstudio/ass/styles/all/theme/ass_common.css create mode 100644 ext/phpbbstudio/ass/styles/all/theme/ass_exception.css create mode 100644 ext/phpbbstudio/ass/styles/all/theme/ass_item.css create mode 100644 ext/phpbbstudio/ass/styles/all/theme/fonts/slick.eot create mode 100644 ext/phpbbstudio/ass/styles/all/theme/fonts/slick.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/fonts/slick.ttf create mode 100644 ext/phpbbstudio/ass/styles/all/theme/fonts/slick.woff create mode 100644 ext/phpbbstudio/ass/styles/all/theme/images/gold-pot.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/images/mountain-summit.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/images/rising-graph.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/images/tree.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/images/trees.svg create mode 100644 ext/phpbbstudio/ass/styles/all/theme/jquery-ui.css create mode 100644 ext/phpbbstudio/ass/styles/all/theme/jquery-ui.min.css create mode 100644 ext/phpbbstudio/ass/styles/all/theme/slick.css diff --git a/ext/phpbbstudio/aps/acp/main_info.php b/ext/phpbbstudio/aps/acp/main_info.php new file mode 100644 index 0000000..3176a96 --- /dev/null +++ b/ext/phpbbstudio/aps/acp/main_info.php @@ -0,0 +1,47 @@ + '\phpbbstudio\aps\acp\main_module', + 'title' => 'ACP_APS_POINTS', + 'modes' => [ + 'settings' => [ + 'title' => 'ACP_APS_MODE_SETTINGS', + 'auth' => 'ext_phpbbstudio/aps && acl_a_aps_settings', + 'cat' => ['ACP_APS_POINTS'] + ], + 'display' => [ + 'title' => 'ACP_APS_MODE_DISPLAY', + 'auth' => 'ext_phpbbstudio/aps && acl_a_aps_display', + 'cat' => ['ACP_APS_POINTS'], + ], + 'points' => [ + 'title' => 'ACP_APS_MODE_POINTS', + 'auth' => 'ext_phpbbstudio/aps && (acl_a_aps_points || acl_a_aps_reasons)', + 'cat' => ['ACP_APS_POINTS'], + ], + 'logs' => [ + 'title' => 'ACP_APS_MODE_LOGS', + 'auth' => 'ext_phpbbstudio/aps && acl_a_aps_logs', + 'cat' => ['ACP_APS_POINTS'], + ] + ], + ]; + } +} diff --git a/ext/phpbbstudio/aps/acp/main_module.php b/ext/phpbbstudio/aps/acp/main_module.php new file mode 100644 index 0000000..80b6104 --- /dev/null +++ b/ext/phpbbstudio/aps/acp/main_module.php @@ -0,0 +1,192 @@ +container = $phpbb_container; + $this->language = $this->container->get('language'); + + /** @var \phpbbstudio\aps\controller\acp_controller $controller */ + $controller = $this->container->get('phpbbstudio.aps.controller.acp'); + + /** @var \phpbbstudio\aps\core\functions $functions */ + $functions = $this->container->get('phpbbstudio.aps.functions'); + + // Set the page title and template + $this->tpl_name = 'aps_' . $mode; + $this->page_title = $this->language->lang('ACP_APS_POINTS') . ' • ' . $this->language->lang('ACP_APS_MODE_' . utf8_strtoupper($mode), $functions->get_name()); + + // Make the custom form action available in the controller and handle the mode + $controller->set_page_url($this->u_action)->{$mode}(); + } + + /** + * Build configuration template for custom points actions. + * + * @param string $action The custom points action + * @param bool $ajax The AJAX request indicator + * @return string The configuration template + * @access public + */ + public function set_action($action, $ajax = true) + { + return ''; + } + + /** + * Build configuration template for the points separator. + * + * @param string $value The config value + * @return string The HTML formatted select options + * @access public + */ + public function build_separator_select($value) + { + $space = htmlspecialchars(' '); + $narrow = htmlspecialchars(' '); + + $separators = [ + ',' => 'ACP_APS_SEPARATOR_COMMA', + '.' => 'ACP_APS_SEPARATOR_PERIOD', + '-' => 'ACP_APS_SEPARATOR_DASH', + '_' => 'ACP_APS_SEPARATOR_UNDERSCORE', + $space => 'ACP_APS_SEPARATOR_SPACE', + $narrow => 'ACP_APS_SEPARATOR_SPACE_NARROW', + ]; + + return build_select($separators, $value); + } + + /** + * Build configuration template for the points icon image. + * + * @param string $value The config value + * @param string $key The config key + * @return string The configuration template + * @access public + */ + public function build_icon_image_select($value, $key = '') + { + $directory = $this->container->getParameter('core.root_path') . '/images'; + + $files = array_diff(scandir($directory), ['.', '..']); + $images = array_filter($files, function($file) use ($directory) + { + $file = "{$directory}/{$file}"; + + return is_file($file) && filesize($file) && preg_match('#\.gif|jpg|jpeg|png|svg$#i', $file); + }); + + $select = ''; + + return $select; + } + + /** + * Build configuration template for the points icon position. + * + * @param string $value The config value + * @param string $key The config key + * @return string The configuration template + * @access public + */ + public function build_position_radio($value, $key = '') + { + return $this->build_radio($value, $key, [ + 0 => 'ACP_APS_POINTS_ICON_POSITION_LEFT', + 1 => 'ACP_APS_POINTS_ICON_POSITION_RIGHT', + ]); + } + + /** + * Build configuration template for the points decimals. + * + * @param string $value The config value + * @return string The configuration template + * @access public + */ + public function build_decimal_select($value) + { + $options = ''; + + for ($i = 0; $i <= 2; $i++) + { + $options .= ''; + } + + return $options; + } + + public function build_ignore_criteria_radio($value, $key = '') + { + return $this->build_radio($value, $key, array_map(function($constant) + { + return 'ACP_APS_IGNORE_' . utf8_strtoupper($constant); + }, array_flip($this->container->getParameter('phpbbstudio.aps.constants')['ignore']))); + } + + protected function build_radio($value, $key, $options) + { + $html = ''; + $s_id = false; + + foreach ($options as $val => $title) + { + $check = $value === $val ? ' checked' : ''; + $id = $s_id ? ' id="' . $key . '"' : ''; + + $html .= ''; + + $s_id = true; + } + + return $html; + } +} diff --git a/ext/phpbbstudio/aps/actions/manager.php b/ext/phpbbstudio/aps/actions/manager.php new file mode 100644 index 0000000..b51a0e0 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/manager.php @@ -0,0 +1,593 @@ +distributor = $distributor; + $this->functions = $functions; + $this->lang = $lang; + $this->log = $log; + $this->valuator = $valuator; + $this->user = $user; + + $this->actions = $actions; + } + + /** + * Get the APS Distributor object. + * + * @return \phpbbstudio\aps\points\distributor + * @access public + */ + public function get_distributor() + { + return $this->distributor; + } + + /** + * Get the APS Core functions. + * + * @return \phpbbstudio\aps\core\functions + * @access public + */ + public function get_functions() + { + return $this->functions; + } + + /** + * Get the APS Valuator. + * + * @return \phpbbstudio\aps\points\valuator + * @access public + */ + public function get_valuator() + { + return $this->valuator; + } + + /** + * Get the localised points name. + * + * @return string The localised points name + * @access public + */ + public function get_name() + { + return $this->functions->get_name(); + } + + /** + * Clean an array from a listener, turns an object into an array. + * + * @param mixed $event The event to clean + * @return array The event data + * @access public + */ + public function clean_event($event) + { + if ($event instanceof \phpbb\event\data) + { + return (array) $event->get_data(); + } + else + { + return (array) $event; + } + } + + /** + * Get all values for the provided key in an array. + * + * @param array $array The array to retrieve the values from + * @param string $key The keys of which to return the values + * @return array Array of unique integers + * @access public + */ + public function get_identifiers(array $array, $key) + { + return (array) array_map('intval', array_unique(array_filter(array_column($array, $key)))); + } + + /** + * Trigger a point action and calculate users' points. + * + * This is the "main" function for this extension. + * + * $action + * Calling this with an $action will trigger all action type which have their get_action() set to $action. + * + * $user_ids + * User identifiers are for the users who can receive points by this action, this user ($this->user) is + * automatically added to the list. If it was already present in the list, it's filtered out. + * + * $event + * An array with data that was available from the event (or any other occurrence) that triggered this action. + * For instance, phpBB's event object that is available in a listener. If indeed phpBB's event object is + * send it is automatically 'cleaned', which means the object is turned into an array. + * + * $forum_ids + * A list of forum identifiers for which the point values should be retrieved, as those values are necessary + * to require the amount of points for the users. If it's left empty it will assume that the triggered action + * is a "global" action, which means the forum_id = 0. + * + * @param string $action The action to trigger + * @param array|int $user_ids The user identifiers that can receive points + * @param array $event The event data + * @param array|int $forum_ids The forum identifiers (array or single value) + * @return void + * @access public + */ + public function trigger($action, $user_ids = [], $event = [], $forum_ids = 0) + { + // 1. Initialise arrays + $this->initialise_arrays(); + + // 2. Get action types + $this->get_types_and_fields($action); + + // 3. Get values + $this->get_values($forum_ids); + + // 4. Set users + $this->set_users($user_ids); + + // 5. Calculate + $this->calculate($this->clean_event($event)); + + // 6. Distribute + $this->distribute(); + } + + /** + * Initialise the array fields used by this points manager. + * + * Has to be declared per each trigger() call, as otherwise types are carried over in chained calls. + * + * @return void + * @access protected + */ + protected function initialise_arrays() + { + // Array of points fields for the triggered action types + $this->fields = [0 => [], 1 => []]; + + // Array of action types that are triggered + $this->types = []; + + // Array of users that can receive points for the triggered action + $this->users = []; + + // Array of point values required for the triggered action types + $this->values = []; + } + + /** + * Get all action types and their fields for the trigger action. + * + * $types + * While the $this->actions array holds ALL the registered action types, + * only a certain few are required. Only the required once are added to $this->types. + * + * $fields + * Each action type has an array of point value keys with a language string as value. + * Those keys are used for storing the points values set by the Administrator in the database. + * Therefore a list is generated with all the fields that need to be retrieved from the database. + * + * @param string $action The action that is triggered + * @return void + * @access protected + */ + protected function get_types_and_fields($action) + { + /** @var \phpbbstudio\aps\actions\type\action $type */ + foreach ($this->actions as $name => $type) + { + // Only add action types that are listed under this $action + if ($type->get_action() === $action) + { + // Add this service to the action types + $this->types[$name] = $type; + + // Get scope: 0 = local | 1 = global + $key = (int) $type->is_global(); + + // Get the type fields indexed by the scope + $this->fields[$key] = array_merge($type->get_fields(), $this->fields[$key]); + } + } + } + + /** + * Get all point values required by the triggered action types from the database. + * + * $values + * Get all point values from the database that are in the $fields array and + * have their forum identifier set to one provided in the $forum_ids array. + * The values array will contain all point values indexed by the forum identifier, + * if the fields are global, the forum identifier is set to 0. + * + * @param array|int $forum_ids The forum identifiers + * @return void + * @access protected + */ + protected function get_values($forum_ids) + { + // Create array filled with integers + $forum_ids = is_array($forum_ids) ? array_map('intval', $forum_ids) : [(int) $forum_ids]; + + // Make sure there are only unique and non-empty forum identifiers + $forum_ids = array_unique($forum_ids); + + $this->values = $this->valuator->get_points($this->fields, $forum_ids); + } + + /** + * Set all users available for receiving points by the triggered action. + * + * $user_ids + * The array of user identifiers provided from the place where the action is triggered. + * This user's ($this->user) identifier is automatically added. + * + * $users + * The array of users that are able to receive points, with a base array to make sure all keys are set, + * aswell as all the users' current points. + * + * @param array|int $user_ids The user identifiers + * @return void + * @access protected + */ + protected function set_users($user_ids) + { + // Create array filled with integers + $user_ids = is_array($user_ids) ? array_map('intval', $user_ids) : [(int) $user_ids]; + + // Make sure to include this user ($this->user) + $user_ids[] = (int) $this->user->data['user_id']; + + // Make sure only unique users are set + $user_ids = array_unique(array_filter($user_ids)); + + // If there is only one user, that will be this user, so no need to query + if (count($user_ids) === 1) + { + // Build the base user array for this user + $this->users[(int) $this->user->data['user_id']] = $this->user_array($this->user->data['user_points']); + } + else + { + // Grab all the current point values for these users + $user_points = $this->valuator->users($user_ids); + + foreach ($user_ids as $user_id) + { + if (isset($user_points[$user_id])) + { + // Build the base user arrays + $this->users[$user_id] = $this->user_array($user_points[$user_id]); + } + } + } + + // Lets make sure the anonymous user is never used + unset($this->users[ANONYMOUS]); + } + + /** + * Let all the required action types calculate their user points. + * + * @param array $data Array of event data + * @return void + * @access protected + */ + protected function calculate(array $data) + { + /** @var \phpbbstudio\aps\actions\type\action $type */ + foreach ($this->types as $type) + { + // Make the functions object available + $type->set_functions($this->functions); + + // Set the users + $type->set_users($this->users); + + // Check if APS is in Safe Mode + if ($this->functions->safe_mode()) + { + // If so, catch any exceptions and log them + try + { + $type->calculate($data, $this->values); + } + catch (\Exception $e) + { + // Catch any error in the action type and log it! + $this->log->add('critical', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_CALCULATION_ERROR', time(), [$e->getMessage(), $e->getFile(), $e->getLine(), $this->functions->get_name()]); + } + } + else + { + // If not, calculate and let the exceptions do their thing. + $type->calculate($data, $this->values); + } + + // Iterate over all the users + foreach (array_keys($this->users) as $user_id) + { + // Get all received points for this user from this action type + $this->users[$user_id]['actions'][] = $type->get_points($user_id); + + // Check for logs that need approving + if ($approve = $type->get_approve($user_id)) + { + $this->users[$user_id]['approve'] = array_merge($this->users[$user_id]['approve'], $approve); + } + + // Check for logs that need disapproving + if ($disapprove = $type->get_disapprove($user_id)) + { + $this->users[$user_id]['disapprove'] = array_merge($this->users[$user_id]['disapprove'], $disapprove); + } + } + } + } + + /** + * Distribute the points gained for all the users + * + * @return void + * @access protected + */ + protected function distribute() + { + // Iterate over all the users + foreach ($this->users as $user_id => $user_row) + { + // Iterate over all the action types + foreach ($user_row['actions'] as $actions) + { + // Iterate over the arrays added per action type + foreach ($actions as $action) + { + if ($action['approved']) + { + // Calculate the total points gained for this user + $this->functions->equate_reference($this->users[$user_id]['total'], $action['points']); + } + + // Grab the post identifier, as we group the logs per post id + $post_id = (int) $action['post_id']; + + // Set the logs for this user + $this->set_logs($user_id, $post_id, $action); + } + } + + // And send it off: update user points and add log entries + $this->distributor->distribute( + $user_id, + $this->users[$user_id]['total'], + $this->users[$user_id]['logs'], + $this->users[$user_id]['current'] + ); + + // Approve logs + if ($user_row['approve']) + { + $user_points = $this->functions->equate_points($this->users[$user_id]['total'], $this->users[$user_id]['current']); + + $this->distributor->approve($user_id, array_unique(array_filter($user_row['approve'])), $user_points); + } + + // Disapprove logs + if ($user_row['disapprove']) + { + $this->distributor->disapprove($user_id, array_unique(array_filter($user_row['disapprove']))); + } + } + } + + /** + * Set the log entries for this user and index per post identifier. + * + * @param int $user_id The user identifier + * @param int $post_id The post identifier + * @param array $row The log array + * @return void + * @access protected + */ + protected function set_logs($user_id, $post_id, array $row) + { + // Get the logs in a local variable for easier coding + $logs = $this->users[$user_id]['logs']; + + // Filter out the empty values except the first key + if (empty($logs[$post_id])) + { + $first = array_splice($row['logs'], 0, 1); + $row['logs'] = array_filter($row['logs']); + $row['logs'] = $first + $row['logs']; + } + else + { + $row['logs'] = array_filter($row['logs']); + } + + // If there are no logs entries yet under this post identifier + if (empty($logs[$post_id])) + { + $logs[$post_id] = [ + 'action' => (string) $this->main_log($row['logs']), + 'actions' => (array) $row['logs'], + 'approved' => (bool) $row['approved'], + 'forum_id' => (int) $row['forum_id'], + 'topic_id' => (int) $row['topic_id'], + 'post_id' => (int) $row['post_id'], + 'user_id' => (int) $user_id, + 'reportee_id' => (int) $this->user->data['user_id'], + 'reportee_ip' => (string) $this->user->ip, + 'points_old' => (double) $this->users[$user_id]['current'], + 'points_sum' => (double) $row['points'], + 'points_new' => (double) $this->functions->equate_points($this->users[$user_id]['current'], $row['points']), + ]; + } + else + { + // Else there already exists log entries under this post identifier, so merge this one in + $this->merge_logs($logs[$post_id]['actions'], $row['logs']); + + // Equate (by reference) the points gained ('sum') and the new total ('new'). + $this->functions->equate_reference($logs[$post_id]['points_sum'], $row['points']); + $this->functions->equate_reference($logs[$post_id]['points_new'], $row['points']); + } + + // Set the logs in the global variable again + $this->users[$user_id]['logs'] = $logs; + } + + /** + * Get the "main" log entry, the first key of the array. + * + * @param array $logs The logs array + * @return string The main log entry string + * @access protected + */ + protected function main_log(array $logs) + { + reset($logs); + $action = key($logs); + + return $action; + } + + /** + * Merge a log entry into existing log entries. + * + * Log entries are language strings (key) with point values (value). + * array('APS_SOME_ACTION' => 5.00) + * + * If logs are merged, an array is created which has to be equated. + * array('APS_SOME_ACTION' => array(5.00, 2.00) + * + * @param array $logs The existing log entries + * @param array $array The log entry to merge in + * @return void Passed by reference + * @access protected + */ + protected function merge_logs(array &$logs, array $array) + { + // Merge the array in to the existing entries + $logs = array_merge_recursive($logs, $array); + + // Iterate over the logged actions + foreach ($logs as $key => $value) + { + // If the logged action is no longer a single points value, equate it. + if (is_array($value)) + { + $logs[$key] = $this->functions->equate_array($value); + } + } + } + + /** + * Set up a base array for this user. + * + * 'current + * The user's current points + * + * 'actions' + * Array that will be filled with arrays added by all the action types. + * + * 'points' + * Array that will be filled with points added by all the action types. + * + * 'approve' + * Array that will be filled with post identifiers that need to be approved from the logs table. + * + * 'disapprove' + * Array that will be filled with post identifiers that need to be disapproved from the logs table. + * + * 'logs' + * Array of log entries that are going to be added for this user. + * + * 'total' + * The total points gained for this user, summing up all points per action type. + * + * @param double $points The user's current points + * @return array The user's base array + * @access protected + */ + protected function user_array($points) + { + return [ + 'current' => (double) $points, + 'actions' => [], + 'points' => [], + 'approve' => [], + 'disapprove' => [], + 'logs' => [], + 'total' => 0.00, + ]; + } +} diff --git a/ext/phpbbstudio/aps/actions/type/action.php b/ext/phpbbstudio/aps/actions/type/action.php new file mode 100644 index 0000000..5cde001 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/action.php @@ -0,0 +1,116 @@ +get_data()); + } + + /** + * {@inheritdoc} + */ + public function set_functions($functions) + { + $this->functions = $functions; + } + + /** + * {@inheritdoc} + */ + public function set_users($users) + { + $this->users = $users; + } + + /** + * {@inheritdoc} + */ + public function get_points($user_id) + { + return $this->users[(int) $user_id]['points']; + } + + /** + * {@inheritdoc} + */ + public function get_approve($user_id) + { + return $this->users[(int) $user_id]['approve']; + } + + /** + * {@inheritdoc} + */ + public function get_disapprove($user_id) + { + return $this->users[(int) $user_id]['disapprove']; + } + + /** + * Adds a points array from calculation to the provided user id. + * + * @param int $user_id The user identifier + * @param array $points_array The points array to add + * @return void + * @access protected + */ + protected function add($user_id, array $points_array) + { + // Make sure everything is set + $array = array_merge([ + 'approved' => true, + 'forum_id' => 0, + 'topic_id' => 0, + 'post_id' => 0, + 'points' => 0.00, + 'logs' => [], + ], $points_array); + + $this->users[(int) $user_id]['points'][] = $array; + } + + /** + * Adds a post id to the array of logs to approve. + * + * @param int $user_id The user identifier + * @param int $post_id The post identifier + * @return void + * @access protected + */ + protected function approve($user_id, $post_id) + { + $this->users[(int) $user_id]['approve'][] = (int) $post_id; + } + + /** + * Adds a post id to the array of logs to disapprove. + * + * @param int $user_id The user identifier + * @param int $post_id The post identifier + * @return void + * @access protected + */ + protected function disapprove($user_id, $post_id) + { + $this->users[(int) $user_id]['disapprove'][] = (int) $post_id; + } + + /** + * Equate two numbers. + * + * @param double $a The first number + * @param double $b The second number + * @param string $operator The equation operator + * @return double The result of the equation + * @access protected + */ + protected function equate($a, $b, $operator = '+') + { + return $this->functions->equate_points($a, $b, $operator); + } +} diff --git a/ext/phpbbstudio/aps/actions/type/birthday.php b/ext/phpbbstudio/aps/actions/type/birthday.php new file mode 100644 index 0000000..927d184 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/birthday.php @@ -0,0 +1,109 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'birthday'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return true; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'ACP_APS_POINTS_MISC'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_birthday' => 'APS_POINTS_BIRTHDAY', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $value = $values[0]; + $logs = $this->get_data(); + + $date = $data['day'] . '-' . $data['month']; + + foreach (array_keys($this->users) as $user_id) + { + // This user is automatically added by the manager, so make sure it's actually their birthday + if ($user_id == $this->user->data['user_id'] && substr($this->user->data['user_birthday'], 0, 5) !== $date) + { + continue; + } + + $points = [ + 'points' => (double) $value['aps_birthday'], + 'logs' => [$logs['aps_birthday'] => $value['aps_birthday']], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/change.php b/ext/phpbbstudio/aps/actions/type/change.php new file mode 100644 index 0000000..98733dd --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/change.php @@ -0,0 +1,101 @@ + 'APS_POINTS_MOD_CHANGE', + 'aps_user_change_from' => 'APS_POINTS_USER_CHANGE_FROM', + 'aps_user_change_to' => 'APS_POINTS_USER_CHANGE_TO', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab the data we need from the event + $forum_id = (int) $data['post_info']['forum_id']; + $topic_id = (int) $data['post_info']['topic_id']; + $post_id = (int) $data['post_info']['post_id']; + $from_id = (int) $data['post_info']['poster_id']; + $to_id = (int) $data['userdata']['user_id']; + + // Get some base variables + $value = $values[$forum_id]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + $action = in_array($user_id, [$from_id, $to_id]) ? ($user_id == $from_id ? 'aps_user_change_from' : 'aps_user_change_to') : 'aps_mod_change'; + + $points = [ + 'points' => (double) $value[$action], + 'forum_id' => (int) $forum_id, + 'topic_id' => (int) $topic_id, + 'post_id' => (int) $post_id, + 'logs' => [$logs[$action] => $value[$action]], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/copy.php b/ext/phpbbstudio/aps/actions/type/copy.php new file mode 100644 index 0000000..837f9d9 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/copy.php @@ -0,0 +1,95 @@ + 'APS_POINTS_MOD_COPY', + 'aps_user_copy' => 'APS_POINTS_USER_COPY', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab the data we need from the event + $forum_id = (int) $data['topic_row']['forum_id']; + $poster_id = (int) $data['topic_row']['topic_poster']; + + // Get some base variables + $value = $values[$forum_id]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + $action = ($user_id == $poster_id) ? 'aps_user_copy' : 'aps_mod_copy'; + + $points = [ + 'points' => (double) $value[$action], + 'forum_id' => (int) $forum_id, + 'logs' => [$logs[$action] => $value[$action]], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/delete.php b/ext/phpbbstudio/aps/actions/type/delete.php new file mode 100644 index 0000000..0a67378 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/delete.php @@ -0,0 +1,131 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'delete'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'MODERATE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_delete_topic' => 'APS_POINTS_MOD_DELETE_TOPIC', + 'aps_user_delete_topic' => 'APS_POINTS_USER_DELETE_TOPIC', + 'aps_mod_delete_soft_topic' => 'APS_POINTS_MOD_DELETE_SOFT_TOPIC', + 'aps_user_delete_soft_topic' => 'APS_POINTS_USER_DELETE_SOFT_TOPIC', + 'aps_mod_delete_post' => 'APS_POINTS_MOD_DELETE_POST', + 'aps_user_delete_post' => 'APS_POINTS_USER_DELETE_POST', + 'aps_mod_delete_soft_post' => 'APS_POINTS_MOD_DELETE_SOFT_POST', + 'aps_user_delete_soft_post' => 'APS_POINTS_USER_DELETE_SOFT_POST', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $action = $data['action']; + $posts = $action === 'topic' ? $data['topics'] : $data['posts']; + $is_soft = isset($data['is_soft']) ? $data['is_soft'] : false; + + $key_user = 'aps_user_delete_' . ($is_soft ? 'soft_' : '') . $action; + $key_mod = 'aps_mod_delete_' . ($is_soft ? 'soft_' : '') . $action; + $strings = $this->get_data(); + + foreach ($posts as $post_data) + { + $forum_id = $post_data['forum_id']; + $topic_id = $post_data['topic_id']; + $post_id = $action === 'topic' ? $post_data['topic_first_post_id'] : $post_data['post_id']; + $user_id = $action === 'topic' ? $post_data['topic_poster'] : $post_data['poster_id']; + + $this->add($user_id, [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_user], + 'logs' => [ + $strings[$key_user] => $values[$forum_id][$key_user], + ], + ]); + + $this->add($this->user->data['user_id'], [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_mod], + 'logs' => [ + $strings[$key_mod] => $values[$forum_id][$key_mod], + ], + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/edit.php b/ext/phpbbstudio/aps/actions/type/edit.php new file mode 100644 index 0000000..512aefc --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/edit.php @@ -0,0 +1,95 @@ + 'APS_POINTS_MOD_EDIT', + 'aps_user_edit' => 'APS_POINTS_USER_EDIT', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab the data we need from the event + $forum_id = (int) $data['data']['forum_id']; + $poster_id = (int) $data['data']['poster_id']; + + // Get some base variables + $value = $values[$forum_id]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + $action = ($user_id == $poster_id) ? 'aps_user_edit' : 'aps_mod_edit'; + + $points = [ + 'points' => (double) $value[$action], + 'forum_id' => (int) $forum_id, + 'logs' => [$logs[$action] => $value[$action]], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/lock.php b/ext/phpbbstudio/aps/actions/type/lock.php new file mode 100644 index 0000000..ec921f8 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/lock.php @@ -0,0 +1,131 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'lock'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'MODERATE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_lock' => 'APS_POINTS_MOD_LOCK', + 'aps_user_lock' => 'APS_POINTS_USER_LOCK', + 'aps_mod_lock_post' => 'APS_POINTS_MOD_LOCK_POST', + 'aps_user_lock_post' => 'APS_POINTS_USER_LOCK_POST', + 'aps_mod_unlock' => 'APS_POINTS_MOD_UNLOCK', + 'aps_user_unlock' => 'APS_POINTS_USER_UNLOCK', + 'aps_mod_unlock_post' => 'APS_POINTS_MOD_UNLOCK_POST', + 'aps_user_unlock_post' => 'APS_POINTS_USER_UNLOCK_POST', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $action = $data['action']; + $posts = $data['data']; + $s_topic = in_array($action, ['lock', 'unlock']); + + $key_user = 'aps_user_' . $action; + $key_mod = 'aps_mod_' . $action; + $strings = $this->get_data(); + + foreach ($posts as $post_data) + { + $forum_id = $post_data['forum_id']; + $topic_id = $post_data['topic_id']; + $post_id = $s_topic ? $post_data['topic_first_post_id'] : $post_data['post_id']; + $user_id = $s_topic ? $post_data['topic_poster'] : $post_data['poster_id']; + + $this->add($user_id, [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_user], + 'logs' => [ + $strings[$key_user] => $values[$forum_id][$key_user], + ], + ]); + + $this->add($this->user->data['user_id'], [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_mod], + 'logs' => [ + $strings[$key_mod] => $values[$forum_id][$key_mod], + ], + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/merge.php b/ext/phpbbstudio/aps/actions/type/merge.php new file mode 100644 index 0000000..2e77b0c --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/merge.php @@ -0,0 +1,113 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'merge'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'MODERATE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_merge' => 'APS_POINTS_MOD_MERGE', + 'aps_user_merge' => 'APS_POINTS_USER_MERGE', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $topics = $data['all_topic_data']; + $topic_id = $data['to_topic_id']; + $forum_id = $topics[$topic_id]['forum_id']; + + $values = $values[$forum_id]; + $strings = $this->get_data(); + + foreach ($topics as $topic) + { + $this->add($topic['topic_poster'], [ + 'forum_id' => (int) $forum_id, + 'topic_id' => (int) $topic_id, + 'points' => $values['aps_user_merge'], + 'logs' => [$strings['aps_user_merge'] => $values['aps_user_merge']], + ]); + + $this->add($this->user->data['user_id'], [ + 'forum_id' => (int) $forum_id, + 'topic_id' => (int) $topic_id, + 'points' => $values['aps_mod_merge'], + 'logs' => [$strings['aps_mod_merge'] => $values['aps_mod_merge']], + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/move.php b/ext/phpbbstudio/aps/actions/type/move.php new file mode 100644 index 0000000..09a3248 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/move.php @@ -0,0 +1,127 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'move'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'MODERATE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_move_post' => 'APS_POINTS_MOD_MOVE_POST', + 'aps_user_move_post' => 'APS_POINTS_USER_MOVE_POST', + 'aps_mod_move_topic' => 'APS_POINTS_MOD_MOVE_TOPIC', + 'aps_user_move_topic' => 'APS_POINTS_USER_MOVE_TOPIC', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $action = $data['action']; + $s_topic = $action === 'topic'; + $posts = $s_topic ? $data['topics'] : $data['posts']; + + $key_user = 'aps_user_move_' . $action; + $key_mod = 'aps_mod_move_' . $action; + $strings = $this->get_data(); + + foreach ($posts as $post) + { + $forum_id = $post['forum_id']; + $topic_id = $post['topic_id']; + $post_id = $s_topic ? $post['topic_first_post_id'] : $post['post_id']; + $user_id = $s_topic ? $post['topic_poster'] : $post['poster_id']; + + $this->add($user_id, [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_user], + 'logs' => [ + $strings[$key_user] => $values[$forum_id][$key_user], + ], + ]); + + $this->add($this->user->data['user_id'], [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_mod], + 'logs' => [ + $strings[$key_mod] => $values[$forum_id][$key_mod], + ], + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/pm.php b/ext/phpbbstudio/aps/actions/type/pm.php new file mode 100644 index 0000000..ef4b9fc --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/pm.php @@ -0,0 +1,202 @@ +config = $config; + $this->utils = $utils; + $this->ignore = $constants['ignore']; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'pm'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return true; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'PRIVATE_MESSAGE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + // Initial points + 'aps_pm_base' => 'APS_POINTS_PM', + + // Recipients points + 'aps_pm_per_recipient' => 'APS_POINTS_PM_PER_RECIPIENT', + + // Text points + 'aps_pm_per_char' => 'APS_POINTS_PER_CHAR', + 'aps_pm_per_word' => 'APS_POINTS_PER_WORD', + 'aps_pm_per_quote' => 'APS_POINTS_PER_QUOTE', + + // Attachment points + 'aps_pm_has_attach' => 'APS_POINTS_ATTACH_HAS', + 'aps_pm_per_attach' => 'APS_POINTS_ATTACH_PER', + + // Modification points + 'aps_pm_edit' => 'APS_POINTS_EDIT', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab event data + $mode = $data['mode']; + $message = $data['data']['message']; + $attachments = !empty($data['data']['attachment_data']) ? $data['data']['attachment_data'] : []; + $recipients = $data['pm_data']['recipients']; + + $logs = []; + $values = $values[0]; + $strings = $this->get_data(); + + switch ($mode) + { + case 'edit': + $points = $logs[$strings['aps_pm_' . $mode]] = $values['aps_pm_' . $mode]; + break; + + default: + // Initial points + $points = $logs[$strings['aps_pm_base']] = $values['aps_pm_base']; + + // Recipient points + $points += $logs[$strings['aps_pm_per_recipient']] = $this->equate($values['aps_pm_per_recipient'], count($recipients), '*'); + + // Text points + $quotes = $this->utils->get_outermost_quote_authors($message); + $message = $this->utils->remove_bbcode($message, 'quote'); + $message = $this->utils->remove_bbcode($message, 'attachment'); + $message = $this->utils->clean_formatting($message); + $words = $exclude_words = array_filter(preg_split('/[\s]+/', $message)); + $chars = $exclude_chars = implode('', $words); + + if ($min = $this->config['aps_points_exclude_words']) + { + $exclude_words = array_filter($words, function($word) use ($min) + { + return strlen($word) > $min; + }); + + if ($this->config['aps_points_exclude_chars']) + { + $exclude_chars = implode('', $exclude_words); + } + } + + // Check ignore criteria + if ($this->config['aps_ignore_criteria']) + { + $ignore_words = $this->config['aps_ignore_excluded_words'] ? $exclude_words : $words; + $ignore_chars = $this->config['aps_ignore_excluded_chars'] ? $exclude_chars : $chars; + + $ignore_words = count($ignore_words) < $this->config['aps_ignore_min_words']; + $ignore_chars = strlen($ignore_chars) < $this->config['aps_ignore_min_chars']; + + if (($this->config['aps_ignore_criteria'] == $this->ignore['both'] && $ignore_words && $ignore_chars) + || ($this->config['aps_ignore_criteria'] == $this->ignore['words'] && $ignore_words) + || ($this->config['aps_ignore_criteria'] == $this->ignore['chars'] && $ignore_chars)) + { + $points = 0; + + // Break out of calculation + break; + } + } + + $words = $exclude_words; + $chars = $exclude_chars; + + $points += $logs[$strings['aps_pm_per_quote']] = $this->equate($values['aps_pm_per_quote'], count($quotes), '*'); + $points += $logs[$strings['aps_pm_per_word']] = $this->equate($values['aps_pm_per_word'], count($words), '*'); + $points += $logs[$strings['aps_pm_per_char']] = $this->equate($values['aps_pm_per_char'], strlen($chars), '*'); + + // Attachment points + if (!empty($attachments)) + { + $points += $logs[$strings['aps_pm_has_attach']] = $values['aps_pm_has_attach']; + $points += $logs[$strings['aps_pm_per_attach']] = $this->equate($values['aps_pm_per_attach'], count($attachments), '*'); + } + break; + } + + foreach (array_keys($this->users) as $user_id) + { + $this->add($user_id, [ + 'points' => $points, + 'logs' => $logs, + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/post.php b/ext/phpbbstudio/aps/actions/type/post.php new file mode 100644 index 0000000..569bedc --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/post.php @@ -0,0 +1,211 @@ +config = $config; + $this->utils = $utils; + $this->ignore = $constants['ignore']; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'post'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'POST'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + // Initial points + 'aps_post_base' => 'APS_POINTS_POST', + + // Text points + 'aps_post_per_char' => 'APS_POINTS_PER_CHAR', + 'aps_post_per_word' => 'APS_POINTS_PER_WORD', + 'aps_post_per_quote' => 'APS_POINTS_PER_QUOTE', + + // Attachment points + 'aps_post_has_attach' => 'APS_POINTS_ATTACH_HAS', + 'aps_post_per_attach' => 'APS_POINTS_ATTACH_PER', + + // Modification points + 'aps_post_edit' => 'APS_POINTS_EDIT', + 'aps_post_delete' => 'APS_POINTS_DELETE', + 'aps_post_delete_soft' => 'APS_POINTS_DELETE_SOFT', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab event data + $mode = $data['mode']; + $s_delete = in_array($mode, ['delete', 'soft_delete']); + $forum_id = $s_delete ? $data['forum_id'] : $data['data']['forum_id']; + $topic_id = $s_delete ? $data['topic_id'] : $data['data']['topic_id']; + $post_id = $s_delete ? $data['post_id'] : $data['data']['post_id']; + $message = $s_delete ? '' : $data['data']['message']; + $s_approved = !$s_delete ? $data['post_visibility'] == ITEM_APPROVED : true; + $attachments = $s_delete ? [] : $data['data']['attachment_data']; + + $logs = []; + $values = $values[$forum_id]; + $strings = $this->get_data(); + + switch ($mode) + { + /** @noinspection PhpMissingBreakStatementInspection */ + case 'soft_delete': + $mode = 'delete_soft'; + // no break; + case 'edit': + case 'delete': + $points = $logs[$strings['aps_post_' . $mode]] = $values['aps_post_' . $mode]; + break; + + default: + // Initial points + $points = $logs[$strings['aps_post_base']] = $values['aps_post_base']; + + // Text points + $quotes = $this->utils->get_outermost_quote_authors($message); + $message = $this->utils->remove_bbcode($message, 'quote'); + $message = $this->utils->remove_bbcode($message, 'attachment'); + $message = $this->utils->clean_formatting($message); + $words = $exclude_words = array_filter(preg_split('/[\s]+/', $message)); + $chars = $exclude_chars = implode('', $words); + + if ($min = $this->config['aps_points_exclude_words']) + { + $exclude_words = array_filter($words, function($word) use ($min) + { + return strlen($word) > $min; + }); + + if ($this->config['aps_points_exclude_chars']) + { + $exclude_chars = implode('', $exclude_words); + } + } + + // Check ignore criteria + if ($this->config['aps_ignore_criteria']) + { + $ignore_words = $this->config['aps_ignore_excluded_words'] ? $exclude_words : $words; + $ignore_chars = $this->config['aps_ignore_excluded_chars'] ? $exclude_chars : $chars; + + $ignore_words = count($ignore_words) < $this->config['aps_ignore_min_words']; + $ignore_chars = strlen($ignore_chars) < $this->config['aps_ignore_min_chars']; + + if (($this->config['aps_ignore_criteria'] == $this->ignore['both'] && $ignore_words && $ignore_chars) + || ($this->config['aps_ignore_criteria'] == $this->ignore['words'] && $ignore_words) + || ($this->config['aps_ignore_criteria'] == $this->ignore['chars'] && $ignore_chars)) + { + $points = 0; + + // Break out of calculation + break; + } + } + + $words = $exclude_words; + $chars = $exclude_chars; + + $points += $logs[$strings['aps_post_per_quote']] = $this->equate($values['aps_post_per_quote'], count($quotes), '*'); + $points += $logs[$strings['aps_post_per_word']] = $this->equate($values['aps_post_per_word'], count($words), '*'); + $points += $logs[$strings['aps_post_per_char']] = $this->equate($values['aps_post_per_char'], strlen($chars), '*'); + + // Attachment points + if (!empty($attachments)) + { + $points += $logs[$strings['aps_post_has_attach']] = $values['aps_post_has_attach']; + $points += $logs[$strings['aps_post_per_attach']] = $this->equate($values['aps_post_per_attach'], count($attachments), '*'); + } + break; + } + + foreach (array_keys($this->users) as $user_id) + { + $this->add($user_id, [ + 'approved' => $s_approved, + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $points, + 'logs' => $logs, + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/queue.php b/ext/phpbbstudio/aps/actions/type/queue.php new file mode 100644 index 0000000..71c6b54 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/queue.php @@ -0,0 +1,140 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'queue'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'MODERATE'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_restore' => 'APS_POINTS_MOD_RESTORE', + 'aps_mod_approve' => 'APS_POINTS_MOD_APPROVE', + 'aps_mod_disapprove' => 'APS_POINTS_MOD_DISAPPROVE', + 'aps_user_restore' => 'APS_POINTS_USER_RESTORE', + 'aps_user_approve' => 'APS_POINTS_USER_APPROVE', + 'aps_user_disapprove' => 'APS_POINTS_USER_DISAPPROVE', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $action = $data['mode']; + $s_post = isset($data['post_info']); + $posts = $s_post ? $data['post_info'] : $data['topic_info']; + + $key_user = 'aps_user_' . $action; + $key_mod = 'aps_mod_' . $action; + $strings = $this->get_data(); + + foreach ($posts as $post_id => $post_data) + { + $user_id = $s_post ? $post_data['poster_id'] : $post_data['topic_poster']; + $topic_id = $post_data['topic_id']; + $forum_id = $post_data['forum_id']; + + $logs = []; + + $points = $logs[$strings[$key_user]] = $values[$forum_id][$key_user]; + + switch ($action) + { + case 'approve': + $this->approve($user_id, $post_id); + break; + case 'disapprove': + $this->disapprove($user_id, $post_id); + break; + } + + $this->add($user_id, [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $points, + 'logs' => $logs, + ]); + + $this->add($this->user->data['user_id'], [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $values[$forum_id][$key_mod], + 'logs' => [ + $strings[$key_mod] => $values[$forum_id][$key_mod], + ], + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/register.php b/ext/phpbbstudio/aps/actions/type/register.php new file mode 100644 index 0000000..cecbf03 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/register.php @@ -0,0 +1,91 @@ + 'APS_POINTS_REGISTER', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $value = $values[0]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + if ($user_id == ANONYMOUS) + { + continue; + } + + $points = [ + 'points' => (double) $value['aps_register'], + 'logs' => [$logs['aps_register'] => $value['aps_register']], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/topic.php b/ext/phpbbstudio/aps/actions/type/topic.php new file mode 100644 index 0000000..a924f76 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/topic.php @@ -0,0 +1,243 @@ +config = $config; + $this->utils = $utils; + $this->ignore = $constants['ignore']; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'topic'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return false; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'TOPIC'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + // Type points + 'aps_topic_base' => 'APS_POINTS_TOPIC', + 'aps_topic_sticky' => 'APS_POINTS_STICKY', + 'aps_topic_announce' => 'APS_POINTS_ANNOUNCE', + 'aps_topic_global' => 'APS_POINTS_GLOBAL', + + // Text points + 'aps_topic_per_char' => 'APS_POINTS_PER_CHAR', + 'aps_topic_per_word' => 'APS_POINTS_PER_WORD', + 'aps_topic_per_quote' => 'APS_POINTS_PER_QUOTE', + + // Attachment points + 'aps_topic_has_attach' => 'APS_POINTS_ATTACH_HAS', + 'aps_topic_per_attach' => 'APS_POINTS_ATTACH_PER', + + // Poll points + 'aps_topic_has_poll' => 'APS_POINTS_POLL_HAS', + 'aps_topic_per_option' => 'APS_POINTS_POLL_OPTION', + + // Miscellaneous + 'aps_topic_bump' => 'APS_POINTS_BUMP', + 'aps_topic_edit' => 'APS_POINTS_EDIT', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $mode = $data['mode']; + $s_bump = $mode === 'bump'; + + $type = !$s_bump ? $data['topic_type'] : ''; + $post_data = !$s_bump ? $data['data'] : $data['post_data']; + + $s_approved = isset($data['post_visibility']) ? $data['post_visibility'] == ITEM_APPROVED : true; + $poll = isset($data['poll']['poll_options']) ? $data['poll']['poll_options'] : []; + + $forum_id = $post_data['forum_id']; + $topic_id = $post_data['topic_id']; + $post_id = !$s_bump ? $post_data['post_id'] : 0; + $message = !$s_bump ? $post_data['message'] : ''; + $attachments = !$s_bump ? $post_data['attachment_data'] : []; + + $logs = []; + $values = $values[$forum_id]; + $strings = $this->get_data(); + + switch ($mode) + { + case 'bump': + case 'edit': + $points = $logs[$strings['aps_topic_' . $mode]] = $values['aps_topic_' . $mode]; + break; + + default: + // Initial type points + switch ($type) + { + default: + case POST_NORMAL: + $points = $logs[$strings['aps_topic_base']] = $values['aps_topic_base']; + break; + + case POST_STICKY: + $points = $logs[$strings['aps_topic_sticky']] = $values['aps_topic_sticky']; + break; + + case POST_ANNOUNCE: + $points = $logs[$strings['aps_topic_announce']] = $values['aps_topic_announce']; + break; + + case POST_GLOBAL: + $points = $logs[$strings['aps_topic_global']] = $values['aps_topic_global']; + break; + } + + // Text points + $quotes = $this->utils->get_outermost_quote_authors($message); + $message = $this->utils->remove_bbcode($message, 'quote'); + $message = $this->utils->remove_bbcode($message, 'attachment'); + $message = $this->utils->clean_formatting($message); + $words = $exclude_words = array_filter(preg_split('/[\s]+/', $message)); + $chars = $exclude_chars = implode('', $words); + + if ($min = $this->config['aps_points_exclude_words']) + { + $exclude_words = array_filter($words, function($word) use ($min) + { + return strlen($word) > $min; + }); + + if ($this->config['aps_points_exclude_chars']) + { + $exclude_chars = implode('', $exclude_words); + } + } + + // Check ignore criteria + if ($this->config['aps_ignore_criteria']) + { + $ignore_words = $this->config['aps_ignore_excluded_words'] ? $exclude_words : $words; + $ignore_chars = $this->config['aps_ignore_excluded_chars'] ? $exclude_chars : $chars; + + $ignore_words = count($ignore_words) < $this->config['aps_ignore_min_words']; + $ignore_chars = strlen($ignore_chars) < $this->config['aps_ignore_min_chars']; + + if (($this->config['aps_ignore_criteria'] == $this->ignore['both'] && $ignore_words && $ignore_chars) + || ($this->config['aps_ignore_criteria'] == $this->ignore['words'] && $ignore_words) + || ($this->config['aps_ignore_criteria'] == $this->ignore['chars'] && $ignore_chars)) + { + $points = 0; + + // Break out of calculation + break; + } + } + + $words = $exclude_words; + $chars = $exclude_chars; + + $points += $logs[$strings['aps_topic_per_quote']] = $this->equate($values['aps_topic_per_quote'], count($quotes), '*'); + $points += $logs[$strings['aps_topic_per_word']] = $this->equate($values['aps_topic_per_word'], count($words), '*'); + $points += $logs[$strings['aps_topic_per_char']] = $this->equate($values['aps_topic_per_char'], strlen($chars), '*'); + + // Attachment points + if (!empty($attachments)) + { + $points += $logs[$strings['aps_topic_has_attach']] = $values['aps_topic_has_attach']; + $points += $logs[$strings['aps_topic_per_attach']] = $this->equate($values['aps_topic_per_attach'], count($attachments), '*'); + } + + // Poll points + if ($poll) + { + $points += $logs[$strings['aps_topic_has_poll']] = $values['aps_topic_has_poll']; + $points += $logs[$strings['aps_topic_per_option']] = $this->equate($values['aps_topic_per_option'], count($poll), '*'); + } + break; + } + + foreach (array_keys($this->users) as $user_id) + { + $this->add($user_id, [ + 'approved' => $s_approved, + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => $post_id, + 'points' => $points, + 'logs' => $logs, + ]); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/topic_type.php b/ext/phpbbstudio/aps/actions/type/topic_type.php new file mode 100644 index 0000000..9eda801 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/topic_type.php @@ -0,0 +1,132 @@ + 'APS_POINTS_MOD_NORMAL_STICKY', + 'aps_mod_normal_announce' => 'APS_POINTS_MOD_NORMAL_ANNOUNCE', + 'aps_mod_normal_global' => 'APS_POINTS_MOD_NORMAL_GLOBAL', + 'aps_mod_sticky_normal' => 'APS_POINTS_MOD_STICKY_NORMAL', + 'aps_mod_sticky_announce' => 'APS_POINTS_MOD_STICKY_ANNOUNCE', + 'aps_mod_sticky_global' => 'APS_POINTS_MOD_STICKY_GLOBAL', + 'aps_mod_announce_normal' => 'APS_POINTS_MOD_ANNOUNCE_NORMAL', + 'aps_mod_announce_sticky' => 'APS_POINTS_MOD_ANNOUNCE_STICKY', + 'aps_mod_announce_global' => 'APS_POINTS_MOD_ANNOUNCE_GLOBAL', + 'aps_mod_global_normal' => 'APS_POINTS_MOD_GLOBAL_NORMAL', + 'aps_mod_global_sticky' => 'APS_POINTS_MOD_GLOBAL_STICKY', + 'aps_mod_global_announce' => 'APS_POINTS_MOD_GLOBAL_ANNOUNCE', + + 'aps_user_normal_sticky' => 'APS_POINTS_USER_NORMAL_STICKY', + 'aps_user_normal_announce' => 'APS_POINTS_USER_NORMAL_ANNOUNCE', + 'aps_user_normal_global' => 'APS_POINTS_USER_NORMAL_GLOBAL', + 'aps_user_sticky_normal' => 'APS_POINTS_USER_STICKY_NORMAL', + 'aps_user_sticky_announce' => 'APS_POINTS_USER_STICKY_ANNOUNCE', + 'aps_user_sticky_global' => 'APS_POINTS_USER_STICKY_GLOBAL', + 'aps_user_announce_normal' => 'APS_POINTS_USER_ANNOUNCE_NORMAL', + 'aps_user_announce_sticky' => 'APS_POINTS_USER_ANNOUNCE_STICKY', + 'aps_user_announce_global' => 'APS_POINTS_USER_ANNOUNCE_GLOBAL', + 'aps_user_global_normal' => 'APS_POINTS_USER_GLOBAL_NORMAL', + 'aps_user_global_sticky' => 'APS_POINTS_USER_GLOBAL_STICKY', + 'aps_user_global_announce' => 'APS_POINTS_USER_GLOBAL_ANNOUNCE', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + // Grab the data we need from the event + $forum_id = (int) $data['data']['forum_id']; + $topic_id = (int) $data['data']['topic_id']; + $post_id = (int) $data['data']['post_id']; + $poster_id = (int) $data['post_data']['topic_poster']; + $type_from = (int) $data['type_from']; + $type_to = (int) $data['type_to']; + + $types = [ + POST_NORMAL => 'normal', + POST_STICKY => 'sticky', + POST_ANNOUNCE => 'announce', + POST_GLOBAL => 'global', + ]; + + // Get some base variables + $value = $values[$forum_id]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + $action = ($user_id == $poster_id) ? 'aps_user_' : 'aps_mod_'; + $action .= $types[$type_from] . '_' . $types[$type_to]; + + $points = [ + 'points' => (double) $value[$action], + 'forum_id' => (int) $forum_id, + 'topic_id' => (int) $topic_id, + 'post_id' => (int) $post_id, + 'logs' => [$logs[$action] => $value[$action]], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/vote.php b/ext/phpbbstudio/aps/actions/type/vote.php new file mode 100644 index 0000000..e254bb8 --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/vote.php @@ -0,0 +1,117 @@ + 'APS_POINTS_PER_VOTE', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $votes = $data['vote_counts']; + $options = $data['poll_info']; + $forum_id = $data['forum_id']; + $topic_id = $data['topic_data']['topic_id']; + $value = $values[$forum_id]['aps_vote']; + + $i = 0; + + foreach ($options as $option) + { + $new = $votes[$option['poll_option_id']]; + $old = $option['poll_option_total']; + + if ($new > $old) + { + $i++; + } + else if ($new < $old) + { + $i--; + } + } + + if ($i !== 0) + { + $points = $this->equate($value, $i, '*'); + + foreach ($this->users as $user_id => $user_data) + { + $string = $points > 0 ? 'APS_POINTS_VOTE_ADDED' : 'APS_POINTS_VOTE_REMOVED'; + + $this->add($user_id, [ + 'forum_id' => $forum_id, + 'topic_id' => $topic_id, + 'post_id' => 0, + 'points' => $points, + 'logs' => [ + $string => $points, + 'APS_POINTS_VOTE_AMOUNT' => $i, + ], + ]); + } + } + } +} diff --git a/ext/phpbbstudio/aps/actions/type/warn.php b/ext/phpbbstudio/aps/actions/type/warn.php new file mode 100644 index 0000000..1edb84b --- /dev/null +++ b/ext/phpbbstudio/aps/actions/type/warn.php @@ -0,0 +1,104 @@ +user = $user; + } + + /** + * Get action name. + * + * @return string The name of the action this type belongs to + * @access public + */ + public function get_action() + { + return 'warn'; + } + + /** + * Get global state. + * + * @return bool If this type is global or local (per-forum basis) + * @access public + */ + public function is_global() + { + return true; + } + + /** + * Get type category under which it will be listed in the ACP. + * + * @return string The name of the category this type belongs to + * @access public + */ + public function get_category() + { + return 'ACP_APS_POINTS_MISC'; + } + + /** + * Get type data. + * + * @return array An array of value names and their language string + * @access public + */ + public function get_data() + { + return [ + 'aps_mod_warn' => 'APS_POINTS_MOD_WARN', + 'aps_user_warn' => 'APS_POINTS_USER_WARN', + ]; + } + + /** + * Calculate points for this type. + * + * @param array $data The data available from the $event that triggered this action + * @param array $values The point values available, indexed per forum_id and 0 for global values + * @retrun void + */ + public function calculate($data, $values) + { + $value = $values[0]; + $logs = $this->get_data(); + + foreach (array_keys($this->users) as $user_id) + { + $mode = $user_id == $this->user->data['user_id'] ? 'mod' : 'user'; + + $points = [ + 'points' => (double) $value['aps_' . $mode . '_warn'], + 'logs' => [$logs['aps_' . $mode . '_warn'] => $value['aps_' . $mode . '_warn']], + ]; + + $this->add($user_id, $points); + } + } +} diff --git a/ext/phpbbstudio/aps/adm/style/aps_display.html b/ext/phpbbstudio/aps/adm/style/aps_display.html new file mode 100644 index 0000000..5039c83 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_display.html @@ -0,0 +1,117 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} + +

{{ PAGE_TITLE }}

+

{{ lang('ACP_APS_DISPLAY_EXPLAIN', aps_name()) }}

+ +{% if S_ERROR %} +
+

{{ lang('WARNING') }}

+

{{ ERROR_MSG }}

+
+{% endif %} + +
+ + {% EVENT phpbbstudio_aps_acp_display_before %} + +
+ {{ lang('GENERAL_SETTINGS') }} + + {% EVENT phpbbstudio_aps_acp_display_prepend %} + +
+
+
+ {{ lang('ACP_APS_DISPLAY_TOP_CHANGE_DESC') }} +
+
+ + +
+
+
+
+
+ {{ lang('ACP_APS_DISPLAY_TOP_COUNT_DESC') }} +
+
+
+
+
+
+ {{ lang('ACP_APS_DISPLAY_ADJUSTMENTS_DESC') }} +
+
+
+
+
+
+ {{ lang('ACP_APS_DISPLAY_GRAPH_TIME_DESC') }} +
+
+
+ + {% EVENT phpbbstudio_aps_acp_display_append %} +
+ + {% EVENT phpbbstudio_aps_acp_display_after %} + +
+ {% for page in aps_pages %} +
+
+
{{ page.TITLE }}
+
+ +
+
+ +
+ {% for block in page.blocks %} +
+
{{ block.TITLE }}
+
+ + + +
+
+ {% endfor %} +
+
+ {% endfor %} +
+ +
+ {{ lang('ACP_SUBMIT_CHANGES') }} + +

+   + + {{ S_FORM_TOKEN }} +

+
+
+ +{% INCLUDEJS '@phpbbstudio_aps/js/jquery-ui-sortable.min.js' %} +{% INCLUDEJS '@phpbbstudio_aps/js/aps_display.js' %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/aps/adm/style/aps_locations.html b/ext/phpbbstudio/aps/adm/style/aps_locations.html new file mode 100644 index 0000000..6157150 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_locations.html @@ -0,0 +1,81 @@ +{% macro location(name, status) %} + +{% endmacro %} + +{% from _self import location as location %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_locations.css' %} + +
{{ lang('BACK_TO_PREV') }}
+ +
+
+ +

{{ lang('ACP_APS_LOCATIONS_EXPLAIN') }}

+ + +
+ +
+ {{ lang('ACP_SUBMIT_CHANGES') }} +

+ + + +

+
+ +
+ {{ lang('BACK_TO_PREV') }} +
+
diff --git a/ext/phpbbstudio/aps/adm/style/aps_logs.html b/ext/phpbbstudio/aps/adm/style/aps_logs.html new file mode 100644 index 0000000..cb55f9e --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_logs.html @@ -0,0 +1,42 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} + +

{{ PAGE_TITLE }}

+

{{ lang('ACP_APS_LOGS_EXPLAIN', aps_name()) }}

+ +
+ + + {% if pagination %} + + {% endif %} + + {% include '@phpbbstudio_aps/aps_logs_list.html' with {'s_include_mark': true} %} + + {% if pagination %} + + {% endif %} + +
+ {{ lang('DISPLAY_LOG') ~ lang('COLON') }} {{ S_LIMIT_DAYS }}   + {{ lang('SORT_BY') ~ lang('COLON') }} {{ S_SORT_KEY }} {{ S_SORT_DIR }} + + {{ S_FORM_TOKEN }} +
+
+ +
+   +
+

{{ lang('MARK_ALL') }}{{ lang('UNMARK_ALL') }}

+
+
+ +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/aps/adm/style/aps_logs_list.html b/ext/phpbbstudio/aps/adm/style/aps_logs_list.html new file mode 100644 index 0000000..a02f768 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_logs_list.html @@ -0,0 +1,50 @@ + + + + + + + + + + {% if s_include_mark %} + + {% endif %} + + + + {% for log in logs %} + + + + + + + + {% if s_include_mark %} + + {% endif %} + + {% else %} + + + + {% endfor %} + +
{{ lang('USERNAME') }}{{ lang('TIME') }}{{ lang('APS_POINTS_OLD', aps_name()) }}{{ lang('APS_POINTS_DIFF', aps_name()) }}{{ lang('APS_POINTS_NEW', aps_name()) }}{{ lang('ACTION') }}{{ lang('MARK') }}
{{ log.USER }}{% if not log.S_SELF and log.REPORTEE %}
» {{ lang('FROM') ~ ' ' ~ log.REPORTEE }}{% endif %}
{{ user.format_date(log.TIME) }}{{ aps_display(log.POINTS_OLD, false) }}{{ aps_display(log.POINTS_SUM, false) }}{{ aps_display(log.POINTS_NEW, false) }}
+ + {{ lang(log.ACTION, aps_name()) }} + + {% if log.FORUM_NAME %}» {{ log.FORUM_NAME }}{% endif %} + {% if log.TOPIC_TITLE %}» {{ log.TOPIC_TITLE }}{% endif %} + {% if log.POST_SUBJECT %}» {{ log.POST_SUBJECT }}{% endif %} +
+
+

{{ lang('NO_ENTRIES') }}

+
+
diff --git a/ext/phpbbstudio/aps/adm/style/aps_points.html b/ext/phpbbstudio/aps/adm/style/aps_points.html new file mode 100644 index 0000000..e2d4a84 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_points.html @@ -0,0 +1,99 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} + +

{{ APS_TITLE }}

+

{{ lang('ACP_APS_POINTS_EXPLAIN', aps_name()) }}

+ +
+ + {% if S_ERRORS %} +

{{ ERROR_MSG }}

+ {% endif %} + + {% if S_APS_ACTION in ['add', 'edit'] %} + {% if S_APS_REASONS %} +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ {% endif %} + {% else %} + {% if S_APS_REASONS %} + + + + + + + + + + {% for reason in aps_reasons %} + + + + + + {% else %} + + + + {% endfor %} + +
{{ aps_name() }}{{ lang('REASON') }}{{ lang('ACTIONS') }}
+ {{ aps_format(reason.POINTS) }} + + {{ reason.TITLE }}
+ {{ reason.DESC }} +
+ + {{ ICON_MOVE_UP }} + + {{ ICON_MOVE_DOWN }} + {{ ICON_EDIT }} + {{ ICON_DELETE }} +
{{ lang('ACP_NO_ITEMS') }}
+ +
+ +
+ {{ lang('ADD') }} +
+ + +
+ {% endif %} + {% if S_APS_POINTS %} + {{ aps_name() }} + + {% include '@phpbbstudio_aps/aps_points_list.html' %} + + {% endif %} + {% endif %} + +
+ +
+ {{ lang('ACP_SUBMIT_CHANGES') }} + +

+   + + {{ S_FORM_TOKEN }} +

+
+ + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/aps/adm/style/aps_points_copy.html b/ext/phpbbstudio/aps/adm/style/aps_points_copy.html new file mode 100644 index 0000000..98a4e47 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_points_copy.html @@ -0,0 +1,37 @@ +
+
+
+
{{ lang('ACP_APS_POINTS_COPY', aps_name()) }}
+
+ +
+
+
{{ lang('ACP_APS_POINTS_COPY_TO', aps_name()) }}
+
+ +

{{ lang('LOOK_UP_FORUMS_EXPLAIN') }}

+
+
+
+
+ {{ S_FORM_TOKEN }} +   + +
+
+ + diff --git a/ext/phpbbstudio/aps/adm/style/aps_points_list.html b/ext/phpbbstudio/aps/adm/style/aps_points_list.html new file mode 100644 index 0000000..9431158 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_points_list.html @@ -0,0 +1,17 @@ +
+ {% for category in aps_categories %} + + +
+ {% for fields in category.blocks %} + {% for field, title in fields %} +
+
{% if lang(title ~ '_DESC') != title ~ '_DESC' %}
{{ lang(title ~ '_DESC', aps_name()) }}{% endif %}
+
+
+ {% endfor %} + {% if not loop.last %}
{% endif %} + {% endfor %} +
+ {% endfor %} +
diff --git a/ext/phpbbstudio/aps/adm/style/aps_settings.html b/ext/phpbbstudio/aps/adm/style/aps_settings.html new file mode 100644 index 0000000..6707228 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/aps_settings.html @@ -0,0 +1,54 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/fontawesome-iconpicker.min.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_iconpicker.css' %} + +

{{ PAGE_TITLE }}

+

{{ lang('ACP_APS_SETTINGS_EXPLAIN', aps_name()) }}

+ +{% if S_ERROR %} +
+

{{ lang('WARNING') }}

+

{{ ERROR_MSG }}

+
+{% endif %} + +{% if S_APS_COPY %} + {% include '@phpbbstudio_aps/aps_points_copy.html' %} +{% elseif S_APS_LOCATIONS %} + {% include '@phpbbstudio_aps/aps_locations.html' %} +{% else %} +
+ {% for setting in settings %} + {% if setting.S_LEGEND %} + {% if not loop.first %}{% endif %} + +
+ {{ lang(setting.LEGEND, aps_name()) }} + {% else %} +
+
{% if setting.S_EXPLAIN %}
{{ lang(setting.TITLE ~ '_DESC', aps_name()) }}{% endif %}
+
{{ setting.CONTENT }}
+
+ {% endif %} + {% if loop.last %}
{% endif %} + {% endfor %} + +
+ {{ lang('ACP_SUBMIT_CHANGES') }} + +

+   + + {{ S_FORM_TOKEN }} +

+
+
+{% endif %} + +{% INCLUDEJS '@phpbbstudio_aps/js/fontawesome-iconpicker.min.js' %} +{% INCLUDEJS '@phpbbstudio_aps/js/aps_common.js' %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/aps/adm/style/css/aps_common.css b/ext/phpbbstudio/aps/adm/style/css/aps_common.css new file mode 100644 index 0000000..c22215f --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/css/aps_common.css @@ -0,0 +1,115 @@ +.nojs .aps-ajax { + display: none; +} + +.aps-tabs { + background: #e5e5e5; + border-top: 1px solid #d7d7d7; + border-right: 1px solid #cccccc; + border-bottom: 1px solid #cccccc; + border-left: 1px solid #d7d7d7; + border-radius: 3px; + display: flex; + flex-wrap: wrap; +} + +.aps-tab-input { + opacity: 0; + position: absolute; +} + +.aps-tab-label { + font-size: 1.2em; + font-weight: bold; + background: #e5e5e5; + border-right: 1px solid transparent; + border-left: 1px solid transparent; + color: #7f7f7f; + width: 100%; + padding: 10px 20px; + cursor: pointer; + transition: all 0.2s ease-in; +} +.aps-tab-label:first-of-type { border-top-left-radius: 3px; } +.aps-tab-label:last-of-type { border-top-right-radius: 3px; } +.aps-tab-label:hover { background: #d8d8d8; } +.aps-tab-label:active { background: #cccccc; } + +.aps-tab-input:checked + .aps-tab-label { + background: #ffffff; + border-color: #cccccc; + color: #000000; +} + +.aps-tab-input:checked:first-of-type + .aps-tab-label { + border-left-color: transparent; +} + +@media (min-width: 600px) { + .aps-tab-label { + width: auto; + } +} + +.aps-tab-panel { + background: #ffffff; + border: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + display: none; + width: 100%; + margin: 0; +} + +@media (min-width: 600px) { + .aps-tab-panel { + order: 99; + } +} + +.aps-tab-input:checked + .aps-tab-label + .aps-tab-panel { + display: block; +} + +.aps-tabs h3 { + font-size: 1.2em; + color: #115098; + margin: 5px 0 10px; +} + +.aps-tabs small { + font-size: 90%; +} + +/* aps logs */ +table th.aps-logs-mark, +table td.aps-logs-mark { width: 50px; } +.aps-logs-user { width: 15%; } +.aps-logs-time { width: 20%; } +.aps-logs-points { width: 10%; } + +.aps-logs-action { + display: block; +} + +.aps-logs-edit { + font-size: 120%; + text-decoration: none; + float: right; + margin-right: 5px; +} + +.aps-logs-mark label { + display: block; + padding: 0; +} + +@media all and (max-width: 700px) { + .aps-logs-edit { + margin-right: 0; + } + + .aps-logs-mark label { + display: inline-block; + } +} diff --git a/ext/phpbbstudio/aps/adm/style/css/aps_form.css b/ext/phpbbstudio/aps/adm/style/css/aps_form.css new file mode 100644 index 0000000..b894371 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/css/aps_form.css @@ -0,0 +1,211 @@ +.aps-form *, +.aps-form *:before, +.aps-form *:after { + box-sizing: border-box; +} + +.aps-bool { + display: none; +} + +.aps-radio { display: none; } + +.aps-radio:checked + .aps-button-blue { + background: #12a3eb; + border-color: #12a3eb; + color: #ffffff; +} + +/* Fix for double borders due to border-box */ +.aps-form dt { + border-right: none; +} + +.aps-form dd, +.aps-form dd label { + font-size: 14px; + line-height: 1.42857143; +} + +.aps-form dd label { + display: inline-block; + height: 34px; + padding: 6px 6px 6px 0; +} + +.aps-form dd label input[type="radio"] { + height: initial; + margin-right: 3px; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green, +.aps-form input:not(.iconpicker-search), +.aps-form select, +.aps-form textarea { + font-size: 14px; + line-height: 1.42857143; + color: #555555; + height: 34px; + padding: 6px 12px; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green, +.aps-form input[type="text"], +.aps-form input[type="number"], +.aps-form input[type="submit"], +.aps-form input[type="reset"], +.aps-form select, +.aps-form textarea { + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.aps-form input:not([type="checkbox"]):not([type="radio"]):focus, +.aps-form select:focus, +.aps-form textarea:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.aps-form select:focus { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.aps-form select[multiple] { + height: auto; + min-height: 170px; +} + +.has-js select[multiple] { + max-height: 340px; +} + +.aps-form textarea { + height: auto; + resize: vertical; +} + +/* Buttons */ +.aps-button-green, +a.aps-button-green, +.aps-form input[type="submit"] { + border-color: #28a745; + color: #28a745; +} + +.aps-bool:checked + .aps-button-green, +.aps-button-green:hover, +a.aps-button-green:hover, +.aps-form input[type="submit"]:hover { + background-color: #28a745; + color: #ffffff; +} + +.aps-button-red, +a.aps-button-red, +.aps-form input[type="reset"] { + border-color: #d31141; + color: #d31141; +} + +.aps-bool:checked + .aps-button-red, +.aps-button-red:hover, +a.aps-button-red:hover, +.aps-form input[type="reset"]:hover { + background-color: #d31141; + color: #ffffff; +} + +.aps-button-blue { + border-color: #12a3eb; + color: #12a3eb; +} + +.aps-button-blue:hover { + background-color: #12a3eb; + color: #ffffff; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green { + text-decoration: none !important; + cursor: pointer; +} + +/* Point names height toggle */ +.aps-points-names { + overflow: hidden; + max-height: 100px; + padding-bottom: 20px; +} + +.aps-points-names dl:not(:first-of-type) { + opacity: 0; +} + +.aps-points-full { + max-height: 100%; + padding-bottom: 30px; +} + +.aps-points-full dl:not(:first-of-type) { + opacity: 1; +} + +@media all and (max-width: 700px) { + fieldset.aps-points-names:not(.aps-points-full) dl:first-of-type { + border-bottom: none; + } +} + +.aps-names-toggle { + font-weight: bold; + text-decoration: none !important; + border: 1px solid #cccccc; + border-bottom: none; + border-radius: 4px 4px 0 0; + opacity: 1; + position: absolute; + z-index: 1; + bottom: 0; + left: 45%; + padding: 5px 10px; + cursor: pointer; + user-select: none; + transform: translateX(-50%); +} + +/* Multiple select scrollbar */ +.aps-form select[multiple] { + scrollbar-color: #666666 #cccccc; + scrollbar-width: 10px; +} + +.aps-form select[multiple]::-webkit-scrollbar { + width: 10px; +} + +.aps-form select[multiple]::-webkit-scrollbar-thumb { + background: #666666; + border-radius: 0 4px 4px 0; +} + +.aps-form select[multiple]::-webkit-scrollbar-track { + background: #cccccc; + border-radius: 0 4px 4px 0; +} diff --git a/ext/phpbbstudio/aps/adm/style/css/aps_iconpicker.css b/ext/phpbbstudio/aps/adm/style/css/aps_iconpicker.css new file mode 100644 index 0000000..a60ee67 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/css/aps_iconpicker.css @@ -0,0 +1,78 @@ +.aps-icon-picker, +#aps_points_icon { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.aps-icon-picker + i, +#aps_points_icon + i { + font-size: 14px; + line-height: 1.42857143; + vertical-align: -1px; + background-color: #f3f3f3; + border: 1px solid #cccccc; + border-left: none; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + color: #555555; + display: inline-block; + width: auto; + height: 34px; + padding: 6px 12px; + cursor: pointer; +} + +.aps-icon-picker:focus, +#aps_points_icon:focus { + border-right-color: #cccccc; +} + +.aps-icon-picker:focus + i, +#aps_points_icon:focus + i { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.iconpicker-popover.popover { + border: 1px solid #cccccc; + border-radius: 4px; +} + +.iconpicker-popover .arrow:after { + border-bottom-color: #f7f7f7 !important; +} + +.iconpicker-popover .iconpicker-item { + margin: 0 11px 11px 0; +} + +.iconpicker-search, +.iconpicker-search:hover, +.iconpicker-search:focus { + background-color: #ffffff; + border-radius: 4px; + max-width: calc(100% - 16px); + padding: 5px 8px; +} + +.iconpicker-popover ::-webkit-scrollbar { + background: transparent; + width: 5px; + height: 5px; +} + +.iconpicker-popover ::-webkit-scrollbar-corner { + background: transparent; +} + +.iconpicker-popover ::-webkit-scrollbar-thumb { + background: #333333; + border-radius: 10px; +} + +.iconpicker-popover ::-webkit-scrollbar-track { + background: #f3f3f3; + border-radius: 10px; +} diff --git a/ext/phpbbstudio/aps/adm/style/css/aps_locations.css b/ext/phpbbstudio/aps/adm/style/css/aps_locations.css new file mode 100644 index 0000000..a3e00d0 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/css/aps_locations.css @@ -0,0 +1,94 @@ +.aps-locations { + background-color: #ffffff; + border: 1px solid #e6e9ed; + border-radius: 8px; + padding: 15px; +} + +.aps-locations > p { + text-align: center; + margin: 5rem 160px; +} + +.aps-location input { + display: none; +} + +.aps-location input ~ span { + line-height: 16px; + text-align: center; + color: #ffffff; + display: none; + min-width: 50px; + height: 30px; +} + +.aps-location input:not(:checked) ~ .aps-button-red, +.aps-location input:checked ~ .aps-button-green { display: inline-block; } +.aps-location .aps-button-green { background-color: #28a745; } +.aps-location .aps-button-red { background-color: #d31141; } + +.navbar { + background-color: #cadceb; + border-radius: 7px; + overflow: visible; + height: 40px; + padding: 3px 10px; +} + +.navbar > ul { + display: block; + margin: 0; + padding: 2px 0; + list-style-type: none; +} + +.navbar > ul > li { + font-size: 1.1em; + line-height: 2.2em; + float: left; + width: auto; + margin-right: 7px; + padding-top: 1px; + list-style-type: none; +} + +.navbar > ul > .right-side { + text-align: right; + float: right; + margin-right: 0; + margin-left: 7px; +} + +.has-dropdown { + position: relative; +} + +.dropdown { + text-align: left; + z-index: 10; + top: 25px; + min-width: 150px; +} + +.dropdown.quick-links { + left: -15px; +} + +.dropdown.user { + right: -10px; + left: unset; +} + +.dropdown .pointer { + border-color: #ffffff transparent; +} + +.dropdown.user .pointer { + right: 10px; + left: unset; +} + +.dropdown .dropdown-contents { + padding: 10px 5px; +} diff --git a/ext/phpbbstudio/aps/adm/style/css/fontawesome-iconpicker.min.css b/ext/phpbbstudio/aps/adm/style/css/fontawesome-iconpicker.min.css new file mode 100644 index 0000000..7c68265 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/css/fontawesome-iconpicker.min.css @@ -0,0 +1,10 @@ +/*! + * Font Awesome Icon Picker + * https://farbelous.github.io/fontawesome-iconpicker/ + * + * Originally written by (c) 2016 Javi Aguilar + * Licensed under the MIT License + * https://github.com/farbelous/fontawesome-iconpicker/blob/master/LICENSE + * + */.iconpicker-popover.popover{position:absolute;top:0;left:0;display:none;max-width:none;padding:1px;text-align:left;width:216px;background:#f7f7f7;z-index:9}.iconpicker-popover.popover.top,.iconpicker-popover.popover.topLeftCorner,.iconpicker-popover.popover.topLeft,.iconpicker-popover.popover.topRight,.iconpicker-popover.popover.topRightCorner{margin-top:-10px}.iconpicker-popover.popover.right,.iconpicker-popover.popover.rightTop,.iconpicker-popover.popover.rightBottom{margin-left:10px}.iconpicker-popover.popover.bottom,.iconpicker-popover.popover.bottomRightCorner,.iconpicker-popover.popover.bottomRight,.iconpicker-popover.popover.bottomLeft,.iconpicker-popover.popover.bottomLeftCorner{margin-top:10px}.iconpicker-popover.popover.left,.iconpicker-popover.popover.leftBottom,.iconpicker-popover.popover.leftTop{margin-left:-10px}.iconpicker-popover.popover.inline{margin:0 0 12px 0;position:relative;display:inline-block;opacity:1;top:auto;left:auto;bottom:auto;right:auto;max-width:100%;box-shadow:none;z-index:auto;vertical-align:top}.iconpicker-popover.popover.inline>.arrow{display:none}.dropdown-menu .iconpicker-popover.inline{margin:0;border:none}.dropdown-menu.iconpicker-container{padding:0}.iconpicker-popover.popover .popover-title{padding:12px;font-size:13px;line-height:15px;border-bottom:1px solid #ebebeb;background-color:#f7f7f7}.iconpicker-popover.popover .popover-title input[type=search].iconpicker-search{margin:0 0 2px 0}.iconpicker-popover.popover .popover-title-text~input[type=search].iconpicker-search{margin-top:12px}.iconpicker-popover.popover .popover-content{padding:0px;text-align:center}.iconpicker-popover .popover-footer{float:none;clear:both;padding:12px;text-align:right;margin:0;border-top:1px solid #ebebeb;background-color:#f7f7f7}.iconpicker-popover .popover-footer:before,.iconpicker-popover .popover-footer:after{content:" ";display:table}.iconpicker-popover .popover-footer:after{clear:both}.iconpicker-popover .popover-footer .iconpicker-btn{margin-left:10px}.iconpicker-popover .popover-footer input[type=search].iconpicker-search{margin-bottom:12px}.iconpicker-popover.popover>.arrow,.iconpicker-popover.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.iconpicker-popover.popover>.arrow{border-width:11px}.iconpicker-popover.popover>.arrow:after{border-width:10px;content:""}.iconpicker-popover.popover.top>.arrow,.iconpicker-popover.popover.topLeft>.arrow,.iconpicker-popover.popover.topRight>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.iconpicker-popover.popover.top>.arrow:after,.iconpicker-popover.popover.topLeft>.arrow:after,.iconpicker-popover.popover.topRight>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.iconpicker-popover.popover.topLeft>.arrow{left:8px;margin-left:0}.iconpicker-popover.popover.topRight>.arrow{left:auto;right:8px;margin-left:0}.iconpicker-popover.popover.right>.arrow,.iconpicker-popover.popover.rightTop>.arrow,.iconpicker-popover.popover.rightBottom>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.iconpicker-popover.popover.right>.arrow:after,.iconpicker-popover.popover.rightTop>.arrow:after,.iconpicker-popover.popover.rightBottom>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.iconpicker-popover.popover.rightTop>.arrow{top:auto;bottom:8px;margin-top:0}.iconpicker-popover.popover.rightBottom>.arrow{top:8px;margin-top:0}.iconpicker-popover.popover.bottom>.arrow,.iconpicker-popover.popover.bottomRight>.arrow,.iconpicker-popover.popover.bottomLeft>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.iconpicker-popover.popover.bottom>.arrow:after,.iconpicker-popover.popover.bottomRight>.arrow:after,.iconpicker-popover.popover.bottomLeft>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.iconpicker-popover.popover.bottomLeft>.arrow{left:8px;margin-left:0}.iconpicker-popover.popover.bottomRight>.arrow{left:auto;right:8px;margin-left:0}.iconpicker-popover.popover.left>.arrow,.iconpicker-popover.popover.leftBottom>.arrow,.iconpicker-popover.popover.leftTop>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.iconpicker-popover.popover.left>.arrow:after,.iconpicker-popover.popover.leftBottom>.arrow:after,.iconpicker-popover.popover.leftTop>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.iconpicker-popover.popover.leftBottom>.arrow{top:8px;margin-top:0}.iconpicker-popover.popover.leftTop>.arrow{top:auto;bottom:8px;margin-top:0}.iconpicker{position:relative;text-align:left;text-shadow:none;line-height:0;display:block;margin:0;overflow:hidden}.iconpicker *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;position:relative}.iconpicker:before,.iconpicker:after{content:" ";display:table}.iconpicker:after{clear:both}.iconpicker .iconpicker-items{position:relative;clear:both;float:none;padding:12px 0 0 12px;background:#fff;margin:0;overflow:hidden;overflow-y:auto;min-height:49px;max-height:246px}.iconpicker .iconpicker-items:before,.iconpicker .iconpicker-items:after{content:" ";display:table}.iconpicker .iconpicker-items:after{clear:both}.iconpicker .iconpicker-item{float:left;width:14px;height:14px;padding:12px;margin:0 12px 12px 0;text-align:center;cursor:pointer;border-radius:3px;font-size:14px;box-shadow:0 0 0 1px #ddd;color:inherit}.iconpicker .iconpicker-item:hover:not(.iconpicker-selected){background-color:#eee}.iconpicker .iconpicker-item.iconpicker-selected{box-shadow:none;color:#fff;background:#28a745}.iconpicker-component{cursor:pointer} +.iconpicker-popover, .iconpicker-popover *, .iconpicker-popover *:before, .iconpicker-popover *:after {box-sizing: content-box !important;} diff --git a/ext/phpbbstudio/aps/adm/style/event/acp_forums_custom_settings.html b/ext/phpbbstudio/aps/adm/style/event/acp_forums_custom_settings.html new file mode 100644 index 0000000..352dd45 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/event/acp_forums_custom_settings.html @@ -0,0 +1,47 @@ +{% if S_APS_POINTS %} +
+ {{ aps_name() }} + + {# We can only AJAX copy and reset if the forum already exists #} + {% if not S_ADD_ACTION %} + {# Include the JS file #} + {% INCLUDEJS '@phpbbstudio_aps/js/aps_forum.js' %} + +
+

{{ lang('ACP_APS_POINTS_RESET_EXPLAIN', aps_name()) }}
+
+ + + +
+
+ {% endif %} + +
+

{{ lang('ACP_APS_POINTS_COPY_EXPLAIN', aps_name()) }}
+
+ + {% if not S_ADD_ACTION %} + + {% endif %} +
+
+ + {% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} + {% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} + + {% include '@phpbbstudio_aps/aps_points_list.html' %} +
+{% endif %} diff --git a/ext/phpbbstudio/aps/adm/style/event/acp_users_overview_options_append.html b/ext/phpbbstudio/aps/adm/style/event/acp_users_overview_options_append.html new file mode 100644 index 0000000..f72e50c --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/event/acp_users_overview_options_append.html @@ -0,0 +1,4 @@ +
+
+
{{ aps_display(APS_POINTS) }}
+
diff --git a/ext/phpbbstudio/aps/adm/style/js/aps_common.js b/ext/phpbbstudio/aps/adm/style/js/aps_common.js new file mode 100644 index 0000000..be9a3ac --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/js/aps_common.js @@ -0,0 +1,13 @@ +jQuery(function($) { + $('.aps-names-toggle').on('click', function() { + $(this).parents('fieldset').toggleClass('aps-points-full'); + let altText = $(this).data('text'); + $(this).data('text', $(this).text()).text(altText); + }); + + $('#aps_points_icon').iconpicker({ + collision: true, + placement: 'bottomRight', + component: '#aps_points_icon + i', + }); +}); diff --git a/ext/phpbbstudio/aps/adm/style/js/aps_display.js b/ext/phpbbstudio/aps/adm/style/js/aps_display.js new file mode 100644 index 0000000..15fd38d --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/js/aps_display.js @@ -0,0 +1,12 @@ +jQuery(function($) { + $('[data-aps-sortable]').sortable({ + axis: 'y', + containment: $(this).selector, + cursor: 'move', + delay: 150, + handle: '.aps-button-blue', + forcePlaceholderSize: true, + placeholder: 'panel', + tolerance: 'pointer', + }); +}); diff --git a/ext/phpbbstudio/aps/adm/style/js/aps_forum.js b/ext/phpbbstudio/aps/adm/style/js/aps_forum.js new file mode 100644 index 0000000..9af5d6f --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/js/aps_forum.js @@ -0,0 +1,83 @@ +jQuery(function($) { + let $button = $('#aps_points_copy_ajax'), + $select = $('#aps_points_copy'), + $form = $button.parents('form'), + action = $form.attr('action').replace('&', '&'); + + let callback = 'aps_points_copy', + $dark = $('#darkenwrapper'); + + $button.on('click', function(e) { + /** + * Handler for AJAX errors + */ + function errorHandler(jqXHR, textStatus, errorThrown) { + if (typeof console !== 'undefined' && console.log) { + console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown); + } + phpbb.clearLoadingTimeout(); + let responseText, errorText = false; + try { + responseText = JSON.parse(jqXHR.responseText); + responseText = responseText.message; + } catch (e) {} + if (typeof responseText === 'string' && responseText.length > 0) { + errorText = responseText; + } else if (typeof errorThrown === 'string' && errorThrown.length > 0) { + errorText = errorThrown; + } else { + errorText = $dark.attr('data-ajax-error-text-' + textStatus); + if (typeof errorText !== 'string' || !errorText.length) { + errorText = $dark.attr('data-ajax-error-text'); + } + } + phpbb.alert($dark.attr('data-ajax-error-title'), errorText); + } + + let request = $.ajax({ + url: action, + type: 'post', + data: {'aps_action': 'copy', 'aps_points_copy': $select.val()}, + success: function(response) { + /** + * @param {string} response.MESSAGE_TITLE + * @param {string} response.MESSAGE_TEXT + */ + phpbb.alert(response.MESSAGE_TITLE, response.MESSAGE_TEXT); + + if (typeof phpbb.ajaxCallbacks[callback] === 'function') { + phpbb.ajaxCallbacks[callback].call(this, response); + } + }, + error: errorHandler, + cache: false + }); + + request.always(function() { + let $loadingIndicator = phpbb.loadingIndicator(); + + if ($loadingIndicator && $loadingIndicator.is(':visible')) { + $loadingIndicator.fadeOut(phpbb.alertTime); + } + }); + + e.preventDefault(); + }); + + phpbb.addAjaxCallback('aps_points_copy', function(response) { + $select.val(0); + + /** + * @param {array} response.APS_VALUES + */ + $.each(response.APS_VALUES, function(name, value) { + $('#' + name).val(value); + }); + }); + + phpbb.addAjaxCallback('aps_points_reset', function() { + $('[name*="aps_values"]').each(function() { + $(this).val(0); + }); + }); +}); diff --git a/ext/phpbbstudio/aps/adm/style/js/fontawesome-iconpicker.min.js b/ext/phpbbstudio/aps/adm/style/js/fontawesome-iconpicker.min.js new file mode 100644 index 0000000..2d3eb89 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/js/fontawesome-iconpicker.min.js @@ -0,0 +1 @@ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.ui=a.ui||{};a.ui.version="1.12.1";!function(){function b(a,b,c){return[parseFloat(a[0])*(l.test(a[0])?b/100:1),parseFloat(a[1])*(l.test(a[1])?c/100:1)]}function c(b,c){return parseInt(a.css(b,c),10)||0}function d(b){var c=b[0];return 9===c.nodeType?{width:b.width(),height:b.height(),offset:{top:0,left:0}}:a.isWindow(c)?{width:b.width(),height:b.height(),offset:{top:b.scrollTop(),left:b.scrollLeft()}}:c.preventDefault?{width:0,height:0,offset:{top:c.pageY,left:c.pageX}}:{width:b.outerWidth(),height:b.outerHeight(),offset:b.offset()}}var e,f=Math.max,g=Math.abs,h=/left|center|right/,i=/top|center|bottom/,j=/[\+\-]\d+(\.[\d]+)?%?/,k=/^\w+/,l=/%$/,m=a.fn.pos;a.pos={scrollbarWidth:function(){if(void 0!==e)return e;var b,c,d=a("
"),f=d.children()[0];return a("body").append(d),b=f.offsetWidth,d.css("overflow","scroll"),c=f.offsetWidth,b===c&&(c=d[0].clientWidth),d.remove(),e=b-c},getScrollInfo:function(b){var c=b.isWindow||b.isDocument?"":b.element.css("overflow-x"),d=b.isWindow||b.isDocument?"":b.element.css("overflow-y"),e="scroll"===c||"auto"===c&&b.width0?"right":"center",vertical:h<0?"top":d>0?"bottom":"middle"};nf(g(d),g(h))?l.important="horizontal":l.important="vertical",e.using.call(this,a,l)}),i.offset(a.extend(z,{using:h}))})},a.ui.pos={_trigger:function(a,b,c,d){b.elem&&b.elem.trigger({type:c,position:a,positionData:b,triggered:d})},fit:{left:function(b,c){a.ui.pos._trigger(b,c,"posCollide","fitLeft");var d,e=c.within,g=e.isWindow?e.scrollLeft:e.offset.left,h=e.width,i=b.left-c.collisionPosition.marginLeft,j=g-i,k=i+c.collisionWidth-h-g;c.collisionWidth>h?j>0&&k<=0?(d=b.left+j+c.collisionWidth-h-g,b.left+=j-d):b.left=k>0&&j<=0?g:j>k?g+h-c.collisionWidth:g:j>0?b.left+=j:k>0?b.left-=k:b.left=f(b.left-i,b.left),a.ui.pos._trigger(b,c,"posCollided","fitLeft")},top:function(b,c){a.ui.pos._trigger(b,c,"posCollide","fitTop");var d,e=c.within,g=e.isWindow?e.scrollTop:e.offset.top,h=c.within.height,i=b.top-c.collisionPosition.marginTop,j=g-i,k=i+c.collisionHeight-h-g;c.collisionHeight>h?j>0&&k<=0?(d=b.top+j+c.collisionHeight-h-g,b.top+=j-d):b.top=k>0&&j<=0?g:j>k?g+h-c.collisionHeight:g:j>0?b.top+=j:k>0?b.top-=k:b.top=f(b.top-i,b.top),a.ui.pos._trigger(b,c,"posCollided","fitTop")}},flip:{left:function(b,c){a.ui.pos._trigger(b,c,"posCollide","flipLeft");var d,e,f=c.within,h=f.offset.left+f.scrollLeft,i=f.width,j=f.isWindow?f.scrollLeft:f.offset.left,k=b.left-c.collisionPosition.marginLeft,l=k-j,m=k+c.collisionWidth-i-j,n="left"===c.my[0]?-c.elemWidth:"right"===c.my[0]?c.elemWidth:0,o="left"===c.at[0]?c.targetWidth:"right"===c.at[0]?-c.targetWidth:0,p=-2*c.offset[0];l<0?((d=b.left+n+o+p+c.collisionWidth-i-h)<0||d0&&((e=b.left-c.collisionPosition.marginLeft+n+o+p-j)>0||g(e)0&&((d=b.top-c.collisionPosition.marginTop+o+p+q-j)>0||g(d)10&&e<11,b.innerHTML="",c.removeChild(b)}()}();a.ui.position}),function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):window.jQuery&&!window.jQuery.fn.iconpicker&&a(window.jQuery)}(function(a){"use strict";var b={isEmpty:function(a){return!1===a||""===a||null===a||void 0===a},isEmptyObject:function(a){return!0===this.isEmpty(a)||0===a.length},isElement:function(b){return a(b).length>0},isString:function(a){return"string"==typeof a||a instanceof String},isArray:function(b){return a.isArray(b)},inArray:function(b,c){return-1!==a.inArray(b,c)},throwError:function(a){throw"Font Awesome Icon Picker Exception: "+a}},c=function(d,e){this._id=c._idCounter++,this.element=a(d).addClass("iconpicker-element"),this._trigger("iconpickerCreate"),this.options=a.extend({},c.defaultOptions,this.element.data(),e),this.options.templates=a.extend({},c.defaultOptions.templates,this.options.templates),this.options.originalPlacement=this.options.placement,this.container=!!b.isElement(this.options.container)&&a(this.options.container),!1===this.container&&(this.element.is(".dropdown-toggle")?this.container=a("~ .dropdown-menu:first",this.element):this.container=this.element.is("input,textarea,button,.btn")?this.element.parent():this.element),this.container.addClass("iconpicker-container"),this.isDropdownMenu()&&(this.options.templates.search=!1,this.options.templates.buttons=!1,this.options.placement="inline"),this.input=!!this.element.is("input,textarea")&&this.element.addClass("iconpicker-input"),!1===this.input&&(this.input=this.container.find(this.options.input),this.input.is("input,textarea")||(this.input=!1)),this.component=this.isDropdownMenu()?this.container.parent().find(this.options.component):this.container.find(this.options.component),0===this.component.length?this.component=!1:this.component.find("i").addClass("iconpicker-component"),this._createPopover(),this._createIconpicker(),0===this.getAcceptButton().length&&(this.options.mustAccept=!1),this.isInputGroup()?this.container.parent().append(this.popover):this.container.append(this.popover),this._bindElementEvents(),this._bindWindowEvents(),this.update(this.options.selected),this.isInline()&&this.show(),this._trigger("iconpickerCreated")};c._idCounter=0,c.defaultOptions={title:!1,selected:!1,defaultValue:!1,placement:"bottom",collision:"none",animation:!0,hideOnSelect:!1,showFooter:!1,searchInFooter:!1,mustAccept:!1,selectedCustomClass:"bg-primary",icons:[],fullClassFormatter:function(a){return"fa "+a},input:"input,.iconpicker-input",inputSearch:!1,container:!1,component:".input-group-addon,.iconpicker-component",templates:{popover:'
',footer:'',buttons:' ',search:'',iconpicker:'
',iconpickerItem:''}},c.batch=function(b,c){var d=Array.prototype.slice.call(arguments,2);return a(b).each(function(){var b=a(this).data("iconpicker");b&&b[c].apply(b,d)})},c.prototype={constructor:c,options:{},_id:0,_trigger:function(b,c){c=c||{},this.element.trigger(a.extend({type:b,iconpickerInstance:this},c))},_createPopover:function(){this.popover=a(this.options.templates.popover);var c=this.popover.find(".popover-title");if(this.options.title&&c.append(a('
'+this.options.title+"
")),this.hasSeparatedSearchInput()&&!this.options.searchInFooter?c.append(this.options.templates.search):this.options.title||c.remove(),this.options.showFooter&&!b.isEmpty(this.options.templates.footer)){var d=a(this.options.templates.footer);this.hasSeparatedSearchInput()&&this.options.searchInFooter&&d.append(a(this.options.templates.search)),b.isEmpty(this.options.templates.buttons)||d.append(a(this.options.templates.buttons)),this.popover.append(d)}return!0===this.options.animation&&this.popover.addClass("fade"),this.popover},_createIconpicker:function(){var b=this;this.iconpicker=a(this.options.templates.iconpicker);var c=function(c){var d=a(this);return d.is("i")&&(d=d.parent()),b._trigger("iconpickerSelect",{iconpickerItem:d,iconpickerValue:b.iconpickerValue}),!1===b.options.mustAccept?(b.update(d.data("iconpickerValue")),b._trigger("iconpickerSelected",{iconpickerItem:this,iconpickerValue:b.iconpickerValue})):b.update(d.data("iconpickerValue"),!0),b.options.hideOnSelect&&!1===b.options.mustAccept&&b.hide(),c.preventDefault(),!1};for(var d in this.options.icons)if("string"==typeof this.options.icons[d]){var e=a(this.options.templates.iconpickerItem);e.find("i").addClass(this.options.fullClassFormatter(this.options.icons[d])),e.data("iconpickerValue",this.options.icons[d]).on("click.iconpicker",c),this.iconpicker.find(".iconpicker-items").append(e.attr("title","."+this.options.icons[d]))}return this.popover.find(".popover-content").append(this.iconpicker),this.iconpicker},_isEventInsideIconpicker:function(b){var c=a(b.target);return!((!c.hasClass("iconpicker-element")||c.hasClass("iconpicker-element")&&!c.is(this.element))&&0===c.parents(".iconpicker-popover").length)},_bindElementEvents:function(){var c=this;this.getSearchInput().on("keyup.iconpicker",function(){c.filter(a(this).val().toLowerCase())}),this.getAcceptButton().on("click.iconpicker",function(){var a=c.iconpicker.find(".iconpicker-selected").get(0);c.update(c.iconpickerValue),c._trigger("iconpickerSelected",{iconpickerItem:a,iconpickerValue:c.iconpickerValue}),c.isInline()||c.hide()}),this.getCancelButton().on("click.iconpicker",function(){c.isInline()||c.hide()}),this.element.on("focus.iconpicker",function(a){c.show(),a.stopPropagation()}),this.hasComponent()&&this.component.on("click.iconpicker",function(){c.toggle()}),this.hasInput()&&this.input.on("keyup.iconpicker",function(d){b.inArray(d.keyCode,[38,40,37,39,16,17,18,9,8,91,93,20,46,186,190,46,78,188,44,86])?c._updateFormGroupStatus(!1!==c.getValid(this.value)):c.update(),!0===c.options.inputSearch&&c.filter(a(this).val().toLowerCase())})},_bindWindowEvents:function(){var b=a(window.document),c=this,d=".iconpicker.inst"+this._id;return a(window).on("resize.iconpicker"+d+" orientationchange.iconpicker"+d,function(a){c.popover.hasClass("in")&&c.updatePlacement()}),c.isInline()||b.on("mouseup"+d,function(a){return c._isEventInsideIconpicker(a)||c.isInline()||c.hide(),a.stopPropagation(),a.preventDefault(),!1}),!1},_unbindElementEvents:function(){this.popover.off(".iconpicker"),this.element.off(".iconpicker"),this.hasInput()&&this.input.off(".iconpicker"),this.hasComponent()&&this.component.off(".iconpicker"),this.hasContainer()&&this.container.off(".iconpicker")},_unbindWindowEvents:function(){a(window).off(".iconpicker.inst"+this._id),a(window.document).off(".iconpicker.inst"+this._id)},updatePlacement:function(b,c){b=b||this.options.placement,this.options.placement=b,c=c||this.options.collision,c=!0===c?"flip":c;var d={at:"right bottom",my:"right top",of:this.hasInput()&&!this.isInputGroup()?this.input:this.container,collision:!0===c?"flip":c,within:window};if(this.popover.removeClass("inline topLeftCorner topLeft top topRight topRightCorner rightTop right rightBottom bottomRight bottomRightCorner bottom bottomLeft bottomLeftCorner leftBottom left leftTop"),"object"==typeof b)return this.popover.pos(a.extend({},d,b));switch(b){case"inline":d=!1;break;case"topLeftCorner":d.my="right bottom",d.at="left top";break;case"topLeft":d.my="left bottom",d.at="left top";break;case"top":d.my="center bottom",d.at="center top";break;case"topRight":d.my="right bottom",d.at="right top";break;case"topRightCorner":d.my="left bottom",d.at="right top";break;case"rightTop":d.my="left bottom",d.at="right center";break;case"right":d.my="left center",d.at="right center";break;case"rightBottom":d.my="left top",d.at="right center";break;case"bottomRightCorner":d.my="left top",d.at="right bottom";break;case"bottomRight":d.my="right top",d.at="right bottom";break;case"bottom":d.my="center top",d.at="center bottom";break;case"bottomLeft":d.my="left top",d.at="left bottom";break;case"bottomLeftCorner":d.my="right top",d.at="left bottom";break;case"leftBottom":d.my="right top",d.at="left center";break;case"left":d.my="right center",d.at="left center";break;case"leftTop":d.my="right bottom",d.at="left center";break;default:return!1}return this.popover.css({display:"inline"===this.options.placement?"":"block"}),!1!==d?this.popover.pos(d).css("maxWidth",a(window).width()-this.container.offset().left-5):this.popover.css({top:"auto",right:"auto",bottom:"auto",left:"auto",maxWidth:"none"}),this.popover.addClass(this.options.placement),!0},_updateComponents:function(){if(this.iconpicker.find(".iconpicker-item.iconpicker-selected").removeClass("iconpicker-selected "+this.options.selectedCustomClass),this.iconpickerValue&&this.iconpicker.find("."+this.options.fullClassFormatter(this.iconpickerValue).replace(/ /g,".")).parent().addClass("iconpicker-selected "+this.options.selectedCustomClass),this.hasComponent()){var a=this.component.find("i");a.length>0?a.attr("class",this.options.fullClassFormatter(this.iconpickerValue)):this.component.html(this.getHtml())}},_updateFormGroupStatus:function(a){return!!this.hasInput()&&(!1!==a?this.input.parents(".form-group:first").removeClass("has-error"):this.input.parents(".form-group:first").addClass("has-error"),!0)},getValid:function(c){b.isString(c)||(c="");var d=""===c;return c=a.trim(c),!(!b.inArray(c,this.options.icons)&&!d)&&c},setValue:function(a){var b=this.getValid(a);return!1!==b?(this.iconpickerValue=b,this._trigger("iconpickerSetValue",{iconpickerValue:b}),this.iconpickerValue):(this._trigger("iconpickerInvalid",{iconpickerValue:a}),!1)},getHtml:function(){return''},setSourceValue:function(a){return a=this.setValue(a),!1!==a&&""!==a&&(this.hasInput()?this.input.val(this.iconpickerValue):this.element.data("iconpickerValue",this.iconpickerValue),this._trigger("iconpickerSetSourceValue",{iconpickerValue:a})),a},getSourceValue:function(a){a=a||this.options.defaultValue;var b=a;return b=this.hasInput()?this.input.val():this.element.data("iconpickerValue"),void 0!==b&&""!==b&&null!==b&&!1!==b||(b=a),b},hasInput:function(){return!1!==this.input},isInputSearch:function(){return this.hasInput()&&!0===this.options.inputSearch},isInputGroup:function(){return this.container.is(".input-group")},isDropdownMenu:function(){return this.container.is(".dropdown-menu")},hasSeparatedSearchInput:function(){return!1!==this.options.templates.search&&!this.isInputSearch()},hasComponent:function(){return!1!==this.component},hasContainer:function(){return!1!==this.container},getAcceptButton:function(){return this.popover.find(".iconpicker-btn-accept")},getCancelButton:function(){return this.popover.find(".iconpicker-btn-cancel")},getSearchInput:function(){return this.popover.find(".iconpicker-search")},filter:function(c){if(b.isEmpty(c))return this.iconpicker.find(".iconpicker-item").show(),a(!1);var d=[];return this.iconpicker.find(".iconpicker-item").each(function(){var b=a(this),e=b.attr("title").toLowerCase(),f=!1;try{f=new RegExp(c,"g")}catch(a){f=!1}!1!==f&&e.match(f)?(d.push(b),b.show()):b.hide()}),d},show:function(){if(this.popover.hasClass("in"))return!1;a.iconpicker.batch(a(".iconpicker-popover.in:not(.inline)").not(this.popover),"hide"),this._trigger("iconpickerShow"),this.updatePlacement(),this.popover.addClass("in"),setTimeout(a.proxy(function(){this.popover.css("display",this.isInline()?"":"block"),this._trigger("iconpickerShown")},this),this.options.animation?300:1)},hide:function(){if(!this.popover.hasClass("in"))return!1;this._trigger("iconpickerHide"),this.popover.removeClass("in"),setTimeout(a.proxy(function(){this.popover.css("display","none"),this.getSearchInput().val(""),this.filter(""),this._trigger("iconpickerHidden")},this),this.options.animation?300:1)},toggle:function(){this.popover.is(":visible")?this.hide():this.show(!0)},update:function(a,b){return a=a||this.getSourceValue(this.iconpickerValue),this._trigger("iconpickerUpdate"),!0===b?a=this.setValue(a):(a=this.setSourceValue(a),this._updateFormGroupStatus(!1!==a)),!1!==a&&this._updateComponents(),this._trigger("iconpickerUpdated"),a},destroy:function(){this._trigger("iconpickerDestroy"),this.element.removeData("iconpicker").removeData("iconpickerValue").removeClass("iconpicker-element"),this._unbindElementEvents(),this._unbindWindowEvents(),a(this.popover).remove(),this._trigger("iconpickerDestroyed")},disable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!0),!0)},enable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!1),!0)},isDisabled:function(){return!!this.hasInput()&&!0===this.input.prop("disabled")},isInline:function(){return"inline"===this.options.placement||this.popover.hasClass("inline")}},a.iconpicker=c,a.fn.iconpicker=function(b){return this.each(function(){var d=a(this);d.data("iconpicker")||d.data("iconpicker",new c(this,"object"==typeof b?b:{}))})},c.defaultOptions.icons=["fa-500px","fa-address-book","fa-address-book-o","fa-address-card","fa-address-card-o","fa-adjust","fa-adn","fa-align-center","fa-align-justify","fa-align-left","fa-align-right","fa-amazon","fa-ambulance","fa-american-sign-language-interpreting","fa-anchor","fa-android","fa-angellist","fa-angle-double-down","fa-angle-double-left","fa-angle-double-right","fa-angle-double-up","fa-angle-down","fa-angle-left","fa-angle-right","fa-angle-up","fa-apple","fa-archive","fa-area-chart","fa-arrow-circle-down","fa-arrow-circle-left","fa-arrow-circle-o-down","fa-arrow-circle-o-left","fa-arrow-circle-o-right","fa-arrow-circle-o-up","fa-arrow-circle-right","fa-arrow-circle-up","fa-arrow-down","fa-arrow-left","fa-arrow-right","fa-arrow-up","fa-arrows","fa-arrows-alt","fa-arrows-h","fa-arrows-v","fa-asl-interpreting","fa-assistive-listening-systems","fa-asterisk","fa-at","fa-audio-description","fa-automobile","fa-backward","fa-balance-scale","fa-ban","fa-bandcamp","fa-bank","fa-bar-chart","fa-bar-chart-o","fa-barcode","fa-bars","fa-bath","fa-bathtub","fa-battery","fa-battery-0","fa-battery-1","fa-battery-2","fa-battery-3","fa-battery-4","fa-battery-empty","fa-battery-full","fa-battery-half","fa-battery-quarter","fa-battery-three-quarters","fa-bed","fa-beer","fa-behance","fa-behance-square","fa-bell","fa-bell-o","fa-bell-slash","fa-bell-slash-o","fa-bicycle","fa-binoculars","fa-birthday-cake","fa-bitbucket","fa-bitbucket-square","fa-bitcoin","fa-black-tie","fa-blind","fa-bluetooth","fa-bluetooth-b","fa-bold","fa-bolt","fa-bomb","fa-book","fa-bookmark","fa-bookmark-o","fa-braille","fa-briefcase","fa-btc","fa-bug","fa-building","fa-building-o","fa-bullhorn","fa-bullseye","fa-bus","fa-buysellads","fa-cab","fa-calculator","fa-calendar","fa-calendar-check-o","fa-calendar-minus-o","fa-calendar-o","fa-calendar-plus-o","fa-calendar-times-o","fa-camera","fa-camera-retro","fa-car","fa-caret-down","fa-caret-left","fa-caret-right","fa-caret-square-o-down","fa-caret-square-o-left","fa-caret-square-o-right","fa-caret-square-o-up","fa-caret-up","fa-cart-arrow-down","fa-cart-plus","fa-cc","fa-cc-amex","fa-cc-diners-club","fa-cc-discover","fa-cc-jcb","fa-cc-mastercard","fa-cc-paypal","fa-cc-stripe","fa-cc-visa","fa-certificate","fa-chain","fa-chain-broken","fa-check","fa-check-circle","fa-check-circle-o","fa-check-square","fa-check-square-o","fa-chevron-circle-down","fa-chevron-circle-left","fa-chevron-circle-right","fa-chevron-circle-up","fa-chevron-down","fa-chevron-left","fa-chevron-right","fa-chevron-up","fa-child","fa-chrome","fa-circle","fa-circle-o","fa-circle-o-notch","fa-circle-thin","fa-clipboard","fa-clock-o","fa-clone","fa-close","fa-cloud","fa-cloud-download","fa-cloud-upload","fa-cny","fa-code","fa-code-fork","fa-codepen","fa-codiepie","fa-coffee","fa-cog","fa-cogs","fa-columns","fa-comment","fa-comment-o","fa-commenting","fa-commenting-o","fa-comments","fa-comments-o","fa-compass","fa-compress","fa-connectdevelop","fa-contao","fa-copy","fa-copyright","fa-creative-commons","fa-credit-card","fa-credit-card-alt","fa-crop","fa-crosshairs","fa-css3","fa-cube","fa-cubes","fa-cut","fa-cutlery","fa-dashboard","fa-dashcube","fa-database","fa-deaf","fa-deafness","fa-dedent","fa-delicious","fa-desktop","fa-deviantart","fa-diamond","fa-digg","fa-dollar","fa-dot-circle-o","fa-download","fa-dribbble","fa-drivers-license","fa-drivers-license-o","fa-dropbox","fa-drupal","fa-edge","fa-edit","fa-eercast","fa-eject","fa-ellipsis-h","fa-ellipsis-v","fa-empire","fa-envelope","fa-envelope-o","fa-envelope-open","fa-envelope-open-o","fa-envelope-square","fa-envira","fa-eraser","fa-etsy","fa-eur","fa-euro","fa-exchange","fa-exclamation","fa-exclamation-circle","fa-exclamation-triangle","fa-expand","fa-expeditedssl","fa-external-link","fa-external-link-square","fa-eye","fa-eye-slash","fa-eyedropper","fa-fa","fa-facebook","fa-facebook-f","fa-facebook-official","fa-facebook-square","fa-fast-backward","fa-fast-forward","fa-fax","fa-feed","fa-female","fa-fighter-jet","fa-file","fa-file-archive-o","fa-file-audio-o","fa-file-code-o","fa-file-excel-o","fa-file-image-o","fa-file-movie-o","fa-file-o","fa-file-pdf-o","fa-file-photo-o","fa-file-picture-o","fa-file-powerpoint-o","fa-file-sound-o","fa-file-text","fa-file-text-o","fa-file-video-o","fa-file-word-o","fa-file-zip-o","fa-files-o","fa-film","fa-filter","fa-fire","fa-fire-extinguisher","fa-firefox","fa-first-order","fa-flag","fa-flag-checkered","fa-flag-o","fa-flash","fa-flask","fa-flickr","fa-floppy-o","fa-folder","fa-folder-o","fa-folder-open","fa-folder-open-o","fa-font","fa-font-awesome","fa-fonticons","fa-fort-awesome","fa-forumbee","fa-forward","fa-foursquare","fa-free-code-camp","fa-frown-o","fa-futbol-o","fa-gamepad","fa-gavel","fa-gbp","fa-ge","fa-gear","fa-gears","fa-genderless","fa-get-pocket","fa-gg","fa-gg-circle","fa-gift","fa-git","fa-git-square","fa-github","fa-github-alt","fa-github-square","fa-gitlab","fa-gittip","fa-glass","fa-glide","fa-glide-g","fa-globe","fa-google","fa-google-plus","fa-google-plus-circle","fa-google-plus-official","fa-google-plus-square","fa-google-wallet","fa-graduation-cap","fa-gratipay","fa-grav","fa-group","fa-h-square","fa-hacker-news","fa-hand-grab-o","fa-hand-lizard-o","fa-hand-o-down","fa-hand-o-left","fa-hand-o-right","fa-hand-o-up","fa-hand-paper-o","fa-hand-peace-o","fa-hand-pointer-o","fa-hand-rock-o","fa-hand-scissors-o","fa-hand-spock-o","fa-hand-stop-o","fa-handshake-o","fa-hard-of-hearing","fa-hashtag","fa-hdd-o","fa-header","fa-headphones","fa-heart","fa-heart-o","fa-heartbeat","fa-history","fa-home","fa-hospital-o","fa-hotel","fa-hourglass","fa-hourglass-1","fa-hourglass-2","fa-hourglass-3","fa-hourglass-end","fa-hourglass-half","fa-hourglass-o","fa-hourglass-start","fa-houzz","fa-html5","fa-i-cursor","fa-id-badge","fa-id-card","fa-id-card-o","fa-ils","fa-image","fa-imdb","fa-inbox","fa-indent","fa-industry","fa-info","fa-info-circle","fa-inr","fa-instagram","fa-institution","fa-internet-explorer","fa-intersex","fa-ioxhost","fa-italic","fa-joomla","fa-jpy","fa-jsfiddle","fa-key","fa-keyboard-o","fa-krw","fa-language","fa-laptop","fa-lastfm","fa-lastfm-square","fa-leaf","fa-leanpub","fa-legal","fa-lemon-o","fa-level-down","fa-level-up","fa-life-bouy","fa-life-buoy","fa-life-ring","fa-life-saver","fa-lightbulb-o","fa-line-chart","fa-link","fa-linkedin","fa-linkedin-square","fa-linode","fa-linux","fa-list","fa-list-alt","fa-list-ol","fa-list-ul","fa-location-arrow","fa-lock","fa-long-arrow-down","fa-long-arrow-left","fa-long-arrow-right","fa-long-arrow-up","fa-low-vision","fa-magic","fa-magnet","fa-mail-forward","fa-mail-reply","fa-mail-reply-all","fa-male","fa-map","fa-map-marker","fa-map-o","fa-map-pin","fa-map-signs","fa-mars","fa-mars-double","fa-mars-stroke","fa-mars-stroke-h","fa-mars-stroke-v","fa-maxcdn","fa-meanpath","fa-medium","fa-medkit","fa-meetup","fa-meh-o","fa-mercury","fa-microchip","fa-microphone","fa-microphone-slash","fa-minus","fa-minus-circle","fa-minus-square","fa-minus-square-o","fa-mixcloud","fa-mobile","fa-mobile-phone","fa-modx","fa-money","fa-moon-o","fa-mortar-board","fa-motorcycle","fa-mouse-pointer","fa-music","fa-navicon","fa-neuter","fa-newspaper-o","fa-object-group","fa-object-ungroup","fa-odnoklassniki","fa-odnoklassniki-square","fa-opencart","fa-openid","fa-opera","fa-optin-monster","fa-outdent","fa-pagelines","fa-paint-brush","fa-paper-plane","fa-paper-plane-o","fa-paperclip","fa-paragraph","fa-paste","fa-pause","fa-pause-circle","fa-pause-circle-o","fa-paw","fa-paypal","fa-pencil","fa-pencil-square","fa-pencil-square-o","fa-percent","fa-phone","fa-phone-square","fa-photo","fa-picture-o","fa-pie-chart","fa-pied-piper","fa-pied-piper-alt","fa-pied-piper-pp","fa-pinterest","fa-pinterest-p","fa-pinterest-square","fa-plane","fa-play","fa-play-circle","fa-play-circle-o","fa-plug","fa-plus","fa-plus-circle","fa-plus-square","fa-plus-square-o","fa-podcast","fa-power-off","fa-print","fa-product-hunt","fa-puzzle-piece","fa-qq","fa-qrcode","fa-question","fa-question-circle","fa-question-circle-o","fa-quora","fa-quote-left","fa-quote-right","fa-ra","fa-random","fa-ravelry","fa-rebel","fa-recycle","fa-reddit","fa-reddit-alien","fa-reddit-square","fa-refresh","fa-registered","fa-remove","fa-renren","fa-reorder","fa-repeat","fa-reply","fa-reply-all","fa-resistance","fa-retweet","fa-rmb","fa-road","fa-rocket","fa-rotate-left","fa-rotate-right","fa-rouble","fa-rss","fa-rss-square","fa-rub","fa-ruble","fa-rupee","fa-s15","fa-safari","fa-save","fa-scissors","fa-scribd","fa-search","fa-search-minus","fa-search-plus","fa-sellsy","fa-send","fa-send-o","fa-server","fa-share","fa-share-alt","fa-share-alt-square","fa-share-square","fa-share-square-o","fa-shekel","fa-sheqel","fa-shield","fa-ship","fa-shirtsinbulk","fa-shopping-bag","fa-shopping-basket","fa-shopping-cart","fa-shower","fa-sign-in","fa-sign-language","fa-sign-out","fa-signal","fa-signing","fa-simplybuilt","fa-sitemap","fa-skyatlas","fa-skype","fa-slack","fa-sliders","fa-slideshare","fa-smile-o","fa-snapchat","fa-snapchat-ghost","fa-snapchat-square","fa-snowflake-o","fa-soccer-ball-o","fa-sort","fa-sort-alpha-asc","fa-sort-alpha-desc","fa-sort-amount-asc","fa-sort-amount-desc","fa-sort-asc","fa-sort-desc","fa-sort-down","fa-sort-numeric-asc","fa-sort-numeric-desc","fa-sort-up","fa-soundcloud","fa-space-shuttle","fa-spinner","fa-spoon","fa-spotify","fa-square","fa-square-o","fa-stack-exchange","fa-stack-overflow","fa-star","fa-star-half","fa-star-half-empty","fa-star-half-full","fa-star-half-o","fa-star-o","fa-steam","fa-steam-square","fa-step-backward","fa-step-forward","fa-stethoscope","fa-sticky-note","fa-sticky-note-o","fa-stop","fa-stop-circle","fa-stop-circle-o","fa-street-view","fa-strikethrough","fa-stumbleupon","fa-stumbleupon-circle","fa-subscript","fa-subway","fa-suitcase","fa-sun-o","fa-superpowers","fa-superscript","fa-support","fa-table","fa-tablet","fa-tachometer","fa-tag","fa-tags","fa-tasks","fa-taxi","fa-telegram","fa-television","fa-tencent-weibo","fa-terminal","fa-text-height","fa-text-width","fa-th","fa-th-large","fa-th-list","fa-themeisle","fa-thermometer","fa-thermometer-0","fa-thermometer-1","fa-thermometer-2","fa-thermometer-3","fa-thermometer-4","fa-thermometer-empty","fa-thermometer-full","fa-thermometer-half","fa-thermometer-quarter","fa-thermometer-three-quarters","fa-thumb-tack","fa-thumbs-down","fa-thumbs-o-down","fa-thumbs-o-up","fa-thumbs-up","fa-ticket","fa-times","fa-times-circle","fa-times-circle-o","fa-times-rectangle","fa-times-rectangle-o","fa-tint","fa-toggle-down","fa-toggle-left","fa-toggle-off","fa-toggle-on","fa-toggle-right","fa-toggle-up","fa-trademark","fa-train","fa-transgender","fa-transgender-alt","fa-trash","fa-trash-o","fa-tree","fa-trello","fa-tripadvisor","fa-trophy","fa-truck","fa-try","fa-tty","fa-tumblr","fa-tumblr-square","fa-turkish-lira","fa-tv","fa-twitch","fa-twitter","fa-twitter-square","fa-umbrella","fa-underline","fa-undo","fa-universal-access","fa-university","fa-unlink","fa-unlock","fa-unlock-alt","fa-unsorted","fa-upload","fa-usb","fa-usd","fa-user","fa-user-circle","fa-user-circle-o","fa-user-md","fa-user-o","fa-user-plus","fa-user-secret","fa-user-times","fa-users","fa-vcard","fa-vcard-o","fa-venus","fa-venus-double","fa-venus-mars","fa-viacoin","fa-viadeo","fa-viadeo-square","fa-video-camera","fa-vimeo","fa-vimeo-square","fa-vine","fa-vk","fa-volume-control-phone","fa-volume-down","fa-volume-off","fa-volume-up","fa-warning","fa-wechat","fa-weibo","fa-weixin","fa-whatsapp","fa-wheelchair","fa-wheelchair-alt","fa-wifi","fa-wikipedia-w","fa-window-close","fa-window-close-o","fa-window-maximize","fa-window-minimize","fa-window-restore","fa-windows","fa-won","fa-wordpress","fa-wpbeginner","fa-wpexplorer","fa-wpforms","fa-wrench","fa-xing","fa-xing-square","fa-y-combinator","fa-y-combinator-square","fa-yahoo","fa-yc","fa-yc-square","fa-yelp","fa-yen","fa-yoast","fa-youtube","fa-youtube-play","fa-youtube-square"]}); \ No newline at end of file diff --git a/ext/phpbbstudio/aps/adm/style/js/jquery-ui-sortable.min.js b/ext/phpbbstudio/aps/adm/style/js/jquery-ui-sortable.min.js new file mode 100644 index 0000000..d434204 --- /dev/null +++ b/ext/phpbbstudio/aps/adm/style/js/jquery-ui-sortable.min.js @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.12.1 - 2019-01-17 +* http://jqueryui.com +* Includes: widget.js, data.js, scroll-parent.js, widgets/sortable.js, widgets/mouse.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.1";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var s=!1;t(document).on("mouseup",function(){s=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!s){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),s=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,s=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s} +},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}); \ No newline at end of file diff --git a/ext/phpbbstudio/aps/composer.json b/ext/phpbbstudio/aps/composer.json new file mode 100644 index 0000000..3036f0f --- /dev/null +++ b/ext/phpbbstudio/aps/composer.json @@ -0,0 +1,32 @@ +{ + "name": "phpbbstudio/aps", + "type": "phpbb-extension", + "description": "A fully integrated and extendable points extension for the phpBB Forum Software.", + "homepage": "https://www.phpbbstudio.com", + "version": "1.0.6-RC", + "time": "2020-03-11", + "license": "GPL-2.0-only", + "authors": [ + { + "name": "phpBB Studio", + "email": "info@phpbbstudio.com", + "homepage": "https://www.phpbbstudio.com", + "role": "Lead Developer" + } + ], + "require": { + "php": ">=5.5.0", + "composer/installers": "~1.0" + }, + "extra": { + "display-name": "phpBB Studio - Advanced Points System", + "soft-require": { + "phpbb/phpbb": ">=3.2.8,<4.0.0@dev" + }, + "version-check": { + "host": "3d-i.github.io", + "directory": "/site/vchecks", + "filename": "advpoints.json" + } + } +} diff --git a/ext/phpbbstudio/aps/config/actions.yml b/ext/phpbbstudio/aps/config/actions.yml new file mode 100644 index 0000000..284842e --- /dev/null +++ b/ext/phpbbstudio/aps/config/actions.yml @@ -0,0 +1,139 @@ +services: + # Service collection + phpbbstudio.aps.actions_collection: + class: phpbb\di\ordered_service_collection + arguments: + - '@service_container' + tags: + - { name: service_collection, tag: phpbbstudio.aps.action } + + # Base class + phpbbstudio.aps.action.base: + abstract: true + + # GLOBAL + phpbbstudio.aps.action.pm: + class: phpbbstudio\aps\actions\type\pm + shared: false + arguments: + - '@config' + - '@text_formatter.utils' + - '%phpbbstudio.aps.constants%' + tags: + - { name: phpbbstudio.aps.action, order: -4 } + + phpbbstudio.aps.action.birthday: + class: phpbbstudio\aps\actions\type\birthday + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -3 } + + phpbbstudio.aps.action.register: + class: phpbbstudio\aps\actions\type\register + shared: false + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.warn: + class: phpbbstudio\aps\actions\type\warn + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -1 } + + # LOCAL - Topic + phpbbstudio.aps.action.topic: + class: phpbbstudio\aps\actions\type\topic + shared: false + arguments: + - '@config' + - '@text_formatter.utils' + - '%phpbbstudio.aps.constants%' + tags: + - { name: phpbbstudio.aps.action, order: -4 } + + # LOCAL - Post + phpbbstudio.aps.action.post: + class: phpbbstudio\aps\actions\type\post + shared: false + arguments: + - '@config' + - '@text_formatter.utils' + - '%phpbbstudio.aps.constants%' + tags: + - { name: phpbbstudio.aps.action, order: -3 } + + # LOCAL - Moderate + phpbbstudio.aps.action.copy: + class: phpbbstudio\aps\actions\type\copy + shared: false + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.change: + class: phpbbstudio\aps\actions\type\change + shared: false + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.delete: + class: phpbbstudio\aps\actions\type\delete + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.edit: + class: phpbbstudio\aps\actions\type\edit + shared: false + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.lock: + class: phpbbstudio\aps\actions\type\lock + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.merge: + class: phpbbstudio\aps\actions\type\merge + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -2 } + + phpbbstudio.aps.action.move: + class: phpbbstudio\aps\actions\type\move + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -1 } + + phpbbstudio.aps.action.queue: + class: phpbbstudio\aps\actions\type\queue + shared: false + arguments: + - '@user' + tags: + - { name: phpbbstudio.aps.action, order: -1 } + + phpbbstudio.aps.action.topic_type: + class: phpbbstudio\aps\actions\type\topic_type + shared: false + tags: + - { name: phpbbstudio.aps.action, order: -1 } + + # LOCAL - Misc. + phpbbstudio.aps.action.vote: + class: phpbbstudio\aps\actions\type\vote + shared: false + tags: + - { name: phpbbstudio.aps.action, order: 0 } diff --git a/ext/phpbbstudio/aps/config/constants.yml b/ext/phpbbstudio/aps/config/constants.yml new file mode 100644 index 0000000..b13b998 --- /dev/null +++ b/ext/phpbbstudio/aps/config/constants.yml @@ -0,0 +1,21 @@ +parameters: + phpbbstudio.aps.constants: + ignore: + none: 0 + both: 1 + words: 2 + chars: 3 + locations: + navbar_header_quick_links_before: 1 + navbar_header_quick_links_after: 2 + navbar_header_user_profile_prepend: 4 + navbar_header_user_profile_append: 8 + navbar_header_profile_list_before: 16 + navbar_header_profile_list_after: 32 + overall_header_navigation_prepend: 64 + overall_header_navigation_append: 128 + overall_footer_breadcrumb_append: 256 + overall_footer_timezone_before: 512 + overall_footer_timezone_after: 1024 + overall_footer_teamlink_before: 2048 + overall_footer_teamlink_after: 4096 diff --git a/ext/phpbbstudio/aps/config/parameters.yml b/ext/phpbbstudio/aps/config/parameters.yml new file mode 100644 index 0000000..524814e --- /dev/null +++ b/ext/phpbbstudio/aps/config/parameters.yml @@ -0,0 +1,5 @@ +parameters: + phpbbstudio.aps.tables.display: '%core.table_prefix%aps_display' + phpbbstudio.aps.tables.logs: '%core.table_prefix%aps_logs' + phpbbstudio.aps.tables.points: '%core.table_prefix%aps_points' + phpbbstudio.aps.tables.reasons: '%core.table_prefix%aps_reasons' diff --git a/ext/phpbbstudio/aps/config/routing.yml b/ext/phpbbstudio/aps/config/routing.yml new file mode 100644 index 0000000..65020ed --- /dev/null +++ b/ext/phpbbstudio/aps/config/routing.yml @@ -0,0 +1,17 @@ +phpbbstudio_aps_display_pagination: + path: /aps/{page}/page-{pagination} + defaults: + _controller: phpbbstudio.aps.controller.main:display + page: overview + requirements: + page: "^((?!shop|inventory|purchase).)*$" + pagination: \d+ + +phpbbstudio_aps_display: + path: /aps/{page} + defaults: + _controller: phpbbstudio.aps.controller.main:display + page: overview + pagination: 1 + requirements: + page: "^((?!shop|inventory|purchase).)*$" diff --git a/ext/phpbbstudio/aps/config/services.yml b/ext/phpbbstudio/aps/config/services.yml new file mode 100644 index 0000000..588a9de --- /dev/null +++ b/ext/phpbbstudio/aps/config/services.yml @@ -0,0 +1,73 @@ +imports: + - { resource: actions.yml } + - { resource: constants.yml } + - { resource: parameters.yml } + - { resource: services_controllers.yml } + - { resource: services_core.yml } + - { resource: services_listeners.yml } + +services: + phpbbstudio.aps.manager: + class: phpbbstudio\aps\actions\manager + arguments: + - '@phpbbstudio.aps.actions_collection' + - '@phpbbstudio.aps.distributor' + - '@phpbbstudio.aps.functions' + - '@language' + - '@log' + - '@phpbbstudio.aps.valuator' + - '@user' + + phpbbstudio.aps.blockader: + class: phpbbstudio\aps\points\blockader + arguments: + - '@dbal.conn' + - '%phpbbstudio.aps.tables.display%' + + phpbbstudio.aps.distributor: + class: phpbbstudio\aps\points\distributor + arguments: + - '@config' + - '@dbal.conn' + - '@dispatcher' + - '@phpbbstudio.aps.functions' + - '@phpbbstudio.aps.log' + - '@user' + - '@phpbbstudio.aps.valuator' + + phpbbstudio.aps.reasoner: + class: phpbbstudio\aps\points\reasoner + arguments: + - '@dbal.conn' + - '%phpbbstudio.aps.tables.reasons%' + + phpbbstudio.aps.valuator: + class: phpbbstudio\aps\points\valuator + arguments: + - '@dbal.conn' + - '@phpbbstudio.aps.functions' + - '@user' + - '%phpbbstudio.aps.tables.points%' + + phpbbstudio.aps.birthday: + class: phpbbstudio\aps\cron\task\birthday + arguments: + - '@config' + - '@dbal.conn' + - '@phpbbstudio.aps.functions' + - '@phpbbstudio.aps.manager' + calls: + - [set_name, [phpbbstudio.aps.cron.task.birthday]] + tags: + - { name: cron.task } + + phpbbstudio.aps.notification.type.adjust: + class: phpbbstudio\aps\notification\type\adjust + shared: false # service MUST not be shared for this to work! + parent: notification.type.base + calls: + - [set_auth, ['@auth']] + - [set_controller_helper, ['@controller.helper']] + - [set_user_loader, ['@user_loader']] + tags: + - { name: notification.type } diff --git a/ext/phpbbstudio/aps/config/services_controllers.yml b/ext/phpbbstudio/aps/config/services_controllers.yml new file mode 100644 index 0000000..1ce02d7 --- /dev/null +++ b/ext/phpbbstudio/aps/config/services_controllers.yml @@ -0,0 +1,58 @@ +services: + phpbbstudio.aps.controller.acp: + class: phpbbstudio\aps\controller\acp_controller + arguments: + - '@phpbbstudio.aps.acp' + - '@auth' + - '@phpbbstudio.aps.blockader' + - '@config' + - '@phpbbstudio.aps.controller.main' + - '@dbal.conn' + - '@dispatcher' + - '@phpbbstudio.aps.functions' + - '@language' + - '@log' + - '@phpbbstudio.aps.log' + - '@pagination' + - '@phpbbstudio.aps.reasoner' + - '@request' + - '@template' + - '@user' + + phpbbstudio.aps.controller.mcp: + class: phpbbstudio\aps\controller\mcp_controller + arguments: + - '@auth' + - '@config' + - '@dbal.conn' + - '@dispatcher' + - '@phpbbstudio.aps.distributor' + - '@phpbbstudio.aps.functions' + - '@group_helper' + - '@language' + - '@phpbbstudio.aps.log' + - '@notification_manager' + - '@pagination' + - '@phpbbstudio.aps.reasoner' + - '@request' + - '@template' + - '@user' + - '@phpbbstudio.aps.valuator' + - '%core.root_path%' + - '%core.php_ext%' + + phpbbstudio.aps.controller.main: + class: phpbbstudio\aps\controller\main_controller + arguments: + - '@auth' + - '@phpbbstudio.aps.blockader' + - '@phpbbstudio.aps.blocks' + - '@dispatcher' + - '@phpbbstudio.aps.functions' + - '@controller.helper' + - '@language' + - '@request' + - '@template' + - '@user' + - '%core.root_path%' + - '%core.php_ext%' diff --git a/ext/phpbbstudio/aps/config/services_core.yml b/ext/phpbbstudio/aps/config/services_core.yml new file mode 100644 index 0000000..6dd6266 --- /dev/null +++ b/ext/phpbbstudio/aps/config/services_core.yml @@ -0,0 +1,78 @@ +services: + phpbbstudio.aps.acp: + class: phpbbstudio\aps\core\acp + arguments: + - '@phpbbstudio.aps.functions' + - '@template' + - '@phpbbstudio.aps.actions_collection' + - '@phpbbstudio.aps.valuator' + + phpbbstudio.aps.blocks: + class: phpbbstudio\aps\core\blocks + arguments: + - '@auth' + - '@config' + - '@dbal.conn' + - '@phpbbstudio.aps.dbal' + - '@phpbbstudio.aps.functions' + - '@group_helper' + - '@controller.helper' + - '@language' + - '@phpbbstudio.aps.log' + - '@pagination' + - '@request' + - '@template' + - '@user' + - '%core.root_path%' + - '%core.php_ext%' + - '%phpbbstudio.aps.tables.logs%' + + phpbbstudio.aps.dbal: + class: phpbbstudio\aps\core\dbal + arguments: + - '@dbal.conn' + + phpbbstudio.aps.functions: + class: phpbbstudio\aps\core\functions + arguments: + - '@auth' + - '@config' + - '@dbal.conn' + - '@ext.manager' + - '@language' + - '@path_helper' + - '@request' + - '@user' + - '%core.table_prefix%' + - '%phpbbstudio.aps.constants%' + + phpbbstudio.aps.language: + class: phpbbstudio\aps\core\language + arguments: + - '@config' + - '@language' + - '@ext.manager' + - '@user' + - '%core.php_ext%' + + phpbbstudio.aps.log: + class: phpbbstudio\aps\core\log + arguments: + - '@auth' + - '@config' + - '@dbal.conn' + - '@phpbbstudio.aps.functions' + - '@language' + - '@phpbbstudio.aps.language' + - '@user' + - '%phpbbstudio.aps.tables.logs%' + - '%core.root_path%' + - '%core.adm_relative_path%' + - '%core.php_ext%' + + phpbbstudio.aps.template: + class: phpbbstudio\aps\core\template + arguments: + - '@phpbbstudio.aps.functions' + tags: + - { name: twig.extension } diff --git a/ext/phpbbstudio/aps/config/services_listeners.yml b/ext/phpbbstudio/aps/config/services_listeners.yml new file mode 100644 index 0000000..026e4a9 --- /dev/null +++ b/ext/phpbbstudio/aps/config/services_listeners.yml @@ -0,0 +1,67 @@ +services: + phpbbstudio.aps.listener.acp: + class: phpbbstudio\aps\event\acp + arguments: + - '@phpbbstudio.aps.acp' + - '@auth' + - '@config' + - '@phpbbstudio.aps.functions' + - '@controller.helper' + - '@language' + - '@log' + - '@phpbbstudio.aps.log' + - '@request' + - '@template' + - '@user' + tags: + - { name: event.listener } + + phpbbstudio.aps.listener.actions: + class: phpbbstudio\aps\event\actions + arguments: + - '@auth' + - '@config' + - '@phpbbstudio.aps.functions' + - '@phpbbstudio.aps.manager' + - '@request' + - '@user' + - '%core.root_path%' + - '%core.php_ext%' + tags: + - { name: event.listener } + + phpbbstudio.aps.listener.check: + class: phpbbstudio\aps\event\check + arguments: + - '@config' + - '@phpbbstudio.aps.functions' + - '@language' + - '@template' + - '@user' + - '@phpbbstudio.aps.valuator' + tags: + - { name: event.listener } + + phpbbstudio.aps.listener.display: + class: phpbbstudio\aps\event\display + arguments: + - '@phpbbstudio.aps.functions' + - '@controller.helper' + - '@language' + - '@template' + - '%core.php_ext%' + tags: + - { name: event.listener } + + phpbbstudio.aps.listener.modules: + class: phpbbstudio\aps\event\modules + arguments: + - '@phpbbstudio.aps.functions' + - '@language' + tags: + - { name: event.listener } + + phpbbstudio.aps.listener.permissions: + class: phpbbstudio\aps\event\permissions + tags: + - { name: event.listener } diff --git a/ext/phpbbstudio/aps/controller/acp_controller.php b/ext/phpbbstudio/aps/controller/acp_controller.php new file mode 100644 index 0000000..5e228f1 --- /dev/null +++ b/ext/phpbbstudio/aps/controller/acp_controller.php @@ -0,0 +1,940 @@ +acp = $acp; + $this->auth = $auth; + $this->blockader = $blockader; + $this->config = $config; + $this->controller = $controller; + $this->db = $db; + $this->dispatcher = $dispatcher; + $this->functions = $functions; + $this->language = $language; + $this->log_phpbb = $log_phpbb; + $this->log = $log; + $this->pagination = $pagination; + $this->reasoner = $reasoner; + $this->request = $request; + $this->template = $template; + $this->user = $user; + } + + /** + * Handle ACP settings. + * + * @return void + * @access public + */ + public function settings() + { + $this->log->load_lang(); + $this->language->add_lang('aps_acp_common', 'phpbbstudio/aps'); + + $errors = []; + $submit = $this->request->is_set_post('submit'); + $form_key = 'aps_settings'; + add_form_key($form_key); + + if ($action = $this->request->variable('action', '', true)) + { + switch ($action) + { + case 'copy': + $errors = $this->copy_points(); + break; + + case 'clean': + $this->clean_points(); + break; + + case 'locations': + $this->link_locations(); + break; + } + } + + $settings = [ + 'legend1' => 'GENERAL_OPTIONS', + 'aps_points_copy' => ['lang' => 'ACP_APS_POINTS_COPY_TITLE', 'type' => 'custom', 'method' => 'set_action', 'params' => ['copy']], + 'aps_points_clean' => ['lang' => 'ACP_APS_POINTS_CLEAN', 'type' => 'custom', 'method' => 'set_action', 'params' => ['clean']], + 'aps_points_safe_mode' => ['lang' => 'ACP_APS_POINTS_SAFE_MODE', 'type' => 'radio:enabled_disabled', 'validate' => 'bool', 'explain' => true], + 'legend2' => 'ACP_APS_POINTS_NAMES', + // Later inserted + 'legend3' => 'ACP_APS_FORMATTING', + 'aps_points_icon' => ['lang' => 'ACP_APS_POINTS_ICON', 'type' => 'text:0:100', 'append' => ''], + 'aps_points_icon_img' => ['lang' => 'ACP_APS_POINTS_ICON_IMG', 'validate' => 'string:0:255', 'type' => 'custom', 'method' => 'build_icon_image_select', 'explain' => true], + 'aps_points_icon_position' => ['lang' => 'ACP_APS_POINTS_ICON_POSITION', 'validate' => 'bool', 'type' => 'custom', 'method' => 'build_position_radio'], + 'aps_points_decimals' => ['lang' => 'ACP_APS_POINTS_DECIMALS', 'validate' => 'string', 'type' => 'select', 'method' => 'build_decimal_select'], + 'aps_points_separator_dec' => ['lang' => 'ACP_APS_SEPARATOR_DEC', 'validate' => 'string', 'type' => 'select', 'method' => 'build_separator_select', 'params' => ['{CONFIG_VALUE}']], + 'aps_points_separator_thou' => ['lang' => 'ACP_APS_SEPARATOR_THOU', 'validate' => 'string', 'type' => 'select', 'method' => 'build_separator_select'], + 'legend4' => 'GENERAL_SETTINGS', + 'aps_link_locations' => ['lang' => 'ACP_APS_LOCATIONS', 'type' => 'custom', 'method' => 'set_action', 'params' => ['locations', false], 'explain' => true], + 'aps_points_display_profile' => ['lang' => 'ACP_APS_POINTS_DISPLAY_PROFILE', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'aps_points_display_post' => ['lang' => 'ACP_APS_POINTS_DISPLAY_POST', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'aps_points_display_pm' => ['lang' => 'ACP_APS_POINTS_DISPLAY_PM', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'aps_points_min' => ['lang' => 'ACP_APS_POINTS_MIN', 'type' => 'number', 'validate' => 'string', 'explain' => true], // Validate as string to make sure it does not default to 0 + 'aps_points_max' => ['lang' => 'ACP_APS_POINTS_MAX', 'type' => 'number', 'validate' => 'string', 'explain' => true], + 'aps_actions_per_page' => ['lang' => 'ACP_APS_POINTS_PER_PAGE', 'type' => 'number:10:100', 'validate' => 'number:10:100', 'explain' => true], + 'aps_points_exclude_words' => ['lang' => 'ACP_APS_POINTS_EXCLUDE_WORDS', 'type' => 'number:0:10', 'validate' => 'number:0:10', 'explain' => true, 'append' => ' ' . $this->language->lang('ACP_APS_CHARACTERS')], + 'aps_points_exclude_chars' => ['lang' => 'ACP_APS_POINTS_EXCLUDE_CHARS', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'legend5' => 'ACP_APS_IGNORE_SETTINGS', + 'aps_ignore_criteria' => ['lang' => 'ACP_APS_IGNORE_CRITERIA', 'validate' => 'int:0:4', 'type' => 'custom', 'method' => 'build_ignore_criteria_radio', 'explain' => true], + 'aps_ignore_min_words' => ['lang' => 'ACP_APS_IGNORE_MIN_WORDS', 'type' => 'number:0:100', 'validate' => 'number:0:100', 'explain' => true], + 'aps_ignore_min_chars' => ['lang' => 'ACP_APS_IGNORE_MIN_CHARS', 'type' => 'number:0:200', 'validate' => 'number:0:200', 'explain' => true], + 'aps_ignore_excluded_words' => ['lang' => 'ACP_APS_IGNORE_EXCLUDED_WORDS', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'aps_ignore_excluded_chars' => ['lang' => 'ACP_APS_IGNORE_EXCLUDED_CHARS', 'type' => 'radio:yes_no', 'validate' => 'bool', 'explain' => true], + 'legend6' => 'ACP_APS_CHAIN_SETTINGS', + 'aps_chain_merge_delete' => ['lang' => 'ACP_APS_CHAIN_MERGE_DELETE', 'type' => 'radio:enabled_disabled', 'validate' => 'bool', 'explain' => true], + 'aps_chain_merge_move' => ['lang' => 'ACP_APS_CHAIN_MERGE_MOVE', 'type' => 'radio:enabled_disabled', 'validate' => 'bool', 'explain' => true], + 'aps_chain_warn_pm' => ['lang' => 'ACP_APS_CHAIN_WARN_PM', 'type' => 'radio:enabled_disabled', 'validate' => 'bool', 'explain' => true], + ]; + + $settings = phpbb_insert_config_array($settings, $this->build_point_names(), ['after' => 'legend2']); + + /** + * Event to add additional settings to the APS ACP settings page. + * + * @event phpbbstudio.aps.acp_settings + * @var array settings Available settings + * @since 1.0.0 + */ + $vars = ['settings']; + extract($this->dispatcher->trigger_event('phpbbstudio.aps.acp_settings', compact($vars))); + + $this->config_new = clone $this->config; + $settings_array = $submit ? $this->request->variable('config', ['' => '']) : $this->config_new; + + validate_config_vars($settings, $settings_array, $errors); + + if ($submit && !check_form_key($form_key)) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + if (!empty($errors)) + { + $submit = false; + } + + foreach ($settings as $config_name => $data) + { + if (!isset($settings_array[$config_name]) || strpos($config_name, 'legend') !== false) + { + continue; + } + + $this->config_new[$config_name] = $config_value = $settings_array[$config_name]; + + if ($submit) + { + $this->config->set($config_name, $config_value); + } + } + + if ($submit) + { + // Log the action + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_SETTINGS'); + + // Show success message + trigger_error($this->language->lang('ACP_APS_SETTINGS_SUCCESS') . adm_back_link($this->u_action)); + } + + foreach ($settings as $config_key => $setting) + { + if (!is_array($setting) && strpos($config_key, 'legend') === false) + { + continue; + } + + if (strpos($config_key, 'legend') !== false) + { + $this->template->assign_block_vars('settings', [ + 'CLASS' => str_replace(['acp_', '_'], ['', '-'], utf8_strtolower($setting)), + 'LEGEND' => $setting, + 'S_LEGEND' => true, + ]); + + continue; + } + + $type = explode(':', $setting['type']); + $content = build_cfg_template($type, $config_key, $this->config_new, $config_key, $setting); + + if (empty($content)) + { + continue; + } + + $booleans = ['yes_no', 'no_yes', 'enabled_disabled', 'disabled_enabled']; + if ($type[0] === 'radio' && !empty($type[1]) && in_array($type[1], $booleans)) + { + $yes = [$this->language->lang('YES'), $this->language->lang('ENABLED')]; + $no = [$this->language->lang('NO'), $this->language->lang('DISABLED')]; + $content = preg_replace( + ['/(' . implode('|', $yes) . ')/', '/(' . implode('|', $no) . ')/', '/class="radio"/'], + ['$1', '$1', 'class="radio aps-bool"'], + $content + ); + } + + $this->template->assign_block_vars('settings', [ + 'KEY' => $config_key, + 'CONTENT' => $content, + 'TITLE' => $setting['lang'], + 'S_EXPLAIN' => isset($setting['explain']) ? $setting['explain'] : false, + ]); + } + + $this->template->assign_vars([ + 'S_ERROR' => !empty($errors), + 'ERROR_MSG' => !empty($errors) ? implode('
', $errors) : '', + + 'U_ACTION' => $this->u_action, + ]); + } + + /** + * Handle ACP display. + * + * @return void + * @access public + */ + public function display() + { + $this->log->load_lang(); + $this->language->add_lang(['aps_acp_common', 'aps_display'], 'phpbbstudio/aps'); + + $errors = []; + + add_form_key('aps_display'); + + $blocks = $this->controller->get_page_blocks(); + $admin_blocks = $this->blockader->row($this->blockader->get_admin_id()); + $insert = empty($admin_blocks); + + if ($insert) + { + foreach ($blocks as $slug => $data) + { + $admin_blocks[$slug] = array_keys($data['blocks']); + } + } + + $admin_pages = array_keys($admin_blocks); + + foreach ($admin_pages as $slug) + { + if (empty($blocks[$slug])) + { + continue; + } + + $data = $blocks[$slug]; + + $this->template->assign_block_vars('aps_pages', [ + 'ID' => $slug, + 'TITLE' => $data['title'], + 'S_ACTIVE' => in_array($slug, $admin_pages), + ]); + + foreach ($data['blocks'] as $block_id => $block) + { + $this->template->assign_block_vars('aps_pages.blocks', [ + 'ID' => $block_id, + 'TITLE' => $block['title'], + 'S_ACTIVE' => isset($admin_blocks[$slug]) && in_array($block_id, $admin_blocks[$slug]), + ]); + } + } + + $submit = $this->request->is_set_post('submit'); + + $settings = [ + 'aps_display_top_change' => $this->request->variable('aps_display_top_change', (int) $this->config['aps_display_top_change']), + 'aps_display_top_count' => $this->request->variable('aps_display_top_count', (int) $this->config['aps_display_top_count']), + 'aps_display_adjustments' => $this->request->variable('aps_display_adjustments', (int) $this->config['aps_display_adjustments']), + 'aps_display_graph_time' => $this->request->variable('aps_display_graph_time', (int) $this->config['aps_display_graph_time']), + ]; + + /** + * Event to handle additional settings for the APS ACP display page. + * + * @event phpbbstudio.aps.acp_display + * @var array settings Available settings + * @var array errors Any errors that may have occurred + * @var bool submit Whether or not the form was submitted + * @since 1.0.2 + */ + $vars = ['settings', 'errors', 'submit']; + extract($this->dispatcher->trigger_event('phpbbstudio.aps.acp_display', compact($vars))); + + if ($submit) + { + if (!check_form_key('aps_display')) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + $display_blocks = $this->request->variable('aps_blocks', ['' => ['']]); + + if (empty($errors)) + { + // Set the settings + foreach ($settings as $name => $value) + { + if ($this->config[$name] != $value) + { + $this->config->set($name, $value); + } + } + + foreach ($display_blocks as $key => $array) + { + $display_blocks[$key] = array_filter($array); + } + + // Set the blocks + $this->blockader->set_blocks($this->blockader->get_admin_id(), $display_blocks, $insert); + + // Log the action + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_DISPLAY'); + + // Show success message + trigger_error($this->language->lang('ACP_APS_DISPLAY_SUCCESS') . adm_back_link($this->u_action)); + } + } + + foreach ($settings as $name => $value) + { + $this->template->assign_var(utf8_strtoupper($name), $value); + } + + $this->template->assign_vars([ + 'S_ERROR' => !empty($errors), + 'ERROR_MSG' => !empty($errors) ? implode('
', $errors) : '', + + 'U_ACTION' => $this->u_action, + ]); + } + + /** + * Handle ACP points and reasons. + * + * @return void + * @access public + */ + public function points() + { + $this->log->load_lang(); + $this->language->add_lang('aps_acp_common', 'phpbbstudio/aps'); + + $errors = []; + $action = $this->request->variable('action', ''); + $submit = $this->request->is_set_post('submit'); + + $form_name = 'acp_aps_points'; + add_form_key($form_name); + + if ( + (!$this->auth->acl_get('a_aps_points') && !$this->auth->acl_get('a_aps_reasons')) + || (!empty($action) && !$this->auth->acl_get('a_aps_reasons')) + ) + { + trigger_error('NOT_AUTHORISED', E_USER_WARNING); + } + + switch ($action) + { + case 'add': + case 'edit': + $reason_id = (int) $this->request->variable('r', 0); + + $reason = $this->reasoner->row($reason_id); + $reason = $this->reasoner->fill($reason); + + $reason['reason_title'] = $this->request->variable('title', (string) $reason['reason_title'] , true); + $reason['reason_desc'] = $this->request->variable('description', (string) $reason['reason_desc'], true); + $reason['reason_points'] = $this->request->variable('points', (double) $reason['reason_points']); + + if ($submit) + { + if (!check_form_key($form_name)) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + if (empty($reason['reason_title']) || strlen($reason['reason_title']) > 255) + { + $errors[] = $this->language->lang('ACP_APS_REASON_EMPTY_SUBJECT'); + } + + $reason_points_to_check = round($reason['reason_points'], 2); + + if (empty($reason_points_to_check)) + { + $errors[] = $this->language->lang('ACP_APS_REASON_EMPTY_POINTS', $this->functions->get_name()); + } + + if (empty($errors)) + { + if ($action === 'add') + { + $this->reasoner->insert($reason); + } + else + { + $this->reasoner->update($reason, $reason_id); + } + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_REASON_' . utf8_strtoupper($action)); + + trigger_error($this->language->lang('ACP_APS_REASON_SAVED') . adm_back_link($this->u_action)); + } + } + + $this->template->assign_vars([ + 'REASON_TITLE' => $reason['reason_title'], + 'REASON_DESC' => $reason['reason_desc'], + 'REASON_POINTS' => $reason['reason_points'], + ]); + break; + + case 'delete': + $reason_id = (int) $this->request->variable('r', 0); + + if (confirm_box(true)) + { + $this->reasoner->delete($reason_id); + + $json_response = new \phpbb\json_response; + $json_response->send([ + 'SUCCESS' => true, + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_REASON_DELETE_SUCCESS'), + ]); + } + else + { + confirm_box(false, 'ACP_APS_REASON_DELETE', build_hidden_fields([ + 'submit' => $submit, + 'action' => $action, + ])); + } + break; + + case 'move': + $reason_id = $this->request->variable('r', 0); + $dir = $this->request->variable('dir', ''); + + $this->reasoner->order($reason_id, $dir); + + $json_response = new \phpbb\json_response; + $json_response->send([ + 'success' => true, + ]); + break; + + default: + if ($this->auth->acl_get('a_aps_points')) + { + $this->acp->build(); + + if ($submit) + { + if (!check_form_key($form_name)) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + if (empty($errors)) + { + $values = $this->request->variable('aps_values', ['' => 0.00]); + + $this->acp->set_points($values); + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_POINTS', time(), [$this->functions->get_name()]); + + trigger_error($this->language->lang('ACP_APS_POINTS_SUCCESS', $this->functions->get_name()) . adm_back_link($this->u_action)); + } + } + } + + if ($this->auth->acl_get('a_aps_points')) + { + $rowset = $this->reasoner->rowset(); + + foreach ($rowset as $row) + { + $this->template->assign_block_vars('aps_reasons', [ + 'ID' => (int) $row['reason_id'], + 'TITLE' => (string) $row['reason_title'], + 'DESC' => (string) $row['reason_desc'], + 'POINTS' => (double) $row['reason_points'], + + 'U_DELETE' => $this->u_action . '&action=delete&r=' . (int) $row['reason_id'], + 'U_EDIT' => $this->u_action . '&action=edit&r=' . (int) $row['reason_id'], + 'U_MOVE_UP' => $this->u_action . '&action=move&dir=up&r=' . (int) $row['reason_id'], + 'U_MOVE_DOWN' => $this->u_action . '&action=move&dir=down&r=' . (int) $row['reason_id'], + ]); + } + + $this->template->assign_vars([ + 'U_APS_REASON_ADD' => $this->u_action . '&action=add', + ]); + } + break; + } + + $s_errors = (bool) count($errors); + + $this->template->assign_vars([ + 'S_ERRORS' => $s_errors, + 'ERROR_MSG' => $s_errors ? implode('
', $errors) : '', + + 'APS_TITLE' => $action ? $this->language->lang('ACP_APS_REASON_' . utf8_strtoupper($action)) : $this->functions->get_name(), + + 'S_APS_ACTION' => $action, + 'S_APS_POINTS' => $this->auth->acl_get('a_aps_points'), + 'S_APS_REASONS' => $this->auth->acl_get('a_aps_reasons'), + + 'U_APS_ACTION' => $this->u_action . ($action ? "&action={$action}" : '') . (!empty($reason_id) ? "&r={$reason_id}" : ''), + ]); + } + + /** + * Handle ACP logs. + * + * @return void + * @access public + */ + public function logs() + { + $this->log->load_lang(); + $this->language->add_lang('aps_acp_common', 'phpbbstudio/aps'); + + // Set up general vars + $start = $this->request->variable('start', 0); + $forum_id = $this->request->variable('f', ''); + $topic_id = $this->request->variable('t', 0); + $post_id = $this->request->variable('p', 0); + $user_id = $this->request->variable('u', 0); + $reportee_id = $this->request->variable('r', 0); + + $delete_mark = $this->request->variable('del_marked', false, false, \phpbb\request\request_interface::POST); + $delete_all = $this->request->variable('del_all', false, false, \phpbb\request\request_interface::POST); + $marked = $this->request->variable('mark', [0]); + + // Sort keys + $sort_days = $this->request->variable('st', 0); + $sort_key = $this->request->variable('sk', 't'); + $sort_dir = $this->request->variable('sd', 'd'); + + // Keywords + $keywords = $this->request->variable('keywords', '', true); + $keywords_param = !empty($keywords) ? '&keywords=' . urlencode(htmlspecialchars_decode($keywords)) : ''; + + if (($delete_mark || $delete_all)) + { + if (confirm_box(true)) + { + $conditions = []; + + if ($delete_mark && count($marked)) + { + $conditions['log_id'] = ['IN' => $marked]; + } + + if ($delete_all) + { + if ($sort_days) + { + $conditions['log_time'] = ['>=', time() - ($sort_days * 86400)]; + } + + $conditions['keywords'] = $keywords; + } + + $this->log->delete($conditions); + + $plural = $delete_all ? 2 : count($marked); + $log_action = 'LOG_ACP_APS_LOGS_' . $delete_all ? 'CLEARED' : 'DELETED'; + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, $log_action, time(), [$this->functions->get_name()]); + + trigger_error($this->language->lang('ACP_APS_LOGS_DELETED', $plural) . adm_back_link($this->u_action)); + } + else + { + confirm_box(false, $this->language->lang('CONFIRM_OPERATION'), build_hidden_fields([ + 'f' => $forum_id, + 'start' => $start, + 'del_marked' => $delete_mark, + 'del_all' => $delete_all, + 'mark' => $marked, + 'st' => $sort_days, + 'sk' => $sort_key, + 'sd' => $sort_dir, + ])); + } + } + + $name = $this->functions->get_name(); + $limit = $this->config['aps_actions_per_page']; + + // Sorting + $limit_days = [ + 0 => $this->language->lang('ALL_ENTRIES'), + 1 => $this->language->lang('1_DAY'), + 7 => $this->language->lang('7_DAYS'), + 14 => $this->language->lang('2_WEEKS'), + 30 => $this->language->lang('1_MONTH'), + 90 => $this->language->lang('3_MONTHS'), + 180 => $this->language->lang('6_MONTHS'), + 365 => $this->language->lang('1_YEAR'), + ]; + $sort_by_text = [ + 'a' => $this->language->lang('SORT_ACTION'), + 'ps' => $name, + 'pn' => $this->language->lang('APS_POINTS_NEW', $name), + 'po' => $this->language->lang('APS_POINTS_OLD', $name), + 'uu' => $this->language->lang('SORT_USERNAME'), + 'ru' => ucfirst($this->language->lang('FROM')), + 't' => $this->language->lang('SORT_DATE'), + ]; + $sort_by_sql = [ + 'a' => 'l.log_action', + 'ps' => 'l.points_sum', + 'pn' => 'l.points_new', + 'po' => 'l.points_old', + 'uu' => 'u.username', + 'ru' => 'r.username', + 't' => 'l.log_time', + ]; + + $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; + gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param); + + // Define where and sort sql for use in displaying logs + $sql_time = ($sort_days) ? (time() - ($sort_days * 86400)) : 0; + $sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); + + $rowset = $this->log->get(true, $limit, $start, $forum_id, $topic_id, $post_id, $user_id, $reportee_id, $sql_time, $sql_sort, $keywords); + $start = $this->log->get_valid_offset(); + $total = $this->log->get_log_count(); + + $base_url = $this->u_action . "&$u_sort_param$keywords_param"; + $this->pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $limit, $start); + + foreach ($rowset as $row) + { + $this->template->assign_block_vars('logs', array_change_key_case($row, CASE_UPPER)); + } + + $this->template->assign_vars([ + 'U_ACTION' => $this->u_action . "&$u_sort_param$keywords_param&start=$start", + + 'S_LIMIT_DAYS' => $s_limit_days, + 'S_SORT_KEY' => $s_sort_key, + 'S_SORT_DIR' => $s_sort_dir, + 'S_KEYWORDS' => $keywords, + ]); + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return acp_controller $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } + + /** + * Build a settings array for point names for all installed languages. + * + * @return array $names Array of localised point name settings + * @access protected + */ + protected function build_point_names() + { + $names = []; + + $sql = 'SELECT * FROM ' . LANG_TABLE . ' ORDER BY lang_english_name'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $name['aps_points_name_' . $row['lang_iso']] = ['lang' =>$row['lang_english_name'], 'validate' => 'string:0:100', 'type' => 'text:0:100']; + + $names = $row['lang_iso'] === $this->config['default_lang'] ? $name + $names : array_merge($names, $name); + } + $this->db->sql_freeresult($result); + + // Only add the 'expand view' if there are multiple language installed + if (count($names) > 1) + { + // Get the first array key + $key = array_keys($names)[0]; + + // The 'expand view' HTML string + $expand = '' . $this->language->lang('EXPAND_VIEW') . ''; + + $names[$key]['append'] = $expand; + } + + return $names; + } + + /** + * Handle the copy action from the settings page. + * + * @return array Array filled with errors + * @access protected + */ + protected function copy_points() + { + $json_response = new \phpbb\json_response; + + add_form_key('aps_points_copy'); + + if ($this->request->is_set_post('submit_copy')) + { + $errors = []; + + $from = $this->request->variable('aps_forums_from', 0); + $to = $this->request->variable('aps_forums_to', [0]); + + if (empty($from) || empty($to)) + { + $errors[] = $this->language->lang('ACP_APS_POINTS_COPY_EMPTY'); + } + + if (!check_form_key('aps_points_copy')) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + if ($errors) + { + if ($this->request->is_ajax()) + { + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('ERROR'), + 'MESSAGE_TEXT' => implode('
', $errors), + ]); + } + else + { + return $errors; + } + } + else + { + $this->acp->copy_multiple($from, $to); + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_COPIED', time(), [$this->functions->get_name()]); + + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_POINTS_COPY_SUCCESS', $this->functions->get_name()), + ]); + + trigger_error($this->language->lang('ACP_APS_POINTS_COPY_SUCCESS', $this->functions->get_name()) . adm_back_link($this->u_action)); + } + } + + $this->template->set_filenames(['copy' => '@phpbbstudio_aps/aps_points_copy.html']); + + $this->template->assign_vars([ + 'S_APS_COPY' => true, + 'S_APS_FORUMS' => make_forum_select(), + 'U_APS_ACTION_COPY' => $this->u_action . '&action=copy', + ]); + + if ($this->request->is_ajax()) + { + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('ACP_APS_POINTS_COPY_TITLE', $this->functions->get_name()), + 'MESSAGE_TEXT' => $this->template->assign_display('copy'), + ]); + } + + return []; + } + + /** + * Handles the clean action from the settings page. + * + * @return void + * @access protected + */ + protected function clean_points() + { + if (confirm_box(true)) + { + $this->acp->clean_points(); + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_CLEANED', time(), [$this->functions->get_name()]); + + $json_response = new \phpbb\json_response; + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_POINTS_CLEAN_SUCCESS', $this->functions->get_name()), + ]); + } + else + { + confirm_box(false, $this->language->lang('ACP_APS_POINTS_CLEAN_CONFIRM', $this->functions->get_name()), build_hidden_fields([ + 'action' => 'clean', + ])); + } + } + + /** + * Handles the link locations from the settings page. + * + * @return void + * @access protected + */ + protected function link_locations() + { + $locations = $this->functions->get_link_locations(); + $variables = ['S_APS_LOCATIONS' => true]; + + foreach ($locations as $location => $status) + { + $variables[$location] = (bool) $status; + } + + $this->template->assign_vars($variables); + + if ($this->request->is_set_post('submit_locations')) + { + $links = []; + + foreach (array_keys($locations) as $location) + { + $links[$location] = $this->request->variable((string) $location, false); + } + + $this->functions->set_link_locations($links); + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->data['user_ip'], 'LOG_ACP_APS_LOCATIONS'); + + trigger_error($this->language->lang('ACP_APS_LOCATIONS_SUCCESS') . adm_back_link($this->u_action)); + } + } +} diff --git a/ext/phpbbstudio/aps/controller/main_controller.php b/ext/phpbbstudio/aps/controller/main_controller.php new file mode 100644 index 0000000..23a1cda --- /dev/null +++ b/ext/phpbbstudio/aps/controller/main_controller.php @@ -0,0 +1,578 @@ +auth = $auth; + $this->blockader = $blockader; + $this->blocks = $blocks; + $this->dispatcher = $dispatcher; + $this->functions = $functions; + $this->helper = $helper; + $this->language = $language; + $this->request = $request; + $this->template = $template; + $this->user = $user; + $this->root_path = $root_path; + $this->php_ext = $php_ext; + + $this->name = $functions->get_name(); + } + + /** + * Display the points page. + * + * @param string $page The page slug + * @param int $pagination The page number for pagination + * @return Response + * @access public + */ + public function display($page, $pagination) + { + $this->language->add_lang('aps_display', 'phpbbstudio/aps'); + + $this->page = $page; + + // Load page blocks + $this->get_page_blocks($pagination); + + // Load admin and user blocks + $this->get_admin_user_blocks(); + + // Check existance + if ($msg = $this->check_existance()) + { + return $msg; + } + + // Check authorisation + if ($msg = $this->check_auth()) + { + return $msg; + } + + // Handle any action + $this->handle_action(); + + foreach ($this->admin_blocks as $slug => $admin_blocks) + { + if (empty($admin_blocks)) + { + continue; + } + + $data = $this->page_blocks[$slug]; + + // Only list pages that the user is authorised to see + if (!isset($data['auth']) || $data['auth']) + { + $this->template->assign_block_vars('aps_navbar', [ + 'TITLE' => $data['title'], + 'S_ACTIVE' => $this->page === $slug, + 'U_VIEW' => $this->helper->route('phpbbstudio_aps_display', ['page' => $slug]), + ]); + } + } + + $called_functions = []; + + $blocks = array_keys($this->page_blocks[$this->page]['blocks']); + $blocks = empty($this->user_blocks[$this->page]) ? $blocks : array_unique(array_merge($this->user_blocks[$this->page], $blocks)); + + foreach ($blocks as $block_id) + { + // If the block is no longer available, remove it from the user blocks + if (empty($this->page_blocks[$this->page]['blocks'][$block_id])) + { + $this->delete_block($block_id); + + continue; + } + + // If it's disabled by the admin, do not display it + if (!in_array($block_id, $this->admin_blocks[$this->page])) + { + continue; + } + + $block = $this->page_blocks[$this->page]['blocks'][$block_id]; + + // Only show blocks that the user is authorised to see + if (!isset($block['auth']) || $block['auth']) + { + if (empty($this->user_blocks[$this->page]) || in_array($block_id, $this->user_blocks[$this->page])) + { + if (!empty($block['function']) && !in_array($block['function'], $called_functions)) + { + $called_functions[] = $this->call_function($block_id, $block); + } + + $this->template->assign_block_vars('aps_blocks', $this->build_display($block_id, $block)); + } + else + { + $this->template->assign_block_vars('aps_blocks_add', ['item' => $this->build_list($block_id, $block)]); + } + } + } + + // Purge temporary variable + unset($called_functions); + + // Output template variables for display + $this->template->assign_vars([ + 'S_APS_DAE_ENABLED' => $this->functions->is_dae_enabled(), + 'S_APS_OVERVIEW' => true, + 'U_APS_ACTION_SORT' => $this->helper->route('phpbbstudio_aps_display', ['page' => $page, 'aps_action' => 'move']), + 'U_MCP' => ($this->auth->acl_get('m_') || $this->auth->acl_getf_global('m_')) ? append_sid("{$this->root_path}mcp.{$this->php_ext}", 'i=-phpbbstudio-aps-mcp-main_module&mode=front', true, $this->user->session_id) : '', + ]); + + // Breadcrumbs + $this->template->assign_block_vars_array('navlinks', [ + [ + 'FORUM_NAME' => $this->name, + 'U_VIEW_FORUM' => $this->helper->route('phpbbstudio_aps_display'), + ], + [ + 'FORUM_NAME' => $this->language->lang('APS_OVERVIEW'), + 'U_VIEW_FORUM' => $this->helper->route('phpbbstudio_aps_display'), + ], + ]); + + // Output the page! + return $this->helper->render('@phpbbstudio_aps/aps_display.html', $this->page_blocks[$this->page]['title']); + } + + /** + * Build template variables array for a given block. + * + * @param string $block_id The block identifier + * @param array $block The block data + * @return array The block template variables + * @access protected + */ + protected function build_display($block_id, array $block) + { + return [ + 'ID' => $block_id, + 'TITLE' => $block['title'], + 'TEMPLATE' => $block['template'], + 'S_REQUIRED' => !empty($block['required']), + 'U_DELETE' => $this->helper->route('phpbbstudio_aps_display', ['page' => $this->page, 'aps_action' => 'delete', 'id' => $block_id]), + ]; + } + + /** + * Build template list item for a given block. + * + * @param string $block_id The block identifier + * @param array $block The block data + * @return string The block template list item + * @access protected + */ + protected function build_list($block_id, array $block) + { + $u_add = $this->helper->route('phpbbstudio_aps_display', ['page' => $this->page, 'aps_action' => 'add', 'id' => $block_id]); + + return '
  • ' . $block['title'] . '
  • '; + } + + /** + * Call a function defined in the block data. + * + * @param string $block_id The block identifier + * @param array $block The block data + * @return mixed The block function declaration + * @access protected + */ + protected function call_function($block_id, array $block) + { + // Set up function parameters and append the block id + $params = !empty($block['params']) ? $block['params'] : []; + $params = array_merge($params, [ + 'block_id' => $block_id + ]); + + // Call the function + call_user_func_array($block['function'], $params); + + return $block['function']; + } + + /** + * Check if the current user is authorised to see this display page. + * + * @return string|Response + * @access protected + */ + protected function check_auth() + { + if (isset($this->page_blocks[$this->page]['auth']) && !$this->page_blocks[$this->page]['auth']) + { + $message = $this->language->lang('NOT_AUTHORISED'); + $back_link = '' . $this->language->lang('APS_OVERVIEW') . ''; + $back_msg = $this->language->lang('RETURN_TO', $back_link); + + return $this->helper->message($message . '

    ' . $back_msg, [], 'INFORMATION', 401); + } + + return ''; + } + + /** + * Check if the current page is available. + * + * @return string|Response + * @access protected + */ + protected function check_existance() + { + if (empty($this->page_blocks[$this->page])) + { + $message = $this->language->lang('PAGE_NOT_FOUND'); + $back_link = '' . $this->language->lang('APS_OVERVIEW') . ''; + $back_msg = $this->language->lang('RETURN_TO', $back_link);; + + return $this->helper->message($message . '

    ' . $back_msg, [], 'INFORMATION', 404); + } + + return ''; + } + + /** + * Handle actions for the display blocks. + * + * @return void + * @access protected + */ + protected function handle_action() + { + // Request the action + $action = $this->request->variable('aps_action', '', true); + + // Only these actions are available + if (!in_array($action, ['add', 'delete', 'move'])) + { + return; + } + + // Request the block identifier + $block_id = $this->request->variable('id', '', true); + + // Call the action's function + $response = $this->{$action . '_block'}($block_id); + + // If the request is AJAX, send a response + if ($this->request->is_ajax()) + { + $json_response = new \phpbb\json_response; + $json_response->send([ + 'success' => $response, + 'APS_TITLE' => $this->language->lang('APS_SUCCESS'), + 'APS_TEXT' => $this->language->lang('APS_POINTS_BLOCK_' . utf8_strtoupper($action), $this->name), + ]); + } + + // Otherwise assign a meta refresh + $this->helper->assign_meta_refresh_var(0, $this->helper->route('phpbbstudio_aps_display', ['page' => $this->page])); + } + + /** + * Get the admin and user desired page blocks. + * + * @return void + * @access protected + */ + protected function get_admin_user_blocks() + { + $rowset = $this->blockader->rowset($this->user->data['user_id']); + + foreach ($rowset as $user_id => $blocks) + { + if ($user_id == $this->blockader->get_admin_id()) + { + $this->admin_blocks = $blocks; + } + + if ($user_id == $this->user->data['user_id']) + { + $this->user_blocks = $blocks; + } + } + + if (empty($this->admin_blocks)) + { + foreach ($this->page_blocks as $page => $data) + { + $this->admin_blocks[$page] = array_keys($data['blocks']); + } + } + } + + /** + * Get all available display blocks. + * + * @param int $pagination Pagination page number + * @return array The display blocks + * @access public + */ + public function get_page_blocks($pagination = 1) + { + $page_blocks = [ + 'overview' => [ + 'title' => $this->language->lang('APS_OVERVIEW'), + 'blocks' => [ + 'points_top' => [ + 'title' => $this->language->lang('APS_TOP_USERS'), + 'function' => [$this->blocks, 'user_top_search'], + 'template' => '@phpbbstudio_aps/blocks/points_top.html', + ], + 'points_search' => [ + 'title' => $this->language->lang('FIND_USERNAME'), + 'function' => [$this->blocks, 'user_top_search'], + 'template' => '@phpbbstudio_aps/blocks/points_search.html', + ], + 'points_settings' => [ + 'title' => $this->language->lang('SETTINGS'), + 'template' => '@phpbbstudio_aps/blocks/points_settings.html', + ], + 'points_random' => [ + 'title' => $this->language->lang('APS_RANDOM_USER'), + 'function' => [$this->blocks, 'user_random'], + 'template' => '@phpbbstudio_aps/blocks/points_random.html', + ], + 'points_forums' => [ + 'title' => $this->language->lang('APS_POINTS_PER_FORUM', $this->name), + 'function' => [$this->blocks, 'charts_forum'], + 'template' => '@phpbbstudio_aps/blocks/points_forums.html', + ], + 'points_groups' => [ + 'title' => $this->language->lang('APS_POINTS_PER_GROUP', $this->name), + 'function' => [$this->blocks, 'charts_group'], + 'template' => '@phpbbstudio_aps/blocks/points_groups.html', + ], + 'points_growth' => [ + 'title' => $this->language->lang('APS_POINTS_GROWTH', $this->name), + 'function' => [$this->blocks, 'charts_period'], + 'template' => '@phpbbstudio_aps/blocks/points_growth.html', + ], + 'points_trade_off' => [ + 'title' => $this->language->lang('APS_POINTS_TRADE_OFF', $this->name), + 'function' => [$this->blocks, 'charts_period'], + 'template' => '@phpbbstudio_aps/blocks/points_trade_off.html', + ], + ], + ], + 'actions' => [ + 'title' => $this->language->lang('APS_POINTS_ACTIONS', $this->name), + 'auth' => $this->auth->acl_get('u_aps_view_logs'), + 'blocks' => [ + 'points_actions' => [ + 'auth' => $this->auth->acl_get('u_aps_view_logs'), + 'title' => $this->language->lang('APS_POINTS_ACTIONS', $this->name), + 'required' => true, + 'function' => [$this->blocks, 'display_actions'], + 'params' => ['pagination' => $pagination], + 'template' => '@phpbbstudio_aps/blocks/points_actions.html', + ], + 'points_registration' => [ + 'auth' => $this->auth->acl_get('u_aps_view_logs'), + 'title' => $this->language->lang('APS_RECENT_ADJUSTMENTS'), + 'function' => [$this->blocks, 'recent_adjustments'], + 'template' => '@phpbbstudio_aps/blocks/points_adjustments.html', + ], + ], + ], + ]; + + /** + * Event to add additional page blocks to the APS display page. + * + * @event phpbbstudio.aps.display_blocks + * @var array page_blocks Available page blocks + * @var int pagination Pagination's page number + * @since 1.0.0 + */ + $vars = ['page_blocks', 'pagination']; + extract($this->dispatcher->trigger_event('phpbbstudio.aps.display_blocks', compact($vars))); + + $this->page_blocks = $page_blocks; + + return $this->page_blocks; + } + + /** + * Add a block to the user desired blocks. + * + * @param string $block_id The block identifier + * @return string The rendered block for display + * @access protected + */ + protected function add_block($block_id) + { + $insert = empty($this->user_blocks); + + $this->user_blocks[$this->page] = !$insert ? array_merge($this->user_blocks[$this->page], [$block_id]) : [$block_id]; + + $this->blockader->set_blocks($this->user->data['user_id'], $this->user_blocks, $insert); + + $this->template->set_filenames(['block' => '@phpbbstudio_aps/blocks/base.html']); + + if (!empty($this->page_blocks[$this->page]['blocks'][$block_id]['function'])) + { + $this->call_function($block_id, $this->page_blocks[$this->page]['blocks'][$block_id]); + } + + $this->template->assign_vars([ + 'block' => $this->build_display($block_id, $this->page_blocks[$this->page]['blocks'][$block_id]), + 'S_USER_LOGGED_IN' => $this->user->data['user_id'] != ANONYMOUS, + 'S_IS_BOT' => $this->user->data['is_bot'], + ]); + + return $this->template->assign_display('block'); + } + + /** + * Delete a block from the user desired blocks. + * + * @param string $block_id The block identifier + * @return string HTML list item + * @access protected + */ + protected function delete_block($block_id) + { + $insert = empty($this->user_blocks); + + if ($insert) + { + foreach ($this->page_blocks as $page => $data) + { + $this->user_blocks[$page] = array_keys($data['blocks']); + } + } + + if (($key = array_search($block_id, $this->user_blocks[$this->page])) !== false) { + unset($this->user_blocks[$this->page][$key]); + } + + $this->blockader->set_blocks($this->user->data['user_id'], $this->user_blocks, $insert); + + return $this->build_list($block_id, $this->page_blocks[$this->page]['blocks'][$block_id]); + } + + /** + * Move (order) the user desired blocks. + * + * @return bool|int Boolean on update or integer on insert. + * @access protected + */ + protected function move_block() + { + $insert = empty($this->user_blocks); + + $order = $this->request->variable('order', ['']); + + // Filter out empty block identifiers + $this->user_blocks[$this->page] = array_filter($order); + + return $this->blockader->set_blocks($this->user->data['user_id'], $this->user_blocks, $insert); + } +} diff --git a/ext/phpbbstudio/aps/controller/mcp_controller.php b/ext/phpbbstudio/aps/controller/mcp_controller.php new file mode 100644 index 0000000..11579ec --- /dev/null +++ b/ext/phpbbstudio/aps/controller/mcp_controller.php @@ -0,0 +1,617 @@ +auth = $auth; + $this->config = $config; + $this->db = $db; + $this->dispatcher = $dispatcher; + $this->distributor = $distributor; + $this->functions = $functions; + $this->group_helper = $group_helper; + $this->language = $language; + $this->log = $log; + $this->notification = $notification; + $this->pagination = $pagination; + $this->reasoner = $reasoner; + $this->request = $request; + $this->template = $template; + $this->user = $user; + $this->valuator = $valuator; + + $this->root_path = $root_path; + $this->php_ext = $php_ext; + + $this->name = $functions->get_name(); + } + + /** + * Handle MCP front page. + * + * @return void + * @access public + */ + public function front() + { + if ($this->auth->acl_get('u_aps_view_logs')) + { + $this->log->load_lang(); + + // Latest 5 logs + $logs = $this->log->get(false, 5); + foreach ($logs as $row) + { + $this->template->assign_block_vars('logs', array_change_key_case($row, CASE_UPPER)); + } + + // Latest 5 adjustments + $moderated = $this->log->get(false, 5, 0, '', 0, 0, 0, 0, 0, 'l.log_time DESC', 'APS_POINTS_USER_ADJUSTED'); + foreach ($moderated as $row) + { + $this->template->assign_block_vars('moderated', array_change_key_case($row, CASE_UPPER)); + } + } + + // Top 5 users + $sql = 'SELECT user_id, username, user_colour, user_points + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + ORDER BY user_points DESC, username_clean ASC'; + $result = $this->db->sql_query_limit($sql, 5); + while ($row = $this->db->sql_fetchrow($result)) + { + $this->template->assign_block_vars('aps_users_top', [ + 'NAME' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'POINTS' => $row['user_points'], + ]); + } + $this->db->sql_freeresult($result); + + // Bottom 5 user + $sql = 'SELECT user_id, username, user_colour, user_points + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + ORDER BY user_points ASC, username_clean DESC'; + $result = $this->db->sql_query_limit($sql, 5); + while ($row = $this->db->sql_fetchrow($result)) + { + $this->template->assign_block_vars('aps_users_bottom', [ + 'NAME' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'POINTS' => $row['user_points'], + ]); + } + $this->db->sql_freeresult($result); + + /** + * Event to assign additional variables for the APS MCP front page. + * + * @event phpbbstudio.aps.mcp_front + * @since 1.0.0 + */ + $this->dispatcher->dispatch('phpbbstudio.aps.mcp_front'); + + $this->template->assign_vars([ + 'S_APS_LOGS' => $this->auth->acl_get('u_aps_view_logs'), + ]); + } + + /** + * Handle MCP logs. + * + * @return void + * @access public + */ + public function logs() + { + $this->log->load_lang(); + + // Set up general vars + $start = $this->request->variable('start', 0); + $forum_id = $this->request->variable('f', ''); + $topic_id = $this->request->variable('t', 0); + $post_id = $this->request->variable('p', 0); + $user_id = $this->request->variable('u', 0); + $reportee_id = $this->request->variable('r', 0); + + // Sort keys + $sort_days = $this->request->variable('st', 0); + $sort_key = $this->request->variable('sk', 't'); + $sort_dir = $this->request->variable('sd', 'd'); + + // Keywords + $keywords = $this->request->variable('keywords', '', true); + $keywords_param = !empty($keywords) ? '&keywords=' . urlencode(htmlspecialchars_decode($keywords)) : ''; + + $name = $this->functions->get_name(); + $limit = $this->config['aps_actions_per_page']; + + // Sorting + $limit_days = [ + 0 => $this->language->lang('ALL_ENTRIES'), + 1 => $this->language->lang('1_DAY'), + 7 => $this->language->lang('7_DAYS'), + 14 => $this->language->lang('2_WEEKS'), + 30 => $this->language->lang('1_MONTH'), + 90 => $this->language->lang('3_MONTHS'), + 180 => $this->language->lang('6_MONTHS'), + 365 => $this->language->lang('1_YEAR'), + ]; + $sort_by_text = [ + 'a' => $this->language->lang('SORT_ACTION'), + 'ps' => $name, + 'pn' => $this->language->lang('APS_POINTS_NEW', $name), + 'po' => $this->language->lang('APS_POINTS_OLD', $name), + 'uu' => $this->language->lang('SORT_USERNAME'), + 'ru' => $this->language->lang('FROM'), + 't' => $this->language->lang('SORT_DATE'), + ]; + $sort_by_sql = [ + 'a' => 'l.log_action', + 'ps' => 'l.points_sum', + 'pn' => 'l.points_new', + 'po' => 'l.points_old', + 'uu' => 'u.username', + 'ru' => 'r.username', + 't' => 'l.log_time', + ]; + + $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; + gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param); + + // Define where and sort sql for use in displaying logs + $sql_time = ($sort_days) ? (time() - ($sort_days * 86400)) : 0; + $sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); + + $rowset = $this->log->get(true, $limit, $start, $forum_id, $topic_id, $post_id, $user_id, $reportee_id, $sql_time, $sql_sort, $keywords); + $start = $this->log->get_valid_offset(); + $total = $this->log->get_log_count(); + + $base_url = $this->u_action . "&$u_sort_param$keywords_param"; + $this->pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $limit, $start); + + foreach ($rowset as $row) + { + $this->template->assign_block_vars('logs', array_change_key_case($row, CASE_UPPER)); + } + + $this->template->assign_vars([ + 'U_ACTION' => $this->u_action . "&$u_sort_param$keywords_param&start=$start", + + 'S_LIMIT_DAYS' => $s_limit_days, + 'S_SORT_KEY' => $s_sort_key, + 'S_SORT_DIR' => $s_sort_dir, + 'S_KEYWORDS' => $keywords, + ]); + } + + /** + * Handle MCP user adjustment. + * + * @return void + * @access public + */ + public function change() + { + $this->log->load_lang(); + + $group_id = $this->request->variable('g', 0); + $user_id = $this->request->variable('u', 0); + + if (empty($group_id) && empty($user_id)) + { + $this->find_user(); + + return; + } + + $this->language->add_lang('acp/common'); + + $action = $this->request->variable('action', ''); + + switch ($action) + { + case 'add': + case 'sub': + case 'set': + if (!$this->auth->acl_get('m_aps_adjust_custom')) + { + trigger_error($this->language->lang('NOT_AUTHORISED'), E_USER_WARNING); + } + break; + + case '': + // do nothing + break; + + default: + if (!$this->auth->acl_get('m_aps_adjust_reason')) + { + trigger_error($this->language->lang('NOT_AUTHORISED'), E_USER_WARNING); + } + break; + } + + if (!empty($user_id)) + { + $sql = 'SELECT user_id, username, user_colour + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + AND user_id = ' . (int) $user_id; + $result = $this->db->sql_query_limit($sql, 1); + $user = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + if ($user === false) + { + trigger_error($this->language->lang('NO_USER') . $this->back_link($this->u_action), E_USER_WARNING); + } + + $user_ids = [$user_id]; + + $u_action = '&u=' . (int) $user_id; + } + else + { + $sql = 'SELECT user_id + FROM ' . $this->functions->table('user_group') . ' + WHERE group_id = ' . (int) $group_id; + $result = $this->db->sql_query($sql); + $rowset = $this->db->sql_fetchrowset($result); + $this->db->sql_freeresult($result); + + if (empty($rowset)) + { + $this->language->add_lang('acp/groups'); + + trigger_error($this->language->lang('GROUPS_NO_MEMBERS') . $this->back_link($this->u_action), E_USER_WARNING); + } + + $user_ids = array_column($rowset, 'user_id'); + + $u_action = '&g=' . (int) $group_id; + } + + + // Actions + $reasons = $this->reasoner->rowset(); + $actions = [ + 'add' => $this->language->lang('ADD'), + 'sub' => $this->language->lang('REMOVE'), + 'set' => $this->language->lang('CHANGE'), + ]; + + $users = $this->valuator->users($user_ids); + + $submit = $this->request->is_set_post('submit'); + $points = $this->request->variable('points', 0.00); + $reason = $this->request->variable('reason', '', true); + + if ($submit) + { + if ($action === '') + { + trigger_error($this->language->lang('NO_ACTION'), E_USER_WARNING); + } + + if (confirm_box(true)) + { + foreach ($users as $uid => $user_points) + { + switch ($action) + { + case 'add': + $sum_points = $points; + break; + case 'sub': + $sum_points = $this->functions->equate_points(0, $points, '-'); + break; + case 'set': + $sum_points = $this->functions->equate_points($points, $user_points, '-'); + break; + + default: + if (empty($reasons[$action])) + { + trigger_error($this->language->lang('NO_ACTION') . $this->back_link($this->u_action), E_USER_WARNING); + } + + $sum_points = $reasons[$action]['reason_points']; + $reason = $reasons[$action]['reason_title'] . '
    ' . $reasons[$action]['reason_desc']; + break; + } + + $log_entry = []; + + $log_entry[] = [ + 'action' => 'APS_POINTS_USER_ADJUSTED', + 'actions' => !empty($reason) ? [$reason => $sum_points] : ['APS_POINTS_USER_ADJUSTED' => $sum_points], + 'user_id' => (int) $uid, + 'reportee_id' => (int) $this->user->data['user_id'], + 'reportee_ip' => (string) $this->user->ip, + 'points_old' => $user_points, + 'points_sum' => $sum_points, + ]; + + $this->distributor->distribute($uid, $sum_points, $log_entry, $user_points); + } + + $this->config->increment('aps_notification_id', 1); + + $this->notification->add_notifications('phpbbstudio.aps.notification.type.adjust', [ + 'name' => $this->functions->get_name(), + 'reason' => $reason, + 'user_ids' => array_keys($users), + 'moderator' => get_username_string('no_profile', $this->user->data['user_id'], $this->user->data['username'], $this->user->data['user_colour']), + 'moderator_id' => (int) $this->user->data['user_id'], + 'notification_id' => (int) $this->config['aps_notification_id'], + ]); + + trigger_error($this->language->lang('MCP_APS_POINTS_USER_CHANGE_SUCCESS', $this->name) . $this->back_link($this->u_action)); + } + else + { + confirm_box(false, $this->language->lang('MCP_APS_POINTS_USER_CHANGE', $this->name), build_hidden_fields([ + 'submit' => $submit, + 'action' => $action, + 'points' => $points, + 'reason' => $reason, + ])); + + redirect($this->u_action); + } + } + + if (!empty($user_id) && $this->auth->acl_get('u_aps_view_logs')) + { + $logs = $this->log->get(false, 5, 0, '', 0, 0, (int) $user_id); + + foreach ($logs as $row) + { + $this->template->assign_block_vars('logs', array_change_key_case($row, CASE_UPPER)); + } + + $this->template->assign_var('S_APS_LOGS', true); + } + + if (!empty($group_id)) + { + $sql = 'SELECT group_id, group_name, group_colour + FROM ' . $this->functions->table('groups') . ' + WHERE group_id = ' . (int) $group_id; + $result = $this->db->sql_query_limit($sql, 1); + $group = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + $group_name = $this->group_helper->get_name_string('full', $group['group_id'], $group['group_name'], $group['group_colour']); + } + + $this->template->assign_vars([ + 'APS_ACTIONS' => $actions, + 'APS_REASONS' => $reasons, + 'APS_POINTS' => $user_id ? $this->functions->display_points($users[$user_id]) : '', + 'APS_USERNAME' => !empty($user) ? get_username_string('full', $user['user_id'], $user['username'], $user['user_colour']) : '', + 'APS_GROUP' => !empty($group_name) ? $group_name : '', + + 'S_APS_CUSTOM' => $this->auth->acl_get('m_aps_adjust_custom'), + 'S_APS_REASON' => $this->auth->acl_get('m_aps_adjust_reason'), + 'S_APS_POINTS' => true, + + 'U_APS_ACTION' => $this->u_action . $u_action, + ]); + } + + /** + * Find a user for the MCP adjustment page. + * + * @return void + * @access protected + */ + protected function find_user() + { + $this->language->add_lang('acp/groups'); + + $form_name = 'mcp_aps_change'; + add_form_key($form_name); + + $submit_group = $this->request->is_set_post('submit_group'); + $submit_user = $this->request->is_set_post('submit_user'); + $submit = $submit_group || $submit_user; + + $group_id = $this->request->variable('group_id', 0); + + if ($submit && !check_form_key($form_name)) + { + $error = 'FORM_INVALID'; + } + else if ($submit) + { + if ($submit_group) + { + redirect($this->u_action . '&g=' . (int) $group_id); + } + + if ($submit_user) + { + if (!function_exists('user_get_id_name')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_user.' . $this->php_ext; + } + + $username[] = $this->request->variable('username', '', true); + + $error = user_get_id_name($user_ids, $username); + + if (empty($error)) + { + $user_id = $user_ids[0]; + + redirect($this->u_action . '&u=' . (int) $user_id); + } + } + } + + if (!function_exists('group_select_options')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_admin.' . $this->php_ext; + } + + $this->template->assign_vars([ + 'S_ERROR' => !empty($error), + 'ERROR_MSG' => !empty($error) ? $this->language->lang($error) : '', + + 'APS_USERNAME' => !empty($username[0]) ? $username[0] : '', + 'APS_GROUPS' => group_select_options($group_id), + + 'S_APS_SEARCH' => true, + + 'U_APS_ACTION' => $this->u_action, + 'U_APS_SEARCH' => append_sid("{$this->root_path}memberlist.{$this->php_ext}", 'mode=searchuser&form=mcp_aps_change&field=username'), + ]); + } + + /** + * Generate a back link for this MCP controller. + * + * @param string $action The action to return to + * @return string A HTML formatted URL to the action + * @access protected + */ + protected function back_link($action) + { + return '

    « ' . $this->language->lang('BACK_TO_PREV') . ''; + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return mcp_controller $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/aps/core/acp.php b/ext/phpbbstudio/aps/core/acp.php new file mode 100644 index 0000000..035c2f5 --- /dev/null +++ b/ext/phpbbstudio/aps/core/acp.php @@ -0,0 +1,236 @@ + [], 1 => []]; + + /** + * Constructor. + * + * @param \phpbbstudio\aps\core\functions $functions APS Core functions + * @param \phpbb\template\template $template Template object + * @param \phpbbstudio\aps\actions\type\action[] $types Array of action types from the service collection + * @param \phpbbstudio\aps\points\valuator $valuator APS Valuator object + * @return void + * @access public + */ + public function __construct( + functions $functions, + \phpbb\template\template $template, + $types, + \phpbbstudio\aps\points\valuator $valuator + ) + { + $this->functions = $functions; + $this->template = $template; + $this->types = $types; + $this->valuator = $valuator; + } + + /** + * Returns the list of fields for the points list. + * + * @return array Array of action types from the service collection + * @access public + */ + public function get_fields() + { + return $this->fields; + } + + /** + * Initiate a build for a points list for the in the ACP. + * + * @param int|null $forum_id Forum identifier + * @param string $block_name The name for the template block + * @return void + * @access public + */ + public function build($forum_id = null, $block_name = 'aps_categories') + { + $this->build_list(is_null($forum_id)); + + $this->assign_blocks($block_name); + + $this->assign_values($forum_id); + } + + /** + * Build a local|global points list for in the ACP. + * + * @param bool $global Whether we are building a global or local list + * @return void + * @access public + */ + public function build_list($global) + { + /** @var \phpbbstudio\aps\actions\type\action $type */ + foreach ($this->types as $type) + { + if ($type->is_global() === $global) + { + $this->fields[(int) $type->is_global()] = array_merge($this->fields[(int) $type->is_global()], $type->get_fields()); + + if (empty($this->blocks[$type->get_category()])) + { + $this->blocks[$type->get_category()] = [ + $type->get_action() => $type->get_data(), + ]; + } + else + { + if (empty($this->blocks[$type->get_category()][$type->get_action()])) + { + $this->blocks[$type->get_category()][$type->get_action()] = $type->get_data(); + } + else + { + $this->blocks[$type->get_category()][$type->get_action()] += $type->get_data(); + } + } + } + } + } + + /** + * Assign the points list to the template. + * + * @param string $block_name The name for the template block + * @return void + * @access public + */ + public function assign_blocks($block_name = 'aps_categories') + { + foreach ($this->blocks as $category => $blocks) + { + $this->template->assign_block_vars($block_name, [ + 'title' => $category, + 'blocks' => $blocks, + ]); + } + } + + /** + * Assign the point values to the template. + * + * @param int $forum_id The forum identifier + * @return array The point values + * @access public + */ + public function assign_values($forum_id) + { + $values = $this->valuator->get_points($this->fields, (int) $forum_id); + $values = $values[(int) $forum_id]; + + // Clean upon assignment, as this possible runs more often than submission + $this->valuator->clean_points(array_keys($values), (int) $forum_id); + + $this->template->assign_vars([ + 'APS_VALUES' => $values, + ]); + + return $values; + } + + /** + * Sets the point values for a given forum identifier. + * + * @param array $points The points to set + * @param int $forum_id The forum identifier + * @return void + * @access public + */ + public function set_points(array $points, $forum_id = 0) + { + $this->valuator->set_points($points, (int) $forum_id); + } + + /** + * Delete the point values in the database for a specific forum. + * + * @param int $forum_id The forum identifier + * @return void + * @access public + */ + public function delete_points($forum_id) + { + $this->valuator->delete_points($forum_id); + } + + /** + * Copy the point values from one forum to an other. + * + * @param int $from The from forum identifier + * @param int $to The to forum identifier + * @param array $points The point values to copy + * @return void + * @access public + */ + public function copy_points($from, $to, array $points) + { + $points = [0 => array_keys($points)]; + $points = $this->valuator->get_points($points, (int) $from); + $points = $points[(int) $from]; + + $this->valuator->set_points($points, $to); + } + + /** + * Copy the point values from one forum to multiple others. + * + * @param int $from The from forum identifier + * @param int $to The to forum identifier + * @return void + * @access public + */ + public function copy_multiple($from, $to) + { + $this->valuator->copy_points($from, $to); + } + + /** + * Clean the points table. + * + * @return void + * @access public + */ + public function clean_points() + { + /** @var \phpbbstudio\aps\actions\type\action $type */ + foreach ($this->types as $type) + { + $this->fields[(int) $type->is_global()] = array_merge($this->fields[(int) $type->is_global()], $type->get_fields()); + } + + $this->valuator->clean_all_points($this->fields); + } +} diff --git a/ext/phpbbstudio/aps/core/blocks.php b/ext/phpbbstudio/aps/core/blocks.php new file mode 100644 index 0000000..b009712 --- /dev/null +++ b/ext/phpbbstudio/aps/core/blocks.php @@ -0,0 +1,647 @@ +auth = $auth; + $this->config = $config; + $this->db = $db; + $this->dbal = $dbal; + $this->functions = $functions; + $this->group_helper = $group_helper; + $this->helper = $helper; + $this->language = $language; + $this->log = $log; + $this->pagination = $pagination; + $this->request = $request; + $this->template = $template; + $this->user = $user; + + $this->root_path = $root_path; + $this->php_ext = $php_ext; + $this->table = $table; + + $this->name = $functions->get_name(); + + $log->load_lang(); + } + + /** + * Display the "Top users" and "Find a Member" blocks. + * + * @param string $block_id The block identifier + * @return void + * @access public + */ + public function user_top_search($block_id) + { + $submit = $this->request->is_set_post('submit'); + $action = $this->request->variable('action', '', true); + + $count = $this->request->variable('aps_user_top_count', (int) $this->config['aps_display_top_count']); + $top_username = ''; + + $sql = 'SELECT user_id, username, username_clean, user_colour, user_points, + user_avatar, user_avatar_type, user_avatar_width, user_avatar_height + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + ORDER BY user_points DESC, username_clean ASC'; + $result = $this->db->sql_query_limit($sql, $count); + while ($row = $this->db->sql_fetchrow($result)) + { + $top_username = empty($top_username) ? $row['username_clean'] : $top_username; + + $this->template->assign_block_vars('top_users', [ + 'NAME' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'AVATAR' => phpbb_get_user_avatar($row), + 'POINTS' => $row['user_points'], + 'U_ADJUST' => append_sid("{$this->root_path}mcp.{$this->php_ext}", 'i=-phpbbstudio-aps-mcp-main_module&mode=change&u=' . (int) $row['user_id'], true, $this->user->session_id) + ]); + } + $this->db->sql_freeresult($result); + + // Set up the default user to display, either this user or the top user if this user is a guest + $default = $this->user->data['user_id'] != ANONYMOUS ? $this->user->data['username'] : $top_username; + $username = $this->request->variable('aps_user_search', $default, true); + + // Find the user for the provided username + $user = $this->find_user($username); + + // If a user was found + if ($user !== false) + { + // Count the amount of users with more points than this user. + $sql = 'SELECT COUNT(user_points) as rank + FROM ' . $this->functions->table('users') . ' + WHERE user_points > ' . $user['user_points']; + $result = $this->db->sql_query_limit($sql, 1); + $user_rank = (int) $this->db->sql_fetchfield('rank'); + $this->db->sql_freeresult($result); + + // Increment by one, as the rank is the amount of users above this user + $user_rank++; + } + + // Output the template variables for display + $this->template->assign_vars([ + // Set up a default no avatar + 'APS_NO_AVATAR' => $this->functions->get_no_avatar(), + + // The searched user data + 'APS_SEARCH_USERNAME' => $username, + 'APS_SEARCH_USER_AVATAR' => !empty($user) ? phpbb_get_user_avatar($user) : '', + 'APS_SEARCH_USER_FULL' => !empty($user) ? get_username_string('full', $user['user_id'], $user['username'], $user['user_colour']) : $this->language->lang('NO_USER'), + 'APS_SEARCH_USER_POINTS' => !empty($user) ? $user['user_points'] : 0.00, + 'APS_SEARCH_USER_RANK' => !empty($user_rank) ? $user_rank : $this->language->lang('NA'), + 'U_APS_SEARCH_USER_ADJUST' => !empty($user) ? append_sid("{$this->root_path}mcp.{$this->php_ext}", 'i=-phpbbstudio-aps-mcp-main_module&mode=change&u=' . (int) $user['user_id'], true, $this->user->session_id) : '', + + // Amount of top users to display + 'APS_TOP_USERS_COUNT' => $count, + + // APS Moderator + 'S_APS_USER_ADJUST' => $this->auth->acl_get('m_aps_adjust_custom') || $this->auth->acl_get('m_aps_'), + + // Block actions + 'U_APS_ACTION_SEARCH' => $this->helper->route('phpbbstudio_aps_display', ['page' => 'overview', 'action' => 'search']), + 'U_APS_ACTION_TOP' => $this->helper->route('phpbbstudio_aps_display', ['page' => 'overview', 'action' => 'top']), + ]); + + // Handle any AJAX actions regarding these blocks + if ($submit && $this->request->is_ajax() && in_array($action, ['search', 'top'])) + { + $this->template->set_filenames(['aps_body' => '@phpbbstudio_aps/blocks/base.html']); + $this->template->assign_vars([ + 'block' => [ + 'ID' => $block_id, + 'TITLE' => $action === 'top' ? $this->language->lang('APS_TOP_USERS') : $this->language->lang('FIND_USERNAME'), + 'TEMPLATE' => '@phpbbstudio_aps/blocks/points_' . $action . '.html', + ], + ]); + + $json_response = new \phpbb\json_response; + $json_response->send([ + 'body' => $this->template->assign_display('aps_body'), + ]); + } + } + + /** + * Display the "Random member" block. + * + * @return void + * @access public + */ + public function user_random() + { + $sql = 'SELECT user_id, username, user_colour, user_points, + user_avatar, user_avatar_type, user_avatar_width, user_avatar_height + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + AND user_type <> ' . USER_INACTIVE . ' + ORDER BY ' . $this->dbal->random(); + + $result = $this->db->sql_query_limit($sql, 1); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + $this->template->assign_vars([ + 'APS_RANDOM_NO_AVATAR' => $this->functions->get_no_avatar(), + + 'APS_RANDOM_USER_AVATAR' => phpbb_get_user_avatar($row), + 'APS_RANDOM_USER_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + 'APS_RANDOM_USER_POINTS' => $row['user_points'], + ]); + } + + /** + * Display the "Points actions" block. + * + * @param int $pagination The pagination's page number + * @param string $block_id The block identifier + * @return void + * @access public + */ + public function display_actions($pagination, $block_id) + { + $params = ['page' => 'actions']; + $limit = $this->config['aps_actions_per_page']; + + // Set up general vars + $s_reportee = $this->auth->acl_get('u_aps_view_mod'); + $s_username = $this->auth->acl_get('u_aps_view_logs_other'); + + $forum_id = $this->request->variable('f', ''); + $topic_title = $this->request->variable('t', '', true); + $username = $this->request->variable('u', '', true); + $reportee = $this->request->variable('r', '', true); + + $username = $s_username ? $username : ''; + $reportee = $s_reportee ? $reportee : ''; + + $topic_ids = $this->find_topic($topic_title); + $user_id = $this->find_user($username, false); + $reportee_id = $this->find_user($reportee, false); + + $post_id = 0; + $user_id = $s_username ? $user_id : (int) $this->user->data['user_id']; + + // Sort keys + $sort_days = $this->request->variable('st', 0); + $sort_key = $this->request->variable('sk', 't'); + $sort_dir = $this->request->variable('sd', 'd'); + + // Keywords + $keywords = $this->request->variable('keywords', '', true); + if (!empty($keywords)) + { + $params['keywords'] = urlencode(htmlspecialchars_decode($keywords)); + } + + // Calculate the start (SQL offset) from the page number + $start = ($pagination - 1) * $limit; + + // Sorting + $limit_days = [ + 0 => $this->language->lang('APS_POINTS_ACTIONS_ALL', $this->name), + 1 => $this->language->lang('1_DAY'), + 7 => $this->language->lang('7_DAYS'), + 14 => $this->language->lang('2_WEEKS'), + 30 => $this->language->lang('1_MONTH'), + 90 => $this->language->lang('3_MONTHS'), + 180 => $this->language->lang('6_MONTHS'), + 365 => $this->language->lang('1_YEAR'), + ]; + $sort_by_text = [ + 'a' => $this->language->lang('APS_POINTS_ACTION', $this->name), + 'ps' => $this->name, + 'pn' => $this->language->lang('APS_POINTS_NEW', $this->name), + 'po' => $this->language->lang('APS_POINTS_OLD', $this->name), + 'uu' => $this->language->lang('SORT_USERNAME'), + 'ru' => ucfirst($this->language->lang('FROM')), + 't' => $this->language->lang('APS_POINTS_ACTION_TIME', $this->name), + ]; + $sort_by_sql = [ + 'a' => 'l.log_action', + 'ps' => 'l.points_sum', + 'pn' => 'l.points_new', + 'po' => 'l.points_old', + 'uu' => 'u.username', + 'ru' => 'r.username', + 't' => 'l.log_time', + ]; + + $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ''; + gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param); + + if (!empty($u_sort_param)) + { + $sort_params = explode('&', $u_sort_param); + + foreach ($sort_params as $param) + { + list($key, $value) = explode('=', $param); + + $params[$key] = $value; + } + } + + // Define where and sort sql for use in displaying logs + $sql_time = ($sort_days) ? (time() - ($sort_days * 86400)) : 0; + $sql_sort = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); + + $rowset = $this->log->get(true, $limit, $start, $forum_id, $topic_ids, $post_id, $user_id, $reportee_id, $sql_time, $sql_sort, $keywords); + $start = $this->log->get_valid_offset(); + $total = $this->log->get_log_count(); + + $user_ids = []; + + foreach ($rowset as $row) + { + $user_ids[] = $row['user_id']; + $this->template->assign_block_vars('aps_actions', array_merge(array_change_key_case($row, CASE_UPPER), [ + 'S_AUTH_BUILD' => (bool) $this->auth->acl_get('u_aps_view_build'), + 'S_AUTH_BUILD_OTHER' => (bool) ($this->auth->acl_get('u_aps_view_build_other') || ((int) $this->user->data['user_id'] === $row['user_id'])), + 'S_AUTH_MOD' => (bool) $this->auth->acl_get('u_aps_view_mod'), + 'S_MOD' => (bool) strpos($row['action'],'_USER_') !== false, + ])); + } + + $avatars = $this->functions->get_avatars($user_ids); + + if (!function_exists('make_forum_select')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_admin.' . $this->php_ext; + } + + /** + * phpBB's DocBlock expects a string but allows arrays aswell.. + * @noinspection PhpParamsInspection + */ + $this->pagination->generate_template_pagination( + [ + 'routes' => [ + 'phpbbstudio_aps_display', + 'phpbbstudio_aps_display_pagination', + ], + 'params' => $params, + ], 'pagination', 'pagination', $total, $limit, $start); + + $this->template->assign_vars([ + 'PAGE_NUMBER' => $this->pagination->on_page($total, $limit, $start), + 'TOTAL_LOGS' => $this->language->lang('APS_POINTS_ACTIONS_TOTAL', $this->name, $total), + + 'APS_ACTIONS_AVATARS' => $avatars, + 'APS_ACTIONS_NO_AVATAR' => $this->functions->get_no_avatar(), + + 'S_AUTH_FROM' => $s_reportee, + 'S_AUTH_USER' => $s_username, + + 'S_SEARCH_TOPIC' => $topic_title, + 'S_SEARCH_FROM' => $reportee, + 'S_SEARCH_USER' => $username, + 'S_SELECT_FORUM' => make_forum_select((int) $forum_id), + + 'S_SELECT_SORT_DAYS' => $s_limit_days, + 'S_SELECT_SORT_KEY' => $s_sort_key, + 'S_SELECT_SORT_DIR' => $s_sort_dir, + 'S_KEYWORDS' => $keywords, + + 'U_APS_ACTION_LOGS' => $this->helper->route('phpbbstudio_aps_display', ['page' => 'actions', 'action' => 'search']), + ]); + + $submit = $this->request->is_set_post('submit'); + $action = $this->request->variable('action', '', true); + + // Handle any AJAX action regarding this block + if ($submit && $this->request->is_ajax() && $action === 'search') + { + $this->template->set_filenames(['aps_body' => '@phpbbstudio_aps/blocks/base.html']); + $this->template->assign_vars([ + 'block' => [ + 'ID' => $block_id, + 'TITLE' => $this->language->lang('APS_POINTS_ACTIONS', $this->name), + 'TEMPLATE' => '@phpbbstudio_aps/blocks/points_actions.html', + ], + ]); + + $json_response = new \phpbb\json_response; + $json_response->send([ + 'body' => $this->template->assign_display('aps_body'), + ]); + } + } + + /** + * Display the "Recent adjustments" block. + * + * @return void + * @access public + */ + public function recent_adjustments() + { + $user_id = !$this->auth->acl_get('u_aps_view_logs_other') ? (int) $this->user->data['user_id'] : 0; + + $limit = (int) $this->config['aps_display_adjustments']; + $rowset = $this->log->get(true, $limit, 0, 0, 0, 0, $user_id, 0, 0, 'l.log_time DESC', 'APS_POINTS_USER_ADJUSTED'); + + $user_ids = []; + + foreach ($rowset as $row) + { + $user_ids[] = $row['user_id']; + $this->template->assign_block_vars('aps_adjustments', array_merge(array_change_key_case($row, CASE_UPPER), [ + 'S_AUTH_BUILD' => (bool) $this->auth->acl_get('u_aps_view_build'), + 'S_AUTH_BUILD_OTHER' => (bool) ($this->auth->acl_get('u_aps_view_build_other') || ((int) $this->user->data['user_id'] === $row['user_id'])), + 'S_AUTH_MOD' => (bool) $this->auth->acl_get('u_aps_view_mod'), + 'S_MOD' => (bool) strpos($row['action'],'_USER_') !== false, + ])); + } + + $avatars = $this->functions->get_avatars($user_ids); + + $this->template->assign_vars([ + 'APS_ADJUSTMENTS_AVATARS' => $avatars, + 'APS_ADJUSTMENTS_NO_AVATAR' => $this->functions->get_no_avatar(), + ]); + } + + /** + * Display the "Points per forum" block. + * + * @return void + * @access public + */ + public function charts_forum() + { + $rowset = []; + + $sql = 'SELECT forum_id, SUM(points_sum) as points + FROM ' . $this->table . ' + WHERE log_approved = 1 + GROUP BY forum_id'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + if (empty($row['points'])) + { + continue; + } + + $rowset[(int) $row['forum_id']]['POINTS'] = $row['points']; + } + $this->db->sql_freeresult($result); + + $sql = 'SELECT forum_name, forum_id + FROM ' . $this->functions->table('forums') . ' + WHERE ' . $this->db->sql_in_set('forum_id', array_keys($rowset), false, true); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $rowset[(int) $row['forum_id']]['NAME'] = utf8_decode_ncr($row['forum_name']); + } + $this->db->sql_freeresult($result); + + if (isset($rowset[0])) + { + $rowset[0]['NAME'] = $this->language->lang('APS_POINTS_GLOBAL'); + } + + $this->template->assign_block_vars_array('aps_forums', $rowset); + } + + /** + * Display the "Points per group" block. + * + * @return void + * @access public + */ + public function charts_group() + { + $rowset = []; + + $sql = 'SELECT u.group_id, SUM(p.points_sum) as points + FROM ' . $this->table . ' p, + ' . $this->functions->table('users') . ' u + WHERE u.user_id = p.user_id + AND p.log_approved = 1 + GROUP BY u.group_id'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $rowset[(int) $row['group_id']] = $row['points']; + } + $this->db->sql_freeresult($result); + + $sql = 'SELECT group_name, group_colour, group_id + FROM ' . $this->functions->table('groups') . ' + WHERE group_name <> "BOTS" + AND group_type <> ' . GROUP_HIDDEN . ' + AND ' . $this->db->sql_in_set('group_id', array_keys($rowset), false, true); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $this->template->assign_block_vars('aps_groups', [ + 'COLOUR' => $row['group_colour'], + 'NAME' => $this->group_helper->get_name($row['group_name']), + 'POINTS' => $rowset[(int) $row['group_id']], + ]); + } + $this->db->sql_freeresult($result); + } + + /** + * Display the "Points trade off" and "Points growth" blocks. + * + * @return void + * @access public + */ + public function charts_period() + { + $sql = 'SELECT ' . $this->dbal->unix_to_month('log_time') . ' as month, + ' . $this->dbal->unix_to_year('log_time') . ' as year, + SUM(' . $this->db->sql_case('points_sum < 0', 'points_sum', 0) . ') AS negative, + SUM(' . $this->db->sql_case('points_sum > 0', 'points_sum', 0) . ') AS positive + FROM ' . $this->table . ' + WHERE log_time > ' . strtotime('-1 year') . ' + GROUP BY ' . $this->dbal->unix_to_month('log_time') . ', + ' . $this->dbal->unix_to_year('log_time') . ' + ORDER BY ' . $this->dbal->unix_to_year('log_time') . ' ASC, + ' . $this->dbal->unix_to_month('log_time') . ' ASC'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $timestamp = $this->user->get_timestamp_from_format('m Y', $row['month'] . ' ' . $row['year']); + $formatted = $this->user->format_date($timestamp, 'F Y'); + + $this->template->assign_block_vars('aps_period', [ + 'DATE' => $formatted, + 'NEGATIVE' => -$row['negative'], // Make it positive + 'POSITIVE' => $row['positive'], + 'TOTAL' => $this->functions->equate_points($row['positive'], $row['negative']), + ]); + } + $this->db->sql_freeresult($result); + } + + /** + * Finds a user row for the provided username. + * + * @param string $username The username + * @param bool $full Whether we want just the identifier or everything + * @return mixed If $full is true: a user row or false if no user was found + * If $full is false: the user identifier + * @access protected + */ + protected function find_user($username, $full = true) + { + if (empty($username) && !$full) + { + return 0; + } + + $select = !$full ? 'user_id' : 'user_id, username, username_clean, user_colour, user_points, user_avatar, user_avatar_type, user_avatar_width, user_avatar_height'; + + $sql = 'SELECT ' . $select . ' + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + AND (username = "' . $this->db->sql_escape($username) . '" + OR username_clean = "' . $this->db->sql_escape(utf8_clean_string($username)) . '" + )'; + $result = $this->db->sql_query_limit($sql, 1); + $user = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return $full ? $user : (int) $user['user_id']; + } + + /** + * Find a topic identifier for a provided topic title. + * + * @param string $title The topic title + * @return array The topic identifier or 0 if no topic was found or unauthorised + * @access protected + */ + protected function find_topic($title) + { + $topic_ids = []; + + $sql = 'SELECT forum_id, topic_id + FROM ' . $this->functions->table('topics') . ' + WHERE topic_title = "' . $this->db->sql_escape($title) . '"'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + if ($this->auth->acl_get('f_read', (int) $row['topic_id'])) + { + $topic_ids[] = (int) $row['topic_id']; + } + } + + return $topic_ids; + } +} diff --git a/ext/phpbbstudio/aps/core/dbal.php b/ext/phpbbstudio/aps/core/dbal.php new file mode 100644 index 0000000..79467f2 --- /dev/null +++ b/ext/phpbbstudio/aps/core/dbal.php @@ -0,0 +1,119 @@ +layer = $db->get_sql_layer(); + } + + /** + * Get the "random"-function for the current SQL layer. + * + * @return string The "random"-function + * @access public + */ + public function random() + { + switch ($this->layer) + { + case 'postgres': + return 'RANDOM()'; + break; + + case 'mssql': + case 'mssql_odbc': + return 'NEWID()'; + break; + + default: + return 'RAND()'; + break; + } + } + + /** + * Get the "month from a UNIX timestamp"-function for the current SQL layer. + * + * @param string $column The column name holding the UNIX timestamp + * @return string The "month from a UNIX timestamp"-function + * @access public + */ + public function unix_to_month($column) + { + switch ($this->layer) + { + case 'mssql': + case 'mssql_odbc': + case 'mssqlnative': + return 'DATEADD(m, ' . $column . ', 19700101)'; + break; + + case 'postgres': + return 'extract(month from to_timestamp(' . $column . '))'; + break; + + case 'sqlite3': + return "strftime('%m', datetime(" . $column . ", 'unixepoch'))"; + break; + + default: + return 'MONTH(FROM_UNIXTIME(' . $column . '))'; + break; + } + } + + /** + * Get the "year from a UNIX timestamp"-function for the current SQL layer. + * + * @param string $column The column name holding the UNIX timestamp + * @return string The "year from a UNIX timestamp"-function + * @access public + */ + public function unix_to_year($column) + { + switch ($this->layer) + { + case 'mssql': + case 'mssql_odbc': + case 'mssqlnative': + return 'DATEADD(y, ' . $column . ', 19700101)'; + break; + + case 'postgres': + return 'extract(year from to_timestamp(' . $column . '))'; + break; + + case 'sqlite3': + return "strftime('%y', datetime(" . $column . ", 'unixepoch'))"; + break; + + default: + return 'YEAR(FROM_UNIXTIME(' . $column . '))'; + break; + } + } +} diff --git a/ext/phpbbstudio/aps/core/functions.php b/ext/phpbbstudio/aps/core/functions.php new file mode 100644 index 0000000..ae4531b --- /dev/null +++ b/ext/phpbbstudio/aps/core/functions.php @@ -0,0 +1,501 @@ +auth = $auth; + $this->config = $config; + $this->db = $db; + $this->language = $language; + $this->path_helper = $path_helper; + $this->request = $request; + $this->user = $user; + + $this->table_prefix = $table_prefix; + $this->constants = $constants; + + $this->is_dae_enabled = $ext_manager->is_enabled('threedi/dae') && $config['threedi_default_avatar_extended']; + } + + /** + * Prefix a table name. + * + * This is to not rely on constants. + * + * @param string $name The table name to prefix + * @return string The prefixed table name + * @access public + */ + public function table($name) + { + return $this->table_prefix . $name; + } + + /** + * Select a forum name for a specific forum identifier. + * + * @param int $forum_id The forum identifier + * @return string The forum name + * @access public + */ + public function forum_name($forum_id) + { + $sql = 'SELECT forum_name FROM ' . $this->table('forums') . ' WHERE forum_id = ' . (int) $forum_id; + $result = $this->db->sql_query_limit($sql, 1); + $forum_name = $this->db->sql_fetchfield('forum_name'); + $this->db->sql_freeresult($result); + + return $forum_name; + } + + public function post_data($post_id) + { + $sql = 'SELECT t.topic_first_post_id, p.poster_id + FROM ' . $this->table('posts') . ' p, + ' . $this->table('topics') . ' t + WHERE p.topic_id = t.topic_id + AND p.post_id = ' . (int) $post_id; + $result = $this->db->sql_query_limit($sql, 1); + $post_data = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return $post_data; + } + + /** + * Get topic and post locked status. + * + * Called when a moderator edits a post. + * + * @param int $post_id The post identifier + * @return array The database row + * @access public + */ + public function topic_post_locked($post_id) + { + $sql = 'SELECT t.topic_poster, t.topic_status, p.post_edit_locked + FROM ' . $this->table('posts') . ' p, + ' . $this->table('topics') . ' t + WHERE p.topic_id = t.topic_id + AND post_id = ' . (int) $post_id; + $result = $this->db->sql_query_limit($sql, 1); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return $row; + } + + /** + * Get avatars for provided user identifiers. + * + * @param array $user_ids The user identifiers. + * @return array Array of the users' avatars indexed per user identifier + * @access public + */ + public function get_avatars($user_ids) + { + $avatars = []; + + $sql = 'SELECT user_id, user_avatar, user_avatar_type, user_avatar_width, user_avatar_height + FROM ' . $this->table('users') . ' + WHERE ' . $this->db->sql_in_set('user_id', $user_ids, false, true) . ' + AND user_type <> ' . USER_IGNORE; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $avatars[(int) $row['user_id']] = phpbb_get_user_avatar($row); + } + $this->db->sql_freeresult($result); + + return $avatars; + } + + /** + * Checks whether Advanced Points System is ran in Safe Mode, + * meaning that exceptions will be caught and logged instead of thrown. + * Safe mode should be turned "off" when testing and developing. + * + * @return bool Whether APS is ran in Safe Mode or not. + * @access public + */ + public function safe_mode() + { + return (bool) $this->config['aps_points_safe_mode']; + } + + /** + * Get a formatted points string according to the settings. + * + * @param double $points The points to display + * @param bool $icon Whether or not to also display the points icon + * @return string The formatted points for display + * @access public + */ + public function display_points($points, $icon = true) + { + $separator_dec = htmlspecialchars_decode($this->config['aps_points_separator_dec']); + $separator_thou = htmlspecialchars_decode($this->config['aps_points_separator_thou']); + + $points = number_format((double) $points, (int) $this->config['aps_points_decimals'], (string) $separator_dec, (string) $separator_thou); + + // If we do not want the icon, return now + if (!$icon) + { + return $points; + } + + // Get the icon side + $right = (bool) $this->config['aps_points_icon_position']; + + return $right ? ($points . ' ' . $this->get_icon()) : ($this->get_icon() . ' ' . $points); + } + + /** + * Format points for usage in input fields + * + * @param double $points The points to format + * @return double + * @access public + */ + public function format_points($points) + { + return (double) round($points, (int) $this->config['aps_points_decimals']); + } + + /** + * Get the points icon for display. + * + * @param bool $force_fa Whether to force FA icon + * @return string The HTML formatted points icon + * @access public + */ + public function get_icon($force_fa = false) + { + if (!$force_fa && $this->config['aps_points_icon_img']) + { + $board_url = defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH; + $base_path = $board_url || $this->request->is_ajax() ? generate_board_url() . '/' : $this->path_helper->get_web_root_path(); + + $source = $base_path . 'images/' . (string) $this->config['aps_points_icon_img']; + + return '' . $this->get_name() . ''; + } + + return ''; + } + + /** + * Get the localised points name. + * + * @return string The localised points name + * @access public + */ + public function get_name() + { + if (empty($this->name)) + { + $key = 'aps_points_name_'; + + $name = !empty($this->config[$key . $this->user->lang_name]) ? $this->config[$key . $this->user->lang_name] : $this->config[$key . $this->config['default_lang']]; + + // Fallback + $name = !empty($name) ? $name : 'Points'; + + $this->name = $name; + } + + return $this->name; + } + + public function get_auth($name, $forum_id) + { + // Fix for template functions + $forum_id = $forum_id === true ? 0 : $forum_id; + + return $this->auth->acl_get($name, $forum_id); + } + + /** + * Get an config value for given config name. + * + * @param string $name The APS config name + * @return string The APS config value + * @access public + */ + public function get_config($name) + { + return $this->config->offsetGet($name); + } + + /** + * Get the step amount for a numeric input field. + * + * @return double + * @access public + */ + public function get_step() + { + return round(substr_replace('001', '.', (3 - (int) $this->config['aps_points_decimals']), 0), $this->config['aps_points_decimals']); + } + + /** + * Equates an array of points to a single points value. + * + * @param array $array The array to equate + * @param string $operator The equation operator + * @return double The equated points value + * @access public + */ + public function equate_array(array $array, $operator = '+') + { + $result = array_reduce( + $array, + function($a, $b) use ($operator) + { + return $this->equate_points($a, $b, $operator); + }, + 0.00); + + return $result; + } + + /** + * Equate two points by reference. + * + * @param double $a The referenced points value + * @param double $b The points value to equate + * @param string $operator The equation operator + * @return void Passed by reference + * @access public + */ + public function equate_reference(&$a, $b, $operator = '+') + { + $a = $this->equate_points($a, $b, $operator); + } + + /** + * Equate two points. + * + * @param double $a The points value to equate + * @param double $b The points value to equate + * @param string $operator The equation operator + * @return double The equated points value + * @access public + */ + public function equate_points($a, $b, $operator = '+') + { + $b = $this->is_points($b) ? $b : 0; + + switch ($operator) + { + # Multiply + case 'x': + case '*'; + $a *= $b; + break; + + # Divide + case '÷': + case '/': + $a = $b ? $a / $b : 0; + break; + + # Subtract + case '-': + $a -= $b; + break; + + # Add + case '+': + default: + $a += $b; + break; + } + + return (double) $a; + } + + /** + * Check if a points value is numeric. + * + * @param mixed $points The points value + * @return bool Whether the value is numeric or not + * @access public + */ + public function is_points($points) + { + return is_numeric($points); + } + + /** + * Checks whether a user's points are within the Min. and Max. allowed points. + * + * @param double $points The new total + * @return double The new total that is within the boundaries + * @access public + */ + public function boundaries($points) + { + // Check if the new total is lower than the minimum value, has to be '' as 0 is a valid minimum value. + if (($min = $this->config['aps_points_min']) !== '') + { + $min = (double) $min; + $points = $points < $min ? $min : $points; + } + + // Check if the new total is higher than the maximum value, has to be '' as 0 is a valid maximum value. + if (($max = $this->config['aps_points_max']) !== '') + { + $max = (double) $max; + $points = $points > $max ? $max : $points; + } + + return $points; + } + + /** + * Get a default no_avatar HTML string. + * + * @return string HTML formatted no_avatar string + * @access public + */ + public function get_no_avatar() + { + // If DAE is enabled we do not have to set up a default avatar + if ($this->is_dae_enabled()) + { + return ''; + } + + $board_url = generate_board_url() . '/'; + $corrected_path = $this->path_helper->get_web_root_path(); + $web_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? $board_url : $corrected_path; + $theme_path = "{$web_path}styles/" . rawurlencode($this->user->style['style_path']) . '/theme'; + + $no_avatar = '' . $this->language->lang('USER_AVATAR') . ''; + + return $no_avatar; + } + + /** + * Checks whether Default Avatar Extended (DAE) is enabled or not. + * + * @return bool Whether DAE is enabled or not. + * @access public + */ + public function is_dae_enabled() + { + return (bool) ($this->is_dae_enabled && $this->config['threedi_default_avatar_extended']); + } + + /** + * Get link locations. + * + * @param string $key The config key + * @return array The link locations data + */ + public function get_link_locations($key = 'aps_link_locations') + { + $links = []; + + foreach($this->constants['locations'] as $location => $flag) + { + $links[$location] = (bool) ((int) $this->config[$key] & $flag); + } + + return $links; + } + + /** + * Set link locations + * + * @param array $locations The link locations data + * @param string $key The config key + * @return void + */ + public function set_link_locations(array $locations, $key = 'aps_link_locations') + { + $flags = 0; + + foreach ($locations as $location => $status) + { + $flags += $status ? (int) $this->constants['locations'][$location] : 0; + } + + $this->config->set($key, (int) $flags); + } +} diff --git a/ext/phpbbstudio/aps/core/language.php b/ext/phpbbstudio/aps/core/language.php new file mode 100644 index 0000000..437acee --- /dev/null +++ b/ext/phpbbstudio/aps/core/language.php @@ -0,0 +1,106 @@ +config = $config; + $this->language = $language; + $this->manager = $manager; + $this->user = $user; + + $this->php_ext = $php_ext; + } + + /** + * Load all language files used for the Advanced Points System. + * + * @see \p_master::add_mod_info() + * + * @return void + * @access public + */ + public function load() + { + $finder = $this->manager->get_finder(); + + $finder->prefix('phpbbstudio_aps_') + ->suffix('.' . $this->php_ext); + + // We grab the language files from the default, English and user's language. + // So we can fall back to the other files like we do when using add_lang() + $default_lang_files = $english_lang_files = $user_lang_files = []; + + // Search for board default language if it's not the user language + if ($this->config['default_lang'] != $this->user->lang_name) + { + $default_lang_files = $finder + ->extension_directory('/language/' . basename($this->config['default_lang'])) + ->find(); + } + + // Search for english, if its not the default or user language + if ($this->config['default_lang'] != 'en' && $this->user->lang_name != 'en') + { + $english_lang_files = $finder + ->extension_directory('/language/en') + ->find(); + } + + // Find files in the user's language + $user_lang_files = $finder + ->extension_directory('/language/' . $this->user->lang_name) + ->find(); + + $lang_files = array_merge($english_lang_files, $default_lang_files, $user_lang_files); + foreach ($lang_files as $lang_file => $ext_name) + { + $this->language->add_lang($lang_file, $ext_name); + } + } +} diff --git a/ext/phpbbstudio/aps/core/log.php b/ext/phpbbstudio/aps/core/log.php new file mode 100644 index 0000000..48d2864 --- /dev/null +++ b/ext/phpbbstudio/aps/core/log.php @@ -0,0 +1,560 @@ +auth = $auth; + $this->config = $config; + $this->db = $db; + $this->functions = $functions; + $this->language = $language; + $this->lang_aps = $lang_aps; + $this->user = $user; + $this->table = $table; + + $this->root_path = $root_path; + $this->admin_path = $root_path . $admin_path; + $this->php_ext = $php_ext; + + $this->set_is_admin((defined('ADMIN_START') && ADMIN_START) || (defined('IN_ADMIN') && IN_ADMIN)); + } + + /** + * Set is_in_admin in order to return administrative user profile links in get(). + * + * @param bool $is_in_admin Called from within the acp? + * @return void + * @access public + */ + public function set_is_admin($is_in_admin) + { + $this->is_in_admin = (bool) $is_in_admin; + } + + /** + * Returns the is_in_admin option. + * + * @return bool Called from within the acp? + * @access public + */ + public function get_is_admin() + { + return $this->is_in_admin; + } + + /** + * {@inheritDoc} + */ + public function get_log_count() + { + return ($this->entries_count) ? $this->entries_count : 0; + } + /** + * {@inheritDoc} + */ + public function get_valid_offset() + { + return ($this->last_page_offset) ? $this->last_page_offset : 0; + } + + /** + * Loads the language files used by the Advanced Points System. + * + * @return void + * @access public + */ + public function load_lang() + { + $this->lang_aps->load(); + } + + /** + * Log a points action. + * + * @param array $data The array to log + * @param int $time The time to log + * @return bool|int False on error, new log entry identifier otherwise + * @access public + */ + public function add(array $data, $time = 0) + { + // We need to have at least the log action, points gained/lost and either the old or new user points. + if ($this->check_row($data)) + { + return false; + } + + $row = $this->prepare_row($data, $time); + + $sql = 'INSERT INTO ' . $this->table . ' ' . $this->db->sql_build_array('UPDATE', $row); + $this->db->sql_query($sql); + + return $this->db->sql_nextid(); + } + + /** + * Log multiple points actions at once. + * + * @param array $data The arrays to log + * @param int $time The time to log + * @return bool + * @access public + */ + public function add_multi(array $data, $time = 0) + { + $logs = []; + + foreach ($data as $row) + { + // We need to have at least the log action, points gained/lost and either the old or new user points. + if ($this->check_row($row)) + { + continue; + } + + $logs[] = $this->prepare_row($row, $time); + } + + $this->db->sql_multi_insert($this->table, $logs); + + return (bool) !empty($logs); + } + + /** + * Check whether a log row has the minimal required information. + * + * @param array $row The log row the check + * @return bool Whether this log row is eligible or not + * @access public + */ + public function check_row(array $row) + { + return (bool) (empty($row['action']) || in_array($row['points_sum'], [0, 0.0, 0.00]) || (!isset($row['points_old']) && !isset($row['points_new']))); + } + + /** + * Prepare a log row for inserting in the database table. + * + * @param array $row The log row to prepare + * @param int $time The time to log + * @return array The prepared log row + * @access public + */ + public function prepare_row(array $row, $time) + { + return [ + 'log_action' => $row['action'], + 'log_actions' => !empty($row['actions']) ? serialize($row['actions']) : '', + 'log_time' => $time ? $time : time(), + 'log_approved' => isset($row['approved']) ? (bool) $row['approved'] : true, + 'forum_id' => !empty($row['forum_id']) ? (int) $row['forum_id'] : 0, + 'topic_id' => !empty($row['topic_id']) ? (int) $row['topic_id'] : 0, + 'post_id' => !empty($row['post_id']) ? (int) $row['post_id'] : 0, + 'user_id' => !empty($row['user_id']) ? (int) $row['user_id'] : (int) $this->user->data['user_id'], + 'reportee_id' => !empty($row['reportee_id']) ? (int) $row['reportee_id'] : (int) $this->user->data['user_id'], + 'reportee_ip' => !empty($row['reportee_ip']) ? (string) $row['reportee_ip'] : (string) $this->user->ip, + 'points_old' => isset($row['points_old']) ? (double) $row['points_old'] : $this->functions->equate_points($row['points_new'], $row['points_sum'], '-'), + 'points_sum' => (double) $row['points_sum'], + 'points_new' => isset($row['points_new']) ? (double) $this->functions->boundaries($row['points_new']) : $this->functions->boundaries($this->functions->equate_points($row['points_old'], $row['points_sum'], '+')), + ]; + } + + /** + * Delete a points action from the logs depending on the conditions. + * + * @param array $conditions The delete conditions + * @return void + * @access public + */ + public function delete(array $conditions) + { + // Need an "empty" sql where to begin with + $sql_where = ''; + + if (isset($conditions['keywords'])) + { + $sql_where .= $this->generate_sql_keyword($conditions['keywords'], ''); + unset($conditions['keywords']); + } + + foreach ($conditions as $field => $field_value) + { + $sql_where .= ' AND '; + + if (is_array($field_value) && count($field_value) == 2 && !is_array($field_value[1])) + { + $sql_where .= $field . ' ' . $field_value[0] . ' ' . $field_value[1]; + } + else if (is_array($field_value) && isset($field_value['IN']) && is_array($field_value['IN'])) + { + $sql_where .= $this->db->sql_in_set($field, $field_value['IN']); + } + else + { + $sql_where .= $field . ' = ' . $field_value; + } + } + + $sql = 'DELETE FROM ' . $this->table . ' WHERE log_id <> 0 ' . $sql_where; + $this->db->sql_query($sql); + } + + /** + * Gets the logged point values for a given user id and post ids combination. + * + * @param int $user_id The user identifier + * @param array $post_ids The post identifiers + * @param bool $approved Whether the logged entries are set to approved or not + * @return array The array of point values indexed per post identifier + * @access public + */ + public function get_values($user_id, array $post_ids, $approved = true) + { + $points = []; + + $sql = 'SELECT points_sum, post_id + FROM ' . $this->table . ' + WHERE user_id = ' . (int) $user_id . ' + AND log_approved = ' . (int) $approved . ' + AND ' . $this->db->sql_in_set('post_id', $post_ids, false, true); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $points[(int) $row['post_id']] = $row['points_sum']; + } + $this->db->sql_freeresult($result); + + return $points; + } + + /** + * Sets logged entries to approved for a given user id and post ids combination. + * + * @param int $user_id The user identifier + * @param array $post_ids The post identifiers + * @return void + * @access public + */ + public function approve($user_id, array $post_ids) + { + $sql = 'UPDATE ' . $this->table . ' + SET log_approved = 1 + WHERE log_approved = 0 + AND user_id = ' . (int) $user_id . ' + AND ' . $this->db->sql_in_set('post_id', $post_ids, false, true); + $this->db->sql_query($sql); + } + + /** + * Get logged point actions for a certain combination. + * + * @param bool $count Whether we should count the total amount of logged entries for this combination. + * @param int $limit The amount of rows to return + * @param int $offset The amount of rows from the start to return + * @param int|string $forum_id The forum identifier (set to '' as 0 is a valid choice) + * @param int|array $topic_id The topic identifier + * @param int $post_id The post identifier + * @param int $user_id The user identifier + * @param int $reportee_id The reportee identifier (from user) + * @param int $time The logged time + * @param string $sort_by The ORDER BY clause + * @param string $keywords The keywords to search for + * @return array The found logged point actions for this combination + * @access public + */ + public function get($count = true, $limit = 0, $offset = 0, $forum_id = '', $topic_id = 0, $post_id = 0, $user_id = 0, $reportee_id = 0, $time = 0, $sort_by = 'l.log_time DESC', $keywords = '') + { + $this->entries_count = 0; + $this->last_page_offset = $offset; + + $limit = !empty($limit) ? $limit : $this->config['aps_actions_per_page']; + + $profile_url = ($this->get_is_admin() && $this->admin_path) ? append_sid("{$this->admin_path}index.{$this->php_ext}", 'i=users&mode=overview') : append_sid("{$this->root_path}memberlist.{$this->php_ext}", 'mode=viewprofile'); + + $sql_where = 'l.user_id = u.user_id'; + $sql_where .= $time ? ' AND l.log_time >= ' . (int) $time : ''; + $sql_where .= $forum_id !== '' ? ' AND l.forum_id = ' . (int) $forum_id : ''; + $sql_where .= $topic_id ? (is_array($topic_id) ? ' AND ' . $this->db->sql_in_set('l.topic_id', $topic_id) : ' AND l.topic_id = ' . (int) $topic_id) : ''; + $sql_where .= $post_id ? ' AND l.post_id = ' . (int) $post_id : ''; + $sql_where .= $user_id ? ' AND l.user_id = ' . (int) $user_id : ''; + $sql_where .= $reportee_id ? ' AND l.reportee_id = ' . (int) $reportee_id : ''; + $sql_where .= $this->get_is_admin() ? '' : ' AND l.log_approved = 1'; + + $sql_keywords = ''; + if (!empty($keywords)) + { + // Get the SQL condition for our keywords + $sql_keywords = $this->generate_sql_keyword($keywords); + } + + $sql_ary = [ + 'SELECT' => 'l.*, + u.user_id, u.username, u.user_colour, + r.user_id as reportee_id, r.username as reportee_name, r.user_colour as reportee_colour, + f.forum_name, t.topic_title, p.post_subject', + 'FROM' => [ + $this->table => 'l', + USERS_TABLE => 'u', + ], + 'LEFT_JOIN' => [ + [ + 'FROM' => [USERS_TABLE => 'r'], + 'ON' => 'l.reportee_id = r.user_id', + ], + [ + 'FROM' => [FORUMS_TABLE => 'f'], + 'ON' => 'l.forum_id = f.forum_id', + ], + [ + 'FROM' => [TOPICS_TABLE => 't'], + 'ON' => 'l.topic_id = t.topic_id', + ], + [ + 'FROM' => [POSTS_TABLE => 'p'], + 'ON' => 'l.post_id = p.post_id AND t.topic_first_post_id != p.post_id', + ], + ], + 'WHERE' => $sql_where . $sql_keywords, + 'ORDER_BY' => $sort_by, + ]; + + // Provide moderator anonymity, exclude any "_MOD_" actions + if (!$this->auth->acl_get('u_aps_view_mod')) + { + $sql_ary['WHERE'] .= ' AND log_action ' . $this->db->sql_not_like_expression($this->db->get_any_char() . '_MOD_' . $this->db->get_any_char()); + } + + if ($count) + { + $count_array = $sql_ary; + + $count_array['SELECT'] = 'COUNT(log_id) as count'; + unset($count_array['LEFT_JOIN'], $count_array['ORDER_BY']); + + $sql = $this->db->sql_build_query('SELECT', $count_array); + $result = $this->db->sql_query($sql); + $this->entries_count = (int) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + if ($this->entries_count === 0) + { + $this->last_page_offset = 0; + return []; + } + + while ($this->last_page_offset >= $this->entries_count) + { + $this->last_page_offset = max(0, $this->last_page_offset - $limit); + } + } + + $logs = []; + + $sql = $this->db->sql_build_query('SELECT', $sql_ary); + $result = $this->db->sql_query_limit($sql, $limit, $this->last_page_offset); + while ($row = $this->db->sql_fetchrow($result)) + { + $s_authed = (bool) ($row['forum_id'] && $this->auth->acl_get('f_read', (int) $row['forum_id'])); + + // append_sid() will ignore params with a NULL value + $forum_params = ['f' => ($row['forum_id'] ? (int) $row['forum_id'] : null)]; + $topic_params = ['t' => ($row['topic_id'] ? (int) $row['topic_id'] : null)]; + + $s_points = ($this->auth->acl_get('a_forum') && $this->auth->acl_get('a_aps_points')); + $points_forum = append_sid("{$this->admin_path}index.{$this->php_ext}", ['i' => 'acp_forums', 'mode' => 'manage', 'action' => 'edit', 'f' => (int) $row['forum_id'], '#' => 'aps_points']); + $points_global = append_sid("{$this->admin_path}index.{$this->php_ext}", ['i' => '-phpbbstudio-aps-acp-main_module', 'mode' => 'points']); + + $logs[] = [ + 'id' => (int) $row['log_id'], + + 'user' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, $profile_url), + 'user_id' => (int) $row['user_id'], + 'reportee' => $row['reportee_id'] != ANONYMOUS ? get_username_string('full', $row['reportee_id'], $row['reportee_name'], $row['reportee_colour'], false, $profile_url) : '', + 'reportee_id' => (int) $row['reportee_id'], + 's_self' => (bool) ((int) $row['user_id'] === (int) $row['reportee_id']), + + 'ip' => (string) $row['reportee_ip'], + 'time' => (int) $row['log_time'], + 'action' => (string) $row['log_action'], + 'actions' => unserialize($row['log_actions']), + + 'approved' => (bool) $row['log_approved'], + + 'forum_id' => (int) $row['forum_id'], + 'forum_name' => (string) $row['forum_name'], + 'u_forum' => ($row['forum_id'] && $s_authed) ? append_sid("{$this->root_path}viewforum.{$this->php_ext}", $forum_params) : '', + + 'topic_id' => (int) $row['topic_id'], + 'topic_title' => (string) $row['topic_title'], + 'u_topic' => ($row['topic_id'] && $s_authed) ? append_sid("{$this->root_path}viewtopic.{$this->php_ext}", array_merge($forum_params, $topic_params)) : '', + + 'post_id' => (int) $row['post_id'], + 'post_subject' => (string) $row['post_subject'], + 'u_post' => ($row['post_id'] && $s_authed) ? append_sid("{$this->root_path}viewtopic.{$this->php_ext}", array_merge($forum_params, $topic_params, ['p' => (int) $row['post_id'], '#' => 'p' . (int) $row['post_id']])) : '', + + 'points_old' => $row['points_old'] !== '0.00' ? (double) $row['points_old'] : $this->functions->equate_points((double) $row['points_new'], $row['points_sum'], '-'), + 'points_sum' => (double) $row['points_sum'], + 'points_new' => $row['points_new'] !== '0.00' ? (double) $row['points_new'] : $this->functions->equate_points((double) $row['points_old'], $row['points_sum'], '+'), + 'u_points' => $s_points ? ($row['forum_id'] ? $points_forum : $points_global) : '', + ]; + } + $this->db->sql_freeresult($result); + + return $logs; + } + + /** + * Generates a sql condition for the specified keywords + * + * @param string $keywords The keywords the user specified to search for + * @param string $table_alias The alias of the logs' table ('l.' by default) + * @param string $statement_operator The operator used to prefix the statement ('AND' by default) + * @return string Returns the SQL condition searching for the keywords + * @access protected + */ + protected function generate_sql_keyword($keywords, $table_alias = 'l.', $statement_operator = 'AND') + { + // Use no preg_quote for $keywords because this would lead to sole + // backslashes being added. We also use an OR connection here for + // spaces and the | string. Currently, regex is not supported for + // searching (but may come later). + $keywords = preg_split('#[\s|]+#u', utf8_strtolower($keywords), 0, PREG_SPLIT_NO_EMPTY); + + $sql_keywords = ''; + + if (!empty($keywords)) + { + $keywords_pattern = []; + + // Build pattern and keywords... + for ($i = 0, $num_keywords = count($keywords); $i < $num_keywords; $i++) + { + $keywords_pattern[] = preg_quote($keywords[$i], '#'); + } + + $keywords_pattern = '#' . implode('|', $keywords_pattern) . '#ui'; + + $operations = []; + + foreach ($this->language->get_lang_array() as $key => $value) + { + if (substr($key, 0, 4) == 'APS_') + { + if (is_array($value)) + { + foreach ($value as $plural_value) + { + if (preg_match($keywords_pattern, $plural_value)) + { + $operations[] = $key; + break; + } + } + } + else if (preg_match($keywords_pattern, $value)) + { + $operations[] = $key; + } + else if (preg_match($keywords_pattern, $key)) + { + $operations[] = $key; + } + } + } + + if (!empty($operations)) + { + $sql_keywords = ' ' . $statement_operator . ' ('; + $sql_keywords .= $this->db->sql_in_set($table_alias . 'log_action', $operations); + $sql_keywords .= ')'; + } + } + + return $sql_keywords; + } +} diff --git a/ext/phpbbstudio/aps/core/template.php b/ext/phpbbstudio/aps/core/template.php new file mode 100644 index 0000000..6fac8c7 --- /dev/null +++ b/ext/phpbbstudio/aps/core/template.php @@ -0,0 +1,104 @@ +functions = $functions; + } + + /** + * Get the name of this extension + * + * @return string + * @access public + */ + public function getName() + { + return 'phpbbstudio_aps'; + } + + /** + * Returns a list of global functions to add to the existing list. + * + * @return array An array of global functions + * @access public + */ + public function getFunctions() + { + return [ + // Template functions prefixed with "aps_" come here + new \Twig_SimpleFunction('aps_*', [$this, 'aps_handle']), + ]; + } + + /** + * Handle the called template function. + * + * @param string $function The APS Core function name + * @param mixed $points First parameter from the called template function + * @param bool $boolean Second parameter from the called template function + * @return mixed + * @access public + */ + public function aps_handle($function, $points = 0, $boolean = true) + { + switch ($function) + { + case 'auth': + return $this->functions->get_auth($points, $boolean); + break; + + case 'config': + return $this->functions->get_config($points); + break; + + case 'display': + return $this->functions->display_points($points, $boolean); + break; + + case 'format': + return $this->functions->format_points($points); + break; + + case 'icon': + return $this->functions->get_icon($points); + break; + + case 'name'; + return $this->functions->get_name(); + break; + + case 'step': + return $this->functions->get_step(); + break; + + default: + return ''; + break; + } + } +} diff --git a/ext/phpbbstudio/aps/cron/task/birthday.php b/ext/phpbbstudio/aps/cron/task/birthday.php new file mode 100644 index 0000000..4383a16 --- /dev/null +++ b/ext/phpbbstudio/aps/cron/task/birthday.php @@ -0,0 +1,122 @@ +config = $config; + $this->db = $db; + $this->functions = $functions; + $this->manager = $manager; + } + + /** + * Runs this cron task. + * + * @return void + * @access public + */ + public function run() + { + $user_ids = $data = []; + $data['birthdays'] = []; + + // Set the default timezone + date_default_timezone_set($this->config['board_timezone']); + + // Get current day and month (no leading zero) + $day = date('j'); + $month = date('n'); + + // Birthdays are stored with a leading space if only one digit: " 8- 6-1990". + $data['day'] = strlen($day) === 1 ? ' ' . $day : $day; + $data['month'] = strlen($month) === 1 ? ' ' . $month : $month; + + // Build a SQL like expression: DD-MM-% + $birthday = $data['day'] . '-' . $data['month'] . '-' . $this->db->get_any_char(); + + // Select all the user identifiers that are celebrating their birthday today + $sql = 'SELECT user_id, user_birthday + FROM ' . $this->functions->table('users') . ' + WHERE user_type <> ' . USER_IGNORE . ' + AND user_birthday ' . $this->db->sql_like_expression($birthday); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $user_ids[] = $row['user_id']; + + $data['birthdays'][(int) $row['user_id']] = $row['user_birthday']; + } + $this->db->sql_freeresult($result); + + // Calculate the points! + $this->manager->trigger('birthday', $user_ids, $data); + + // Update the cron task run time here + $this->config->set('aps_birthday_last_run', time(), false); + } + + /** + * Returns whether this cron task can run, given current board configuration. + * + * @return bool + * @access public + */ + public function is_runnable() + { + return true; + } + + /** + * Returns whether this cron task should run now, because enough time + * has passed since it was last run. + * + * @return bool + * @access public + */ + public function should_run() + { + return $this->config['aps_birthday_last_run'] < time() - $this->cron_frequency; + } +} diff --git a/ext/phpbbstudio/aps/docs/.htaccess b/ext/phpbbstudio/aps/docs/.htaccess new file mode 100644 index 0000000..4128d34 --- /dev/null +++ b/ext/phpbbstudio/aps/docs/.htaccess @@ -0,0 +1,4 @@ + + Order Allow,Deny + Deny from All + diff --git a/ext/phpbbstudio/aps/docs/CHANGELOG.md b/ext/phpbbstudio/aps/docs/CHANGELOG.md new file mode 100644 index 0000000..9173680 --- /dev/null +++ b/ext/phpbbstudio/aps/docs/CHANGELOG.md @@ -0,0 +1,53 @@ +# phpBB Studio - Advanced Points System + +#### v1.0.6-RC on 11-03-2020 +- Fixed template block inclusion +- Fixed approved post points distribution +- Updated permission language strings +- Added phpBB 3.3 compatibility + +#### v1.0.5-RC1 on 20-12-2019 +- Entered the stage features frozen. +- Fixed a bug where points were displayed on profile despite the setting +- Fixed a bug where excluded points were still receiving points +- Added an option to ignore points which do not meet certain criteria +- Added an option to determine where the Points link shows up +- Enhanced the CSS to be altered more easily for other styles + +#### v1.0.4-beta on 01-12-2019 +- Major code clean up +- Bumped phpBB version requirement to 3.2.8 +- Fixed MCP "Front" missing log language strings +- Fixed ACP "Display" missing language strings +- Fixed ACP setting for "icon position" not taking affect +- Added radio CSS to admin +- Added changing user points for an entire group +- Added the possibility to use an image as icon +- Added to automatically hide display categories without blocks +- Added version checker + +#### v1.0.3-beta +- Fixed PHP event DocBlocks versions +- Added PHP event for points distribution + +#### v1.0.2-beta +- Improved position of reportee/moderator name in Actions list +- Added public function for points distribution +- Added PHP and Style events + +#### v1.0.1-beta +- Updated route requirements +- Fixed pagination issues for blocks +- Fixed top users _cups_ to now show proper colour on same points +- Added top users numbers for users not on the podium +- Added two new permissions + - Can only view own logged actions + - Can only view own logged actions augmentation _(build up)_ +- Added support for forum names with special characters, such as emoji +- Added more CSS utility classes +- Fixed CSS to be stylelint compliant +- Fixed a bug where charts were displaying unapproved points +- Fixed a bug where users did not receive unapproved points + +#### v1.0.0-beta +- first public release diff --git a/ext/phpbbstudio/aps/docs/EVENTS.txt b/ext/phpbbstudio/aps/docs/EVENTS.txt new file mode 100644 index 0000000..a3c285a --- /dev/null +++ b/ext/phpbbstudio/aps/docs/EVENTS.txt @@ -0,0 +1,19 @@ +/** + * Advanced Points System extension © Copyright phpBB Studio 2019 + * https://www.phpbbstudio.com + * + * APS is a free extension for the phpBB Forum Software Package. + * You can redistribute it and/or modify it under the terms of + * the GNU General Public License, version 2 (GPL-2.0) as + * published by the Free Software Foundation. + * + * This extension is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * A copy of the license can be viewed in the license.txt file. + * The same can be viewed at + */ + +No events required while using at least phpBB 3.2.8 diff --git a/ext/phpbbstudio/aps/docs/FEATURES.md b/ext/phpbbstudio/aps/docs/FEATURES.md new file mode 100644 index 0000000..d174ea5 --- /dev/null +++ b/ext/phpbbstudio/aps/docs/FEATURES.md @@ -0,0 +1,9 @@ +# phpBB Studio - Advanced Points System + +- Fully integrated Points System for phpBB 3.2 +- Set up point values on a global or per-forum basis. +- All major native phpBB actions are available. +- User, Moderator and Administrator permissions. +- Notification to user on adjustment by moderator.
    *(with anonymity)* +- Integrated and fully extendable overview page.
    *(customisable by user)* +- Fully extendable by other extensions.
    *(with detailed explanation and examples)* diff --git a/ext/phpbbstudio/aps/docs/README.md b/ext/phpbbstudio/aps/docs/README.md new file mode 100644 index 0000000..3b70601 --- /dev/null +++ b/ext/phpbbstudio/aps/docs/README.md @@ -0,0 +1,81 @@ +

    Advanced Points System

    +

    An extension for the phpBB Forum Software.

    + +

    + GPLv2 License +

    + +## Table of Contents +> - [Install](#install) +> - [Uninstall](#uninstall) +> - [Support](#support) +> - [Translations](#translations) +> - [Features](#features) +> - [Other extensions](#other-extensions) +> - [Extending APS](#extending-aps) +> - [You might also like](#you-might-also-like) +> - [License](#license) + +## Install +1. Download the latest validated release +2. Unzip the downloaded release and copy it to the `ext` directory of your phpBB board. +3. Navigate in the ***ACP*** to `Customise » Extension management » Manage extensions`. +4. Look for `phpBB Studio - Advanced Points System` under the **Disabled Extensions** list, and click its **`Enable`** link. +5. Set up and configure `Advanced Points System` by navigating in the ***ACP*** to `Extensions » Advanced Points System`. + +> *Read more about [installing phpBB Extensions](https://www.phpbb.com/extensions/installing/#installing).* + +## Uninstall +1. Navigate in the ***ACP*** to `Customise » Extension management » Manage extensions`. +2. Look for `phpBB Studio - Advanced Points System` under the **Enabled Extensions** list, and click its **`Disable`** link. +3. To permanently uninstall, click **`Delete Data`** and then delete the `/ext/phpbbstudio/aps` directory. + +> *Read more about [uninstalling phpBB Extensions](https://www.phpbb.com/extensions/installing/#removing).* + +## Support +- **Important: Only official release versions validated by the phpBB Extensions Team should be installed on a live forum. Pre-release (beta, RC) versions downloaded from this repository are only to be used for testing on offline/development forums and are not officially supported.** +- Report bugs and other issues to our **[Issue Tracker](https://github.com/phpBB-Studio/AdvancedPointsSystem/issues)**. +- Support requests can be posted and discussed in the **[Extension support](https://phpbbstudio.com/viewforum.php?f=5)** forum over at the [phpBB Studio](https://www.phpbbstudio.com). +- Support requests can be posted and discussed in the **[Development topic](https://www.phpbb.com/community/viewforum.php?f=456)** over at [phpBB.com](https://www.phpbb.com). + +## Translations +- Translations should be posted in the corresponding forum in **[Extension support](https://phpbbstudio.com/viewforum.php?f=5)** over at the [phpBB Studio](https://www.phpbbstudio.com). +- Each translation should be created in a **separate** topic. +- The topic should either contain a **zip archive** as an attachment or a link to your **GitHub repository**. +- Translations should ***not*** be posted in the Development topic over at [phpBB.com](https://www.phpbb.com). +- Translations should ***not*** be created as Pull Requests over at the [GitHub](https://github.com/phpBB-Studio/) repository. + +## Features +- Fully integrated Points System for phpBB 3.2 +- Set up point values on a global or per-forum basis. +- All major native phpBB actions are available. +- User, Moderator and Administrator permissions. +- Notification to user on adjustment by moderator.
    *(with anonymity)* +- Integrated and fully extendable overview page.
    *(customisable by user)* +- Fully extendable by other extensions.
    *(with detailed explanation and examples)* + +## Other extensions +- [Advanced Shop System](https://github.com/phpBB-Studio/AdvancedShopSystem) +- [Advanced Points System · Purchases](https://phpbbstudio.com/extensions/advanced-points-system-purchases) +- [Advanced Points System · Auto Groups](https://github.com/phpBB-Studio/AdvancedShopSystemAutoGroups) +- Bank _(To be determined)_ +- Lottery _(To be determined)_ + +## Extending APS +For the extension developers amongst us, we have written a comprehensive Wiki that should describe everything in detail. +You can read about [Extending APS](https://github.com/phpBB-Studio/AdvancedPointsSystem/wiki/Extending-APS) and all [the possibilities](https://github.com/phpBB-Studio/AdvancedPointsSystem/wiki/Extending-possibilities) there are. If there are still any questions, feel free to ask. + +## You might also like +- Dice Rolls +- Highlight Posts +- Who Read What +- Sub Global Topic +- Topic Cement Style +- Topic Events + + +## License +GNU General Public License, version 2 ([GPLv2](../license.txt)). + +--- +> [phpbbstudio.com](https://www.phpbbstudio.com) · GitHub [phpbb-studio](https://github.com/phpbb-studio/) · phpBB [3Di](https://www.phpbb.com/community/memberlist.php?mode=viewprofile&u=177467) / [mrgoldy](https://www.phpbb.com/community/memberlist.php?mode=viewprofile&u=1114105) diff --git a/ext/phpbbstudio/aps/docs/images/aps.png b/ext/phpbbstudio/aps/docs/images/aps.png new file mode 100644 index 0000000000000000000000000000000000000000..76f5c651f90418b5ba04728e219f75479ac8f8e6 GIT binary patch literal 26707 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 literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/dice_rolls.png b/ext/phpbbstudio/aps/docs/images/dice_rolls.png new file mode 100644 index 0000000000000000000000000000000000000000..881f732a798ce5ea31f3c9d6b21ac14a88077500 GIT binary patch literal 915 zcmV;E18n?>P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<8A(JzRCwC#n#)oXK@^6+$&CoP5JD~jQ327SP!}%Ty7Wm{;>)n)4SWlCmSvS% zrC6i@gGoq~+_)qVGLvy}NRf&JXOfUWGJjPTot{3^)#smc{?pwGKx!R*D+~E!P&F)A zXbXoOf?jwUg}F5pCAp6NaR(N{FcSc$-I$@D2e6%mXEC@xX)Wxipr*lo5qAH;t3`0c zvoIfmhttN5oU4#3K&AxKUWocZQLM!s1vu@(6|D~OEZFkLFgs=3fUd(<27cwhKQ2ZR zx&BN(u&NVS)oA8@k za3Xp~)u330dR_XHdH9xuswzY}IfHUla-~r;2+~ZFemb)C{T7J~RAojVjAvml2N6FU zo(h2?ei70WW8iX#HuAWkQiWng#w|tRL9jDtwmPuUzK&o<`?`%vo!IL2eC|{PDp$ej zfUpl-cG(XI`9J~OP6&A=FIK9MIfPVRemlPhlV+~!>n5VKBl9Se$5aG*9D#!)*i4J= z(RKKqk`z@qk#sg2fblUXl`qHD`;Y~$bB398)XvH6B41!tH%)|L6X%8r6!yXM7<|}< znhLgy*rg~!qQC?!MkI|jlV;G%)oIkZDMxpk2Jb9^03Le z>%Qu4v`2$P4MA_jRx9xu?P0CxY-R_z9Pn};JY%vCG&coP9??UpCVNGDx!!!S|8uqx z?bEAh(Q40ZdswxQ^6oAA>t%Dh(T#ndWC2!YV6F@xx&R9yaXIh}Rb!EU=eRMmA6({7iw*u#iqUaoa?e4WF>=tiFA>l_L|aveQx pT`03)r0Tl3Q1&DWu{D&x0|48Vbh4wtU-$q3002ovPDHLkV1fu6oqhlS literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/highlight_posts.png b/ext/phpbbstudio/aps/docs/images/highlight_posts.png new file mode 100644 index 0000000000000000000000000000000000000000..3373c3e72fee42cb90440d4989a02c3443fb0766 GIT binary patch literal 1053 zcmV+&1mgRNP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZV#A-rea#DMHj>d+mind>%bBXKv?z=0D>V08dtK z%Xhgt#j=CrN`@HXG-#?IZfV>|g;{>ECdAsxvV8XHfSJh<6Jt7>Dtr+;u4J#!B5rAf z3}v{|R}_vb*~vG_Zrd!)n<$x_%@>m)Qc1(Ncv_C+{Rf-ho|bsOWz%woE_Rh2D3vsr zP8wu#HcGMVFgd3CCX^C3cWfR#-)FDbV)aFt?3RrTKtl`nS6R5fIaCt6FT25#u$yN%+E$iSXv;14th}s&EHP|3_5s%3PxW$?MZn4`he_qgC8x8 zL~Ml7h|0I$SSZRrZk8{#*ex_ke;ytt)jkA#S&l|u0@~hd@Zn>FX47LMQ{&!J?8w&s zO{&*lAMod2b)(o~-W9`(gF9CTHoWq+{z2Wl5 z+bT8N1K>@z#`J_iGNB_BP!)lu3U1Cs7>%k-Cyl;xfgtjYAdkWz`A@FT$-exGz;C;* z1(eyW^Wtrlmg7;Wy4X$csH|>#{PL*4Xhg-(6_VFd)@qYW9espJ>9Rb$4Ah$_Q#TC zs^>1AK}PIF@b}Bt%lLa4OD}cB&p*w{ySJ>aUZXcMReoLD$MgQ{Kr>Szez==J9}!#> zf_}OFR9?orf#XVkUoWG@EsgDbv*UH!btU;?3(u28BPxq?CRS8sBU2;0WmBp+lqxO8 z6Z(aS=Cbl%R&4Dyh+7(3Iu+vCs{;g_{W*sK%hZ_rGQzDnld;c65CW#I8@$QZ$d_7# zbmhXuGe~#1jQ>%chx6>@n{0k;urzNX0M=HPWhQ42KPVfb^R4UfgR*og#O()9#NPt| XXkpNvkMfYX00000NkvXXu0mjfn}7EP literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/subglobal_topic.png b/ext/phpbbstudio/aps/docs/images/subglobal_topic.png new file mode 100644 index 0000000000000000000000000000000000000000..84c1ce3beabb35310859058cc07b9031e0f287b9 GIT binary patch literal 993 zcmV<710MW|P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZQ2*n_Av@*WNg8w6A2znw>LqX6BvuoEeP( znEd9kGv$Z4Mip#8iWH%c8j;PRW*4b{IVZ&Al{FU>uc6+ZM^4Rv^3q945f0;HYZc7; zBlN;0w5b$P@4SzkE<`X6*tu~P0{_)=A<&B-VM_P#&V33xlTP$eh4PTo1)MdQN)hQA zRb*~9qP4?4Z{S{Z{GM+iw1=%e#lQU%nBj)O>g7Du%lSiTXVAWr@_pEStNeSoMiq?> zVuURL&UPu5?eBJTot>5M@y>pN7|+HUOeb>RZXC#@4Wplf@N=YmRvy>@9nVOkW*2eW zo7j3~k1#o$bEv`+;J_H%zqQB&8paMhtX)3JNP>is31qjPVb}j?lSt-H60F^VUJj{!#Qj5`lt8zhR!-ZK?}k099B*pSeg-yxt^OtqisD zOQXUvGJh&j^=M6C*o5v?nIsn=tlg+}I@K>pBE;!8%Dlw&RrXY#&A%{zK0suS;VpfR zci{`f8z(TO`-tNch-^q`h@n7xiIG&OIjDA`wA-uBsQT8AUp*Db*2-Xf)R~LOx96Hh zLgKIdfZh5VkvYDrOM^>xYXJQ!MyEo>RkkSKTO{wa*{|>Yc6d^%+^=tghWW@jklT5& z=l_50`yZqvDa0M<>w=@4!1r8zH9ZI37^ZZe;P+n%R&Np%uYpv^>@;q>kuGFJrFdNu z_(VgPn3zJ(ohMjb!IbW`?|ang^Vol?xb6DT7PjBqqFZ?E)lO@{yX9rwh%jj0(=GHw z3HeF**3Y3KvH}69Q|Df}trl&7sxILNh5AV&CT+dj7+gac}p6 zFw=u{DUKp@n$J1xvo-X>B?Q3al{IH7#q>d0iU{ZS-3Mhe3)H_lE&d+>>tM7$qEj=z P00000NkvXXu0mjfPx0Zz literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/topic_cement.png b/ext/phpbbstudio/aps/docs/images/topic_cement.png new file mode 100644 index 0000000000000000000000000000000000000000..141dd848139d196c0f3f30f7692dc4a29a1fe4a7 GIT binary patch literal 787 zcmV+u1MK{XP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;nMp)JRCwC#+TBhQQ4|H>Z)gpWXyZ=+6-fJqcG|1p7DPtV$ zw^&6oSl;i+i`VY?hDH9dA`BakifRIzQIU1RUYP9)k|Q8b(MjpnW{|SfE>^Gcv+etd zcbqa?xJYW2?rDxRC7JWs04Jz*6)vRdKP#*Gx#)lna%JY-yY+gn?fbnxG6WJ;*u^-S zWZG{bj;Pu`M*B2;(P_t^v%pC)?>!NymD5{zA0!$Jq8voEwvXpHi+iVl9C<5x&@29= znD)X1N<+r7rTKP{=xPvVGpe-NAk-dy3}7IelGTfG97L7Xymt}P-HR#jCj<2wZ)8k# zHv3dEveY!pleiOE=7GlU^E__EdHe`gW03(lOjXrO+fmCr!_HjE6VkhiZThX^mB!y1 z6Zjk{Y%asbdL~<~;SU}T$$yl4HN(RJUZ7gj*z}tz&}k;5>O+g1eQG0jY51S{a;#4! z);0F~sX9Hg~-nd9$k#t4*LRpDornwe{(qodp0|45_{Yaul R7mok{002ovPDHLkV1jmFXXF3? literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/topic_events.png b/ext/phpbbstudio/aps/docs/images/topic_events.png new file mode 100644 index 0000000000000000000000000000000000000000..55c9cd293f2fb658c331515b223d206d2d5db703 GIT binary patch literal 910 zcmV;919AL`P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<6iGxuRCwC#noUy^K@f(Y*Htg<<2L%;Kc9$fw;J&xaPS5mozti368UgTP<&FC0?9=q?NF_;- zpc6EqF`{RgOwaP_-7_K9S2k6t@rhijKz1mHCiKKg2|7Y5pSo*dwGWxgEMi#B0k={G z#?5@_MO@jYXz!v4jk}|d(S(jvK1F*6Pq{3NE@5iv#M(D90_lvKd8Cq9&H-A}uQN83 z3(Y>qZ(zF>+J1w!-^BK+w7fdDSH(FQb1Sqw8>#$Q9C~AWjg9TK#QS~3xH(1BuVY9h zL#HjPeMqVK5vA1W*yq~YbMuP!4nhcKM;?$*&j&iU8(yw%T`BS6rc<0EkyH{Ricrh1 z|3#i|P)gDA>{uN3Iy(G>ym8k(5`i>yOf5xzcpebIZ!!t=)87ikQELxPXpx*7SED5n zr%wb@NQSf&`ShK0-@dmGX?RuUG7k|5s>kKNwgmo6CubdcQK|_d=2@AjBQEtU0Sk;?H`to8wAXP>gOcS^TG)goaE;%;-I7Stz2coeyd<_5`!T|X}5 zi5!7Ck*8?yA`ldY7b3L-db#Nv+iT|x*XiaDA~n5S-TF(9PU$yDr?B7Snp%zC$a6%| z-bE^(2{X_1@B+FpxM}FcQG;wBbW7{8Cy?z{DB3$n<&#Sln9n>)y4e3HN(9wX*MdMz zuZ93}soTtF9uAB=f2N8k1!q5RaHqY`>J~<)%NFaGNzt(^qJe`{#J)+28Wi2G0-hZL)jV_0ZAVvEFHP>P)J%=s~1OkOT*IZO6%1()l zG0wg0^1u&qU7Bt;2~zodvEO5i=viv6#YBjIPZQ=e4X;MoDRqr73WY8VZlwx|rEe&z z$7M$JEJiLpL#goz0fEms#>`2^%*n)h|9Rx8yB3w>Bjz%TKf}oS%BHfMgXBS3g5aY0 k*MqWLdWP5Uo{Jv?06LVBXJtTE5C8xG07*qoM6N<$g5l<%Z~y=R literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/aps/docs/images/who_read_what.png b/ext/phpbbstudio/aps/docs/images/who_read_what.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0267feff5503e0c9bcf92329a08ada7d103267 GIT binary patch literal 1055 zcmV+)1mOFLP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZMHGdfi2L^+%hm zsj$XUpujK)DR8Pj{^K&oU%e5c{%YUG#|`}L67EKba74jUfuXROCA~~gZ*Pd|HC%Pt z#@{aCZAAq;1;#6oBk;B&tg)!mHg48b1UoBZ4>UMAVIq^0lZoa?7wZ@KZTQ;*KKVPBFVuUNn znhGq?f0%`=sW94*oyAxKrM()$l{35Pc@oq+cR%hcIhTc#aY|&3C6`2G*BX715bmtt ze_ZNrlmkg81<})00My$XI={Bat~KsjaHq+^u=Z76~# z<0otqA_l8tTxHI>atC7_6;Gb=MRPJPzDYUDr9fFrrE2#yg8XPzL_PERT=s`{$QSsrE}6khAzVG zCXk8Kzl}cx3?p*X#4m#{S)^~0xif7op!9s5@{4t%XKURSm81wyV&W91>=D&#lwYh< zdcKak9!^~`z5m0uFTzBRtI$ESJs9U*W1R;lvy5*d1p;tu!G}k9Aian&aZ2=bmDYC` z2wxIBF5f=hn!eBHnZJV8BWzFy-Y^FObtJ) zBBVfHBw#GUl?0zwZjbRcBe2jpX<@YiDeyKzf}Kji^aF)Hk8!F#uK%b^eB9{zoFSic z2uBd^Rta~jLr>^!Ma3Ka|B3RXmkIhTCaTxE4X6HU->TE%gR%lSJWua~vPWf(zkVbB Z8UP)2^B + + + + + + + + + + + + + diff --git a/ext/phpbbstudio/aps/event/acp.php b/ext/phpbbstudio/aps/event/acp.php new file mode 100644 index 0000000..86a46bb --- /dev/null +++ b/ext/phpbbstudio/aps/event/acp.php @@ -0,0 +1,266 @@ +acp = $acp; + $this->auth = $auth; + $this->config = $config; + $this->functions = $functions; + $this->helper = $helper; + $this->language = $language; + $this->log = $log; + $this->log_aps = $log_aps; + $this->request = $request; + $this->template = $template; + $this->user = $user; + } + + /** + * Assign functions defined in this class to event listeners in the core. + * + * @static + * @return array + * @access public + */ + static public function getSubscribedEvents() + { + return [ + 'core.acp_language_after_delete' => 'delete_name', + + 'core.acp_users_display_overview' => 'display_user', + + 'core.acp_manage_forums_display_form' => 'display_data', + 'core.acp_manage_forums_update_data_after' => 'request_data', + ]; + } + + /** + * Delete a localised points name upon language deletion. + * + * @event core.acp_language_after_delete + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function delete_name(\phpbb\event\data $event) + { + $this->config->delete('aps_points_name_' . $event['lang_iso'], true); + } + + /** + * Display a user's points when managing a specific user. + * + * @event core.acp_users_display_overview + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function display_user(\phpbb\event\data $event) + { + $this->template->assign_var('APS_POINTS', $event['user_row']['user_points']); + } + + /** + * Display a points list when adding/creating a forum. + * + * @event core.acp_manage_forums_display_form + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function display_data(\phpbb\event\data $event) + { + $this->log_aps->load_lang(); + + // Only display a points list if the administrator is authorised to edit the points + if ($s_auth = $this->auth->acl_get('a_aps_points')) + { + // Build a points list for this forum + $this->acp->build((int) $event['forum_id']); + + // Request any action (ajax) + $action = $this->request->variable('aps_action', ''); + + // Ajaxify the copy points action + if (!empty($action) && $this->request->is_ajax()) + { + $json_response = new \phpbb\json_response; + + $forum_id = $this->request->variable('f', 0); + + switch ($action) + { + case 'copy': + $copy = $this->request->variable('aps_points_copy', 0); + + if (empty($copy)) + { + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('ERROR'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_POINTS_COPY_EMPTY_FROM'), + ]); + } + + $fields = $this->acp->get_fields(); + $fields = array_flip($fields[0]); + + $this->acp->copy_points($copy, $forum_id, $fields); + + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_POINTS_COPY_SUCCESS', $this->functions->get_name()), + 'APS_VALUES' => $this->acp->assign_values($forum_id), + ]); + break; + + case 'reset': + if (confirm_box(true)) + { + $this->acp->delete_points($forum_id); + + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_APS_POINTS_RESET_SUCCESS', $this->functions->get_name()), + ]); + } + else + { + confirm_box(false, $this->language->lang('ACP_APS_POINTS_RESET_CONFIRM', $this->functions->get_name()), build_hidden_fields([ + 'aps_action' => $action, + 'forum_id' => $forum_id, + ])); + } + break; + } + } + } + + $this->template->assign_vars([ + 'S_APS_POINTS' => (bool) $s_auth, + 'U_APS_RESET' => $this->helper->get_current_url() . '&aps_action=reset', + ]); + } + + /** + * Request and set the points when adding/editing a forum. + * + * @event core.acp_manage_forums_update_data_after + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function request_data(\phpbb\event\data $event) + { + $this->log_aps->load_lang(); + + // Only set the points when the administrator is authorised to edit the points + if (!$this->auth->acl_get('a_aps_points')) + { + return; + } + + $forum_id = !empty($event['forum_data']['forum_id']) ? (int) $event['forum_data']['forum_id'] : 0; + + $copy = $this->request->variable('aps_points_copy', 0); + $reset = $this->request->variable('aps_points_reset', 0); + $values = $this->request->variable('aps_values', ['' => 0.00]); + + if (!empty($reset) && !empty($forum_id)) + { + $this->acp->delete_points($forum_id); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_POINTS_RESET', time(), [$event['forum_data']['forum_name'], $this->functions->get_name()]); + } + else if (!empty($copy) && $copy != $forum_id) + { + $this->acp->copy_points($copy, $forum_id, $values); + + $forum_name = $this->functions->forum_name($copy); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_APS_POINTS_COPIED', time(), [$forum_name, $event['forum_data']['forum_name'], $this->functions->get_name()]); + } + else + { + $this->acp->set_points($values, $forum_id); + } + } +} diff --git a/ext/phpbbstudio/aps/event/actions.php b/ext/phpbbstudio/aps/event/actions.php new file mode 100644 index 0000000..b19b546 --- /dev/null +++ b/ext/phpbbstudio/aps/event/actions.php @@ -0,0 +1,528 @@ +auth = $auth; + $this->config = $config; + $this->functions = $functions; + $this->manager = $manager; + $this->request = $request; + $this->user = $user; + + $this->root_path = $root_path; + $this->php_ext = $php_ext; + } + + /** + * Assign functions defined in this class to event listeners in the core. + * + * @static + * @return array + * @access public + */ + static public function getSubscribedEvents() + { + return [ + /* User actions */ + 'core.modify_posting_auth' => 'bump', + 'core.submit_post_end' => 'post', + 'core.delete_post_after' => 'post_delete', + 'core.viewtopic_modify_poll_ajax_data' => 'vote', + + /* Moderator actions */ + 'core.mcp_main_modify_fork_sql' => 'copy', + 'core.mcp_change_poster_after' => 'change', + 'core.delete_topics_before_query' => 'delete', + 'core.posting_modify_submit_post_before' => 'lock_and_type', + 'core.mcp_lock_unlock_after' => 'lock', + 'core.move_posts_before' => 'move_posts', + 'core.move_topics_before_query' => 'move_topics', + 'core.approve_posts_after' => 'queue', + 'core.approve_topics_after' => 'queue', + 'core.disapprove_posts_after' => 'queue', + 'core.mcp_forum_merge_topics_after' => 'merge', + + /* Global actions */ + 'core.ucp_register_register_after' => 'register', + 'core.mcp_warn_post_after' => 'warn', + 'core.mcp_warn_user_after' => 'warn', + 'core.submit_pm_after' => 'pm', + ]; + } + + /** + * Trigger Advanced Points System action: “bump”! + * + * @event core.modify_posting_auth + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function bump(\phpbb\event\data $event) + { + if ( + ($event['mode'] !== 'bump') + || + (!$event['is_authed'] || !empty($event['error']) || $event['post_data']['forum_type'] != FORUM_POST) + || + (($event['post_data']['forum_status'] == ITEM_LOCKED || (isset($event['post_data']['topic_status']) && $event['post_data']['topic_status'] == ITEM_LOCKED)) && !$this->auth->acl_get('m_edit', $event['forum_id'])) + ) + { + return; + } + + if ($bump_time = bump_topic_allowed($event['forum_id'], $event['post_data']['topic_bumped'], $event['post_data']['topic_last_post_time'], $event['post_data']['topic_poster'], $event['post_data']['topic_last_poster_id']) + && check_link_hash($this->request->variable('hash', ''), "topic_{$event['post_data']['topic_id']}")) + { + $this->manager->trigger('topic', $this->user->data['user_id'], $event, $event['forum_id']); + } + } + + /** + * Trigger Advanced Points System action: “post” or “topic”! + * + * @event core.submit_post_end + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function post(\phpbb\event\data $event) + { + if ($event['mode'] === 'edit' && $event['data']['poster_id'] != $this->user->data['user_id']) + { + $this->manager->trigger('edit', $event['data']['poster_id'], $event, $event['data']['forum_id']); + + return; + } + + switch ($event['mode']) + { + case 'edit': + $action = $event['data']['topic_first_post_id'] == $event['data']['post_id'] ? 'topic' : 'post'; + break; + + case 'post': + $action = 'topic'; + break; + + case 'reply': + case 'quote': + $action = 'post'; + break; + + default: + return; + break; + } + + $this->manager->trigger($action, $this->user->data['user_id'], $event, $event['data']['forum_id']); + } + + /** + * Trigger Advanced Points System action: “delete” or “post”! + * + * @event core.delete_post_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function post_delete(\phpbb\event\data $event) + { + if ($this->user->data['user_id'] == $event['data']['poster_id']) + { + $data = array_merge($this->manager->clean_event($event), [ + 'mode' => ($event['is_soft'] ? 'soft_' : '') . 'delete', + 'post_data' => ['topic_type' => POST_NORMAL], + ]); + + $this->manager->trigger('post', $event['data']['poster_id'], $data, $event['forum_id']); + } + else + { + $data = [ + 'action' => 'post', + 'is_soft' => $event['is_soft'], + 'posts' => [ + 0 => [ + 'forum_id' => $event['forum_id'], + 'topic_id' => $event['topic_id'], + 'post_id' => $event['post_id'], + 'poster_id' => $event['data']['poster_id'], + ], + ], + ]; + + $this->manager->trigger('delete', $event['data']['poster_id'], $data, $event['forum_id']); + } + } + + /** + * Trigger Advanced Points System action: “vote”! + * + * @event core.viewtopic_modify_poll_ajax_data + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function vote(\phpbb\event\data $event) + { + $this->manager->trigger('vote', $this->user->data['user_id'], $event, $event['forum_id']); + } + + /** + * Trigger Advanced Points System action: “copy”! + * + * @event core.mcp_main_modify_fork_sql + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function copy(\phpbb\event\data $event) + { + $this->manager->trigger('copy', $event['topic_row']['topic_poster'], $event, [(int) $event['topic_row']['forum_id'], (int) $event['sql_ary']['forum_id']]); + } + + /** + * Trigger Advanced Points System action: “change”! + * + * @event core.mcp_change_poster_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function change(\phpbb\event\data $event) + { + $this->manager->trigger('change', [$event['userdata']['user_id'], $event['post_info']['poster_id']], $event, $event['post_info']['forum_id']); + } + + /** + * Trigger Advanced Points System action: “delete”! + * + * @event core.delete_topics_before_query + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function delete(\phpbb\event\data $event) + { + // Check for chain triggering events + if (!$this->config['aps_chain_merge_delete'] && $this->request->variable('action', '', true) === 'merge_topics') + { + return; + } + + if (!function_exists('phpbb_get_topic_data')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_mcp.' . $this->php_ext; + } + + $topics = phpbb_get_topic_data($event['topic_ids']); + + $forum_ids = $this->manager->get_identifiers($topics, 'forum_id'); + $user_ids = $this->manager->get_identifiers($topics, 'topic_poster'); + + $data = array_merge($this->manager->clean_event($event), [ + 'action' => 'topic', + 'topics' => $topics, + ]); + + $this->manager->trigger('delete', $user_ids, $data, $forum_ids); + } + + /** + * Trigger Advanced Points System action: “lock” and/or “type”! + * + * @event core.posting_modify_submit_post_before + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function lock_and_type(\phpbb\event\data $event) + { + if ($event['mode'] === 'edit') + { + if ($this->user->data['user_id'] != $event['data']['poster_id']) + { + $row = $this->functions->topic_post_locked($event['data']['post_id']); + + if ($row['post_edit_locked'] != $event['data']['post_edit_locked']) + { + $data = array_merge($this->manager->clean_event($event), [ + 'action' => $event['data']['post_edit_locked'] ? 'lock_post' : 'unlock_post', + 'data' => [$event['data']], + ]); + + $this->manager->trigger('lock', $event['data']['poster_id'], $data, $event['data']['forum_id']); + } + + if ($row['topic_status'] != $event['data']['topic_status']) + { + $data = array_merge($this->manager->clean_event($event), [ + 'action' => $event['data']['topic_status'] ? 'unlock' : 'lock', + 'data' => [$event['data'] + ['topic_poster' => (int) $row['topic_poster']]], + ]); + + $this->manager->trigger('lock', $row['topic_poster'], $data, $event['data']['forum_id']); + } + } + + if ($event['post_data']['orig_topic_type'] != $event['post_data']['topic_type']) + { + $data = array_merge($this->manager->clean_event($event), [ + 'type_from' => $event['post_data']['orig_topic_type'], + 'type_to' => $event['post_data']['topic_type'], + ]); + + $this->manager->trigger('topic_type', $event['post_data']['topic_poster'], $data, $event['data']['forum_id']); + } + } + } + + /** + * Trigger Advanced Points System action: “lock”! + * + * @event core.mcp_lock_unlock_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function lock(\phpbb\event\data $event) + { + $s_user = in_array($event['action'], ['lock', 'unlock']) ? 'topic_poster' : 'poster_id'; + + $forum_ids = $this->manager->get_identifiers($event['data'], 'forum_id'); + $user_ids = $this->manager->get_identifiers($event['data'] , $s_user); + + $this->manager->trigger('lock', $user_ids, $event, $forum_ids); + } + + /** + * Trigger Advanced Points System action: “move”! + * + * @event core.move_posts_before + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function move_posts(\phpbb\event\data $event) + { + // Check for chain triggering events + if (!$this->config['aps_chain_merge_move'] && $this->request->variable('action', '', true) === 'merge_topics') + { + return; + } + + if (!function_exists('phpbb_get_topic_data')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_mcp.' . $this->php_ext; + } + + $posts = phpbb_get_post_data($event['post_ids']); + + $forum_ids = $this->manager->get_identifiers($posts, 'forum_id'); + $user_ids = $this->manager->get_identifiers($posts, 'poster_id'); + + $data = array_merge($this->manager->clean_event($event), [ + 'action' => 'post', + 'posts' => $posts, + ]); + + $this->manager->trigger('move', $user_ids, $data, $forum_ids); + } + + /** + * Trigger Advanced Points System action: “move”! + * + * @event core.move_topics_before_query + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function move_topics(\phpbb\event\data $event) + { + if (!function_exists('phpbb_get_topic_data')) + { + /** @noinspection PhpIncludeInspection */ + include $this->root_path . 'includes/functions_mcp.' . $this->php_ext; + } + + $topics = phpbb_get_topic_data($event['topic_ids']); + + $forum_ids = $this->manager->get_identifiers($topics, 'forum_id'); + $user_ids = $this->manager->get_identifiers($topics, 'topic_poster'); + + $data = array_merge($this->manager->clean_event($event), [ + 'action' => 'topic', + 'topics' => $topics, + ]); + + $this->manager->trigger('move', $user_ids, $data, $forum_ids); + } + + /** + * Trigger Advanced Points System action: “queue”! + * + * @event core.approve_posts_after + * @event core.approve_topics_after + * @event core.disapprove_posts_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function queue(\phpbb\event\data $event) + { + $data = array_merge($this->manager->clean_event($event), [ + 'mode' => isset($event['action']) ? $event['action'] : 'disapprove', + ]); + + $posts = isset($event['post_info']) ? $event['post_info'] : $event['topic_info']; + + $forum_ids = $this->manager->get_identifiers($posts, 'forum_id'); + $user_ids = $this->manager->get_identifiers($posts, 'poster_id'); + + $this->manager->trigger('queue', $user_ids, $data, $forum_ids); + } + + /** + * Trigger Advanced Points System action: “merge”! + * + * @event core.mcp_forum_merge_topics_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function merge(\phpbb\event\data $event) + { + $user_ids = $this->manager->get_identifiers($event['all_topic_data'], 'topic_poster'); + + $this->manager->trigger('merge', $user_ids, $event, $event['all_topic_data'][$event['to_topic_id']]['forum_id']); + } + + /** + * Trigger Advanced Points System action: “register”! + * + * @event core.ucp_register_register_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function register(\phpbb\event\data $event) + { + $this->manager->trigger('register', $event['user_id'], $event); + } + + /** + * Trigger Advanced Points System action: “warn”! + * + * @event core.mcp_warn_post_after + * @event core.mcp_warn_user_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function warn(\phpbb\event\data $event) + { + $this->manager->trigger('warn', $event['user_row']['user_id'], $event, 0); + } + + /** + * Trigger Advanced Points System action: “pm”! + * + * @event core.submit_pm_after + * @param \phpbb\event\data $event The event object + * @since 1.0.0 + * @return void + * @access public + */ + public function pm(\phpbb\event\data $event) + { + // Check for chain triggering events + if (!$this->config['aps_chain_warn_pm'] && $this->request->variable('mode', '', true) === 'warn_user') + { + return; + } + + $this->manager->trigger('pm', [], $event, 0); + } +} diff --git a/ext/phpbbstudio/aps/event/check.php b/ext/phpbbstudio/aps/event/check.php new file mode 100644 index 0000000..2a224af --- /dev/null +++ b/ext/phpbbstudio/aps/event/check.php @@ -0,0 +1,275 @@ +functions = $functions; + $this->language = $language; + $this->template = $template; + $this->user = $user; + $this->valuator = $valuator; + + $this->min = $config['aps_points_min'] !== '' ? (double) $config['aps_points_min'] : false; + } + + /** + * Assign functions defined in this class to event listeners in the core. + * + * @static + * @return array + * @access public + */ + static public function getSubscribedEvents() + { + return [ + 'core.viewtopic_modify_page_title' => 'check_bump', + 'core.handle_post_delete_conditions' => 'check_delete', + 'core.modify_posting_auth' => 'check_post', + 'core.viewtopic_modify_poll_data' => 'check_vote', + ]; + } + + /** + * Check the action: "Bump". + * + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function check_bump(\phpbb\event\data $event) + { + if ($this->min === false) + { + return; + } + + // If there already is no bump link, return + if ($this->template->retrieve_var('U_BUMP_TOPIC') === '') + { + return; + } + + // Get the value + $value = $this->get_value('aps_bump', $event['forum_id']); + + // Check if the value is negative + if ($value >= 0) + { + return; + } + + if ($this->below_min($value)) + { + $this->template->assign_var('U_BUMP_TOPIC', ''); + } + } + + /** + * Check the action: "Delete". + * + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function check_delete(\phpbb\event\data $event) + { + if ($this->min === false) + { + return; + } + + if (confirm_box(true)) + { + $data = $this->functions->post_data($event['post_id']); + + if ($this->user->data['user_id'] != $data['poster_id']) + { + return; + } + + $field = 'aps_post_delete' . ($event['is_soft'] ? '_soft' : ''); + + if ($value = $this->check_value($field, $event['forum_id'])) + { + $event['error'] = array_merge($event['error'], [ + $this->language->lang('APS_POINTS_TOO_LOW', $this->functions->get_name()) . '
    ' . + $this->language->lang('APS_POINTS_ACTION_COST', $this->functions->display_points($value)) + ]); + } + } + } + + /** + * Check the action: "Post" and "Topic". + * + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function check_post(\phpbb\event\data $event) + { + if ($this->min === false) + { + return; + } + + switch ($event['mode']) + { + default: + return; + break; + + case 'post': + $field = 'aps_topic_base'; + break; + + case 'reply': + case 'quote': + $field = 'aps_post_base'; + break; + + case 'edit': + $data = $this->functions->post_data($event['post_id']); + + if ($this->user->data['user_id'] != $data['poster_id']) + { + return; + } + + $type = $data['topic_first_post_id'] == $event['post_id'] ? 'topic' : 'post'; + $field = 'aps_' . $type . '_edit'; + break; + } + + if ($value = $this->check_value($field, $event['forum_id'])) + { + $event['error'] = array_merge($event['error'], [ + $this->language->lang('APS_POINTS_TOO_LOW', $this->functions->get_name()) . '
    ' . + $this->language->lang('APS_POINTS_ACTION_COST', $this->functions->display_points($value)) + ]); + } + } + + /** + * Check the action: "Vote". + * + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function check_vote(\phpbb\event\data $event) + { + if ($this->min === false) + { + return; + } + + if ($this->check_value('aps_vote', $event['forum_id'])) + { + $event['s_can_vote'] = false; + } + } + + /** + * Verify the user has enough points to perform an action. + * + * @param int $field The points field + * @param int $forum_id The forum identifier + * @return double|false The points value + * @access protected + */ + protected function check_value($field, $forum_id) + { + $value = $this->get_value($field, $forum_id); + + $check = $value < 0 && $this->below_min($value) ? $value : false; + + return $check; + } + + /** + * Get the base value for a points action. + * + * @param int $field The points field + * @param int $forum_id The forum identifier + * @return double The points value + * @access protected + */ + protected function get_value($field, $forum_id) + { + $fields = [0 => [$field]]; + + $values = $this->valuator->get_points($fields, $forum_id, false); + + $value = isset($values[$forum_id][$field]) ? $values[$forum_id][$field] : 0.00; + + return (double) $value; + } + + /** + * Check whether or not the value is below the points minimum. + * + * @param double $value The points value + * @return bool Whether or not the value is below the minimum + * @access protected + */ + protected function below_min($value) + { + $points = $this->functions->equate_points($this->user->data['user_points'], $value); + + return (bool) ($points < $this->min); + } +} diff --git a/ext/phpbbstudio/aps/event/display.php b/ext/phpbbstudio/aps/event/display.php new file mode 100644 index 0000000..7ccce18 --- /dev/null +++ b/ext/phpbbstudio/aps/event/display.php @@ -0,0 +1,200 @@ +functions = $functions; + $this->helper = $helper; + $this->language = $language; + $this->template = $template; + + $this->php_ext = $php_ext; + } + + /** + * Assign functions defined in this class to event listeners in the core. + * + * @static + * @return array + * @access public + */ + static public function getSubscribedEvents() + { + return [ + 'core.user_setup' => 'load_lang', + 'core.page_header_after' => 'display_links', + + 'core.viewonline_overwrite_location' => 'view_online', + + 'core.ucp_pm_view_message' => 'display_pm', + 'core.viewtopic_post_rowset_data' => 'set_post', + 'core.viewtopic_cache_user_data' => 'cache_post', + 'core.viewtopic_modify_post_row' => 'display_post', + 'core.memberlist_prepare_profile_data' => 'display_profile', + ]; + } + + /** + * Load language during user set up. + * + * @event core.user_setup + * @return void + * @access public + */ + public function load_lang() + { + $this->language->add_lang('aps_common', 'phpbbstudio/aps'); + } + + public function display_links() + { + $locations = array_filter($this->functions->get_link_locations()); + + if ($locations) + { + $this->template->assign_vars(array_combine(array_map(function($key) { + return 'S_APS_' . strtoupper($key); + }, array_keys($locations)), $locations)); + } + } + + /** + * Display the points page when viewing the Who is Online page. + * + * @event core.viewonline_overwrite_location + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function view_online(\phpbb\event\data $event) + { + if ($event['on_page'][1] === 'app' && strrpos($event['row']['session_page'], 'app.' . $this->php_ext . '/points') === 0) + { + $event['location'] = $this->language->lang('APS_VIEWING_POINTS_PAGE', $this->functions->get_name()); + $event['location_url'] = $this->helper->route('phpbbstudio_aps_display'); + } + } + + /** + * Display the user points when viewing a Private Message. + * + * @event core.ucp_pm_view_message + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function display_pm(\phpbb\event\data $event) + { + $event['msg_data'] = array_merge($event['msg_data'], [ + 'AUTHOR_POINTS' => $event['user_info']['user_points'], + ]); + } + + /** + * Set the user points after being retrieved from the database. + * + * @event core.viewtopic_post_rowset_data + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function set_post(\phpbb\event\data $event) + { + $event['rowset_data'] = array_merge($event['rowset_data'], [ + 'user_points' => $event['row']['user_points'], + ]); + } + + /** + * Cache the user points when displaying a post. + * + * @event core.viewtopic_cache_user_data + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function cache_post(\phpbb\event\data $event) + { + $event['user_cache_data'] = array_merge($event['user_cache_data'], [ + 'user_points' => $event['row']['user_points'], + ]); + } + + /** + * Display the user points when displaying a post. + * + * @event core.viewtopic_modify_post_row + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function display_post(\phpbb\event\data $event) + { + $event['post_row'] = array_merge($event['post_row'], [ + 'POSTER_POINTS' => $event['user_cache'][$event['poster_id']]['user_points'], + ]); + } + + /** + * Display the user points when display a profile. + * + * @event core.memberlist_prepare_profile_data + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function display_profile(\phpbb\event\data $event) + { + $event['template_data'] = array_merge($event['template_data'], [ + 'USER_POINTS' => $event['data']['user_points'], + ]); + } +} diff --git a/ext/phpbbstudio/aps/event/modules.php b/ext/phpbbstudio/aps/event/modules.php new file mode 100644 index 0000000..998c253 --- /dev/null +++ b/ext/phpbbstudio/aps/event/modules.php @@ -0,0 +1,83 @@ +functions = $functions; + $this->language = $language; + } + + /** + * Assign functions defined in this class to event listeners in the core. + * + * @static + * @return array + * @access public + */ + static public function getSubscribedEvents() + { + return [ + 'core.modify_module_row' => 'module_names', + ]; + } + + /** + * Localise the APS module titles. + * + * @event core.modify_module_row + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function module_names(\phpbb\event\data $event) + { + $module = $event['module_row']; + + $langname = $module['langname']; + + switch ($langname) + { + case 'ACP_APS_MODE_POINTS': + case 'MCP_APS_POINTS': + case 'UCP_APS_POINTS': + $module['lang'] = $this->language->lang($langname, ucfirst($this->functions->get_name())); + break; + + default: + return; + break; + } + + $event['module_row'] = $module; + } +} diff --git a/ext/phpbbstudio/aps/event/permissions.php b/ext/phpbbstudio/aps/event/permissions.php new file mode 100644 index 0000000..598a42b --- /dev/null +++ b/ext/phpbbstudio/aps/event/permissions.php @@ -0,0 +1,67 @@ + 'permissions', + ]; + } + + /** + * Add Advanced Points System permissions + * + * @event core.permissions + * @param \phpbb\event\data $event The event object + * @return void + * @access public + */ + public function permissions(\phpbb\event\data $event) + { + $categories = $event['categories']; + $permissions = $event['permissions']; + + if (empty($categories['phpbb_studio'])) + { + $categories['phpbb_studio'] = 'ACL_CAT_PHPBB_STUDIO'; + + $event['categories'] = $categories; + } + + $perms = [ + 'a_aps_logs', 'a_aps_points', 'a_aps_reasons', 'a_aps_display', 'a_aps_settings', + 'm_aps_adjust_custom', 'm_aps_adjust_reason', + 'u_aps_view_build', 'u_aps_view_build_other', 'u_aps_view_logs', 'u_aps_view_logs_other', 'u_aps_view_mod', + ]; + + foreach ($perms as $permission) + { + $permissions[$permission] = ['lang' => 'ACL_' . utf8_strtoupper($permission), 'cat' => 'phpbb_studio']; + } + + $event['permissions'] = $permissions; + } +} diff --git a/ext/phpbbstudio/aps/ext.php b/ext/phpbbstudio/aps/ext.php new file mode 100644 index 0000000..28f9032 --- /dev/null +++ b/ext/phpbbstudio/aps/ext.php @@ -0,0 +1,159 @@ +=') && phpbb_version_compare(PHPBB_VERSION, '4.0.0@dev', '<'))) + { + if (phpbb_version_compare(PHPBB_VERSION, '3.3.0@dev', '<')) + { + $user = $this->container->get('user'); + $user->add_lang_ext('phpbbstudio/aps', 'aps_ext'); + + $lang = $user->lang; + + $lang['EXTENSION_NOT_ENABLEABLE'] .= '
    ' . $user->lang('APS_PHPBB_VERSION', '3.2.8', '4.0.0@dev'); + + $user->lang = $lang; + + return false; + } + + if (phpbb_version_compare(PHPBB_VERSION, '3.3.0@dev', '>')) + { + $language= $this->container->get('language'); + $language->add_lang('aps_ext', 'phpbbstudio/aps'); + + return $language->lang('APS_PHPBB_VERSION', '3.2.8', '4.0.0@dev'); + } + } + + /** + * Now if Ultimate Points is enabled already. + */ + $ext_manager = $this->container->get('ext.manager'); + $is_ups_enabled = $ext_manager->is_enabled('dmzx/ultimatepoints'); + + if ($is_ups_enabled) + { + if (phpbb_version_compare(PHPBB_VERSION, '3.3.0@dev', '<')) + { + $user = $this->container->get('user'); + $user->add_lang_ext('phpbbstudio/aps', 'aps_ext'); + + $lang = $user->lang; + + $lang['EXTENSION_NOT_ENABLEABLE'] .= '
    ' . $user->lang('APS_UP_INSTALLED'); + + $user->lang = $lang; + + return false; + } + + if (phpbb_version_compare(PHPBB_VERSION, '3.3.0@dev', '>')) + { + $language= $this->container->get('language'); + $language->add_lang('aps_ext', 'phpbbstudio/aps'); + + return $language->lang('APS_UP_INSTALLED'); + } + } + + return true; + } + + /** + * Enable notifications for the extension + * + * @param mixed $old_state State returned by previous call of this method + * + * @return mixed Returns false after last step, otherwise temporary state + */ + public function enable_step($old_state) + { + if ($old_state === false) + { + $this->container->get('notification_manager') + ->enable_notifications('phpbbstudio.aps.notification.type.adjust'); + + return 'notification'; + } + + return parent::enable_step($old_state); + } + + /** + * Disable notifications for the extension + * + * @param mixed $old_state State returned by previous call of this method + * + * @return mixed Returns false after last step, otherwise temporary state + */ + public function disable_step($old_state) + { + if ($old_state === false) + { + try + { + if ($this->container->hasParameter('phpbbstudio.aps.extended')) + { + $language = $this->container->get('language'); + $language->add_lang('aps_ext', 'phpbbstudio/aps'); + + $message = $language->lang('APS_DISABLE_EXTENDED', $this->container->getParameter('phpbbstudio.aps.extended')); + + // Trigger error for the ACP + @trigger_error($message, E_USER_WARNING); + + // Throw an exception for the CLI + throw new \RuntimeException($message); + } + } + catch (\InvalidArgumentException $e) + { + // Continue + } + + $this->container->get('notification_manager') + ->disable_notifications('phpbbstudio.aps.notification.type.adjust'); + + return 'notification'; + } + + return parent::disable_step($old_state); + } + + /** + * Purge notifications for the extension + * + * @param mixed $old_state State returned by previous call of this method + * + * @return mixed Returns false after last step, otherwise temporary state + */ + public function purge_step($old_state) + { + if ($old_state === false) + { + $this->container->get('notification_manager') + ->purge_notifications('phpbbstudio.aps.notification.type.adjust'); + + return 'notification'; + } + + return parent::purge_step($old_state); + } +} diff --git a/ext/phpbbstudio/aps/language/en/aps_acp_common.php b/ext/phpbbstudio/aps/language/en/aps_acp_common.php new file mode 100644 index 0000000..c2b3a51 --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/aps_acp_common.php @@ -0,0 +1,148 @@ + 'This lists all %s actions across the board. There are various sorting and searching options available.', + + 'ACP_APS_LOGS_DELETED' => [ + 1 => 'You have successfully deleted the log entry.', + 2 => 'You have successfully deleted the log entries.', + ], + + // Points mode + 'ACP_APS_POINTS_EXPLAIN' => 'Here you can set %1$s values for global actions. You can also manage the preset reasons used in adjusting a user’s %1$s.', + 'ACP_APS_POINTS_SUCCESS' => 'Advanced Points System %s updated successfully.', + + 'ACP_APS_REASON_ADD' => 'Add reason', + 'ACP_APS_REASON_EDIT' => 'Edit reason', + 'ACP_APS_REASON_DELETE' => 'Delete reason', + 'ACP_APS_REASON_DELETE_CONFIRM' => 'Are you sure you wish to delete this reason?', + 'ACP_APS_REASON_DELETE_SUCCESS' => 'You have successfully deleted this reason.', + 'ACP_APS_REASON_SAVED' => 'The reason has successfully been saved.', + + 'ACP_APS_REASON_EMPTY_SUBJECT' => 'The reason subject can not be empty.', + 'ACP_APS_REASON_EMPTY_POINTS' => 'The reason %s can not be empty.', + + // Display mode + 'ACP_APS_DISPLAY_EXPLAIN' => 'Here you can determine the availability of display blocks and define some functionality.', + 'ACP_APS_DISPLAY_SUCCESS' => 'Advanced Points System display settings updated successfully.', + + 'ACP_APS_DISPLAY_TOP_COUNT' => 'Top users count', + 'ACP_APS_DISPLAY_TOP_COUNT_DESC' => 'The default amount of users to show for the “Top users” block.', + 'ACP_APS_DISPLAY_TOP_CHANGE' => 'Allow changing top user count', + 'ACP_APS_DISPLAY_TOP_CHANGE_DESC' => 'Whether users are allowed to increase the “Top users” count.', + 'ACP_APS_DISPLAY_ADJUSTMENTS' => 'Adjustments count', + 'ACP_APS_DISPLAY_ADJUSTMENTS_DESC' => 'The default amount of adjustments to show for the “Recent adjustments” block.', + 'ACP_APS_DISPLAY_GRAPH_TIME' => 'Graph animation time', + 'ACP_APS_DISPLAY_GRAPH_TIME_DESC' => 'The default animation time in milliseconds when displaying graph blocks.', + + // Settings mode + 'ACP_APS_SETTINGS_EXPLAIN' => 'Here you can determine the basic %1$s settings of your board, give it a fitting name and formatting, and among other settings adjust the default values for minimum and maximum %1$s.', + 'ACP_APS_SETTINGS_SUCCESS' => 'Advanced Points System settings updated successfully.', + + 'ACP_APS_POINTS_CLEAN' => 'Clean %s table', + 'ACP_APS_POINTS_CLEAN_CONFIRM' => 'Are you sure you wish to clean the %s table?', + 'ACP_APS_POINTS_CLEAN_SUCCESS' => 'You have successfully cleaned the %s table.', + + 'ACP_APS_POINTS_COPY_EMPTY' => 'You need to select at least 1 “from” forum and one “to” forum.', + 'ACP_APS_POINTS_COPY_TO' => 'Copy %s to', + + 'ACP_APS_POINTS_DECIMALS' => 'Decimal amount', + + 'ACP_APS_POINTS_DISPLAY_PM' => 'Display on view private message page', + 'ACP_APS_POINTS_DISPLAY_PM_DESC' => 'Should %s be displayed in the mini-profile on the private message page.', + 'ACP_APS_POINTS_DISPLAY_POST' => 'Display on viewtopic page', + 'ACP_APS_POINTS_DISPLAY_POST_DESC' => 'Should %s be displayed in the mini-profile on the topic page.', + 'ACP_APS_POINTS_DISPLAY_PROFILE' => 'Display on profile page', + 'ACP_APS_POINTS_DISPLAY_PROFILE_DESC' => 'Should %s be displayed in a user’s profile page.', + + 'ACP_APS_POINTS_EXCLUDE_CHARS' => 'Exclude characters', + 'ACP_APS_POINTS_EXCLUDE_CHARS_DESC' => 'This will not count the characters from the excluded words when calculating %s.', + 'ACP_APS_POINTS_EXCLUDE_WORDS' => 'Exclude words', + 'ACP_APS_POINTS_EXCLUDE_WORDS_DESC' => 'This will not count the words with equal or less than X characters when calculating %s.', + + 'ACP_APS_POINTS_ICON' => 'Icon', + 'ACP_APS_POINTS_ICON_IMG' => 'Icon image', + 'ACP_APS_POINTS_ICON_IMG_DESC' => 'Setting an image will override the icon selected above.
    Images can be selected from the /images folder.', + 'ACP_APS_POINTS_ICON_IMG_NO' => 'No image', + 'ACP_APS_POINTS_ICON_POSITION' => 'Icon position', + 'ACP_APS_POINTS_ICON_POSITION_LEFT' => 'Left', + 'ACP_APS_POINTS_ICON_POSITION_RIGHT' => 'Right', + + 'ACP_APS_POINTS_MIN' => 'Minimum user %s', + 'ACP_APS_POINTS_MIN_DESC' => 'If set, users’ %s can not go lower than this amount.', + 'ACP_APS_POINTS_MAX' => 'Maximum user %s', + 'ACP_APS_POINTS_MAX_DESC' => 'If set, users’ %s can not go higher than this amount.', + + 'ACP_APS_POINTS_NAMES' => 'Points names', + + 'ACP_APS_POINTS_PER_PAGE' => '%s actions per page', + 'ACP_APS_POINTS_PER_PAGE_DESC' => 'The amount of %s actions that should be displayed per page.', + + 'ACP_APS_POINTS_SAFE_MODE' => 'Safe mode', + 'ACP_APS_POINTS_SAFE_MODE_DESC' => 'Turning this on will catch and log any errors during point calculations.
    When testing and developing custom actions this should be turned off.', + + 'ACP_APS_FORMATTING' => 'Formatting', + + 'ACP_APS_IGNORE_SETTINGS' => 'Ignore settings', + 'ACP_APS_IGNORE_CRITERIA' => 'Ignore criteria', + 'ACP_APS_IGNORE_CRITERIA_DESC' => 'What criteria should checked to see if a post will not receive points.', + 'ACP_APS_IGNORE_MIN_CHARS' => 'Minimum characters', + 'ACP_APS_IGNORE_MIN_CHARS_DESC' => 'Posts with less characters than this will not receive points.', + 'ACP_APS_IGNORE_MIN_WORDS' => 'Minimum words', + 'ACP_APS_IGNORE_MIN_WORDS_DESC' => 'Posts with less words than this will not receive points.', + 'ACP_APS_IGNORE_EXCLUDED_CHARS' => 'Ignore excluded characters', + 'ACP_APS_IGNORE_EXCLUDED_CHARS_DESC' => 'Do not count the “excluded characters” towards the “minimum characters” criteria.', + 'ACP_APS_IGNORE_EXCLUDED_WORDS' => 'Ignore excluded words', + 'ACP_APS_IGNORE_EXCLUDED_WORDS_DESC' => 'Do not count the “excluded words” towards the “minimum words” criteria.', + 'ACP_APS_IGNORE_BOTH' => 'Both', + 'ACP_APS_IGNORE_NONE' => 'None', + 'ACP_APS_IGNORE_CHARS' => 'Chars', + 'ACP_APS_IGNORE_WORDS' => 'Words', + + 'ACP_APS_CHAIN_SETTINGS' => 'Chain settings', + 'ACP_APS_CHAIN_MERGE_DELETE' => 'When “merging” also trigger “delete”', + 'ACP_APS_CHAIN_MERGE_DELETE_DESC' => 'If a topic is merged into an other, the initial topic will be deleted.
    This determines if %s should be calculated for the delete action.', + 'ACP_APS_CHAIN_MERGE_MOVE' => 'When “merging” also trigger “move”', + 'ACP_APS_CHAIN_MERGE_MOVE_DESC' => 'If a topic is merged into an other, the initial topic’s posts will be moved.
    This determines if %s should be calculated for the move action.', + 'ACP_APS_CHAIN_WARN_PM' => 'When “warning” also trigger “pm”', + 'ACP_APS_CHAIN_WARN_PM_DESC' => 'If a user is warned and “Notify user” is checked, a private message is send.
    This determines if %s should be calculated for the private message action.', + + 'ACP_APS_CHARACTERS' => 'character(s)', + + 'ACP_APS_SEPARATOR_DEC' => 'Decimal separator', + 'ACP_APS_SEPARATOR_THOU' => 'Thousands separator', + 'ACP_APS_SEPARATOR_COMMA' => 'Comma', + 'ACP_APS_SEPARATOR_PERIOD' => 'Period', + 'ACP_APS_SEPARATOR_DASH' => 'Dash', + 'ACP_APS_SEPARATOR_UNDERSCORE' => 'Underscore', + 'ACP_APS_SEPARATOR_SPACE' => 'Space', + 'ACP_APS_SEPARATOR_SPACE_NARROW' => 'Narrow space', + + // Locations + 'ACP_APS_LOCATIONS' => 'Link locations', + 'ACP_APS_LOCATIONS_DESC' => 'Determine where the link to the Points page should be displayed.', + 'ACP_APS_LOCATIONS_EXPLAIN' => 'This is an example of a board index. In here you can select where you want the link to show up.
    You can select as many locations as you like, from nowhere to at all places.', + 'ACP_APS_LOCATIONS_SUCCESS' => 'You have successfully updated the link locations.', +]); diff --git a/ext/phpbbstudio/aps/language/en/aps_common.php b/ext/phpbbstudio/aps/language/en/aps_common.php new file mode 100644 index 0000000..9e51f1d --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/aps_common.php @@ -0,0 +1,30 @@ + 'Your %1$s were adjusted', + 'APS_VIEWING_POINTS_PAGE' => 'Viewing the %s page', + + 'APS_POINTS_TOO_LOW' => 'You do not have enough %s to perform this action.', + 'APS_POINTS_ACTION_COST' => 'The cost of this action is %s', +]); diff --git a/ext/phpbbstudio/aps/language/en/aps_display.php b/ext/phpbbstudio/aps/language/en/aps_display.php new file mode 100644 index 0000000..9485cad --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/aps_display.php @@ -0,0 +1,73 @@ + 'Overview', + 'APS_SUCCESS' => 'Success', + 'APS_TOP_USERS' => 'Top users', + + 'APS_ADJUST_USER_POINTS' => 'Adjust user %s', + + 'APS_PURCHASE_POINTS' => 'Purchase %s', + + 'APS_POINTS_ACTION' => '%s action', + 'APS_POINTS_ACTION_SEARCH' => 'Search %s action', + 'APS_POINTS_ACTION_TIME' => '%s action time', + 'APS_POINTS_ACTIONS' => '%s actions', + 'APS_POINTS_ACTIONS_ALL' => 'All %s actions', + 'APS_POINTS_ACTIONS_NONE' => 'There are no %s actions yet.', + 'APS_POINTS_ACTIONS_PAGE' => 'Actions per page', + 'APS_POINTS_ACTIONS_TOTAL' => [ + 1 => '%2$d %1$s action', + 2 => '%2$d %1$s actions', + ], + + 'APS_POINTS_BLOCK_ADD' => '%s block was added!', + 'APS_POINTS_BLOCK_DELETE' => '%s block was removed!', + 'APS_POINTS_BLOCK_MOVE' => '%s block was moved!', + 'APS_POINTS_BLOCK_NO' => 'No blocks', + 'APS_POINTS_BLOCK_NONE' => 'It looks like you do not have any blocks added.', + 'APS_POINTS_BLOCK_NO_CONTENT' => 'Oops! Looks like something went wrong.
    This block does not have any content!

    The required {% block content %}...{% endblock %} is missing!', + + 'APS_POINTS_FORMAT' => '%s format', + + 'APS_POINTS_MAX' => 'Maximum %s', + 'APS_POINTS_MIN' => 'Minimum %s', + + 'APS_POINTS_NAME' => 'Name', + + 'APS_POINTS_DATA_EMPTY' => 'No %s data to display', + 'APS_POINTS_GAINED' => '%s gained', + 'APS_POINTS_GLOBAL' => 'Global', + 'APS_POINTS_GROWTH' => '%s growth', + 'APS_POINTS_LOST' => '%s lost', + 'APS_POINTS_TRADE_OFF' => '%s trade off', + 'APS_POINTS_PER_FORUM' => '%s per forum', + 'APS_POINTS_PER_GROUP' => '%s per group', + + 'APS_RANDOM_USER' => 'Random user', + + 'APS_RECENT_ADJUSTMENTS' => 'Recent adjustments', + 'APS_RECENT_ATTACHMENTS' => 'Recent attachments', + 'APS_RECENT_POLL' => 'Recent poll', +]); diff --git a/ext/phpbbstudio/aps/language/en/aps_ext.php b/ext/phpbbstudio/aps/language/en/aps_ext.php new file mode 100644 index 0000000..fe9ea3d --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/aps_ext.php @@ -0,0 +1,28 @@ + 'Disabling the “Advanced Points System” is not possible as it is still being extended by an other extension. Extension name: “%s”', + 'APS_PHPBB_VERSION' => 'Minimum phpBB version required is %1$s but less than %2$s', + 'APS_UP_INSTALLED' => 'The extension “dmzx/ultimatepoints” is not compatible with this one!', +]); diff --git a/ext/phpbbstudio/aps/language/en/info_acp_aps.php b/ext/phpbbstudio/aps/language/en/info_acp_aps.php new file mode 100644 index 0000000..3370181 --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/info_acp_aps.php @@ -0,0 +1,49 @@ + 'Advanced Points System', + 'ACP_APS_MODE_SETTINGS' => 'Settings', + 'ACP_APS_MODE_DISPLAY' => 'Display', + 'ACP_APS_MODE_POINTS' => '%s', + 'ACP_APS_MODE_LOGS' => 'Logs', + + // ACP log + 'LOG_ACP_APS_SETTINGS' => 'Altered APS settings', + 'LOG_ACP_APS_DISPLAY' => 'Altered APS display settings', + 'LOG_ACP_APS_POINTS' => 'Altered APS %s', + 'LOG_ACP_APS_POINTS_COPIED' => 'Copied APS %3$s for %2$s
    from %1$s', + 'LOG_ACP_APS_POINTS_RESET' => 'Reset APS %2$s
    » %1$s', + 'LOG_ACP_APS_LOCATIONS' => 'Updated APS link locations', + 'LOG_ACP_APS_LOGS_CLEARED' => 'Cleared APS %s actions', + 'LOG_ACP_APS_LOGS_DELETED' => 'Deleted APS %s actions', + 'LOG_ACP_APS_COPIED' => 'Copied APS %s to multiple forums', + 'LOG_ACP_APS_CLEANED' => 'Cleaned the APS %s table', + + 'LOG_ACP_APS_REASON_ADD' => 'Added an APS reason', + 'LOG_ACP_APS_REASON_EDIT' => 'Edited an APS reason', + 'LOG_ACP_APS_REASON_DELETE' => 'Deleted an APS reason', + + 'LOG_ACP_APS_CALCULATION_ERROR' => 'APS - There was an error calculating the %4$s
    Error: %1$s
    File: %2$s
    Line: %3$s', +]); diff --git a/ext/phpbbstudio/aps/language/en/info_mcp_aps.php b/ext/phpbbstudio/aps/language/en/info_mcp_aps.php new file mode 100644 index 0000000..4797242 --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/info_mcp_aps.php @@ -0,0 +1,39 @@ + '%s', + 'MCP_APS_CHANGE' => 'Change', + 'MCP_APS_FRONT' => 'Front', + 'MCP_APS_LOGS' => 'Logs', + + 'MCP_APS_LATEST_ADJUSTED' => 'Latest %d adjustments', + 'MCP_APS_USERS_TOP' => 'Top %d users', + 'MCP_APS_USERS_BOTTOM' => 'Bottom %d users', + + 'MCP_APS_POINTS_CURRENT' => 'Current %s', + 'MCP_APS_POINTS_CHANGE' => 'Change %s', + + 'MCP_APS_POINTS_USER_CHANGE' => 'Are you sure you want to adjust this user’s %s?', + 'MCP_APS_POINTS_USER_CHANGE_SUCCESS' => 'The %s for this user have successfully been adjusted.', +]); diff --git a/ext/phpbbstudio/aps/language/en/info_ucp_aps.php b/ext/phpbbstudio/aps/language/en/info_ucp_aps.php new file mode 100644 index 0000000..e5c3200 --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/info_ucp_aps.php @@ -0,0 +1,26 @@ + '%s', +]); diff --git a/ext/phpbbstudio/aps/language/en/permissions_aps.php b/ext/phpbbstudio/aps/language/en/permissions_aps.php new file mode 100644 index 0000000..dcc182b --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/permissions_aps.php @@ -0,0 +1,41 @@ + 'phpBB Studio', + + 'ACL_A_APS_LOGS' => 'Advanced Points System - Can manage the logs', + 'ACL_A_APS_POINTS' => 'Advanced Points System - Can manage the points', + 'ACL_A_APS_REASONS' => 'Advanced Points System - Can manage the reasons', + 'ACL_A_APS_DISPLAY' => 'Advanced Points System - Can manage the display', + 'ACL_A_APS_SETTINGS' => 'Advanced Points System - Can manage the settings', + + 'ACL_M_APS_ADJUST_CUSTOM' => 'Advanced Points System - Can adjust a user’s points with a custom action', + 'ACL_M_APS_ADJUST_REASON' => 'Advanced Points System - Can adjust a user’s points with a predefined reason', + + 'ACL_U_APS_VIEW_BUILD' => 'Advanced Points System - Can view their augmentation
    Augmentation is the “build up” of the total points.', + 'ACL_U_APS_VIEW_BUILD_OTHER' => 'Advanced Points System - Can view other users’ augmentation
    This requires “Can view their augmentation” to be set to Yes.', + 'ACL_U_APS_VIEW_MOD' => 'Advanced Points System - Can view the moderator', + 'ACL_U_APS_VIEW_LOGS' => 'Advanced Points System - Can view their logs', + 'ACL_U_APS_VIEW_LOGS_OTHER' => 'Advanced Points System - Can view other users’ logs
    This requires “Can view their logs” to be set to Yes.', +]); diff --git a/ext/phpbbstudio/aps/language/en/phpbbstudio_aps_actions.php b/ext/phpbbstudio/aps/language/en/phpbbstudio_aps_actions.php new file mode 100644 index 0000000..8c8e371 --- /dev/null +++ b/ext/phpbbstudio/aps/language/en/phpbbstudio_aps_actions.php @@ -0,0 +1,155 @@ + 'Copy %s from', + 'ACP_APS_POINTS_COPY_EMPTY_FROM' => 'You have to select a “from” forum', + 'ACP_APS_POINTS_COPY_EXPLAIN' => 'If you select to copy %1$s, the forum will have the same %1$s as the one you select here. This will overwrite any %1$s you have previously set for this forum with the %1$s of the forum you select here. If no forum is selected, the current %1$s will be kept.', + 'ACP_APS_POINTS_COPY_NOT' => 'Do not copy %s', + 'ACP_APS_POINTS_COPY_SUCCESS' => 'You have successfully copied the %s.', + 'ACP_APS_POINTS_COPY_TITLE' => 'Copy %s', + + 'ACP_APS_POINTS_RESET' => 'Reset %s', + 'ACP_APS_POINTS_RESET_CONFIRM' => 'Are you sure you wish to to reset the %s for this forum?', + 'ACP_APS_POINTS_RESET_EXPLAIN' => 'If you select to reset %1$s, all values for this forum will be set to 0. This will overwrite any %1$s you have previously set for this forum or any forum you selected below to copy %1$s from.', + 'ACP_APS_POINTS_RESET_SUCCESS' => 'You have successfully reset the %s.', + + 'APS_POINTS_DIFF' => '%s difference', + 'APS_POINTS_OLD' => 'Old %s', + 'APS_POINTS_NEW' => 'New %s', + + # Global + 'APS_POINTS_REGISTER' => 'Registered', + 'APS_POINTS_BIRTHDAY' => 'Celebrated their birthday', + 'APS_POINTS_BIRTHDAY_DESC' => 'This action is ran through the system cron once a day.
    ACP » General » Server settings » Run periodic tasks from system cron', + 'APS_POINTS_MOD_WARN' => 'Warned a user', + 'APS_POINTS_USER_WARN' => 'Received a warning', + 'APS_POINTS_PM' => 'Created a private message', + 'APS_POINTS_PM_PER_RECIPIENT' => 'Per recipient', + + # Misc + 'ACP_APS_POINTS_MISC' => 'Miscellaneous', + 'APS_POINTS_PER_VOTE' => 'Per option voted for', + 'APS_POINTS_VOTE_ADDED' => 'Voted in a poll', + 'APS_POINTS_VOTE_REMOVED' => 'Removed a vote', + 'APS_POINTS_VOTE_AMOUNT' => 'Amount of options voted for', + + # Topics / Posts + 'APS_POINTS_POST' => 'Created a post', + 'APS_POINTS_TOPIC' => 'Created a topic', + 'APS_POINTS_STICKY' => 'Created a sticky', + 'APS_POINTS_ANNOUNCE' => 'Created an announcement', + 'APS_POINTS_GLOBAL' => 'Created a global announcement', + 'APS_POINTS_PER_CHAR' => 'Per character', + 'APS_POINTS_PER_CHAR_DESC' => 'The text is stripped from BBCodes before counting the characters.', + 'APS_POINTS_PER_WORD' => 'Per word', + 'APS_POINTS_PER_WORD_DESC' => 'The text is stripped from BBCodes before counting the words.', + 'APS_POINTS_ATTACH_HAS' => 'Including attachment(s)', + 'APS_POINTS_ATTACH_PER' => 'Per included attachment', + 'APS_POINTS_PER_QUOTE' => 'Per quote', + 'APS_POINTS_PER_QUOTE_DESC' => 'Only the outer most quotes are counted and only if there is an author provided.', + 'APS_POINTS_POLL_HAS' => 'Included a poll', + 'APS_POINTS_POLL_OPTION' => 'Per included poll option', + 'APS_POINTS_EDIT' => 'Edited their post', + 'APS_POINTS_DELETE' => 'Deleted their post', + 'APS_POINTS_DELETE_SOFT' => 'Soft deleted their post', + 'APS_POINTS_BUMP' => 'Bumped a topic', + + # Topic types + 'ACP_APS_TOPIC_TYPES' => 'Topic types', + + 'APS_POINTS_MOD_NORMAL_STICKY' => 'Made a topic a sticky', + 'APS_POINTS_MOD_NORMAL_ANNOUNCE' => 'Made a topic an announcement', + 'APS_POINTS_MOD_NORMAL_GLOBAL' => 'Made a topic a global announcement', + 'APS_POINTS_MOD_STICKY_NORMAL' => 'Made a sticky a normal topic', + 'APS_POINTS_MOD_STICKY_ANNOUNCE' => 'Made a sticky an announcement', + 'APS_POINTS_MOD_STICKY_GLOBAL' => 'Made a sticky a global announcement', + 'APS_POINTS_MOD_ANNOUNCE_NORMAL' => 'Made an announcement a normal topic', + 'APS_POINTS_MOD_ANNOUNCE_STICKY' => 'Made an announcement a sticky', + 'APS_POINTS_MOD_ANNOUNCE_GLOBAL' => 'Made an announcement a global announcement', + 'APS_POINTS_MOD_GLOBAL_NORMAL' => 'Made a global announcement a normal topic', + 'APS_POINTS_MOD_GLOBAL_STICKY' => 'Made a global announcement a sticky', + 'APS_POINTS_MOD_GLOBAL_ANNOUNCE' => 'Made a global announcement an announcement', + + 'APS_POINTS_USER_NORMAL_STICKY' => 'Their topic was made a sticky', + 'APS_POINTS_USER_NORMAL_ANNOUNCE' => 'Their topic was made an announcement', + 'APS_POINTS_USER_NORMAL_GLOBAL' => 'Their topic was made a global announcement', + 'APS_POINTS_USER_STICKY_NORMAL' => 'Their sticky was made a normal topic', + 'APS_POINTS_USER_STICKY_ANNOUNCE' => 'Their sticky was made an announcement', + 'APS_POINTS_USER_STICKY_GLOBAL' => 'Their sticky was made a global announcement', + 'APS_POINTS_USER_ANNOUNCE_NORMAL' => 'Their announcement was made a normal topic', + 'APS_POINTS_USER_ANNOUNCE_STICKY' => 'Their announcement was made a sticky', + 'APS_POINTS_USER_ANNOUNCE_GLOBAL' => 'Their announcement was made a global announcement', + 'APS_POINTS_USER_GLOBAL_NORMAL' => 'Their global announcement was made a normal topic', + 'APS_POINTS_USER_GLOBAL_STICKY' => 'Their global announcement was made a sticky', + 'APS_POINTS_USER_GLOBAL_ANNOUNCE' => 'Their global announcement was made an announcement', + + # Moderation + 'APS_POINTS_MOD_COPY' => 'Copied a topic from this forum', + 'APS_POINTS_USER_COPY' => 'Their topic got copied from this forum', + + 'APS_POINTS_MOD_CHANGE' => 'Changed a post’s author', + 'APS_POINTS_USER_CHANGE_FROM' => 'Removed as a post’s author', + 'APS_POINTS_USER_CHANGE_TO' => 'Became a post’s author', + + 'APS_POINTS_MOD_DELETE_POST' => 'Deleted a post', + 'APS_POINTS_USER_DELETE_POST' => 'Their post got deleted', + 'APS_POINTS_MOD_DELETE_SOFT_POST' => 'Soft deleted a post', + 'APS_POINTS_USER_DELETE_SOFT_POST' => 'Their post got soft deleted', + 'APS_POINTS_MOD_DELETE_TOPIC' => 'Deleted a topic', + 'APS_POINTS_USER_DELETE_TOPIC' => 'Their topic got deleted', + 'APS_POINTS_MOD_DELETE_SOFT_TOPIC' => 'Soft deleted a topic', + 'APS_POINTS_USER_DELETE_SOFT_TOPIC' => 'Their topic got soft deleted', + + 'APS_POINTS_MOD_EDIT' => 'Edited a post', + 'APS_POINTS_USER_EDIT' => 'Their post got edited', + + 'APS_POINTS_MOD_LOCK' => 'Locked a topic', + 'APS_POINTS_USER_LOCK' => 'Their topic got locked', + 'APS_POINTS_MOD_LOCK_POST' => 'Locked a post', + 'APS_POINTS_USER_LOCK_POST' => 'Their post got locked', + 'APS_POINTS_MOD_UNLOCK' => 'Unlocked a topic', + 'APS_POINTS_USER_UNLOCK' => 'Their topic got unlocked', + 'APS_POINTS_MOD_UNLOCK_POST' => 'Unlocked a post', + 'APS_POINTS_USER_UNLOCK_POST' => 'Their post got unlocked', + + 'APS_POINTS_MOD_MERGE' => 'Merged a topic', + 'APS_POINTS_MOD_MERGE_DESC' => 'This will also trigger the “delete” action on the topics that are being merged into an other.', + 'APS_POINTS_USER_MERGE' => 'Their topic got merged', + 'APS_POINTS_USER_MERGE_DESC' => 'This will also trigger the “delete” action on the topics that are being merged into an other.', + + 'APS_POINTS_MOD_MOVE_POST' => 'Moved a post', + 'APS_POINTS_MOD_MOVE_POST_DESC' => 'Moved values are for moving from this forum, not to.', + 'APS_POINTS_USER_MOVE_POST' => 'Their post got moved', + 'APS_POINTS_MOD_MOVE_TOPIC' => 'Moved a topic', + 'APS_POINTS_USER_MOVE_TOPIC' => 'Their topic got moved', + + 'APS_POINTS_MOD_APPROVE' => 'Approved a post', + 'APS_POINTS_MOD_DISAPPROVE' => 'Disapproved a post', + 'APS_POINTS_MOD_RESTORE' => 'Restored a post', + 'APS_POINTS_USER_APPROVE' => 'Their post is approved', + 'APS_POINTS_USER_DISAPPROVE' => 'Their post is disapproved', + 'APS_POINTS_USER_RESTORE' => 'Their post is restored', + + 'APS_POINTS_USER_ADJUSTED' => 'Adjusted by moderator', +]); diff --git a/ext/phpbbstudio/aps/license.txt b/ext/phpbbstudio/aps/license.txt new file mode 100644 index 0000000..b9f6fc2 --- /dev/null +++ b/ext/phpbbstudio/aps/license.txt @@ -0,0 +1,280 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/ext/phpbbstudio/aps/mcp/main_info.php b/ext/phpbbstudio/aps/mcp/main_info.php new file mode 100644 index 0000000..bfdf813 --- /dev/null +++ b/ext/phpbbstudio/aps/mcp/main_info.php @@ -0,0 +1,42 @@ + '\phpbbstudio\aps\mcp\main_module', + 'title' => 'MCP_APS_POINTS', + 'modes' => [ + 'front' => [ + 'title' => 'MCP_APS_FRONT', + 'auth' => 'ext_phpbbstudio/aps', + 'cat' => ['MCP_APS_POINTS'] + ], + 'change' => [ + 'title' => 'MCP_APS_CHANGE', + 'auth' => 'ext_phpbbstudio/aps && (acl_m_aps_adjust_custom || acl_m_aps_adjust_reason)', + 'cat' => ['MCP_APS_POINTS'] + ], + 'logs' => [ + 'title' => 'MCP_APS_LOGS', + 'auth' => 'ext_phpbbstudio/aps && acl_u_aps_view_logs', + 'cat' => ['MCP_APS_POINTS'] + ], + ], + ]; + } +} diff --git a/ext/phpbbstudio/aps/mcp/main_module.php b/ext/phpbbstudio/aps/mcp/main_module.php new file mode 100644 index 0000000..886f03d --- /dev/null +++ b/ext/phpbbstudio/aps/mcp/main_module.php @@ -0,0 +1,48 @@ +get('phpbbstudio.aps.functions'); + + /** @var \phpbb\language\language $language */ + $language = $phpbb_container->get('language'); + + /** @var \phpbbstudio\aps\controller\mcp_controller $mcp_controller */ + $mcp_controller = $phpbb_container->get('phpbbstudio.aps.controller.mcp'); + + // Set page title and template + $this->tpl_name = 'mcp/mcp_aps_' . $mode; + $this->page_title = $language->lang('MCP_APS_POINTS_' . utf8_strtoupper($mode), $functions->get_name()); + + // Make the custom form action available in the controller and handle the mode + $mcp_controller->set_page_url($this->u_action)->{$mode}(); + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_acp_module.php b/ext/phpbbstudio/aps/migrations/install_acp_module.php new file mode 100644 index 0000000..39a5f49 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_acp_module.php @@ -0,0 +1,78 @@ +table_prefix . "modules + WHERE module_class = 'acp' + AND module_langname = 'ACP_APS_POINTS'"; + $result = $this->db->sql_query($sql); + $module_id = $this->db->sql_fetchfield('module_id'); + $this->db->sql_freeresult($result); + + return $module_id !== false; + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbb\db\migration\data\v32x\v327']; + } + + /** + * Add the Advanced Points System ACP module to the database. + * + * @return array Array of module data + * @access public + */ + public function update_data() + { + return [ + ['module.add', [ + 'acp', + 'ACP_CAT_DOT_MODS', + 'ACP_APS_POINTS' + ]], + ['module.add', [ + 'acp', + 'ACP_APS_POINTS', + [ + 'module_basename' => '\phpbbstudio\aps\acp\main_module', + 'modes' => ['settings', 'display', 'points', 'logs'], + ], + ]], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_configuration.php b/ext/phpbbstudio/aps/migrations/install_configuration.php new file mode 100644 index 0000000..b58f917 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_configuration.php @@ -0,0 +1,84 @@ +config->offsetExists('aps_points_name_en'); + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\install_user_schema']; + } + + /** + * Add the Advanced Points System configuration to the database. + * + * @return array Array of configuration + * @access public + */ + public function update_data() + { + return [ + ['config.add', ['aps_points_name_en', 'Points']], + ['config.add', ['aps_points_safe_mode', false]], // @todo Change to true upon release + ['config.add', ['aps_points_icon', 'fa-money']], + ['config.add', ['aps_points_icon_position', 1]], + ['config.add', ['aps_points_decimals', 2]], + ['config.add', ['aps_points_separator_dec', ',']], + ['config.add', ['aps_points_separator_thou', htmlspecialchars(' ')]], + ['config.add', ['aps_points_display_pm', true]], + ['config.add', ['aps_points_display_post', true]], + ['config.add', ['aps_points_display_profile', true]], + ['config.add', ['aps_points_min', '']], + ['config.add', ['aps_points_max', '']], + ['config.add', ['aps_points_exclude_words', 1]], + ['config.add', ['aps_points_exclude_chars', 1]], + + ['config.add', ['aps_birthday_last_run', 0, true]], + ['config.add', ['aps_notification_id', 0]], + ['config.add', ['aps_actions_per_page', 10]], + + ['config.add', ['aps_chain_merge_delete', false]], + ['config.add', ['aps_chain_merge_move', false]], + ['config.add', ['aps_chain_warn_pm', false]], + + ['config.add', ['aps_display_top_change', true]], + ['config.add', ['aps_display_top_count', 3]], + ['config.add', ['aps_display_adjustments', 5]], + ['config.add', ['aps_display_graph_time', 1500]], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_mcp_module.php b/ext/phpbbstudio/aps/migrations/install_mcp_module.php new file mode 100644 index 0000000..b059f15 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_mcp_module.php @@ -0,0 +1,78 @@ +table_prefix . "modules + WHERE module_class = 'mcp' + AND module_langname = 'MCP_APS_POINTS'"; + $result = $this->db->sql_query($sql); + $module_id = $this->db->sql_fetchfield('module_id'); + $this->db->sql_freeresult($result); + + return $module_id !== false; + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\install_acp_module']; + } + + /** + * Add the Advanced Points System MCP module to the database. + * + * @return array Array of module data + * @access public + */ + public function update_data() + { + return [ + ['module.add', [ + 'mcp', + 0, + 'MCP_APS_POINTS' + ]], + ['module.add', [ + 'mcp', + 'MCP_APS_POINTS', + [ + 'module_basename' => '\phpbbstudio\aps\mcp\main_module', + 'modes' => ['front', 'change', 'logs'], + ], + ]], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_permissions.php b/ext/phpbbstudio/aps/migrations/install_permissions.php new file mode 100644 index 0000000..e593b9c --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_permissions.php @@ -0,0 +1,117 @@ +role_exists('ROLE_USER_STANDARD')) + { + $data[] = ['permission.permission_set', ['ROLE_USER_STANDARD', 'u_aps_view_build']]; + $data[] = ['permission.permission_set', ['ROLE_USER_STANDARD', 'u_aps_view_logs']]; + // Can NOT view the moderator's name + } + + if ($this->role_exists('ROLE_USER_FULL')) + { + $data[] = ['permission.permission_set', ['ROLE_USER_FULL', 'u_aps_view_build']]; + $data[] = ['permission.permission_set', ['ROLE_USER_FULL', 'u_aps_view_logs']]; + $data[] = ['permission.permission_set', ['ROLE_USER_FULL', 'u_aps_view_mod']]; + } + + if ($this->role_exists('ROLE_MOD_STANDARD')) + { + $data[] = ['permission.permission_set', ['ROLE_MOD_STANDARD', 'm_aps_adjust_reason']]; + // Can NOT adjust a user's points with a custom action, only admin defined ones + } + + if ($this->role_exists('ROLE_MOD_FULL')) + { + $data[] = ['permission.permission_set', ['ROLE_MOD_FULL', 'm_aps_adjust_custom']]; + $data[] = ['permission.permission_set', ['ROLE_MOD_FULL', 'm_aps_adjust_reason']]; + } + + if ($this->role_exists('ROLE_ADMIN_STANDARD')) + { + $data[] = ['permission.permission_set', ['ROLE_ADMIN_STANDARD', 'a_aps_logs']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_STANDARD', 'a_aps_points']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_STANDARD', 'a_aps_reasons']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_STANDARD', 'a_aps_display']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_STANDARD', 'a_aps_settings']]; + } + + if ($this->role_exists('ROLE_ADMIN_FULL')) + { + $data[] = ['permission.permission_set', ['ROLE_ADMIN_FULL', 'a_aps_logs']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_FULL', 'a_aps_points']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_FULL', 'a_aps_reasons']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_FULL', 'a_aps_display']]; + $data[] = ['permission.permission_set', ['ROLE_ADMIN_FULL', 'a_aps_settings']]; + } + + return $data; + } + + /** + * Checks whether the given role does exist or not. + * + * @param string $role The name of the role + * @return bool True if the role exists, false otherwise + */ + private function role_exists($role) + { + $sql = 'SELECT role_id + FROM ' . ACL_ROLES_TABLE . ' + WHERE role_name = "' . $this->db->sql_escape($role) . '"'; + $result = $this->db->sql_query_limit($sql, 1); + $role_id = $this->db->sql_fetchfield('role_id'); + $this->db->sql_freeresult($result); + + return (bool) $role_id; + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_ucp_module.php b/ext/phpbbstudio/aps/migrations/install_ucp_module.php new file mode 100644 index 0000000..f071b41 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_ucp_module.php @@ -0,0 +1,79 @@ +table_prefix . "modules + WHERE module_class = 'ucp' + AND module_langname = 'UCP_APS_POINTS'"; + $result = $this->db->sql_query($sql); + $module_id = $this->db->sql_fetchfield('module_id'); + $this->db->sql_freeresult($result); + + return $module_id !== false; + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\install_acp_module']; + } + + /** + * Add the Advanced Points System UCP module to the database. + * + * @return array Array of module data + * @access public + */ + public function update_data() + { + return [ + ['module.add', [ + 'ucp', + 0, + [ + 'module_enabled' => 1, + 'module_display' => 1, + 'module_basename' => '', + 'module_class' => 'ucp', + 'parent_id' => 0, + 'module_langname' => 'UCP_APS_POINTS', + 'module_mode' => '', + 'module_auth' => 'ext_phpbbstudio/aps', + ] + ]], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/install_user_schema.php b/ext/phpbbstudio/aps/migrations/install_user_schema.php new file mode 100644 index 0000000..8123689 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/install_user_schema.php @@ -0,0 +1,142 @@ +db_tools->sql_column_exists($this->table_prefix . 'users', 'user_points'); + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\install_acp_module']; + } + + /** + * Add the Advanced Points System tables and columns to the database. + * + * @return array Array of tables and columns data + * @access public + */ + public function update_schema() + { + return [ + 'add_columns' => [ + $this->table_prefix . 'users' => [ + 'user_points' => ['DECIMAL:14', 0.00], + ], + ], + 'add_tables' => [ + $this->table_prefix . 'aps_display' => [ + 'COLUMNS' => [ + 'user_id' => ['ULINT', 0], + 'aps_display' => ['MTEXT_UNI', ''], + ], + 'PRIMARY_KEY' => 'user_id', + ], + $this->table_prefix . 'aps_logs' => [ + 'COLUMNS' => [ + 'log_id' => ['ULINT', null, 'auto_increment'], + 'log_action' => ['TEXT_UNI', ''], + 'log_actions' => ['MTEXT_UNI', ''], + 'log_time' => ['TIMESTAMP', 0], + 'log_approved' => ['BOOL', 1], + 'forum_id' => ['ULINT', 0], + 'topic_id' => ['ULINT', 0], + 'post_id' => ['ULINT', 0], + 'user_id' => ['ULINT', 0], + 'reportee_id' => ['ULINT', 0], + 'reportee_ip' => ['VCHAR:40', ''], + 'points_old' => ['DECIMAL:14', 0.00], + 'points_sum' => ['DECIMAL:14', 0.00], + 'points_new' => ['DECIMAL:14', 0.00], + ], + 'PRIMARY_KEY' => 'log_id', + 'KEYS' => [ + 'forum_id' => ['INDEX', 'forum_id'], + 'topic_id' => ['INDEX', 'topic_id'], + 'post_id' => ['INDEX', 'post_id'], + 'user_id' => ['INDEX', 'user_id'], + 'reportee_id' => ['INDEX', 'reportee_id'], + ], + ], + $this->table_prefix . 'aps_points' => [ + 'COLUMNS' => [ + 'points_name' => ['VCHAR_UNI', ''], + 'points_value' => ['DECIMAL:6', 0.00], + 'forum_id' => ['ULINT', 0], + ], + 'PRIMARY_KEY' => ['points_name', 'forum_id'], + 'KEYS' => [ + 'forum_id' => ['INDEX', 'forum_id'], + ], + ], + $this->table_prefix . 'aps_reasons' => [ + 'COLUMNS' => [ + 'reason_id' => ['ULINT', null, 'auto_increment'], + 'reason_title' => ['VCHAR_UNI', ''], + 'reason_desc' => ['TEXT_UNI', ''], + 'reason_points' => ['DECIMAL:14', 0.00], + 'reason_order' => ['UINT', 0], + ], + 'PRIMARY_KEY' => 'reason_id', + ], + ], + ]; + } + + /** + * Reverts the database schema by providing a set of change instructions + * + * @return array Array of schema changes + * (compatible with db_tools->perform_schema_changes()) + * @access public + */ + public function revert_schema() + { + return [ + 'drop_columns' => [ + $this->table_prefix . 'users' => [ + 'user_points', + ], + ], + 'drop_tables' => [ + $this->table_prefix . 'aps_display', + $this->table_prefix . 'aps_logs', + $this->table_prefix . 'aps_points', + $this->table_prefix . 'aps_reasons', + ], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/update_configuration.php b/ext/phpbbstudio/aps/migrations/update_configuration.php new file mode 100644 index 0000000..5af0916 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/update_configuration.php @@ -0,0 +1,58 @@ +config->offsetExists('aps_points_icon_img'); + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\install_configuration']; + } + + /** + * Add the Advanced Points System configuration to the database. + * + * @return array Array of configuration + * @access public + */ + public function update_data() + { + return [ + ['config.add', ['aps_points_icon_img', '']], + ]; + } +} diff --git a/ext/phpbbstudio/aps/migrations/update_permissions.php b/ext/phpbbstudio/aps/migrations/update_permissions.php new file mode 100644 index 0000000..65314db --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/update_permissions.php @@ -0,0 +1,75 @@ +role_exists('ROLE_USER_STANDARD')) + { + $data[] = ['permission.permission_set', ['ROLE_USER_STANDARD', 'u_aps_view_build_other']]; + $data[] = ['permission.permission_set', ['ROLE_USER_STANDARD', 'u_aps_view_logs_other']]; + } + + if ($this->role_exists('ROLE_USER_FULL')) + { + $data[] = ['permission.permission_set', ['ROLE_USER_FULL', 'u_aps_view_build_other']]; + $data[] = ['permission.permission_set', ['ROLE_USER_FULL', 'u_aps_view_logs_other']]; + } + + return $data; + } + + /** + * Checks whether the given role does exist or not. + * + * @param string $role The name of the role + * @return bool True if the role exists, false otherwise + */ + private function role_exists($role) + { + $sql = 'SELECT role_id + FROM ' . ACL_ROLES_TABLE . ' + WHERE role_name = "' . $this->db->sql_escape($role) . '"'; + $result = $this->db->sql_query_limit($sql, 1); + $role_id = $this->db->sql_fetchfield('role_id'); + $this->db->sql_freeresult($result); + + return (bool) $role_id; + } +} diff --git a/ext/phpbbstudio/aps/migrations/v105_configuration.php b/ext/phpbbstudio/aps/migrations/v105_configuration.php new file mode 100644 index 0000000..6ce4635 --- /dev/null +++ b/ext/phpbbstudio/aps/migrations/v105_configuration.php @@ -0,0 +1,58 @@ +config->offsetExists('aps_ignore_criteria'); + } + + /** + * Assign migration file dependencies for this migration. + * + * @return array Array of migration files + * @access public + * @static + */ + static public function depends_on() + { + return ['\phpbbstudio\aps\migrations\update_configuration']; + } + + /** + * Add the Advanced Points System configuration to the database. + * + * @return array Array of configuration + * @access public + */ + public function update_data() + { + return [ + ['config.add', ['aps_link_locations', 32]], + ['config.add', ['aps_ignore_criteria', 0]], + ['config.add', ['aps_ignore_min_chars', 0]], + ['config.add', ['aps_ignore_min_words', 0]], + ['config.add', ['aps_ignore_excluded_chars', 0]], + ['config.add', ['aps_ignore_excluded_words', 0]], + ]; + } +} diff --git a/ext/phpbbstudio/aps/notification/type/adjust.php b/ext/phpbbstudio/aps/notification/type/adjust.php new file mode 100644 index 0000000..6e6028d --- /dev/null +++ b/ext/phpbbstudio/aps/notification/type/adjust.php @@ -0,0 +1,250 @@ +auth = $auth; + } + + /** + * Set the controller helper object. + * + * @param \phpbb\controller\helper $helper Controller helper object + * @return void + * @access public + */ + public function set_controller_helper(\phpbb\controller\helper $helper) + { + $this->helper = $helper; + } + + /** + * Set the user loader object. + * + * @param \phpbb\user_loader $user_loader User loader object + * @return void + * @access public + */ + public function set_user_loader(\phpbb\user_loader $user_loader) + { + $this->user_loader = $user_loader; + } + + /** + * Get notification type name. + * + * @return string The notification name as defined in services.yml + * @access public + */ + public function get_type() + { + return 'phpbbstudio.aps.notification.type.adjust'; + } + + /** + * Notification option data (for outputting to the user). + * + * @var bool|array False if the service should use it's default data + * Array of data (including keys 'id', 'lang', and 'group') + * @access public + * @static + */ + public static $notification_option = false; + + /** + * Is this type available to the current user. + * (defines whether or not it will be shown in the UCP Edit notification options) + * + * @return bool True/False: whether or not this is available to the user + * @access public + */ + public function is_available() + { + return false; + } + + /** + * Get the id of the notification. + * + * @param array $data The notification type specific data + * @return int Identifier of the notification + * @access public + */ + public static function get_item_id($data) + { + return $data['notification_id']; + } + + /** + * Get the id of the parent. + * + * @param array $data The type notification specific data + * @return int Identifier of the parent + * @access public + */ + public static function get_item_parent_id($data) + { + // No parent + return 0; + } + + /** + * Find the users who want to receive notifications. + * + * @param array $data The type specific data + * @param array $options Options for finding users for notification + * ignore_users => array of users and user types that should not receive notifications from this type + * because they've already been notified + * e.g.: array(2 => array(''), 3 => array('', 'email'), ...) + * @return array Array of user identifiers with their notification method(s) + * @access public + */ + public function find_users_for_notification($data, $options = []) + { + // Return an array of users to be notified, storing the user_ids as the array keys + $users = []; + + foreach ($data['user_ids'] as $user_id) + { + $users[(int) $user_id] = $this->notification_manager->get_default_methods(); + } + + return $users; + } + + /** + * Users needed to query before this notification can be displayed. + * + * @return array Array of user identifiers to query. + * @access public + */ + public function users_to_query() + { + if ($this->auth->acl_get('u_aps_view_mod')) + { + return [$this->get_data('moderator_id')]; + } + + return []; + } + + /** + * Get the user's avatar. + * + * @return string The HTML formatted avatar + */ + public function get_avatar() + { + return $this->auth->acl_get('u_aps_view_mod') ? $this->user_loader->get_avatar($this->get_data('moderator_id'), false, true) : ''; + } + + /** + * Get the HTML formatted title of this notification. + * + * @return string The HTML formatted title + * @access public + */ + public function get_title() + { + return $this->language->lang('APS_NOTIFICATION_ADJUSTED', $this->get_data('name')); + } + + /** + * Get the HTML formatted reference of the notification. + * + * @return string The HTML formatted reference + * @access public + */ + public function get_reference() + { + if ($reason = $this->get_data('reason')) + { + $moderator = $this->auth->acl_get('u_aps_view_mod') ? $this->get_data('moderator') : $this->language->lang('MODERATOR'); + return $moderator . $this->language->lang('COLON') . ' '. $this->language->lang('NOTIFICATION_REFERENCE', censor_text($reason)); + } + + return ''; + } + + /** + * Get the url to this item. + * + * @return string URL to the APS Display page + * @access public + */ + public function get_url() + { + return $this->helper->route('phpbbstudio_aps_display'); + } + + /** + * Get email template. + * + * @return string|bool Whether or not this notification has an email option template + * @access public + */ + public function get_email_template() + { + return false; + } + + /** + * Get email template variables. + * + * @return array Array of variables that can be used in the email template + * @access public + */ + public function get_email_template_variables() + { + return []; + } + + /** + * Function for preparing the data for insertion in an SQL query. + * (The service handles insertion) + * + * @param array $data The type specific data + * @param array $pre_create_data Data from pre_create_insert_array() + * @return void + * @access public + */ + public function create_insert_array($data, $pre_create_data = []) + { + $this->set_data('name', $data['name']); + $this->set_data('reason', $data['reason']); + $this->set_data('moderator', $data['moderator']); + $this->set_data('moderator_id', $data['moderator_id']); + + parent::create_insert_array($data, $pre_create_data); + } +} diff --git a/ext/phpbbstudio/aps/points/blockader.php b/ext/phpbbstudio/aps/points/blockader.php new file mode 100644 index 0000000..bcd0a8d --- /dev/null +++ b/ext/phpbbstudio/aps/points/blockader.php @@ -0,0 +1,158 @@ +db = $db; + $this->blocks_table = $blocks_table; + } + + /** + * User identifier user for admin desired blocks. + * + * @return int The admin identifier + * @access public + */ + public function get_admin_id() + { + return $this->admin_id; + } + + /** + * Fetch a row from the database for the provided user identifier. + * + * @param int $user_id The user identifier + * @return array The json decoded database row + * @access public + */ + public function row($user_id) + { + $sql = 'SELECT aps_display FROM ' . $this->blocks_table . ' WHERE user_id = ' . (int) $user_id; + $result = $this->db->sql_query_limit($sql, 1); + $display = $this->db->sql_fetchfield('aps_display'); + $this->db->sql_freeresult($result); + + return $display ? (array) json_decode($display, true) : []; + } + + /** + * Fetch a rowset from the database for the provided user identifier and admin identifier. + * + * @param int $user_id The user identifier + * @return array The json decoded database rowset + * @access public + */ + public function rowset($user_id) + { + $rowset = []; + + $sql = 'SELECT user_id, aps_display + FROM ' . $this->blocks_table . ' + WHERE ' . $this->db->sql_in_set('user_id', [$this->admin_id, (int) $user_id]); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + if ($row['user_id'] != ANONYMOUS) + { + $rowset[(int) $row['user_id']] = (array) json_decode($row['aps_display'], true); + } + } + $this->db->sql_freeresult($result); + + return (array) $rowset; + } + + /** + * Set the user desired blocks in the database. + * + * @param int $user_id The user identifier + * @param array $blocks The user desired blocks + * @param bool $insert Whether to insert or update + * @return bool|int Bool on update, integer on insert + * @access public + */ + public function set_blocks($user_id, array $blocks, $insert) + { + if ($user_id == ANONYMOUS) + { + return false; + } + + if ($insert) + { + return $this->insert($user_id, $blocks); + } + else + { + return $this->update($user_id, $blocks); + } + } + + /** + * Insert a user desired blocks into the database. + * + * @param int $user_id The user identifier + * @param array $blocks The user desired blocks + * @return int + * @access public + */ + public function insert($user_id, array $blocks) + { + $sql = 'INSERT INTO ' . $this->blocks_table . ' ' . $this->db->sql_build_array('INSERT', [ + 'user_id' => (int) $user_id, + 'aps_display' => json_encode($blocks), + ]); + $this->db->sql_query($sql); + + return (int) $this->db->sql_nextid(); + } + + /** + * Update a user desired blocks in the database. + * + * @param int $user_id The user identifier + * @param array $blocks The user desired blocks + * @return bool + * @access public + */ + public function update($user_id, array $blocks) + { + $sql = 'UPDATE ' . $this->blocks_table . ' SET ' . $this->db->sql_build_array('UPDATE', [ + 'aps_display' => json_encode($blocks), + ]) . ' WHERE user_id = ' . (int) $user_id; + $this->db->sql_query($sql); + + return (bool) $this->db->sql_affectedrows(); + } +} diff --git a/ext/phpbbstudio/aps/points/distributor.php b/ext/phpbbstudio/aps/points/distributor.php new file mode 100644 index 0000000..6d476ca --- /dev/null +++ b/ext/phpbbstudio/aps/points/distributor.php @@ -0,0 +1,206 @@ +config = $config; + $this->db = $db; + $this->dispatcher = $dispatcher; + $this->functions = $functions; + $this->log = $log; + $this->user = $user; + $this->valuator = $valuator; + } + + /** + * Distribute a user's points. + * + * @param int $user_id The user identifier + * @param double $points The points gained + * @param array $logs The logs array + * @param null $user_points The current user's points, if available. Has to be null as 0 is a valid current points value. + * @return bool Whether the user points were updated or not + * @access public + */ + public function distribute($user_id, $points, $logs, $user_points = null) + { + // Calculate the new total for this user + $total = $this->total($user_id, $points, $user_points); + + // If logging was successful + if ($this->log->add_multi($logs)) + { + // Update the points for this user + return $this->update_points($total, $user_id); + } + + // Points were not updated, return false (logs were invalid) + return false; + } + + /** + * Update a user's points. + * + * @param double $points The user points + * @param int $user_id The user identifier + * @return bool Whether or not the user's row was updated + * @access public + */ + public function update_points($points, $user_id = 0) + { + $user_id = $user_id ? $user_id : $this->user->data['user_id']; + + $sql = 'UPDATE ' . $this->functions->table('users') . ' + SET user_points = ' . (double) $points . ' + WHERE user_id = ' . (int) $user_id; + $this->db->sql_query($sql); + $success = (bool) $this->db->sql_affectedrows(); + + /** + * Event to perform additional actions after APS Points have been distributed. + * + * @event phpbbstudio.aps.update_points + * @var int user_id The user identifier + * @var double points The user points + * @var bool success Whether or not the points were updated + * @since 1.0.3 + */ + $vars = ['user_id', 'points', 'success']; + extract($this->dispatcher->trigger_event('phpbbstudio.aps.update_points', compact($vars))); + + return $success; + } + + /** + * Approve log entries and distribute the on-hold points for a certain user. + * + * @param int $user_id The user identifier + * @param array $post_ids The post identifiers + * @param null $user_points The current user's points, if available. Has to be null as 0 is a valid current points value. + * @return void + * @access public + */ + public function approve($user_id, array $post_ids, $user_points = null) + { + // Get points gained from the log entries + $points = $this->log->get_values($user_id, $post_ids, false); + + // Equate the points gained to a single value + $points = $this->functions->equate_array($points); + + // Calculate the new total for this user + $total = $this->total($user_id, $user_points, $points); + + $this->db->sql_transaction('begin'); + + // Approve the log entries + $this->log->approve($user_id, $post_ids); + + // Update the points for this user + $this->update_points($total, $user_id); + + $this->db->sql_transaction('commit'); + } + + /** + * Disapprove log entries for a certain user. + * + * @param int $user_id The user identifier + * @param array $post_ids The post identifiers + * @return void + * @access public + */ + public function disapprove($user_id, array $post_ids) + { + // Delete the log entries + $this->log->delete([ + 'log_approved' => (int) false, + 'user_id' => (int) $user_id, + 'post_id' => [ + 'IN' => (array) $post_ids, + ], + ]); + } + + /** + * Calculate the new total (current points + gained points) for a specific user. + * + * @param int $user_id The user identifier + * @param double $points The user's gained points + * @param double $user_points The user's current points + * @return double The new total for this user + * @access public + */ + public function total($user_id, $points, $user_points = null) + { + // If the current user's points is null, get it from the database + if ($user_points === null) + { + $user_points = $this->valuator->user((int) $user_id); + } + + // Calculate the new total for this user + $total = $this->functions->equate_points($user_points, $points); + + // Check total boundaries (not higher than X, not lower than X) + $total = $this->functions->boundaries($total); + + return $total; + } +} diff --git a/ext/phpbbstudio/aps/points/reasoner.php b/ext/phpbbstudio/aps/points/reasoner.php new file mode 100644 index 0000000..3aa210a --- /dev/null +++ b/ext/phpbbstudio/aps/points/reasoner.php @@ -0,0 +1,193 @@ +db = $db; + $this->reasons_table = $reasons_table; + } + + /** + * Insert a reason in the database for the first time. + * + * @param array $reason The array to insert + * @return int The new reason identifier + * @access public + */ + public function insert(array $reason) + { + unset($reason['reason_id']); + + $sql = 'SELECT MAX(reason_order) as reason_order FROM ' . $this->reasons_table; + $result = $this->db->sql_query($sql); + $order = $this->db->sql_fetchfield('reason_order'); + $this->db->sql_freeresult($result); + + $reason['reason_order'] = ++$order; + + $sql = 'INSERT INTO ' . $this->reasons_table . ' ' . $this->db->sql_build_array('INSERT', $reason); + $this->db->sql_query($sql); + + return (int) $this->db->sql_nextid(); + } + + /** + * Updates an already existing reason in the database. + * + * @param array $reason The array to update + * @param int $reason_id The reason identifier + * @return bool Whether the reason's row in the database was updated or not + * @access public + */ + public function update(array $reason, $reason_id) + { + unset($reason['reason_id']); + + $sql = 'UPDATE ' . $this->reasons_table . ' SET ' . $this->db->sql_build_array('UPDATE', $reason) . ' WHERE reason_id = ' . (int) $reason_id; + $this->db->sql_query($sql); + + return (bool) $this->db->sql_affectedrows(); + } + + /** + * Deletes a reason row from the database. + * + * @param int $reason_id The reason identifier + * @return bool Whether or not the reason's row was deleted from the database. + * @access public + */ + public function delete($reason_id) + { + $sql = 'DELETE FROM ' . $this->reasons_table . ' WHERE reason_id = ' . (int) $reason_id; + $this->db->sql_query($sql); + + return (bool) $this->db->sql_affectedrows(); + } + + /** + * Retrieves a reason row from the database. + * + * @param int $reason_id The reason identifier + * @return mixed The reason row or false if the row does not exists. + * @access public + */ + public function row($reason_id) + { + if (empty($reason_id)) + { + return []; + } + + $sql = 'SELECT * FROM ' . $this->reasons_table . ' WHERE reason_id = ' . (int) $reason_id; + $result = $this->db->sql_query_limit($sql, 1); + $row = $this->db->sql_fetchrow($result); + $this->db->sql_freeresult($result); + + return (array) $row; + } + + /** + * Retrieves all the reason rows from the database. + * + * @return array The reasons rowset + * @access public + */ + public function rowset() + { + $rowset = []; + + $sql = 'SELECT * FROM ' . $this->reasons_table . ' ORDER BY reason_order ASC'; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $rowset[$row['reason_id']] = $row; + } + $this->db->sql_freeresult($result); + + return $rowset; + } + + /** + * Fills a reason row to make sure all values are set. + * + * @param array $reason The reason array to fill + * @return array The filled reason array + * @access public + */ + public function fill(array $reason) + { + $reason = !empty($reason) ? $reason : []; + + $fields = [ + 'title' => '', + 'desc' => '', + 'points' => 0.00, + 'order' => 0, + ]; + + foreach ($fields as $field => $default) + { + $reason['reason_' . $field] = !empty($reason['reason_' . $field]) ? $reason['reason_' . $field] : $default; + } + + return $reason; + } + + /** + * Re-orders a reason row. + * + * @param int $reason_id The reason identifier + * @param string $direction The direction to move it (up|down). + * @return void + * @access public + */ + public function order($reason_id, $direction) + { + // Select the current order + $sql = 'SELECT reason_order FROM ' . $this->reasons_table . ' WHERE reason_id = ' . (int) $reason_id; + $result = $this->db->sql_query_limit($sql, 1); + $order = (int) $this->db->sql_fetchfield('reason_order'); + $this->db->sql_freeresult($result); + + // Set the new (other) order + $other_order = $direction === 'up' ? $order - 1 : $order + 1; + + // Select the other reason identifier (with which it is being swapped) + $sql = 'SELECT reason_id FROM ' . $this->reasons_table . ' WHERE reason_order = ' . (int) $other_order; + $result = $this->db->sql_query_limit($sql, 1); + $other_id = (int) $this->db->sql_fetchfield('reason_id'); + $this->db->sql_freeresult($result); + + // Update both the reason rows + $this->update(['reason_order' => $other_order], $reason_id); + $this->update(['reason_order' => $order], $other_id); + } +} diff --git a/ext/phpbbstudio/aps/points/valuator.php b/ext/phpbbstudio/aps/points/valuator.php new file mode 100644 index 0000000..2f5ae3b --- /dev/null +++ b/ext/phpbbstudio/aps/points/valuator.php @@ -0,0 +1,378 @@ +db = $db; + $this->functions = $functions; + $this->user = $user; + + $this->values_table = $values_table; + } + + /** + * Get the points for the provided user identifier. + * + * @param int $user_id The user identifier + * @return double The current user's points + * @access public + */ + public function user($user_id) + { + if ($user_id == $this->user->data['user_id']) + { + return (double) $this->user->data['user_points']; + } + + $sql = 'SELECT user_points + FROM ' . $this->functions->table('users') . ' + WHERE user_id = ' . (int) $user_id . ' + AND user_type <> ' . USER_IGNORE; + $result = $this->db->sql_query_limit($sql, 1); + $user_points = $this->db->sql_fetchfield('user_points'); + $this->db->sql_freeresult($result); + + return (double) $user_points; + } + + /** + * Get the points for the provided user identifiers. + * + * @param array|int $user_ids The user identifier(s) + * @return array|float Array with the users' point values or Double if an integer was provided + * @access public + */ + public function users($user_ids) + { + // If it's just a single user + if (!is_array($user_ids)) + { + return $this->user($user_ids); + } + + // Make sure the array is full with integers + $user_ids = array_map('intval', $user_ids); + + // Set up base array + $user_points = []; + + $sql = 'SELECT user_id, user_points + FROM ' . $this->functions->table('users') . ' + WHERE ' . $this->db->sql_in_set('user_id', $user_ids) . ' + AND user_type <> ' . USER_IGNORE; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $user_points[(int) $row['user_id']] = (double) $row['user_points']; + } + $this->db->sql_freeresult($result); + + return $user_points; + } + + /** + * Retrieve point values from the database. + * + * @param array $fields Array of action type fields + * @param array|int $forum_ids The forum identifier(s) + * @param bool $fill Whether the point values should be filled + * @return array + * @access public + */ + public function get_points(array $fields, $forum_ids, $fill = true) + { + // Set up base arrays + $sql_where = $values = []; + + // Iterate over the fields + foreach ($fields as $scope => $fields_array) + { + // If the fields array is not empty, add it to the SQL WHERE clause + if (!empty($fields_array)) + { + $sql_where[] = $this->get_sql_where($scope, $fields_array, $forum_ids); + } + } + + $sql = 'SELECT * + FROM ' . $this->values_table . ' + WHERE ' . implode(' OR ', $sql_where); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $f = (int) $row['forum_id']; + $n = (string) $row['points_name']; + $v = (double) $row['points_value']; + + $values[$f][$n] = $v; + } + $this->db->sql_freeresult($result); + + // Make sure all values are set + if ($fill) + { + $this->fill_values($values, $fields, $forum_ids); + } + + return $values; + } + + /** + * Deletes all points from the database that do not belong to any of the action types. + * + * @param array $fields Array of action types fields + * @param int $forum_id The forum identifier + * @return void + * @access public + */ + public function clean_points($fields, $forum_id) + { + $sql = 'DELETE FROM ' . $this->values_table . ' + WHERE forum_id = ' . (int) $forum_id . ' + AND ' . $this->db->sql_in_set('points_name', $fields, true, true); + $this->db->sql_query($sql); + } + + /** + * Deletes all points from the database that do not belong to any of the action types. + * + * @param array $fields Array of action types fields + * @return void + * @access public + */ + public function clean_all_points($fields) + { + // Set up base arrays + $sql_where = $forum_ids = []; + + $sql = 'SELECT forum_id FROM ' . $this->functions->table('forums'); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $forum_ids[] = (int) $row['forum_id']; + } + $this->db->sql_freeresult($result); + + // Iterate over the fields + foreach ($fields as $scope => $fields_array) + { + // If the fields array is not empty, add it to the SQL WHERE clause + if (!empty($fields_array)) + { + $sql_where[] = $this->get_sql_where($scope, $fields_array, $forum_ids, true); + } + } + + $sql = 'DELETE FROM ' . $this->values_table . ' + WHERE points_value = 0 + OR ' . $this->db->sql_in_set('forum_id', ($forum_ids + [0]), true) . ' + OR ' . implode(' OR ', $sql_where); + $this->db->sql_query($sql); + } + + /** + * Delete the point values in the database for a specific forum. + * + * @param int $forum_id The forum identifier + * @return bool Whether the values were deleted or not. + * @access public + */ + public function delete_points($forum_id) + { + $sql = 'DELETE FROM ' . $this->values_table . ' + WHERE forum_id = ' . (int) $forum_id; + $this->db->sql_query($sql); + + return (bool) $this->db->sql_affectedrows(); + } + + /** + * Set the point values in the database. + * + * @param array $points Array of point values + * @param int $forum_id The forum identifier + * @return void + * @access public + */ + public function set_points($points, $forum_id) + { + $existing = [(int) empty($forum_id) => array_keys($points)]; + $existing = $this->get_points($existing, $forum_id, false); + $existing = $existing ? array_keys($existing[(int) $forum_id]) : []; + + $this->db->sql_transaction('begin'); + + foreach ($points as $name => $value) + { + // If the value already exists in the database, update it + if (in_array($name, $existing)) + { + $sql = 'UPDATE ' . $this->values_table . ' + SET points_value = ' . (double) $value . ' + WHERE points_name = "' . $this->db->sql_escape($name) . '" + AND forum_id = ' . (int) $forum_id; + } + else + { + // Otherwise insert it for the first time + $row['forum_id'] = (int) $forum_id; + + $sql = 'INSERT INTO ' . $this->values_table . ' ' . $this->db->sql_build_array('INSERT', [ + 'points_name' => (string) $name, + 'points_value' => (double) $value, + 'forum_id' => (int) $forum_id, + ]); + } + + $this->db->sql_query($sql); + } + + $this->db->sql_transaction('commit'); + } + + /** + * Copy the point values from one forum to an other. + * + * @param int $from The "from" forum identifier + * @param array|int $to The "to" forum identifier(s) + * @return void + * @access public + */ + public function copy_points($from, $to) + { + $this->db->sql_transaction('begin'); + + // Select "from" points + $sql = 'SELECT points_name, points_value + FROM ' . $this->values_table . ' + WHERE forum_id = ' . (int) $from; + $result = $this->db->sql_query($sql); + $rowset = $this->db->sql_fetchrowset($result); + $this->db->sql_freeresult($result); + + $to = array_map('intval', array_unique(array_filter($to))); + + // Delete "to" points + $sql = 'DELETE FROM ' . $this->values_table . ' + WHERE ' . $this->db->sql_in_set('forum_id', $to); + $this->db->sql_query($sql); + + foreach ($to as $forum_id) + { + for ($i = 0; $i < count($rowset); $i++) + { + $rowset[$i]['forum_id'] = (int) $forum_id; + } + + $this->db->sql_multi_insert($this->values_table, $rowset); + } + + $this->db->sql_transaction('commit'); + } + + /** + * Create a SQL WHERE clause based on the scope (local|global) and the provided fields. + * + * @param int $scope The scope for the fields (local|global) + * @param array $fields Array of action types fields + * @param array|int $forum_ids The forum identifier(s) + * @param bool $negate Whether it should be a SQL IN or SQL NOT IN clause + * @return string The SQL WHERE clause + * @access protected + */ + protected function get_sql_where($scope, array $fields, $forum_ids, $negate = false) + { + $sql_where = '('; + $sql_where .= $this->db->sql_in_set('points_name', $fields, $negate); + $sql_where .= ' AND '; + + switch ($scope) + { + // Local + case 0: + $sql_where .= is_array($forum_ids) ? $this->db->sql_in_set('forum_id', array_map('intval', $forum_ids), $negate) : 'forum_id ' . ($negate ? '!= ' : '= ') . (int) $forum_ids; + break; + + // Global + case 1: + $sql_where .= 'forum_id = 0'; + break; + } + + $sql_where .= ')'; + + return $sql_where; + } + + /** + * Fills the values array, meaning that if a point value is not available in the database + * the key is still set with a default value of 0.00 + * + * @param array $values Array of point values + * @param array $fields Array of action types fields + * @param array|int $forum_ids The forum identifier(s) + * @return void + * @access protected + */ + protected function fill_values(array &$values, $fields, $forum_ids) + { + // Make sure all forum ids are set + $fill = is_array($forum_ids) ? array_map('intval', $forum_ids) : [(int) $forum_ids]; + $fill = array_fill_keys($fill, []); + $values = $values + $fill; + + // Iterate over the set values + foreach ($values as $forum_id => $values_array) + { + // The scope: 0 - local | 1 - global + $scope = (int) empty($forum_id); + + // Set up an array with all fields as array and a default value + $requested = array_fill_keys($fields[$scope], 0.00); + + // Merge the set values with the requested values, where the set values take precedence + $values[$forum_id] = array_merge($requested, $values_array); + } + } +} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/aps_display.html b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display.html new file mode 100644 index 0000000..2c2b4ff --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display.html @@ -0,0 +1,50 @@ +{% extends '@phpbbstudio_aps/aps_main.html' %} + +{% block nav %} + {% for page in aps_navbar %} +
  • + + {{ page.TITLE }} + +
  • + {% endfor %} +{% endblock %} + +{% block nav_right %} + {% if S_REGISTERED_USER %} + + {% endif %} +{% endblock %} + +{% block main %} +
    + {% for block in aps_blocks %} + {{ include('@phpbbstudio_aps/blocks/base.html', {'block': block}) }} + {% endfor %} +
    +
    +
    +

    {{ lang('APS_POINTS_BLOCK_NONE') }}

    +
    +
    +
    +
    +{% endblock %} + +{% INCLUDEJS '@phpbbstudio_aps/js/chart.bundle.min.js' %} +{% INCLUDEJS '@phpbbstudio_aps/js/jquery-ui-sortable.min.js' %} +{% INCLUDEJS '@phpbbstudio_aps/js/palette.js' %} +{% INCLUDEJS '@phpbbstudio_aps/js/aps_display.js' %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_search.html b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_search.html new file mode 100644 index 0000000..31bb978 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_search.html @@ -0,0 +1,36 @@ + diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_sort.html b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_sort.html new file mode 100644 index 0000000..3d313ad --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/aps_display_sort.html @@ -0,0 +1,16 @@ + diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/aps_main.html b/ext/phpbbstudio/aps/styles/prosilver/template/aps_main.html new file mode 100644 index 0000000..e931859 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/aps_main.html @@ -0,0 +1,79 @@ +{% include 'overall_header.html' %} + +{% if not definition.INCLUDED_APS_DISPLAYCSS %} + {% INCLUDECSS '@phpbbstudio_aps/aps_display.css' %} + {% DEFINE INCLUDED_APS_DISPLAYCSS = true %} +{% endif %} + +{% if not definition.INCLUDED_APS_FORMCSS %} + {% INCLUDECSS '@phpbbstudio_aps/aps_form.css' %} + {% DEFINE INCLUDED_APS_FORMCSS = true %} +{% endif %} + +{% block includes %}{% endblock %} + +
    +
    +
    +
    + {# Reserved: Please do not use this event #} + {% EVENT phpbbstudio_aps_menu_before %} +
    +
    +
    + +
    +
    + +
      + {% EVENT phpbbstudio_aps_menu_right_prepend %} +
    • + + {{ aps_display(user.data.user_points, false) }} + +
    • +
    +
    + + {% set nav = block('nav') is defined ? block('nav')|trim : '' %} + {% set nav_right = block('nav_right') is defined ? block('nav_right')|trim : '' %} + + {% if nav != '' or nav_right != '' %} +
    + {% if nav != '' %} +
      + {{ nav }} +
    + {% endif %} + {% if nav_right != '' %} +
      + {{ nav_right }} +
    + {% endif %} +
    + {% endif %} +
    + +
    + {% block main %}{% endblock %} +
    + + +
    + +{% if not definition.INCLUDED_SWEETALERT2ALLMINJS %} + {% INCLUDEJS '@phpbbstudio_aps/js/sweetalert2.all.min.js' %} + {% DEFINE INCLUDED_SWEETALERT2ALLMINJS = true %} +{% endif %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/base.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/base.html new file mode 100644 index 0000000..fc16b40 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/base.html @@ -0,0 +1,28 @@ +{% set width = block('width', block.TEMPLATE) is defined ? block('width', block.TEMPLATE) : 's12' %} +
    +
    +
    +

    {{ block.TITLE }}

    + {% if S_USER_LOGGED_IN and not S_IS_BOT %} + {% if not block.S_REQUIRED %} + + + + {% endif %} + + {% endif %} +
    +
    + {% if block('content', block.TEMPLATE) is defined %} + {{ block('content', block.TEMPLATE) }} + {% else %} +

    {{ lang('APS_POINTS_BLOCK_NO_CONTENT') }}

    + {% endif %} +
    + {% if block('footer', block.TEMPLATE) is defined %} + + {% endif %} +
    +
    diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_actions.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_actions.html new file mode 100644 index 0000000..781bb87 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_actions.html @@ -0,0 +1,104 @@ +{% block width %}s12{% endblock %} + +{% block content %} + {% if aps_actions %} +
    + {% for action in aps_actions %} +
    + {{ APS_ACTIONS_AVATARS[action.USER_ID] is not empty ? APS_ACTIONS_AVATARS[action.USER_ID] : (S_APS_DAE_ENABLED ? '' : APS_ACTIONS_NO_AVATAR) }} +
    +
    + {{ action.USER }} +
    +
    + {{ lang(action.ACTION) }} + {% if not action.S_SELF %} +
    {{ lang('POST_BY_AUTHOR') }} + {% if action.S_MOD and not action.S_AUTH_MOD %} + {{ lang('MODERATOR') }} + {% else %} + {{ action.REPORTEE }} + {% endif %} + {% endif %} +
    + {% if action.S_AUTH_BUILD %} +
    + {% if action.S_AUTH_BUILD_OTHER %} +
    + +
    + + {% endif %} +
    + {% endif %} +
    +
    + {{ aps_display(action.POINTS_OLD, false) }} +
    +
    + {{ aps_display(action.POINTS_SUM, false) }} +
    +
    + {{ aps_display(action.POINTS_NEW, false) }} +
    +
    +
    + {{ user.format_date(action.TIME) }} +
    +
    + {% if action.FORUM_NAME or action.TOPIC_TITLE or action.POST_SUBJECT %} + + {% else %} +
    {{ lang('NA') }}
    + {% endif %} +
    +
    +
    + {% endfor %} +
    + {% else %} +
    {{ lang('APS_POINTS_ACTIONS_NONE', aps_name()) }}
    + {% endif %} +{% endblock %} + +{% block footer %} + {# Pagination #} + + + {# Search and sort #} +
    + {# Sort options #} + {% include '@phpbbstudio_aps/aps_display_sort.html' %} + + {# Search options #} + {% include '@phpbbstudio_aps/aps_display_search.html' %} + + {# Search keywords #} + + +
    +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_adjustments.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_adjustments.html new file mode 100644 index 0000000..f06a779 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_adjustments.html @@ -0,0 +1,79 @@ +{% block width %}s12{% endblock %} + +{% block content %} + {% if aps_adjustments %} +
    + {% for action in aps_adjustments %} +
    + {{ APS_ADJUSTMENTS_AVATARS[action.USER_ID] is not empty ? APS_ADJUSTMENTS_AVATARS[action.USER_ID] : (S_APS_DAE_ENABLED ? '' : APS_ADJUSTMENTS_NO_AVATAR) }} +
    +
    + {{ action.USER }} +
    +
    + {{ lang(action.ACTION) }} +
    + {% if action.S_AUTH_BUILD %} +
    + {% if action.S_AUTH_BUILD_OTHER %} +
    + +
    + + {% endif %} +
    + {% endif %} +
    +
    + {{ aps_display(action.POINTS_OLD, false) }} +
    +
    + {{ aps_display(action.POINTS_SUM, false) }} +
    +
    + {{ aps_display(action.POINTS_NEW, false) }} +
    +
    +
    + {{ user.format_date(action.TIME) }} + {% if not action.S_SELF %} + {{ lang('POST_BY_AUTHOR') }} + {% if action.S_MOD and not action.S_AUTH_MOD %} + {{ lang('MODERATOR') }} + {% else %} + {{ action.REPORTEE }} + {% endif %} + {% endif %} +
    +
    + {% if action.FORUM_NAME or action.TOPIC_TITLE or action.POST_SUBJECT %} + + {% else %} +
    {{ lang('NA') }}
    + {% endif %} +
    +
    +
    + {% endfor %} +
    + {% else %} +
    {{ lang('APS_POINTS_ACTIONS_NONE', aps_name()) }}
    + {% endif %} +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_forums.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_forums.html new file mode 100644 index 0000000..6076cf4 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_forums.html @@ -0,0 +1,18 @@ +{% block width %}s12 m6 aps-js{% endblock %} + +{% block content %} + +

    {{ lang('APS_POINTS_PER_FORUM', aps_name()) }}

    +
    + +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_groups.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_groups.html new file mode 100644 index 0000000..a0d5997 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_groups.html @@ -0,0 +1,16 @@ +{% block width %}s12 m6 aps-js{% endblock %} + +{% block content %} + +

    {{ lang('APS_POINTS_PER_GROUP', aps_name()) }}

    +
    + +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_growth.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_growth.html new file mode 100644 index 0000000..e9bea8a --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_growth.html @@ -0,0 +1,22 @@ +{% block width %}s12 m6 aps-js{% endblock %} + +{% block content %} + +

    {{ lang('APS_POINTS_GROWTH', aps_name()) }}

    +
    + +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_random.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_random.html new file mode 100644 index 0000000..5a20409 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_random.html @@ -0,0 +1,13 @@ +{% block width %}s12 m6{% endblock %} + +{% block content %} +
    +
    + {{ APS_RANDOM_USER_AVATAR ? APS_RANDOM_USER_AVATAR : (S_APS_DAE_ENABLED ? '' : APS_RANDOM_NO_AVATAR) }} +
    +
    + {{ APS_RANDOM_USER_FULL }}
    + {{ aps_display(APS_RANDOM_USER_POINTS) }} +
    +
    +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_search.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_search.html new file mode 100644 index 0000000..75af260 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_search.html @@ -0,0 +1,29 @@ +{% block width %}s12 m6{% endblock %} + +{% block content %} +
    +
    + {{ APS_SEARCH_USER_AVATAR ? APS_SEARCH_USER_AVATAR : (S_APS_DAE_ENABLED ? '' : APS_NO_AVATAR) }} +
    +
    + {{ APS_SEARCH_USER_FULL }}
    + {{ aps_display(APS_SEARCH_USER_POINTS) }}
    + {% set podium = APS_SEARCH_USER_RANK in 1..3 ? APS_SEARCH_USER_RANK : 0 %} + {{ APS_SEARCH_USER_RANK }} + {% if S_APS_USER_ADJUST and U_APS_SEARCH_USER_ADJUST %} +
    + + + + {% endif %} +
    +
    +{% endblock %} + +{% block footer %} +
    + + + +
    +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_settings.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_settings.html new file mode 100644 index 0000000..e23ec6c --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_settings.html @@ -0,0 +1,18 @@ +{% block width %}s12 m6{% endblock %} + +{% block content %} + {% set min = aps_config('aps_points_min') %} + {% set max = aps_config('aps_points_max') %} + {% set def = aps_config('default_lang') %} + {% set name = aps_config('aps_points_name_' ~ def) %} + {% set name = user.lang_name != def and name != aps_name() ? name : '' %} + +
    +
    {{ lang('APS_POINTS_NAME') ~ lang('COLON') }}
    {{ aps_name() }}{% if name %} ({{ name }}){% endif %}
    +
    {{ lang('APS_POINTS_FORMAT', aps_name()) ~ lang('COLON') }}
    {{ aps_display(12345.00) }}
    +
    {{ lang('APS_POINTS_MIN', aps_name()) ~ lang('COLON') }}
    {{ min ? min : lang('NA') }}
    +
    {{ lang('APS_POINTS_MAX', aps_name()) ~ lang('COLON') }}
    {{ max ? max : lang('NA') }}
    +
    {{ lang('APS_POINTS_ACTIONS_PAGE') ~ lang('COLON') }}
    {{ aps_config('aps_actions_per_page') }}
    + {% EVENT phpbbstudio_aps_display_settings_append %} +
    +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_top.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_top.html new file mode 100644 index 0000000..df34fc2 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_top.html @@ -0,0 +1,36 @@ +{% block width %}s12 m6{% endblock %} + +{% block content %} +
    + {% set last_place = 0 %} + {% set last_points = 0 %} + {% for user in top_users %} + {% set same_points = last_points == user.POINTS %} + {% set last_place = same_points ? last_place : loop.index %} + {% set last_points = same_points ? last_points : user.POINTS %} +
    + {{ user.AVATAR ? user.AVATAR : (S_APS_DAE_ENABLED ? '' : APS_NO_AVATAR) }} + {{ user.NAME }} +

    {{ aps_display(user.POINTS) }}

    + {% if S_APS_USER_ADJUST %} + + + + {% elseif last_place < 4 %} + + {% else %} + {{ last_place }} + {% endif %} +
    + {% endfor %} +
    +{% endblock %} + +{% block footer %} +
    + + + {% if aps_config('aps_display_top_change') %}{% endif %} +
    +{% endblock %} + diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_trade_off.html b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_trade_off.html new file mode 100644 index 0000000..82af6b9 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/blocks/points_trade_off.html @@ -0,0 +1,28 @@ +{% block width %}s12 m6 aps-js{% endblock %} + +{% block content %} + +

    {{ lang('APS_POINTS_TRADE_OFF', aps_name()) }}

    +
    + + +{% endblock %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/memberlist_view_user_statistics_before.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/memberlist_view_user_statistics_before.html new file mode 100644 index 0000000..2ba7eba --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/memberlist_view_user_statistics_before.html @@ -0,0 +1,2 @@ +{% if aps_config('aps_points_display_profile') %}
    {{ aps_name() ~ lang('COLON') }}
    {{ aps_display(USER_POINTS) }}
    {% endif %} +{% EVENT phpbbstudio_aps_profile_append %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_after.html new file mode 100644 index 0000000..29daad8 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_after.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_PROFILE_LIST_AFTER %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_before.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_before.html new file mode 100644 index 0000000..e67ae7b --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_profile_list_before.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_PROFILE_LIST_BEFORE %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_after.html new file mode 100644 index 0000000..d7b8303 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_after.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_QUICK_LINKS_AFTER %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_before.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_before.html new file mode 100644 index 0000000..a86a00e --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_quick_links_before.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_QUICK_LINKS_BEFORE %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_append.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_append.html new file mode 100644 index 0000000..b976a08 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_append.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_USER_PROFILE_APPEND %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_prepend.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_prepend.html new file mode 100644 index 0000000..3f87089 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/navbar_header_user_profile_prepend.html @@ -0,0 +1,7 @@ +{% if S_APS_NAVBAR_HEADER_USER_PROFILE_PREPEND %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_breadcrumb_append.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_breadcrumb_append.html new file mode 100644 index 0000000..97ecf81 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_breadcrumb_append.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_FOOTER_BREADCRUMB_APPEND %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_after.html new file mode 100644 index 0000000..974bf50 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_after.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_FOOTER_TEAMLINK_AFTER %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_before.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_before.html new file mode 100644 index 0000000..5d76531 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_teamlink_before.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_FOOTER_TEAMLINK_BEFORE %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_after.html new file mode 100644 index 0000000..6b3ab42 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_after.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_FOOTER_TIMEZONE_AFTER %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_before.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_before.html new file mode 100644 index 0000000..8021c4b --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_footer_timezone_before.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_FOOTER_TIMEZONE_BEFORE %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_append.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_append.html new file mode 100644 index 0000000..99ac3ba --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_append.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_HEADER_NAVIGATION_APPEND %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_prepend.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_prepend.html new file mode 100644 index 0000000..d2f5a60 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/overall_header_navigation_prepend.html @@ -0,0 +1,7 @@ +{% if S_APS_OVERALL_HEADER_NAVIGATION_PREPEND %} +
  • + + {{ aps_icon() }}{{ aps_display(user.data.user_points, false) }} + +
  • +{% endif %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/ucp_pm_viewmessage_rank_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/ucp_pm_viewmessage_rank_after.html new file mode 100644 index 0000000..361e114 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/ucp_pm_viewmessage_rank_after.html @@ -0,0 +1,2 @@ +{% if aps_config('aps_points_display_pm') %}
    {{ aps_name() ~ lang('COLON') }} {{ aps_display(AUTHOR_POINTS) }}
    {% endif %} +{% EVENT phpbbstudio_aps_pm_append %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/event/viewtopic_body_postrow_rank_after.html b/ext/phpbbstudio/aps/styles/prosilver/template/event/viewtopic_body_postrow_rank_after.html new file mode 100644 index 0000000..31138ff --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/event/viewtopic_body_postrow_rank_after.html @@ -0,0 +1,2 @@ +{% if aps_config('aps_points_display_post') %}
    {{ aps_name() ~ lang('COLON') }} {{ aps_display(postrow.POSTER_POINTS) }}
    {% endif %} +{% EVENT phpbbstudio_aps_post_append %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_display.js b/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_display.js new file mode 100644 index 0000000..db97528 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_display.js @@ -0,0 +1,255 @@ +/** @function jQuery */ +jQuery(function($) { + let aps = { + body: $('.aps-body'), + empty: $('[data-aps-empty-panel]'), + darken: $('#darkenwrapper'), + classes: { + column: '.aps-col', + content: '.aps-panel-content', + panel: '.aps-panel', + pagination: '.aps-panel-footer .pagination' + }, + add: { + el: $('.aps-panel-add'), + class: 'aps-panel-add-pulse', + content: '.dropdown-contents', + trigger: '.dropdown-trigger' + }, + sortable: { + el: $('[data-aps-sort]'), + url: 'aps-sort', + attr: 'data-aps-id', + data: { + delay: 150, + cursor: 'grabbing', + tolerance: 'pointer', + handle: '.aps-panel-move', + placeholder: 'aps-panel-placeholder', + forcePlaceholderSize: true + } + }, + augmentation: { + selector: '[data-aps-augmentation]' + }, + charts: { + selector: '[data-aps-chart]', + data: { + chart: 'aps-chart', + colour: 'aps-colour', + border: 'aps-colour-border', + point: 'aps-colour-point', + label: 'aps-label', + labels: 'aps-labels', + time: 'aps-time', + value: 'aps-value' + } + } + }; + + aps.add.pulse = function() { + this.el.children(this.trigger).toggleClass(this.class, !aps.empty.is(':hidden')); + }; + + aps.ajaxify = function(context) { + $('[data-ajax]', context).each(function() { + let $this = $(this), + ajax = $this.data('ajax'), + filter = $this.data('filter'); + + if (ajax !== 'false') { + phpbb.ajaxify({ + selector: this, + callback: ajax !== 'true' ? ajax : null, + refresh: aps.defined($this.data('refresh')), + filter: aps.defined(filter) ? phpbb.getFunctionByName(filter) : null + }) + } + }); + }; + + aps.defined = function(operand) { + return typeof operand !== 'undefined'; + }; + + aps.message = function(title, text, type, time) { + swal({ + title: title, + text: text, + type: type || 'success', + timer: aps.defined(time) ? time : 1500, + showConfirmButton: false + }); + }; + + aps.sortable.el.each(function() { + $(this).sortable($.extend(aps.sortable.data, { + containment: $(this), + update: function() { + $.ajax({ + url: $(this).data(aps.sortable.url), + type: 'POST', + data: { + order: $(this).sortable('toArray', { attribute: aps.sortable.attr }), + }, + error: function() { + aps.message(aps.darken.data('ajax-error-title'), aps.darken.data('ajax-error-text'), 'error', null); + }, + success: function(r) { + aps.message(r.APS_TITLE, r.APS_TEXT); + } + }); + } + })); + }); + + aps.augmentation.register = function(context) { + $(aps.augmentation.selector, context).each(function() { + $(this).on('click', function() { + let $parent = $(this).parent(), + $avatar = $parent.parent().siblings('img'); + + swal({ + title: $parent.siblings().first().html(), + html: $(this).next('.hidden').html(), + imageUrl: $avatar.attr('src'), + imageAlt: $avatar.attr('alt'), + imageWidth: $avatar.attr('width'), + imageHeight: $avatar.attr('height') + }); + }); + }); + }; + + aps.augmentation.register(null); + + aps.charts.draw = function() { + $(aps.charts.selector).each(function() { + let data = { + datasets: [], + labels: [] + }; + + $(this).siblings('.hidden').each(function(i) { + data.datasets[i] = { + backgroundColor: [], + data: [] + }; + + $(this).children().each(function() { + data.datasets[i].data.push($(this).data(aps.charts.data.value)); + + let colour = $(this).data(aps.charts.data.colour), + border = $(this).data(aps.charts.data.border), + point = $(this).data(aps.charts.data.point), + label = $(this).data(aps.charts.data.label), + labels = $(this).data(aps.charts.data.labels); + + if (aps.defined(colour)) { + data.datasets[i].backgroundColor.push(colour); + data.datasets[i].fill = colour; + } + + if (aps.defined(border)) { + data.datasets[i].borderColor = colour; + data.datasets[i].pointBorderColor = colour; + } + + if (aps.defined(point)) { + data.datasets[i].pointBackgroundColor = point; + } + + if (aps.defined(label)) { + data.datasets[i].label = label; + } + + if (aps.defined(labels)) { + data.labels.push(labels); + } + }); + + if (!data.datasets[i].backgroundColor.length) { + data.datasets[i].backgroundColor = palette('tol', data.datasets[i].data.length).map(function(hex) { + return '#' + hex; + }); + } + }); + + new Chart($(this), { + type: $(this).data(aps.charts.data.chart), + data: data, + responsive: true, + maintainAspectRatio: false, + options: { + animation: { duration: $(this).data(aps.charts.data.time) }, + legend: { position: 'bottom' } + } + }); + }); + }; + + /** + * Register a chart plugin. + * This plugin checks for empty charts. + * If the chart is empty, the canvas' data-aps-empty is displayed instead. + */ + Chart.plugins.register({ + afterDraw: function(chart) { + if (!chart.config.data.datasets[0].data.length) { + let ctx = chart.chart.ctx, + width = chart.chart.width, + height = chart.chart.height; + + chart.clear(); + + ctx.save(); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(chart.canvas.dataset.apsEmpty, width / 2, height / 2); + ctx.restore(); + } + } + }); + + /** + * Add a "fake" timeout to the Chart drawing animation, + * otherwise the animation does not show up. + */ + setTimeout(aps.charts.draw, 0); + + phpbb.addAjaxCallback('aps_add', function(r) { + if (r.success) { + $(this).parent('li').remove(); + + let panel = $(r.success).insertBefore(aps.empty, null); + + aps.ajaxify(panel); + aps.add.pulse(); + aps.charts.draw(); + aps.body.trigger('click'); + aps.message(r.APS_TITLE, r.APS_TEXT); + } + }); + + phpbb.addAjaxCallback('aps_remove', function(r) { + if (r.success) { + $(this).parents(aps.classes.column).remove(); + + let item = aps.add.el.find(aps.add.content).append(r.success); + + aps.ajaxify(item); + aps.add.pulse(); + aps.message(r.APS_TITLE, r.APS_TEXT); + } + }); + + phpbb.addAjaxCallback('aps_replace', function(r) { + let $old = $(this).parents(aps.classes.panel), + $new = $(r.body); + + $old.find(aps.classes.content).html($new.find(aps.classes.content)); + $old.find(aps.classes.pagination).html($new.find(aps.classes.pagination)); + + aps.augmentation.register($old); + }); +}); diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_mcp.js b/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_mcp.js new file mode 100644 index 0000000..80d00e4 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/js/aps_mcp.js @@ -0,0 +1,23 @@ +jQuery(function($) { + let $action = $('#action'), + $points = $('#points'), + $reason = $('#reason'); + + let apsChangeAction = function() { + let $selected = $(this).find(':selected'), + points = $selected.data('points'), + reason = $selected.data('reason'); + + if (points || $selected.context === undefined) { + $points.prop('disabled', 'disabled').val(points); + $reason.prop('disabled', 'disabled').val(reason); + } else { + $points.prop('disabled', false).val(''); + $reason.prop('disabled', false).val(''); + } + }; + + apsChangeAction(); + + $action.on('change', apsChangeAction); +}); diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/js/chart.bundle.min.js b/ext/phpbbstudio/aps/styles/prosilver/template/js/chart.bundle.min.js new file mode 100644 index 0000000..c157d33 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/js/chart.bundle.min.js @@ -0,0 +1,10 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.7.3 + * + * Copyright 2018 Chart.js Contributors + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Chart=t()}}(function(){return function r(o,s,l){function u(e,t){if(!s[e]){if(!o[e]){var n="function"==typeof require&&require;if(!t&&n)return n(e,!0);if(d)return d(e,!0);var i=new Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}var a=s[e]={exports:{}};o[e][0].call(a.exports,function(t){return u(o[e][1][t]||t)},a,a.exports,r,o,s,l)}return s[e].exports}for(var d="function"==typeof require&&require,t=0;t>>0,i=0;iwt(t)?(r=t+1,s-wt(t)):(r=t,s),{year:r,dayOfYear:o}}function Bt(t,e,n){var i,a,r=Vt(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?i=o+Et(a=t.year()-1,e,n):o>Et(t.year(),e,n)?(i=o-Et(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Et(t,e,n){var i=Vt(t,e,n),a=Vt(t+1,e,n);return(wt(t)-i+a)/7}B("w",["ww",2],"wo","week"),B("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),Y("week",5),Y("isoWeek",5),lt("w",J),lt("ww",J,G),lt("W",J),lt("WW",J,G),ft(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=M(t)});B("d",0,"do","day"),B("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),B("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),B("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),B("e",0,0,"weekday"),B("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),Y("day",11),Y("weekday",11),Y("isoWeekday",11),lt("d",J),lt("e",J),lt("E",J),lt("dd",function(t,e){return e.weekdaysMinRegex(t)}),lt("ddd",function(t,e){return e.weekdaysShortRegex(t)}),lt("dddd",function(t,e){return e.weekdaysRegex(t)}),ft(["dd","ddd","dddd"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:v(n).invalidWeekday=t}),ft(["d","e","E"],function(t,e,n,i){e[i]=M(t)});var jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ut="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var Gt="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var qt=ot;var Zt=ot;var Xt=ot;function Jt(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=p([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=dt(s[e]),l[e]=dt(l[e]),u[e]=dt(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function $t(){return this.hours()%12||12}function Kt(t,e){B(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function Qt(t,e){return e._meridiemParse}B("H",["HH",2],0,"hour"),B("h",["hh",2],0,$t),B("k",["kk",2],0,function(){return this.hours()||24}),B("hmm",0,0,function(){return""+$t.apply(this)+W(this.minutes(),2)}),B("hmmss",0,0,function(){return""+$t.apply(this)+W(this.minutes(),2)+W(this.seconds(),2)}),B("Hmm",0,0,function(){return""+this.hours()+W(this.minutes(),2)}),B("Hmmss",0,0,function(){return""+this.hours()+W(this.minutes(),2)+W(this.seconds(),2)}),Kt("a",!0),Kt("A",!1),A("hour","h"),Y("hour",13),lt("a",Qt),lt("A",Qt),lt("H",J),lt("h",J),lt("k",J),lt("HH",J,G),lt("hh",J,G),lt("kk",J,G),lt("hmm",$),lt("hmmss",K),lt("Hmm",$),lt("Hmmss",K),ct(["H","HH"],vt),ct(["k","kk"],function(t,e,n){var i=M(t);e[vt]=24===i?0:i}),ct(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),ct(["h","hh"],function(t,e,n){e[vt]=M(t),v(n).bigHour=!0}),ct("hmm",function(t,e,n){var i=t.length-2;e[vt]=M(t.substr(0,i)),e[bt]=M(t.substr(i)),v(n).bigHour=!0}),ct("hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[vt]=M(t.substr(0,i)),e[bt]=M(t.substr(i,2)),e[yt]=M(t.substr(a)),v(n).bigHour=!0}),ct("Hmm",function(t,e,n){var i=t.length-2;e[vt]=M(t.substr(0,i)),e[bt]=M(t.substr(i))}),ct("Hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[vt]=M(t.substr(0,i)),e[bt]=M(t.substr(i,2)),e[yt]=M(t.substr(a))});var te,ee=Ct("Hours",!0),ne={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:/\d{1,2}/,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:At,monthsShort:Ft,week:{dow:0,doy:6},weekdays:jt,weekdaysMin:Gt,weekdaysShort:Ut,meridiemParse:/[ap]\.?m?\.?/i},ie={},ae={};function re(t){return t?t.toLowerCase().replace("_","-"):t}function oe(t){var e=null;if(!ie[t]&&void 0!==jn&&jn&&jn.exports)try{e=te._abbr,En("./locale/"+t),se(e)}catch(t){}return ie[t]}function se(t,e){var n;return t&&((n=u(e)?ue(t):le(t,e))?te=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),te._abbr}function le(t,e){if(null===e)return delete ie[t],null;var n,i=ne;if(e.abbr=t,null!=ie[t])C("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."),i=ie[t]._config;else if(null!=e.parentLocale)if(null!=ie[e.parentLocale])i=ie[e.parentLocale]._config;else{if(null==(n=oe(e.parentLocale)))return ae[e.parentLocale]||(ae[e.parentLocale]=[]),ae[e.parentLocale].push({name:t,config:e}),null;i=n._config}return ie[t]=new O(T(i,e)),ae[t]&&ae[t].forEach(function(t){le(t.name,t.config)}),se(t),ie[t]}function ue(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return te;if(!s(t)){if(e=oe(t))return e;t=[t]}return function(t){for(var e,n,i,a,r=0;r=e&&o(a,n,!0)>=e-1)break;e--}r++}return te}(t)}function de(t){var e,n=t._a;return n&&-2===v(t).overflow&&(e=n[mt]<0||11Ot(n[gt],n[mt])?pt:n[vt]<0||24Et(n,r,o)?v(t)._overflowWeeks=!0:null!=l?v(t)._overflowWeekday=!0:(s=Ht(n,i,a,r,o),t._a[gt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(r=he(t._a[gt],i[gt]),(t._dayOfYear>wt(r)||0===t._dayOfYear)&&(v(t)._overflowDayOfYear=!0),n=zt(r,0,t._dayOfYear),t._a[mt]=n.getUTCMonth(),t._a[pt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=o[e]=i[e];for(;e<7;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[vt]&&0===t._a[bt]&&0===t._a[yt]&&0===t._a[xt]&&(t._nextDay=!0,t._a[vt]=0),t._d=(t._useUTC?zt:function(t,e,n,i,a,r,o){var s=new Date(t,e,n,i,a,r,o);return t<100&&0<=t&&isFinite(s.getFullYear())&&s.setFullYear(t),s}).apply(null,o),a=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[vt]=24),t._w&&void 0!==t._w.d&&t._w.d!==a&&(v(t).weekdayMismatch=!0)}}var fe=/^\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)?)?$/,ge=/^\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)?)?$/,me=/Z|[+-]\d\d(?::?\d\d)?/,pe=[["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}/]],ve=[["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/]],be=/^\/?Date\((\-?\d+)/i;function ye(t){var e,n,i,a,r,o,s=t._i,l=fe.exec(s)||ge.exec(s);if(l){for(v(t).iso=!0,e=0,n=pe.length;en.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},un.isLocal=function(){return!!this.isValid()&&!this._isUTC},un.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},un.isUtc=Ve,un.isUTC=Ve,un.zoneAbbr=function(){return this._isUTC?"UTC":""},un.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},un.dates=n("dates accessor is deprecated. Use date instead.",nn),un.months=n("months accessor is deprecated. Use month instead",Lt),un.years=n("years accessor is deprecated. Use year instead",Dt),un.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),un.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!u(this._isDSTShifted))return this._isDSTShifted;var t={};if(x(t,this),(t=Se(t))._a){var e=t._isUTC?p(t._a):Ce(t._a);this._isDSTShifted=this.isValid()&&0');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(l){var u=l.data;return u.labels.length&&u.datasets.length?u.labels.map(function(t,e){var n=l.getDatasetMeta(0),i=u.datasets[0],a=n.data[e],r=a&&a.custom||{},o=O.valueAtIndexOrDefault,s=l.options.elements.arc;return{text:t,fillStyle:r.backgroundColor?r.backgroundColor:o(i.backgroundColor,e,s.backgroundColor),strokeStyle:r.borderColor?r.borderColor:o(i.borderColor,e,s.borderColor),lineWidth:r.borderWidth?r.borderWidth:o(i.borderWidth,e,s.borderWidth),hidden:isNaN(i.data[e])||n.data[e].hidden,index:e}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n=Math.PI?-1:f<-Math.PI?1:0))+c,m=Math.cos(f),p=Math.sin(f),v=Math.cos(g),b=Math.sin(g),y=f<=0&&0<=g||f<=2*Math.PI&&2*Math.PI<=g,x=f<=.5*Math.PI&&.5*Math.PI<=g||f<=2.5*Math.PI&&2.5*Math.PI<=g,_=f<=-Math.PI&&-Math.PI<=g||f<=Math.PI&&Math.PI<=g,k=f<=.5*-Math.PI&&.5*-Math.PI<=g||f<=1.5*Math.PI&&1.5*Math.PI<=g,w=h/100,M=_?-1:Math.min(m*(m<0?1:w),v*(v<0?1:w)),S=k?-1:Math.min(p*(p<0?1:w),b*(b<0?1:w)),D=y?1:Math.max(m*(0');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(s){var l=s.data;return l.labels.length&&l.datasets.length?l.labels.map(function(t,e){var n=s.getDatasetMeta(0),i=l.datasets[0],a=n.data[e].custom||{},r=_.valueAtIndexOrDefault,o=s.options.elements.arc;return{text:t,fillStyle:a.backgroundColor?a.backgroundColor:r(i.backgroundColor,e,o.backgroundColor),strokeStyle:a.borderColor?a.borderColor:r(i.borderColor,e,o.borderColor),lineWidth:a.borderWidth?a.borderWidth:r(i.borderWidth,e,o.borderWidth),hidden:isNaN(i.data[e])||n.data[e].hidden,index:e}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n=e.numSteps?(r.callback(e.onAnimationComplete,[e],n),n.animating=!1,i.splice(a,1)):++a}}},{26:26,46:46}],24:[function(t,e,n){"use strict";var s=t(22),l=t(23),h=t(26),c=t(46),a=t(29),r=t(31),f=t(49),g=t(32),m=t(34),i=t(36);e.exports=function(u){function d(t){return"top"===t||"bottom"===t}u.types={},u.instances={},u.controllers={},c.extend(u.prototype,{construct:function(t,e){var n,i,a=this;(i=(n=(n=e)||{}).data=n.data||{}).datasets=i.datasets||[],i.labels=i.labels||[],n.options=c.configMerge(h.global,h[n.type],n.options||{}),e=n;var r=f.acquireContext(t,e),o=r&&r.canvas,s=o&&o.height,l=o&&o.width;a.id=c.uid(),a.ctx=r,a.canvas=o,a.config=e,a.width=l,a.height=s,a.aspectRatio=s?l/s:null,a.options=e.options,a._bufferedRender=!1,(a.chart=a).controller=a,u.instances[a.id]=a,Object.defineProperty(a,"data",{get:function(){return a.config.data},set:function(t){a.config.data=t}}),r&&o?(a.initialize(),a.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return g.notify(t,"beforeInit"),c.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),g.notify(t,"afterInit"),t},clear:function(){return c.canvas.clear(this),this},stop:function(){return l.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(c.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:c.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",c.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};g.notify(e,"resize",[s]),e.options.onResize&&e.options.onResize(e,s),e.stop(),e.update({duration:e.options.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;c.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),c.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var o=this,t=o.options,s=o.scales||{},e=[],l=Object.keys(s).reduce(function(t,e){return t[e]=!1,t},{});t.scales&&(e=e.concat((t.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(t.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),t.scale&&e.push({options:t.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),c.each(e,function(t){var e=t.options,n=e.id,i=c.valueOrDefault(e.type,t.dtype);d(e.position)!==d(t.dposition)&&(e.position=t.dposition),l[n]=!0;var a=null;if(n in s&&s[n].type===i)(a=s[n]).options=e,a.ctx=o.ctx,a.chart=o;else{var r=m.getScaleConstructor(i);if(!r)return;a=new r({id:n,type:i,options:e,ctx:o.ctx,chart:o}),s[a.id]=a}a.mergeTicksOptions(),t.isDefault&&(o.scale=a)}),c.each(l,function(t,e){t||delete s[e]}),o.scales=s,m.addScalesToLayout(this)},buildOrUpdateControllers:function(){var r=this,o=[],s=[];return c.each(r.data.datasets,function(t,e){var n=r.getDatasetMeta(e),i=t.type||r.config.type;if(n.type&&n.type!==i&&(r.destroyDatasetMeta(e),n=r.getDatasetMeta(e)),n.type=i,o.push(n.type),n.controller)n.controller.updateIndex(e),n.controller.linkScales();else{var a=u.controllers[n.type];if(void 0===a)throw new Error('"'+n.type+'" is not a chart type.');n.controller=new a(r,e),s.push(n.controller)}},r),s},resetElements:function(){var n=this;c.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.reset()},n)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),n=(e=i).options,c.each(e.scales,function(t){r.removeBox(e,t)}),n=c.configMerge(u.defaults.global,u.defaults[e.config.type],n),e.options=e.config.options=n,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=n.tooltips,e.tooltip.initialize(),g._invalidate(i),!1!==g.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();c.each(i.data.datasets,function(t,e){i.getDatasetMeta(e).controller.buildOrUpdateElements()},i),i.updateLayout(),i.options.animation&&i.options.animation.duration&&c.each(a,function(t){t.reset()}),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],g.notify(i,"afterUpdate"),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){!1!==g.notify(this,"beforeLayout")&&(r.update(this,this.width,this.height),g.notify(this,"afterScaleUpdate"),g.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==g.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?g.merge(e[t][a],[l.getScaleDefaults(r),o]):g.merge(e[t][a],o)}else g._merger(t,e,n,i)}})},g.where=function(t,e){if(g.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return g.each(t,function(t){e(t)&&n.push(t)}),n},g.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},g.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},g.niceNum=function(t,e){var n=Math.floor(g.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},g.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},g.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;i=s&&0n.length){for(var l=0;le&&(e=t.length)}),e},g.color=i?function(t){return t instanceof CanvasGradient&&(t=a.global.defaultColor),i(t)}:function(t){return console.error("Color.js not found!"),t},g.getHoverColor=function(t){return t instanceof CanvasPattern?t:g.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2,26:26,34:34,46:46}],29:[function(t,e,n){"use strict";var i=t(46);function s(t,e){return t.native?{x:t.x,y:t.y}:i.getRelativePosition(t,e)}function l(t,e){var n,i,a,r,o;for(i=0,r=t.data.datasets.length;it.maxHeight){r--;break}r++,l=o*s}t.labelRotation=r},afterCalculateTickRotation:function(){B.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){B.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=_(t._ticks),i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=i.display,l=t.isHorizontal(),u=w(a),d=i.gridLines.tickMarkLength;if(e.width=l?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&o.drawTicks?d:0,e.height=l?s&&o.drawTicks?d:0:t.maxHeight,r.display&&s){var h=M(r)+B.options.toPadding(r.padding).height;l?e.height+=h:e.width+=h}if(a.display&&s){var c=B.longestText(t.ctx,u.font,n,t.longestTextCache),f=B.numberOfLabelLines(n),g=.5*u.size,m=t.options.ticks.padding;if(l){t.longestLabelWidth=c;var p=B.toRadians(t.labelRotation),v=Math.cos(p),b=Math.sin(p)*c+u.size*f+g*(f-1)+g;e.height=Math.min(t.maxHeight,e.height+b+m),t.ctx.font=u.font;var y=k(t.ctx,n[0],u.font),x=k(t.ctx,n[n.length-1],u.font);0!==t.labelRotation?(t.paddingLeft="bottom"===i.position?v*y+3:v*g+3,t.paddingRight="bottom"===i.position?v*g+3:v*x+3):(t.paddingLeft=y/2+3,t.paddingRight=x/2+3)}else a.mirror?c=0:c+=m+g,e.width=Math.min(t.maxWidth,e.width+c),t.paddingTop=u.size/2,t.paddingBottom=u.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){B.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(B.isNullOrUndef(t))return NaN;if("number"==typeof t&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:B.noop,getPixelForValue:B.noop,getValueForPixel:B.noop,getPixelForTick:function(t){var e=this,n=e.options.offset;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(n?0:1),1),a=i*t+e.paddingLeft;n&&(a+=i/2);var r=e.left+Math.round(a);return r+=e.isFullWidth()?e.margins.left:0}var o=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(o/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,i=e.left+Math.round(n);return i+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:0r.width-(r.paddingLeft+r.paddingRight)&&(e=1+Math.floor((h+s.autoSkipPadding)*l/(r.width-(r.paddingLeft+r.paddingRight)))),a&&al.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;i="center"===h?(n=function(t){return t<=c},function(t){return c=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,T=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=R.fontString(u,e._titleFontStyle,e._titleFontFamily),R.each(e.title,f),n.font=R.fontString(d,e._bodyFontStyle,e._bodyFontFamily),R.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,R.each(r,function(t){R.each(t.before,f),R.each(t.lines,f),R.each(t.after,f)}),c=0,n.font=R.fontString(h,e._footerFontStyle,e._footerFontFamily),R.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,M)),i=M,a=T,r=C,o=_._chart,s=i.x,l=i.y,u=i.caretSize,d=i.caretPadding,h=i.cornerRadius,c=r.xAlign,f=r.yAlign,g=u+d,m=h+d,"right"===c?s-=a.width:"center"===c&&((s-=a.width/2)+a.width>o.width&&(s=o.width-a.width),s<0&&(s=0)),"top"===f?l+=g:l-="bottom"===f?a.height+g:a.height/2,"center"===f?"left"===c?s+=g:"right"===c&&(s-=g):"left"===c?s-=m:"right"===c&&(s+=m),P={x:s,y:l}}else M.opacity=0;return M.xAlign=C.xAlign,M.yAlign=C.yAlign,M.x=P.x,M.y=P.y,M.width=T.width,M.height=T.height,M.caretX=O.x,M.caretY=O.y,_._model=M,t&&k.custom&&k.custom.call(_,M),_},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,m=e.width,p=e.height;if("center"===c)s=g+p/2,l="left"===h?(a=(i=f)-u,r=i,o=s+u,s-u):(a=(i=f+m)+u,r=i,o=s-u,s+u);else if(r=(i="left"===h?(a=f+d+u)-u:"right"===h?(a=f+m-d-u)-u:(a=n.caretX)-u,a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+p)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n,i){var a=e.title;if(a.length){n.textAlign=e._titleAlign,n.textBaseline="top";var r,o,s=e.titleFontSize,l=e.titleSpacing;for(n.fillStyle=c(e.titleFontColor,i),n.font=R.fontString(s,e._titleFontStyle,e._titleFontFamily),r=0,o=a.length;r=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})},{26:26,27:27,46:46}],38:[function(t,e,n){"use strict";var i=t(26),a=t(27),d=t(46),h=i.global;i._set("global",{elements:{line:{tension:.4,backgroundColor:h.defaultColor,borderWidth:3,borderColor:h.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a=this._view,r=this._chart.ctx,o=a.spanGaps,s=this._children.slice(),l=h.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),r.save(),r.lineCap=a.borderCapStyle||l.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||l.borderDash),r.lineDashOffset=a.borderDashOffset||l.borderDashOffset,r.lineJoin=a.borderJoinStyle||l.borderJoinStyle,r.lineWidth=a.borderWidth||l.borderWidth,r.strokeStyle=a.borderColor||h.defaultColor,r.beginPath(),u=-1,t=0;t=t.left&&1.01*t.right>=n.x&&n.y>=t.top&&1.01*t.bottom>=n.y)&&(i.strokeStyle=e.borderColor||h,i.lineWidth=d.valueOrDefault(e.borderWidth,u.global.elements.point.borderWidth),i.fillStyle=e.backgroundColor||h,d.canvas.drawPoint(i,a,o,s,l,r))}})},{26:26,27:27,46:46}],40:[function(t,e,n){"use strict";var i=t(26),a=t(27);function l(t){return void 0!==t._view.width}function r(t){var e,n,i,a,r=t._view;if(l(t)){var o=r.width/2;e=r.x-o,n=r.x+o,i=Math.min(r.y,r.base),a=Math.max(r.y,r.base)}else{var s=r.height/2;e=Math.min(r.x,r.base),n=Math.max(r.x,r.base),i=r.y-s,a=r.y+s}return{left:e,top:i,right:n,bottom:a}}i._set("global",{elements:{rectangle:{backgroundColor:i.global.defaultColor,borderColor:i.global.defaultColor,borderSkipped:"bottom",borderWidth:0}}}),e.exports=a.extend({draw:function(){var t,e,n,i,a,r,o,s=this._chart.ctx,l=this._view,u=l.borderWidth;if(o=l.horizontal?(t=l.base,e=l.x,n=l.y-l.height/2,i=l.y+l.height/2,a=t=i.left&&t<=i.right&&e>=i.top&&e<=i.bottom}return n},inLabelRange:function(t,e){if(!this._view)return!1;var n=r(this);return l(this)?t>=n.left&&t<=n.right:e>=n.top&&e<=n.bottom},inXRange:function(t){var e=r(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=r(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,e,n=this._view;return e=l(this)?(t=n.x,(n.y+n.base)/2):(t=(n.x+n.base)/2,n.y),{x:t,y:e}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})},{26:26,27:27}],41:[function(t,e,n){"use strict";e.exports={},e.exports.Arc=t(37),e.exports.Line=t(38),e.exports.Point=t(39),e.exports.Rectangle=t(40)},{37:37,38:38,39:39,40:40}],42:[function(t,e,n){"use strict";var i=t(43);n=e.exports={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2-1e-7,i/2-1e-7);t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.arcTo(e+i,n,e+i,n+o,o),t.lineTo(e+i,n+a-o),t.arcTo(e+i,n+a,e+i-o,n+a,o),t.lineTo(e+o,n+a),t.arcTo(e,n+a,e,n+a-o,o),t.lineTo(e,n+o),t.arcTo(e,n,e+o,n,o),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h;if(r=r||0,!e||"object"!=typeof e||"[object HTMLImageElement]"!==(o=e.toString())&&"[object HTMLCanvasElement]"!==o){if(!(isNaN(n)||n<=0)){switch(t.save(),t.translate(i,a),t.rotate(r*Math.PI/180),t.beginPath(),e){default:t.arc(0,0,n,0,2*Math.PI),t.closePath();break;case"triangle":d=(s=3*n/Math.sqrt(3))*Math.sqrt(3)/2,t.moveTo(-s/2,d/3),t.lineTo(s/2,d/3),t.lineTo(0,-2*d/3),t.closePath();break;case"rect":h=1/Math.SQRT2*n,t.rect(-h,-h,2*h,2*h);break;case"rectRounded":var c=n/Math.SQRT2,f=-c,g=-c,m=Math.SQRT2*n;this.roundedRect(t,f,g,m,m,.425*n);break;case"rectRot":h=1/Math.SQRT2*n,t.moveTo(-h,0),t.lineTo(0,h),t.lineTo(h,0),t.lineTo(0,-h),t.closePath();break;case"cross":t.moveTo(0,n),t.lineTo(0,-n),t.moveTo(-n,0),t.lineTo(n,0);break;case"crossRot":l=Math.cos(Math.PI/4)*n,u=Math.sin(Math.PI/4)*n,t.moveTo(-l,-u),t.lineTo(l,u),t.moveTo(-l,u),t.lineTo(l,-u);break;case"star":t.moveTo(0,n),t.lineTo(0,-n),t.moveTo(-n,0),t.lineTo(n,0),l=Math.cos(Math.PI/4)*n,u=Math.sin(Math.PI/4)*n,t.moveTo(-l,-u),t.lineTo(l,u),t.moveTo(-l,u),t.lineTo(l,-u);break;case"line":t.moveTo(-n,0),t.lineTo(n,0);break;case"dash":t.moveTo(0,0),t.lineTo(n,0)}t.fill(),t.stroke(),t.restore()}}else t.drawImage(e,i-e.width/2,a-e.height/2,e.width,e.height)},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){if(n.steppedLine)return"after"===n.steppedLine&&!i||"after"!==n.steppedLine&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y);n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}};i.clear=n.clear,i.drawRoundedRectangle=function(t){t.beginPath(),n.roundedRect.apply(n,arguments)}},{43:43}],43:[function(t,e,n){"use strict";var i,d={noop:function(){},uid:(i=0,function(){return i++}),isNullOrUndef:function(t){return null==t},isArray:Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return d.valueOrDefault(d.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(d.isArray(t))if(r=t.length,i)for(a=r-1;0<=a;a--)e.call(n,t[a],a);else for(a=0;a
    ';var a=e.childNodes[0],r=e.childNodes[1];e._reset=function(){a.scrollLeft=1e6,a.scrollTop=1e6,r.scrollLeft=1e6,r.scrollTop=1e6};var o=function(){e._reset(),t()};return y(a,"scroll",o.bind(a,"expand")),y(r,"scroll",o.bind(r,"shrink")),e}((r=!(i=function(){if(h.resizer)return t(x("resize",n))}),o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,f.requestAnimFrame.call(window,function(){r=!1,i.apply(a,o)}))}));l=function(){if(h.resizer){var t=e.parentNode;t&&t!==c.parentNode&&t.insertBefore(c,t.firstChild),c._reset()}},u=(s=e)[g]||(s[g]={}),d=u.renderProxy=function(t){t.animationName===v&&l()},f.each(b,function(t){y(s,t,d)}),u.reflow=!!s.offsetParent,s.classList.add(p)}function r(t){var e,n,i,a=t[g]||{},r=a.resizer;delete a.resizer,n=(e=t)[g]||{},(i=n.renderProxy)&&(f.each(b,function(t){o(e,t,i)}),delete n.renderProxy),e.classList.remove(p),r&&r.parentNode&&r.parentNode.removeChild(r)}e.exports={_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,initialize:function(){var t,e,n,i="from{opacity:0.99}to{opacity:1}";e="@-webkit-keyframes "+v+"{"+i+"}@keyframes "+v+"{"+i+"}."+p+"{-webkit-animation:"+v+" 0.001s;animation:"+v+" 0.001s;}",n=(t=this)._style||document.createElement("style"),t._style||(e="/* Chart.js */\n"+e,(t._style=n).setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(n)),n.appendChild(document.createTextNode(e))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t[g]={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=l(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=l(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var n=t.canvas;if(n[g]){var i=n[g].initial;["height","width"].forEach(function(t){var e=i[t];f.isNullOrUndef(e)?n.removeAttribute(t):n.setAttribute(t,e)}),f.each(i.style||{},function(t,e){n.style[e]=t}),n.width=n.width,delete n[g]}},addEventListener:function(r,t,o){var e=r.canvas;if("resize"!==t){var n=o[g]||(o[g]={});y(e,t,(n.proxies||(n.proxies={}))[r.id+"_"+t]=function(t){var e,n,i,a;o((n=r,i=s[(e=t).type]||e.type,a=f.getRelativePosition(e,n),x(i,n,a.x,a.y,e)))})}else a(e,o,r)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[g]||{}).proxies||{})[t.id+"_"+e];a&&o(i,e,a)}else r(i)}},f.addEvent=y,f.removeEvent=o},{46:46}],49:[function(t,e,n){"use strict";var i=t(46),a=t(47),r=t(48),o=r._enabled?r:a;e.exports=i.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},o)},{46:46,47:47,48:48}],50:[function(t,e,n){"use strict";e.exports={},e.exports.filler=t(51),e.exports.legend=t(52),e.exports.title=t(53)},{51:51,52:52,53:53}],51:[function(t,e,n){"use strict";var u=t(26),c=t(41),d=t(46);u._set("global",{plugins:{filler:{propagate:!0}}});var f={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push(""),e.join("")}});var o=i.extend({initialize:function(t){C.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:function(){var e=this,n=e.options.labels||{},t=C.callback(n.generateLabels,[e.chart],e)||[];n.filter&&(t=t.filter(function(t){return n.filter(t,e.chart.data)})),e.options.reverse&&t.reverse(),e.legendItems=t},afterBuildLabels:r,beforeFit:r,fit:function(){var i=this,t=i.options,a=t.labels,e=t.display,r=i.ctx,n=D.global,o=C.valueOrDefault,s=o(a.fontSize,n.defaultFontSize),l=o(a.fontStyle,n.defaultFontStyle),u=o(a.fontFamily,n.defaultFontFamily),d=C.fontString(s,l,u),h=i.legendHitBoxes=[],c=i.minSize,f=i.isHorizontal();if(c.height=f?(c.width=i.maxWidth,e?10:0):(c.width=e?10:0,i.maxHeight),e)if(r.font=d,f){var g=i.lineWidths=[0],m=i.legendItems.length?s+a.padding:0;r.textAlign="left",r.textBaseline="top",C.each(i.legendItems,function(t,e){var n=P(a,s)+s/2+r.measureText(t.text).width;g[g.length-1]+n+a.padding>=i.width&&(m+=s+a.padding,g[g.length]=i.left),h[e]={left:0,top:0,width:n,height:s},g[g.length-1]+=n+a.padding}),c.height+=m}else{var p=a.padding,v=i.columnWidths=[],b=a.padding,y=0,x=0,_=s+p;C.each(i.legendItems,function(t,e){var n=P(a,s)+s/2+r.measureText(t.text).width;x+_>c.height&&(b+=y+a.padding,v.push(y),x=y=0),y=Math.max(y,n),x+=_,h[e]={left:0,top:0,width:n,height:s}}),b+=y,v.push(y),c.width+=b}i.width=c.width,i.height=c.height},afterFit:r,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var h=this,c=h.options,f=c.labels,g=D.global,m=g.elements.line,p=h.width,v=h.lineWidths;if(c.display){var b,y=h.ctx,x=C.valueOrDefault,t=x(f.fontColor,g.defaultFontColor),_=x(f.fontSize,g.defaultFontSize),e=x(f.fontStyle,g.defaultFontStyle),n=x(f.fontFamily,g.defaultFontFamily),i=C.fontString(_,e,n);y.textAlign="left",y.textBaseline="middle",y.lineWidth=.5,y.strokeStyle=t,y.fillStyle=t,y.font=i;var k=P(f,_),w=h.legendHitBoxes,M=h.isHorizontal();b=M?{x:h.left+(p-v[0])/2,y:h.top+f.padding,line:0}:{x:h.left+f.padding,y:h.top+f.padding,line:0};var S=_+f.padding;C.each(h.legendItems,function(t,e){var n,i,a,r,o,s=y.measureText(t.text).width,l=k+_/2+s,u=b.x,d=b.y;M?p<=u+l&&(d=b.y+=S,b.line++,u=b.x=h.left+(p-v[b.line])/2):d+S>h.bottom&&(u=b.x=u+h.columnWidths[b.line]+f.padding,d=b.y=h.top+f.padding,b.line++),function(t,e,n){if(!(isNaN(k)||k<=0)){y.save(),y.fillStyle=x(n.fillStyle,g.defaultColor),y.lineCap=x(n.lineCap,m.borderCapStyle),y.lineDashOffset=x(n.lineDashOffset,m.borderDashOffset),y.lineJoin=x(n.lineJoin,m.borderJoinStyle),y.lineWidth=x(n.lineWidth,m.borderWidth),y.strokeStyle=x(n.strokeStyle,g.defaultColor);var i=0===x(n.lineWidth,m.borderWidth);if(y.setLineDash&&y.setLineDash(x(n.lineDash,m.borderDash)),c.labels&&c.labels.usePointStyle){var a=_*Math.SQRT2/2,r=a/Math.SQRT2,o=t+r,s=e+r;C.canvas.drawPoint(y,n.pointStyle,a,o,s)}else i||y.strokeRect(t,e,k,_),y.fillRect(t,e,k,_);y.restore()}}(u,d,t),w[e].left=u,w[e].top=d,n=t,i=s,r=k+(a=_/2)+u,o=d+a,y.fillText(n.text,r,o),n.hidden&&(y.beginPath(),y.lineWidth=2,y.moveTo(r,o),y.lineTo(r+i,o),y.stroke()),M?b.x+=l+f.padding:b.y+=S})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}});function s(t,e){var n=new o({ctx:t.ctx,options:e,chart:t});a.configure(t,n,e),a.addBox(t,n),t.legend=n}e.exports={id:"legend",_element:o,beforeInit:function(t){var e=t.options.legend;e&&s(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(C.mergeIf(e,D.global.legend),n?(a.configure(t,n,e),n.options=e):s(t,e)):n&&(a.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}},{26:26,27:27,31:31,46:46}],53:[function(t,e,n){"use strict";var _=t(26),i=t(27),k=t(46),a=t(31),r=k.noop;_._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,lineHeight:1.2,padding:10,position:"top",text:"",weight:2e3}});var o=i.extend({initialize:function(t){k.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:r,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:r,beforeSetDimensions:r,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:r,beforeBuildLabels:r,buildLabels:r,afterBuildLabels:r,beforeFit:r,fit:function(){var t=k.valueOrDefault,e=this.options,n=e.display,i=t(e.fontSize,_.global.defaultFontSize),a=this.minSize,r=k.isArray(e.text)?e.text.length:1,o=k.options.toLineHeight(e.lineHeight,i),s=n?r*o+2*e.padding:0;this.isHorizontal()?(a.width=this.maxWidth,a.height=s):(a.width=s,a.height=this.maxHeight),this.width=a.width,this.height=a.height},afterFit:r,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this.ctx,e=k.valueOrDefault,n=this.options,i=_.global;if(n.display){var a,r,o,s=e(n.fontSize,i.defaultFontSize),l=e(n.fontStyle,i.defaultFontStyle),u=e(n.fontFamily,i.defaultFontFamily),d=k.fontString(s,l,u),h=k.options.toLineHeight(n.lineHeight,s),c=h/2+n.padding,f=0,g=this.top,m=this.left,p=this.bottom,v=this.right;t.fillStyle=e(n.fontColor,i.defaultFontColor),t.font=d,this.isHorizontal()?(r=m+(v-m)/2,o=g+c,a=v-m):(r="left"===n.position?m+c:v-c,o=g+(p-g)/2,a=p-g,f=Math.PI*("left"===n.position?-.5:.5)),t.save(),t.translate(r,o),t.rotate(f),t.textAlign="center",t.textBaseline="middle";var b=n.text;if(k.isArray(b))for(var y=0,x=0;xo.max&&(o.max=n))})});o.min=isFinite(o.min)&&!isNaN(o.min)?o.min:0,o.max=isFinite(o.max)&&!isNaN(o.max)?o.max:1,this.handleTickRangeOptions()},getTickLimit:function(){var t,e=this.options.ticks;if(this.isHorizontal())t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.width/50));else{var n=h.valueOrDefault(e.fontSize,i.global.defaultFontSize);t=Math.min(e.maxTicksLimit?e.maxTicksLimit:11,Math.ceil(this.height/(2*n)))}return t},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this.start,n=+this.getRightValue(t),i=this.end-e;return this.isHorizontal()?this.left+this.width/i*(n-e):this.bottom-this.height/i*(n-e)},getValueForPixel:function(t){var e=this.isHorizontal(),n=e?this.width:this.height,i=(e?t-this.left:this.bottom-t)/n;return this.start+(this.end-this.start)*i},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});a.registerScaleType("linear",n,e)}},{26:26,34:34,35:35,46:46}],56:[function(t,e,n){"use strict";var h=t(46),i=t(33);e.exports=function(t){var e=h.noop;t.LinearScaleBase=i.extend({getRightValue:function(t){return"string"==typeof t?+t:i.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=h.sign(t.min),i=h.sign(t.max);n<0&&i<0?t.max=0:0=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:e,handleDirectionalChanges:e,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:h.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r=[];if(t.stepSize&&0o.max&&(o.max=n),0!==n&&(null===o.minNotZero||no.r&&(o.r=g.end,s.r=c),m.starto.b&&(o.b=m.end,s.b=c)}t.setReductions(r,o,s)}(this):(t=this,e=Math.min(t.height/2,t.width/2),t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0))},setReductions:function(t,e,n){var i=e.l/Math.sin(n.l),a=Math.max(e.r-this.width,0)/Math.sin(n.r),r=-e.t/Math.cos(n.t),o=-Math.max(e.b-this.height,0)/Math.cos(n.b);i=s(i),a=s(a),r=s(r),o=s(o),this.drawingArea=Math.min(Math.round(t-(i+a)/2),Math.round(t-(r+o)/2)),this.setCenterPoint(i,a,r,o)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-i-a.drawingArea;a.xCenter=Math.round((o+r)/2+a.left),a.yCenter=Math.round((s+l)/2+a.top)},getIndexAngle:function(t){return t*(2*Math.PI/b(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){if(null===t)return 0;var e=this.drawingArea/(this.max-this.min);return this.options.ticks.reverse?(this.max-t)*e:(t-this.min)*e},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.round(Math.cos(n)*e)+this.xCenter,y:Math.round(Math.sin(n)*e)+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:0>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function M(t,e){var n=e.parser,i=e.parser||e.format;return"function"==typeof n?n(t):"string"==typeof t&&"string"==typeof i?y(t,i):(t instanceof y||(t=y(t)),t.isValid()?t:"function"==typeof i?i(t):t)}function S(t,e){if(p.isNullOrUndef(t))return null;var n=e.options.time,i=M(e.getRightValue(t),n);return i.isValid()?(n.round&&i.startOf(n.round),i.valueOf()):null}function D(t){for(var e=_.indexOf(t)+1,n=_.length;e=_.indexOf(e);a--)if(r=_[a],x[r].common&&o.as(r)>=t.length)return r;return _[e?_.indexOf(e):0]}(b,p.minUnit,c.min,c.max),c._majorUnit=D(c._unit),c._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;aa;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var s=!1;t(document).on("mouseup",function(){s=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!s){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,n=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),s=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,s=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,l=r+t.height,h=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+h>r&&l>s+h,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&l>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],l=[],h=this._connectWith();if(h&&e)for(s=h.length-1;s>=0;s--)for(o=t(h[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&l.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(l.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=l.length-1;s>=0;s--)l[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,l,h,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,h=r.length;h>s;s++)l=t(r[s]),l.data(this.widgetName+"-item",a),c.push({item:l,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t(" ",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,l,h,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(l=this.items[s].item.offset()[a],h=!1,e[u]-l>this.items[s][r]/2&&(h=!0),n>Math.abs(e[u]-l)&&(n=Math.abs(e[u]-l),o=this.items[s],this.direction=h?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s} +},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():l?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():l?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}); \ No newline at end of file diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/js/palette.js b/ext/phpbbstudio/aps/styles/prosilver/template/js/palette.js new file mode 100644 index 0000000..5e53621 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/js/palette.js @@ -0,0 +1,1501 @@ +/** @license + * + * Colour Palette Generator script. + * Copyright (c) 2014 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may + * obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Furthermore, ColorBrewer colour schemes are covered by the following: + * + * Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and + * The Pennsylvania State University. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions as source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. The end-user documentation included with the redistribution, if any, + * must include the following acknowledgment: "This product includes color + * specifications and designs developed by Cynthia Brewer + * (http://colorbrewer.org/)." Alternately, this acknowledgment may appear + * in the software itself, if and wherever such third-party + * acknowledgments normally appear. + * + * 4. The name "ColorBrewer" must not be used to endorse or promote products + * derived from this software without prior written permission. For written + * permission, please contact Cynthia Brewer at cbrewer@psu.edu. + * + * 5. Products derived from this software may not be called "ColorBrewer", + * nor may "ColorBrewer" appear in their name, without prior written + * permission of Cynthia Brewer. + * + * Furthermore, Solarized colour schemes are covered by the following: + * + * Copyright (c) 2011 Ethan Schoonover + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +'use strict'; + +var palette = (function() { + + var proto = Array.prototype; + var slice = function(arr, opt_begin, opt_end) { + return proto.slice.apply(arr, proto.slice.call(arguments, 1)); + }; + + var extend = function(arr, arr2) { + return proto.push.apply(arr, arr2); + }; + + var function_type = typeof function() {}; + + var INF = 1000000000; // As far as we're concerned, that's infinity. ;) + + + /** + * Generate a colour palette from given scheme. + * + * If scheme argument is not a function it is passed to palettes.listSchemes + * function (along with the number argument). This may result in an array + * of more than one available scheme. If that is the case, scheme at + * opt_index position is taken. + * + * This allows using different palettes for different data without having to + * name the schemes specifically, for example: + * + * palette_for_foo = palette('sequential', 10, 0); + * palette_for_bar = palette('sequential', 10, 1); + * palette_for_baz = palette('sequential', 10, 2); + * + * @param {!palette.SchemeType|string|palette.Palette} scheme Scheme to + * generate palette for. Either a function constructed with + * palette.Scheme object, or anything that palette.listSchemes accepts + * as name argument. + * @param {number} number Number of colours to return. If negative, absolute + * value is taken and colours will be returned in reverse order. + * @param {number=} opt_index If scheme is a name of a group or an array and + * results in more than one scheme, index of the scheme to use. The + * index wraps around. + * @param {...*} varargs Additional arguments to pass to palette or colour + * generator (if the chosen scheme uses those). + * @return {Array} Array of abs(number) 'RRGGBB' strings or null if + * no matching scheme was found. + */ + var palette = function(scheme, number, opt_index, varargs) { + number |= 0; + if (number == 0) { + return []; + } + + if (typeof scheme !== function_type) { + var arr = palette.listSchemes( + /** @type {string|palette.Palette} */ (scheme), number); + if (!arr.length) { + return null; + } + scheme = arr[(opt_index || 0) % arr.length]; + } + + var args = slice(arguments, 2); + args[0] = number; + return scheme.apply(scheme, args); + }; + + + /** + * Returns a callable colour scheme object. + * + * Just after being created, the scheme has no colour palettes and no way of + * generating any, thus generate method will return null. To turn scheme + * into a useful object, addPalette, addPalettes or setColorFunction methods + * need to be used. + * + * To generate a colour palette with given number colours using function + * returned by this method, just call it with desired number of colours. + * + * Since this function *returns* a callable object, it must *not* be used + * with the new operator. + * + * @param {string} name Name of the scheme. + * @param {string|!Array=} opt_groups A group name or list of + * groups the scheme should be categorised under. Three typical groups + * to use are 'qualitative', 'sequential' and 'diverging', but any + * groups may be created. + * @return {!palette.SchemeType} A colour palette generator function, which + * in addition has methods and properties like a regular object. Think + * of it as a callable object. + */ + palette.Scheme = function(name, opt_groups) { + /** + * A map from a number to a colour palettes with given number of colours. + * @type {!Object} + */ + var palettes = {}; + + /** + * The biggest palette in palettes map. + * @type {number} + */ + var palettes_max = 0; + + /** + * The smallest palette in palettes map. + * @type {number} + */ + var palettes_min = INF; + + var makeGenerator = function() { + if (arguments.length <= 1) { + return self.color_func.bind(self); + } else { + var args = slice(arguments); + return function(x) { + args[0] = x; + return self.color_func.apply(self, args); + }; + } + }; + + /** + * Generate a colour palette from the scheme. + * + * If there was a palette added with addPalette (or addPalettes) with + * enough colours, that palette will be used. Otherwise, if colour + * function has been set using setColorFunction method, that function will + * be used to generate the palette. Otherwise null is returned. + * + * @param {number} number Number of colours to return. If negative, + * absolute value is taken and colours will be returned in reverse + * order. + * @param {...*} varargs Additional arguments to pass to palette or colour + * generator (if the chosen scheme uses those). + */ + var self = function(number, varargs) { + number |= 0; + if (!number) { + return []; + } + + var _number = number; + number = Math.abs(number); + + if (number <= palettes_max) { + for (var i = Math.max(number, palettes_min); !(i in palettes); ++i) { + /* nop */ + } + var colors = palettes[i]; + if (i > number) { + var take_head = + 'shrinking_takes_head' in colors ? + colors.shrinking_takes_head : self.shrinking_takes_head; + if (take_head) { + colors = colors.slice(0, number); + i = number; + } else { + return palette.generate( + function(x) { return colors[Math.round(x)]; }, + _number, 0, colors.length - 1); + } + } + colors = colors.slice(); + if (_number < 0) { + colors.reverse(); + } + return colors; + + } else if (self.color_func) { + return palette.generate(makeGenerator.apply(self, arguments), + _number, 0, 1, self.color_func_cyclic); + + } else { + return null; + } + }; + + /** + * The name of the palette. + * @type {string} + */ + self.scheme_name = name; + + /** + * A list of groups the palette belongs to. + * @type {!Array} + */ + self.groups = opt_groups ? + typeof opt_groups === 'string' ? [opt_groups] : opt_groups : []; + + /** + * The biggest palette this scheme can generate. + * @type {number} + */ + self.max = 0; + + /** + * The biggest palette this scheme can generate that is colour-blind + * friendly. + * @type {number} + */ + self.cbf_max = INF; + + + /** + * Adds a colour palette to the colour scheme. + * + * @param {palette.Palette} palette An array of 'RRGGBB' strings + * representing the palette to add. + * @param {boolean=} opt_is_cbf Whether the palette is colourblind friendly. + */ + self.addPalette = function(palette, opt_is_cbf) { + var len = palette.length; + if (len) { + palettes[len] = palette; + palettes_min = Math.min(palettes_min, len); + palettes_max = Math.max(palettes_max, len); + self.max = Math.max(self.max, len); + if (!opt_is_cbf && len != 1) { + self.cbf_max = Math.min(self.cbf_max, len - 1); + } + } + }; + + /** + * Adds number of colour palettes to the colour scheme. + * + * @param {palette.PalettesList} palettes A map or an array of colour + * palettes to add. If map, i.e. object, is used, properties should + * use integer property names. + * @param {number=} opt_max Size of the biggest palette in palettes set. + * If not set, palettes must have a length property which will be used. + * @param {number=} opt_cbf_max Size of the biggest palette which is still + * colourblind friendly. 1 by default. + */ + self.addPalettes = function(palettes, opt_max, opt_cbf_max) { + opt_max = opt_max || palettes.length; + for (var i = 0; i < opt_max; ++i) { + if (i in palettes) { + self.addPalette(palettes[i], true); + } + } + self.cbf_max = Math.min(self.cbf_max, opt_cbf_max || 1); + }; + + /** + * Enable shrinking palettes taking head of the list of colours. + * + * When user requests n-colour palette but the smallest palette added with + * addPalette (or addPalettes) is m-colour one (where n < m), n colours + * across the palette will be returned. For example: + * var ex = palette.Scheme('ex'); + * ex.addPalette(['000000', 'bcbcbc', 'ffffff']); + * var pal = ex(2); + * // pal == ['000000', 'ffffff'] + * + * This works for palettes where the distance between colours is + * correlated to distance in the palette array, which is true in gradients + * such as the one above. + * + * To turn this feature off shrinkByTakingHead can be set to true either + * for all palettes in the scheme (if opt_idx is not given) or for palette + * with given number of colours only. In general, setting the option for + * given palette overwrites whatever has been set for the scheme. The + * default, as described above, is false. + * + * Alternatively, the feature can be enabled by setting shrinking_takes_head + * property for the palette Array or the scheme object. + * + * For example, all of the below give equivalent results: + * var pal = ['ff0000', '00ff00', '0000ff']; + * + * var ex = palette.Scheme('ex'); + * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff'] + * ex.shrinkByTakingHead(true); // ex(2) == ['ff0000', '00ff00'] + * + * ex = palette.Scheme('ex'); + * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff'] + * ex.shrinkByTakingHead(true, 3); // ex(2) == ['ff0000', '00ff00'] + * + * ex = palette.Scheme('ex'); + * ex.addPalette(pal); + * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff'] + * pal.shrinking_takes_head = true; // ex(2) == ['ff0000', '00ff00'] + * + * @param {boolean} enabled Whether to enable or disable the “shrinking + * takes head” feature. It is disabled by default. + * @param {number=} opt_idx If given, the “shrinking takes head” option + * for palette with given number of colours is set. If such palette + * does not exist, nothing happens. + */ + self.shrinkByTakingHead = function(enabled, opt_idx) { + if (opt_idx !== void(0)) { + if (opt_idx in palettes) { + palettes[opt_idx].shrinking_takes_head = !!enabled; + } + } else { + self.shrinking_takes_head = !!enabled; + } + }; + + /** + * Sets a colour generation function of the colour scheme. + * + * The function must accept a singe number argument whose value can be from + * 0.0 to 1.0, and return a colour as an 'RRGGBB' string. This function + * will be used when generating palettes, i.e. if 11-colour palette is + * requested, this function will be called with arguments 0.0, 0.1, …, 1.0. + * + * If the palette generated by the function is colourblind friendly, + * opt_is_cbf should be set to true. + * + * In some cases, it is not desirable to reach 1.0 when generating + * a palette. This happens for hue-rainbows where the 0–1 range corresponds + * to a 0°–360° range in hues, and since hue at 0° is the same as at 360°, + * it's desired to stop short the end of the range when generating + * a palette. To accomplish this, opt_cyclic should be set to true. + * + * @param {palette.ColorFunction} func A colour generator function. + * @param {boolean=} opt_is_cbf Whether palette generate with the function + * is colour-blind friendly. + * @param {boolean=} opt_cyclic Whether colour at 0.0 is the same as the + * one at 1.0. + */ + self.setColorFunction = function(func, opt_is_cbf, opt_cyclic) { + self.color_func = func; + self.color_func_cyclic = !!opt_cyclic; + self.max = INF; + if (!opt_is_cbf && self.cbf_max === INF) { + self.cbf_max = 1; + } + }; + + self.color = function(x, varargs) { + if (self.color_func) { + return self.color_func.apply(this, arguments); + } else { + return null; + } + }; + + return self; + }; + + + /** + * Creates a new palette.Scheme and initialises it by calling addPalettes + * method with the rest of the arguments. + * + * @param {string} name Name of the scheme. + * @param {string|!Array} groups A group name or list of group + * names the scheme belongs to. + * @param {!Object|!Array} + * palettes A map or an array of colour palettes to add. If map, i.e. + * object, is used, properties should use integer property names. + * @param {number=} opt_max Size of the biggest palette in palettes set. + * If not set, palettes must have a length property which will be used. + * @param {number=} opt_cbf_max Size of the biggest palette which is still + * colourblind friendly. 1 by default. + * @return {!palette.SchemeType} A colour palette generator function, which + * in addition has methods and properties like a regular object. Think + * of it as a callable object. + */ + palette.Scheme.fromPalettes = function(name, groups, + palettes, opt_max, opt_cbf_max) { + var scheme = palette.Scheme(name, groups); + scheme.addPalettes.apply(scheme, slice(arguments, 2)); + return scheme; + }; + + + /** + * Creates a new palette.Scheme and initialises it by calling + * setColorFunction method with the rest of the arguments. + * + * @param {string} name Name of the scheme. + * @param {string|!Array} groups A group name or list of group + * names the scheme belongs to. + * @param {palette.ColorFunction} func A colour generator function. + * @param {boolean=} opt_is_cbf Whether palette generate with the function + * is colour-blind friendly. + * @param {boolean=} opt_cyclic Whether colour at 0.0 is the same as the + * one at 1.0. + * @return {!palette.SchemeType} A colour palette generator function, which + * in addition has methods and properties like a regular object. Think + * of it as a callable object. + */ + palette.Scheme.withColorFunction = function(name, groups, + func, opt_is_cbf, opt_cyclic) { + var scheme = palette.Scheme(name, groups); + scheme.setColorFunction.apply(scheme, slice(arguments, 2)); + return scheme; + }; + + + /** + * A map of registered schemes. Maps a scheme or group name to a list of + * scheme objects. Property name is either 'n-' for single scheme + * names or 'g-' for scheme group names. + * + * @type {!Object>} + */ + var registered_schemes = {}; + + + /** + * Registers a new colour scheme. + * + * @param {!palette.SchemeType} scheme The scheme to add. + */ + palette.register = function(scheme) { + registered_schemes['n-' + scheme.scheme_name] = [scheme]; + scheme.groups.forEach(function(g) { + (registered_schemes['g-' + g] = + registered_schemes['g-' + g] || []).push(scheme); + }); + (registered_schemes['g-all'] = + registered_schemes['g-all'] || []).push(scheme); + }; + + + /** + * List all schemes that match given name and number of colours. + * + * name argument can be either a string or an array of strings. In the + * former case, the function acts as if the argument was an array with name + * as a single argument (i.e. “palette.listSchemes('foo')” is exactly the same + * as “palette.listSchemes(['foo'])”). + * + * Each name can be either name of a palette (e.g. 'tol-sq' for Paul Tol's + * sequential palette), or a name of a group (e.g. 'sequential' for all + * sequential palettes). Name can therefore map to a single scheme or + * several schemes. + * + * Furthermore, name can be suffixed with '-cbf' to indicate that only + * schemes that are colourblind friendly should be returned. For example, + * 'rainbow' returns a HSV rainbow scheme, but because it is not colourblind + * friendly, 'rainbow-cbf' returns no schemes. + * + * Some schemes may produce colourblind friendly palettes for some number of + * colours. For example ColorBrewer's Dark2 scheme is colourblind friendly + * if no more than 3 colours are generated. If opt_number is not specified, + * 'qualitative-cbf' will include 'cb-Dark2' but if opt_number is given as, + * say, 5 it won't. + * + * Name can also be 'all' which will return all registered schemes. + * Naturally, 'all-cbf' will return all colourblind friendly schemes. + * + * Schemes are added to the library using palette.register. Schemes are + * created using palette.Scheme function. By default, the following schemes + * are available: + * + * Name Description + * -------------- ----------------------------------------------------- + * tol Paul Tol's qualitative scheme, cbf, max 12 colours. + * tol-dv Paul Tol's diverging scheme, cbf. + * tol-sq Paul Tol's sequential scheme, cbf. + * tol-rainbow Paul Tol's qualitative scheme, cbf. + * + * rainbow A rainbow palette. + * + * cb-YlGn ColorBrewer sequential schemes. + * cb-YlGnBu + * cb-GnBu + * cb-BuGn + * cb-PuBuGn + * cb-PuBu + * cb-BuPu + * cb-RdPu + * cb-PuRd + * cb-OrRd + * cb-YlOrRd + * cb-YlOrBr + * cb-Purples + * cb-Blues + * cb-Greens + * cb-Oranges + * cb-Reds + * cb-Greys + * + * cb-PuOr ColorBrewer diverging schemes. + * cb-BrBG + * cb-PRGn + * cb-PiYG + * cb-RdBu + * cb-RdGy + * cb-RdYlBu + * cb-Spectral + * cb-RdYlGn + * + * cb-Accent ColorBrewer qualitative schemes. + * cb-Dark2 + * cb-Paired + * cb-Pastel1 + * cb-Pastel2 + * cb-Set1 + * cb-Set2 + * cb-Set3 + * + * sol-base Solarized base colours. + * sol-accent Solarized accent colours. + * + * The following groups are also available by default: + * + * Name Description + * -------------- ----------------------------------------------------- + * all All registered schemes. + * sequential All sequential schemes. + * diverging All diverging schemes. + * qualitative All qualitative schemes. + * cb-sequential All ColorBrewer sequential schemes. + * cb-diverging All ColorBrewer diverging schemes. + * cb-qualitative All ColorBrewer qualitative schemes. + * + * You can read more about Paul Tol's palettes at http://www.sron.nl/~pault/. + * You can read more about ColorBrewer at http://colorbrewer2.org. + * + * @param {string|!Array} name A name of a colour scheme, of + * a group of colour schemes, or an array of any of those. + * @param {number=} opt_number When requesting only colourblind friendly + * schemes, number of colours the scheme must provide generating such + * that the palette is still colourblind friendly. 2 by default. + * @return {!Array} An array of colour scheme objects + * matching the criteria. Sorted by scheme name. + */ + palette.listSchemes = function(name, opt_number) { + if (!opt_number) { + opt_number = 2; + } else if (opt_number < 0) { + opt_number = -opt_number; + } + + var ret = []; + (typeof name === 'string' ? [name] : name).forEach(function(n) { + var cbf = n.substring(n.length - 4) === '-cbf'; + if (cbf) { + n = n.substring(0, n.length - 4); + } + var schemes = + registered_schemes['g-' + n] || + registered_schemes['n-' + n] || + []; + for (var i = 0, scheme; (scheme = schemes[i]); ++i) { + if ((cbf ? scheme.cbf : scheme.max) >= opt_number) { + ret.push(scheme); + } + } + }); + + ret.sort(function(a, b) { + return a.scheme_name >= b.scheme_name ? + a.scheme_name > b.scheme_name ? 1 : 0 : -1; + }); + return ret; + }; + + + /** + * Generates a palette using given colour generating function. + * + * The color_func callback must accept a singe number argument whose value + * can vary from 0.0 to 1.0 (or in general from opt_start to opt_end), and + * return a colour as an 'RRGGBB' string. This function will be used when + * generating palettes, i.e. if 11-colour palette is requested, this + * function will be called with arguments 0.0, 0.1, …, 1.0. + * + * In some cases, it is not desirable to reach 1.0 when generating + * a palette. This happens for hue-rainbows where the 0–1 range corresponds + * to a 0°–360° range in hues, and since hue at 0° is the same as at 360°, + * it's desired to stop short the end of the range when generating + * a palette. To accomplish this, opt_cyclic should be set to true. + * + * opt_start and opt_end may be used to change the range the colour + * generation function is called with. opt_end may be less than opt_start + * which will case to traverse the range in reverse. Another way to reverse + * the palette is requesting negative number of colours. The two methods do + * not always lead to the same results (especially if opt_cyclic is set). + * + * @param {palette.ColorFunction} color_func A colours generating callback + * function. + * @param {number} number Number of colours to generate in the palette. If + * number is negative, colours in the palette will be reversed. If only + * one colour is requested, colour at opt_start will be returned. + * @param {number=} opt_start Optional starting point for the palette + * generation function. Zero by default. + * @param {number=} opt_end Optional ending point for the palette generation + * function. One by default. + * @param {boolean=} opt_cyclic If true, function will assume colour at + * point opt_start is the same as one at opt_end. + * @return {palette.Palette} An array of 'RRGGBB' colours. + */ + palette.generate = function(color_func, number, opt_start, opt_end, + opt_cyclic) { + if (Math.abs(number) < 1) { + return []; + } + + opt_start = opt_start === void(0) ? 0 : opt_start; + opt_end = opt_end === void(0) ? 1 : opt_end; + + if (Math.abs(number) < 2) { + return [color_func(opt_start)]; + } + + var i = Math.abs(number); + var x = opt_start; + var ret = []; + var step = (opt_end - opt_start) / (opt_cyclic ? i : (i - 1)); + + for (; --i >= 0; x += step) { + ret.push(color_func(x)); + } + if (number < 0) { + ret.reverse(); + } + return ret; + }; + + + /** + * Clamps value to [0, 1] range. + * @param {number} v Number to limit value of. + * @return {number} If v is inside of [0, 1] range returns v, otherwise + * returns 0 or 1 depending which side of the range v is closer to. + */ + var clamp = function(v) { + return v > 0 ? (v < 1 ? v : 1) : 0; + }; + + /** + * Converts r, g, b triple into RRGGBB hex representation. + * @param {number} r Red value of the colour in the range [0, 1]. + * @param {number} g Green value of the colour in the range [0, 1]. + * @param {number} b Blue value of the colour in the range [0, 1]. + * @return {string} A lower-case RRGGBB representation of the colour. + */ + palette.rgbColor = function(r, g, b) { + return [r, g, b].map(function(v) { + v = Number(Math.round(clamp(v) * 255)).toString(16); + return v.length == 1 ? '0' + v : v; + }).join(''); + }; + + /** + * Converts a linear r, g, b triple into RRGGBB hex representation. + * @param {number} r Linear red value of the colour in the range [0, 1]. + * @param {number} g Linear green value of the colour in the range [0, 1]. + * @param {number} b Linear blue value of the colour in the range [0, 1]. + * @return {string} A lower-case RRGGBB representation of the colour. + */ + palette.linearRgbColor = function(r, g, b) { + // http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html + return [r, g, b].map(function(v) { + v = clamp(v); + if (v <= 0.0031308) { + v = 12.92 * v; + } else { + v = 1.055 * Math.pow(v, 1 / 2.4) - 0.055; + } + v = Number(Math.round(v * 255)).toString(16); + return v.length == 1 ? '0' + v : v; + }).join(''); + }; + + /** + * Converts an HSV colours to RRGGBB hex representation. + * @param {number} h Hue in the range [0, 1]. + * @param {number=} opt_s Saturation in the range [0, 1]. One by default. + * @param {number=} opt_v Value in the range [0, 1]. One by default. + * @return {string} An RRGGBB representation of the colour. + */ + palette.hsvColor = function(h, opt_s, opt_v) { + h *= 6; + var s = opt_s === void(0) ? 1 : clamp(opt_s); + var v = opt_v === void(0) ? 1 : clamp(opt_v); + var x = v * (1 - s * Math.abs(h % 2 - 1)); + var m = v * (1 - s); + switch (Math.floor(h) % 6) { + case 0: return palette.rgbColor(v, x, m); + case 1: return palette.rgbColor(x, v, m); + case 2: return palette.rgbColor(m, v, x); + case 3: return palette.rgbColor(m, x, v); + case 4: return palette.rgbColor(x, m, v); + default: return palette.rgbColor(v, m, x); + } + }; + + palette.register(palette.Scheme.withColorFunction( + 'rainbow', 'qualitative', palette.hsvColor, false, true)); + + return palette; +})(); + + +/** @typedef {function(number): string} */ +palette.ColorFunction; + +/** @typedef {!Array} */ +palette.Palette; + +/** @typedef {!Object|!Array} */ +palette.PalettesList; + +/** + * @typedef { + * function(number, ...?): Array| + * { + * scheme_name: string, + * groups: !Array, + * max: number, + * cbf_max: number, + * addPalette: function(!Array, boolean=), + * addPalettes: function(palette.PalettesList, number=, number=), + * shrinkByTakingHead: function(boolean, number=), + * setColorFunction: function(palette.ColorFunction, boolean=, boolean=), + * color: function(number, ...?): ?string}} + */ +palette.SchemeType; + + +/* mpn65 palette start here. ************************************************/ + +/* The ‘mpn65’ palette is designed for systems which show many graphs which + don’t have custom colour palettes chosen by humans or if number of necessary + colours isn’t know a priori. */ + +(function() { + var scheme = palette.Scheme.fromPalettes('mpn65', 'qualitative', [[ + 'ff0029', '377eb8', '66a61e', '984ea3', '00d2d5', 'ff7f00', 'af8d00', + '7f80cd', 'b3e900', 'c42e60', 'a65628', 'f781bf', '8dd3c7', 'bebada', + 'fb8072', '80b1d3', 'fdb462', 'fccde5', 'bc80bd', 'ffed6f', 'c4eaff', + 'cf8c00', '1b9e77', 'd95f02', 'e7298a', 'e6ab02', 'a6761d', '0097ff', + '00d067', '000000', '252525', '525252', '737373', '969696', 'bdbdbd', + 'f43600', '4ba93b', '5779bb', '927acc', '97ee3f', 'bf3947', '9f5b00', + 'f48758', '8caed6', 'f2b94f', 'eff26e', 'e43872', 'd9b100', '9d7a00', + '698cff', 'd9d9d9', '00d27e', 'd06800', '009f82', 'c49200', 'cbe8ff', + 'fecddf', 'c27eb6', '8cd2ce', 'c4b8d9', 'f883b0', 'a49100', 'f48800', + '27d0df', 'a04a9b' + ]]); + scheme.shrinkByTakingHead(true); + palette.register(scheme); +})(); + +/* Paul Tol's schemes start here. *******************************************/ +/* See http://www.sron.nl/~pault/ */ + +(function() { + var rgb = palette.rgbColor; + + /** + * Calculates value of a polynomial at given point. + * For example, poly(x, 1, 2, 3) calculates value of “1 + 2*x + 3*X²”. + * @param {number} x Value to calculate polynomial for. + * @param {...number} varargs Coefficients of the polynomial specified in + * the order of rising powers of x including constant as the first + * variable argument. + */ + var poly = function(x, varargs) { + var i = arguments.length - 1, n = arguments[i]; + while (i > 1) { + n = n * x + arguments[--i]; + } + return n; + }; + + /** + * Calculate approximate value of error function with maximum error of 0.0005. + * See . + * @param {number} x Argument of the error function. + * @return {number} Value of error function for x. + */ + var erf = function(x) { + // https://en.wikipedia.org/wiki/Error_function#Approximation_with_elementary_functions + // This produces a maximum error of 0.0005 which is more then we need. In + // the worst case, that error is multiplied by four and then divided by two + // before being multiplied by 255, so in the end, the error is multiplied by + // 510 which produces 0.255 which is less than a single colour step. + var y = poly(Math.abs(x), 1, 0.278393, 0.230389, 0.000972, 0.078108); + y *= y; // y^2 + y *= y; // y^4 + y = 1 - 1 / y; + return x < 0 ? -y : y; + }; + + palette.register(palette.Scheme.fromPalettes('tol', 'qualitative', [ + ['4477aa'], + ['4477aa', 'cc6677'], + ['4477aa', 'ddcc77', 'cc6677'], + ['4477aa', '117733', 'ddcc77', 'cc6677'], + ['332288', '88ccee', '117733', 'ddcc77', 'cc6677'], + ['332288', '88ccee', '117733', 'ddcc77', 'cc6677', 'aa4499'], + ['332288', '88ccee', '44aa99', '117733', 'ddcc77', 'cc6677', 'aa4499'], + ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', 'cc6677', + 'aa4499'], + ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', 'cc6677', + '882255', 'aa4499'], + ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', '661100', + 'cc6677', '882255', 'aa4499'], + ['332288', '6699cc', '88ccee', '44aa99', '117733', '999933', 'ddcc77', + '661100', 'cc6677', '882255', 'aa4499'], + ['332288', '6699cc', '88ccee', '44aa99', '117733', '999933', 'ddcc77', + '661100', 'cc6677', 'aa4466', '882255', 'aa4499'] + ], 12, 12)); + + /** + * Calculates a colour along Paul Tol's sequential colours axis. + * See figure 7 and equation 1. + * @param {number} x Position of the colour on the axis in the [0, 1] range. + * @return {string} An RRGGBB representation of the colour. + */ + palette.tolSequentialColor = function(x) { + return rgb(1 - 0.392 * (1 + erf((x - 0.869) / 0.255)), + 1.021 - 0.456 * (1 + erf((x - 0.527) / 0.376)), + 1 - 0.493 * (1 + erf((x - 0.272) / 0.309))); + }; + + palette.register(palette.Scheme.withColorFunction( + 'tol-sq', 'sequential', palette.tolSequentialColor, true)); + + /** + * Calculates a colour along Paul Tol's diverging colours axis. + * See figure 8 and equation 2. + * @param {number} x Position of the colour on the axis in the [0, 1] range. + * @return {string} An RRGGBB representation of the colour. + */ + palette.tolDivergingColor = function(x) { + var g = poly(x, 0.572, 1.524, -1.811) / poly(x, 1, -0.291, 0.1574); + return rgb(poly(x, 0.235, -2.13, 26.92, -65.5, 63.5, -22.36), + g * g, + 1 / poly(x, 1.579, -4.03, 12.92, -31.4, 48.6, -23.36)); + }; + + palette.register(palette.Scheme.withColorFunction( + 'tol-dv', 'diverging', palette.tolDivergingColor, true)); + + /** + * Calculates a colour along Paul Tol's rainbow colours axis. + * See figure 13 and equation 3. + * @param {number} x Position of the colour on the axis in the [0, 1] range. + * @return {string} An RRGGBB representation of the colour. + */ + palette.tolRainbowColor = function(x) { + return rgb(poly(x, 0.472, -0.567, 4.05) / poly(x, 1, 8.72, -19.17, 14.1), + poly(x, 0.108932, -1.22635, 27.284, -98.577, 163.3, -131.395, + 40.634), + 1 / poly(x, 1.97, 3.54, -68.5, 243, -297, 125)); + }; + + palette.register(palette.Scheme.withColorFunction( + 'tol-rainbow', 'qualitative', palette.tolRainbowColor, true)); +})(); + + +/* Solarized colour schemes start here. *************************************/ +/* See http://ethanschoonover.com/solarized */ + +(function() { + /* + * Those are not really designed to be used in graphs, but we're keeping + * them here in case someone cares. + */ + palette.register(palette.Scheme.fromPalettes('sol-base', 'sequential', [ + ['002b36', '073642', '586e75', '657b83', '839496', '93a1a1', 'eee8d5', + 'fdf6e3'] + ], 1, 8)); + palette.register(palette.Scheme.fromPalettes('sol-accent', 'qualitative', [ + ['b58900', 'cb4b16', 'dc322f', 'd33682', '6c71c4', '268bd2', '2aa198', + '859900'] + ])); +})(); + + +/* ColorBrewer colour schemes start here. ***********************************/ +/* See http://colorbrewer2.org/ */ + +(function() { + var schemes = { + YlGn: { + type: 'sequential', + cbf: 42, + 3: ['f7fcb9', 'addd8e', '31a354'], + 4: ['ffffcc', 'c2e699', '78c679', '238443'], + 5: ['ffffcc', 'c2e699', '78c679', '31a354', '006837'], + 6: ['ffffcc', 'd9f0a3', 'addd8e', '78c679', '31a354', '006837'], + 7: ['ffffcc', 'd9f0a3', 'addd8e', '78c679', '41ab5d', '238443', + '005a32'], + 8: ['ffffe5', 'f7fcb9', 'd9f0a3', 'addd8e', '78c679', '41ab5d', + '238443', '005a32'], + 9: ['ffffe5', 'f7fcb9', 'd9f0a3', 'addd8e', '78c679', '41ab5d', + '238443', '006837', '004529'] + }, + YlGnBu: { + type: 'sequential', + cbf: 42, + 3: ['edf8b1', '7fcdbb', '2c7fb8'], + 4: ['ffffcc', 'a1dab4', '41b6c4', '225ea8'], + 5: ['ffffcc', 'a1dab4', '41b6c4', '2c7fb8', '253494'], + 6: ['ffffcc', 'c7e9b4', '7fcdbb', '41b6c4', '2c7fb8', '253494'], + 7: ['ffffcc', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0', '225ea8', + '0c2c84'], + 8: ['ffffd9', 'edf8b1', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0', + '225ea8', '0c2c84'], + 9: ['ffffd9', 'edf8b1', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0', + '225ea8', '253494', '081d58'] + }, + GnBu: { + type: 'sequential', + cbf: 42, + 3: ['e0f3db', 'a8ddb5', '43a2ca'], + 4: ['f0f9e8', 'bae4bc', '7bccc4', '2b8cbe'], + 5: ['f0f9e8', 'bae4bc', '7bccc4', '43a2ca', '0868ac'], + 6: ['f0f9e8', 'ccebc5', 'a8ddb5', '7bccc4', '43a2ca', '0868ac'], + 7: ['f0f9e8', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3', '2b8cbe', + '08589e'], + 8: ['f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3', + '2b8cbe', '08589e'], + 9: ['f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3', + '2b8cbe', '0868ac', '084081'] + }, + BuGn: { + type: 'sequential', + cbf: 42, + 3: ['e5f5f9', '99d8c9', '2ca25f'], + 4: ['edf8fb', 'b2e2e2', '66c2a4', '238b45'], + 5: ['edf8fb', 'b2e2e2', '66c2a4', '2ca25f', '006d2c'], + 6: ['edf8fb', 'ccece6', '99d8c9', '66c2a4', '2ca25f', '006d2c'], + 7: ['edf8fb', 'ccece6', '99d8c9', '66c2a4', '41ae76', '238b45', + '005824'], + 8: ['f7fcfd', 'e5f5f9', 'ccece6', '99d8c9', '66c2a4', '41ae76', + '238b45', '005824'], + 9: ['f7fcfd', 'e5f5f9', 'ccece6', '99d8c9', '66c2a4', '41ae76', + '238b45', '006d2c', '00441b'] + }, + PuBuGn: { + type: 'sequential', + cbf: 42, + 3: ['ece2f0', 'a6bddb', '1c9099'], + 4: ['f6eff7', 'bdc9e1', '67a9cf', '02818a'], + 5: ['f6eff7', 'bdc9e1', '67a9cf', '1c9099', '016c59'], + 6: ['f6eff7', 'd0d1e6', 'a6bddb', '67a9cf', '1c9099', '016c59'], + 7: ['f6eff7', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0', '02818a', + '016450'], + 8: ['fff7fb', 'ece2f0', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0', + '02818a', '016450'], + 9: ['fff7fb', 'ece2f0', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0', + '02818a', '016c59', '014636'] + }, + PuBu: { + type: 'sequential', + cbf: 42, + 3: ['ece7f2', 'a6bddb', '2b8cbe'], + 4: ['f1eef6', 'bdc9e1', '74a9cf', '0570b0'], + 5: ['f1eef6', 'bdc9e1', '74a9cf', '2b8cbe', '045a8d'], + 6: ['f1eef6', 'd0d1e6', 'a6bddb', '74a9cf', '2b8cbe', '045a8d'], + 7: ['f1eef6', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0', '0570b0', + '034e7b'], + 8: ['fff7fb', 'ece7f2', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0', + '0570b0', '034e7b'], + 9: ['fff7fb', 'ece7f2', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0', + '0570b0', '045a8d', '023858'] + }, + BuPu: { + type: 'sequential', + cbf: 42, + 3: ['e0ecf4', '9ebcda', '8856a7'], + 4: ['edf8fb', 'b3cde3', '8c96c6', '88419d'], + 5: ['edf8fb', 'b3cde3', '8c96c6', '8856a7', '810f7c'], + 6: ['edf8fb', 'bfd3e6', '9ebcda', '8c96c6', '8856a7', '810f7c'], + 7: ['edf8fb', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1', '88419d', + '6e016b'], + 8: ['f7fcfd', 'e0ecf4', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1', + '88419d', '6e016b'], + 9: ['f7fcfd', 'e0ecf4', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1', + '88419d', '810f7c', '4d004b'] + }, + RdPu: { + type: 'sequential', + cbf: 42, + 3: ['fde0dd', 'fa9fb5', 'c51b8a'], + 4: ['feebe2', 'fbb4b9', 'f768a1', 'ae017e'], + 5: ['feebe2', 'fbb4b9', 'f768a1', 'c51b8a', '7a0177'], + 6: ['feebe2', 'fcc5c0', 'fa9fb5', 'f768a1', 'c51b8a', '7a0177'], + 7: ['feebe2', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497', 'ae017e', + '7a0177'], + 8: ['fff7f3', 'fde0dd', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497', + 'ae017e', '7a0177'], + 9: ['fff7f3', 'fde0dd', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497', + 'ae017e', '7a0177', '49006a'] + }, + PuRd: { + type: 'sequential', + cbf: 42, + 3: ['e7e1ef', 'c994c7', 'dd1c77'], + 4: ['f1eef6', 'd7b5d8', 'df65b0', 'ce1256'], + 5: ['f1eef6', 'd7b5d8', 'df65b0', 'dd1c77', '980043'], + 6: ['f1eef6', 'd4b9da', 'c994c7', 'df65b0', 'dd1c77', '980043'], + 7: ['f1eef6', 'd4b9da', 'c994c7', 'df65b0', 'e7298a', 'ce1256', + '91003f'], + 8: ['f7f4f9', 'e7e1ef', 'd4b9da', 'c994c7', 'df65b0', 'e7298a', + 'ce1256', '91003f'], + 9: ['f7f4f9', 'e7e1ef', 'd4b9da', 'c994c7', 'df65b0', 'e7298a', + 'ce1256', '980043', '67001f'] + }, + OrRd: { + type: 'sequential', + cbf: 42, + 3: ['fee8c8', 'fdbb84', 'e34a33'], + 4: ['fef0d9', 'fdcc8a', 'fc8d59', 'd7301f'], + 5: ['fef0d9', 'fdcc8a', 'fc8d59', 'e34a33', 'b30000'], + 6: ['fef0d9', 'fdd49e', 'fdbb84', 'fc8d59', 'e34a33', 'b30000'], + 7: ['fef0d9', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548', 'd7301f', + '990000'], + 8: ['fff7ec', 'fee8c8', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548', + 'd7301f', '990000'], + 9: ['fff7ec', 'fee8c8', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548', + 'd7301f', 'b30000', '7f0000'] + }, + YlOrRd: { + type: 'sequential', + cbf: 42, + 3: ['ffeda0', 'feb24c', 'f03b20'], + 4: ['ffffb2', 'fecc5c', 'fd8d3c', 'e31a1c'], + 5: ['ffffb2', 'fecc5c', 'fd8d3c', 'f03b20', 'bd0026'], + 6: ['ffffb2', 'fed976', 'feb24c', 'fd8d3c', 'f03b20', 'bd0026'], + 7: ['ffffb2', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', 'e31a1c', + 'b10026'], + 8: ['ffffcc', 'ffeda0', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', + 'e31a1c', 'b10026'], + 9: ['ffffcc', 'ffeda0', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', + 'e31a1c', 'bd0026', '800026'] + }, + YlOrBr: { + type: 'sequential', + cbf: 42, + 3: ['fff7bc', 'fec44f', 'd95f0e'], + 4: ['ffffd4', 'fed98e', 'fe9929', 'cc4c02'], + 5: ['ffffd4', 'fed98e', 'fe9929', 'd95f0e', '993404'], + 6: ['ffffd4', 'fee391', 'fec44f', 'fe9929', 'd95f0e', '993404'], + 7: ['ffffd4', 'fee391', 'fec44f', 'fe9929', 'ec7014', 'cc4c02', + '8c2d04'], + 8: ['ffffe5', 'fff7bc', 'fee391', 'fec44f', 'fe9929', 'ec7014', + 'cc4c02', '8c2d04'], + 9: ['ffffe5', 'fff7bc', 'fee391', 'fec44f', 'fe9929', 'ec7014', + 'cc4c02', '993404', '662506'] + }, + Purples: { + type: 'sequential', + cbf: 42, + 3: ['efedf5', 'bcbddc', '756bb1'], + 4: ['f2f0f7', 'cbc9e2', '9e9ac8', '6a51a3'], + 5: ['f2f0f7', 'cbc9e2', '9e9ac8', '756bb1', '54278f'], + 6: ['f2f0f7', 'dadaeb', 'bcbddc', '9e9ac8', '756bb1', '54278f'], + 7: ['f2f0f7', 'dadaeb', 'bcbddc', '9e9ac8', '807dba', '6a51a3', + '4a1486'], + 8: ['fcfbfd', 'efedf5', 'dadaeb', 'bcbddc', '9e9ac8', '807dba', + '6a51a3', '4a1486'], + 9: ['fcfbfd', 'efedf5', 'dadaeb', 'bcbddc', '9e9ac8', '807dba', + '6a51a3', '54278f', '3f007d'] + }, + Blues: { + type: 'sequential', + cbf: 42, + 3: ['deebf7', '9ecae1', '3182bd'], + 4: ['eff3ff', 'bdd7e7', '6baed6', '2171b5'], + 5: ['eff3ff', 'bdd7e7', '6baed6', '3182bd', '08519c'], + 6: ['eff3ff', 'c6dbef', '9ecae1', '6baed6', '3182bd', '08519c'], + 7: ['eff3ff', 'c6dbef', '9ecae1', '6baed6', '4292c6', '2171b5', + '084594'], + 8: ['f7fbff', 'deebf7', 'c6dbef', '9ecae1', '6baed6', '4292c6', + '2171b5', '084594'], + 9: ['f7fbff', 'deebf7', 'c6dbef', '9ecae1', '6baed6', '4292c6', + '2171b5', '08519c', '08306b'] + }, + Greens: { + type: 'sequential', + cbf: 42, + 3: ['e5f5e0', 'a1d99b', '31a354'], + 4: ['edf8e9', 'bae4b3', '74c476', '238b45'], + 5: ['edf8e9', 'bae4b3', '74c476', '31a354', '006d2c'], + 6: ['edf8e9', 'c7e9c0', 'a1d99b', '74c476', '31a354', '006d2c'], + 7: ['edf8e9', 'c7e9c0', 'a1d99b', '74c476', '41ab5d', '238b45', + '005a32'], + 8: ['f7fcf5', 'e5f5e0', 'c7e9c0', 'a1d99b', '74c476', '41ab5d', + '238b45', '005a32'], + 9: ['f7fcf5', 'e5f5e0', 'c7e9c0', 'a1d99b', '74c476', '41ab5d', + '238b45', '006d2c', '00441b'] + }, + Oranges: { + type: 'sequential', + cbf: 42, + 3: ['fee6ce', 'fdae6b', 'e6550d'], + 4: ['feedde', 'fdbe85', 'fd8d3c', 'd94701'], + 5: ['feedde', 'fdbe85', 'fd8d3c', 'e6550d', 'a63603'], + 6: ['feedde', 'fdd0a2', 'fdae6b', 'fd8d3c', 'e6550d', 'a63603'], + 7: ['feedde', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913', 'd94801', + '8c2d04'], + 8: ['fff5eb', 'fee6ce', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913', + 'd94801', '8c2d04'], + 9: ['fff5eb', 'fee6ce', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913', + 'd94801', 'a63603', '7f2704'] + }, + Reds: { + type: 'sequential', + cbf: 42, + 3: ['fee0d2', 'fc9272', 'de2d26'], + 4: ['fee5d9', 'fcae91', 'fb6a4a', 'cb181d'], + 5: ['fee5d9', 'fcae91', 'fb6a4a', 'de2d26', 'a50f15'], + 6: ['fee5d9', 'fcbba1', 'fc9272', 'fb6a4a', 'de2d26', 'a50f15'], + 7: ['fee5d9', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c', 'cb181d', + '99000d'], + 8: ['fff5f0', 'fee0d2', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c', + 'cb181d', '99000d'], + 9: ['fff5f0', 'fee0d2', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c', + 'cb181d', 'a50f15', '67000d'] + }, + Greys: { + type: 'sequential', + cbf: 42, + 3: ['f0f0f0', 'bdbdbd', '636363'], + 4: ['f7f7f7', 'cccccc', '969696', '525252'], + 5: ['f7f7f7', 'cccccc', '969696', '636363', '252525'], + 6: ['f7f7f7', 'd9d9d9', 'bdbdbd', '969696', '636363', '252525'], + 7: ['f7f7f7', 'd9d9d9', 'bdbdbd', '969696', '737373', '525252', + '252525'], + 8: ['ffffff', 'f0f0f0', 'd9d9d9', 'bdbdbd', '969696', '737373', + '525252', '252525'], + 9: ['ffffff', 'f0f0f0', 'd9d9d9', 'bdbdbd', '969696', '737373', + '525252', '252525', '000000'] + }, + PuOr: { + type: 'diverging', + cbf: 42, + 3: ['f1a340', 'f7f7f7', '998ec3'], + 4: ['e66101', 'fdb863', 'b2abd2', '5e3c99'], + 5: ['e66101', 'fdb863', 'f7f7f7', 'b2abd2', '5e3c99'], + 6: ['b35806', 'f1a340', 'fee0b6', 'd8daeb', '998ec3', '542788'], + 7: ['b35806', 'f1a340', 'fee0b6', 'f7f7f7', 'd8daeb', '998ec3', + '542788'], + 8: ['b35806', 'e08214', 'fdb863', 'fee0b6', 'd8daeb', 'b2abd2', + '8073ac', '542788'], + 9: ['b35806', 'e08214', 'fdb863', 'fee0b6', 'f7f7f7', 'd8daeb', + 'b2abd2', '8073ac', '542788'], + 10: ['7f3b08', 'b35806', 'e08214', 'fdb863', 'fee0b6', 'd8daeb', + 'b2abd2', '8073ac', '542788', '2d004b'], + 11: ['7f3b08', 'b35806', 'e08214', 'fdb863', 'fee0b6', 'f7f7f7', + 'd8daeb', 'b2abd2', '8073ac', '542788', '2d004b'] + }, + BrBG: { + type: 'diverging', + cbf: 42, + 3: ['d8b365', 'f5f5f5', '5ab4ac'], + 4: ['a6611a', 'dfc27d', '80cdc1', '018571'], + 5: ['a6611a', 'dfc27d', 'f5f5f5', '80cdc1', '018571'], + 6: ['8c510a', 'd8b365', 'f6e8c3', 'c7eae5', '5ab4ac', '01665e'], + 7: ['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'c7eae5', '5ab4ac', + '01665e'], + 8: ['8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'c7eae5', '80cdc1', + '35978f', '01665e'], + 9: ['8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'f5f5f5', 'c7eae5', + '80cdc1', '35978f', '01665e'], + 10: ['543005', '8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'c7eae5', + '80cdc1', '35978f', '01665e', '003c30'], + 11: ['543005', '8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'f5f5f5', + 'c7eae5', '80cdc1', '35978f', '01665e', '003c30'] + }, + PRGn: { + type: 'diverging', + cbf: 42, + 3: ['af8dc3', 'f7f7f7', '7fbf7b'], + 4: ['7b3294', 'c2a5cf', 'a6dba0', '008837'], + 5: ['7b3294', 'c2a5cf', 'f7f7f7', 'a6dba0', '008837'], + 6: ['762a83', 'af8dc3', 'e7d4e8', 'd9f0d3', '7fbf7b', '1b7837'], + 7: ['762a83', 'af8dc3', 'e7d4e8', 'f7f7f7', 'd9f0d3', '7fbf7b', + '1b7837'], + 8: ['762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'd9f0d3', 'a6dba0', + '5aae61', '1b7837'], + 9: ['762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'f7f7f7', 'd9f0d3', + 'a6dba0', '5aae61', '1b7837'], + 10: ['40004b', '762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'd9f0d3', + 'a6dba0', '5aae61', '1b7837', '00441b'], + 11: ['40004b', '762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'f7f7f7', + 'd9f0d3', 'a6dba0', '5aae61', '1b7837', '00441b'] + }, + PiYG: { + type: 'diverging', + cbf: 42, + 3: ['e9a3c9', 'f7f7f7', 'a1d76a'], + 4: ['d01c8b', 'f1b6da', 'b8e186', '4dac26'], + 5: ['d01c8b', 'f1b6da', 'f7f7f7', 'b8e186', '4dac26'], + 6: ['c51b7d', 'e9a3c9', 'fde0ef', 'e6f5d0', 'a1d76a', '4d9221'], + 7: ['c51b7d', 'e9a3c9', 'fde0ef', 'f7f7f7', 'e6f5d0', 'a1d76a', + '4d9221'], + 8: ['c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'e6f5d0', 'b8e186', + '7fbc41', '4d9221'], + 9: ['c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'f7f7f7', 'e6f5d0', + 'b8e186', '7fbc41', '4d9221'], + 10: ['8e0152', 'c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'e6f5d0', + 'b8e186', '7fbc41', '4d9221', '276419'], + 11: ['8e0152', 'c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'f7f7f7', + 'e6f5d0', 'b8e186', '7fbc41', '4d9221', '276419'] + }, + RdBu: { + type: 'diverging', + cbf: 42, + 3: ['ef8a62', 'f7f7f7', '67a9cf'], + 4: ['ca0020', 'f4a582', '92c5de', '0571b0'], + 5: ['ca0020', 'f4a582', 'f7f7f7', '92c5de', '0571b0'], + 6: ['b2182b', 'ef8a62', 'fddbc7', 'd1e5f0', '67a9cf', '2166ac'], + 7: ['b2182b', 'ef8a62', 'fddbc7', 'f7f7f7', 'd1e5f0', '67a9cf', + '2166ac'], + 8: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'd1e5f0', '92c5de', + '4393c3', '2166ac'], + 9: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'f7f7f7', 'd1e5f0', + '92c5de', '4393c3', '2166ac'], + 10: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'd1e5f0', + '92c5de', '4393c3', '2166ac', '053061'], + 11: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'f7f7f7', + 'd1e5f0', '92c5de', '4393c3', '2166ac', '053061'] + }, + RdGy: { + type: 'diverging', + cbf: 42, + 3: ['ef8a62', 'ffffff', '999999'], + 4: ['ca0020', 'f4a582', 'bababa', '404040'], + 5: ['ca0020', 'f4a582', 'ffffff', 'bababa', '404040'], + 6: ['b2182b', 'ef8a62', 'fddbc7', 'e0e0e0', '999999', '4d4d4d'], + 7: ['b2182b', 'ef8a62', 'fddbc7', 'ffffff', 'e0e0e0', '999999', + '4d4d4d'], + 8: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'e0e0e0', 'bababa', + '878787', '4d4d4d'], + 9: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'ffffff', 'e0e0e0', + 'bababa', '878787', '4d4d4d'], + 10: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'e0e0e0', + 'bababa', '878787', '4d4d4d', '1a1a1a'], + 11: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'ffffff', + 'e0e0e0', 'bababa', '878787', '4d4d4d', '1a1a1a'] + }, + RdYlBu: { + type: 'diverging', + cbf: 42, + 3: ['fc8d59', 'ffffbf', '91bfdb'], + 4: ['d7191c', 'fdae61', 'abd9e9', '2c7bb6'], + 5: ['d7191c', 'fdae61', 'ffffbf', 'abd9e9', '2c7bb6'], + 6: ['d73027', 'fc8d59', 'fee090', 'e0f3f8', '91bfdb', '4575b4'], + 7: ['d73027', 'fc8d59', 'fee090', 'ffffbf', 'e0f3f8', '91bfdb', + '4575b4'], + 8: ['d73027', 'f46d43', 'fdae61', 'fee090', 'e0f3f8', 'abd9e9', + '74add1', '4575b4'], + 9: ['d73027', 'f46d43', 'fdae61', 'fee090', 'ffffbf', 'e0f3f8', + 'abd9e9', '74add1', '4575b4'], + 10: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee090', 'e0f3f8', + 'abd9e9', '74add1', '4575b4', '313695'], + 11: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee090', 'ffffbf', + 'e0f3f8', 'abd9e9', '74add1', '4575b4', '313695'] + }, + Spectral: { + type: 'diverging', + cbf: 0, + 3: ['fc8d59', 'ffffbf', '99d594'], + 4: ['d7191c', 'fdae61', 'abdda4', '2b83ba'], + 5: ['d7191c', 'fdae61', 'ffffbf', 'abdda4', '2b83ba'], + 6: ['d53e4f', 'fc8d59', 'fee08b', 'e6f598', '99d594', '3288bd'], + 7: ['d53e4f', 'fc8d59', 'fee08b', 'ffffbf', 'e6f598', '99d594', + '3288bd'], + 8: ['d53e4f', 'f46d43', 'fdae61', 'fee08b', 'e6f598', 'abdda4', + '66c2a5', '3288bd'], + 9: ['d53e4f', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', 'e6f598', + 'abdda4', '66c2a5', '3288bd'], + 10: ['9e0142', 'd53e4f', 'f46d43', 'fdae61', 'fee08b', 'e6f598', + 'abdda4', '66c2a5', '3288bd', '5e4fa2'], + 11: ['9e0142', 'd53e4f', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', + 'e6f598', 'abdda4', '66c2a5', '3288bd', '5e4fa2'] + }, + RdYlGn: { + type: 'diverging', + cbf: 0, + 3: ['fc8d59', 'ffffbf', '91cf60'], + 4: ['d7191c', 'fdae61', 'a6d96a', '1a9641'], + 5: ['d7191c', 'fdae61', 'ffffbf', 'a6d96a', '1a9641'], + 6: ['d73027', 'fc8d59', 'fee08b', 'd9ef8b', '91cf60', '1a9850'], + 7: ['d73027', 'fc8d59', 'fee08b', 'ffffbf', 'd9ef8b', '91cf60', + '1a9850'], + 8: ['d73027', 'f46d43', 'fdae61', 'fee08b', 'd9ef8b', 'a6d96a', + '66bd63', '1a9850'], + 9: ['d73027', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', 'd9ef8b', + 'a6d96a', '66bd63', '1a9850'], + 10: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee08b', 'd9ef8b', + 'a6d96a', '66bd63', '1a9850', '006837'], + 11: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', + 'd9ef8b', 'a6d96a', '66bd63', '1a9850', '006837'] + }, + Accent: { + type: 'qualitative', + cbf: 0, + 3: ['7fc97f', 'beaed4', 'fdc086'], + 4: ['7fc97f', 'beaed4', 'fdc086', 'ffff99'], + 5: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0'], + 6: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f'], + 7: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f', + 'bf5b17'], + 8: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f', + 'bf5b17', '666666'] + }, + Dark2: { + type: 'qualitative', + cbf: 3, + 3: ['1b9e77', 'd95f02', '7570b3'], + 4: ['1b9e77', 'd95f02', '7570b3', 'e7298a'], + 5: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e'], + 6: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02'], + 7: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02', + 'a6761d'], + 8: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02', + 'a6761d', '666666'] + }, + Paired: { + type: 'qualitative', + cbf: 4, + 3: ['a6cee3', '1f78b4', 'b2df8a'], + 4: ['a6cee3', '1f78b4', 'b2df8a', '33a02c'], + 5: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99'], + 6: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c'], + 7: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f'], + 8: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f', 'ff7f00'], + 9: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f', 'ff7f00', 'cab2d6'], + 10: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a'], + 11: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a', 'ffff99'], + 12: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c', + 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a', 'ffff99', 'b15928'] + }, + Pastel1: { + type: 'qualitative', + cbf: 0, + 3: ['fbb4ae', 'b3cde3', 'ccebc5'], + 4: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4'], + 5: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6'], + 6: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc'], + 7: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc', + 'e5d8bd'], + 8: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc', + 'e5d8bd', 'fddaec'], + 9: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc', + 'e5d8bd', 'fddaec', 'f2f2f2'] + }, + Pastel2: { + type: 'qualitative', + cbf: 0, + 3: ['b3e2cd', 'fdcdac', 'cbd5e8'], + 4: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4'], + 5: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9'], + 6: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae'], + 7: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae', + 'f1e2cc'], + 8: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae', + 'f1e2cc', 'cccccc'] + }, + Set1: { + type: 'qualitative', + cbf: 0, + 3: ['e41a1c', '377eb8', '4daf4a'], + 4: ['e41a1c', '377eb8', '4daf4a', '984ea3'], + 5: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00'], + 6: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33'], + 7: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33', + 'a65628'], + 8: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33', + 'a65628', 'f781bf'], + 9: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33', + 'a65628', 'f781bf', '999999'] + }, + Set2: { + type: 'qualitative', + cbf: 3, + 3: ['66c2a5', 'fc8d62', '8da0cb'], + 4: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3'], + 5: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854'], + 6: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f'], + 7: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f', + 'e5c494'], + 8: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f', + 'e5c494', 'b3b3b3'] + }, + Set3: { + type: 'qualitative', + cbf: 0, + 3: ['8dd3c7', 'ffffb3', 'bebada'], + 4: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072'], + 5: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3'], + 6: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462'], + 7: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69'], + 8: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69', 'fccde5'], + 9: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69', 'fccde5', 'd9d9d9'], + 10: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd'], + 11: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd', 'ccebc5'], + 12: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462', + 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd', 'ccebc5', 'ffed6f'] + } + }; + + for (var name in schemes) { + var scheme = schemes[name]; + scheme = palette.Scheme.fromPalettes( + 'cb-' + name, [scheme.type, 'cb-' + scheme.type], scheme, 12, scheme.cbf); + palette.register(scheme); + } +})(); + +if(typeof module === "object" && module.exports) { + module.exports = palette +} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/js/sweetalert2.all.min.js b/ext/phpbbstudio/aps/styles/prosilver/template/js/sweetalert2.all.min.js new file mode 100644 index 0000000..c31d3aa --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/js/sweetalert2.all.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Sweetalert2=t()}(this,function(){"use strict";function q(e){return(q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n\n
    \n
      \n
      \n \n
      \n
      \n ?\n
      \n
      \n !\n
      \n
      \n i\n
      \n
      \n
      \n \n
      \n
      \n
      \n \n

      \n \n
      \n
      \n
      \n \n \n
      \n \n \n
      \n \n
      \n \n \n
      \n
      \n
      \n \n \n
      \n
      \n
      \n
      \n').replace(/(^|\n)\s*/g,""),X=function(e){var t=w();if(t&&(t.parentNode.removeChild(t),W([document.documentElement,document.body],[_["no-backdrop"],_["toast-shown"],_["has-column"]])),!j()){var n=document.createElement("div");n.className=_.container,n.innerHTML=V;var o="string"==typeof e.target?document.querySelector(e.target):e.target;o.appendChild(n);var i,r=k(),a=B(),s=U(a,_.input),c=U(a,_.file),u=a.querySelector(".".concat(_.range," input")),l=a.querySelector(".".concat(_.range," output")),d=U(a,_.select),p=a.querySelector(".".concat(_.checkbox," input")),f=U(a,_.textarea);r.setAttribute("role",e.toast?"alert":"dialog"),r.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||r.setAttribute("aria-modal","true"),"rtl"===window.getComputedStyle(o).direction&&z(w(),_.rtl);var m=function(e){De.isVisible()&&i!==e.target.value&&De.resetValidationMessage(),i=e.target.value};return s.oninput=m,c.onchange=m,d.onchange=m,p.onchange=m,f.oninput=m,u.oninput=function(e){m(e),l.value=u.value},u.onchange=function(e){m(e),u.nextSibling.value=u.value},r}I("SweetAlert2 requires document to initialize")},G=function(e,t){if(!e)return F(t);if(e instanceof HTMLElement)t.appendChild(e);else if("object"===q(e))if(t.innerHTML="",0 in e)for(var n=0;n in e;n++)t.appendChild(e[n].cloneNode(!0));else t.appendChild(e.cloneNode(!0));else e&&(t.innerHTML=e);K(t)},ee=function(){if(j())return!1;var e=document.createElement("div"),t={WebkitAnimation:"webkitAnimationEnd",OAnimation:"oAnimationEnd oanimationend",animation:"animationend"};for(var n in t)if(t.hasOwnProperty(n)&&void 0!==e.style[n])return t[n];return!1}(),te=function(e){var t=Q(),n=L(),o=O();if(e.showConfirmButton||e.showCancelButton?K(t):F(t),e.showCancelButton?o.style.display="inline-block":F(o),e.showConfirmButton?n.style.removeProperty("display"):F(n),n.innerHTML=e.confirmButtonText,o.innerHTML=e.cancelButtonText,n.setAttribute("aria-label",e.confirmButtonAriaLabel),o.setAttribute("aria-label",e.cancelButtonAriaLabel),n.className=_.confirm,z(n,e.confirmButtonClass),o.className=_.cancel,z(o,e.cancelButtonClass),e.buttonsStyling){z([n,o],_.styled),e.confirmButtonColor&&(n.style.backgroundColor=e.confirmButtonColor),e.cancelButtonColor&&(o.style.backgroundColor=e.cancelButtonColor);var i=window.getComputedStyle(n).getPropertyValue("background-color");n.style.borderLeftColor=i,n.style.borderRightColor=i}else W([n,o],_.styled),n.style.backgroundColor=n.style.borderLeftColor=n.style.borderRightColor="",o.style.backgroundColor=o.style.borderLeftColor=o.style.borderRightColor=""},ne=function(e){var t=B().querySelector("#"+_.content);e.html?G(e.html,t):e.text?(t.textContent=e.text,K(t)):F(t)},oe=function(e){for(var t=x(),n=0;n=i.progressSteps.length&&R("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),i.progressSteps.forEach(function(e,t){var n=document.createElement("li");if(z(n,_.progresscircle),n.innerHTML=e,t===a&&z(n,_.activeprogressstep),r.appendChild(n),t!==i.progressSteps.length-1){var o=document.createElement("li");z(o,_.progressline),i.progressStepsDistance&&(o.style.width=i.progressStepsDistance),r.appendChild(o)}})):F(r)},ae=function(e){var t=A();e.titleText?t.innerText=e.titleText:e.title&&("string"==typeof e.title&&(e.title=e.title.split("\n").join("
      ")),G(e.title,t))},se=function(){null===b.previousBodyPadding&&document.body.scrollHeight>window.innerHeight&&(b.previousBodyPadding=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=b.previousBodyPadding+function(){if("ontouchstart"in window||navigator.msMaxTouchPoints)return 0;var e=document.createElement("div");e.style.width="50px",e.style.height="50px",e.style.overflow="scroll",document.body.appendChild(e);var t=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),t}()+"px")},ce=function(){return!!window.MSInputMethodContext&&!!document.documentMode},ue=function(){var e=w(),t=k();e.style.removeProperty("align-items"),t.offsetTop<0&&(e.style.alignItems="flex-start")},le={},de=function(e,t){var n=w(),o=k();if(o){null!==e&&"function"==typeof e&&e(o),W(o,_.show),z(o,_.hide);var i=function(){M()?pe(t):(new Promise(function(e){var t=window.scrollX,n=window.scrollY;le.restoreFocusTimeout=setTimeout(function(){le.previousActiveElement&&le.previousActiveElement.focus?(le.previousActiveElement.focus(),le.previousActiveElement=null):document.body&&document.body.focus(),e()},100),void 0!==t&&void 0!==n&&window.scrollTo(t,n)}).then(function(){return pe(t)}),le.keydownTarget.removeEventListener("keydown",le.keydownHandler,{capture:le.keydownListenerCapture}),le.keydownHandlerAdded=!1),n.parentNode&&n.parentNode.removeChild(n),W([document.documentElement,document.body],[_.shown,_["height-auto"],_["no-backdrop"],_["toast-shown"],_["toast-column"]]),T()&&(null!==b.previousBodyPadding&&(document.body.style.paddingRight=b.previousBodyPadding,b.previousBodyPadding=null),function(){if(v(document.body,_.iosfix)){var e=parseInt(document.body.style.top,10);W(document.body,_.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}}(),"undefined"!=typeof window&&ce()&&window.removeEventListener("resize",ue),f(document.body.children).forEach(function(e){e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))};ee&&!v(o,_.noanimation)?o.addEventListener(ee,function e(){o.removeEventListener(ee,e),v(o,_.hide)&&i()}):i()}},pe=function(e){null!==e&&"function"==typeof e&&setTimeout(function(){e()})};function fe(e){var t=function e(){for(var t=arguments.length,n=new Array(t),o=0;o.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:10px;background-color:transparent;z-index:1060;overflow-x:hidden;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem;box-sizing:border-box}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-popup .swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-popup .swal2-title{display:block;position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-popup .swal2-actions{flex-wrap:wrap;align-items:center;justify-content:center;margin:1.25em auto 0;z-index:1}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-popup .swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-confirm{width:2.5em;height:2.5em;margin:.46875em;padding:0;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;box-sizing:border-box;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-popup .swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-popup .swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{display:inline-block;width:15px;height:15px;margin-left:5px;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff;content:'';-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal}.swal2-popup .swal2-styled{margin:.3125em;padding:.625em 2em;font-weight:500;box-shadow:none}.swal2-popup .swal2-styled:not([disabled]){cursor:pointer}.swal2-popup .swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-popup .swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-popup .swal2-styled::-moz-focus-inner{border:0}.swal2-popup .swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-popup .swal2-image{max-width:100%;margin:1.25em auto}.swal2-popup .swal2-close{position:absolute;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer;overflow:hidden}.swal2-popup .swal2-close:hover{-webkit-transform:none;transform:none;color:#f27474}.swal2-popup>.swal2-checkbox,.swal2-popup>.swal2-file,.swal2-popup>.swal2-input,.swal2-popup>.swal2-radio,.swal2-popup>.swal2-select,.swal2-popup>.swal2-textarea{display:none}.swal2-popup .swal2-content{justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:300;line-height:normal;z-index:1;word-wrap:break-word}.swal2-popup #swal2-content{text-align:center}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-radio,.swal2-popup .swal2-select,.swal2-popup .swal2-textarea{margin:1em auto}.swal2-popup .swal2-file,.swal2-popup .swal2-input,.swal2-popup .swal2-textarea{width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;font-size:1.125em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);box-sizing:border-box}.swal2-popup .swal2-file.swal2-inputerror,.swal2-popup .swal2-input.swal2-inputerror,.swal2-popup .swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-popup .swal2-file:focus,.swal2-popup .swal2-input:focus,.swal2-popup .swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-popup .swal2-file::-webkit-input-placeholder,.swal2-popup .swal2-input::-webkit-input-placeholder,.swal2-popup .swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-popup .swal2-file:-ms-input-placeholder,.swal2-popup .swal2-input:-ms-input-placeholder,.swal2-popup .swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::-ms-input-placeholder,.swal2-popup .swal2-input::-ms-input-placeholder,.swal2-popup .swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-popup .swal2-file::placeholder,.swal2-popup .swal2-input::placeholder,.swal2-popup .swal2-textarea::placeholder{color:#ccc}.swal2-popup .swal2-range input{width:80%}.swal2-popup .swal2-range output{width:20%;font-weight:600;text-align:center}.swal2-popup .swal2-range input,.swal2-popup .swal2-range output{height:2.625em;margin:1em auto;padding:0;font-size:1.125em;line-height:2.625em}.swal2-popup .swal2-input{height:2.625em;padding:0 .75em}.swal2-popup .swal2-input[type=number]{max-width:10em}.swal2-popup .swal2-file{font-size:1.125em}.swal2-popup .swal2-textarea{height:6.75em;padding:.75em}.swal2-popup .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;color:#545454;font-size:1.125em}.swal2-popup .swal2-checkbox,.swal2-popup .swal2-radio{align-items:center;justify-content:center}.swal2-popup .swal2-checkbox label,.swal2-popup .swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-popup .swal2-checkbox input,.swal2-popup .swal2-radio input{margin:0 .4em}.swal2-popup .swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;overflow:hidden}.swal2-popup .swal2-validation-message::before{display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center;content:'!';zoom:normal}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;line-height:5em;cursor:default;box-sizing:content-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;zoom:normal}.swal2-icon-text{font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:3.75em 3.75em;transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 3.75em;transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;top:-.25em;left:-.25em;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%;z-index:2;box-sizing:content-box}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;top:.5em;left:1.625em;width:.4375em;height:5.625em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);z-index:1}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;height:.3125em;border-radius:.125em;background-color:#a5dc86;z-index:2}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-progresssteps{align-items:center;margin:0 0 1.25em;padding:0;font-weight:600}.swal2-progresssteps li{display:inline-block;position:relative}.swal2-progresssteps .swal2-progresscircle{width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center;z-index:20}.swal2-progresssteps .swal2-progresscircle:first-child{margin-left:0}.swal2-progresssteps .swal2-progresscircle:last-child{margin-right:0}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep{background:#3085d6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progresscircle{background:#add8e6}.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep~.swal2-progressline{background:#add8e6}.swal2-progresssteps .swal2-progressline{width:2.5em;height:.4em;margin:0 -1px;background:#3085d6;z-index:10}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:initial!important}}"); diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_change.html b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_change.html new file mode 100644 index 0000000..a5bfbbf --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_change.html @@ -0,0 +1,81 @@ +{% include 'mcp_header.html' %} + +

      {{ lang('MCP_APS_POINTS_CHANGE', aps_name()) }}

      + +
      + {% if S_APS_SEARCH %} + {% include '@phpbbstudio_aps/mcp/mcp_aps_find_username.html' %} + {% else %} + {% INCLUDEJS '@phpbbstudio_aps/js/aps_mcp.js' %} + + {% if S_APS_LOGS %} +
      +
      + {% include '@phpbbstudio_aps/mcp/mcp_aps_logs_list.html' with {'logs_array': logs} %} +
      +
      + {% endif %} + +
      +
      +
      + {% if APS_USERNAME %} +
      +
      {{ lang('USERNAME') ~ lang('COLON') }}
      +
      {{ APS_USERNAME }}
      +
      +
      +
      {{ aps_name() ~ lang('COLON') }}
      +
      {{ APS_POINTS }}
      +
      + {% else %} +
      +
      {{ lang('GROUP') ~ lang('COLON') }}
      +
      {{ APS_GROUP }}
      +
      + {% endif %} +
      +
      + +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + +   + + {{ S_FORM_TOKEN }} +
      + {% endif %} +
      + +{% include 'mcp_footer.html' %} + diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_find_username.html b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_find_username.html new file mode 100644 index 0000000..058b838 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_find_username.html @@ -0,0 +1,42 @@ +{% INCLUDECSS '@phpbbstudio_aps/aps_display.css' %} + +
      +
      + {% if S_ERROR %} +
      +

      {{ ERROR_MSG }}

      +
      + {% endif %} + +
      +
      +
      +
      +
      [ {{ lang('FIND_USERNAME') }} ]
      +
      +
      + +
      + +   + +
      + +
      + +
      +
      +
      +
      +
      +
      + +
      + +   + +
      + + {{ S_FORM_TOKEN }} +
      +
      diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_front.html b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_front.html new file mode 100644 index 0000000..ddd4914 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_front.html @@ -0,0 +1,56 @@ +{% include 'mcp_header.html' %} + +

      {{ lang('MAIN') }}

      + +{% EVENT phpbbstudio_aps_mcp_front_before %} + +{% if S_APS_LOGS %} +
      +
      +

      {{ lang('LATEST_LOGS') }}

      + + {% include '@phpbbstudio_aps/mcp/mcp_aps_logs_list.html' with {'logs_array': logs} %} +
      +
      + + {% EVENT phpbbstudio_aps_mcp_front_between_logs %} + +
      +
      +

      {{ lang('MCP_APS_LATEST_ADJUSTED', 5) }}

      + + {% include '@phpbbstudio_aps/mcp/mcp_aps_logs_list.html' with {'logs_array': moderated} %} +
      +
      +{% endif %} + +{% EVENT phpbbstudio_aps_mcp_front_between %} + +
      +
      +
      +

      {{ lang('MCP_APS_USERS_TOP', 5) }}

      +
        + {% for user in aps_users_top %} +
      • {{ loop.index }}. {{ aps_display(user.POINTS) }} {{ user.NAME }}
      • + {% else %} +
      • {{ lang('NO_ONLINE_USERS') }}
      • + {% endfor %} +
      +
      +
      +

      {{ lang('MCP_APS_USERS_BOTTOM', 5) }}

      +
        + {% for user in aps_users_bottom %} +
      • {{ loop.index }}. {{ aps_display(user.POINTS) }} {{ user.NAME }}
      • + {% else %} +
      • {{ lang('NO_ONLINE_USERS') }}
      • + {% endfor %} +
      +
      +
      +
      + +{% EVENT phpbbstudio_aps_mcp_front_after %} + +{% include 'mcp_footer.html' %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs.html b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs.html new file mode 100644 index 0000000..b720d4a --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs.html @@ -0,0 +1,40 @@ +{% include 'mcp_header.html' %} + +

      {{ lang('MCP_APS_LOGS') }}

      + +
      +
      +
      + + + {% if pagination %} + + {% endif %} + + {% include '@phpbbstudio_aps/mcp/mcp_aps_logs_list.html' with {'logs_array': logs} %} + + {% if pagination %} + + {% endif %} + +
      + {{ lang('DISPLAY_LOG') ~ lang('COLON') }} {{ S_LIMIT_DAYS }}   + {{ lang('SORT_BY') ~ lang('COLON') }} {{ S_SORT_KEY }} {{ S_SORT_DIR }} + + {{ S_FORM_TOKEN }} +
      +
      +
      +
      + +{% include 'mcp_footer.html' %} diff --git a/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs_list.html b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs_list.html new file mode 100644 index 0000000..6e0ac4c --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/template/mcp/mcp_aps_logs_list.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + {% for log in logs_array %} + + + + + + + + + + {% else %} + + + + {% endfor %} + +
      {{ lang('REASON') }}
      {{ log.USER }} + {{ lang(log.ACTION, aps_name()) }} + {% if not log.S_SELF and log.REPORTEE %}
      » {{ lang('FROM') ~ ' ' ~ log.REPORTEE }}{% endif %} +
      {{ user.format_date(log.TIME) }}{{ aps_display(log.POINTS_OLD, false) }}{{ aps_display(log.POINTS_SUM, false) }}{{ aps_display(log.POINTS_NEW, false) }} + {% if log.FORUM_NAME %}» {{ log.FORUM_NAME }}
      {% endif %} + {% if log.TOPIC_TITLE %}» {{ log.TOPIC_TITLE }}
      {% endif %} + {% if log.POST_SUBJECT %}» {{ log.POST_SUBJECT }}
      {% endif %} + {% if not log.FORUM_NAME and not log.TOPIC_TITLE and not log.POST_SUBJECT %}{{ lang('NA') }}{% endif %} +
      {{ lang('NO_ENTRIES') }}
      diff --git a/ext/phpbbstudio/aps/styles/prosilver/theme/aps_display.css b/ext/phpbbstudio/aps/styles/prosilver/theme/aps_display.css new file mode 100644 index 0000000..8e24c05 --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/theme/aps_display.css @@ -0,0 +1,738 @@ +/* Colours and border radius */ +:root { + --white: #ffffff; + --white-darken-1: #f9f9f9; + --white-darken-2: #fefefe; + --white-darken-3: #ebedf2; + --white-darken-4: #ececec; + --white-darken-5: #e0e0e0; + --white-darken-6: #c9c9c9; + + --blue: #12a3eb; + --blue-darken-1: #0076b1; + + --border-radius-style: 7px; + --border-radius-aps-panels: 4px; +} + +/* Helpers */ +.nojs .aps-js { display: none; } + +.aps-block { display: block; } +.aps-inline { display: inline-block; } +.aps-relative { position: relative; } + +.aps-center { text-align: center; } +.aps-bold { font-weight: bold; } +.aps-italic { font-style: italic; } + +.aps-cursor-normal { cursor: auto; } +.aps-cursor-banned { cursor: not-allowed; } +.aps-cursor-pointer { cursor: pointer; } +.aps-cursor-help { cursor: help; } + +.aps-mar-top { margin-top: 16px; } +.aps-mar-bot { margin-bottom: 16px; } +.aps-mar-left { margin-left: 16px; } +.aps-mar-right { margin-right: 16px; } + +.aps-no-mar { margin: 0 !important; } +.aps-no-mar-bot { margin-bottom: 0 !important; } +.aps-no-mar-top { margin-top: 0 !important; } +.aps-no-mar-left { margin-left: 0 !important; } +.aps-no-mar-right { margin-right: 0 !important; } + +.aps-no-mar-edge { + margin-top: 0; + margin-bottom: 0; +} + +.aps-no-mar-side { + margin-right: 0; + margin-left: 0; +} + +.aps-no-padding { padding: 0 !important; } +.aps-padding { padding: 8px 16px; } + +.aps-padding-edge { + padding-top: 8px; + padding-bottom: 8px; +} + +.aps-padding-side { + padding-right: 16px; + padding-left: 16px; +} + +.aps-ellipsis, +.aps-ellipsis * { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.aps-positive, +.aps-negative { font-weight: bold; } +.aps-positive { color: #28a745; } +.aps-negative { color: #d31141; } + +.aps-podium-0 { color: #313131; } +.aps-podium-1 { color: #d6af36; } +.aps-podium-2 { color: #a7a7ad; } +.aps-podium-3 { color: #824a02; } + +.aps-main, +.aps-main *, +.aps-main *:after, +.aps-main *:before { + box-sizing: border-box; +} + +.aps-main { + font-size: 13px; + font-weight: 300; + line-height: 1.5; + background: var(--white-darken-1); + border-radius: var(--border-radius-style); + color: #212529; + position: relative; + z-index: 0; + margin: 10px 0; +} + +.aps-footer { + font-size: 0.9em; + text-align: right; + background: var(--white); + border-bottom-right-radius: var(--border-radius-style); + border-bottom-left-radius: var(--border-radius-style); + -webkit-box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.1); + box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.1); + color: #999999; + padding: 8px 16px; +} + +.aps-footer i { + font-size: 0.9em; + color: var(--blue); +} + +.aps-footer a { + color: #999999; +} + +.aps-footer a:hover { + color: #313131; + text-decoration-color: var(--blue); +} + +.aps-nav { + border-bottom: 1px solid var(--blue-darken-1); + border-radius: 0; + margin: 0; + padding: 0; +} + +.aps-menu { + background: var(--white); + border-top-left-radius: var(--border-radius-style); + border-top-right-radius: var(--border-radius-style); + -webkit-box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.1); + box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.1); + position: relative; + z-index: 1; +} + +.aps-menu-before { + line-height: 48px; + text-align: center; + width: 32px; + height: 48px; + margin-left: 8px; +} + +.aps-menu-icon { + line-height: 56px; + text-align: center; + background: linear-gradient(var(--white-darken-2), var(--white) 75%); + position: absolute; + z-index: 2; + top: 0; + left: 56px; + display: inline-block; + width: 64px; + height: 56px; +} + +.aps-menu-icon > div { + width: 48px; + margin: 0 8px; +} + +.aps-menu-icon > div:after, +.aps-menu-icon > div:before, +.aps-menu-icon:after, +.aps-menu-icon:before { + background: inherit; + position: absolute; + z-index: -2; + top: 0; + right: -12px; + width: 100%; + height: 56px; + content: ""; + -webkit-transform: skewX(-10deg); + -moz-transform: skewX(-10deg); + -ms-transform: skewX(-10deg); + transform: skewX(-10deg); +} + +.aps-menu-icon:after { + border-right: 1px solid var(--white-darken-1); + -webkit-box-shadow: 1px 0 0 rgba(69, 65, 78, 0.1); + box-shadow: 1px 0 0 rgba(69, 65, 78, 0.1); +} + +.aps-menu-icon:before { + border-left: 1px solid var(--white-darken-1); + -webkit-box-shadow: -1px 0 0 rgba(69, 65, 78, 0.1); + box-shadow: -1px 0 0 rgba(69, 65, 78, 0.1); + right: unset; + left: -12px; + -webkit-transform: skewX(10deg); + -moz-transform: skewX(10deg); + -ms-transform: skewX(10deg); + transform: skewX(10deg); +} + +.aps-menu-icon > div:after { + border-right: 1px solid var(--white-darken-4); + -webkit-box-shadow: 2px 0 0 rgba(69, 65, 78, 0.05); + box-shadow: 2px 0 0 rgba(69, 65, 78, 0.05); + z-index: -1; + right: -4px; + -webkit-transform: skewX(-7deg); + -moz-transform: skewX(-7deg); + -ms-transform: skewX(-7deg); + transform: skewX(-7deg); +} + +.aps-menu-icon > div:before { + border-left: 1px solid var(--white-darken-4); + -webkit-box-shadow: -2px 0 0 rgba(69, 65, 78, 0.05); + box-shadow: -2px 0 0 rgba(69, 65, 78, 0.05); + z-index: -1; + right: unset; + left: -4px; + -webkit-transform: skewX(7deg); + -moz-transform: skewX(7deg); + -ms-transform: skewX(7deg); + transform: skewX(7deg); +} + +.aps-menu-icon:after, +.aps-menu-icon:before { + height: 52px; +} + +.aps-menu-icon i { + font-size: 32px; + vertical-align: -6px; + -webkit-background-clip: text; + -moz-background-clip: text; + background-clip: text; + border: none; + text-shadow: 2px 2px 3px rgba(255, 255, 255, 0.5); + color: transparent; +} + +.aps-lists-container { + display: flex; + flex-flow: row nowrap; +} + +.aps-lists-container > .aps-list { + flex: 1 1 auto; +} + +.aps-lists-container > .aps-list-right { + flex-basis: 0; +} + +.aps-list { + display: flex; + justify-content: flex-start; + align-items: stretch; + list-style: none; + align-content: flex-start; + flex-flow: row wrap; +} + +.aps-list-right { + justify-content: flex-end; +} + +.aps-list > li { + flex: 0 1 auto; +} + +.aps-list-item { + line-height: 48px; + text-align: center; + white-space: nowrap; + text-decoration: none; + display: block; + min-width: 64px; + height: 48px; + padding: 0 16px; +} + +.aps-menu > .aps-list:not(.aps-list-right) > :first-child { + margin-left: 89px; +} + +.aps-menu .aps-list-item { + font-weight: bold; + text-decoration: none; + color: var(--blue-darken-1); + position: relative; + padding: 0 16px 0 24px; +} + +.aps-menu .aps-list-item:hover { + text-decoration: none; + color: var(--blue); +} + +.aps-menu .aps-list-item:not(.aps-list-active) i { + transition: all 0.2s ease-in-out; +} + +.aps-menu .aps-list-item:not(.aps-list-active):hover i { + font-size: 1.2em; +} + +.aps-menu .aps-list-item:after { + border-right: 1px solid var(--white-darken-4); + border-left: 1px solid var(--white-darken-4); + -webkit-box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.08); + box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.08); + position: absolute; + z-index: -1; + top: 0; + right: -4px; + width: 100%; + height: 100%; + content: ""; + -webkit-transform: skewX(-10deg); + -moz-transform: skewX(-10deg); + -ms-transform: skewX(-10deg); + transform: skewX(-10deg); +} + +.aps-menu .aps-list-active { + margin-right: 2px; +} + +.aps-menu .aps-list-active:after { + border-color: var(--blue-darken-1); + -webkit-box-shadow: 5px 1px 8px 1px rgba(69, 65, 78, 0.08), -5px 1px 8px 1px rgba(69, 65, 78, 0.08); + box-shadow: 5px 1px 8px 1px rgba(69, 65, 78, 0.08), -5px 1px 8px 1px rgba(69, 65, 78, 0.08); +} + +.aps-menu .aps-list-item > span { + display: none; +} + +@media only screen and (min-width: 601px) { + .aps-menu .aps-list-active > span { + display: inline-block; + } +} + +@media only screen and (max-width: 600px) { + .aps-menu { + flex-flow: row wrap; + } + + .aps-menu .aps-list:not(.aps-list-right) { + flex-basis: 100%; + order: 1; + } + + .aps-menu > .aps-list:not(.aps-list-right) > :first-child { + margin-left: 0; + } +} + +.aps-menu .aps-list-right > li:last-child .aps-list-item { + background: var(--white); + border-top-right-radius: var(--border-radius-style); +} + +.aps-menu .aps-list-right > li:last-child .aps-list-item:after { + border-right: none; + border-left-color: var(--blue-darken-1); + right: unset; + left: -5px; +} + +.aps-nav .aps-list-item { + text-decoration: none; + color: #ececec; +} + +.aps-nav .aps-list-item:hover { + text-decoration: none; + color: #ffffff; +} + +.aps-nav .aps-list-active { + font-weight: bold; + text-shadow: 1px 1px 1px var(--blue); + color: #ffffff; +} + +.aps-body { + margin: 6px; + padding: 15px; +} + +.aps-panel-placeholder, +.aps-panel { + background-color: var(--white); + border: 1px solid var(--white-darken-4); + border-radius: var(--border-radius-aps-panels); + -webkit-box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.08); + box-shadow: 0 1px 15px 1px rgba(69, 65, 78, 0.08); + position: relative; +} + +.aps-panel-header, +.aps-panel-content, +.aps-panel-footer { + position: relative; + padding: 8px 10px; +} + +.aps-panel-header, +.aps-panel-footer { + background: var(--white-darken-2); +} + +.aps-panel-header { + border-bottom: 1px solid var(--white-darken-3); + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.aps-panel-header > h3 { + font-weight: bold; + letter-spacing: 0.05rem; + text-transform: none; + border: none; + color: #333333; + display: inline-block; + margin: 0; + padding: 0; +} + +.aps-panel-footer { + border-top: 1px solid var(--white-darken-3); + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} + +.aps-panel-footer, +.aps-panel-footer label { + color: #999999; +} + +.aps-panel-content { + color: #7b7e8a; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + max-height: 500px; + -ms-overflow-style: -ms-autohiding-scrollbar; + scrollbar-color: rgba(0, 0, 0, 0.4) transparent; + scrollbar-width: 4px; +} + +.aps-panel-action, +a.aps-panel-action { + color: #999999; + float: right; + margin-right: 5px; + cursor: pointer; +} + +.aps-panel-delete:hover { + color: #d31141; +} + +.aps-panel-move:hover { + color: var(--blue); + cursor: grab; +} + +.aps-panel-add { + padding: 0 12px; +} + +.aps-panel-add-pulse, +.aps-panel-add .aps-panel-action:hover { + color: #28a745; +} + +.aps-panel-add .aps-button-red { + display: inline-block; + margin: 5px; + cursor: not-allowed; +} + +.aps-panel-add li { + margin: 5px; +} + +.aps-body > .aps-row > .aps-panel-empty, +.aps-panel-add .aps-panel-empty { + display: none; +} + +.aps-panel-add .aps-panel-empty:only-child { + display: list-item; +} + +.aps-panel-add > .dropdown { + margin-top: 16px; +} + +.aps-panel-add > .dropdown > .pointer { + right: 22px; +} + +.aps-body > .aps-row > .aps-panel-empty:only-child { + display: block; +} + +.aps-panel-placeholder { + background: var(--white-darken-5); + border: 1px dashed var(--white-darken-6); +} + +.aps-panel-content::-webkit-scrollbar { width: 6px; } +.aps-panel-content::-webkit-scrollbar-track { background: transparent; } + +.aps-panel-content::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.4); + border-radius: 4px; +} + +.aps-panel-add-pulse { + box-shadow: 0 0 0 #28a745; /* same as rgba(40, 167, 69) below */ + animation: pulse 1.5s infinite; +} + +.aps-panel-add-pulse:hover { + animation: none; +} + +.aps-panel-add-pulse i { + padding-left: 3px; +} + +@keyframes pulse { + 0% { + -moz-box-shadow: 0 0 0 0 rgba(40, 167, 69, 0.4); + box-shadow: 0 0 0 0 rgba(40, 167, 69, 0.4); + } + + 70% { + -moz-box-shadow: 0 0 0 10px rgba(40, 167, 69, 0); + box-shadow: 0 0 0 10px rgba(40, 167, 69, 0); + } + + 100% { + -moz-box-shadow: 0 0 0 0 rgba(40, 167, 69, 0); + box-shadow: 0 0 0 0 rgba(40, 167, 69, 0); + } +} + +/** + * Materialize collections + */ +.aps-collection { + border: 1px solid var(--white-darken-5); + border-radius: var(--border-radius-aps-panels); + position: relative; + overflow: hidden; + margin: 0.5rem 0 1rem; +} + +.aps-collection .aps-collection-item { + line-height: 1.5rem; + background-color: var(--white); + border-bottom: 1px solid var(--white-darken-5); + margin: 0; + padding: 10px 20px; +} + +.aps-collection .aps-collection-item.aps-avatar { + position: relative; + min-height: 64px; + padding-left: 72px; +} + +.aps-collection .aps-collection-item.aps-avatar .avatar { + vertical-align: middle; + position: absolute; + left: 15px; + display: inline-block; + overflow: hidden; + width: 42px; + height: 42px; +} + +.aps-collection .aps-collection-item.aps-avatar i.circle { + font-size: 18px; + line-height: 42px; + text-align: center; + background-color: #999999; + color: #ffffff; +} + +.aps-collection .aps-collection-item.aps-avatar .title { + font-size: 16px; +} + +.aps-collection .aps-collection-item.aps-avatar p { + margin: 0; +} + +.aps-collection .aps-collection-item.aps-avatar .aps-secondary-content { + position: absolute; + top: 16px; + right: 16px; +} + +.aps-collection .aps-collection-item:last-child { + border-bottom: none; +} + +.aps-collection .aps-collection-item.active { + background-color: #26a69a; + color: #eafaf9; +} + +.aps-collection .aps-collection-item.active .secondary-content { + color: #ffffff; +} + +.aps-collection a.aps-collection-item { + display: block; + -webkit-transition: 0.25s; + transition: 0.25s; +} + +.aps-collection a.aps-collection-item:not(.active):hover { + background-color: #dddddd; +} + +.aps-collection.aps-with-header .aps-collection-header { + background-color: #ffffff; + border-bottom: 1px solid #e0e0e0; + padding: 10px 20px; +} + +.aps-collection.aps-with-header .aps-collection-item { + padding-left: 30px; +} + +.aps-collection.aps-with-header .aps-collection-item.aps-avatar { + padding-left: 72px; +} + +.aps-row { + display: flex; + justify-content: space-between; + align-items: flex-start; + align-content: flex-start; + flex-flow: row wrap; +} + +.aps-col { + flex: 0 auto; + min-height: 1px; + margin-bottom: 1.25rem; + padding: 0 0.75rem; +} + +.aps-col.s1 { flex-basis: calc(100% / 12); } +.aps-col.s2 { flex-basis: calc(100% / 12 * 2); } +.aps-col.s3 { flex-basis: 25%; } +.aps-col.s4 { flex-basis: calc(100% / 12 * 4); } +.aps-col.s5 { flex-basis: calc(100% / 12 * 5); } +.aps-col.s6 { flex-basis: 50%; } +.aps-col.s7 { flex-basis: calc(100% / 12 * 7); } +.aps-col.s8 { flex-basis: calc(100% / 12 * 8); } +.aps-col.s9 { flex-basis: 75%; } +.aps-col.s10 { flex-basis: calc(100% / 12 * 10); } +.aps-col.s11 { flex-basis: calc(100% / 12 * 11); } +.aps-col.s12 { flex-basis: 100%; } + +.aps-hide-s { display: none; } + +@media only screen and (min-width: 601px) { + .aps-col.m1 { flex-basis: calc(100% / 12); } + .aps-col.m2 { flex-basis: calc(100% / 12 * 2); } + .aps-col.m3 { flex-basis: 25%; } + .aps-col.m4 { flex-basis: calc(100% / 12 * 4); } + .aps-col.m5 { flex-basis: calc(100% / 12 * 5); } + .aps-col.m6 { flex-basis: 50%; } + .aps-col.m7 { flex-basis: calc(100% / 12 * 7); } + .aps-col.m8 { flex-basis: calc(100% / 12 * 8); } + .aps-col.m9 { flex-basis: 75%; } + .aps-col.m10 { flex-basis: calc(100% / 12 * 10); } + .aps-col.m11 { flex-basis: calc(100% / 12 * 11); } + .aps-col.m12 { flex-basis: 100%; } + + .aps-hide-s { display: block; } + .aps-hide-m { display: none; } +} + +@media only screen and (min-width: 993px) { + .aps-col.l1 { flex-basis: calc(100% / 12); } + .aps-col.l2 { flex-basis: calc(100% / 12 * 2); } + .aps-col.l3 { flex-basis: 25%; } + .aps-col.l4 { flex-basis: calc(100% / 12 * 4); } + .aps-col.l5 { flex-basis: calc(100% / 12 * 5); } + .aps-col.l6 { flex-basis: 50%; } + .aps-col.l7 { flex-basis: calc(100% / 12 * 7); } + .aps-col.l8 { flex-basis: calc(100% / 12 * 8); } + .aps-col.l9 { flex-basis: 75%; } + .aps-col.l10 { flex-basis: calc(100% / 12 * 10); } + .aps-col.l11 { flex-basis: calc(100% / 12 * 11); } + .aps-col.l12 { flex-basis: 100%; } + + .aps-hide-m { display: block; } + .aps-hide-l { display: none; } +} + +@media only screen and (min-width: 1201px) { + .aps-col.xl1 { flex-basis: calc(100% / 12); } + .aps-col.xl2 { flex-basis: calc(100% / 12 * 2); } + .aps-col.xl3 { flex-basis: 25%; } + .aps-col.xl4 { flex-basis: calc(100% / 12 * 4); } + .aps-col.xl5 { flex-basis: calc(100% / 12 * 5); } + .aps-col.xl6 { flex-basis: 50%; } + .aps-col.xl7 { flex-basis: calc(100% / 12 * 7); } + .aps-col.xl8 { flex-basis: calc(100% / 12 * 8); } + .aps-col.xl9 { flex-basis: 75%; } + .aps-col.xl10 { flex-basis: calc(100% / 12 * 10); } + .aps-col.xl11 { flex-basis: calc(100% / 12 * 11); } + .aps-col.xl12 { flex-basis: 100%; } + + .aps-hide-l { display: block; } + .aps-hide-xl { display: none; } +} diff --git a/ext/phpbbstudio/aps/styles/prosilver/theme/aps_form.css b/ext/phpbbstudio/aps/styles/prosilver/theme/aps_form.css new file mode 100644 index 0000000..2c086ec --- /dev/null +++ b/ext/phpbbstudio/aps/styles/prosilver/theme/aps_form.css @@ -0,0 +1,184 @@ +.aps-form *, +.aps-form *:before, +.aps-form *:after { + box-sizing: border-box; +} + +.aps-radio { display: none; } + +.aps-radio:checked + .aps-button-blue { + background: #12a3eb; + border-color: #12a3eb; + color: #ffffff; +} + +/* Fix for double borders due to border-box */ +.aps-form dt { + border-right: none; +} + +.aps-form dd, +.aps-form dd label { + font-size: 14px; + line-height: 1.42857143; +} + +.aps-form dd label { + display: inline-block; + height: 34px; + padding: 6px; +} + +.aps-form dd label input[type="radio"] { + height: initial; + margin-right: 3px; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green, +.aps-form input:not(.iconpicker-search), +.aps-form select, +.aps-form textarea { + font-size: 14px; + line-height: 1.42857143; + color: #555555; + height: 34px; + padding: 6px 12px; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green, +.aps-form input[type="text"], +.aps-form input[type="number"], +.aps-form input[type="search"], +.aps-form input[type="submit"], +.aps-form input[type="reset"], +.aps-form select, +.aps-form textarea { + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-sizing: border-box; + -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.aps-form input:not([type="checkbox"]):not([type="radio"]):focus, +.aps-form select:focus, +.aps-form textarea:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +} + +.aps-form select:focus { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.aps-form select[multiple] { + height: auto; + min-height: 170px; +} + +.has-js select[multiple] { + max-height: 340px; +} + +.aps-form textarea { + height: auto; + resize: vertical; +} + +/* Buttons */ +.aps-button-green, +a.aps-button-green, +.aps-form input[type="submit"] { + border-color: #28a745; + color: #28a745; +} + +.aps-button-green:hover, +a.aps-button-green:hover, +.aps-button-green.aps-button-active, +.aps-form input[type="submit"]:hover { + background-color: #28a745; + color: #ffffff; +} + +.aps-button-red, +a.aps-button-red, +.aps-form input[type="reset"], +.aps-form input[name="cancel"] { + border-color: #d31141; + color: #d31141; +} + +.aps-button-red:hover, +a.aps-button-red:hover, +.aps-button-red.aps-button-active, +.aps-form input[type="reset"]:hover, +.aps-form input[name="cancel"]:hover { + background-color: #d31141; + color: #ffffff; +} + +.aps-button-blue { + border-color: #12a3eb; + color: #12a3eb; +} + +.aps-button-blue:hover, +.aps-button-blue.aps-button-active { + background-color: #12a3eb; + color: #ffffff; +} + +[class*="aps-button-"] .caret { + padding-left: 6px; +} + +[class*="aps-button-"]:hover .caret { + border-color: #ffffff; +} + +.aps-button-red, +.aps-button-blue, +.aps-button-green { + text-decoration: none !important; + cursor: pointer; +} + +/* Form dropdown(s) */ +.aps-form .dropdown-container { + vertical-align: -2px; + display: inline-block; + float: none; +} + +/* Multiple select scrollbar */ +.aps-form select[multiple] { + scrollbar-color: #666666 #cccccc; + scrollbar-width: 10px; +} + +.aps-form select[multiple]::-webkit-scrollbar { + width: 10px; +} + +.aps-form select[multiple]::-webkit-scrollbar-thumb { + background: #666666; + border-radius: 0 4px 4px 0; +} + +.aps-form select[multiple]::-webkit-scrollbar-track { + background: #cccccc; + border-radius: 0 4px 4px 0; +} diff --git a/ext/phpbbstudio/ass/acp/main_info.php b/ext/phpbbstudio/ass/acp/main_info.php new file mode 100644 index 0000000..a1d01e0 --- /dev/null +++ b/ext/phpbbstudio/ass/acp/main_info.php @@ -0,0 +1,57 @@ + '\phpbbstudio\ass\acp\main_module', + 'title' => 'ACP_ASS_SYSTEM', + 'modes' => [ + 'overview' => [ + 'title' => 'ACP_ASS_OVERVIEW', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_overview', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + 'settings' => [ + 'title' => 'ACP_ASS_SETTINGS', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_settings', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + 'items' => [ + 'title' => 'ACP_ASS_ITEMS', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_items', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + 'files' => [ + 'title' => 'ACP_ASS_FILES', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_files', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + 'logs' => [ + 'title' => 'ACP_ASS_LOGS', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_logs', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + 'inventory' => [ + 'title' => 'ACP_ASS_INVENTORY', + 'auth' => 'ext_phpbbstudio/ass && acl_a_ass_inventory', + 'cat' => ['ACP_ASS_SYSTEM'], + ], + ], + ]; + } +} diff --git a/ext/phpbbstudio/ass/acp/main_module.php b/ext/phpbbstudio/ass/acp/main_module.php new file mode 100644 index 0000000..ab395ab --- /dev/null +++ b/ext/phpbbstudio/ass/acp/main_module.php @@ -0,0 +1,51 @@ +get('language'); + + $request = $phpbb_container->get('request'); + + if ($request->variable('action', '', true) === 'select_file') + { + $mode = 'files'; + } + + /** @var \phpbbstudio\ass\controller\acp_settings_controller $controller */ + $controller = $phpbb_container->get("phpbbstudio.ass.controller.acp.{$mode}"); + + // Set the page title and template + $this->tpl_name = 'ass_' . $mode; + $this->page_title = $language->lang('ACP_ASS_SYSTEM') . ' • ' . $language->lang('ACP_ASS_' . utf8_strtoupper($mode)); + + // Make the custom form action available in the controller and handle the mode + $controller->set_page_url($this->u_action)->{$mode}(); + } +} diff --git a/ext/phpbbstudio/ass/adm/style/ass_errors.html b/ext/phpbbstudio/ass/adm/style/ass_errors.html new file mode 100644 index 0000000..9a71e80 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_errors.html @@ -0,0 +1,14 @@ +{% if ERRORS %} +
      +

      {{ lang('ERROR') }}

      +

      + {% if ERRORS is iterable %} + {% for error in ERRORS %} + {{ lang(error) }}{% if not loop.last %}
      {% endif %} + {% endfor %} + {% else %} + {{ lang(ERRORS) }} + {% endif %} +

      +
      +{% endif %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_files.html b/ext/phpbbstudio/ass/adm/style/ass_files.html new file mode 100644 index 0000000..bc5546a --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_files.html @@ -0,0 +1,199 @@ +{% if S_FILE_SELECT %} + {{ include('simple_header.html') }} + + + + +{% else %} + {{ include('overall_header.html') }} + +

      {{ PAGE_TITLE }}

      +

      {{ lang('ACP_ASS_FILES_' ~ (S_FILE_MODE ? S_FILE_MODE|upper ~ '_') ~ 'EXPLAIN') }}

      +{% endif %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} + +{% if S_FILE_INDEX %} + +{% else %} +
      + {{ lang('ACP_ASS_FILES') }} + +
      + {% if not S_FILE_SELECT %} +
      + +
      + {% endif %} + + + {%- for crumb in DIRECTORIES -%} + + + {% if loop.last %} + {{ crumb }} + {% else %} + {{ crumb }} + {%- endif -%} + + {% endfor %} +
      + +
      + {% spaceless %} + {% if DIRECTORIES|length %} + + + + {% else %} + + + + {% endif %} + {% if not S_FILE_SELECT %} +
      + + + + {{ S_FORM_TOKEN }} +
      +
      + + + + {{ S_FORM_TOKEN }} +
      + {% endif %} + {% endspaceless %} +
      + +
      + + + + {% if not S_FILE_SELECT %}{% endif %} + + + + + + + {% for folder in ass_folders %} + {% if loop.first %} + + + + {% endif %} + + {% if not S_FILE_SELECT %} + + {% endif %} + + + + + {% endfor %} + + {% for file in ass_files %} + {% if loop.first %} + + + + {% endif %} + + {% if S_FILE_SELECT %} + {% if loop.first %} + + + + {% endif %} + {% else %} + + + + + + + {% endif %} + {% endfor %} + +
      {{ lang('ACTIONS') }}{{ lang('ASS_FILENAME') }}{{ lang('ASS_FILETIME') }}{{ lang('ASS_FILESIZE') }}
      {{ lang('ASS_FOLDERS') }}
      + + + + + + {{ folder.NAME }} + {{ folder.TIME }}
      {{ lang('ASS_FILES') }}
      +
      + {% endif %} + +
      + +
      + + {% if loop.last %} +
      +
      + + + + + + {{ file.NAME }} + {{ file.TIME }}{{ file.SIZE }}
      + + {% if S_FILE_SELECT %} +

      + +

      + {% endif %} +
      +
      +{% endif %} + +{% if S_FILE_SELECT %} + {{ include('simple_footer.html') }} +{% else %} + {{ include('overall_footer.html') }} +{% endif %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_inventory.html b/ext/phpbbstudio/ass/adm/style/ass_inventory.html new file mode 100644 index 0000000..f9747bb --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_inventory.html @@ -0,0 +1,206 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} + +

      {{ PAGE_TITLE }}

      +

      {{ lang('ACP_ASS_INVENTORY_EXPLAIN') }}

      + +{% if not S_TYPE %} + +
      + +
      + +{% else %} + +
      + + + {{ lang('BACK') }} + +
      + +
      + {{ include('@phpbbstudio_ass/ass_errors.html') }} + + {% if S_TYPE == 'global' %} + {% INCLUDECSS '@phpbbstudio_ass/css/select2.min.css' %} + {% INCLUDEJS '@phpbbstudio_ass/js/select2.min.js' %} + {% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %} + +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      + {% else %} + + {% if U_FIND_USER %} +
      +
      +
      +
      + + +
      +
      +
      + {% else %} + {% INCLUDECSS '@phpbbstudio_ass/css/select2.min.css' %} + {% INCLUDEJS '@phpbbstudio_ass/js/select2.min.js' %} + {% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %} + +
      + + + + + + + + + + + + + + + {% for category in categories if category.S_INVENTORY %} + {% for item in category.items if item.S_INVENTORY %} + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endfor %} + +
      {{ lang('ENABLED') }}{{ lang('ACP_ASS_CONFLICT') }}{{ lang('ASS_ITEM') }}{{ lang('ASS_PURCHASE_TIME') }}{{ lang('ASS_USED_LAST') }}{{ lang('ASS_USAGES') }}{{ lang('ASS_GIFT') }}{{ lang('ACTIONS') }}
      + + + + + {{ category.TITLE }} + + {{ item.TITLE }} + {{ item.PURCHASE_TIME }}{{ item.USE_TIME }}{{ item.USE_COUNT }}{{ item.GIFTER }} + + + {{ lang('DELETE') }} + +
      +
      + +
      + {{ lang('ADD') }} +
      +
      +
      + +
      +
      + + +
      + {% endif %} + + {% endif %} + +
      +

      + {{ S_FORM_TOKEN }} + +   + +

      +
      +
      + +{% endif %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_item_form.html b/ext/phpbbstudio/ass/adm/style/ass_item_form.html new file mode 100644 index 0000000..b54963c --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_item_form.html @@ -0,0 +1,351 @@ +{% INCLUDECSS '@phpbbstudio_ass/css/select2.min.css' %} +{% INCLUDEJS '@phpbbstudio_ass/js/select2.min.js' %} +{% INCLUDEJS '@phpbbstudio_ass/js/ass_help.js' %} + + + +{% macro desc(string, italic) %} +
      {{ lang('ACP_ASS_ITEM_' ~ string ~ '_DESC') }} +{% endmacro %} + +{% from _self import desc as desc %} + +
      + {{ lang('ACP_ASS_SETTINGS_TYPE') }} + +
      +
      +
      + +
      +
      +
      + {% if T_ITEM_TEMPLATE %} + {{ include(T_ITEM_TEMPLATE, ignore_missing = true) }} + {% endif %} +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_DEFAULT') }} + +
      +
      +
      {{ aps_icon() }}
      +
      +
      +
      {{ desc('STOCK_UNLIMITED') }}
      +
      + + +
      +
      +
      +
      {{ desc('STOCK') }}
      +
      +
      +
      +
      {{ desc('STOCK_THRESHOLD') }}
      +
      +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_GIFT') }} + +
      +
      {{ desc('GIFT') }}
      +
      + + +
      +
      +
      +
      {{ desc('GIFT_ONLY') }}
      +
      + + +
      +
      +
      +
      {{ desc('GIFT_TYPE') }}
      +
      + + +
      +
      +
      +
      {{ desc('GIFT_PERCENTAGE') }}
      +
      +
      +
      +
      {{ desc('GIFT_PRICE') }}
      +
      {{ aps_icon() }}
      +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_SPECIAL') }} + +
      +
      {{ desc('SALE_PRICE') }}
      +
      {{ aps_icon() }}
      +
      + {% set timezone = + '
      ' ~ + '
      ' ~ lang('ACP_ASS_ITEM_TIMEZONE_BOARD') ~ lang('COLON') ~ '
      ' ~ "now"|date(DATE_FORMAT, TIMEZONE) ~ '
      ' ~ + '
      ' ~ lang('ACP_ASS_ITEM_TIMEZONE_YOUR') ~ lang('COLON') ~ '
      ' ~ "now"|date(DATE_FORMAT) ~ '
      ' ~ + '
      ' + %} +
      +
      + {{ desc('SALE') ~ desc('TIMEZONE', true) }} + +
      +
      + {% spaceless %} + + + +   + + {# #} + + {% endspaceless %} +
      +
      +
      +
      + {{ desc('FEATURED') ~ desc('TIMEZONE', true) }} + +
      +
      + {% spaceless %} + +   + + {# #} + + {% endspaceless %} +
      +
      +
      +
      + {{ desc('AVAILABLE') ~ desc('TIMEZONE', true) }} + +
      +
      + {% spaceless %} + +   + + {# #} + + {% endspaceless %} +
      +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_INVENTORY') }} + +
      +
      {{ desc('COUNT') ~ desc('COUNT_ZERO', true) }}
      +
      +
      +
      +
      {{ desc('STACK') }}
      +
      +
      + + {# These strings should NOT be translated, as strtotime() only accept English. #} + {% set str_to_time = ['1 year', '1 week', '5 days 12 hours', '3 weeks 6 days 23 hours 59 minutes 59 seconds'] %} + {% set str_to_time = str_to_time|join('”
      ') %} + {% set str_to_time = '
      ' ~ str_to_time ~ '”' %} + +
      +
      + {{ desc('REFUND') ~ desc('STR_TO_TIME', true) }} + +
      +
      +
      +
      +
      + {{ desc('EXPIRE') ~ desc('STR_TO_TIME', true) }} + +
      +
      +
      +
      +
      + {{ desc('DELETE') ~ desc('STR_TO_TIME', true) }} + +
      +
      +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_DISPLAY') }} + +
      +
      {{ desc('BACKGROUND') }}
      +
      + +
      +
      +
      +
      + {% for image in ITEM_IMAGES %} +
      + {% spaceless %} + + {# #} + + {% endspaceless %} +
      + {% endfor %} +
      + {% spaceless %} + + {# #} + + {% endspaceless %} +
      +
      + +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + +{% if S_ASS_EDIT %} +
      +
      +
      +
      {{ user.format_date(ITEM_CREATE_TIME) }}
      +
      {{ lang('ASS_ITEM_EDIT_TIME') ~ lang('COLON') }}
      {{ ITEM_EDIT_TIME ? user.format_date(ITEM_EDIT_TIME) : lang('NEVER') }}
      +
       
      +
      +
      +
      +
      +
      +
      {{ lang('ASS_FEATURED') ~ lang('COLON') }}
      +
      {{ lang('ACP_ASS_AVAILABLE') ~ lang('COLON') }}
      +
      +
      +
      +
      +
      +
      +
      {{ not ITEM_STOCK_UNLIMITED ? ITEM_STOCK_INITIAL : lang('ASS_UNLIMITED') }}
      +
      {{ lang('ASS_STOCK_CURRENT') ~ lang('COLON') }}
      {{ not ITEM_STOCK_UNLIMITED ? ITEM_STOCK : lang('ASS_UNLIMITED') }}
      +
      {{ lang('ASS_PURCHASES') ~ lang('COLON') }}
      {{ ITEM_PURCHASES }}
      +
      +
      +
      +
      +
      {{ aps_display(ITEM_SALE_PRICE) }}
      +
      {{ lang('ASS_SALE_DISCOUNT') ~ lang('COLON') }}
      {{ aps_display(ITEM_SALE_DIFF) }}
      +
      {{ lang('ASS_SALE_PERCENTAGE') ~ lang('COLON') }}
      -{{ ITEM_SALE_PCT }}%
      +
      +
      +
      +{% endif %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_items.html b/ext/phpbbstudio/ass/adm/style/ass_items.html new file mode 100644 index 0000000..37e077b --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_items.html @@ -0,0 +1,208 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} +{% INCLUDEJS '@phpbbstudio_aps/js/jquery-ui-sortable.min.js' %} +{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %} + +{% set mode = S_ITEMS ? 'ITEMS' : 'CATEGORIES' %} +{% set type = S_ITEMS ? 'ITEM' : 'CATEGORY' %} + + + + {{ lang('BACK') }} + + +

      {{ lang('ACP_ASS_SYSTEM') }} • {{ lang('ACP_ASS_' ~ mode) }}

      +

      {{ lang('ACP_ASS_' ~ mode ~ '_EXPLAIN') }}

      + +{% if S_ASS_ADD or S_ASS_EDIT %} +
      + {% INCLUDECSS '@phpbbstudio_aps/css/aps_iconpicker.css' %} + {% INCLUDECSS '@phpbbstudio_aps/css/fontawesome-iconpicker.min.css' %} + {% INCLUDECSS '@phpbbstudio_ass/css/daterangepicker.css' %} + {% INCLUDEJS '@phpbbstudio_aps/js/fontawesome-iconpicker.min.js' %} + {% INCLUDEJS '@phpbbstudio_ass/js/moment.min.js' %} + {% INCLUDEJS '@phpbbstudio_ass/js/daterangepicker.js' %} + + + + {{ include('@phpbbstudio_ass/ass_errors.html', {ERRORS: ASS_ERRORS}) }} + + {% if ITEM_CONFLICT %} +
      +
      +

      {{ lang('ACP_ASS_CONFLICT') }}

      +

      {{ lang('ACP_ASS_CONFLICT_DESC', U_ITEM_ERROR_LOG, lang('ACP_ASS_SETTINGS_TYPE')) }}

      +
      + +
      + {% endif %} + +
      + {{ lang('GENERAL_SETTINGS') }} + + {% if S_ITEMS %} + + {% endif %} + +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + {% include 'acp_posting_buttons.html' %} + +
      + + +
      +
      +
      + + {% if S_ITEMS %} + {{ include('@phpbbstudio_ass/ass_item_form.html') }} + {% endif %} + +
      + {{ lang('ACP_SUBMIT_CHANGES') }} + +

      +   + + {{ S_FORM_TOKEN }} +

      +
      +
      +{% else %} + +
      +
      + {% set rowset = S_ITEMS ? ass_items : ass_categories %} + + + + + + + {% if S_ITEMS %} + + {% endif %} + + + + + + + + {% for row in rowset %} + + + + {% if S_ITEMS %} + + {% endif %} + + + + + + {% else %} + + + + {% endfor %} + +
      {{ lang('ENABLED') }}{{ lang('ACP_ASS_CONFLICT' ~ (not S_ITEMS ? 'S')) }}{{ lang('ACP_ASS_AVAILABLE') }}{{ lang('ACP_ASS_' ~ type ~ '_ICON') }}{{ lang('ACP_ASS_' ~ type ~ '_TITLE') }}{{ lang('ACP_ASS_' ~ type ~ '_SLUG') }}{{ lang('ACTIONS') }}
      + + + + + + + {% if row.ICON %} + + {% else %} + - + {% endif %} + + + {{ row.TITLE }} + + + {{ row.SLUG }} + + {% spaceless %} + {% if row.S_AUTH %} + + + {{ lang('EDIT') }} + +   + {% if S_ITEMS %} + + + {{ lang('ACP_ASS_COPY') }} + +   + {% endif %} + + + {{ lang('DELETE') }} + +   + {% endif %} + + + {{ lang('MOVE') }} + + {% endspaceless %} +
      {{ lang('ASS_' ~ mode ~ '_NONE') }}
      + +
      + +
      + {{ lang('ADD') }} +
      +
      +
      + +{% endif %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_logs.html b/ext/phpbbstudio/ass/adm/style/ass_logs.html new file mode 100644 index 0000000..62ddc82 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_logs.html @@ -0,0 +1,113 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} + +

      {{ PAGE_TITLE }}

      +

      {{ lang('ACP_ASS_LOGS_EXPLAIN') }}

      + +
      + + + + + + + + + + + + + + + {% for log in ass_logs %} + + + + + + + + + {% else %} + + + + {% endfor %} + +
      {{ lang('USERNAME') }}{{ lang('TIME') }}{{ lang('ACTION') }}{{ lang('ASS_ITEM_TITLE') }}{{ lang('ASS_ITEM_PRICE') }}{{ lang('MARK') }}
      {{ log.USER }}{% if not log.S_SELF and log.REPORTEE %}
      » {{ lang('FROM') ~ ' ' ~ log.REPORTEE }}{% endif %}
      {{ log.LOG_TIME }} + {% if log.S_PURCHASE %} + {% if log.RECIPIENT %} + {{ lang('ASS_LOG_ITEM_GIFTED', log.RECIPIENT) }} + {% else %} + {{ lang('ASS_LOG_ITEM_PURCHASED') }} + {% endif %} + {% else %} + {{ lang('ASS_LOG_ITEM_USED') ~ lang('COLON') }} {{ log.LOG_ACTION }} + {% endif %} + + {{ log.CATEGORY_TITLE }} + + {{ log.ITEM_TITLE }} + {{ aps_display(log.POINTS_SUM, false) }}
      +
      +

      {{ lang('NO_ENTRIES') }}

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

      {{ lang('MARK_ALL') }}{{ lang('UNMARK_ALL') }}

      +
      +
      + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_overview.html b/ext/phpbbstudio/ass/adm/style/ass_overview.html new file mode 100644 index 0000000..b2646d9 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_overview.html @@ -0,0 +1,440 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} + +

      {{ PAGE_TITLE }}

      +

      {{ lang('ACP_ASS_OVERVIEW_EXPLAIN') }}

      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {{ lang('STATISTIC') }}{{ lang('VALUE') }}{{ lang('STATISTIC') }}{{ lang('VALUE') }}
      {{ lang('ACP_ASS_NUMBER_ITEMS') ~ lang('COLON') }}{{ COUNTS['items'] }}{{ lang('ACP_ASS_NUMBER_CONFLICTS') ~ lang('COLON') }}{{ COUNTS['errors'] }}
      {{ lang('ACP_ASS_NUMBER_SALE') ~ lang('COLON') }}{{ COUNTS['sale'] }}{{ lang('ACP_ASS_NUMBER_SPENT', aps_name()) ~ lang('COLON') }}{{ aps_display(COUNTS['spent'], false) }}
      {{ lang('ACP_ASS_NUMBER_FEATURED') ~ lang('COLON') }}{{ COUNTS['featured'] }}{{ lang('ACP_ASS_SHOP_ENABLED') ~ lang('COLON') }}
      {{ lang('ACP_ASS_NUMBER_CATEGORIES') ~ lang('COLON') }}{{ COUNTS['categories'] }}{{ lang('ACP_ASS_SHOP_ACTIVE') ~ lang('COLON') }}
      {{ lang('ACP_ASS_NUMBER_PURCHASES') ~ lang('COLON') }}{{ COUNTS['purchases'] }}{{ lang('ACP_ASS_GIFTING_ENABLED') ~ lang('COLON') }}
      + +
      + {{ lang('ACP_ASS_NOTES') }} + +
      + {% if S_NOTES %} + + {% else %} + +
      + {% if NOTES %} + {{ NOTES }} + {% else %} + {{ lang('ACP_ASS_NOTES_NO') ~ lang('ELLIPSIS') }} + {% endif %} +
      + {% endif %} + + {% if S_NOTES %} +
      + + + {{ lang('CANCEL') }} +
      + {% endif %} +
      +
      + +
      + {{ lang('ACP_ASS_PANEL_FEATURED') }} + +
        + {% for item in featured %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.FEATURED_UNTIL_UNIX) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_FEATURED_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_FEATURED_UPCOMING') }} + +
        + {% for item in featured_coming %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.FEATURED_START_UNIX) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_FEATURED_UPCOMING_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_PANEL_SALE') }} + +
        + {% for item in sale %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.SALE_UNTIL_UNIX) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_SALE_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_SALE_UPCOMING') }} + +
        + {% for item in sale_coming %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.SALE_START_UNIX) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_SALE_UPCOMING_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_LOW_STOCK') }} + +
        + {% for item in low_stock %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        {{ item.TITLE }}
        +
        {{ item.STOCK }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_LOW_STOCK_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_GIFTERS') }} + +
        + {% for user in gifters %} +
      • +
        + {% if user.AVATAR %} + {{ user.AVATAR }} + {% else %} + + {% endif %} +
        +
        {{ user.NAME }}
        +
        {{ user.COUNT }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_GIFTERS_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_BUYERS') }} + +
        + {% for user in buyers %} +
      • +
        + {% if user.AVATAR %} + {{ user.AVATAR }} + {% else %} + + {% endif %} +
        +
        {{ user.NAME }}
        +
        {{ user.COUNT }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_BUYERS_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_SPENDERS') }} + +
        + {% for user in spenders %} +
      • +
        + {% if user.AVATAR %} + {{ user.AVATAR }} + {% else %} + + {% endif %} +
        +
        {{ user.NAME }}
        +
        {{ aps_display(user.COUNT, false) }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_BIGGEST_SPENDERS_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_SELLERS_LOW') }} + +
        + {% for item in low_sellers %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        {{ item.TITLE }}
        +
        {{ item.PURCHASES }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_SELLERS_LOW_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_SELLERS_TOP') }} + +
        + {% for item in top_sellers %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        {{ item.TITLE }}
        +
        {{ item.PURCHASES }}
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_SELLERS_TOP_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_RECENT_ITEMS') }} + +
        + {% for item in recent %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.CREATE_TIME) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_RECENT_ITEMS_NO') }} +
        +
      • + {% endfor %} +
      +
      + +
      + {{ lang('ACP_ASS_OVERVIEW_RECENT_PURCHASES') }} + +
        + {% for item in purchases %} +
      • +
        + {% if item.BACKGROUND_SRC %} + {{ item.TITLE }} + {% else %} + + {% endif %} +
        +
        +
        + {{ item.TITLE }}
        + + + {{ user.format_date(item.PURCHASE_TIME) }} + +
        +
        +
      • + {% else %} +
      • +
        + {{ lang('ACP_ASS_OVERVIEW_RECENT_PURCHASES_NO') }} +
        +
      • + {% endfor %} +
      +
      +
      + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/ass/adm/style/ass_settings.html b/ext/phpbbstudio/ass/adm/style/ass_settings.html new file mode 100644 index 0000000..7b5e82e --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/ass_settings.html @@ -0,0 +1,350 @@ +{% include 'overall_header.html' %} + +{% INCLUDECSS '@phpbbstudio_aps/css/aps_form.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_common.css' %} +{% INCLUDECSS '@phpbbstudio_ass/css/ass_common.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/aps_iconpicker.css' %} +{% INCLUDECSS '@phpbbstudio_aps/css/fontawesome-iconpicker.min.css' %} +{% INCLUDEJS '@phpbbstudio_aps/js/fontawesome-iconpicker.min.js' %} +{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %} + +{% if S_ASS_LOCATIONS %} + {% include '@phpbbstudio_aps/aps_locations.html' %} +{% else %} + +

      {{ PAGE_TITLE }}

      +

      {{ lang('ACP_ASS_SETTINGS_EXPLAIN') }}

      + +
      + {{ include('@phpbbstudio_ass/ass_errors.html') }} + +
      + {{ lang('GENERAL_SETTINGS') }} + +
      +
      + +
      {{ lang('ACP_ASS_SHOP_ENABLED_DESC') }} +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_SHOP_ACTIVE_DESC') }} +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_SHOP_INACTIVE_DESC_DESC') }} +
      +
      + + {% include 'acp_posting_buttons.html' %} +
      +
      +
      +
      + {{ lang('ACP_ASS_LOCATIONS') }} +
      {{ lang('ACP_ASS_LOCATIONS_DESC') }} +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_PURGE_CACHE_DESC') }} +
      +
      + + +
      +
      +
      +
      +
      + + {{ ITEMS_PER_PAGE }} +
      +
      +
      +
      +
      + + {{ LOGS_PER_PAGE }} +
      +
      +
      + +
      + {{ lang('ACP_ASS_SETTINGS_SHOP') }} + + {% for row in SHOP_BLOCKS|batch(2) %} + {% for type, data in row %} +
      +
      {{ lang('ACP_ASS_PANEL_' ~ type|upper) }}
      +
      + + +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      + {% if type == 'random' %} + + {% endif %} + + {% if type != 'random' %} + + {% endif %} +
      +
      +
      +
      +
      + + {{ LIMIT[type] }} +
      +
      +
      + {% endfor %} + {% endfor %} +
      + +
      + {{ lang('ACP_ASS_SETTINGS_CAROUSEL') }} + +
      +
      + +
      {{ lang('ACP_ASS_CAROUSEL_ARROWS_DESC') }} +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_CAROUSEL_DOTS_DESC') }} +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_CAROUSEL_FADE_DESC') }} +
      +
      + + +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_CAROUSEL_PLAY_DESC') }} +
      +
      + + +
      +
      +
      +
      +
      {{ lang('ACP_ASS_CAROUSEL_PLAY_SPEED_DESC') }} +
      +
      + + {{ CAROUSEL_PLAY_SPEED }} +
      +
      +
      +
      + +
      {{ lang('ACP_ASS_CAROUSEL_SPEED_DESC') }} +
      +
      + + {{ CAROUSEL_SPEED }} +
      +
      +
      + +
      + {{ lang('ACP_SUBMIT_CHANGES') }} + +

      +   + + {{ S_FORM_TOKEN }} +

      +
      +
      + +{% endif %} + +{% include 'overall_footer.html' %} diff --git a/ext/phpbbstudio/ass/adm/style/css/ass_common.css b/ext/phpbbstudio/ass/adm/style/css/ass_common.css new file mode 100644 index 0000000..9f32a17 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/css/ass_common.css @@ -0,0 +1,590 @@ +/** + * + * phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package. + * + * @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com + * @license GNU General Public License, version 2 (GPL-2.0) + * + */ +.name i { font-size: 14px; } + +.ass-pointer { + cursor: pointer; +} + +.ass-width-200 { + width: 200px; +} + +.ass-width-90p { + width: 90%; +} + +.ass-vertical-resize { + resize: vertical; +} + +.ass-inline { + display: inline-block; +} + +.ass-label-fix { + vertical-align: 2px; + padding-right: 0; +} + +.ass-actions { + padding: 8px; +} + +.ass-no-mar { + margin: 0; +} + +.ass-mar { + margin: 8px; +} + +.ass-mar-left { + margin-left: 8px; +} + +.ass-mar-right { + margin-right: 8px; +} + +.ass-mar-right-half { + margin-right: 4px; +} + +.ass-mar-side { + margin-right: 8px; + margin-left: 8px; +} + +.ass-no-radius-top { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.ass-no-radius-right { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.ass-no-radius-bottom { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.ass-no-radius-left { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.ass-color-palette table { + border-color: #12a3eb; + border-radius: 4px; + min-width: 90%; + max-width: 90%; + margin: 0 0 4px; + padding: 4px; +} + +.ass-color-palette a { + width: 100% !important; +} + +.ass-radio { display: none; } + +.ass-radio:checked + .aps-button-blue, +input[type="button"]:hover { + background: #12a3eb; + border-color: #12a3eb; + color: #ffffff; +} + +input[type="button"] { + background-color: #ffffff; + background-image: none; + border: 1px solid #12a3eb; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} + +.ass-input-icon i { + font-size: 14px; + line-height: 1.42857143; + text-align: center; + vertical-align: -1px; + background-color: #f3f3f3; + border: 1px solid #cccccc; + border-right: none; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + color: #555555; + display: inline-block; + width: auto; + min-width: 40px; + height: 34px; + padding: 6px 12px; +} + +.ass-input-icon i + input[type="text"], +.ass-input-icon i + input[type="number"] { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.ass-file-select-container { + display: flex; + flex-flow: row wrap; +} + +.ass-file-select { + flex: 1 0 210px; +} + +.ass-file-select input { + display: none; +} + +.ass-file-select input + * { + border: 2px solid transparent; + display: inline-block; + width: 200px; + height: auto; +} + +.ass-file-select input:checked + * { + border-color: #12a3eb; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); +} + +.ass-button-pulse:not(:hover) { + animation: bgPulse 3s linear 3; +} + +@keyframes bgPulse { + 0% { background-color: #ffffff; } + 50% { background-color: #8dcc8d; } + 100% { background-color: #ffffff; } +} + +/* Panel icons */ +.icon-blue { color: #196db5; } +.icon-green { color: #1b9a1b; } +.icon-red { color: #bc2a4d; } +.icon-orange { color: #ff6600; } +.icon-bluegray { color: #536482; } +.icon-gray { color: #777777; } +.icon-lightgray { color: #999999; } +.icon-black { color: #333333; } +.icon-white { color: #ffffff; } +.icon-lighten { color: rgba(255, 255, 255, 0.75); } +.icon-darken { color: rgba(0, 0, 0, 0.5); } +.icon-aqua { color: #18a39b; } +.icon-yellow { color: #f8b739; } +.icon-pink { color: #ed2861; } +.icon-violet { color: #c12680; } +.icon-purple { color: #5d3191; } +.icon-gold { color: #d6af36; } +.icon-silver { color: #a7a7ad; } +.icon-bronze { color: #824a02; } + +.shop-panel-icon { + text-align: center; + position: absolute; + top: 0; + right: 16px; + width: 36px; +} + +.shop-panel-icon:before { + font-size: 20px; + line-height: 30px; + position: relative; + z-index: 1; +} + +.shop-panel-icon-small:before { + font-size: 16px; + line-height: 22px; +} + +.shop-panel-icon-tiny:before { + font-size: 13px; + line-height: 18px; +} + +.shop-panel-icon:after { + font-family: FontAwesome, sans-serif; + font-size: 48px; + text-shadow: -2px 1px 4px rgba(0, 0, 0, 0.4); + color: #12a3eb; + position: absolute; + top: -4px; + left: 0; + content: "\f02e"; +} + +.shop-panel-icon-small:after, +.shop-panel-icon-tiny:after { + text-shadow: -1px 1px 3px rgba(0, 0, 0, 0.4); +} + +.shop-panel-icon-small { width: 30px; } +.shop-panel-icon-tiny { width: 25px; } + +.shop-panel-icon-small:after { font-size: 40px; } +.shop-panel-icon-tiny:after { font-size: 32px; } + +.shop-panel-icon-blue:after { color: #12a3eb; } +.shop-panel-icon-red:after { color: #d31141; } +.shop-panel-icon-green:after { color: #28a745; } +.shop-panel-icon-orange:after { color: #f06045; } +.shop-panel-icon-aqua:after { color: #18a39b; } +.shop-panel-icon-yellow:after { color: #f8b739; } +.shop-panel-icon-pink:after { color: #ed2861; } +.shop-panel-icon-violet:after { color: #c12680; } +.shop-panel-icon-purple:after { color: #5d3191; } +.shop-panel-icon-gold:after { color: #d6af36; } +.shop-panel-icon-silver:after { color: #a7a7ad; } +.shop-panel-icon-bronze:after { color: #824a02; } + +/* Date picker */ +.daterangepicker .calendar-table th { + text-transform: none; + background: #12a3eb; + padding: 0; +} + +.daterangepicker .drp-calendar.left .calendar-table th:empty { display: none; } +.daterangepicker .drp-calendar.right .calendar-table th:empty { background: none; } +.daterangepicker .calendar-table td { padding: 0; } +.daterangepicker .calendar-table .active { background: #0076b1; } + +/* Slider */ +output { + font-weight: bold; + text-align: center; + display: block; +} + +.shop-slider { + width: 100%; + margin: 0; + padding: 0; + -webkit-appearance: none; +} + +.aps-form [type="range"].shop-slider { + border: none; + margin-top: 4px; + padding: 0; +} + +.shop-slider:focus { + outline: none; +} + +.shop-slider::-webkit-slider-runnable-track { + background: #ffffff; + border: 1px solid #cccccc; + border-radius: 4px; + box-shadow: 0 0 0 #000000, 0 0 0 #0d0d0d; + width: 100%; + height: 34px; + cursor: pointer; +} + +.shop-slider::-webkit-slider-thumb { + background: #12a3eb; + border: 1px solid rgba(0, 118, 177, 0.57); + border-radius: 4px; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5), 0 0 1px rgba(13, 13, 13, 0.5); + width: 24px; + height: 24px; + margin-top: 4px; + cursor: pointer; + -webkit-appearance: none; +} + +.shop-slider:focus::-webkit-slider-runnable-track { + background: #ffffff; +} + +.shop-slider::-moz-range-track { + background: #ffffff; + border: 1px solid #cccccc; + border-radius: 4px; + width: 100%; + height: 34px; + cursor: pointer; +} + +.shop-slider::-moz-range-thumb { + background: #12a3eb; + border: 1px solid rgba(0, 118, 177, 0.57); + border-radius: 4px; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5), 0 0 1px rgba(13, 13, 13, 0.5); + width: 24px; + height: 24px; + cursor: pointer; +} + +.shop-slider::-ms-track { + background: transparent; + border-color: transparent; + color: transparent; + width: 100%; + height: 34px; + cursor: pointer; +} + +.shop-slider::-ms-fill-lower { + background: #f2f2f2; + border: 1px solid #cccccc; + border-radius: 8px; +} + +.shop-slider::-ms-fill-upper { + background: #ffffff; + border: 1px solid #cccccc; + border-radius: 8px; +} + +.shop-slider::-ms-thumb { + background: #12a3eb; + border: 1px solid rgba(0, 118, 177, 0.57); + border-radius: 4px; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5), 0 0 1px rgba(13, 13, 13, 0.5); + width: 24px; + height: 24px; + cursor: pointer; +} + +.shop-slider:focus::-ms-fill-lower { background: #ffffff; } +.shop-slider:focus::-ms-fill-upper { background: #ffffff; } + +/* Overview page */ +.ass-overview, +.ass-overview * { + box-sizing: border-box; +} + +.ass-overview { + display: flex; + justify-content: space-between; + align-items: stretch; + flex-flow: row wrap; +} + +.ass-overview > * { + flex: 0 0 24%; +} + +.ass-overview > .ass-overview-50 { flex-basis: calc(50% - (4% / 6)); } + +@media all and (max-width: 1200px) { + .ass-overview > * { flex-basis: calc(50% - (4% / 6)); } +} + +@media all and (max-width: 700px) { + .ass-overview > .ass-overview-50, + .ass-overview > * { flex-basis: 100%; } +} + +.ass-overview-list { + min-height: 305px; + list-style: none; +} + +.ass-overview-list > :not(:last-child) { + border-bottom: 1px solid #d7d7d7; + margin-bottom: 5px; + padding-bottom: 5px; +} + +.ass-overview-flex { + display: flex; +} + +.ass-overview-flex-auto { + flex: 1 1 auto; + padding: 0 8px; +} + +.ass-overview-flex-small { + text-align: center; + flex: 0 0 52px; +} + +.ass-overview-flex-small img { + width: 50px; + height: auto; + max-height: 52px; +} + +.ass-overview-flex-auto, +.ass-overview-flex-small { + display: flex; + align-items: center; + height: 52px; +} + +.ass-overview-flex-auto > *, +.ass-overview-flex-small > * { + flex: 1 0 100%; +} + +.ass-overview-flex-full-height { + height: 305px; +} + +/* Item help */ +.ass-help-body { margin-bottom: 400px; } + +.ass-help-toolbox, +.ass-help-toolbox * { + box-sizing: border-box; +} + +.ass-help-toolbox { + background: #fafafa; + border-top: 2px solid #12a3eb; + -webkit-box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); + box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); + position: fixed; + z-index: 50; + right: 0; + bottom: 0; + left: 0; + height: 400px; +} + +.ass-help-flexbox { + position: relative; + z-index: 51; + display: flex; + overflow: hidden; + -webkit-overflow-scrolling: touch; + width: 100%; + height: 100%; + scroll-behavior: smooth; + scroll-snap-type: x mandatory; +} + +.ass-help-flexbox > div { + flex-shrink: 0; + width: 100%; + height: 100%; + scroll-snap-align: start; +} + +.ass-help-flexbox > div > h3 { + font-size: 24px; + text-align: center; + border-bottom: 1px solid #12a3eb; + color: #12a3eb; + width: 75%; + margin: 0 auto; + padding: 16px; +} + +.ass-help-flexbox > div > div { + font-size: 16px; + background: #ffffff; + color: #313131; + height: 100%; + padding: 16px; +} + +.ass-help-flexbox > div > div > a { + font-weight: bold; + letter-spacing: 0.05em; + color: #12a3eb; +} + +.ass-help-flexbox > div > div > i { + font-family: monospace; + color: #000000; + quotes: "“" "”" "‘" "’"; +} + +.ass-help-flexbox > div > div > i:before, +.ass-help-flexbox > div > div > i:after { color: #12a3eb; } + +.ass-help-flexbox > div > div > i:before { content: open-quote; } +.ass-help-flexbox > div > div > i:after { content: close-quote; } + +.ass-help-active { + background: #ffffff; + border: 1px solid #12a3eb; + border-radius: 4px; + -webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + position: relative; + z-index: 45; + margin-right: 32px; + padding: 16px 8px; + transition: all 0.75s ease-in-out; + pointer-events: none; +} + +.ass-help-start { + border-color: #cccccc; + border-bottom: none; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + outline: none; + position: absolute; + top: -26px; + right: 8px; +} + +@media all and (max-width: 1024px) { + .ass-help-start, + .ass-help-toolbox { + display: none; + } +} + +.ass-help-start:hover { border-color: #28a745; } + +.ass-help-next, +.ass-help-prev, +.ass-help-close { + position: fixed; + z-index: 52; + top: 16px; + right: 16px; +} + +.ass-help-next, +.ass-help-prev { + top: unset; + bottom: 350px; +} + +.ass-help-prev { + right: unset; + left: 16px; +} + +/* Inventory */ +.ass-button-inventory { + display: block; + height: auto; + padding: 16px; +} + +.ass-button-inventory > span { + font-size: 24px; + display: block; + margin-bottom: 16px; +} diff --git a/ext/phpbbstudio/ass/adm/style/css/daterangepicker.css b/ext/phpbbstudio/ass/adm/style/css/daterangepicker.css new file mode 100644 index 0000000..a963804 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/css/daterangepicker.css @@ -0,0 +1,410 @@ +.daterangepicker { + position: absolute; + color: inherit; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ddd; + width: 278px; + max-width: none; + padding: 0; + margin-top: 7px; + top: 100px; + left: 20px; + z-index: 3001; + display: none; + font-family: arial; + font-size: 15px; + line-height: 1em; +} + +.daterangepicker:before, .daterangepicker:after { + position: absolute; + display: inline-block; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker:before { + top: -7px; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #ccc; +} + +.daterangepicker:after { + top: -6px; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; +} + +.daterangepicker.opensleft:before { + right: 9px; +} + +.daterangepicker.opensleft:after { + right: 10px; +} + +.daterangepicker.openscenter:before { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.openscenter:after { + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; +} + +.daterangepicker.opensright:before { + left: 9px; +} + +.daterangepicker.opensright:after { + left: 10px; +} + +.daterangepicker.drop-up { + margin-top: -7px; +} + +.daterangepicker.drop-up:before { + top: initial; + bottom: -7px; + border-bottom: initial; + border-top: 7px solid #ccc; +} + +.daterangepicker.drop-up:after { + top: initial; + bottom: -6px; + border-bottom: initial; + border-top: 6px solid #fff; +} + +.daterangepicker.single .daterangepicker .ranges, .daterangepicker.single .drp-calendar { + float: none; +} + +.daterangepicker.single .drp-selected { + display: none; +} + +.daterangepicker.show-calendar .drp-calendar { + display: block; +} + +.daterangepicker.show-calendar .drp-buttons { + display: block; +} + +.daterangepicker.auto-apply .drp-buttons { + display: none; +} + +.daterangepicker .drp-calendar { + display: none; + max-width: 270px; +} + +.daterangepicker .drp-calendar.left { + padding: 8px 0 8px 8px; +} + +.daterangepicker .drp-calendar.right { + padding: 8px; +} + +.daterangepicker .drp-calendar.single .calendar-table { + border: none; +} + +.daterangepicker .calendar-table .next span, .daterangepicker .calendar-table .prev span { + color: #fff; + border: solid black; + border-width: 0 2px 2px 0; + border-radius: 0; + display: inline-block; + padding: 3px; +} + +.daterangepicker .calendar-table .next span { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); +} + +.daterangepicker .calendar-table .prev span { + transform: rotate(135deg); + -webkit-transform: rotate(135deg); +} + +.daterangepicker .calendar-table th, .daterangepicker .calendar-table td { + white-space: nowrap; + text-align: center; + vertical-align: middle; + min-width: 32px; + width: 32px; + height: 24px; + line-height: 24px; + font-size: 12px; + border-radius: 4px; + border: 1px solid transparent; + white-space: nowrap; + cursor: pointer; +} + +.daterangepicker .calendar-table { + border: 1px solid #fff; + border-radius: 4px; + background-color: #fff; +} + +.daterangepicker .calendar-table table { + width: 100%; + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background-color: #eee; + border-color: transparent; + color: inherit; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker td.off, .daterangepicker td.off.in-range, .daterangepicker td.off.start-date, .daterangepicker td.off.end-date { + background-color: #fff; + border-color: transparent; + color: #999; +} + +.daterangepicker td.in-range { + background-color: #ebf4f8; + border-color: transparent; + color: #000; + border-radius: 0; +} + +.daterangepicker td.start-date { + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: transparent; + color: #fff; +} + +.daterangepicker th.month { + width: auto; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; + cursor: not-allowed; + text-decoration: line-through; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin: 0 auto; + background: #eee; + border: 1px solid #eee; + padding: 2px; + outline: 0; + font-size: 12px; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 4px auto 0 auto; + line-height: 30px; + position: relative; +} + +.daterangepicker .calendar-time select.disabled { + color: #ccc; + cursor: not-allowed; +} + +.daterangepicker .drp-buttons { + clear: both; + text-align: right; + padding: 8px; + border-top: 1px solid #ddd; + display: none; + line-height: 12px; + vertical-align: middle; +} + +.daterangepicker .drp-selected { + display: inline-block; + font-size: 12px; + padding-right: 8px; +} + +.daterangepicker .drp-buttons .btn { + margin-left: 8px; + font-size: 12px; + font-weight: bold; + padding: 4px 8px; +} + +.daterangepicker.show-ranges.single.rtl .drp-calendar.left { + border-right: 1px solid #ddd; +} + +.daterangepicker.show-ranges.single.ltr .drp-calendar.left { + border-left: 1px solid #ddd; +} + +.daterangepicker.show-ranges.rtl .drp-calendar.right { + border-right: 1px solid #ddd; +} + +.daterangepicker.show-ranges.ltr .drp-calendar.left { + border-left: 1px solid #ddd; +} + +.daterangepicker .ranges { + float: none; + text-align: left; + margin: 0; +} + +.daterangepicker.show-calendar .ranges { + margin-top: 8px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0 auto; + padding: 0; + width: 100%; +} + +.daterangepicker .ranges li { + font-size: 12px; + padding: 8px 12px; + cursor: pointer; +} + +.daterangepicker .ranges li:hover { + background-color: #eee; +} + +.daterangepicker .ranges li.active { + background-color: #08c; + color: #fff; +} + +/* Larger Screen Styling */ +@media (min-width: 564px) { + .daterangepicker { + width: auto; + } + + .daterangepicker .ranges ul { + width: 140px; + } + + .daterangepicker.single .ranges ul { + width: 100%; + } + + .daterangepicker.single .drp-calendar.left { + clear: none; + } + + .daterangepicker.single .ranges, .daterangepicker.single .drp-calendar { + float: left; + } + + .daterangepicker { + direction: ltr; + text-align: left; + } + + .daterangepicker .drp-calendar.left { + clear: left; + margin-right: 0; + } + + .daterangepicker .drp-calendar.left .calendar-table { + border-right: none; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .daterangepicker .drp-calendar.right { + margin-left: 0; + } + + .daterangepicker .drp-calendar.right .calendar-table { + border-left: none; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + + .daterangepicker .drp-calendar.left .calendar-table { + padding-right: 8px; + } + + .daterangepicker .ranges, .daterangepicker .drp-calendar { + float: left; + } +} + +@media (min-width: 730px) { + .daterangepicker .ranges { + width: auto; + } + + .daterangepicker .ranges { + float: left; + } + + .daterangepicker.rtl .ranges { + float: right; + } + + .daterangepicker .drp-calendar.left { + clear: none !important; + } +} diff --git a/ext/phpbbstudio/ass/adm/style/css/select2.css b/ext/phpbbstudio/ass/adm/style/css/select2.css new file mode 100644 index 0000000..750b320 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/css/select2.css @@ -0,0 +1,481 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-selection--single .select2-selection__clear { + position: relative; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; + padding: 1px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; } + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--default .select2-results__option[role=group] { + padding: 0; } + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; } + +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; } + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } + +.select2-container--classic .select2-dropdown--below { + border-top: none; } + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/ext/phpbbstudio/ass/adm/style/css/select2.min.css b/ext/phpbbstudio/ass/adm/style/css/select2.min.css new file mode 100644 index 0000000..7c18ad5 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/ext/phpbbstudio/ass/adm/style/items/file.html b/ext/phpbbstudio/ass/adm/style/items/file.html new file mode 100644 index 0000000..7b48fb0 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/items/file.html @@ -0,0 +1,6 @@ +
      +
      +
      + +
      +
      diff --git a/ext/phpbbstudio/ass/adm/style/items/points.html b/ext/phpbbstudio/ass/adm/style/items/points.html new file mode 100644 index 0000000..ffe2151 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/items/points.html @@ -0,0 +1,6 @@ +
      +
      +
      + {{ aps_icon() }} +
      +
      diff --git a/ext/phpbbstudio/ass/adm/style/js/ass_common.js b/ext/phpbbstudio/ass/adm/style/js/ass_common.js new file mode 100644 index 0000000..ca79598 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/ass_common.js @@ -0,0 +1,326 @@ +/** + * + * phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package. + * + * @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com + * @license GNU General Public License, version 2 (GPL-2.0) + * + */ +jQuery(function($) { + let studio = { + iconPicker: $('.aps-icon-picker'), + imageAddRow: $('#add_image_row'), + sortRows: $('[data-studio-sortable]'), + selects: $('[data-studio-select]'), + sliders: $('.shop-slider'), + panels: $('[data-studio-panel]'), + dates: { + format: 'DD/MM/YYYY HH:mm', + items: $('.shop-date'), + data: $('[data-shop-date]').data() + }, + types: { + template: $('#type_template'), + select: $('#type') + }, + title: $('#title'), + slug: $('#slug') + }; + + if (studio.iconPicker.length) { + studio.iconPicker.iconpicker({ + collision: true, + placement: 'bottomRight', + component: '.aps-icon-picker + i', + locale: { + cancelLabel: 'Clear', + format: studio.dates.format + } + }); + } + + if (studio.selects.length) { + studio.selects.select2({ + closeOnSelect: false, + }); + } + + /** + * Load the requested Item type template. + * + * @return {void} + */ + studio.types.select.on('change', function() { + $.ajax({ + url: studio.types.template.data('shop-url'), + type: 'POST', + data: { + type: $(this).val() + }, + success: function(r) { + if (r.success) { + studio.ajaxifyFiles(studio.types.template.html(r.body)); + } else if (r.error) { + phpbb.alert(r.MESSAGE_TITLE, r.MESSAGE_TEXT); + } + } + }) + }); + + /** + * Create date range pickers. + * + * @return {void} + */ + studio.dates.items.each(function() { + let $input = $(this).find('input'), + $start = $input.first(), + $until = $input.last(); + + /** + * Localised language strings. + * + * @param studio.dates.data.sun + * @param studio.dates.data.mon + * @param studio.dates.data.tue + * @param studio.dates.data.wed + * @param studio.dates.data.thu + * @param studio.dates.data.fri + * @param studio.dates.data.sat + * @param studio.dates.data.january, + * @param studio.dates.data.february, + * @param studio.dates.data.march, + * @param studio.dates.data.april, + * @param studio.dates.data.may, + * @param studio.dates.data.june, + * @param studio.dates.data.july, + * @param studio.dates.data.august, + * @param studio.dates.data.september, + * @param studio.dates.data.october, + * @param studio.dates.data.november, + * @param studio.dates.data.december + */ + $start.daterangepicker({ + startDate: $start.val() || false, + endDate: $until.val() || false, + timePicker: true, + timePicker24Hour: true, + autoUpdateInput: false, + showWeekNumbers: true, + applyButtonClasses: 'aps-button-green', + cancelButtonClasses: 'aps-button-red', + locale: { + applyLabel: studio.dates.data.apply, + cancelLabel: studio.dates.data.clear, + format: studio.dates.format, + firstDay: 1, + daysOfWeek: [ + studio.dates.data.sun, + studio.dates.data.mon, + studio.dates.data.tue, + studio.dates.data.wed, + studio.dates.data.thu, + studio.dates.data.fri, + studio.dates.data.sat + ], + monthNames: [ + studio.dates.data.january, + studio.dates.data.february, + studio.dates.data.march, + studio.dates.data.april, + studio.dates.data.may, + studio.dates.data.june, + studio.dates.data.july, + studio.dates.data.august, + studio.dates.data.september, + studio.dates.data.october, + studio.dates.data.november, + studio.dates.data.december + ], + } + }).on('apply.daterangepicker', function(e, picker) { + $start.val(picker.startDate.format(studio.dates.format)); + $until.val(picker.endDate.format(studio.dates.format)); + }).on('cancel.daterangepicker', function() { + $start.val(''); + $until.val(''); + }); + + $until.on('click', function() { $start.data('daterangepicker').show(); }); + }); + + /** + * Automatically create a slug from a title/ + * + * @return {void} + */ + if (studio.title.length && studio.slug.length) { + studio.title.on('blur', function() { + let title = $(this).val(); + + studio.slug.val(function(event, slug) { + return (slug) ? slug : title.toLowerCase().replace(/[^a-z0-9-_\s]/gi, '').trim().replace(/[\s]+/g, '-'); + }); + }); + } + + /** + * Make the category and item tables sortables. + * + * @return {void} + */ + if (studio.sortRows.length) { + studio.sortRows.sortable({ + axis: 'y', + containment: $(this).selector, + cursor: 'move', + delay: 150, + handle: '.aps-button-blue', + forcePlaceholderSize: true, + placeholder: 'panel', + tolerance: 'pointer', + update: function(e, ui) { + // On update (when rows changes position), save the order + $.ajax({ + url: $(this).parents('form').attr('action') + '&action=move', + type: 'POST', + data: { + id: ui.item.data('id'), + order: ui.item.index(), + }, + }); + } + }); + } + + /** + * Ajaxify the different panels in the Settings page. + * + * @return {void} + */ + studio.panels.each(function() { + let $banner = $(this).find('i.shop-panel-icon'), + $bannerSize = $(this).find('select[name$="banner_size"]'), + $bannerColour = $(this).find('select[name$="banner_colour"]'), + $iconColour = $(this).find('select[name$="icon_colour"]'), + $icon = $(this).find('.aps-icon-picker'); + + let updateBanner = function() { + let bg = $bannerColour.val(), + size = $bannerSize.val(), + color = $iconColour.val(), + icon = $icon.val(); + + size = size ? `shop-panel-icon-${size}` : ''; + bg = bg ? `shop-panel-icon-${bg}` : ''; + + if ($.inArray(icon, ['', 'fa-li', 'fa-2x', 'fa-3x', 'fa-4x', 'fa-5x']) !== -1) { + $banner.hide(); + } else { + $banner.attr('class', `icon ${icon} icon-${color} shop-panel-icon ${size} ${bg}`).show(); + } + }; + + $bannerSize.add($bannerColour).add($iconColour).on('change', updateBanner); + $icon.on('iconpickerSelected keyup', updateBanner); + }); + + /** + * Show the slider value in the output element after it. + * + * @return {void} + */ + studio.sliders.on('mouseup input', function(e) { + if (e.type === 'mouseup') { + $(this).attr('value', this.value); + $(this).blur(); + } else { + $(this).next('output').text(this.value); + } + }); + + /** + * Add an additional item image input row. + * + * @return {void} + */ + studio.imageAddRow.on('click', function() { + let $parent = $(this).parent(), + $prev = $parent.prev(), + $row = $prev.clone(), + $input = $row.find('input'); + + /** + * Increment a number by one. + * + * @param {?} value + * @return {number} + */ + function increment(value) { + return parseInt(value) + 1; + } + + // Increment the id="" and name="" attributes + $input.attr('id', $input.attr('id').replace(/\d+$/, increment)); + $input.attr('name', $input.attr('name').replace(/\d+(?=]$)/, increment)); + $input.val(''); + + // Ajaxify the file links + studio.ajaxifyLinks(0, $row); + + // And insert the row + $row.insertBefore($parent) + }); + + /** + * Register shop file links as pop up requests. + * + * @param {jQuery=} context + * @return {void} + */ + studio.ajaxifyFiles = function(context) { + $('[data-shop-file]', context).each(studio.ajaxifyLinks); + }; + + /** + * Open a new pop up window for the shop file links. + * + * @param {number} i + * @param {HTMLElement} element + * @return {void} + */ + studio.ajaxifyLinks = function(i, element) { + let $this = $(element), + $input = $this.find('input'); + + $this.find('input').on('click', function() { + let url = $this.data('shop-file') + encodeURIComponent($input.val()) + '&input=' + encodeURIComponent($input.attr('id')); + + window.open(url.replace(/&/g, '&'), 'file', 'height=570,resizable=yes,scrollbars=yes, width=760'); + }); + }; + + studio.ajaxifyFiles(); + + /** + * Add AJAX callback for resolving items. + * + * @return {void} + */ + phpbb.addAjaxCallback('shop_resolve', function() { + $(this).parents('fieldset').hide(); + + let $active = $('#active'); + + // If the item is not active, highlight the activate button. + if ($active.is(':checked') === false) { + let $span = $active.next('span'); + + $span.addClass('ass-button-pulse'); + + $active.on('change', function() { + $span.removeClass('ass-button-pulse'); + }); + } + }); +}); diff --git a/ext/phpbbstudio/ass/adm/style/js/ass_help.js b/ext/phpbbstudio/ass/adm/style/js/ass_help.js new file mode 100644 index 0000000..db3f809 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/ass_help.js @@ -0,0 +1,91 @@ +/** + * + * phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package. + * + * @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com + * @license GNU General Public License, version 2 (GPL-2.0) + * + */ +jQuery(function($) { + let studio = { + buttons: { + close: $('.ass-help-close'), + start: $('.ass-help-start'), + next: $('.ass-help-next'), + prev: $('.ass-help-prev') + }, + classes: { + active: 'ass-help-active', + body: 'ass-help-body' + }, + flexbox: $('.ass-help-flexbox'), + toolbox: $('.ass-help-toolbox'), + wrapper: $('#darkenwrapper'), + index: 0 + }; + + studio.init = function() { + this.wrapper.append(this.toolbox); + + this.items = this.flexbox.children(); + + this.buttons.start.on('click', function() { studio.toggle(true); }); + this.buttons.close.on('click', function() { studio.toggle(false); }); + this.buttons.next.on('click', function() { studio.navigate(1); }); + this.buttons.prev.on('click', function() { studio.navigate(-1); }); + }; + + studio.init(); + + studio.toggle = function(show) { + $('body').toggleClass(studio.classes.body); + + studio.toolbox.toggle(show); + studio.wrapper.toggle(show); + + show ? studio.select() : studio.deselect(); + }; + + studio.navigate = function(direction) { + let length = studio.items.length, + index = studio.index + direction; + + if (index >= 0 && index < length) { + studio.index = index; + + studio.select(); + + studio.scrollToSlide(); + } + + studio.buttons.prev.toggle(studio.index !== 0); + studio.buttons.next.toggle(studio.index !== (length - 1)); + }; + + studio.select = function() { + let $item = $(studio.items.get(studio.index)), + $option = $(`label[for="${$item.data('id')}"]`).parents('dl'); + + studio.deselect(); + + $option.addClass(studio.classes.active).css('max-height', $(window).outerHeight() - (400 + 64 + 64)); + + studio.scrollToTop($option); + }; + + studio.deselect = function() { + $(`.${studio.classes.active}`).removeClass(studio.classes.active).css('max-height', ''); + }; + + studio.scrollToSlide = function() { + studio.flexbox.animate({ + scrollLeft: studio.index * $(window).outerWidth() + }); + }; + + studio.scrollToTop = function($element) { + $('html, body').stop(true).animate({ + scrollTop: $element.offset().top - 64 + }, 1000); + }; +}); diff --git a/ext/phpbbstudio/ass/adm/style/js/daterangepicker.js b/ext/phpbbstudio/ass/adm/style/js/daterangepicker.js new file mode 100644 index 0000000..6aac966 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/daterangepicker.js @@ -0,0 +1,1565 @@ +/** +* @version: 3.0.5 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2019 Dan Grossman. All rights reserved. +* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +* @website: http://www.daterangepicker.com/ +*/ +// Following the UMD template https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Make globaly available as well + define(['moment', 'jquery'], function (moment, jquery) { + if (!jquery.fn) jquery.fn = {}; // webpack server rendering + if (typeof moment !== 'function' && moment.default) moment = moment.default + return factory(moment, jquery); + }); + } else if (typeof module === 'object' && module.exports) { + // Node / Browserify + //isomorphic issue + var jQuery = (typeof window != 'undefined') ? window.jQuery : undefined; + if (!jQuery) { + jQuery = require('jquery'); + if (!jQuery.fn) jQuery.fn = {}; + } + var moment = (typeof window != 'undefined' && typeof window.moment != 'undefined') ? window.moment : require('moment'); + module.exports = factory(moment, jQuery); + } else { + // Browser globals + root.daterangepicker = factory(root.moment, root.jQuery); + } +}(this, function(moment, $) { + var DateRangePicker = function(element, options, cb) { + + //default settings for options + this.parentEl = 'body'; + this.element = $(element); + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.maxSpan = false; + this.autoApply = false; + this.singleDatePicker = false; + this.showDropdowns = false; + this.minYear = moment().subtract(100, 'year').format('YYYY'); + this.maxYear = moment().add(100, 'year').format('YYYY'); + this.showWeekNumbers = false; + this.showISOWeekNumbers = false; + this.showCustomRangeLabel = true; + this.timePicker = false; + this.timePicker24Hour = false; + this.timePickerIncrement = 1; + this.timePickerSeconds = false; + this.linkedCalendars = true; + this.autoUpdateInput = true; + this.alwaysShowCalendars = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = 'btn btn-sm'; + this.applyButtonClasses = 'btn-primary'; + this.cancelButtonClasses = 'btn-default'; + + this.locale = { + direction: 'ltr', + format: moment.localeData().longDateFormat('L'), + separator: ' - ', + applyLabel: 'Apply', + cancelLabel: 'Cancel', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData().firstDayOfWeek() + }; + + this.callback = function() { }; + + //some state information + this.isShowing = false; + this.leftCalendar = {}; + this.rightCalendar = {}; + + //custom options from user + if (typeof options !== 'object' || options === null) + options = {}; + + //allow setting options with data attributes + //data-api options will be overwritten with custom javascript options + options = $.extend(this.element.data(), options); + + //html template for the picker UI + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '' + + '' + + ' ' + + '
      ' + + '
      '; + + this.parentEl = (options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(options.template).appendTo(this.parentEl); + + // + // handle all the possible options overriding defaults + // + + if (typeof options.locale === 'object') { + + if (typeof options.locale.direction === 'string') + this.locale.direction = options.locale.direction; + + if (typeof options.locale.format === 'string') + this.locale.format = options.locale.format; + + if (typeof options.locale.separator === 'string') + this.locale.separator = options.locale.separator; + + if (typeof options.locale.daysOfWeek === 'object') + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + + if (typeof options.locale.monthNames === 'object') + this.locale.monthNames = options.locale.monthNames.slice(); + + if (typeof options.locale.firstDay === 'number') + this.locale.firstDay = options.locale.firstDay; + + if (typeof options.locale.applyLabel === 'string') + this.locale.applyLabel = options.locale.applyLabel; + + if (typeof options.locale.cancelLabel === 'string') + this.locale.cancelLabel = options.locale.cancelLabel; + + if (typeof options.locale.weekLabel === 'string') + this.locale.weekLabel = options.locale.weekLabel; + + if (typeof options.locale.customRangeLabel === 'string'){ + //Support unicode chars in the custom range name. + var elem = document.createElement('textarea'); + elem.innerHTML = options.locale.customRangeLabel; + var rangeHtml = elem.value; + this.locale.customRangeLabel = rangeHtml; + } + } + this.container.addClass(this.locale.direction); + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.locale.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.locale.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.locale.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.locale.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + // sanity check for bad options + if (this.minDate && this.startDate.isBefore(this.minDate)) + this.startDate = this.minDate.clone(); + + // sanity check for bad options + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (typeof options.applyButtonClasses === 'string') + this.applyButtonClasses = options.applyButtonClasses; + + if (typeof options.applyClass === 'string') //backwards compat + this.applyButtonClasses = options.applyClass; + + if (typeof options.cancelButtonClasses === 'string') + this.cancelButtonClasses = options.cancelButtonClasses; + + if (typeof options.cancelClass === 'string') //backwards compat + this.cancelButtonClasses = options.cancelClass; + + if (typeof options.maxSpan === 'object') + this.maxSpan = options.maxSpan; + + if (typeof options.dateLimit === 'object') //backwards compat + this.maxSpan = options.dateLimit; + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') + this.showWeekNumbers = options.showWeekNumbers; + + if (typeof options.showISOWeekNumbers === 'boolean') + this.showISOWeekNumbers = options.showISOWeekNumbers; + + if (typeof options.buttonClasses === 'string') + this.buttonClasses = options.buttonClasses; + + if (typeof options.buttonClasses === 'object') + this.buttonClasses = options.buttonClasses.join(' '); + + if (typeof options.showDropdowns === 'boolean') + this.showDropdowns = options.showDropdowns; + + if (typeof options.minYear === 'number') + this.minYear = options.minYear; + + if (typeof options.maxYear === 'number') + this.maxYear = options.maxYear; + + if (typeof options.showCustomRangeLabel === 'boolean') + this.showCustomRangeLabel = options.showCustomRangeLabel; + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) + this.endDate = this.startDate.clone(); + } + + if (typeof options.timePicker === 'boolean') + this.timePicker = options.timePicker; + + if (typeof options.timePickerSeconds === 'boolean') + this.timePickerSeconds = options.timePickerSeconds; + + if (typeof options.timePickerIncrement === 'number') + this.timePickerIncrement = options.timePickerIncrement; + + if (typeof options.timePicker24Hour === 'boolean') + this.timePicker24Hour = options.timePicker24Hour; + + if (typeof options.autoApply === 'boolean') + this.autoApply = options.autoApply; + + if (typeof options.autoUpdateInput === 'boolean') + this.autoUpdateInput = options.autoUpdateInput; + + if (typeof options.linkedCalendars === 'boolean') + this.linkedCalendars = options.linkedCalendars; + + if (typeof options.isInvalidDate === 'function') + this.isInvalidDate = options.isInvalidDate; + + if (typeof options.isCustomDate === 'function') + this.isCustomDate = options.isCustomDate; + + if (typeof options.alwaysShowCalendars === 'boolean') + this.alwaysShowCalendars = options.alwaysShowCalendars; + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is(':text')) { + var val = $(this.element).val(), + split = val.split(this.locale.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.locale.format); + end = moment(split[1], this.locale.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.locale.format); + end = moment(val, this.locale.format); + } + if (start !== null && end !== null) { + this.setStartDate(start); + this.setEndDate(end); + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.locale.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.locale.format); + else + end = moment(options.ranges[range][1]); + + // If the start or end date exceed those allowed by the minDate or maxSpan + // options, shorten the range to the allowable period. + if (this.minDate && start.isBefore(this.minDate)) + start = this.minDate.clone(); + + var maxDate = this.maxDate; + if (this.maxSpan && maxDate && start.clone().add(this.maxSpan).isAfter(maxDate)) + maxDate = start.clone().add(this.maxSpan); + if (maxDate && end.isAfter(maxDate)) + end = maxDate.clone(); + + // If the end of the range is before the minimum or the start of the range is + // after the maximum, don't display this range option at all. + if ((this.minDate && end.isBefore(this.minDate, this.timepicker ? 'minute' : 'day')) + || (maxDate && start.isAfter(maxDate, this.timepicker ? 'minute' : 'day'))) + continue; + + //Support unicode chars in the range names. + var elem = document.createElement('textarea'); + elem.innerHTML = range; + var rangeHtml = elem.value; + + this.ranges[rangeHtml] = [start, end]; + } + + var list = '
        '; + for (range in this.ranges) { + list += '
      • ' + range + '
      • '; + } + if (this.showCustomRangeLabel) { + list += '
      • ' + this.locale.customRangeLabel + '
      • '; + } + list += '
      '; + this.container.find('.ranges').prepend(list); + } + + if (typeof cb === 'function') { + this.callback = cb; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + this.container.find('.calendar-time').hide(); + } + + //can't be used together for now + if (this.timePicker && this.autoApply) + this.autoApply = false; + + if (this.autoApply) { + this.container.addClass('auto-apply'); + } + + if (typeof options.ranges === 'object') + this.container.addClass('show-ranges'); + + if (this.singleDatePicker) { + this.container.addClass('single'); + this.container.find('.drp-calendar.left').addClass('single'); + this.container.find('.drp-calendar.left').show(); + this.container.find('.drp-calendar.right').hide(); + if (!this.timePicker) { + this.container.addClass('auto-apply'); + } + } + + if ((typeof options.ranges === 'undefined' && !this.singleDatePicker) || this.alwaysShowCalendars) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + //apply CSS classes and labels to buttons + this.container.find('.applyBtn, .cancelBtn').addClass(this.buttonClasses); + if (this.applyButtonClasses.length) + this.container.find('.applyBtn').addClass(this.applyButtonClasses); + if (this.cancelButtonClasses.length) + this.container.find('.cancelBtn').addClass(this.cancelButtonClasses); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + // + // event listeners + // + + this.container.find('.drp-calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('mousedown.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.monthOrYearChanged, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.timeChanged, this)) + + this.container.find('.ranges') + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + + this.container.find('.drp-buttons') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + + if (this.element.is('input') || this.element.is('button')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.elementChanged, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) //IE 11 compatibility + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + this.element.on('keydown.daterangepicker', $.proxy(this.toggle, this)); + } + + // + // if attached to a text input, set the initial value + // + + this.updateElement(); + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.locale.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.minDate && this.startDate.isBefore(this.minDate)) { + this.startDate = this.minDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.round(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (this.maxDate && this.startDate.isAfter(this.maxDate)) { + this.startDate = this.maxDate.clone(); + if (this.timePicker && this.timePickerIncrement) + this.startDate.minute(Math.floor(this.startDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + } + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.locale.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.endOf('day'); + + if (this.timePicker && this.timePickerIncrement) + this.endDate.minute(Math.round(this.endDate.minute() / this.timePickerIncrement) * this.timePickerIncrement); + + if (this.endDate.isBefore(this.startDate)) + this.endDate = this.startDate.clone(); + + if (this.maxDate && this.endDate.isAfter(this.maxDate)) + this.endDate = this.maxDate.clone(); + + if (this.maxSpan && this.startDate.clone().add(this.maxSpan).isBefore(this.endDate)) + this.endDate = this.startDate.clone().add(this.maxSpan); + + this.previousRightTime = this.endDate.clone(); + + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + + if (!this.isShowing) + this.updateElement(); + + this.updateMonthsInView(); + }, + + isInvalidDate: function() { + return false; + }, + + isCustomDate: function() { + return false; + }, + + updateView: function() { + if (this.timePicker) { + this.renderTimePicker('left'); + this.renderTimePicker('right'); + if (!this.endDate) { + this.container.find('.right .calendar-time select').attr('disabled', 'disabled').addClass('disabled'); + } else { + this.container.find('.right .calendar-time select').removeAttr('disabled').removeClass('disabled'); + } + } + if (this.endDate) + this.container.find('.drp-selected').html(this.startDate.format(this.locale.format) + this.locale.separator + this.endDate.format(this.locale.format)); + this.updateMonthsInView(); + this.updateCalendars(); + this.updateFormInputs(); + }, + + updateMonthsInView: function() { + if (this.endDate) { + + //if both dates are visible already, do nothing + if (!this.singleDatePicker && this.leftCalendar.month && this.rightCalendar.month && + (this.startDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.startDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + && + (this.endDate.format('YYYY-MM') == this.leftCalendar.month.format('YYYY-MM') || this.endDate.format('YYYY-MM') == this.rightCalendar.month.format('YYYY-MM')) + ) { + return; + } + + this.leftCalendar.month = this.startDate.clone().date(2); + if (!this.linkedCalendars && (this.endDate.month() != this.startDate.month() || this.endDate.year() != this.startDate.year())) { + this.rightCalendar.month = this.endDate.clone().date(2); + } else { + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + + } else { + if (this.leftCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM') && this.rightCalendar.month.format('YYYY-MM') != this.startDate.format('YYYY-MM')) { + this.leftCalendar.month = this.startDate.clone().date(2); + this.rightCalendar.month = this.startDate.clone().date(2).add(1, 'month'); + } + } + if (this.maxDate && this.linkedCalendars && !this.singleDatePicker && this.rightCalendar.month > this.maxDate) { + this.rightCalendar.month = this.maxDate.clone().date(2); + this.leftCalendar.month = this.maxDate.clone().date(2).subtract(1, 'month'); + } + }, + + updateCalendars: function() { + + if (this.timePicker) { + var hour, minute, second; + if (this.endDate) { + hour = parseInt(this.container.find('.left .hourselect').val(), 10); + minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + if (isNaN(minute)) { + minute = parseInt(this.container.find('.left .minuteselect option:last').val(), 10); + } + second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } else { + hour = parseInt(this.container.find('.right .hourselect').val(), 10); + minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + if (isNaN(minute)) { + minute = parseInt(this.container.find('.right .minuteselect option:last').val(), 10); + } + second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + } + this.leftCalendar.month.hour(hour).minute(minute).second(second); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.renderCalendar('left'); + this.renderCalendar('right'); + + //highlight any predefined range matching the current start and end dates + this.container.find('.ranges li').removeClass('active'); + if (this.endDate == null) return; + + this.calculateChosenLabel(); + }, + + renderCalendar: function(side) { + + // + // Build the matrix of dates that will populate the calendar + // + + var calendar = side == 'left' ? this.leftCalendar : this.rightCalendar; + var month = calendar.month.month(); + var year = calendar.month.year(); + var hour = calendar.month.hour(); + var minute = calendar.month.minute(); + var second = calendar.month.second(); + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + var dayOfWeek = firstDay.day(); + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (var i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]); + + var col, row; + for (var i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + //make the calendar object available to hoverDate/clickDate + if (side == 'left') { + this.leftCalendar.calendar = calendar; + } else { + this.rightCalendar.calendar = calendar; + } + + // + // Display the calendar + // + + var minDate = side == 'left' ? this.minDate : this.startDate; + var maxDate = this.maxDate; + var selected = side == 'left' ? this.startDate : this.endDate; + var arrow = this.locale.direction == 'ltr' ? {left: 'chevron-left', right: 'chevron-right'} : {left: 'chevron-right', right: 'chevron-left'}; + + var html = ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + if ((!minDate || minDate.isBefore(calendar.firstDay)) && (!this.linkedCalendars || side == 'left')) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + var currentMonth = calendar[1][1].month(); + var currentYear = calendar[1][1].year(); + var maxYear = (maxDate && maxDate.year()) || (this.maxYear); + var minYear = (minDate && minDate.year()) || (this.minYear); + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + var monthHtml = '"; + + var yearHtml = ''; + + dateHtml = monthHtml + yearHtml; + } + + html += ''; + if ((!maxDate || maxDate.isAfter(calendar.lastDay)) && (!this.linkedCalendars || side == 'right' || this.singleDatePicker)) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers || this.showISOWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function(index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + //adjust maxDate to reflect the maxSpan setting in order to + //grey out end dates beyond the maxSpan + if (this.endDate == null && this.maxSpan) { + var maxLimit = this.startDate.clone().add(this.maxSpan).endOf('day'); + if (!maxDate || maxLimit.isBefore(maxDate)) { + maxDate = maxLimit; + } + } + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + else if (this.showISOWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + + var classes = []; + + //highlight today's date + if (calendar[row][col].isSame(new Date(), "day")) + classes.push('today'); + + //highlight weekends + if (calendar[row][col].isoWeekday() > 5) + classes.push('weekend'); + + //grey out the dates in other months displayed at beginning and end of this calendar + if (calendar[row][col].month() != calendar[1][1].month()) + classes.push('off', 'ends'); + + //don't allow selection of dates before the minimum date + if (this.minDate && calendar[row][col].isBefore(this.minDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of dates after the maximum date + if (maxDate && calendar[row][col].isAfter(maxDate, 'day')) + classes.push('off', 'disabled'); + + //don't allow selection of date if a custom function decides it's invalid + if (this.isInvalidDate(calendar[row][col])) + classes.push('off', 'disabled'); + + //highlight the currently selected start date + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) + classes.push('active', 'start-date'); + + //highlight the currently selected end date + if (this.endDate != null && calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) + classes.push('active', 'end-date'); + + //highlight dates in-between the selected dates + if (this.endDate != null && calendar[row][col] > this.startDate && calendar[row][col] < this.endDate) + classes.push('in-range'); + + //apply custom classes for this date + var isCustom = this.isCustomDate(calendar[row][col]); + if (isCustom !== false) { + if (typeof isCustom === 'string') + classes.push(isCustom); + else + Array.prototype.push.apply(classes, isCustom); + } + + var cname = '', disabled = false; + for (var i = 0; i < classes.length; i++) { + cname += classes[i] + ' '; + if (classes[i] == 'disabled') + disabled = true; + } + if (!disabled) + cname += 'available'; + + html += ''; + + } + html += ''; + } + + html += ''; + html += '
      ' + dateHtml + '
      ' + this.locale.weekLabel + '' + dayOfWeek + '
      ' + calendar[row][0].week() + '' + calendar[row][0].isoWeek() + '' + calendar[row][col].date() + '
      '; + + this.container.find('.drp-calendar.' + side + ' .calendar-table').html(html); + + }, + + renderTimePicker: function(side) { + + // Don't bother updating the time picker if it's currently disabled + // because an end date hasn't been clicked yet + if (side == 'right' && !this.endDate) return; + + var html, selected, minDate, maxDate = this.maxDate; + + if (this.maxSpan && (!this.maxDate || this.startDate.clone().add(this.maxSpan).isBefore(this.maxDate))) + maxDate = this.startDate.clone().add(this.maxSpan); + + if (side == 'left') { + selected = this.startDate.clone(); + minDate = this.minDate; + } else if (side == 'right') { + selected = this.endDate.clone(); + minDate = this.startDate; + + //Preserve the time already selected + var timeSelector = this.container.find('.drp-calendar.right .calendar-time'); + if (timeSelector.html() != '') { + + selected.hour(!isNaN(selected.hour()) ? selected.hour() : timeSelector.find('.hourselect option:selected').val()); + selected.minute(!isNaN(selected.minute()) ? selected.minute() : timeSelector.find('.minuteselect option:selected').val()); + selected.second(!isNaN(selected.second()) ? selected.second() : timeSelector.find('.secondselect option:selected').val()); + + if (!this.timePicker24Hour) { + var ampm = timeSelector.find('.ampmselect option:selected').val(); + if (ampm === 'PM' && selected.hour() < 12) + selected.hour(selected.hour() + 12); + if (ampm === 'AM' && selected.hour() === 12) + selected.hour(0); + } + + } + + if (selected.isBefore(this.startDate)) + selected = this.startDate.clone(); + + if (maxDate && selected.isAfter(maxDate)) + selected = maxDate.clone(); + + } + + // + // hours + // + + html = ' '; + + // + // minutes + // + + html += ': '; + + // + // seconds + // + + if (this.timePickerSeconds) { + html += ': '; + } + + // + // AM/PM + // + + if (!this.timePicker24Hour) { + html += ''; + } + + this.container.find('.drp-calendar.' + side + ' .calendar-time').html(html); + + }, + + updateFormInputs: function() { + + if (this.singleDatePicker || (this.endDate && (this.startDate.isBefore(this.endDate) || this.startDate.isSame(this.endDate)))) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + + }, + + move: function() { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + + // Force the container to it's actual width + this.container.css({ + top: 0, + left: 0, + right: 'auto' + }); + var containerWidth = this.container.outerWidth(); + + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('drop-up'); + + if (this.opens == 'left') { + var containerRight = parentRightEdge - this.element.offset().left - this.element.outerWidth(); + if (containerWidth + containerRight > $(window).width()) { + this.container.css({ + top: containerTop, + right: 'auto', + left: 9 + }); + } else { + this.container.css({ + top: containerTop, + right: containerRight, + left: 'auto' + }); + } + } else if (this.opens == 'center') { + var containerLeft = this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - containerWidth / 2; + if (containerLeft < 0) { + this.container.css({ + top: containerTop, + right: 'auto', + left: 9 + }); + } else if (containerLeft + containerWidth > $(window).width()) { + this.container.css({ + top: containerTop, + left: 'auto', + right: 0 + }); + } else { + this.container.css({ + top: containerTop, + left: containerLeft, + right: 'auto' + }); + } + } else { + var containerLeft = this.element.offset().left - parentOffset.left; + if (containerLeft + containerWidth > $(window).width()) { + this.container.css({ + top: containerTop, + left: 'auto', + right: 0 + }); + } else { + this.container.css({ + top: containerTop, + left: containerLeft, + right: 'auto' + }); + } + } + }, + + show: function(e) { + if (this.isShowing) return; + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function(e) { this.outsideClick(e); }, this); + + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + // Reposition the picker if the window is resized while it's open + $(window).on('resize.daterangepicker', $.proxy(function(e) { this.move(e); }, this)); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.previousRightTime = this.endDate.clone(); + + this.updateView(); + this.container.show(); + this.move(); + this.element.trigger('show.daterangepicker', this); + this.isShowing = true; + }, + + hide: function(e) { + if (!this.isShowing) return; + + //incomplete date selection, revert to last values + if (!this.endDate) { + this.startDate = this.oldStartDate.clone(); + this.endDate = this.oldEndDate.clone(); + } + + //if a new date range was selected, invoke the user callback function + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.callback(this.startDate.clone(), this.endDate.clone(), this.chosenLabel); + + //if picker is attached to a text input, update it + this.updateElement(); + + $(document).off('.daterangepicker'); + $(window).off('.daterangepicker'); + this.container.hide(); + this.element.trigger('hide.daterangepicker', this); + this.isShowing = false; + }, + + toggle: function(e) { + if (this.isShowing) { + this.hide(); + } else { + this.show(); + } + }, + + outsideClick: function(e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length + ) return; + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + clickRange: function(e) { + var label = e.target.getAttribute('data-range-key'); + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + if (!this.alwaysShowCalendars) + this.hideCalendars(); + this.clickApply(); + } + }, + + clickPrev: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + if (this.linkedCalendars) + this.rightCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function(e) { + var cal = $(e.target).parents('.drp-calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + if (this.linkedCalendars) + this.leftCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function(e) { + + //ignore dates that can't be selected + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + //highlight the dates between the start date and the date being hovered as a potential end date + var leftCalendar = this.leftCalendar; + var rightCalendar = this.rightCalendar; + var startDate = this.startDate; + if (!this.endDate) { + this.container.find('.drp-calendar tbody td').each(function(index, el) { + + //skip week numbers, only look at dates + if ($(el).hasClass('week')) return; + + var title = $(el).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(el).parents('.drp-calendar'); + var dt = cal.hasClass('left') ? leftCalendar.calendar[row][col] : rightCalendar.calendar[row][col]; + + if ((dt.isAfter(startDate) && dt.isBefore(date)) || dt.isSame(date, 'day')) { + $(el).addClass('in-range'); + } else { + $(el).removeClass('in-range'); + } + + }); + } + + }, + + clickDate: function(e) { + + if (!$(e.target).hasClass('available')) return; + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.drp-calendar'); + var date = cal.hasClass('left') ? this.leftCalendar.calendar[row][col] : this.rightCalendar.calendar[row][col]; + + // + // this function needs to do a few things: + // * alternate between selecting a start and end date for the range, + // * if the time picker is enabled, apply the hour/minute/second from the select boxes to the clicked date + // * if autoapply is enabled, and an end date was chosen, apply the selection + // * if single date picker mode, and time picker isn't enabled, apply the selection immediately + // * if one of the inputs above the calendars was focused, cancel that manual input + // + + if (this.endDate || date.isBefore(this.startDate, 'day')) { //picking start + if (this.timePicker) { + var hour = parseInt(this.container.find('.left .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.left .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.left .minuteselect').val(), 10); + if (isNaN(minute)) { + minute = parseInt(this.container.find('.left .minuteselect option:last').val(), 10); + } + var second = this.timePickerSeconds ? parseInt(this.container.find('.left .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.endDate = null; + this.setStartDate(date.clone()); + } else if (!this.endDate && date.isBefore(this.startDate)) { + //special case: clicking the same date for start/end, + //but the time of the end date is before the start date + this.setEndDate(this.startDate.clone()); + } else { // picking end + if (this.timePicker) { + var hour = parseInt(this.container.find('.right .hourselect').val(), 10); + if (!this.timePicker24Hour) { + var ampm = this.container.find('.right .ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + var minute = parseInt(this.container.find('.right .minuteselect').val(), 10); + if (isNaN(minute)) { + minute = parseInt(this.container.find('.right .minuteselect option:last').val(), 10); + } + var second = this.timePickerSeconds ? parseInt(this.container.find('.right .secondselect').val(), 10) : 0; + date = date.clone().hour(hour).minute(minute).second(second); + } + this.setEndDate(date.clone()); + if (this.autoApply) { + this.calculateChosenLabel(); + this.clickApply(); + } + } + + if (this.singleDatePicker) { + this.setEndDate(this.startDate); + if (!this.timePicker) + this.clickApply(); + } + + this.updateView(); + + //This is to cancel the blur event handler if the mouse was in one of the inputs + e.stopPropagation(); + + }, + + calculateChosenLabel: function () { + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + var format = this.timePickerSeconds ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD HH:mm"; + //ignore times when comparing dates if time picker seconds is not enabled + if (this.startDate.format(format) == this.ranges[range][0].format(format) && this.endDate.format(format) == this.ranges[range][1].format(format)) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')').addClass('active').attr('data-range-key'); + break; + } + } + i++; + } + if (customRange) { + if (this.showCustomRangeLabel) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').attr('data-range-key'); + } else { + this.chosenLabel = null; + } + this.showCalendars(); + } + }, + + clickApply: function(e) { + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function(e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + monthOrYearChanged: function(e) { + var isLeft = $(e.target).closest('.drp-calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.drp-calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + if (isLeft) { + this.leftCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.rightCalendar.month = this.leftCalendar.month.clone().add(1, 'month'); + } else { + this.rightCalendar.month.month(month).year(year); + if (this.linkedCalendars) + this.leftCalendar.month = this.rightCalendar.month.clone().subtract(1, 'month'); + } + this.updateCalendars(); + }, + + timeChanged: function(e) { + + var cal = $(e.target).closest('.drp-calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + if (isNaN(minute)) { + minute = parseInt(cal.find('.minuteselect option:last').val(), 10); + } + var second = this.timePickerSeconds ? parseInt(cal.find('.secondselect').val(), 10) : 0; + + if (!this.timePicker24Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.setStartDate(start); + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } else if (this.endDate && this.endDate.format('YYYY-MM-DD') == start.format('YYYY-MM-DD') && this.endDate.isBefore(start)) { + this.setEndDate(start.clone()); + } + } else if (this.endDate) { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.setEndDate(end); + } + + //update the calendars so all clickable dates reflect the new time component + this.updateCalendars(); + + //update the form inputs above the calendars with the new time + this.updateFormInputs(); + + //re-render the time pickers because changing one selection can affect what's enabled in another + this.renderTimePicker('left'); + this.renderTimePicker('right'); + + }, + + elementChanged: function() { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.locale.separator), + start = null, + end = null; + + if (dateString.length === 2) { + start = moment(dateString[0], this.locale.format); + end = moment(dateString[1], this.locale.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.locale.format); + end = start; + } + + if (!start.isValid() || !end.isValid()) return; + + this.setStartDate(start); + this.setEndDate(end); + this.updateView(); + }, + + keydown: function(e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + + //hide on esc and prevent propagation + if (e.keyCode === 27) { + e.preventDefault(); + e.stopPropagation(); + + this.hide(); + } + }, + + updateElement: function() { + if (this.element.is('input') && this.autoUpdateInput) { + var newValue = this.startDate.format(this.locale.format); + if (!this.singleDatePicker) { + newValue += this.locale.separator + this.endDate.format(this.locale.format); + } + if (newValue !== this.element.val()) { + this.element.val(newValue).trigger('change'); + } + } + }, + + remove: function() { + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData(); + } + + }; + + $.fn.daterangepicker = function(options, callback) { + var implementOptions = $.extend(true, {}, $.fn.daterangepicker.defaultOptions, options); + this.each(function() { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, implementOptions, callback)); + }); + return this; + }; + + return DateRangePicker; + +})); diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/af.js b/ext/phpbbstudio/ass/adm/style/js/i18n/af.js new file mode 100644 index 0000000..2a1a75b --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/af.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ar.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ar.js new file mode 100644 index 0000000..2c7914d --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ar.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/az.js b/ext/phpbbstudio/ass/adm/style/js/i18n/az.js new file mode 100644 index 0000000..735c930 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/bg.js b/ext/phpbbstudio/ass/adm/style/js/i18n/bg.js new file mode 100644 index 0000000..c631c29 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/bg.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/bn.js b/ext/phpbbstudio/ass/adm/style/js/i18n/bn.js new file mode 100644 index 0000000..b61888d --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/bn.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/bs.js b/ext/phpbbstudio/ass/adm/style/js/i18n/bs.js new file mode 100644 index 0000000..cafa057 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/bs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ca.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ca.js new file mode 100644 index 0000000..614bfbb --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ca.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/cs.js b/ext/phpbbstudio/ass/adm/style/js/i18n/cs.js new file mode 100644 index 0000000..a4285a2 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/cs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/da.js b/ext/phpbbstudio/ass/adm/style/js/i18n/da.js new file mode 100644 index 0000000..4deec69 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/de.js b/ext/phpbbstudio/ass/adm/style/js/i18n/de.js new file mode 100644 index 0000000..8ab511d --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/de.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/dsb.js b/ext/phpbbstudio/ass/adm/style/js/i18n/dsb.js new file mode 100644 index 0000000..495ad0e --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/dsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/el.js b/ext/phpbbstudio/ass/adm/style/js/i18n/el.js new file mode 100644 index 0000000..6c30d6a --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/el.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/en.js b/ext/phpbbstudio/ass/adm/style/js/i18n/en.js new file mode 100644 index 0000000..47c8431 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/en.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/es.js b/ext/phpbbstudio/ass/adm/style/js/i18n/es.js new file mode 100644 index 0000000..81a754f --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/et.js b/ext/phpbbstudio/ass/adm/style/js/i18n/et.js new file mode 100644 index 0000000..e58ed7f --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/et.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/eu.js b/ext/phpbbstudio/ass/adm/style/js/i18n/eu.js new file mode 100644 index 0000000..9b30a95 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/eu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/fa.js b/ext/phpbbstudio/ass/adm/style/js/i18n/fa.js new file mode 100644 index 0000000..cd6da47 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/fa.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/fi.js b/ext/phpbbstudio/ass/adm/style/js/i18n/fi.js new file mode 100644 index 0000000..492391f --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/fi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/fr.js b/ext/phpbbstudio/ass/adm/style/js/i18n/fr.js new file mode 100644 index 0000000..3b725f3 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/gl.js b/ext/phpbbstudio/ass/adm/style/js/i18n/gl.js new file mode 100644 index 0000000..8df845b --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/gl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/he.js b/ext/phpbbstudio/ass/adm/style/js/i18n/he.js new file mode 100644 index 0000000..b95e596 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/he.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/hi.js b/ext/phpbbstudio/ass/adm/style/js/i18n/hi.js new file mode 100644 index 0000000..e539ae5 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/hi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/hr.js b/ext/phpbbstudio/ass/adm/style/js/i18n/hr.js new file mode 100644 index 0000000..26e5ae7 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/hr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/hsb.js b/ext/phpbbstudio/ass/adm/style/js/i18n/hsb.js new file mode 100644 index 0000000..48323ad --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/hsb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/hu.js b/ext/phpbbstudio/ass/adm/style/js/i18n/hu.js new file mode 100644 index 0000000..441cd63 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/hu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/hy.js b/ext/phpbbstudio/ass/adm/style/js/i18n/hy.js new file mode 100644 index 0000000..b94f512 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/hy.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/id.js b/ext/phpbbstudio/ass/adm/style/js/i18n/id.js new file mode 100644 index 0000000..c880bf5 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/id.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/is.js b/ext/phpbbstudio/ass/adm/style/js/i18n/is.js new file mode 100644 index 0000000..99f318b --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/is.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/it.js b/ext/phpbbstudio/ass/adm/style/js/i18n/it.js new file mode 100644 index 0000000..a5223f4 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ja.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ja.js new file mode 100644 index 0000000..e75885e --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ja.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ka.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ka.js new file mode 100644 index 0000000..677065a --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ka.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/km.js b/ext/phpbbstudio/ass/adm/style/js/i18n/km.js new file mode 100644 index 0000000..6a09e92 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/km.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ko.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ko.js new file mode 100644 index 0000000..10ac13d --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/lt.js b/ext/phpbbstudio/ass/adm/style/js/i18n/lt.js new file mode 100644 index 0000000..3097941 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/lv.js b/ext/phpbbstudio/ass/adm/style/js/i18n/lv.js new file mode 100644 index 0000000..4ec8b72 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/lv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/mk.js b/ext/phpbbstudio/ass/adm/style/js/i18n/mk.js new file mode 100644 index 0000000..e303ac0 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ms.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ms.js new file mode 100644 index 0000000..11f0ce9 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ms.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/nb.js b/ext/phpbbstudio/ass/adm/style/js/i18n/nb.js new file mode 100644 index 0000000..6d73059 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ne.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ne.js new file mode 100644 index 0000000..dabc198 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ne.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/nl.js b/ext/phpbbstudio/ass/adm/style/js/i18n/nl.js new file mode 100644 index 0000000..a2fec10 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/nl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/pl.js b/ext/phpbbstudio/ass/adm/style/js/i18n/pl.js new file mode 100644 index 0000000..fd196ff --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/pl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ps.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ps.js new file mode 100644 index 0000000..fbff72a --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ps.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/pt-BR.js b/ext/phpbbstudio/ass/adm/style/js/i18n/pt-BR.js new file mode 100644 index 0000000..f5e98c1 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/pt.js b/ext/phpbbstudio/ass/adm/style/js/i18n/pt.js new file mode 100644 index 0000000..cca8dcc --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/pt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ro.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ro.js new file mode 100644 index 0000000..303f11a --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/ru.js b/ext/phpbbstudio/ass/adm/style/js/i18n/ru.js new file mode 100644 index 0000000..48b43b7 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/ru.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sk.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sk.js new file mode 100644 index 0000000..4fe9346 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sl.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sl.js new file mode 100644 index 0000000..30706bc --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sq.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sq.js new file mode 100644 index 0000000..99528e1 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sq.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sr-Cyrl.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sr-Cyrl.js new file mode 100644 index 0000000..9c180c8 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sr-Cyrl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sr.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sr.js new file mode 100644 index 0000000..579e312 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/sv.js b/ext/phpbbstudio/ass/adm/style/js/i18n/sv.js new file mode 100644 index 0000000..a89cf7e --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/th.js b/ext/phpbbstudio/ass/adm/style/js/i18n/th.js new file mode 100644 index 0000000..536fe83 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/th.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/tk.js b/ext/phpbbstudio/ass/adm/style/js/i18n/tk.js new file mode 100644 index 0000000..0a392a0 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/tk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/tr.js b/ext/phpbbstudio/ass/adm/style/js/i18n/tr.js new file mode 100644 index 0000000..e81f326 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/uk.js b/ext/phpbbstudio/ass/adm/style/js/i18n/uk.js new file mode 100644 index 0000000..6e5fe03 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/uk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/vi.js b/ext/phpbbstudio/ass/adm/style/js/i18n/vi.js new file mode 100644 index 0000000..8409a1d --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/vi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/zh-CN.js b/ext/phpbbstudio/ass/adm/style/js/i18n/zh-CN.js new file mode 100644 index 0000000..7e42fd3 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/i18n/zh-TW.js b/ext/phpbbstudio/ass/adm/style/js/i18n/zh-TW.js new file mode 100644 index 0000000..05bae5c --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}(); \ No newline at end of file diff --git a/ext/phpbbstudio/ass/adm/style/js/moment.min.js b/ext/phpbbstudio/ass/adm/style/js/moment.min.js new file mode 100644 index 0000000..5787a40 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/moment.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function h(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n>>0,s=0;sSe(e)?(r=e+1,o-Se(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(Se(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),C("week","w"),C("isoWeek","W"),F("week",5),F("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=D(e)});function je(e,t){return e.slice(t,7).concat(e.slice(0,t))}I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),C("day","d"),C("weekday","e"),C("isoWeekday","E"),F("day",11),F("weekday",11),F("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=D(e)});var Ze="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var $e="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var qe=ae;var Je=ae;var Be=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=he(o[t]),u[t]=he(u[t]),l[t]=he(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Xe(){return this.hours()%12||12}function Ke(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function et(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Xe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)+L(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+L(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+L(this.minutes(),2)+L(this.seconds(),2)}),Ke("a",!0),Ke("A",!1),C("hour","h"),F("hour",13),ue("a",et),ue("A",et),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=D(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=D(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i))});var tt,nt=Te("Hours",!0),st={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:/\d{1,2}/,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:Ce,monthsShort:He,week:{dow:0,doy:6},weekdays:Ze,weekdaysMin:$e,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},it={},rt={};function at(e){return e?e.toLowerCase().replace("_","-"):e}function ot(e){var t=null;if(!it[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=tt._abbr,require("./locale/"+e),ut(t)}catch(e){}return it[e]}function ut(e,t){var n;return e&&((n=l(t)?ht(e):lt(e,t))?tt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),tt._abbr}function lt(e,t){if(null===t)return delete it[e],null;var n,s=st;if(t.abbr=e,null!=it[e])T("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."),s=it[e]._config;else if(null!=t.parentLocale)if(null!=it[t.parentLocale])s=it[t.parentLocale]._config;else{if(null==(n=ot(t.parentLocale)))return rt[t.parentLocale]||(rt[t.parentLocale]=[]),rt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return it[e]=new P(x(s,t)),rt[e]&&rt[e].forEach(function(e){lt(e.name,e.config)}),ut(e),it[e]}function ht(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return tt;if(!o(e)){if(t=ot(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r=t&&a(i,n,!0)>=t-1)break;t--}r++}return tt}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11Pe(n[me],n[_e])?ye:n[ge]<0||24Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ct(e._a[me],s[me]),(e._dayOfYear>Se(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[ve]&&0===e._a[pe]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var mt=/^\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)?)?$/,_t=/^\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)?)?$/,yt=/Z|[+-]\d\d(?::?\d\d)?/,gt=[["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}/]],vt=[["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/]],pt=/^\/?Date\((\-?\d+)/i;function wt(e){var t,n,s,i,r,a,o=e._i,u=mt.exec(o)||_t.exec(o);if(u){for(g(e).iso=!0,t=0,n=gt.length;tn.valueOf():n.valueOf()this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},mn.isUtc=Et,mn.isUTC=Et,mn.zoneAbbr=function(){return this._isUTC?"UTC":""},mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},mn.dates=n("dates accessor is deprecated. Use date instead.",un),mn.months=n("months accessor is deprecated. Use month instead",Ue),mn.years=n("years accessor is deprecated. Use year instead",Oe),mn.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),mn.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Ot(e))._a){var t=e._isUTC?y(e._a):bt(e._a);this._isDSTShifted=this.isValid()&&0 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + + element.removeAttribute('data-select2-id'); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
        ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'option', + 'aria-selected': 'false' + }; + + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
          ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + $selection.attr('aria-disabled', 'false'); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.trigger('focus'); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + self.$selection.attr('aria-disabled', 'false'); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + self.$selection.attr('aria-disabled', 'true'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.trigger('focus'); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + + var title = selection.title || selection.text; + + if (title) { + $rendered.attr('title', title); + } else { + $rendered.removeAttr('title'); + } + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
            ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
          • ' + + '' + + '×' + + '' + + '
          • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + + var title = selection.title || selection.text; + + if (title) { + $selection.attr('title', title); + } + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '' + + '×' + + '' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.attr('aria-controls', resultsId); + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.trigger('focus'); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').width(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + this._dataToConvert = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.trigger('focus'); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + + if (successCallback) { + successCallback(); + } + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); + + self.$search.trigger('focus'); + + window.setTimeout(function () { + self.$search.trigger('focus'); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + + self.$search.val(''); + self.$search.trigger('blur'); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.trigger('focus'); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; + + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); + + if (this.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
          • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = $(options.get('dropdownParent') || document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); + + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); + } + } + + options.language = uniqueLanguages; + + options.translations = this._processTranslations( + options.language, + options.debug + ); + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: {}, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('select2/compat/utils',[ + 'jquery' +], function ($) { + function syncCssClasses ($dest, $src, adapter) { + var classes, replacements = [], adapted; + + classes = $.trim($dest.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Save all Select2 classes + if (this.indexOf('select2-') === 0) { + replacements.push(this); + } + }); + } + + classes = $.trim($src.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Only adapt non-Select2 classes + if (this.indexOf('select2-') !== 0) { + adapted = adapter(this); + + if (adapted != null) { + replacements.push(adapted); + } + } + }); + } + + $dest.attr('class', replacements.join(' ')); + } + + return { + syncCssClasses: syncCssClasses + }; +}); + +S2.define('select2/compat/containerCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _containerAdapter (clazz) { + return null; + } + + function ContainerCSS () { } + + ContainerCSS.prototype.render = function (decorated) { + var $container = decorated.call(this); + + var containerCssClass = this.options.get('containerCssClass') || ''; + + if ($.isFunction(containerCssClass)) { + containerCssClass = containerCssClass(this.$element); + } + + var containerCssAdapter = this.options.get('adaptContainerCssClass'); + containerCssAdapter = containerCssAdapter || _containerAdapter; + + if (containerCssClass.indexOf(':all:') !== -1) { + containerCssClass = containerCssClass.replace(':all:', ''); + + var _cssAdapter = containerCssAdapter; + + containerCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var containerCss = this.options.get('containerCss') || {}; + + if ($.isFunction(containerCss)) { + containerCss = containerCss(this.$element); + } + + CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); + + $container.css(containerCss); + $container.addClass(containerCssClass); + + return $container; + }; + + return ContainerCSS; +}); + +S2.define('select2/compat/dropdownCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _dropdownAdapter (clazz) { + return null; + } + + function DropdownCSS () { } + + DropdownCSS.prototype.render = function (decorated) { + var $dropdown = decorated.call(this); + + var dropdownCssClass = this.options.get('dropdownCssClass') || ''; + + if ($.isFunction(dropdownCssClass)) { + dropdownCssClass = dropdownCssClass(this.$element); + } + + var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); + dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; + + if (dropdownCssClass.indexOf(':all:') !== -1) { + dropdownCssClass = dropdownCssClass.replace(':all:', ''); + + var _cssAdapter = dropdownCssAdapter; + + dropdownCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var dropdownCss = this.options.get('dropdownCss') || {}; + + if ($.isFunction(dropdownCss)) { + dropdownCss = dropdownCss(this.$element); + } + + CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); + + $dropdown.css(dropdownCss); + $dropdown.addClass(dropdownCssClass); + + return $dropdown; + }; + + return DropdownCSS; +}); + +S2.define('select2/compat/initSelection',[ + 'jquery' +], function ($) { + function InitSelection (decorated, $element, options) { + if (options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `initSelection` option has been deprecated in favor' + + ' of a custom data adapter that overrides the `current` method. ' + + 'This method is now called multiple times instead of a single ' + + 'time when the instance is initialized. Support will be removed ' + + 'for the `initSelection` option in future versions of Select2' + ); + } + + this.initSelection = options.get('initSelection'); + this._isInitialized = false; + + decorated.call(this, $element, options); + } + + InitSelection.prototype.current = function (decorated, callback) { + var self = this; + + if (this._isInitialized) { + decorated.call(this, callback); + + return; + } + + this.initSelection.call(null, this.$element, function (data) { + self._isInitialized = true; + + if (!$.isArray(data)) { + data = [data]; + } + + callback(data); + }); + }; + + return InitSelection; +}); + +S2.define('select2/compat/inputData',[ + 'jquery', + '../utils' +], function ($, Utils) { + function InputData (decorated, $element, options) { + this._currentData = []; + this._valueSeparator = options.get('valueSeparator') || ','; + + if ($element.prop('type') === 'hidden') { + if (options.get('debug') && console && console.warn) { + console.warn( + 'Select2: Using a hidden input with Select2 is no longer ' + + 'supported and may stop working in the future. It is recommended ' + + 'to use a `');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
          • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.attr('aria-controls', resultsId); + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + this.$selection.on('click', '.select2-search--inline', function (evt) { + if (self.$search.val()) { + evt.stopPropagation(); + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.trigger('focus'); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').width(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + this._dataToConvert = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.bind = function (container, $container) { + ArrayAdapter.__super__.bind.call(this, container, $container); + + this.addOptions(this.convertToOptions(this._dataToConvert)); + }; + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.trigger('focus'); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.bind = + function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function () { + self._checkIfMaximumSelected(); + }); + }; + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this._checkIfMaximumSelected(function () { + decorated.call(self, params, callback); + }); + }; + + MaximumSelectionLength.prototype._checkIfMaximumSelected = + function (_, successCallback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + + if (successCallback) { + successCallback(); + } + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + var resultsId = container.id + '-results'; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + self.$search.attr('aria-controls', resultsId); + + self.$search.trigger('focus'); + + window.setTimeout(function () { + self.$search.trigger('focus'); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + self.$search.removeAttr('aria-controls'); + self.$search.removeAttr('aria-activedescendant'); + + self.$search.val(''); + self.$search.trigger('blur'); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.trigger('focus'); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + + container.on('results:focus', function (params) { + if (params.data._resultId) { + self.$search.attr('aria-activedescendant', params.data._resultId); + } else { + self.$search.removeAttr('aria-activedescendant'); + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; + + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); + + if (this.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
          • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = $(options.get('dropdownParent') || document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + // Must bind after the results handlers to ensure correct sizing + self._bindContainerResultHandlers(container); + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._bindContainerResultHandlers = + function (decorated, container) { + + // These should only be bound once + if (this._containerResultsHandlersBound) { + return; + } + + var self = this; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:message', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('select', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('unselect', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + this._containerResultsHandlersBound = true; + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + // If the defaults were not previously applied from an element, it is + // possible for the language option to have not been resolved + options.language = this._resolveLanguage(options.language); + + // Always fall back to English since it will always be complete + options.language.push('en'); + + var uniqueLanguages = []; + + for (var l = 0; l < options.language.length; l++) { + var language = options.language[l]; + + if (uniqueLanguages.indexOf(language) === -1) { + uniqueLanguages.push(language); + } + } + + options.language = uniqueLanguages; + + options.translations = this._processTranslations( + options.language, + options.debug + ); + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: {}, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.applyFromElement = function (options, $element) { + var optionLanguage = options.language; + var defaultLanguage = this.defaults.language; + var elementLanguage = $element.prop('lang'); + var parentLanguage = $element.closest('[lang]').prop('lang'); + + var languages = Array.prototype.concat.call( + this._resolveLanguage(elementLanguage), + this._resolveLanguage(optionLanguage), + this._resolveLanguage(defaultLanguage), + this._resolveLanguage(parentLanguage) + ); + + options.language = languages; + + return options; + }; + + Defaults.prototype._resolveLanguage = function (language) { + if (!language) { + return []; + } + + if ($.isEmptyObject(language)) { + return []; + } + + if ($.isPlainObject(language)) { + return [language]; + } + + var languages; + + if (!$.isArray(language)) { + languages = [language]; + } else { + languages = language; + } + + var resolvedLanguages = []; + + for (var l = 0; l < languages.length; l++) { + resolvedLanguages.push(languages[l]); + + if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = languages[l].split('-'); + var baseLanguage = languageParts[0]; + + resolvedLanguages.push(baseLanguage); + } + } + + return resolvedLanguages; + }; + + Defaults.prototype._processTranslations = function (languages, debug) { + var translations = new Translation(); + + for (var l = 0; l < languages.length; l++) { + var languageData = new Translation(); + + var language = languages[l]; + + if (typeof language === 'string') { + try { + // Try to load it with the original name + languageData = Translation.loadPath(language); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + language = this.defaults.amdLanguageBase + language; + languageData = Translation.loadPath(language); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files + if (debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + language + '" could ' + + 'not be automatically loaded. A fallback will be used instead.' + ); + } + } + } + } else if ($.isPlainObject(language)) { + languageData = new Translation(language); + } else { + languageData = language; + } + + translations.extend(languageData); + } + + return translations; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + if ($element != null) { + this.options = Defaults.applyFromElement(this.options, $element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/ext/phpbbstudio/ass/adm/style/js/select2.min.js b/ext/phpbbstudio/ass/adm/style/js/select2.min.js new file mode 100644 index 0000000..31db3e2 --- /dev/null +++ b/ext/phpbbstudio/ass/adm/style/js/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.10 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,w;function b(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&w.test(e[s])&&(e[s]=e[s].replace(w,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
              ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
                '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.options.get("disabled")){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
              • ×
              • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
              • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h=p.offset();d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1=5.5.0", + "composer/installers": "~1.0" + }, + "extra": { + "display-name": "phpBB Studio - Advanced Shop System", + "soft-require": { + "phpbb/phpbb": ">=3.2.7,<4.0.0@dev" + }, + "version-check": { + "host": "3d-i.github.io", + "directory": "/site/vchecks", + "filename": "advshop.json" + } + } +} diff --git a/ext/phpbbstudio/ass/config/routing.yml b/ext/phpbbstudio/ass/config/routing.yml new file mode 100644 index 0000000..c44da67 --- /dev/null +++ b/ext/phpbbstudio/ass/config/routing.yml @@ -0,0 +1,54 @@ +phpbbstudio_ass_shop: + path: /aps/shop + defaults: + _controller: phpbbstudio.ass.controller.shop:shop + +phpbbstudio_ass_category: + path: /aps/shop/{category_slug} + defaults: + _controller: phpbbstudio.ass.controller.shop:category + page: 1 + +phpbbstudio_ass_category_pagination: + path: /aps/shop/{category_slug}/page-{page} + defaults: + _controller: phpbbstudio.ass.controller.shop:category + +phpbbstudio_ass_item: + path: /aps/shop/{category_slug}/{item_slug} + defaults: + _controller: phpbbstudio.ass.controller.shop:item + +phpbbstudio_ass_purchase: + path: /aps/shop/purchase/{category_slug}/{item_slug} + defaults: + _controller: phpbbstudio.ass.controller.inventory:purchase + purchase: true + +phpbbstudio_ass_gift: + path: /aps/shop/gift/{category_slug}/{item_slug} + defaults: + _controller: phpbbstudio.ass.controller.inventory:purchase + purchase: false + +phpbbstudio_ass_history: + path: /aps/inventory/history + defaults: + _controller: phpbbstudio.ass.controller.inventory:history + page: 1 + +phpbbstudio_ass_history_pagination: + path: /aps/inventory/history/page-{page} + defaults: + _controller: phpbbstudio.ass.controller.inventory:history + +phpbbstudio_ass_inventory: + path: /aps/inventory/{category_slug}/{item_slug}/{index}/{action} + defaults: + _controller: phpbbstudio.ass.controller.inventory:inventory + category_slug: '' + item_slug: '' + action: '' + index: 1 + requirements: + index: '\d+' diff --git a/ext/phpbbstudio/ass/config/services.yml b/ext/phpbbstudio/ass/config/services.yml new file mode 100644 index 0000000..5f45447 --- /dev/null +++ b/ext/phpbbstudio/ass/config/services.yml @@ -0,0 +1,11 @@ +parameters: + phpbbstudio.aps.extended: "phpBB Studio - Advanced Shop System" + +imports: + - { resource: services_controllers.yml } + - { resource: services_helpers.yml } + - { resource: services_items.yml } + - { resource: services_listeners.yml } + - { resource: services_notifications.yml } + - { resource: services_objects.yml } + - { resource: tables.yml } diff --git a/ext/phpbbstudio/ass/config/services_controllers.yml b/ext/phpbbstudio/ass/config/services_controllers.yml new file mode 100644 index 0000000..9e094cc --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_controllers.yml @@ -0,0 +1,139 @@ +services: + phpbbstudio.ass.controller.acp.files: + class: phpbbstudio\ass\controller\acp_files_controller + arguments: + - '@cache.driver' + - '@config' + - '@phpbbstudio.ass.files' + - '@language' + - '@request' + - '@template' + - '@user' + + phpbbstudio.ass.controller.acp.inventory: + class: phpbbstudio\ass\controller\acp_inventory_controller + arguments: + - '@dbal.conn' + - '@group_helper' + - '@language' + - '@log' + - '@phpbbstudio.ass.notification' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.operator.item' + - '@request' + - '@template' + - '@user' + - '%tables.groups%' + - '%tables.users%' + - '%tables.user_group%' + - '%phpbbstudio.ass.tables.inventory%' + - '%core.root_path%' + - '%core.php_ext%' + + + phpbbstudio.ass.controller.acp.items: + class: phpbbstudio\ass\controller\acp_items_controller + arguments: + - '@cache.driver' + - '@phpbbstudio.ass.items.manager' + - '@language' + - '@log' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.operator.inventory' + - '@phpbbstudio.ass.operator.item' + - '@request' + - '@template' + - '@phpbbstudio.ass.time' + - '@user' + - '%core.adm_relative_path%' + - '%core.root_path%' + - '%core.php_ext%' + + phpbbstudio.ass.controller.acp.logs: + class: phpbbstudio\ass\controller\acp_logs_controller + arguments: + - '@config' + - '@phpbbstudio.ass.items.manager' + - '@language' + - '@phpbbstudio.ass.log' + - '@log' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.operator.item' + - '@pagination' + - '@request' + - '@template' + - '@user' + + phpbbstudio.ass.controller.acp.overview: + class: phpbbstudio\ass\controller\acp_overview_controller + arguments: + - '@config' + - '@config_text' + - '@dbal.conn' + - '@language' + - '@phpbbstudio.ass.operator.item' + - '@text_formatter.parser' + - '@text_formatter.renderer' + - '@request' + - '@template' + - '@user_loader' + - '@text_formatter.utils' + - '%phpbbstudio.ass.tables.categories%' + - '%phpbbstudio.ass.tables.items%' + - '%phpbbstudio.ass.tables.logs%' + + phpbbstudio.ass.controller.acp.settings: + class: phpbbstudio\ass\controller\acp_settings_controller + arguments: + - '@phpbbstudio.aps.functions' + - '@config' + - '@config_text' + - '@language' + - '@log' + - '@text_formatter.parser' + - '@request' + - '@template' + - '@user' + - '@text_formatter.utils' + - '%core.root_path%' + - '%core.php_ext%' + + phpbbstudio.ass.controller.inventory: + class: phpbbstudio\ass\controller\inventory_controller + arguments: + - '@phpbbstudio.aps.distributor' + - '@phpbbstudio.aps.functions' + - '@auth' + - '@config' + - '@phpbbstudio.ass.controller' + - '@controller.helper' + - '@phpbbstudio.ass.items.manager' + - '@language' + - '@phpbbstudio.ass.log' + - '@log' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.operator.inventory' + - '@phpbbstudio.ass.operator.item' + - '@phpbbstudio.ass.notification' + - '@pagination' + - '@request' + - '@phpbbstudio.ass.router' + - '@template' + - '@phpbbstudio.ass.time' + - '@user' + - '@user_loader' + + phpbbstudio.ass.controller.shop: + class: phpbbstudio\ass\controller\shop_controller + arguments: + - '@config' + - '@phpbbstudio.ass.controller' + - '@dbal.conn' + - '@controller.helper' + - '@phpbbstudio.ass.items.manager' + - '@language' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.operator.item' + - '@pagination' + - '@request' + - '@template' diff --git a/ext/phpbbstudio/ass/config/services_helpers.yml b/ext/phpbbstudio/ass/config/services_helpers.yml new file mode 100644 index 0000000..43b4893 --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_helpers.yml @@ -0,0 +1,45 @@ +services: + phpbbstudio.ass.controller: + class: phpbbstudio\ass\helper\controller + arguments: + - '@phpbbstudio.aps.functions' + - '@auth' + - '@config' + - '@config_text' + - '@controller.helper' + - '@language' + - '@phpbbstudio.ass.operator.category' + - '@phpbbstudio.ass.router' + - '@template' + - '@user' + + phpbbstudio.ass.files: + class: phpbbstudio\ass\helper\files + arguments: + - '@cache' + - '@files.factory' + - '@filesystem' + - '%core.root_path%' + + phpbbstudio.ass.log: + class: phpbbstudio\ass\helper\log + arguments: + - '@dbal.conn' + - '@user' + - '%phpbbstudio.ass.tables.categories%' + - '%phpbbstudio.ass.tables.items%' + - '%phpbbstudio.ass.tables.logs%' + - '%tables.users%' + + phpbbstudio.ass.router: + class: phpbbstudio\ass\helper\router + arguments: + - '@controller.helper' + - '%core.root_path%' + - '%core.php_ext%' + + phpbbstudio.ass.time: + class: phpbbstudio\ass\helper\time + arguments: + - '@config' + - '@language' diff --git a/ext/phpbbstudio/ass/config/services_items.yml b/ext/phpbbstudio/ass/config/services_items.yml new file mode 100644 index 0000000..3ef1f45 --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_items.yml @@ -0,0 +1,50 @@ +services: + phpbbstudio.ass.items: + class: phpbb\di\service_collection + arguments: + - '@service_container' + tags: + - { name: service_collection, tag: phpbbstudio.ass.item } + + phpbbstudio.ass.items.manager: + class: phpbbstudio\ass\items\manager + arguments: + - '@language' + - '@template' + - '@phpbbstudio.ass.items' + + phpbbstudio.ass.items.base: + class: phpbbstudio\ass\items\type\base + shared: false + abstract: true + arguments: + - '@auth' + - '@config' + - '@dbal.conn' + - '@controller.helper' + - '@language' + - '@log' + - '@request' + - '@template' + - '@user' + - '%core.table_prefix%' + +# --- Items --- # + phpbbstudio.ass.items.points: + class: phpbbstudio\ass\items\type\points + parent: phpbbstudio.ass.items.base + shared: false + calls: + - [set_aps_distributor, ['@phpbbstudio.aps.distributor']] + - [set_aps_functions, ['@phpbbstudio.aps.functions']] + tags: + - { name: phpbbstudio.ass.item } + + phpbbstudio.ass.items.file: + class: phpbbstudio\ass\items\type\file + parent: phpbbstudio.ass.items.base + shared: false + calls: + - [set_files, ['@phpbbstudio.ass.files']] + tags: + - { name: phpbbstudio.ass.item } diff --git a/ext/phpbbstudio/ass/config/services_listeners.yml b/ext/phpbbstudio/ass/config/services_listeners.yml new file mode 100644 index 0000000..5ae63d4 --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_listeners.yml @@ -0,0 +1,30 @@ +services: + phpbbstudio.ass.listener.blocks: + class: phpbbstudio\ass\event\blocks_listener + arguments: + - '@phpbbstudio.ass.operator.blocks' + - '@config' + - '@language' + tags: + - { name: event.listener } + + phpbbstudio.ass.listener.setup: + class: phpbbstudio\ass\event\setup_listener + arguments: + - '@config' + - '@phpbbstudio.aps.functions' + - '@language' + - '@template' + tags: + - { name: event.listener } + + phpbbstudio.ass.listener.exception: + class: phpbbstudio\ass\event\exception_listener + arguments: + - '@config_text' + - '@phpbbstudio.ass.controller' + - '@language' + - '@text_formatter.renderer' + - '@template' + tags: + - { name: event.listener } diff --git a/ext/phpbbstudio/ass/config/services_notifications.yml b/ext/phpbbstudio/ass/config/services_notifications.yml new file mode 100644 index 0000000..9128247 --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_notifications.yml @@ -0,0 +1,29 @@ +services: + phpbbstudio.ass.notification: + class: phpbbstudio\ass\notification\notification + arguments: + - '@config' + - '@notification_manager' + - '@phpbbstudio.ass.operator.item' + - '@user' + + phpbbstudio.ass.notification.type.gift: + class: phpbbstudio\ass\notification\type\gift + shared: false # service MUST not be shared for this to work! + parent: notification.type.base + calls: + - [set_auth, ['@auth']] + - [set_router, ['@phpbbstudio.ass.router']] + - [set_user_loader, ['@user_loader']] + tags: + - { name: notification.type } + + phpbbstudio.ass.notification.type.stock: + class: phpbbstudio\ass\notification\type\stock + shared: false # service MUST not be shared for this to work! + parent: notification.type.base + calls: + - [set_auth, ['@auth']] + - [set_router, ['@phpbbstudio.ass.router']] + tags: + - { name: notification.type } diff --git a/ext/phpbbstudio/ass/config/services_objects.yml b/ext/phpbbstudio/ass/config/services_objects.yml new file mode 100644 index 0000000..c67614e --- /dev/null +++ b/ext/phpbbstudio/ass/config/services_objects.yml @@ -0,0 +1,75 @@ +services: + phpbbstudio.ass.entity.category: + class: phpbbstudio\ass\entity\category + shared: false + arguments: + - '@dbal.conn' + - '@text_formatter.parser' + - '@text_formatter.renderer' + - '@text_formatter.utils' + - '%phpbbstudio.ass.tables.categories%' + + phpbbstudio.ass.entity.item: + class: phpbbstudio\ass\entity\item + shared: false + arguments: + - '@config' + - '@dbal.conn' + - '@text_formatter.parser' + - '@text_formatter.renderer' + - '@phpbbstudio.ass.time' + - '@text_formatter.utils' + - '%phpbbstudio.ass.tables.items%' + + phpbbstudio.ass.operator.blocks: + class: phpbbstudio\ass\operator\blocks + arguments: + - '@phpbbstudio.aps.functions' + - '@auth' + - '@config' + - '@dbal.conn' + - '@group_helper' + - '@phpbbstudio.ass.operator.item' + - '@template' + - '@user_loader' + - '%phpbbstudio.ass.tables.categories%' + - '%phpbbstudio.ass.tables.items%' + - '%phpbbstudio.ass.tables.logs%' + + phpbbstudio.ass.operator.category: + class: phpbbstudio\ass\operator\category + arguments: + - '@auth' + - '@service_container' + - '@dbal.conn' + - '@phpbbstudio.ass.router' + - '%phpbbstudio.ass.tables.categories%' + + phpbbstudio.ass.operator.inventory: + class: phpbbstudio\ass\operator\inventory + arguments: + - '@phpbbstudio.aps.distributor' + - '@phpbbstudio.aps.functions' + - '@config' + - '@dbal.conn' + - '@phpbbstudio.ass.operator.item' + - '@user' + - '%phpbbstudio.ass.tables.inventory%' + - '%phpbbstudio.ass.tables.items%' + - '%tables.users%' + + phpbbstudio.ass.operator.item: + class: phpbbstudio\ass\operator\item + arguments: + - '@phpbbstudio.aps.dbal' + - '@auth' + - '@service_container' + - '@dbal.conn' + - '@phpbbstudio.ass.files' + - '@path_helper' + - '@phpbbstudio.ass.router' + - '@template' + - '@phpbbstudio.ass.time' + - '@user' + - '%phpbbstudio.ass.tables.categories%' + - '%phpbbstudio.ass.tables.items%' diff --git a/ext/phpbbstudio/ass/config/tables.yml b/ext/phpbbstudio/ass/config/tables.yml new file mode 100644 index 0000000..e4c17cf --- /dev/null +++ b/ext/phpbbstudio/ass/config/tables.yml @@ -0,0 +1,5 @@ +parameters: + phpbbstudio.ass.tables.categories: '%core.table_prefix%ass_categories' + phpbbstudio.ass.tables.inventory: '%core.table_prefix%ass_inventory' + phpbbstudio.ass.tables.items: '%core.table_prefix%ass_items' + phpbbstudio.ass.tables.logs: '%core.table_prefix%ass_logs' diff --git a/ext/phpbbstudio/ass/controller/acp_files_controller.php b/ext/phpbbstudio/ass/controller/acp_files_controller.php new file mode 100644 index 0000000..4fd060a --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_files_controller.php @@ -0,0 +1,295 @@ +cache = $cache; + $this->config = $config; + $this->files = $files; + $this->language = $language; + $this->request = $request; + $this->template = $template; + $this->user = $user; + } + + /** + * Handle and display the "Files" ACP mode. + * + * @return void + * @access public + */ + public function files() + { + $this->language->add_lang(['ass_acp_files', 'ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + $this->language->add_lang('posting'); + + $mode = $this->request->variable('m', '', true); + $action = $this->request->variable('action', '', true); + $directory = $this->request->variable('dir', '', true); + $item_file = $this->request->variable('file', '', true); + $item_img = $this->request->variable('image', '', true); + $img_input = $this->request->variable('input', '', true); + + $s_item_img = $this->request->is_set('image'); + $img_value = $item_img ? $item_img : ($s_item_img ? true : ''); + + switch ($mode) + { + case 'images': + case 'files': + $this->files->set_mode($mode); + $json_response = new \phpbb\json_response; + + $form_key = 'ass_files'; + add_form_key($form_key); + + switch ($action) + { + case 'add_dir': + if (!check_form_key($form_key)) + { + trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->get_file_action($mode, $directory), E_USER_WARNING)); + } + + $folder = $this->request->variable('folder', '', true); + + $refresh = str_replace('&', '&', $this->get_file_action($mode, $directory)); + + try + { + $this->files->add($directory, $folder); + } + catch (runtime_exception $e) + { + trigger_error($this->language->lang_array($e->getMessage(), array_merge([$this->language->lang('ASS_FOLDER')], $e->get_parameters())) . adm_back_link($refresh), E_USER_WARNING); + } + + if ($this->config['ass_purge_cache']) + { + $this->cache->purge(); + } + + if ($this->request->is_ajax()) + { + $json_response->send(['REFRESH_DATA' => ['url' => $refresh, 'time' => 0]]); + } + + redirect($refresh); + break; + + case 'add_file': + if (!check_form_key($form_key)) + { + trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->get_file_action($mode, $directory)), E_USER_WARNING); + } + + $refresh = str_replace('&', '&', $this->get_file_action($mode, $directory)); + + try + { + $this->files->upload($directory, 'file'); + } + catch (runtime_exception $e) + { + trigger_error($this->language->lang_array($e->getMessage(), array_merge([$this->language->lang('ASS_FILENAME')], $e->get_parameters())) . adm_back_link($refresh), E_USER_WARNING); + } + + if ($this->config['ass_purge_cache']) + { + $this->cache->purge(); + } + + redirect($refresh); + break; + + case 'delete_dir': + case 'delete_file': + $type = $action === 'delete_dir' ? 'FOLDER' : 'FILE'; + + if (confirm_box(true)) + { + $this->files->delete($directory); + + if ($this->config['ass_purge_cache']) + { + $this->cache->purge(); + } + + trigger_error("ASS_{$type}_DELETE_SUCCESS"); + } + else + { + confirm_box(false, "ASS_{$type}_DELETE", ''); + } + break; + + case 'select_file': + if (($item_img || $item_file) && !$this->request->is_set('dir')) + { + $directory = pathinfo($item_img, PATHINFO_DIRNAME); + $directory = $directory === '.' ? '' : $directory; + } + + $this->template->assign_vars([ + 'S_FILE_SELECT' => $s_item_img ? $img_input : 'file', + ]); + break; + } + + $files = $this->files->view($directory); + + foreach ($files['folders'] as $folder) + { + $file_time = $this->files->get_file_time($directory, $folder); + + $this->template->assign_block_vars('ass_folders', [ + 'NAME' => $folder, + 'TIME' => $file_time ? $this->user->format_date($file_time) : '', + 'U_DELETE' => $this->get_file_action($mode, ($directory ? $directory . '%2F' : '') . $folder, 'delete_dir'), + 'U_VIEW' => $this->get_file_action($mode, ($directory ? $directory . '%2F' : '') . $folder, $action, $img_value, $item_file, $img_input), + ]); + } + + foreach ($files['files'] as $file) + { + $dir_file = $directory ? $directory . '/' . $file : $file; + + $file_size = $this->files->get_file_size($directory, $file); + $file_time = $this->files->get_file_time($directory, $file); + + $this->template->assign_block_vars('ass_files', [ + 'NAME' => $file, + 'ICON' => $this->files->get_file_icon($file), + 'IMG' => $this->files->get_path($directory, true, $file), + 'SIZE' => $file_size ? get_formatted_filesize($file_size) : '', + 'TIME' => $file_time ? $this->user->format_date($file_time) : '', + 'VALUE' => $dir_file, + 'S_SELECTED' => $s_item_img ? $dir_file === $item_img : $dir_file === $item_file, + 'U_DELETE' => $this->get_file_action($mode, ($directory ? $directory . '%2F' : '') . $file, 'delete_file'), + ]); + } + + $directories = array_filter(explode('/', $directory)); + + $this->template->assign_vars([ + 'DIRECTORIES' => $directories, + + 'S_FILE_MODE' => $mode, + + 'U_ACTION' => $this->get_file_action($mode, '', $action, $img_value, $item_file, $img_input), + 'U_ACTION_FORM' => $this->get_file_action($mode, implode('%2F', $directories), $action), + 'U_BACK' => $this->u_action, + ]); + break; + + default: + $this->template->assign_vars([ + 'ALLOWED_EXTS' => $mode === 'images' ? implode(',', $this->files->get_extensions()) : '', + 'S_FILE_INDEX' => true, + 'U_FILE_FILES' => $this->get_file_action('files'), + 'U_FILE_IMAGES' => $this->get_file_action('images'), + ]); + break; + } + } + + /** + * Get a custom form action for the "files" mode. + * + * @param string $mode The file mode (images|files) + * @param string $directory The file directory + * @param string $action The action + * @param string $image The image name + * @param string $file The file name + * @param string $input The input field name + * @return string The custom form action + * @access protected + */ + protected function get_file_action($mode, $directory = '', $action = '', $image = '', $file = '', $input = '') + { + $mode = $mode ? "&m={$mode}" : ''; + $action = $action ? "&action={$action}" : ''; + $directory = $directory ? "&dir={$directory}" : ''; + $file = $file ? "&file={$file}" : ''; + $input = $input ? "&input={$input}" : ''; + + $image = $image === true ? '&image=' : ($image ? "&image={$image}" : ''); + + return "{$this->u_action}{$mode}{$directory}{$action}{$image}{$file}{$input}"; + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/acp_inventory_controller.php b/ext/phpbbstudio/ass/controller/acp_inventory_controller.php new file mode 100644 index 0000000..b1f28bc --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_inventory_controller.php @@ -0,0 +1,604 @@ +db = $db; + $this->group_helper = $group_helper; + $this->language = $language; + $this->log = $log; + $this->notification = $notification; + $this->operator_cat = $operator_cat; + $this->operator_item = $operator_item; + $this->request = $request; + $this->template = $template; + $this->user = $user; + + $this->groups_table = $groups_table; + $this->users_table = $users_table; + $this->user_group_table = $user_group_table; + $this->inventory_table = $inventory_table; + + $this->root_path = $root_path; + $this->php_ext = $php_ext; + } + + /** + * Handle and display the "Inventory" ACP mode. + * + * @return void + * @access public + */ + public function inventory() + { + $this->language->add_lang(['ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + + $type = $this->request->variable('type', '', true); + $submit = $this->request->is_set_post('submit'); + + $errors = []; + + $form_key = 'ass_inventory'; + add_form_key($form_key); + + switch ($type) + { + case 'global'; + $action = $this->request->variable('action', 'add', true); + $item_ids = $this->request->variable('items', [0]); + $group_ids = $this->request->variable('groups', [0]); + $usernames = $this->request->variable('usernames', '', true); + + $items = []; + + /** @var category $category */ + foreach ($this->operator_cat->get_categories() as $category) + { + $this->template->assign_block_vars('categories', array_merge([ + 'S_INACTIVE' => !$category->get_active(), + ], $this->operator_cat->get_variables($category))); + + $items += $category_items = $this->operator_item->get_items($category->get_id()); + + /** @var item $item */ + foreach ($category_items as $item) + { + $this->template->assign_block_vars('categories.items', array_merge([ + 'S_INACTIVE' => !$item->get_active(), + 'S_SELECTED' => in_array($item->get_id(), $item_ids), + ], $this->operator_item->get_variables($item))); + } + } + + if ($submit) + { + if (!check_form_key($form_key)) + { + $errors[] = 'FORM_INVALID'; + } + + if (!in_array($action, ['add', 'delete'])) + { + $errors[] = 'NO_ACTION'; + } + + if (empty($item_ids)) + { + $errors[] = 'ACP_ASS_NO_ITEMS_SELECTED'; + } + + $user_ids = []; + $usernames_array = array_filter(explode("\n", $usernames)); + + if (empty($usernames_array) && empty($group_ids)) + { + $this->language->add_lang('acp/permissions'); + + $errors[] = 'NO_USER_GROUP_SELECTED'; + } + + if (!empty($usernames_array)) + { + $this->get_ids_from_usernames($usernames_array, $user_ids, $errors); + } + + if (!empty($group_ids)) + { + $this->get_ids_from_groups($group_ids, $user_ids); + } + + if (empty($errors) && empty($user_ids)) + { + $errors[] = 'NO_GROUP_MEMBERS'; + } + + if (empty($errors)) + { + $user_ids = array_unique($user_ids); + + $this->update_inventory($action, $user_ids, $item_ids); + + $count_items = count($item_ids); + $count_users = count($user_ids); + + $item_names = []; + + foreach ($item_ids as $item_id) + { + $item_names[] = $items[$item_id]->get_title(); + } + + $l_action = 'ACP_ASS_INVENTORY_' . utf8_strtoupper($action); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, "LOG_{$l_action}", time(), [$count_items, implode(', ', $item_names), $count_users, implode(', ', $usernames_array)]); + + $message = $this->language->lang("{$l_action}_SUCCESS", $count_items); + $message .= '
                » ' . $this->language->lang('ACP_ASS_AMOUNT_ITEMS') . $this->language->lang('COLON') . ' ' . $count_items; + $message .= '
                » ' . $this->language->lang('ACP_ASS_AMOUNT_USERS') . $this->language->lang('COLON') . ' ' . $count_users; + $message .= adm_back_link($this->u_action); + + trigger_error($message); + } + } + + $sql = 'SELECT group_id, group_name, group_type + FROM ' . $this->groups_table . " + WHERE group_name <> 'BOTS' + AND group_name <> 'GUESTS' + ORDER BY group_type DESC, group_name ASC"; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $this->template->assign_block_vars('groups', [ + 'ID' => (int) $row['group_id'], + 'NAME' => $this->group_helper->get_name($row['group_name']), + 'S_SELECTED' => in_array((int) $row['group_id'], $group_ids), + 'S_SPECIAL' => GROUP_SPECIAL === (int) $row['group_type'], + ]); + } + $this->db->sql_freeresult($result); + + $this->template->assign_vars([ + 'USERNAMES' => $usernames, + 'S_ADD' => $action === 'add', + 'U_FIND_USER' => append_sid("{$this->root_path}memberlist.{$this->php_ext}", [ + 'mode' => 'searchuser', + 'form' => 'ass_inventory', + 'field' => 'usernames', + ]), + ]); + break; + + case 'manage': + $action = $this->request->variable('action', '', true); + $username = $this->request->variable('username', '', true); + $user_id = $this->request->variable('u', 0); + $item_ids = $this->request->variable('items', [0]); + + if (empty($username) && empty($user_id)) + { + $this->template->assign_var('U_FIND_USER', append_sid("{$this->root_path}memberlist.{$this->php_ext}", [ + 'mode' => 'searchuser', + 'form' => 'ass_inventory', + 'field' => 'username', + 'select_single' => true, + ])); + } + else + { + if (empty($user_id)) + { + $user_ids = []; + + $this->get_ids_from_usernames([$username], $user_ids, $errors); + + if (empty($user_ids)) + { + trigger_error($this->language->lang('NO_USER') . adm_back_link($this->u_action . "&type={$type}"), E_USER_WARNING); + } + + $user_id = (int) reset($user_ids); + } + + $rowset = []; + + $sql = 'SELECT i.*, u.username as gifter_name, u.user_colour as gifter_colour + FROM ' . $this->inventory_table . ' i + LEFT JOIN ' . $this->users_table . ' u + ON i.gifter_id = u.user_id + WHERE i.user_id = ' . (int) $user_id; + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $rowset[(int) $row['item_id']] = $row; + } + $this->db->sql_freeresult($result); + + $inventory = [ + 'categories' => array_column($rowset, 'category_id'), + 'items' => array_keys($rowset), + ]; + + $items = []; + $categories = $this->operator_cat->get_categories(); + + /** @var category $category */ + foreach ($categories as $category) + { + $this->template->assign_block_vars('categories', array_merge([ + 'S_INACTIVE' => !$category->get_active(), + 'S_INVENTORY' => in_array($category->get_id(), $inventory['categories']), + ], $this->operator_cat->get_variables($category))); + + $items += $category_items = $this->operator_item->get_items($category->get_id()); + + /** @var item $item */ + foreach ($category_items as $item) + { + $variables = array_merge([ + 'S_INACTIVE' => !$item->get_active(), + 'S_INVENTORY' => in_array($item->get_id(), $inventory['items']), + 'S_SELECTED' => in_array($item->get_id(), $item_ids), + ], $this->operator_item->get_variables($item)); + + if ($variables['S_INVENTORY']) + { + $row = $rowset[$item->get_id()]; + + $variables = array_merge($variables, [ + 'GIFTER' => $row['gifter_id'] ? get_username_string('full', $row['gifter_id'], $row['gifter_name'], $row['gifter_colour']) : '', + 'PURCHASE_TIME' => $this->user->format_date($row['purchase_time']), + 'USE_TIME' => $row['use_time'] ? $this->user->format_date($row['use_time']) : $this->language->lang('NEVER'), + 'USE_COUNT' => (int) $row['use_count'], + ]); + } + + $this->template->assign_block_vars('categories.items', $variables); + } + } + + $u_back = $this->u_action . "&type={$type}&u={$user_id}"; + + if ($action === 'delete') + { + $item_id = $this->request->variable('iid', 0); + + if (confirm_box(true)) + { + $this->update_inventory($action, [$user_id], [$item_id]); + + if (empty($username)) + { + $username = $this->get_username($user_id); + } + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_INVENTORY_DELETE_USER', time(), [$items[$item_id]->get_title(), $username]); + + trigger_error($this->language->lang('ASS_DELETE_SUCCESS') . adm_back_link($u_back)); + } + else + { + confirm_box(false, 'ASS_DELETE', ''); + + redirect($u_back); + } + } + + if ($submit) + { + if (!check_form_key($form_key)) + { + $errors[] = 'FORM_INVALID'; + } + + if (empty($item_ids)) + { + $errors[] = 'ACP_ASS_NO_ITEMS_SELECTED'; + } + + if (empty($errors)) + { + $this->update_inventory('add', [$user_id], $item_ids); + + if (empty($username)) + { + $username = $this->get_username($user_id); + } + + $count_items = count($item_ids); + + $item_names = []; + + foreach ($item_ids as $item_id) + { + $item_names[] = $items[$item_id]->get_title(); + } + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_INVENTORY_ADD_USER', time(), [$count_items, implode(', ', $item_names), $username]); + + trigger_error($this->language->lang('ACP_ASS_INVENTORY_ADD_SUCCESS', $count_items) . adm_back_link($u_back)); + } + } + + $this->template->assign_vars([ + 'ASS_USERNAME' => $username, + + 'U_DELETE' => $this->u_action . "&type={$type}&u={$user_id}&action=delete&iid=", + ]); + } + break; + + default: + $this->template->assign_vars([ + 'U_GLOBAL' => $this->u_action . '&type=global', + 'U_MANAGE' => $this->u_action . '&type=manage', + ]); + break; + } + + $this->template->assign_vars([ + 'ERRORS' => $errors, + + 'S_TYPE' => $type, + + 'U_ACTION' => $this->u_action . ($type ? "&type={$type}" : ''), + 'U_BACK' => $this->u_action, + ]); + } + + /** + * Update users' inventories. + * + * @param string $action The action to perform (add|delete) + * @param array $user_ids The user identifiers + * @param array $item_ids The item identifiers + * @return void + * @access protected + */ + protected function update_inventory($action, array $user_ids, array $item_ids) + { + switch ($action) + { + case 'add': + $owned = []; + $stack = []; + + $sql = 'SELECT item_id, user_id + FROM ' . $this->inventory_table . ' + WHERE ' . $this->db->sql_in_set('item_id', $item_ids) . ' + AND ' . $this->db->sql_in_set('user_id', $user_ids); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $item_id = (int) $row['item_id']; + $user_id = (int) $row['user_id']; + + $owned[$item_id][] = $user_id; + $stack[$user_id][$item_id][] = $item_id; + } + $this->db->sql_freeresult($result); + + $items = $this->operator_item->get_items_by_id($item_ids); + + foreach ($item_ids as $item_id) + { + /** @var item $item */ + $item = $items[$item_id]; + + $users = !empty($owned[$item_id]) && !$item->get_stack() ? array_diff($user_ids, $owned[$item_id]) : $user_ids; + + foreach ($users as $user_id) + { + $sql = 'INSERT INTO ' . $this->inventory_table . ' ' . $this->db->sql_build_array('INSERT', [ + 'category_id' => $item->get_category(), + 'item_id' => $item->get_id(), + 'user_id' => $user_id, + 'gifter_id' => (int) $this->user->data['user_id'], + 'purchase_time' => time(), + 'purchase_price' => 0.00, + ]); + $this->db->sql_query($sql); + + $index = !empty($stack[$user_id][$item_id]) ? count($stack[$user_id][$item_id]) : 0; + $index = $index + 1; + + $this->notification->gift($item, $user_id, $this->db->sql_nextid(), $index); + } + } + break; + + case 'delete': + $sql = 'DELETE FROM ' . $this->inventory_table . ' + WHERE ' . $this->db->sql_in_set('item_id', $item_ids) . ' + AND ' . $this->db->sql_in_set('user_id', $user_ids); + $this->db->sql_query($sql); + break; + } + } + + /** + * Get user identifiers from usernames. + * + * @param array $usernames The usernames + * @param array $user_ids The user identifiers + * @param array $errors The errors + * @return void + * @access protected + */ + protected function get_ids_from_usernames(array $usernames, array &$user_ids, array &$errors) + { + $usernames_clean = []; + $usernames_found = []; + + foreach ($usernames as $username) + { + $usernames_clean[$username] = utf8_clean_string($username); + } + + $sql = 'SELECT user_id, username_clean + FROM ' . $this->users_table . ' + WHERE ' . $this->db->sql_in_set('username_clean', $usernames_clean); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $usernames_found[] = $row['username_clean']; + $user_ids[] = (int) $row['user_id']; + } + $this->db->sql_freeresult($result); + + $usernames_not_found = array_diff($usernames_clean, $usernames_found); + + if (!empty($usernames_not_found)) + { + $errors[] = count($usernames_not_found) > 1 ? 'NO_USERS' : 'NO_USER'; + + $not_found = array_intersect($usernames_clean, $usernames_not_found); + $not_found = array_flip($not_found); + + foreach ($not_found as $username) + { + $errors[] = '» ' . $username; + } + } + } + + /** + * Get user identifiers from group identifiers. + * + * @param array $group_ids The group identifiers + * @param array $user_ids The user identifiers + * @return void + * @access protected + */ + protected function get_ids_from_groups(array $group_ids, array &$user_ids) + { + $sql = 'SELECT user_id + FROM ' . $this->user_group_table . ' + WHERE user_pending <> 1 + AND ' . $this->db->sql_in_set('group_id', $group_ids); + $result = $this->db->sql_query($sql); + while ($row = $this->db->sql_fetchrow($result)) + { + $user_ids[] = (int) $row['user_id']; + } + $this->db->sql_freeresult($result); + } + + /** + * Get a username from user identifier. + * + * @param int $user_id The user identifier + * @return string The username + * @access protected + */ + protected function get_username($user_id) + { + $sql = 'SELECT username + FROM ' . $this->users_table . ' + WHERE user_id = ' . (int) $user_id; + $result = $this->db->sql_query_limit($sql, 1); + $username = $this->db->sql_fetchfield('username'); + $this->db->sql_freeresult($result); + + return (string) $username; + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/acp_items_controller.php b/ext/phpbbstudio/ass/controller/acp_items_controller.php new file mode 100644 index 0000000..5336dac --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_items_controller.php @@ -0,0 +1,703 @@ +cache = $cache; + $this->items_manager = $items_manager; + $this->language = $language; + $this->log = $log; + $this->operator_cat = $operator_cat; + $this->operator_inv = $operator_inv; + $this->operator_item = $operator_item; + $this->request = $request; + $this->template = $template; + $this->time = $time; + $this->user = $user; + + $this->admin_path = $root_path . $admin_path; + $this->root_path = $root_path; + $this->php_ext = $php_ext; + } + + /** + * Handle and display the "Items" ACP mode. + * + * @return void + * @access public + */ + public function items() + { + $this->language->add_lang(['ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + + $action = $this->request->variable('action', '', true); + $item_id = $this->request->variable('iid', 0); + $category_id = $this->request->variable('cid', 0); + + $s_items = ($item_id || ($category_id && strpos($action, 'cat_') !== 0)); + + switch ($action) + { + case 'move': + $id = $this->request->variable('id', 0); + $order = $this->request->variable('order', 0) + 1; + + $s_items ? $this->operator_item->move($id, $order) : $this->operator_cat->move($id, $order); + break; + + case 'resolve': + $item = $this->operator_item->get_entity()->load($item_id); + $category = $this->operator_cat->get_entity()->load($item->get_category()); + + if (confirm_box(true)) + { + $item->set_conflict(false) + ->save(); + + $category->set_conflicts($category->get_conflicts() - 1) + ->save(); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_ITEM_RESOLVED', time(), [$item->get_title()]); + + if ($this->request->is_ajax()) + { + $json_response = new \phpbb\json_response; + + $json_response->send([ + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + 'MESSAGE_TEXT' => $this->language->lang('ACP_ASS_ITEM_RESOLVE_SUCCESS') + ]); + } + + trigger_error($this->language->lang('ACP_ASS_ITEM_RESOLVE_SUCCESS') . adm_back_link($this->u_action . '&iid=' . $item->get_id())); + } + else + { + confirm_box(false, 'ACP_ASS_ITEM_RESOLVE', ''); + + redirect($this->u_action . '&iid=' . $item->get_id()); + } + break; + + case 'type': + $json_response = new \phpbb\json_response; + + $type = $this->items_manager->get_type($this->request->variable('type', '', true)); + + if ($type !== null) + { + $data = $item_id ? $this->operator_item->get_entity()->load($item_id)->get_data() : []; + + $this->template->set_filenames(['type' => $type->get_acp_template($data)]); + + $this->template->assign_var('U_ACTION', $this->u_action); + + try + { + $body = $this->template->assign_display('type'); + + $json_response->send([ + 'success' => true, + 'body' => $body, + ]); + } + /** @noinspection PhpRedundantCatchClauseInspection */ + catch (\Twig\Error\Error $e) + { + $json_response->send([ + 'error' => true, + 'MESSAGE_TEXT' => $e->getMessage(), + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + ]); + } + } + else + { + $json_response->send([ + 'error' => true, + 'MESSAGE_TEXT' => $this->language->lang('ASS_ITEM_TYPE_NOT_EXIST'), + 'MESSAGE_TITLE' => $this->language->lang('INFORMATION'), + ]); + } + break; + + case 'cat_delete': + case 'delete': + $s_item = $action === 'delete'; + + $item = $s_item ? $this->operator_item->get_entity()->load($item_id) : null; + $category = $this->operator_cat->get_entity()->load($s_item ? $item->get_category() : $category_id); + + $l_mode = $s_item ? 'ITEM' : 'CATEGORY'; + $u_mode = $this->u_action . ($s_item ? "&cid={$item->get_category()}" : ''); + + if ($s_item) + { + $type = $this->items_manager->get_type($item->get_type()); + + if ($type !== null && $type->is_admin_authed() === false) + { + trigger_error($this->language->lang('ACP_ASS_ITEM_TYPE_NO_AUTH'), E_USER_WARNING); + } + } + + if (confirm_box(true)) + { + if (!$s_item) + { + $this->operator_cat->delete_category($category_id); + } + + $this->operator_item->delete_items($category_id, $item_id); + $this->operator_inv->delete_items($category_id, $item_id); + + $log_title = $s_item ? $item->get_title() : $category->get_title(); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, "LOG_ACP_ASS_{$l_mode}_DELETED", false, [$log_title]); + + $message = $this->language->lang("ACP_ASS_{$l_mode}_DELETE_SUCCESS"); + + if (!$this->request->is_ajax()) + { + $message .= adm_back_link($u_mode); + } + + trigger_error($message); + } + else + { + confirm_box(false, "ACP_ASS_{$l_mode}_DELETE", build_hidden_fields([ + 'action' => $action, + 'cid' => $category_id, + 'iid' => $item_id, + ])); + + redirect($u_mode); + } + break; + + case 'cat_add': + case 'cat_edit': + case 'add': + case 'copy': + case 'edit': + $s_edit = in_array($action, ['edit', 'cat_edit']); + $s_item = in_array($action, ['add', 'copy', 'edit']); + + $entity = $s_item ? $this->operator_item->get_entity() : $this->operator_cat->get_entity(); + + if ($s_edit) + { + try + { + $entity->load(($s_item ? $item_id : $category_id)); + } + catch (runtime_exception $e) + { + $message = $this->language->lang($e->getMessage(), $this->language->lang($s_item ? 'ASS_ITEM' : 'ASS_CATEGORY')); + trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING); + } + } + else if ($s_item) + { + // Copy an item + if ($action === 'copy') + { + $data = $this->operator_item->get_items_by_id([$item_id], false); + + if (empty($data[0])) + { + $message = $this->language->lang('ASS_ERROR_NOT_FOUND', $this->language->lang('ASS_ITEM')); + trigger_error($message . adm_back_link($this->u_action), E_USER_WARNING); + } + + $data = array_diff_key($data[0], array_flip([ + 'item_id', + 'item_title', + 'item_slug', + 'item_purchases', + 'item_stock', + 'item_create_time', + 'item_edit_time', + 'item_conflict', + 'category_slug', + ])); + + $entity->import($data); + + $action = 'add'; + $item_id = 0; + $category_id = $entity->get_category(); + } + else + { + $entity->set_category($category_id); + } + } + + if ($s_item && $s_edit) + { + $type = $this->items_manager->get_type($entity->get_type()); + + if ($type !== null && $type->is_admin_authed() === false) + { + $message = $this->language->lang('ACP_ASS_ITEM_TYPE_NO_AUTH'); + $u_back = $this->u_action . ($entity->get_category() ? '&cid=' . $entity->get_category() : ''); + + trigger_error($message . adm_back_link($u_back), E_USER_WARNING); + } + } + + $this->add_edit_data($entity, $s_item); + + $this->template->assign_vars([ + 'S_ASS_ADD' => !$s_edit, + 'S_ASS_EDIT' => $s_edit, + ]); + break; + } + + if ($s_items) + { + /** @var item $entity */ + foreach ($this->operator_item->get_items($category_id) as $entity) + { + /** @var item_type $type */ + $type = $this->items_manager->get_type($entity->get_type()); + + $s_auth = $type !== null ? $type->is_admin_authed() : true; + + $this->template->assign_block_vars('ass_items', [ + 'ID' => $entity->get_id(), + 'TITLE' => $entity->get_title(), + 'SLUG' => $entity->get_slug(), + 'ICON' => $entity->get_icon(), + 'CONFLICT' => $entity->get_conflict(), + + 'S_ACTIVE' => $entity->get_active(), + 'S_AVAILABLE' => $this->operator_item->is_available($entity), + 'S_AUTH' => $s_auth, + + 'U_DELETE' => $s_auth ? "{$this->u_action}&action=delete&iid={$entity->get_id()}" : '', + 'U_COPY' => $s_auth ? "{$this->u_action}&action=copy&iid={$entity->get_id()}" : '', + 'U_EDIT' => $s_auth ? "{$this->u_action}&action=edit&iid={$entity->get_id()}" : '', + ]); + } + } + else + { + /** @var category $entity */ + foreach ($this->operator_cat->get_categories() as $entity) + { + $this->template->assign_block_vars('ass_categories', [ + 'ID' => $entity->get_id(), + 'TITLE' => $entity->get_title(), + 'SLUG' => $entity->get_slug(), + 'ICON' => $entity->get_icon(), + 'CONFLICT' => $entity->get_conflicts(), + + 'S_ACTIVE' => $entity->get_active(), + 'S_AUTH' => true, + + 'U_DELETE' => "{$this->u_action}&action=cat_delete&cid={$entity->get_id()}", + 'U_EDIT' => "{$this->u_action}&action=cat_edit&cid={$entity->get_id()}", + 'U_VIEW' => "{$this->u_action}&cid={$entity->get_id()}", + ]); + } + } + + $this->template->assign_vars([ + 'S_ITEMS' => $s_items, + + 'U_ACTION' => $this->u_action . ($action ? "&action=$action" : '') . ($category_id ? "&cid=$category_id" : '') . ($item_id ? "&iid=$item_id" : ''), + 'U_ASS_ADD' => $this->u_action . '&action=' . ($s_items ? 'add' : 'cat_add') . ($category_id ? "&cid=$category_id" : ''), + 'U_BACK' => $this->u_action, + ]); + } + + /** + * Handle adding and editing an entity. + * + * @param item|category $entity The entity + * @param bool $s_item Whether it's an item or a category + * @return void + * @access protected + */ + protected function add_edit_data($entity, $s_item) + { + $errors = []; + $submit = $this->request->is_set_post('submit'); + $s_edit = (bool) $entity->get_id(); + $l_mode = $s_item ? 'ITEM' : 'CATEGORY'; + + $form_key = 'add_edit_categories'; + add_form_key($form_key); + + $data = [ + 'active' => $this->request->variable('active', false), + 'title' => $this->request->variable('title', '', true), + 'slug' => $this->request->variable('slug', '', true), + 'icon' => $this->request->variable('icon', '', true), + 'desc' => $this->request->variable('desc', '', true), + ]; + + if ($s_item) + { + $data += [ + 'type' => $this->request->variable('type', '', true), + 'price' => $this->request->variable('price', 0.00), + 'stock_unlimited' => $this->request->variable('stock_unlimited', false), + 'stock' => $this->request->variable('stock', 0), + 'stock_threshold' => $this->request->variable('stock_threshold', 0), + 'gift' => $this->request->variable('gift', false), + 'gift_only' => $this->request->variable('gift_only', false), + 'gift_type' => $this->request->variable('gift_type', false), + 'gift_percentage' => $this->request->variable('gift_percentage', 0), + 'gift_price' => $this->request->variable('gift_price', 0.00), + 'sale_price' => $this->request->variable('sale_price', 0.00), + 'sale_start' => $this->request->variable('sale_start', ''), + 'sale_until' => $this->request->variable('sale_until', ''), + 'featured_start' => $this->request->variable('featured_start', ''), + 'featured_until' => $this->request->variable('featured_until', ''), + 'available_start' => $this->request->variable('available_start', ''), + 'available_until' => $this->request->variable('available_until', ''), + 'count' => $this->request->variable('count', 0), + 'stack' => $this->request->variable('stack', 1), + 'refund_string' => $this->request->variable('refund_string', '', true), + 'expire_string' => $this->request->variable('expire_string', '', true), + 'delete_string' => $this->request->variable('delete_string', '', true), + 'background' => $this->request->variable('background', '', true), + 'images' => $this->request->variable('images', [''], true), + 'related_enabled' => $this->request->variable('related_enabled', false), + 'related_items' => $this->request->variable('related_items', [0]), + ]; + + $post_variables = $this->request->get_super_global(\phpbb\request\request_interface::POST); + + $data['data'] = isset($post_variables['data']) ? $this->request->escape($post_variables['data'], true) : []; + } + + if ($submit) + { + if (!check_form_key($form_key)) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + + foreach ($data as $key => $value) + { + try + { + $entity->{"set_{$key}"}($value); + + if ($key === 'slug' && $value !== $entity->get_slug()) + { + $s_purge = true; + } + } + catch (runtime_exception $e) + { + $errors[] = $this->get_error_message($e, $l_mode); + } + } + + if ($s_item) + { + $type = $this->items_manager->get_type($entity->get_type()); + + if ($type === null) + { + $errors[] = $this->language->lang('ASS_ITEM_TYPE_NOT_EXIST'); + } + else + { + $errors += (array) $type->validate_acp_data($entity->get_data()); + } + } + + if (empty($errors)) + { + $function = $s_edit ? 'save' : 'insert'; + $message = $s_edit ? "ACP_ASS_{$l_mode}_EDIT_SUCCESS" : "ACP_ASS_{$l_mode}_ADD_SUCCESS"; + $action = $s_edit ? "LOG_ACP_ASS_{$l_mode}_EDITED" : "LOG_ACP_ASS_{$l_mode}_ADDED"; + + try + { + $entity->$function(); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $action, false, [$entity->get_title()]); + + if (!empty($s_purge)) + { + $this->cache->purge(); + } + + $return = $this->u_action . ($s_item ? "&cid={$entity->get_category()}" : ''); + + meta_refresh(3, $return); + + trigger_error($this->language->lang($message) . adm_back_link($return)); + } + catch (runtime_exception $e) + { + $errors[] = $this->get_error_message($e, $l_mode); + } + } + } + + $this->generate_bbcodes(); + + if ($s_item) + { + $type = $this->items_manager->get_type($entity->get_type()); + + $this->items_manager->set_types_for_select($entity->get_type()); + + $this->template->assign_vars($this->operator_item->get_variables($entity, 'ITEM_', false)); + + $this->template->assign_vars([ + 'ITEM_HELP_DATA' => $this->get_help_data(array_keys($data), $s_edit), + + 'T_ITEM_TEMPLATE' => $type !== null ? $type->get_acp_template($entity->get_data()) : '', + + 'U_ITEM_IMAGE' => $this->u_action . '&m=images&action=select_file&image=', + 'U_ITEM_RESOLVE' => $this->u_action . '&iid=' . $entity->get_id() . '&action=resolve', + 'U_ITEM_TYPE' => $this->u_action . '&iid=' . $entity->get_id() . '&action=type', + 'U_ITEM_ERROR_LOG' => append_sid("{$this->admin_path}index.{$this->php_ext}", [ + 'i' => 'acp_logs', + 'mode' => 'admin', + 'keywords' => urlencode(htmlspecialchars_decode($entity->get_title())), + ]), + ]); + + $this->set_related_items_for_select($entity->get_id(), $entity->get_related_items()); + + if ($s_edit && !$submit && $type === null) + { + $errors[] = $this->language->lang('ASS_ITEM_TYPE_NOT_EXIST'); + } + } + else + { + $this->template->assign_vars($this->operator_cat->get_variables($entity, 'CATEGORY_', false)); + } + + $this->template->assign_vars([ + 'ASS_ERRORS' => $errors, + 'DATE_FORMAT' => $this->time->get_format(), + 'TIMEZONE' => $this->time->get_timezone(), + ]); + } + + /** + * Generate BBCodes for a textarea editor. + * + * @return void + * @access protected + */ + protected function generate_bbcodes() + { + include_once $this->root_path . 'includes/functions_display.' . $this->php_ext; + + $this->language->add_lang('posting'); + + display_custom_bbcodes(); + + $this->template->assign_vars([ + 'S_BBCODE_IMG' => true, + 'S_BBCODE_QUOTE' => true, + 'S_BBCODE_FLASH' => true, + 'S_LINKS_ALLOWED' => true, + ]); + } + + /** + * Get a localised error message from a thrown exception. + * + * @param runtime_exception $e The thrown exception + * @param string $mode The mode (ITEM|CATEGORY) + * @return string The localised error message. + * @access protected + */ + protected function get_error_message(runtime_exception $e, $mode) + { + $params = $e->get_parameters(); + + $field = array_shift($params); + $field = $field ? "ACP_ASS_{$mode}_{$field}" : "ASS_{$mode}"; + + $params = array_merge([$this->language->lang($field)], $params); + + return $this->language->lang_array($e->getMessage(), $params); + } + + /** + * The item's data keys. + * + * @param array $data Item's data keys + * @param bool $s_edit Whether or not the item is being edited + * @return array Item help data values + * @access protected + */ + protected function get_help_data(array $data, $s_edit) + { + $this->language->add_lang('ass_acp_help', 'phpbbstudio/ass'); + + $data = array_filter($data, function($value) { + return $value !== 'data' && strpos($value, '_until') === false; + }); + + if ($s_edit) + { + $data = array_merge($data, ['dates', 'states', 'stock_info', 'sale_info']); + } + + return $data; + } + + /** + * Assign categories and items to the template for the related items selection. + * + * @param int $item_id The item identifiers + * @param array $item_ids The related items identifiers + * @return void + * @access protected + */ + protected function set_related_items_for_select($item_id, array $item_ids) + { + /** @var category $category */ + foreach ($this->operator_cat->get_categories() as $category) + { + $this->template->assign_block_vars('categories', array_merge([ + 'S_INACTIVE' => !$category->get_active(), + ], $this->operator_cat->get_variables($category))); + + /** @var item $item */ + foreach ($this->operator_item->get_items($category->get_id()) as $item) + { + if ($item->get_id() === $item_id) + { + continue; + } + + $this->template->assign_block_vars('categories.items', array_merge([ + 'S_INACTIVE' => !$item->get_active(), + 'S_SELECTED' => in_array($item->get_id(), $item_ids), + ], $this->operator_item->get_variables($item))); + } + } + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/acp_logs_controller.php b/ext/phpbbstudio/ass/controller/acp_logs_controller.php new file mode 100644 index 0000000..f121ac5 --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_logs_controller.php @@ -0,0 +1,246 @@ +config = $config; + $this->items_manager = $items_manager; + $this->language = $language; + $this->log = $log; + $this->log_phpbb = $log_phpbb; + $this->operator_cat = $operator_cat; + $this->operator_item = $operator_item; + $this->pagination = $pagination; + $this->request = $request; + $this->template = $template; + $this->user = $user; + } + + /** + * Handle and display the "Logs" ACP mode. + * + * @return void + * @access public + */ + public function logs() + { + $this->language->add_lang(['ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + + $show_array = [ + 'all' => ['title' => 'ASS_ALL', 'sql' => ''], + 'use' => ['title' => 'ASS_USAGES', 'sql' => 'l.item_purchase = 0'], + 'buy' => ['title' => 'ASS_PURCHASES', 'sql' => 'l.item_purchase = 1 AND l.recipient_id = 0'], + 'given' => ['title' => 'ASS_GIFTS_GIVEN', 'sql' => 'l.item_purchase = 1 AND l.recipient_id <> 0'], + ]; + $sort_array = [ + 'time' => ['title' => 'TIME', 'sql' => 'l.log_time'], + 'price' => ['title' => 'ASS_ITEM_PRICE', 'sql' => 'l.points_sum'], + 'item' => ['title' => 'ASS_ITEM_TITLE', 'sql' => 'i.item_title'], + 'category' => ['title' => 'ASS_CATEGORY_TITLE', 'sql' => 'c.category_title'], + 'recipient' => ['title' => 'ASS_RECIPIENT_NAME', 'sql' => 'recipient_name'], + ]; + $dir_array = [ + 'desc' => ['title' => 'DESCENDING', 'sql' => 'DESC'], + 'asc' => ['title' => 'ASCENDING', 'sql' => 'ASC'], + ]; + + $page = $this->request->variable('page', 1); + $show = $this->request->variable('display', 'all', true); + $sort = $this->request->variable('sort', 'time', true); + $dir = $this->request->variable('direction', 'desc', true); + + $show = in_array($show, array_keys($show_array)) ? $show : 'all'; + $sort = in_array($sort, array_keys($sort_array)) ? $sort : 'time'; + $dir = in_array($dir, array_keys($dir_array)) ? $dir : 'desc'; + + $delete_mark = $this->request->variable('del_marked', false, false, \phpbb\request\request_interface::POST); + $delete_all = $this->request->variable('del_all', false, false, \phpbb\request\request_interface::POST); + $marked = $this->request->variable('mark', [0]); + + $log_action = $this->u_action . "&display={$show}&sort={$sort}&direction={$dir}"; + + if (($delete_mark || $delete_all)) + { + if (confirm_box(true)) + { + $this->log->delete($delete_all, $marked); + + $l_delete = $delete_all ? 'ALL' : (count($marked) > 1 ? 'ENTRIES' : 'ENTRY'); + + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, "LOG_ACP_ASS_LOG_DELETED_{$l_delete}"); + + trigger_error($this->language->lang("ACP_ASS_LOG_DELETED_{$l_delete}") . adm_back_link($log_action . "&page{$page}")); + } + else + { + confirm_box(false, $this->language->lang('CONFIRM_OPERATION'), build_hidden_fields([ + 'del_marked' => $delete_mark, + 'del_all' => $delete_all, + 'mark' => $marked, + ])); + + redirect($log_action . "&page{$page}"); + } + } + + $sql_where = $show_array[$show]['sql']; + $sql_order = $sort_array[$sort]['sql']; + $sql_dir = $dir_array[$dir]['sql']; + + $limit = (int) $this->config['ass_logs_per_page']; + $start = ($page - 1) * $limit; + + $total = $this->log->get_user_logs_count($sql_where); + $rowset = $this->log->get_user_logs($sql_where, $sql_order, $sql_dir, $limit, $start); + + $categories = $this->operator_cat->get_categories_by_id(array_column($rowset, 'category_id')); + $items = $this->operator_item->get_items_by_id(array_column($rowset, 'item_id')); + + foreach ($rowset as $row) + { + $category_id = (int) $row['category_id']; + $item_id = (int) $row['item_id']; + + /** @var category $category */ + $category = !empty($categories[$category_id]) ? $categories[$category_id] : null; + + /** @var item $item */ + $item = !empty($items[$item_id]) ? $items[$item_id] : null; + + /** @var item_type $type */ + $type = $item ? $this->items_manager->get_type($item->get_type()) : null; + + $this->template->assign_block_vars('ass_logs', [ + 'CATEGORY_TITLE' => $category ? $category->get_title() : $this->language->lang('ASS_UNAVAILABLE_CATEGORY'), + 'ITEM_TITLE' => $item ? $item->get_title() : $this->language->lang('ASS_UNAVAILABLE_ITEM'), + + 'LOG_ACTION' => $type ? $this->language->lang($type->get_language('log')) : $this->language->lang('ASS_UNAVAILABLE_' . (!$item ? 'ITEM' : 'TYPE')), + 'LOG_ID' => $row['log_id'], + 'LOG_IP' => $row['log_ip'], + 'LOG_TIME' => $this->user->format_date($row['log_time']), + + 'POINTS_NEW' => $row['points_new'], + 'POINTS_OLD' => $row['points_old'], + 'POINTS_SUM' => -$row['points_sum'], + + 'RECIPIENT' => $row['recipient_id'] ? get_username_string('full', $row['recipient_id'], $row['recipient_name'], $row['recipient_colour']) : '', + 'USER' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + + 'S_PURCHASE' => $row['item_purchase'], + 'S_GIFT_RECEIVE' => $row['recipient_id'] != 0, + ]); + } + + $this->pagination->generate_template_pagination($log_action, 'pagination', 'page', $total, $limit, $start); + + $this->template->assign_vars([ + 'SORT_DISPLAY' => $show, + 'SORT_DISPLAY_ARRAY' => $show_array, + 'SORT_SORT' => $sort, + 'SORT_SORT_ARRAY' => $sort_array, + 'SORT_DIR' => $dir, + 'SORT_DIR_ARRAY' => $dir_array, + + 'TOTAL_LOGS' => $this->language->lang('TOTAL_LOGS', $total), + + 'U_ACTION' => $this->u_action, + ]); + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/acp_overview_controller.php b/ext/phpbbstudio/ass/controller/acp_overview_controller.php new file mode 100644 index 0000000..cb540c3 --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_overview_controller.php @@ -0,0 +1,444 @@ +config = $config; + $this->config_text = $config_text; + $this->db = $db; + $this->language = $language; + $this->operator_item = $operator_item; + $this->parser = $parser; + $this->renderer = $renderer; + $this->request = $request; + $this->template = $template; + $this->user_loader = $user_loader; + $this->utils = $utils; + + $this->categories_table = $categories_table; + $this->items_table = $items_table; + $this->logs_table = $logs_table; + } + + /** + * Handle and display the "Overview" ACP mode. + * + * @return void + * @access public + */ + public function overview() + { + $this->language->add_lang(['ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + + $action = $this->request->variable('action', '', true); + $submit = $this->request->is_set_post('submit'); + + $notes = $this->config_text->get('ass_admin_notes'); + + if ($action === 'notes') + { + if ($submit) + { + $notes = $this->parser->parse($this->request->variable('notes', '', true)); + + $this->config_text->set('ass_admin_notes', $notes); + } + else + { + $this->template->assign_vars([ + 'NOTES_EDIT' => $this->utils->unparse($notes), + 'S_NOTES' => true, + ]); + } + } + + $item_modes = [ + 'featured', 'featured_coming', 'sale', 'sale_coming', + 'low_stock', 'low_sellers', 'top_sellers', 'recent', + ]; + + foreach ($item_modes as $mode) + { + $items = $this->get_items($mode); + + foreach ($items as $item) + { + $this->template->assign_block_vars($mode, $this->operator_item->get_variables($item)); + } + } + + foreach ($this->get_recent() as $row) + { + $item = $this->operator_item->get_entity()->import($row); + + $this->template->assign_block_vars('purchases', array_merge( + $this->operator_item->get_variables($item), + ['PURCHASE_TIME' => (int) $row['log_time']] + )); + } + + $buyers = $this->get_users('buyers'); + $gifters = $this->get_users('gifters'); + $spenders = $this->get_users('spenders'); + + $this->user_loader->load_users(array_merge(array_keys($buyers), array_keys($gifters), array_keys($spenders))); + + $users = [ + 'buyers' => $buyers, + 'gifters' => $gifters, + 'spenders' => $spenders, + ]; + + foreach ($users as $user_mode => $users_array) + { + foreach ($users_array as $user_id => $count) + { + $this->template->assign_block_vars($user_mode, [ + 'NAME' => $this->user_loader->get_username($user_id, 'full'), + 'AVATAR' => $this->user_loader->get_avatar($user_id), + 'COUNT' => $count, + ]); + } + } + + $this->template->assign_vars([ + 'COUNTS' => $this->get_counts(), + 'NOTES' => $notes ? $this->renderer->render(htmlspecialchars_decode($notes, ENT_COMPAT)) : '', + + 'GIFTING_ENABLED' => (bool) $this->config['ass_gift_enabled'], + 'NO_IMAGE_ICON' => (string) $this->config['ass_no_image_icon'], + 'SHOP_ACTIVE' => (bool) $this->config['ass_active'], + 'SHOP_ENABLED' => (bool) $this->config['ass_enabled'], + + 'U_ACTION' => $this->u_action, + 'U_NOTES' => $this->u_action . '&action=notes', + ]); + } + + /** + * Get items for a specific mode. + * + * @param string $mode The item mode (featured|sale|etc..) + * @return array Item entities + * @access protected + */ + protected function get_items($mode) + { + $sql_array = [ + 'SELECT' => 'i.*', + 'FROM' => [$this->items_table => 'i'], + 'WHERE' => $this->get_sql_where($mode), + 'ORDER_BY' => $this->get_sql_order($mode), + ]; + + $sql = $this->db->sql_build_query('SELECT', $sql_array); + $result = $this->db->sql_query_limit($sql, 5); + $rowset = $this->db->sql_fetchrowset($result); + $this->db->sql_freeresult($result); + + return $this->operator_item->get_entities($rowset); + } + + /** + * Get recent items. + * + * @return array Item entities + * @access protected + */ + protected function get_recent() + { + $sql = 'SELECT i.*, l.log_time + FROM ' . $this->logs_table . ' l, + ' . $this->items_table . ' i + WHERE i.item_id = l.item_id + AND l.item_purchase = 1 + ORDER BY l.log_time DESC'; + $result = $this->db->sql_query_limit($sql, 5); + $rowset = $this->db->sql_fetchrowset($result); + $this->db->sql_freeresult($result); + + return (array) $rowset; + } + + /** + * Get users for a specific mode. + * + * @param string $mode The mode (buyers|gifters|spenders) + * @return array User rows + * @access protected + */ + protected function get_users($mode) + { + $users = []; + + switch ($mode) + { + case 'buyers': + $select = 'COUNT(log_id)'; + $where = ' WHERE recipient_id = 0'; + break; + + case 'gifters': + $select = 'COUNT(log_id)'; + $where = ' WHERE recipient_id <> 0'; + break; + + case 'spenders': + default: + $select = 'SUM(points_sum)'; + $where = ''; + break; + } + + $sql = 'SELECT ' . $select . ' as count, user_id + FROM ' . $this->logs_table . $where . ' + GROUP BY user_id + ORDER BY count DESC'; + $result = $this->db->sql_query_limit($sql, 5); + while ($row = $this->db->sql_fetchrow($result)) + { + $users[(int) $row['user_id']] = $row['count']; + } + $this->db->sql_freeresult($result); + + return (array) $users; + } + + /** + * Get counts for various things. + * + * @return array Array of counts + * @access protected + */ + protected function get_counts() + { + $counts = [ + 'categories' => (int) $this->db->get_row_count($this->categories_table), + 'items' => (int) $this->db->get_row_count($this->items_table), + ]; + + $sql = 'SELECT COUNT(i.item_id) as count + FROM ' . $this->items_table . ' i + WHERE ' . $this->get_sql_where('featured'); + $result = $this->db->sql_query_limit($sql , 1); + $counts['featured'] = (int) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + $sql = 'SELECT COUNT(i.item_id) as count + FROM ' . $this->items_table . ' i + WHERE ' . $this->get_sql_where('sale'); + $result = $this->db->sql_query_limit($sql , 1); + $counts['sale'] = (int) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + $sql = 'SELECT SUM(item_purchases) as count + FROM ' . $this->items_table; + $result = $this->db->sql_query_limit($sql , 1); + $counts['purchases'] = (int) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + $sql = 'SELECT SUM(points_sum) as count + FROM ' . $this->logs_table; + $result = $this->db->sql_query_limit($sql , 1); + $counts['spent'] = (double) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + $sql = 'SELECT COUNT(item_conflict) as count + FROM ' . $this->items_table . ' + WHERE item_conflict = 1'; + $result = $this->db->sql_query_limit($sql , 1); + $counts['errors'] = (double) $this->db->sql_fetchfield('count'); + $this->db->sql_freeresult($result); + + return $counts; + } + + /** + * Get the SQL WHERE statement for a specific mode + * + * @param string $mode + * @return string + * @access protected + */ + protected function get_sql_where($mode) + { + switch ($mode) + { + case 'low_stock': + return 'i.item_stock_unlimited <> 1'; + + case 'featured': + return 'i.item_sale_start < ' . time() . ' + AND i.item_featured_start <> 0 + AND i.item_featured_until <> 0 + AND (' . time() . ' BETWEEN i.item_featured_start AND i.item_featured_until)'; + + case 'featured_coming': + return 'i.item_featured_start <> 0 + AND i.item_featured_until <> 0 + AND i.item_featured_start > ' . time(); + + case 'sale': + return 'i.item_featured_start < ' . time() . ' + AND i.item_sale_start <> 0 + AND i.item_sale_until <> 0 + AND (' . time() . ' BETWEEN i.item_sale_start AND item_sale_until)'; + + case 'sale_coming': + return 'i.item_sale_start <> 0 + AND i.item_sale_until <> 0 + AND i.item_sale_start > ' . time(); + + default: + return ''; + } + } + + /** + * Get the SQL ORDER BY statement for a specific mode. + * + * @param string $mode + * @return string + * @access protected + */ + protected function get_sql_order($mode) + { + switch ($mode) + { + case 'low_stock': + return 'i.item_stock ASC, i.item_title ASC'; + + case 'low_sellers': + return 'i.item_purchases ASC, i.item_title ASC'; + + case 'top_sellers': + return 'i.item_purchases DESC, i.item_title ASC'; + + case 'recent': + return 'i.item_create_time DESC'; + + case 'featured': + return 'i.item_featured_until ASC, i.item_title ASC'; + + case 'featured_coming': + return 'i.item_featured_start ASC, i.item_title ASC'; + + case 'sale': + return 'i.item_sale_until ASC, i.item_title ASC'; + + case 'sale_coming': + return 'i.item_sale_start ASC, i.item_title ASC'; + + default: + return 'i.item_title ASC'; + } + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/acp_settings_controller.php b/ext/phpbbstudio/ass/controller/acp_settings_controller.php new file mode 100644 index 0000000..ffbee8e --- /dev/null +++ b/ext/phpbbstudio/ass/controller/acp_settings_controller.php @@ -0,0 +1,341 @@ +aps_functions = $aps_functions; + $this->config = $config; + $this->config_text = $config_text; + $this->language = $language; + $this->log = $log; + $this->parser = $parser; + $this->request = $request; + $this->template = $template; + $this->user = $user; + $this->utils = $utils; + + $this->root_path = $root_path; + $this->php_ext = $php_ext; + } + + /** + * Handle and display the "Settings" ACP mode. + * + * @return void + * @access public + */ + public function settings() + { + $this->language->add_lang(['ass_acp_common', 'ass_common'], 'phpbbstudio/ass'); + + $errors = []; + $submit = $this->request->is_set_post('submit'); + + $form_key = 'shop_settings'; + add_form_key($form_key); + + if ($submit) + { + if (!check_form_key($form_key)) + { + $errors[] = $this->language->lang('FORM_INVALID'); + } + } + + if ($this->request->variable('action', '', true) === 'locations') + { + $this->link_locations(); + } + + $banner_sizes = ['small', 'tiny']; + $banner_colours = ['blue', 'red', 'green', 'orange', 'aqua', 'yellow', 'pink', 'violet', 'purple', 'gold', 'silver', 'bronze']; + $icon_colours = ['blue', 'red', 'green', 'orange', 'aqua', 'yellow', 'pink', 'violet', 'purple', 'gold', 'silver', 'bronze', + 'bluegray', 'gray', 'lightgray', 'black', 'white', 'lighten', 'darken']; + + $panels = [ + 'featured' => ['limit' => ['min' => 0, 'max' => 10], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 4, 'max' => 6]], + 'sale' => ['limit' => ['min' => 0, 'max' => 10], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 4, 'max' => 6]], + 'featured_sale' => ['limit' => ['min' => 0, 'max' => 4], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 4, 'max' => 6]], + 'random' => ['limit' => ['min' => 0, 'max' => 20], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 3, 'max' => 4]], + 'recent' => ['limit' => ['min' => 0, 'max' => 10], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 4, 'max' => 6]], + 'limited' => ['limit' => ['min' => 0, 'max' => 10], 'order' => ['min' => 1, 'max' => 6], 'width' => ['min' => 4, 'max' => 6]], + ]; + + $options = ['banner_size', 'banner_colour', 'icon_colour', 'icon', 'limit', 'order', 'width']; + $settings = [ + 'int' => ['enabled', 'active', 'gift_enabled', 'deactivate_conflicts', 'purge_cache', 'items_per_page', 'logs_per_page', 'carousel_arrows', 'carousel_dots', 'carousel_fade', 'carousel_play', 'carousel_play_speed', 'carousel_speed'], + 'string' => ['shop_icon', 'inventory_icon', 'no_image_icon', 'gift_icon'], + ]; + + // General settings + foreach ($settings as $type => $data) + { + foreach ($data as $name) + { + $config_name = "ass_{$name}"; + $default = $this->config[$config_name]; + settype($default, $type); + + $this->template->assign_var(utf8_strtoupper($name), $default); + + if ($submit && empty($errors)) + { + $value = $this->request->variable($name, '', $type === 'string'); + + if ($value !== $default) + { + $this->config->set($config_name, $value); + } + } + } + } + + // Panel settings + $variables = []; + + foreach ($panels as $panel => $data) + { + foreach ($options as $option) + { + $name = "{$panel}_{$option}"; + $config_name = "ass_panel_{$name}"; + + $default = $this->config[$config_name]; + $variables[utf8_strtoupper($option)][$panel] = $default; + + if ($submit && empty($errors)) + { + $value = $this->request->variable($name, $default); + + if (isset($data[$option])) + { + if ($value < $data[$option]['min']) + { + $field = $this->language->lang('ACP_ASS_PANEL_' . utf8_strtoupper($panel)); + $field .= $this->language->lang('COLON'); + $field .= ' ' . $this->language->lang('ACP_ASS_PANEL_' . utf8_strtoupper($option)); + + $errors[] = $this->language->lang('ASS_ERROR_TOO_LOW', $field, $data[$option]['min'], $value); + + continue; + } + + if ($value > $data[$option]['max']) + { + $field = $this->language->lang('ACP_ASS_PANEL_' . utf8_strtoupper($panel)); + $field .= $this->language->lang('COLON'); + $field .= ' ' . $this->language->lang('ACP_ASS_PANEL_' . utf8_strtoupper($option)); + + $errors[] = $this->language->lang('ASS_ERROR_TOO_HIGH', $field, $data[$option]['max'], $value); + + continue; + } + } + + if ($value != $default) + { + $this->config->set($config_name, $value); + } + } + } + } + + uksort($panels, function($a, $b) + { + if ($this->config["ass_panel_{$a}_order"] == $this->config["ass_panel_{$b}_order"]) + { + return 0; + } + + return $this->config["ass_panel_{$a}_order"] < $this->config["ass_panel_{$b}_order"] ? -1 : 1; + }); + + if ($submit && empty($errors)) + { + $message = $this->request->variable('inactive_desc', '', true); + $message = $this->parser->parse($message); + + $this->config_text->set('ass_inactive_desc', $message); + + meta_refresh(3, $this->u_action); + + trigger_error($this->language->lang('CONFIG_UPDATED') . adm_back_link($this->u_action)); + } + + $message = $this->config_text->get('ass_inactive_desc'); + $message = $this->utils->unparse($message); + + $this->generate_bbcodes(); + + $this->template->assign_vars(array_merge($variables, [ + 'ERRORS' => $errors, + + 'INACTIVE_DESC' => $message, + + 'SHOP_BLOCKS' => $panels, + 'SHOP_ICON_COLOURS' => $icon_colours, + 'SHOP_BANNER_COLOURS' => $banner_colours, + 'SHOP_BANNER_SIZES' => $banner_sizes, + + 'U_ACTION' => $this->u_action, + 'U_LOCATIONS' => $this->u_action . '&action=locations', + ])); + } + + /** + * Generate BBCodes for a textarea editor. + * + * @return void + * @access protected + */ + protected function generate_bbcodes() + { + include_once $this->root_path . 'includes/functions_display.' . $this->php_ext; + + $this->language->add_lang('posting'); + + display_custom_bbcodes(); + + $this->template->assign_vars([ + 'S_BBCODE_IMG' => true, + 'S_BBCODE_QUOTE' => true, + 'S_BBCODE_FLASH' => true, + 'S_LINKS_ALLOWED' => true, + ]); + } + + /** + * Handles the link locations from the settings page. + * + * @return void + * @access protected + */ + protected function link_locations() + { + $this->language->add_lang('aps_acp_common', 'phpbbstudio/aps'); + + $locations = $this->aps_functions->get_link_locations('ass_link_locations'); + $variables = ['S_ASS_LOCATIONS' => true]; + + foreach ($locations as $location => $status) + { + $variables[$location] = (bool) $status; + } + + $this->template->assign_vars($variables); + + if ($this->request->is_set_post('submit_locations')) + { + $links = []; + + foreach (array_keys($locations) as $location) + { + $links[$location] = $this->request->variable((string) $location, false); + } + + $this->aps_functions->set_link_locations($links, 'ass_link_locations'); + + $this->log->add('admin', $this->user->data['user_id'], $this->user->data['user_ip'], 'LOG_ACP_ASS_LOCATIONS'); + + trigger_error($this->language->lang('ACP_APS_LOCATIONS_SUCCESS') . adm_back_link($this->u_action)); + } + } + + /** + * Set custom form action. + * + * @param string $u_action Custom form action + * @return self $this This controller for chaining calls + * @access public + */ + public function set_page_url($u_action) + { + $this->u_action = $u_action; + + return $this; + } +} diff --git a/ext/phpbbstudio/ass/controller/inventory_controller.php b/ext/phpbbstudio/ass/controller/inventory_controller.php new file mode 100644 index 0000000..e69deec --- /dev/null +++ b/ext/phpbbstudio/ass/controller/inventory_controller.php @@ -0,0 +1,968 @@ +aps_distributor = $aps_distributor; + $this->aps_functions = $aps_functions; + $this->auth = $auth; + $this->config = $config; + $this->controller = $controller; + $this->helper = $helper; + $this->items_manager = $items_manager; + $this->language = $language; + $this->log = $log; + $this->log_phpbb = $log_phpbb; + $this->operator_cat = $operator_cat; + $this->operator_inv = $operator_inv; + $this->operator_item = $operator_item; + $this->notification = $notification; + $this->pagination = $pagination; + $this->request = $request; + $this->router = $router; + $this->template = $template; + $this->time = $time; + $this->user = $user; + $this->user_loader = $user_loader; + } + + /** + * Handle the purchase/gift action. + * + * @param string $category_slug The category slug + * @param string $item_slug The item slug + * @param bool $purchase Whether it's a purchase or a gift + * @return Response + * @access public + */ + public function purchase($category_slug, $item_slug, $purchase) + { + $this->controller->check_shop(); + + if (!$this->user->data['is_registered']) + { + throw new shop_exception(401, 'ASS_ERROR_NOT_AUTH_PURCHASE'); + } + + $category = $this->operator_cat->load_entity($category_slug); + $item = $this->operator_item->load_entity($item_slug, $category->get_slug(), $category->get_id()); + + $this->template->assign_vars($this->operator_item->get_variables($item)); + + if ($purchase && !$this->auth->acl_get('u_ass_can_purchase')) + { + throw new shop_exception(403, 'ASS_ERROR_NOT_AUTH_PURCHASE'); + } + + if (!$this->operator_item->is_available($item)) + { + throw new shop_exception(410, 'ASS_ERROR_NOT_AVAILABLE'); + } + + if (!$purchase) + { + if (!$this->auth->acl_get('u_ass_can_gift')) + { + throw new shop_exception(403, 'ASS_ERROR_NOT_AUTH_GIFT'); + } + + if (!$item->get_gift()) + { + throw new shop_exception(400, 'ASS_ERROR_NOT_GIFTABLE'); + } + } + + if (!$this->operator_inv->check_price($item, $purchase)) + { + throw new shop_exception(400, 'ASS_ERROR_NOT_ENOUGH_POINTS', [$this->aps_functions->get_name()]); + } + + if (!$item->get_stock() && !$item->get_stock_unlimited()) + { + throw new shop_exception(400, 'ASS_ERROR_OUT_OF_STOCK'); + } + + $stack = 0; + $user_id = 0; + $username = ''; + + if (confirm_box(true) && !$purchase) + { + $username = $this->request->variable('username', '', true); + $user_id = (int) $this->user_loader->load_user_by_username($username); + $user2 = $this->user_loader->get_user($user_id); + + if ($user_id === ANONYMOUS) + { + throw new shop_exception(404, 'NO_USER'); + } + + if ($user_id === (int) $this->user->data['user_id']) + { + throw new shop_exception(403, 'ASS_ERROR_NOT_GIFT_SELF'); + } + + $auth2 = new \phpbb\auth\auth; + $auth2->acl($user2); + + if (!$auth2->acl_get('u_ass_can_receive_gift')) + { + throw new shop_exception(403, 'ASS_ERROR_NOT_AUTH_RECEIVE'); + } + + $username = $this->user_loader->get_username($user_id, 'no_profile'); + } + + if ($purchase || (confirm_box(true) && !$purchase)) + { + $stack = $this->operator_inv->get_inventory_stack($item, $user_id); + + if ($stack >= $item->get_stack()) + { + $message = $purchase ? 'ASS_ERROR_STACK_LIMIT' : 'ASS_ERROR_STACK_LIMIT_USER'; + $params = $purchase ? [] : [$username]; + + throw new shop_exception(409, $message, $params); + } + + $auth = !empty($auth2) ? $auth2 : $this->auth; + + if ($stack && !$auth->acl_get('u_ass_can_stack')) + { + $message = $purchase ? 'ASS_ERROR_STACK_NO_AUTH' : 'ASS_ERROR_STACK_NO_AUTH_USER'; + $params = $purchase ? [] : [$username]; + + throw new shop_exception(409, $message, $params); + } + } + + if (!$this->request->is_ajax()) + { + $this->controller->create_shop('shop', $category, $item); + } + + $l_mode = $purchase ? 'ASS_PURCHASE' : 'ASS_GIFT'; + + $this->template->assign_vars([ + 'ASS_ITEM_STACK' => $stack, + 'ASS_PURCHASE_PRICE' => $this->operator_inv->get_price($item, $purchase), + 'S_ASS_PURCHASE' => $purchase, + ]); + + if (confirm_box(true)) + { + $points_new = $this->operator_inv->add_purchase($item, $user_id, $purchase); + $inventory_id = $this->operator_inv->get_purchase_id(); + + $item->set_purchases($item->get_purchases() + 1) + ->set_stock($item->get_stock() - (int) !$item->get_stock_unlimited()) + ->save(); + + if ($item->get_stock() === $item->get_stock_threshold() && !$item->get_stock_unlimited()) + { + $this->notification->low_stock($item); + } + + if (!$purchase) + { + $this->notification->gift($item, $user_id, $inventory_id, $stack + 1); + + if ($this->config['allow_privmsg'] && $this->auth->acl_get('u_sendpm')) + { + $u_pm = $this->router->regular('ucp', [ + 'i' => 'pm', + 'mode' => 'compose', + 'u' => $user_id, + ], true, $this->request->is_ajax()); + } + } + + $this->log->add($item, true, $this->operator_inv->get_price($item), $user_id); + + $this->template->assign_vars([ + 'NEW_USER_POINTS' => $points_new, + 'RECIPIENT_NAME' => $username, + 'U_SEND_PM' => !empty($u_pm) ? $u_pm : '', + ]); + + if ($this->request->is_ajax()) + { + $this->template->set_filenames([ + 'body' => 'ass_purchase_ajax.html', + ]); + + $this->template->assign_var('S_PURCHASE_SUCCESS', true); + + return new JsonResponse([ + 'MESSAGE_TITLE' => $this->language->lang($l_mode), + 'MESSAGE_TEXT' => $this->template->assign_display('body'), + 'id' => $item->get_id(), + 'points' => $this->aps_functions->display_points($points_new, false), + 'stock' => !$item->get_stock_unlimited() ? $item->get_stock() : false, + ]); + } + else + { + return $this->helper->render('ass_purchase.html', $this->language->lang($l_mode)); + } + } + else + { + $ajax = $this->request->is_ajax() ? '_ajax' : ''; + $body = "ass_purchase{$ajax}.html"; + + confirm_box(false, $l_mode, '', $body, $this->helper->get_current_url()); + + return new RedirectResponse($this->router->item($category->get_slug(), $item->get_slug())); + } + } + + /** + * Display the inventory and handle any actions. + * + * @param string $category_slug The category slug + * @param string $item_slug The item slug + * @param int $index The item index + * @param string $action The action + * @return Response + * @access public + */ + public function inventory($category_slug, $item_slug, $index, $action) + { + $index0 = (int) $index - 1; + + $this->controller->check_shop(); + + $this->operator_inv->clean_inventory(); + + $category = $category_slug ? $this->operator_cat->load_entity($category_slug) : null; + $item = $item_slug ? $this->operator_item->load_entity($item_slug, $category->get_slug(), $category->get_id()) : null; + + $s_category = $category !== null; + $s_item = $item !== null; + + $inventory = $this->operator_inv->get_inventory($category); + + $cat_ids = array_column($inventory, 'category_id'); + $item_ids = array_column($inventory, 'item_id', 'inventory_id'); + + $categories = $this->operator_cat->get_categories_by_id($cat_ids); + $items = $this->operator_item->get_items_by_id($item_ids); + + $variables = []; + $item_map = []; + + foreach ($item_ids as $inventory_id => $item_id) + { + $item_map[$item_id] = array_keys($item_ids, $item_id); + } + + if ($s_item && !in_array($item->get_id(), array_keys($items))) + { + throw new shop_exception(404, 'ASS_ERROR_NOT_OWNED'); + } + + $this->controller->create_shop('inventory', $category); + + if ($s_category && $s_item && !empty($action)) + { + $type = $this->items_manager->get_type($item->get_type()); + + if ($type === null) + { + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_ITEM_TYPE_ERROR', time(), [$category->get_title(), $item->get_title()]); + + throw new shop_item_exception(404, 'ASS_ITEM_TYPE_NOT_EXIST'); + } + + $row = $this->operator_inv->get_inventory_item($item, $index0); + + switch ($action) + { + case 'activate': + $type->set_category($category); + $type->set_item($item); + + if (confirm_box(true)) + { + try + { + $success = $type->activate($item->get_data()); + } + catch (shop_item_exception $e) + { + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_ITEM_TYPE_ERROR', time(), [$category->get_title(), $item->get_title()]); + + if (!$item->get_conflict()) + { + if ($this->config['ass_deactivate_conflicts']) + { + $item->set_active(false); + } + + $item->set_conflict(true) + ->save(); + + $category->set_conflicts($category->get_conflicts() + 1) + ->save(); + } + + throw $e; + } + + $message = !empty($success) ? $this->language->lang($type->get_language('success')) : 'Some error message'; + $title = !empty($success) ? $this->language->lang($type->get_language('title')) : $this->language->lang('INFORMATION'); + + $count = (int) $row['use_count']; + + if (!empty($success) && empty($success['file'])) + { + $count++; + } + + $limit = $item->get_count() && $item->get_count() === $count; + $delete = !$item->get_delete_seconds() && $limit; + + $file = !empty($success['file']) ? $success['file'] : false; + + if ($file) + { + $limit = $item->get_count() && $item->get_count() === ($count + 1); + $delete = !$item->get_delete_seconds() && $limit; + + $u_file = $this->router->inventory($item->get_category_slug(), $item->get_slug(), $index, 'download', ['hash' => generate_link_hash($file)]); + } + else if (!empty($success)) + { + $data = [ + 'use_count' => $count, + 'use_time' => time(), + ]; + + $delete + ? $this->operator_inv->delete($row['inventory_id']) + : $this->operator_inv->activated($row['inventory_id'], $data); + + $data['use_time'] = $this->user->format_date($data['use_time']); + + $this->log->add($item, false); + } + + if ($this->request->is_ajax()) + { + if ($delete) + { + $inventory_ids = $item_map[$item->get_id()]; + + unset($inventory_ids[array_search($row['inventory_id'], $inventory_ids)]); + + if (!empty($inventory_ids)) + { + $inventory_ids = array_values($inventory_ids); + + // Get the first inventory row + $row = $inventory[$inventory_ids[0]]; + + $stack = $this->get_stack_info($inventory_ids, $index0); + + $vars = $this->get_inventory_variables($category, $item, $row, $stack); + + if (!empty($vars['BACKGROUND_SRC'])) + { + // Fix the incorrect web root path + $vars['BACKGROUND_SRC'] = $this->operator_item->get_absolute_background_path($vars['BACKGROUND_SRC']); + } + + $this->template->set_filenames(['item' => '@phpbbstudio_ass/ass_item_inventory.html']); + $this->template->assign_vars(['item' => $vars]); + $next_item = $this->template->assign_display('item'); + } + } + + return new JsonResponse([ + 'MESSAGE_TITLE' => $title, + 'MESSAGE_TEXT' => $message, + 'success' => $success, + 'delete' => $delete, + 'limit' => $limit ? $this->language->lang('ASS_ITEM_USE_REACHED') : false, + 'id' => $item->get_id(), + 'data' => !empty($data) ? $data : false, + 'file' => !empty($u_file) ? $u_file . '&force=1' : false, + 'item' => !empty($next_item) ? $next_item : false, + 'index' => $index, + ]); + } + else + { + if (!empty($u_file)) + { + return new RedirectResponse($u_file); + } + + return $this->helper->message($message); + } + } + else + { + confirm_box(false, $type->get_language(), '', $type->get_confirm_template($item->get_data()), $this->helper->get_current_url()); + + return new RedirectResponse($this->router->inventory($item->get_category_slug(), $item->get_slug(), $index)); + } + break; + + case 'download': + $hash = $this->request->variable('hash', '', true); + + $data = $type->activate($item->get_data()); + + if (empty($data['file'])) + { + break; + } + + $file = $data['file']; + + if (check_link_hash($hash, $file) && $this->request->is_set('force', \phpbb\request\request_interface::GET)) + { + $count = (int) $row['use_count'] + 1; + $limit = $item->get_count() && $item->get_count() === $count; + $delete = !$item->get_delete_seconds() && $limit; + + $data = [ + 'use_count' => $count, + 'use_time' => time(), + ]; + + $delete + ? $this->operator_inv->delete($row['inventory_id']) + : $this->operator_inv->activated($row['inventory_id'], $data); + + $data['use_time'] = $this->user->format_date($data['use_time']); + + $this->log->add($item, false); + + return $this->download($file); + } + else if ($this->request->is_set('hash', \phpbb\request\request_interface::GET)) + { + $u_file = $this->router->inventory($item->get_category_slug(), $item->get_slug(), $index, 'download', ['hash' => $hash, 'force' => true]); + + $this->template->assign_var('U_DOWNLOAD_FILE', $u_file); + } + break; + + case 'delete': + case 'refund': + $l_action = 'ASS_' . utf8_strtoupper($action); + + if (confirm_box(true)) + { + if ($action === 'refund') + { + if (!empty($row['use_count'])) + { + throw new shop_exception(403, 'ASS_ERROR_NOT_REFUND'); + } + + $points = $this->aps_functions->equate_points($this->user->data['user_points'], $row['purchase_price']); + $points = $this->aps_functions->boundaries($points); + $points = $this->aps_functions->format_points($points); + + $this->aps_distributor->update_points($points); + + $item->set_purchases($item->get_purchases() - 1) + ->set_stock($item->get_stock() + (int) !$item->get_stock_unlimited()) + ->save(); + } + + $this->operator_inv->delete($row['inventory_id']); + + if ($this->request->is_ajax()) + { + $inventory_ids = $item_map[$item->get_id()]; + + unset($inventory_ids[array_search($row['inventory_id'], $inventory_ids)]); + + if (!empty($inventory_ids)) + { + $inventory_ids = array_values($inventory_ids); + + // Get the first inventory row + $row = $inventory[$inventory_ids[0]]; + + $stack = $this->get_stack_info($inventory_ids, $index0); + + $vars = $this->get_inventory_variables($category, $item, $row, $stack); + + if (!empty($vars['BACKGROUND_SRC'])) + { + // Fix the incorrect web root path + $vars['BACKGROUND_SRC'] = $this->operator_item->get_absolute_background_path($vars['BACKGROUND_SRC']); + } + + $this->template->set_filenames(['item' => '@phpbbstudio_ass/ass_item_inventory.html']); + $this->template->assign_vars(['item' => $vars]); + $next_item = $this->template->assign_display('item'); + } + + return new JsonResponse([ + 'MESSAGE_TITLE' => $this->language->lang($l_action), + 'MESSAGE_TEXT' => $this->language->lang($l_action . '_SUCCESS'), + 'id' => $item->get_id(), + 'item' => !empty($next_item) ? $next_item : false, + 'index' => $index, + ]); + } + else + { + return $this->helper->message($l_action . '_SUCCESS'); + } + } + else + { + $body = $this->request->is_ajax() ? '@phpbbstudio_ass/ass_confirm_body.html' : 'confirm_body.html'; + + confirm_box(false, $l_action, '', $body, $this->helper->get_current_url()); + + return new RedirectResponse($this->helper->route('phpbbstudio_ass_inventory')); + } + break; + } + } + + $counts = [ + 'expire' => 0, + 'gifts' => 0, + 'total' => 0, + ]; + + /** @var category $cat */ + foreach ($categories as $cat) + { + $this->template->assign_block_vars('ass_categories', $this->operator_cat->get_variables($cat)); + + /** @var item $it */ + foreach ($items as $it) + { + if ($it->get_category() === $cat->get_id()) + { + $inventory_ids = $item_map[$it->get_id()]; + $inventory_id = $inventory_ids[0]; + + $s_this_item = $s_item && $item->get_id() === $it->get_id(); + + if ($s_this_item) + { + if (isset($inventory_ids[$index0])) + { + $inventory_id = $inventory_ids[$index0]; + } + else + { + throw new shop_exception(404, 'ASS_ERROR_NOT_OWNED_STACK'); + } + } + + // Get the first inventory row + $row = $inventory[$inventory_id]; + + $stack = $this->get_stack_info($inventory_ids, $index0); + + $vars = $this->get_inventory_variables($cat, $it, $row, $stack, $index, $counts); + + $this->template->assign_block_vars('ass_categories.items', $vars); + + if (empty($variables) && $s_this_item) + { + $variables = $vars; + } + } + } + } + + if (!empty($variables['S_TYPE_ERROR'])) + { + $this->log_phpbb->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_ACP_ASS_ITEM_TYPE_ERROR', time(), [$category->get_title(), $item->get_title()]); + } + + $this->template->assign_vars([ + 'ITEM_INFO' => $variables, + + 'COUNT_EXPIRE' => $counts['expire'], + 'COUNT_GIFTS' => $counts['gifts'], + 'COUNT_TOTAL' => $counts['total'], + + 'S_IS_GIFT' => $action === 'gift', + + 'T_SHOP_ICON' => $s_category ? $category->get_icon() : $this->config['ass_inventory_icon'], + + 'L_VIEW_SHOP' => $s_category ? $category->get_title() : $this->language->lang('ASS_SHOP_INDEX'), + 'U_VIEW_SHOP' => $s_category ? $this->router->category($category->get_slug()) : $this->helper->route('phpbbstudio_ass_shop'), + ]); + + return $this->helper->render('ass_inventory.html', $this->language->lang('ASS_INVENTORY')); + } + + /** + * Display the history page. + * + * @param int $page The page number + * @return Response + * @access public + */ + public function history($page) + { + $this->controller->check_shop(); + $this->controller->create_shop_crumbs('history'); + + $points_name = $this->aps_functions->get_name(); + $points_new = $this->language->lang('ASS_POINTS_NEW', $points_name); + $points_old = $this->language->lang('ASS_POINTS_OLD', $points_name); + + $show_array = [ + 'all' => ['title' => 'ASS_ALL', 'sql' => ''], + 'use' => ['title' => 'ASS_USAGES', 'sql' => 'l.item_purchase = 0'], + 'buy' => ['title' => 'ASS_PURCHASES', 'sql' => 'l.item_purchase = 1'], + 'given' => ['title' => 'ASS_GIFTS_GIVEN', 'sql' => 'l.item_purchase = 1 AND l.recipient_id <> 0'], + 'received' => ['title' => 'ASS_GIFTS_RECEIVED', 'sql' => 'l.recipient_id = ' . (int) $this->user->data['user_id']], + ]; + $sort_array = [ + 'time' => ['title' => 'TIME', 'sql' => 'l.log_time'], + 'old' => ['title' => $points_old, 'sql' => 'l.points_old'], + 'new' => ['title' => $points_new, 'sql' => 'l.points_new'], + 'price' => ['title' => 'ASS_ITEM_PRICE', 'sql' => 'l.points_sum'], + 'item' => ['title' => 'ASS_ITEM_TITLE', 'sql' => 'i.item_title'], + 'category' => ['title' => 'ASS_CATEGORY_TITLE', 'sql' => 'c.category_title'], + 'recipient' => ['title' => 'ASS_RECIPIENT_NAME', 'sql' => 'recipient_name'], + ]; + $dir_array = [ + 'desc' => ['title' => 'DESCENDING', 'sql' => 'DESC'], + 'asc' => ['title' => 'ASCENDING', 'sql' => 'ASC'], + ]; + + $show = $this->request->variable('display', 'all', true, \phpbb\request\request_interface::GET); + $sort = $this->request->variable('sort', 'time', true, \phpbb\request\request_interface::GET); + $dir = $this->request->variable('direction', 'desc', true, \phpbb\request\request_interface::GET); + + $show = in_array($show, array_keys($show_array)) ? $show : 'all'; + $sort = in_array($sort, array_keys($sort_array)) ? $sort : 'time'; + $dir = in_array($dir, array_keys($dir_array)) ? $dir : 'desc'; + + $sql_where = $show_array[$show]['sql']; + $sql_order = $sort_array[$sort]['sql']; + $sql_dir = $dir_array[$dir]['sql']; + + $limit = (int) $this->config['ass_logs_per_page']; + $start = ($page - 1) * $limit; + + $total = $this->log->get_user_logs_count($sql_where, $this->user->data['user_id']); + $rowset = $this->log->get_user_logs($sql_where, $sql_order, $sql_dir, $limit, $start, $this->user->data['user_id']); + + $categories = $this->operator_cat->get_categories_by_id(array_column($rowset, 'category_id')); + $items = $this->operator_item->get_items_by_id(array_column($rowset, 'item_id')); + + foreach ($rowset as $row) + { + $category_id = (int) $row['category_id']; + $item_id = (int) $row['item_id']; + + /** @var category $category */ + $category = !empty($categories[$category_id]) ? $categories[$category_id] : null; + + /** @var item $item */ + $item = !empty($items[$item_id]) ? $items[$item_id] : null; + + /** @var item_type $type */ + $type = $item ? $this->items_manager->get_type($item->get_type()) : null; + + $this->template->assign_block_vars('ass_logs', [ + 'CATEGORY_TITLE' => $category ? $category->get_title() : $this->language->lang('ASS_UNAVAILABLE_CATEGORY'), + 'ITEM_TITLE' => $item ? $item->get_title() : $this->language->lang('ASS_UNAVAILABLE_ITEM'), + + 'LOG_ACTION' => $type ? $this->language->lang($type->get_language('log')) : $this->language->lang('ASS_UNAVAILABLE_' . (!$item ? 'ITEM' : 'TYPE')), + 'LOG_ID' => $row['log_id'], + 'LOG_IP' => $row['log_ip'], + 'LOG_TIME' => $this->user->format_date($row['log_time']), + + 'POINTS_NEW' => $row['points_new'], + 'POINTS_OLD' => $row['points_old'], + 'POINTS_SUM' => -$row['points_sum'], + + 'RECIPIENT' => $row['recipient_id'] ? get_username_string('full', $row['recipient_id'], $row['recipient_name'], $row['recipient_colour']) : '', + 'USER' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']), + + 'S_PURCHASE' => $row['item_purchase'], + 'S_GIFT_RECEIVE' => $row['recipient_id'] == $this->user->data['user_id'], + + 'U_CATEGORY' => $category ? $this->router->category($category->get_slug()) : '', + 'U_ITEM' => $item ? $this->router->item($item->get_category_slug(), $item->get_slug()) : '', + ]); + } + + $this->pagination->generate_template_pagination([ + 'routes' => ['phpbbstudio_ass_history', 'phpbbstudio_ass_history_pagination'], + 'params' => ['display' => $show, 'sort' => $sort, 'direction' => $dir], + ], 'shop_pagination', 'page', $total, $limit, $start); + + $this->template->assign_vars([ + 'SORT_DISPLAY' => $show, + 'SORT_DISPLAY_ARRAY' => $show_array, + 'SORT_SORT' => $sort, + 'SORT_SORT_ARRAY' => $sort_array, + 'SORT_DIR' => $dir, + 'SORT_DIR_ARRAY' => $dir_array, + + 'TOTAL_LOGS' => $this->language->lang('TOTAL_LOGS', $total), + + 'S_ASS_INVENTORY' => true, + ]); + + return $this->helper->render('ass_history.html', $this->language->lang('ASS_INVENTORY')); + } + + /** + * Create a download response for a specific file. + * + * @param string $file The file name + * @return Response + * @access protected + */ + protected function download($file) + { + $response = new Response($file); + + $response->headers->set('Content-type', 'application/octet-stream'); + $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($file) . '";'); + $response->headers->set('Content-length', filesize($file)); + + $response->sendHeaders(); + $response->setContent(readfile($file)); + + return $response; + } + + /** + * Get an inventory item's template variables. + * + * @param category $category The category entity + * @param item $item The item entity + * @param array $row The inventory row + * @param array $stack The item stack information + * @param int $index The item index + * @param array $counts The inventory overview counts + * @return array The inventory item template variables + * @access protected + */ + protected function get_inventory_variables(category $category, item $item, array $row, array $stack, $index = 1, array &$counts = []) + { + /** @var item_type $type */ + $type = $this->items_manager->get_type($item->get_type()); + + $s_type = $type !== null; + + if ($s_type) + { + $type->set_category($category); + $type->set_item($item); + } + + $s_has_expired = $this->time->has_expired($row['purchase_time'], $item->get_expire_seconds()); + $s_will_expire = $this->time->will_expire($row['purchase_time'], $item->get_expire_seconds()); + + if (!empty($counts)) + { + $counts = [ + 'expire' => !$s_has_expired && $s_will_expire ? $counts['expire'] + 1 : $counts['expire'], + 'gifts' => $row['gifter_id'] ? $counts['gifts'] + 1 : $counts['gifts'], + 'total' => $counts['total'] + $stack['count'], + ]; + } + + return array_merge($this->operator_item->get_variables($item, '', true, $index), [ + 'ACTIVATE' => $s_type ? $this->language->lang($type->get_language('action')) : '', + 'GIFTER_NAME' => $row['gifter_id'] ? get_username_string('full', $row['gifter_id'], $row['gifter_name'], $row['gifter_colour']) : '', + 'PURCHASE_UNIX' => (int) $row['purchase_time'], + 'STACK_COUNT' => (int) $stack['count'], + 'USE_COUNT' => (int) $row['use_count'], + 'USE_UNIX' => (int) $row['use_time'], + + 'S_AJAX' => $s_type ? $type->get_confirm_ajax() : '', + 'S_GIFTED' => !empty($row['gifter_id']), + 'S_LIMIT' => $item->get_count() && (int) $row['use_count'] >= $item->get_count(), + 'S_REFUND' => $item->get_refund_seconds() && !$row['use_count'] ? (int) $row['purchase_time'] + $item->get_refund_seconds() > time() : false, + 'S_HAS_EXPIRED' => $s_has_expired, + 'S_WILL_EXPIRE' => $s_will_expire, + 'S_TYPE_ERROR' => !$s_type, + + 'U_STACK_NEXT' => $stack['next'] ? $this->router->inventory($item->get_category_slug(), $item->get_slug(), $stack['next']) : '', + 'U_STACK_PREV' => $stack['prev'] ? $this->router->inventory($item->get_category_slug(), $item->get_slug(), $stack['prev']) : '', + ]); + } + + /** + * Calculate an inventory item's stacking information. + * + * @param array $array The inventory identifiers + * @param int $index The current index (0 based) + * @return array The stacking information + * @access protected + */ + protected function get_stack_info(array $array, $index) + { + // The amount of inventory items for this specific item + $count = count($array); + + // Whether or not the current item index is the first or the last + $prev = $index !== 0 ? $index - 1 : false; + $next = $index < ($count - 1) ? $index + 1 : false; + + /** + * Because the array with inventory identifiers is 0-based, + * but we use a 1-based approach for routes, + * we have to increment the previous and next indices by 1. + */ + $prev = $prev !== false ? $prev + 1 : 0; + $next = $next !== false ? $next + 1 : 0; + + return [ + 'count' => (int) $count, + 'next' => (int) $next, + 'prev' => (int) $prev, + ]; + } +} diff --git a/ext/phpbbstudio/ass/controller/shop_controller.php b/ext/phpbbstudio/ass/controller/shop_controller.php new file mode 100644 index 0000000..959518a --- /dev/null +++ b/ext/phpbbstudio/ass/controller/shop_controller.php @@ -0,0 +1,333 @@ +config = $config; + $this->controller = $controller; + $this->db = $db; + $this->helper = $helper; + $this->items_manager = $items_manager; + $this->language = $language; + $this->operator_cat = $operator_cat; + $this->operator_item = $operator_item; + $this->pagination = $pagination; + $this->request = $request; + $this->template = $template; + } + + /** + * Display the shop index. + * + * @return Response + * @access public + */ + public function shop() + { + $this->controller->check_shop(); + $this->controller->create_shop('shop'); + + $this->controller->setup_carousel(); + $this->controller->setup_panels(); + + $panels = [ + 'limited' => ['carousel' => true, 'title' => 'ASS_ITEMS_LIMITED'], + 'recent' => ['carousel' => true, 'title' => 'ASS_ITEMS_RECENT'], + 'sale' => ['carousel' => true, 'title' => 'ASS_SALE_ITEMS'], + 'featured' => ['carousel' => true, 'title' => 'ASS_FEATURED_ITEMS'], + 'featured_sale' => ['carousel' => false], + 'random' => ['carousel' => false], + ]; + + uksort($panels, function($a, $b) + { + if ($this->config["ass_panel_{$a}_order"] == $this->config["ass_panel_{$b}_order"]) + { + return 0; + } + + return $this->config["ass_panel_{$a}_order"] < $this->config["ass_panel_{$b}_order"] ? -1 : 1; + }); + + foreach (array_keys($panels) as $panel) + { + if ($this->config["ass_panel_{$panel}_limit"]) + { + $this->operator_item->assign_specific_items($panel, $this->config["ass_panel_{$panel}_limit"]); + } + } + + $this->template->assign_vars(['ass_panels' => $panels]); + + return $this->helper->render('ass_shop.html', $this->language->lang('ASS_SHOP')); + } + + /** + * Display a shop category. + * + * @param string $category_slug The category slug + * @param int $page The page number + * @return Response + * @access public + */ + public function category($category_slug, $page = 1) + { + $this->controller->check_shop(); + + $category = $this->operator_cat->load_entity($category_slug); + + $this->controller->create_shop('shop', $category); + + $this->controller->setup_panels(); + + $this->template->assign_vars($this->operator_cat->get_variables($category)); + + $sql_where = ''; + + $types = [0 => null]; + $type_array = ['ASS_ALL']; + + foreach($this->operator_item->get_item_types($category->get_id()) as $type) + { + $types[] = $type; + $type_array[] = $this->items_manager->get_type($type)->get_language('title'); + } + + $params_array = [ + 'above' => ['default' => '', 'sql' => 'i.item_price > {VALUE}'], + 'below' => ['default' => '', 'sql' => 'i.item_price < {VALUE}'], + 'gift' => ['default' => 0, 'sql' => 'i.item_gift = {VALUE}'], + 'sale' => ['default' => 0, 'sql' => 'i.item_sale_start < ' . time() . ' AND i.item_sale_until < ' . time()], + 'type' => ['default' => 0, 'sql' => 'i.item_type = {VALUE}'], + 'title' => ['default' => '', 'sql' => $this->db->sql_lower_text('i.item_title') . ' {VALUE}', 'mb' => true], + ]; + $days_array = [ + 0 => 'ASS_ALL', + 1 => '1_DAY', + 7 => '7_DAYS', + 14 => '2_WEEKS', + 30 => '1_MONTH', + 90 => '3_MONTHS', + 180 => '6_MONTHS', + 365 => '1_YEAR', + ]; + $sort_array = [ + 'order' => ['title' => 'ASS_ITEM_ORDER', 'sql' => 'i.item_order'], + 'item' => ['title' => 'ASS_ITEM_TITLE', 'sql' => 'i.item_title'], + 'price' => ['title' => 'ASS_ITEM_PRICE', 'sql' => 'i.item_price'], + 'stock' => ['title' => 'ASS_ITEM_STOCK', 'sql' => 'i.item_stock'], + 'time' => ['title' => 'ASS_ITEM_CREATE_TIME', 'sql' => 'i.item_create_time'], + ]; + $dir_array = [ + 'desc' => ['title' => 'DESCENDING', 'sql' => 'DESC'], + 'asc' => ['title' => 'ASCENDING', 'sql' => 'ASC'], + ]; + + $days = $this->request->variable('days', 0, false, \phpbb\request\request_interface::GET); + $sort = $this->request->variable('sort', 'order', true, \phpbb\request\request_interface::GET); + $dir = $this->request->variable('direction', 'asc', true, \phpbb\request\request_interface::GET); + + $dir = in_array($dir, array_keys($dir_array)) ? $dir : 'asc'; + $sort = in_array($sort, array_keys($sort_array)) ? $sort : 'order'; + $days = in_array($days, array_keys($days_array)) ? $days : 0; + $time = $days * \phpbbstudio\ass\helper\time::DAY; + + $params = [ + 'sort' => $sort, + 'direction' => $dir, + ]; + + if ($time) + { + $params['days'] = $days; + + $sql_where .= ' AND i.item_create_time > ' . (time() - $time); + } + + foreach ($params_array as $key => $param) + { + $value = $this->request->variable( + $key, + $params_array[$key]['default'], + !empty($params_array[$key]['mb']), + \phpbb\request\request_interface::GET + ); + + if (!empty($value)) + { + $params[$key] = $value; + + $value_sql = $value !== -1 ? $value : 0; + + switch ($key) + { + case 'type': + if (in_array($value, array_keys($type_array))) + { + $value_sql = "'" . $types[$value] . "'"; + } + break; + + case 'title': + $value_sql = $this->db->sql_like_expression(utf8_strtolower($value_sql) . $this->db->get_any_char()); + break; + } + + $param_sql = str_replace('{VALUE}', $value_sql, $params_array[$key]['sql']); + + $sql_where .= ' AND ' . $param_sql; + + $this->template->assign_var('SORT_' . utf8_strtoupper($key), $value); + } + } + + $sql_dir = $dir_array[$dir]['sql']; + $sql_order = $sort_array[$sort]['sql']; + + $limit = (int) $this->config['ass_items_per_page']; + $start = ($page - 1) * $limit; + + $total = $this->operator_item->get_item_count($category->get_id()); + $items = $this->operator_item->get_items($category->get_id(), $sql_where, $sql_order, $sql_dir, true, $limit, $start); + + foreach ($items as $item) + { + $this->template->assign_block_vars('ass_items', $this->operator_item->get_variables($item)); + } + + $this->pagination->generate_template_pagination([ + 'routes' => ['phpbbstudio_ass_category', 'phpbbstudio_ass_category_pagination'], + 'params' => array_merge(['category_slug' => $category->get_slug()], $params), + ], 'shop_pagination', 'page', $total, $limit, $start); + + $this->template->assign_vars([ + 'ITEMS_COUNT' => $this->language->lang('ASS_ITEMS_COUNT', $total), + + 'SORT_DAYS' => $days, + 'SORT_DAYS_ARRAY' => $days_array, + 'SORT_DIR' => $dir, + 'SORT_DIR_ARRAY' => $dir_array, + 'SORT_SORT' => $sort, + 'SORT_SORT_ARRAY' => $sort_array, + 'SORT_TYPE_ARRAY' => $type_array, + + 'T_PANEL_SIZE' => $limit < 8 ? 6 : 3, + ]); + + return $this->helper->render('ass_category.html', $category->get_title()); + } + + /** + * Display a shop item. + * + * @param string $category_slug The category slug + * @param string $item_slug The item slug + * @return Response + * @access public + */ + public function item($category_slug, $item_slug) + { + $this->controller->check_shop(); + + $category = $this->operator_cat->load_entity($category_slug); + $item = $this->operator_item->load_entity($item_slug, $category->get_slug(), $category->get_id()); + + if (!$this->operator_item->is_available($item)) + { + throw new shop_exception(410, 'ASS_ERROR_NOT_AVAILABLE'); + } + + $this->controller->create_shop('shop', $category, $item); + + $this->controller->setup_carousel(); + $this->controller->setup_panels(); + + if ($item->get_related_enabled()) + { + $this->operator_item->assign_related_items($item); + } + + $this->template->assign_vars($this->operator_item->get_variables($item)); + + return $this->helper->render('ass_item.html', $item->get_title()); + } +} diff --git a/ext/phpbbstudio/ass/docs/.htaccess b/ext/phpbbstudio/ass/docs/.htaccess new file mode 100644 index 0000000..4128d34 --- /dev/null +++ b/ext/phpbbstudio/ass/docs/.htaccess @@ -0,0 +1,4 @@ + + Order Allow,Deny + Deny from All + diff --git a/ext/phpbbstudio/ass/docs/CHANGELOG.md b/ext/phpbbstudio/ass/docs/CHANGELOG.md new file mode 100644 index 0000000..fcddb5a --- /dev/null +++ b/ext/phpbbstudio/ass/docs/CHANGELOG.md @@ -0,0 +1,79 @@ +# phpBB Studio - Advanced Shop System + +#### v1.1.4-RC on 11-03-2020 +- Fixed ACP slider settings +- Fixed ACP Logs pagination +- Fixed special characters displaying incorrectly +- Added phpBB 3.3 compatibility + +#### v1.1.3-RC1 on 20-12-2019 +- Entered the stage features frozen. +- Fixed a bug in the shop blocks +- Fixed the wrong count in shop user blocks +- Added an option to determine where the Shop link shows up +- Fixed a bug where the ACP Inventory would not use the correct user +- Fixed a bug where the gift notification would throw a warning +- Added notifications for ACP Inventory gifts + +#### v1.1.2-beta on 01-12-2019 +- Fixed ACP "Overview" spenders block +- Fixed a bug where sale or featured items would not show up +- Added automatic cache purge option after file uploads +- Added shop blocks to the APS display page +- Added version checker + +#### v1.1.1-beta +- Fixed users being able to gift themselves _(now for real)_ +- Fixed pressing enter causing the page to reload instead of submitting the gift form +- Fixed redundant `=` in an HTML class attribute +- Fixed points distribution, now all goes through Advanced Points System +- Fixed the permission for managing the ACP Inventory not showing up +- Fixed entity import names to prevent warnings on lower PHP versions +- Fixed “File” item type not downloading when immediately deleted +- Fixed double slashes (`//`) in shop folders' and files' paths +- Added additional checks to file functions to ensure file existance +- Added style template events +- Added item stacking + - Multiple of the same item can now be in a user's inventory + - Only when the item is allowed to be stacked by the Administrator + - The maximum item stack is configurable on a per item basis + - Users need the permission to be authorised to stack items + - Full explanation added to the “Take the tour” upon item creation +- Extended index panels configuration + - Panels can now be disabled by giving them a limit of 0 + - Panels can now be ordered, determining in which order they are displayed + - Panels width is now also configurable by the administrator + +#### v1.1.0-beta +- Fixed shop index’ random items not being random +- Fixed category’s items displaying in reverse order +- Fixed inactive category’s items still being visible / usable. +- Fixed ACP item description’s colour palette + - No longer interferes with the “Create a group” item type palette + - Now responsive and properly resizes on different screen sizes +- Fixed ACP item prices values + - Proper minimum and maximum values have been added to the HTML + - PHP logic has been added in order to check the respective values and show errors +- Fixed ACP item gift percentage, it can now also be negative _(-100% / +999%)_ +- Fixed users being able to gift themselves +- Added ACP item _“Gift only”_ configuration + - Items can be configured so they can only be gifted to an other user and not purchased for personal use + - Please note, if _Gift only_ is set to Yes, but _Can be gifted_ is set to No, no actions will be shown in the shop +- Added ACP item _“Availability”_ configuration + - Items can be configured to only be available within a certain time + - If the item is no longer available, it will not show up in the shop, but it will still show up in users’ inventories +- Added ACP item _“Related items”_ configuration + - Related items can now be toggled on/off + - Upto 8 items can be selected to be related to this item + - If no items are selected, it will show the 4 closest ordered items +- Added ACP item _copy_ functionality + - Items can now be copied, duplicated, to easily create similar items within a single category +- Added ACP Files module back link +- Added ACP Inventory module + - Administrators can now manage users’ inventory + - Either globally add/delete items from user(s) and/or group(s) at once + - Or adding/deleting items from a single user’s inventory +- Enhanced ACP select boxes, they now use _Select2.js_ + +#### v1.0.0-beta + - first release diff --git a/ext/phpbbstudio/ass/docs/EVENTS.txt b/ext/phpbbstudio/ass/docs/EVENTS.txt new file mode 100644 index 0000000..1bccb91 --- /dev/null +++ b/ext/phpbbstudio/ass/docs/EVENTS.txt @@ -0,0 +1,19 @@ +/** + * Advanced Shop System extension © Copyright phpBB Studio 2019 + * https://www.phpbbstudio.com + * + * ASS is a free extension for the phpBB Forum Software Package. + * You can redistribute it and/or modify it under the terms of + * the GNU General Public License, version 2 (GPL-2.0) as + * published by the Free Software Foundation. + * + * This extension is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * A copy of the license can be viewed in the license.txt file. + * The same can be viewed at + */ + +No events required while using phpBB equal or greater than 3.2.7 diff --git a/ext/phpbbstudio/ass/docs/FEATURES.md b/ext/phpbbstudio/ass/docs/FEATURES.md new file mode 100644 index 0000000..05cbc31 --- /dev/null +++ b/ext/phpbbstudio/ass/docs/FEATURES.md @@ -0,0 +1,8 @@ +# phpBB Studio - Advanced Shop System + +- Fully integrated Shop System for the [Advanced Points System](https://github.com/phpBB-Studio/AdvancedPointsSystem) +- Ease-of-use filesystem interface for item images and files. +- High customisation options and possibilities per item. +- Several item types included by default
                *(Ranks and Files included by default)* +- More item types are available for expanding. +- Fully extendable by other extensions.
                *(with detailed explanation and examples)* diff --git a/ext/phpbbstudio/ass/docs/README.md b/ext/phpbbstudio/ass/docs/README.md new file mode 100644 index 0000000..264511e --- /dev/null +++ b/ext/phpbbstudio/ass/docs/README.md @@ -0,0 +1,86 @@ +

                Advanced Shop System

                +

                An extension for the phpBB Forum Software.

                + +

                + GPLv2 License +

                + +## Table of Contents +> - [Install](#install) +> - [Uninstall](#uninstall) +> - [Support](#support) +> - [Translations](#translations) +> - [Features](#features) +> - [Other items](#other-items) +> - [Other extensions](#other-extensions) +> - [Extending Advanced Shop System](#extending-advanced-shop-system) +> - [You might also like](#you-might-also-like) +> - [License](#license) + +## Install +1. Download the latest validated release +2. Unzip the downloaded release and copy it to the `ext` directory of your phpBB board. +3. Navigate in the ***ACP*** to `Customise » Extension management » Manage extensions`. +4. Look for `phpBB Studio - Advanced Shop System` under the **Disabled Extensions** list, and click its **`Enable`** link. +5. Set up and configure `Advanced Shop System` by navigating in the ***ACP*** to `Extensions » Advanced Shop System`. + +> *Read more about [installing phpBB Extensions](https://www.phpbb.com/extensions/installing/#installing).* + +## Uninstall +1. Navigate in the ***ACP*** to `Customise » Extension management » Manage extensions`. +2. Look for `phpBB Studio - Advanced Shop System` under the **Enabled Extensions** list, and click its **`Disable`** link. +3. To permanently uninstall, click **`Delete Data`** and then delete the `/ext/phpbbstudio/ass` directory. + +> *Read more about [uninstalling phpBB Extensions](https://www.phpbb.com/extensions/installing/#removing).* + +## Support +- **Important: Only official release versions validated by the phpBB Extensions Team should be installed on a live forum. Pre-release (beta, RC) versions downloaded from this repository are only to be used for testing on offline/development forums and are not officially supported.** +- Report bugs and other issues to our **[Issue Tracker](https://github.com/phpBB-Studio/AdvancedShopSystem/issues)**. +- Support requests can be posted and discussed in the **[Extension support](https://phpbbstudio.com/viewforum.php?f=5)** forum over at the [phpBB Studio](https://www.phpbbstudio.com). +- Support requests can be posted and discussed in the **[Development topic](https://www.phpbb.com/community/viewforum.php?f=456)** over at [phpBB.com](https://www.phpbb.com). + +## Translations +- Translations should be posted in the corresponding forum in **[Extension support](https://phpbbstudio.com/viewforum.php?f=5)** over at the [phpBB Studio](https://www.phpbbstudio.com). +- Each translation should be created in a **separate** topic. +- The topic should either contain a **zip archive** as an attachment or a link to your **GitHub repository**. +- Translations should ***not*** be posted in the Development topic over at [phpBB.com](https://www.phpbb.com). +- Translations should ***not*** be created as Pull Requests over at the [GitHub](https://github.com/phpBB-Studio/) repository. + +## Features +- Fully integrated Shop System for the [Advanced Points System](https://github.com/phpBB-Studio/AdvancedPointsSystem) +- Ease-of-use filesystem interface for item images and files. +- High customisation options and possibilities per item. +- Several item types included by default
                *(Points and Files included by default)* +- More item types are available for expanding. +- Fully extendable by other extensions.
                *(with detailed explanation and examples)* + +## Other items +- [Rank](https://phpbbstudio.com/extensions/advanced-shop-system-rank) +- [Avatar](https://phpbbstudio.com/extensions/advanced-shop-system-avatar) +- [Username](https://phpbbstudio.com/extensions/advanced-shop-system-username) +- [Groups](https://phpbbstudio.com/extensions/advanced-shop-system-groups) *(Create a group and Join a group)* +- [Permissions](https://phpbbstudio.com/extensions/advanced-shop-system-permissions) *(Global permissions and Local permissions)* + +## Other extensions +- [Advanced Points System](https://github.com/phpBB-Studio/AdvancedPointsSystem) +- [Advanced Points System · Purchases](https://phpbbstudio.com/extensions/advanced-points-system-purchases) +- [Advanced Points System · Auto Groups](https://github.com/phpBB-Studio/AdvancedShopSystemAutoGroups) + +## Extending Advanced Shop System +For the extension developers amongst us, we have written a comprehensive Wiki that should describe everything in detail. +This can be read over at [Extending Advanced Shop System](https://github.com/phpBB-Studio/AdvancedShopSystem/wiki/Extending-ASS). If there are still any questions, feel free to ask. + +## You might also like +- Dice Rolls +- Highlight Posts +- Who Read What +- Sub Global Topic +- Topic Cement Style +- Topic Events + + +## License +GNU General Public License, version 2 ([GPLv2](../license.txt)). + +--- +> [phpbbstudio.com](https://www.phpbbstudio.com) · GitHub [phpbb-studio](https://github.com/phpbb-studio/) · phpBB [3Di](https://www.phpbb.com/community/memberlist.php?mode=viewprofile&u=177467) / [mrgoldy](https://www.phpbb.com/community/memberlist.php?mode=viewprofile&u=1114105) diff --git a/ext/phpbbstudio/ass/docs/images/ass.png b/ext/phpbbstudio/ass/docs/images/ass.png new file mode 100644 index 0000000000000000000000000000000000000000..a596e5fa08583f3bda2f69bcf1aa983830dac19d GIT binary patch literal 26816 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 literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/highlight_posts.png b/ext/phpbbstudio/ass/docs/images/highlight_posts.png new file mode 100644 index 0000000000000000000000000000000000000000..3373c3e72fee42cb90440d4989a02c3443fb0766 GIT binary patch literal 1053 zcmV+&1mgRNP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZV#A-rea#DMHj>d+mind>%bBXKv?z=0D>V08dtK z%Xhgt#j=CrN`@HXG-#?IZfV>|g;{>ECdAsxvV8XHfSJh<6Jt7>Dtr+;u4J#!B5rAf z3}v{|R}_vb*~vG_Zrd!)n<$x_%@>m)Qc1(Ncv_C+{Rf-ho|bsOWz%woE_Rh2D3vsr zP8wu#HcGMVFgd3CCX^C3cWfR#-)FDbV)aFt?3RrTKtl`nS6R5fIaCt6FT25#u$yN%+E$iSXv;14th}s&EHP|3_5s%3PxW$?MZn4`he_qgC8x8 zL~Ml7h|0I$SSZRrZk8{#*ex_ke;ytt)jkA#S&l|u0@~hd@Zn>FX47LMQ{&!J?8w&s zO{&*lAMod2b)(o~-W9`(gF9CTHoWq+{z2Wl5 z+bT8N1K>@z#`J_iGNB_BP!)lu3U1Cs7>%k-Cyl;xfgtjYAdkWz`A@FT$-exGz;C;* z1(eyW^Wtrlmg7;Wy4X$csH|>#{PL*4Xhg-(6_VFd)@qYW9espJ>9Rb$4Ah$_Q#TC zs^>1AK}PIF@b}Bt%lLa4OD}cB&p*w{ySJ>aUZXcMReoLD$MgQ{Kr>Szez==J9}!#> zf_}OFR9?orf#XVkUoWG@EsgDbv*UH!btU;?3(u28BPxq?CRS8sBU2;0WmBp+lqxO8 z6Z(aS=Cbl%R&4Dyh+7(3Iu+vCs{;g_{W*sK%hZ_rGQzDnld;c65CW#I8@$QZ$d_7# zbmhXuGe~#1jQ>%chx6>@n{0k;urzNX0M=HPWhQ42KPVfb^R4UfgR*og#O()9#NPt| XXkpNvkMfYX00000NkvXXu0mjfn}7EP literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/shop1.png b/ext/phpbbstudio/ass/docs/images/shop1.png new file mode 100644 index 0000000000000000000000000000000000000000..90c328539b5bc5528eab9cad9c58e7a0bce15b20 GIT binary patch literal 204226 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 B7XJVM literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/shop2.png b/ext/phpbbstudio/ass/docs/images/shop2.png new file mode 100644 index 0000000000000000000000000000000000000000..94f6e2f4b206ffdcaa883e6c32d86dd4127b0d29 GIT binary patch literal 102369 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 U`!vC27x3@i9j)7lTaTXqFR5UdyZ`_I literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/shop3.png b/ext/phpbbstudio/ass/docs/images/shop3.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6f1bc5c7e08d14003bd04e08609107133634c8 GIT binary patch literal 475778 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%0Dxy)Y{X6WQmDar4twW>7Nk|+;FIuADoB!w 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 KBYDQS@c#h~j>Vb) literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/shop4.png b/ext/phpbbstudio/ass/docs/images/shop4.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0c8a3d2f5a10cce876ba8d0abcd7c67895d647 GIT binary patch literal 92332 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%0D`KJ6SzNOtP(;e9A%Mu*Skr@jJ97Slx-ZbWy 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 literal 0 HcmV?d00001 diff --git a/ext/phpbbstudio/ass/docs/images/shop5.png b/ext/phpbbstudio/ass/docs/images/shop5.png new file mode 100644 index 0000000000000000000000000000000000000000..4417babb8c06acf81cdffbe0a49874ce23359af2 GIT binary patch literal 233397 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

                5THtqo&w7^TN$z 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�j2jjs4=HVv=|AINK+GI8;&Zof? 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 h0*?213A4L6#dx69TF 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