From 3ffb8257aff3a9f6f5a446e2a29609b9d7a6667a Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Tue, 15 Dec 2020 17:25:24 +0200 Subject: [PATCH 01/31] New: The user role setting 'Avoid indexing profile by search engines' --- includes/admin/templates/role/profile.php | 8 ++++++++ includes/core/class-builtin.php | 2 +- includes/core/um-actions-profile.php | 22 +++++++++++++++++----- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index 4aaf6da7..48a5115c 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -40,6 +40,14 @@ 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), 'tooltip' => __( 'Can this role view private profiles?', 'ultimate-member' ), 'value' => ! empty( $role['_um_can_access_private_profile'] ) ? $role['_um_can_access_private_profile'] : 0, + ), + array( + 'id' => '_um_profile_noindex', + 'type' => 'checkbox', + 'name' => '_um_profile_noindex', + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'tooltip' => __( 'Hides the profile page for robots', 'ultimate-member' ), + 'value' => ! empty( $role['_um_profile_noindex'] ) ? $role['_um_profile_noindex'] : 0, ) ) ) )->render_form(); ?> diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index ed11148d..c5f87170 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -1139,7 +1139,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'required' => 0, 'public' => 1, 'editable' => 1, - 'default' => '0', + 'default' => UM()->roles()->um_user_can( 'profile_noindex' ) ? '1' : '0', 'options' => array( '0' => __( 'No', 'ultimate-member' ), '1' => __( 'Yes', 'ultimate-member' ), diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 67826f1b..b7880086 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -682,15 +682,27 @@ function um_profile_dynamic_meta_desc() { $privacy = get_user_meta( $user_id, 'profile_privacy', true ); if ( $privacy == __( 'Only me', 'ultimate-member' ) || $privacy == 'Only me' ) { + echo ''; + return; + } + + /** + * @see the user role setting "Avoid indexing profile by search engines" + */ + $role = UM()->roles()->get_priority_user_role( $user_id ); + $permissions = UM()->roles()->role_data( $role ); + if ( ! empty( $permissions['profile_noindex'] ) ) { + echo ''; return; } + /** + * @see the account setting "Avoid indexing my profile by search engines" + */ $noindex = get_user_meta( $user_id, 'profile_noindex', true ); - if ( ! empty( $noindex ) ) { ?> - - - - '; + return; } um_fetch_user( $user_id ); From 85b6bfdc5fc2b859798a60019ddc2f7002932c51 Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Tue, 15 Dec 2020 19:14:34 +0200 Subject: [PATCH 02/31] Fix for the account field "Avoid indexing my profile by search engines" --- includes/core/um-filters-account.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/includes/core/um-filters-account.php b/includes/core/um-filters-account.php index c460102d..7b963c3a 100644 --- a/includes/core/um-filters-account.php +++ b/includes/core/um-filters-account.php @@ -43,4 +43,19 @@ function um_account_sanitize_data( $data ) { return $data; } -add_filter( 'um_account_pre_updating_profile_array', 'um_account_sanitize_data', 10, 1 ); \ No newline at end of file +add_filter( 'um_account_pre_updating_profile_array', 'um_account_sanitize_data', 10, 1 ); + + +/** + * Fix for the account field "Avoid indexing my profile by search engines" + * @since 2.1.14 [2020-12-15] + * @param bool $value + * @return int + */ +function um_account_profile_noindex_value( $value ) { + if ( ! is_numeric( $value ) ) { + $value = (int) get_user_meta( um_profile_id(), 'profile_noindex', true ); + } + return $value; +} +add_filter( 'um_profile_profile_noindex_empty__filter', 'um_account_profile_noindex_value' ); \ No newline at end of file From 0fdb5635eb622c2d1008b31afaf18b209b5f5142 Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Tue, 22 Dec 2020 20:13:58 +0200 Subject: [PATCH 03/31] The general users setting "Avoid indexing profile by search engines" is added. The user role setting "Avoid indexing profile by search engines" is changed. --- includes/admin/core/class-admin-settings.php | 11 +++++ includes/admin/templates/role/profile.php | 12 +++-- includes/core/class-user.php | 46 ++++++++++++++++++++ includes/core/um-actions-profile.php | 28 ++++-------- 4 files changed, 75 insertions(+), 22 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 53a8e21e..73e5e848 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -630,6 +630,17 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'type' => 'checkbox', 'label' => __( 'Require a strong password? (when user resets password only)', 'ultimate-member' ), 'tooltip' => __( 'Enable or disable a strong password rules on password reset and change procedure', 'ultimate-member' ), + ), + array( + 'id' => 'profile_noindex', + 'type' => 'select', + 'size' => 'small', + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'tooltip' => __( 'Hides the profile page for robots.', 'ultimate-member' ) . ' ' . __( 'This setting can be overridden by individual role settings.', 'ultimate-member' ), + 'options' => [ + '1' => __( 'Yes', 'ultimate-member' ), + '' => __( 'No', 'ultimate-member' ) + ] ) ) ), diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index 48a5115c..0b19c247 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -43,11 +43,17 @@ ), array( 'id' => '_um_profile_noindex', - 'type' => 'checkbox', + 'type' => 'select', + 'size' => 'medium', 'name' => '_um_profile_noindex', 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'tooltip' => __( 'Hides the profile page for robots', 'ultimate-member' ), - 'value' => ! empty( $role['_um_profile_noindex'] ) ? $role['_um_profile_noindex'] : 0, + 'tooltip' => __( 'Hides the profile page for robots.', 'ultimate-member' ) . ' ' . __( 'The default value depends on the general users settings.', 'ultimate-member' ), + 'options' => [ + '' => __( 'Default', 'ultimate-member' ), + '1' => __( 'Yes', 'ultimate-member' ), + '2' => __( 'No', 'ultimate-member' ) + ], + 'value' => ! empty( $role['_um_profile_noindex'] ) ? $role['_um_profile_noindex'] : '', ) ) ) )->render_form(); ?> diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 08b31861..1c6138be 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1686,6 +1686,52 @@ if ( ! class_exists( 'um\core\User' ) ) { } + /** + * This method checks if the profile indexing is disabled + * + * @since 2.1.14 [2020-12-22] + * @usage user()->is_profile_noindex(); ?> + * + * @return boolean Is the profile indexing disabled? + */ + function is_profile_noindex(){ + $user_id = $this->id; + + $profile_noindex = false; + + if ( !get_option( 'blog_public' ) ){ + // Option "Search engine visibility" in [wp-admin > Settings > Reading] + $profile_noindex = true; + + } elseif ( $this->is_private_profile( $user_id ) ){ + // Setting "Profile Privacy" in [Account > Privacy] + $profile_noindex = true; + + } elseif ( get_user_meta( $user_id, 'profile_noindex', true ) === '1' ){ + // Setting "Avoid indexing my profile by search engines in [Account > Privacy] + $profile_noindex = true; + + } + + if( ! $profile_noindex ){ + $role = UM()->roles()->get_priority_user_role( $user_id ); + $permissions = UM()->roles()->role_data( $role ); + + if ( isset( $permissions['profile_noindex'] ) && $permissions['profile_noindex'] === '1' ) { + // Setting "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > User Roles > Edit Role] + $profile_noindex = true; + + } elseif ( empty( $permissions['profile_noindex'] ) && UM()->options()->get( 'profile_noindex' ) === '1' ){ + // Setting "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > Settings > General > Users] + $profile_noindex = true; + + } + } + + return apply_filters( 'um_user_is_profile_noindex', $profile_noindex, $this ); + } + + /** * This method checks if give user profile is private. * diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index b7880086..e6b343c5 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -680,33 +680,23 @@ function um_profile_dynamic_meta_desc() { $user_id = um_get_requested_user(); - $privacy = get_user_meta( $user_id, 'profile_privacy', true ); - if ( $privacy == __( 'Only me', 'ultimate-member' ) || $privacy == 'Only me' ) { - echo ''; - return; - } - - /** - * @see the user role setting "Avoid indexing profile by search engines" - */ - $role = UM()->roles()->get_priority_user_role( $user_id ); - $permissions = UM()->roles()->role_data( $role ); - if ( ! empty( $permissions['profile_noindex'] ) ) { - echo ''; - return; + if( $user_id !== um_user('ID') ){ + um_fetch_user( $user_id ); } /** - * @see the account setting "Avoid indexing my profile by search engines" + * Settings by the priority: + * "Search engine visibility" in [wp-admin > Settings > Reading] + * "Profile Privacy" in [Account > Privacy] + * "Avoid indexing my profile by search engines in [Account > Privacy] + * "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > User Roles > Edit Role] + * "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > Settings > General > Users] */ - $noindex = get_user_meta( $user_id, 'profile_noindex', true ); - if ( ! empty( $noindex ) ) { + if ( UM()->user()->is_profile_noindex() ) { echo ''; return; } - um_fetch_user( $user_id ); - $locale = get_user_locale( $user_id ); $site_name = get_bloginfo( 'name' ); $twitter_site = '@' . sanitize_title( $site_name ); From e8dd0afd43d3a00ff38edff1f93c02d98b888e6d Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Wed, 23 Dec 2020 16:57:41 +0200 Subject: [PATCH 04/31] Fix NaN in the slider range. --- includes/core/class-member-directory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index c715b303..22283143 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -712,7 +712,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { -
+
Date: Fri, 15 Jan 2021 15:37:45 +0200 Subject: [PATCH 05/31] - change hook for a locations extension --- includes/core/class-member-directory.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index c715b303..1eddd458 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -2518,17 +2518,17 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * @change_log * ["Since: 2.0"] * @usage - * + * * @example * */ - $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids ); + $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids, $this->query_args ); $sizes = UM()->options()->get( 'cover_thumb_sizes' ); From 9a298581dca0b4018476190e08b2cb11be6d3bd8 Mon Sep 17 00:00:00 2001 From: andrewshuba Date: Tue, 19 Jan 2021 13:54:31 +0200 Subject: [PATCH 06/31] - changes for a meta table --- includes/core/class-member-directory-meta.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index af70f0b8..33dc6f8f 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -829,8 +829,38 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { {$this->sql_limit}" ); + $query = array( + 'select' => $this->select, + 'sql_where' => $sql_where, + 'having' => $this->having, + 'sql_limit' => $this->sql_limit, + ); + $total_users = (int) $wpdb->get_var( 'SELECT FOUND_ROWS()' ); + /** + * UM hook + * + * @type filter + * @title um_prepare_user_results_array_meta + * @description Extend member directory query result + * @input_vars + * [{"var":"$result","type":"array","desc":"Members Query Result"}] + * @change_log + * ["Since: 2.0"] + * @usage + * + * @example + * + */ + $user_ids = apply_filters( 'um_prepare_user_results_array_meta', $user_ids, $query ); + $pagination_data = $this->calculate_pagination( $directory_data, $total_users ); $sizes = UM()->options()->get( 'cover_thumb_sizes' ); From be4b56b5d65176f21f1efc24a1c4950f2b60f675 Mon Sep 17 00:00:00 2001 From: andrewshuba Date: Wed, 20 Jan 2021 15:26:01 +0200 Subject: [PATCH 07/31] - add comment about SQL_CALC_FOUND_ROWS --- includes/core/class-member-directory-meta.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 33dc6f8f..bcddc2ad 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -818,6 +818,12 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { global $wpdb; + /* + * + * SQL_CALC_FOUND_ROWS is deprecated as of MySQL 8.0.17 + * https://core.trac.wordpress.org/ticket/47280 + * + * */ $user_ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS DISTINCT u.ID {$this->select} From 2bf5810802bb94ce7bc9fcda23fd0e9187ecd071 Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Sun, 24 Jan 2021 22:28:09 +0200 Subject: [PATCH 08/31] Fix for the method that gets a list of icons --- includes/core/class-fonticons.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/core/class-fonticons.php b/includes/core/class-fonticons.php index 444bda0f..6d964a23 100644 --- a/includes/core/class-fonticons.php +++ b/includes/core/class-fonticons.php @@ -24,22 +24,22 @@ if ( ! class_exists( 'um\core\FontIcons' ) ) { $files['ii'] = um_path . 'assets/css/um-fonticons-ii.css'; $files['fa'] = um_path . 'assets/css/um-fonticons-fa.css'; + $array = array(); foreach ( $files as $c => $file ) { $css = file_get_contents( $file ); if ( $c == 'fa' ) { - preg_match_all('/(um-faicon-.*?)\s?\{/', $css, $matches); + preg_match_all('/\.(um-faicon-.*?):before/', $css, $matches); } else { - preg_match_all('/(um-icon-.*?)\s?\{/', $css, $matches); + preg_match_all('/\.(um-icon-.*?):before/', $css, $matches); } - unset( $matches[1][0] ); foreach ( $matches[1] as $match ) { $icon = str_replace( ':before', '', $match ); $array[] = $icon; } - + $array = array_unique( $array ); } update_option( 'um_cache_fonticons', $array ); From 6a97af659c735c06f3cb2371db4577d61a95c7fd Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Feb 2021 13:16:53 +0200 Subject: [PATCH 09/31] - fixed GDPR applied time displaying in User Info popup; --- includes/um-short-functions.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 8d4c4d02..2b2bff36 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -689,6 +689,10 @@ function um_user_submitted_registration_formatted( $style = false ) { $output .= um_user_submited_display( 'timestamp', __( 'Date Submitted', 'ultimate-member' ) ); $output .= um_user_submited_display( 'form_id', __( 'Form', 'ultimate-member' ), $submitted_data ); + if ( isset( $submitted_data['use_gdpr_agreement'] ) ) { + $output .= um_user_submited_display( 'use_gdpr_agreement', __( 'GDPR Applied', 'ultimate-member' ), $submitted_data ); + } + if ( isset( $submitted_data ) && is_array( $submitted_data ) ) { if ( isset( $submitted_data['form_id'] ) ) { @@ -888,7 +892,8 @@ function um_user_submited_display( $k, $title, $data = array(), $style = true ) } if ( $k == 'timestamp' ) { - $k = __( 'date submitted', 'ultimate-member' ); + $v = date( "d M Y H:i", $v ); + } elseif ( $k == 'use_gdpr_agreement' ) { $v = date( "d M Y H:i", $v ); } From d8379691af44b2a772409675716e77f6a87d93c8 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Feb 2021 15:42:33 +0200 Subject: [PATCH 10/31] - removed unnecessary modal blocks; --- includes/admin/core/class-admin-forms.php | 2 ++ includes/admin/core/class-admin-metabox.php | 15 +++++++++++---- .../modal/{ => forms}/dynamic_edit_field.php | 0 .../modal/{ => forms}/dynamic_edit_row.php | 0 .../modal/{ => forms}/dynamic_form_preview.php | 0 .../modal/{ => forms}/dynamic_new_divider.php | 0 .../modal/{ => forms}/dynamic_new_field.php | 0 .../modal/{ => forms}/dynamic_new_group.php | 0 .../{ => forms}/dynamic_registration_preview.php | 0 .../admin/templates/modal/{ => forms}/fields.php | 0 .../templates/modal/{ => forms}/fonticons.php | 0 11 files changed, 13 insertions(+), 4 deletions(-) rename includes/admin/templates/modal/{ => forms}/dynamic_edit_field.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_edit_row.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_form_preview.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_new_divider.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_new_field.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_new_group.php (100%) rename includes/admin/templates/modal/{ => forms}/dynamic_registration_preview.php (100%) rename includes/admin/templates/modal/{ => forms}/fields.php (100%) rename includes/admin/templates/modal/{ => forms}/fonticons.php (100%) diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 881f74d4..1a0c23e7 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -542,6 +542,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $html .= ''; + UM()->metabox()->init_icon = true; + return $html; } diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 037f0ed3..063fcda0 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -34,6 +34,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { private $custom_nonce_added = false; + var $init_icon = false; + + /** * Admin_Metabox constructor. */ @@ -43,7 +46,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { $this->edit_array = []; add_action( 'admin_head', array( &$this, 'admin_head' ), 9); - add_action( 'admin_footer', array( &$this, 'load_modal_content' ), 9); + add_action( 'admin_footer', array( &$this, 'load_modal_content' ), 9 ); add_action( 'load-post.php', array( &$this, 'add_metabox' ), 9 ); add_action( 'load-post-new.php', array( &$this, 'add_metabox' ), 9 ); @@ -1198,14 +1201,18 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { * Load modal content */ function load_modal_content() { - $screen = get_current_screen(); - if ( UM()->admin()->is_um_screen() ) { - foreach ( glob( um_path . 'includes/admin/templates/modal/*.php' ) as $modal_content ) { + + if ( isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { + foreach ( glob( um_path . 'includes/admin/templates/modal/forms/*.php' ) as $modal_content ) { include_once $modal_content; } } + if ( $this->init_icon ) { + include_once um_path . 'includes/admin/templates/modal/forms/fonticons.php'; + } + // needed on forms only if ( ! isset( $this->is_loaded ) && isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { $settings['textarea_rows'] = 8; diff --git a/includes/admin/templates/modal/dynamic_edit_field.php b/includes/admin/templates/modal/forms/dynamic_edit_field.php similarity index 100% rename from includes/admin/templates/modal/dynamic_edit_field.php rename to includes/admin/templates/modal/forms/dynamic_edit_field.php diff --git a/includes/admin/templates/modal/dynamic_edit_row.php b/includes/admin/templates/modal/forms/dynamic_edit_row.php similarity index 100% rename from includes/admin/templates/modal/dynamic_edit_row.php rename to includes/admin/templates/modal/forms/dynamic_edit_row.php diff --git a/includes/admin/templates/modal/dynamic_form_preview.php b/includes/admin/templates/modal/forms/dynamic_form_preview.php similarity index 100% rename from includes/admin/templates/modal/dynamic_form_preview.php rename to includes/admin/templates/modal/forms/dynamic_form_preview.php diff --git a/includes/admin/templates/modal/dynamic_new_divider.php b/includes/admin/templates/modal/forms/dynamic_new_divider.php similarity index 100% rename from includes/admin/templates/modal/dynamic_new_divider.php rename to includes/admin/templates/modal/forms/dynamic_new_divider.php diff --git a/includes/admin/templates/modal/dynamic_new_field.php b/includes/admin/templates/modal/forms/dynamic_new_field.php similarity index 100% rename from includes/admin/templates/modal/dynamic_new_field.php rename to includes/admin/templates/modal/forms/dynamic_new_field.php diff --git a/includes/admin/templates/modal/dynamic_new_group.php b/includes/admin/templates/modal/forms/dynamic_new_group.php similarity index 100% rename from includes/admin/templates/modal/dynamic_new_group.php rename to includes/admin/templates/modal/forms/dynamic_new_group.php diff --git a/includes/admin/templates/modal/dynamic_registration_preview.php b/includes/admin/templates/modal/forms/dynamic_registration_preview.php similarity index 100% rename from includes/admin/templates/modal/dynamic_registration_preview.php rename to includes/admin/templates/modal/forms/dynamic_registration_preview.php diff --git a/includes/admin/templates/modal/fields.php b/includes/admin/templates/modal/forms/fields.php similarity index 100% rename from includes/admin/templates/modal/fields.php rename to includes/admin/templates/modal/forms/fields.php diff --git a/includes/admin/templates/modal/fonticons.php b/includes/admin/templates/modal/forms/fonticons.php similarity index 100% rename from includes/admin/templates/modal/fonticons.php rename to includes/admin/templates/modal/forms/fonticons.php From 38d412cd6f13c4b319ba30dc6cb1509f7d4cea82 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Feb 2021 17:04:19 +0200 Subject: [PATCH 11/31] - fixed issue with preview registration details popup; --- includes/admin/core/class-admin-metabox.php | 4 ++++ .../modal/{forms => }/dynamic_registration_preview.php | 0 2 files changed, 4 insertions(+) rename includes/admin/templates/modal/{forms => }/dynamic_registration_preview.php (100%) diff --git a/includes/admin/core/class-admin-metabox.php b/includes/admin/core/class-admin-metabox.php index 063fcda0..7f4c7fc0 100644 --- a/includes/admin/core/class-admin-metabox.php +++ b/includes/admin/core/class-admin-metabox.php @@ -1213,6 +1213,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Metabox' ) ) { include_once um_path . 'includes/admin/templates/modal/forms/fonticons.php'; } + if ( $screen->id == 'users' ) { + include_once um_path . 'includes/admin/templates/modal/dynamic_registration_preview.php'; + } + // needed on forms only if ( ! isset( $this->is_loaded ) && isset( $screen->id ) && strstr( $screen->id, 'um_form' ) ) { $settings['textarea_rows'] = 8; diff --git a/includes/admin/templates/modal/forms/dynamic_registration_preview.php b/includes/admin/templates/modal/dynamic_registration_preview.php similarity index 100% rename from includes/admin/templates/modal/forms/dynamic_registration_preview.php rename to includes/admin/templates/modal/dynamic_registration_preview.php From e2f82f5dbf86966f4fa457340a85fb7858beeb61 Mon Sep 17 00:00:00 2001 From: denisbaranov Date: Tue, 9 Feb 2021 18:46:08 +0200 Subject: [PATCH 12/31] Sanitize the user_login created from first_name and last_name --- includes/core/um-actions-register.php | 40 ++++++++++++++++----------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index bf8dc896..a6523d5c 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -314,24 +314,32 @@ function um_submit_form_register( $args ) { if ( ! empty( $first_name ) && ! empty( $last_name ) && empty( $user_login ) ) { - if ( UM()->options()->get( 'permalink_base' ) == 'name' ) { - $user_login = rawurlencode( strtolower( str_replace( " ", ".", $first_name . " " . $last_name ) ) ); - } elseif ( UM()->options()->get( 'permalink_base' ) == 'name_dash' ) { - $user_login = rawurlencode( strtolower( str_replace( " ", "-", $first_name . " " . $last_name ) ) ); - } elseif ( UM()->options()->get( 'permalink_base' ) == 'name_plus' ) { - $user_login = strtolower( str_replace( " ", "+", $first_name . " " . $last_name ) ); - } else { - $user_login = strtolower( str_replace( " ", "", $first_name . " " . $last_name ) ); - } + switch ( UM()->options()->get( 'permalink_base' ) ) { + case 'name': + $user_login = str_replace( " ", ".", $first_name . " " . $last_name ); + break; - // if full name exists - $count = 1; - $temp_user_login = $user_login; - while ( username_exists( $temp_user_login ) ) { - $temp_user_login = $user_login . $count; - $count++; + case 'name_dash': + $user_login = str_replace( " ", "-", $first_name . " " . $last_name ); + break; + + case 'name_plus': + $user_login = str_replace( " ", "+", $first_name . " " . $last_name ); + break; + + default: + $user_login = str_replace( " ", "", $first_name . " " . $last_name ); + break; } - if ( $temp_user_login !== $user_login ) { + $user_login = sanitize_user( strtolower( remove_accents( $user_login ) ), true ); + + if ( $user_login ) { + $count = 1; + $temp_user_login = $user_login; + while ( username_exists( $temp_user_login ) ) { + $temp_user_login = $user_login . $count; + $count++; + } $user_login = $temp_user_login; } } From 0b70571c5003dfa04f6c5176d958b6a1a0e4f245 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 10 Feb 2021 14:10:54 +0200 Subject: [PATCH 13/31] - small changes; --- includes/core/um-actions-register.php | 2 +- readme.txt | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index a6523d5c..984eb9da 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -333,7 +333,7 @@ function um_submit_form_register( $args ) { } $user_login = sanitize_user( strtolower( remove_accents( $user_login ) ), true ); - if ( $user_login ) { + if ( ! empty( $user_login ) ) { $count = 1; $temp_user_login = $user_login; while ( username_exists( $temp_user_login ) ) { diff --git a/readme.txt b/readme.txt index 8aaef4ee..7f08d3f5 100644 --- a/readme.txt +++ b/readme.txt @@ -155,6 +155,11 @@ The plugin works with popular caching plugins by automatically excluding Ultimat * To learn more about version 2.1 please see this [docs](https://docs.ultimatemember.com/article/1512-upgrade-2-1-0) * UM2.1+ is a significant update to the Member Directories' code base from 2.0.x. Please make sure you take a full-site backup with restore point before updating the plugin += 2.1.16: March xx, 2021 = + +* Bugfixes: + - Fixed user creating without username but based on first+last name with not-ASCII symbols + = 2.1.15: December 24, 2020 = * Bugfixes: From d826e4344e090f7f97b7adda1f993c23cb6aeac4 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Thu, 18 Feb 2021 02:35:53 +0200 Subject: [PATCH 14/31] - updated *.pot file --- languages/ultimate-member.pot | 763 +++++++++++++++++----------------- 1 file changed, 386 insertions(+), 377 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 65455082..3a81b1b3 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -1,15 +1,15 @@ -# Copyright (C) 2020 Ultimate Member +# Copyright (C) 2021 Ultimate Member # This file is distributed under the same license as the Ultimate Member plugin. msgid "" msgstr "" -"Project-Id-Version: Ultimate Member 2.1.13\n" +"Project-Id-Version: Ultimate Member 2.1.15\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-member\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2020-12-16T16:23:05+02:00\n" +"POT-Creation-Date: 2021-02-18T02:35:50+02:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.4.0\n" "X-Domain: ultimate-member\n" @@ -115,7 +115,7 @@ msgstr "" #: includes/admin/core/class-admin-builder.php:771 #: includes/admin/core/class-admin-dragdrop.php:33 #: includes/admin/core/class-admin-menu.php:106 -#: includes/core/class-fields.php:4581 +#: includes/core/class-fields.php:4601 msgid "Please login as administrator" msgstr "" @@ -184,6 +184,12 @@ msgstr "" msgid "Custom Fields" msgstr "" +#: includes/admin/core/class-admin-builder.php:901 +#: includes/admin/core/class-admin-metabox.php:2184 +#: includes/admin/core/class-admin-metabox.php:2190 +msgid "Meta Key" +msgstr "" + #: includes/admin/core/class-admin-builder.php:905 msgid "You did not create any custom fields" msgstr "" @@ -206,7 +212,7 @@ msgid "Status" msgstr "" #: includes/admin/core/class-admin-columns.php:151 -#: includes/admin/core/class-admin-metabox.php:2158 +#: includes/admin/core/class-admin-metabox.php:2159 #: includes/admin/templates/role/role-edit.php:193 #: includes/widgets/class-um-search-widget.php:86 msgid "Title" @@ -217,8 +223,8 @@ msgid "ID" msgstr "" #: includes/admin/core/class-admin-columns.php:154 -#: includes/admin/core/class-admin-metabox.php:812 -#: includes/admin/core/class-admin-metabox.php:974 +#: includes/admin/core/class-admin-metabox.php:813 +#: includes/admin/core/class-admin-metabox.php:975 msgid "Shortcode" msgstr "" @@ -304,7 +310,7 @@ msgid "Password" msgstr "" #: includes/admin/core/class-admin-enqueue.php:491 -#: includes/admin/core/class-admin-metabox.php:2279 +#: includes/admin/core/class-admin-metabox.php:2280 #: includes/core/class-account.php:109 msgid "Privacy" msgstr "" @@ -324,14 +330,14 @@ msgid "Required" msgstr "" #: includes/admin/core/class-admin-forms.php:526 -#: includes/admin/core/class-admin-metabox.php:1448 -#: includes/admin/core/class-admin-metabox.php:1476 +#: includes/admin/core/class-admin-metabox.php:1449 +#: includes/admin/core/class-admin-metabox.php:1477 msgid "Choose Icon" msgstr "" #: includes/admin/core/class-admin-forms.php:532 -#: includes/admin/core/class-admin-metabox.php:1450 -#: includes/admin/core/class-admin-metabox.php:1478 +#: includes/admin/core/class-admin-metabox.php:1451 +#: includes/admin/core/class-admin-metabox.php:1479 #: includes/admin/assets/js/um-admin-modal.js:415 #: includes/admin/assets/js/um-admin-modal.js:419 msgid "No Icon" @@ -381,7 +387,7 @@ msgstr "" #: includes/admin/core/class-admin-forms.php:1539 #: includes/admin/core/class-admin-forms.php:1561 -#: includes/admin/core/class-admin-metabox.php:2250 +#: includes/admin/core/class-admin-metabox.php:2251 #: includes/admin/assets/js/um-admin-forms.js:204 msgid "Label" msgstr "" @@ -515,38 +521,38 @@ msgstr "" msgid "Upgrade's Manual Request" msgstr "" -#: includes/admin/core/class-admin-metabox.php:233 +#: includes/admin/core/class-admin-metabox.php:234 msgid "UM Content Restriction" msgstr "" -#: includes/admin/core/class-admin-metabox.php:385 -#: includes/admin/core/class-admin-metabox.php:536 +#: includes/admin/core/class-admin-metabox.php:386 +#: includes/admin/core/class-admin-metabox.php:537 #: includes/admin/templates/access/restrict_content.php:53 msgid "Restrict access to this content?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:386 -#: includes/admin/core/class-admin-metabox.php:393 -#: includes/admin/core/class-admin-metabox.php:406 -#: includes/admin/core/class-admin-metabox.php:537 -#: includes/admin/core/class-admin-metabox.php:545 -#: includes/admin/core/class-admin-metabox.php:559 +#: includes/admin/core/class-admin-metabox.php:387 +#: includes/admin/core/class-admin-metabox.php:394 +#: includes/admin/core/class-admin-metabox.php:407 +#: includes/admin/core/class-admin-metabox.php:538 +#: includes/admin/core/class-admin-metabox.php:546 +#: includes/admin/core/class-admin-metabox.php:560 #: includes/admin/templates/access/restrict_content.php:54 #: includes/admin/templates/access/restrict_content.php:61 #: includes/admin/templates/access/restrict_content.php:74 msgid "Activate content restriction for this post" msgstr "" -#: includes/admin/core/class-admin-metabox.php:392 -#: includes/admin/core/class-admin-metabox.php:544 +#: includes/admin/core/class-admin-metabox.php:393 +#: includes/admin/core/class-admin-metabox.php:545 #: includes/admin/templates/access/restrict_content.php:60 #: includes/admin/assets/js/um-admin-blocks.js:95 msgid "Who can access this content?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:396 -#: includes/admin/core/class-admin-metabox.php:548 -#: includes/admin/core/class-admin-metabox.php:2269 +#: includes/admin/core/class-admin-metabox.php:397 +#: includes/admin/core/class-admin-metabox.php:549 +#: includes/admin/core/class-admin-metabox.php:2270 #: includes/admin/core/class-admin-navmenu.php:81 #: includes/admin/core/class-admin-navmenu.php:242 #: includes/admin/templates/access/restrict_content.php:64 @@ -555,1014 +561,1009 @@ msgstr "" msgid "Everyone" msgstr "" -#: includes/admin/core/class-admin-metabox.php:397 -#: includes/admin/core/class-admin-metabox.php:549 +#: includes/admin/core/class-admin-metabox.php:398 +#: includes/admin/core/class-admin-metabox.php:550 #: includes/admin/templates/access/restrict_content.php:65 #: includes/admin/assets/js/um-admin-blocks.js:107 msgid "Logged out users" msgstr "" -#: includes/admin/core/class-admin-metabox.php:398 -#: includes/admin/core/class-admin-metabox.php:550 +#: includes/admin/core/class-admin-metabox.php:399 +#: includes/admin/core/class-admin-metabox.php:551 #: includes/admin/templates/access/restrict_content.php:66 #: includes/admin/assets/js/um-admin-blocks.js:103 msgid "Logged in users" msgstr "" -#: includes/admin/core/class-admin-metabox.php:405 -#: includes/admin/core/class-admin-metabox.php:558 +#: includes/admin/core/class-admin-metabox.php:406 +#: includes/admin/core/class-admin-metabox.php:559 #: includes/admin/templates/access/restrict_content.php:73 msgid "Select which roles can access this content" msgstr "" -#: includes/admin/core/class-admin-metabox.php:414 -#: includes/admin/core/class-admin-metabox.php:569 +#: includes/admin/core/class-admin-metabox.php:415 +#: includes/admin/core/class-admin-metabox.php:570 #: includes/admin/templates/access/restrict_content.php:83 msgid "What happens when users without access tries to view the content?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:415 -#: includes/admin/core/class-admin-metabox.php:427 -#: includes/admin/core/class-admin-metabox.php:570 -#: includes/admin/core/class-admin-metabox.php:583 +#: includes/admin/core/class-admin-metabox.php:416 +#: includes/admin/core/class-admin-metabox.php:428 +#: includes/admin/core/class-admin-metabox.php:571 +#: includes/admin/core/class-admin-metabox.php:584 #: includes/admin/templates/access/restrict_content.php:84 #: includes/admin/templates/access/restrict_content.php:96 msgid "Action when users without access tries to view the content" msgstr "" -#: includes/admin/core/class-admin-metabox.php:418 -#: includes/admin/core/class-admin-metabox.php:573 +#: includes/admin/core/class-admin-metabox.php:419 +#: includes/admin/core/class-admin-metabox.php:574 #: includes/admin/templates/access/restrict_content.php:87 msgid "Show access restricted message" msgstr "" -#: includes/admin/core/class-admin-metabox.php:419 -#: includes/admin/core/class-admin-metabox.php:574 +#: includes/admin/core/class-admin-metabox.php:420 +#: includes/admin/core/class-admin-metabox.php:575 #: includes/admin/templates/access/restrict_content.php:88 msgid "Redirect user" msgstr "" -#: includes/admin/core/class-admin-metabox.php:426 -#: includes/admin/core/class-admin-metabox.php:582 +#: includes/admin/core/class-admin-metabox.php:427 +#: includes/admin/core/class-admin-metabox.php:583 #: includes/admin/templates/access/restrict_content.php:95 msgid "Would you like to use the global default message or apply a custom message to this content?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:430 -#: includes/admin/core/class-admin-metabox.php:586 +#: includes/admin/core/class-admin-metabox.php:431 +#: includes/admin/core/class-admin-metabox.php:587 #: includes/admin/templates/access/restrict_content.php:99 msgid "Global default message (default)" msgstr "" -#: includes/admin/core/class-admin-metabox.php:431 -#: includes/admin/core/class-admin-metabox.php:587 +#: includes/admin/core/class-admin-metabox.php:432 +#: includes/admin/core/class-admin-metabox.php:588 #: includes/admin/templates/access/restrict_content.php:100 msgid "Custom message" msgstr "" -#: includes/admin/core/class-admin-metabox.php:438 -#: includes/admin/core/class-admin-metabox.php:595 +#: includes/admin/core/class-admin-metabox.php:439 +#: includes/admin/core/class-admin-metabox.php:596 #: includes/admin/templates/access/restrict_content.php:107 msgid "Custom Restrict Content message" msgstr "" -#: includes/admin/core/class-admin-metabox.php:439 -#: includes/admin/core/class-admin-metabox.php:459 -#: includes/admin/core/class-admin-metabox.php:596 -#: includes/admin/core/class-admin-metabox.php:618 +#: includes/admin/core/class-admin-metabox.php:440 +#: includes/admin/core/class-admin-metabox.php:460 +#: includes/admin/core/class-admin-metabox.php:597 +#: includes/admin/core/class-admin-metabox.php:619 #: includes/admin/templates/access/restrict_content.php:108 #: includes/admin/templates/access/restrict_content.php:128 msgid "Changed global restrict message" msgstr "" -#: includes/admin/core/class-admin-metabox.php:446 -#: includes/admin/core/class-admin-metabox.php:604 +#: includes/admin/core/class-admin-metabox.php:447 +#: includes/admin/core/class-admin-metabox.php:605 #: includes/admin/templates/access/restrict_content.php:115 msgid "Where should users be redirected to?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:447 -#: includes/admin/core/class-admin-metabox.php:605 +#: includes/admin/core/class-admin-metabox.php:448 +#: includes/admin/core/class-admin-metabox.php:606 #: includes/admin/templates/access/restrict_content.php:116 msgid "Select redirect to page when user hasn't access to content" msgstr "" -#: includes/admin/core/class-admin-metabox.php:451 -#: includes/admin/core/class-admin-metabox.php:609 +#: includes/admin/core/class-admin-metabox.php:452 +#: includes/admin/core/class-admin-metabox.php:610 #: includes/admin/templates/access/restrict_content.php:120 msgid "Login page" msgstr "" -#: includes/admin/core/class-admin-metabox.php:452 -#: includes/admin/core/class-admin-metabox.php:610 +#: includes/admin/core/class-admin-metabox.php:453 +#: includes/admin/core/class-admin-metabox.php:611 #: includes/admin/templates/access/restrict_content.php:121 msgid "Custom URL" msgstr "" -#: includes/admin/core/class-admin-metabox.php:458 -#: includes/admin/core/class-admin-metabox.php:617 +#: includes/admin/core/class-admin-metabox.php:459 +#: includes/admin/core/class-admin-metabox.php:618 #: includes/admin/templates/access/restrict_content.php:127 msgid "Redirect URL" msgstr "" -#: includes/admin/core/class-admin-metabox.php:466 -#: includes/admin/core/class-admin-metabox.php:626 +#: includes/admin/core/class-admin-metabox.php:467 +#: includes/admin/core/class-admin-metabox.php:627 #: includes/admin/templates/access/restrict_content.php:135 msgid "Hide from queries" msgstr "" -#: includes/admin/core/class-admin-metabox.php:467 -#: includes/admin/core/class-admin-metabox.php:627 +#: includes/admin/core/class-admin-metabox.php:468 +#: includes/admin/core/class-admin-metabox.php:628 #: includes/admin/templates/access/restrict_content.php:136 msgid "Hide this content from archives, RSS feeds etc for users who do not have permission to view this content" msgstr "" -#: includes/admin/core/class-admin-metabox.php:807 +#: includes/admin/core/class-admin-metabox.php:808 msgid "General Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:808 +#: includes/admin/core/class-admin-metabox.php:809 msgid "Sorting" msgstr "" -#: includes/admin/core/class-admin-metabox.php:809 +#: includes/admin/core/class-admin-metabox.php:810 msgid "Profile Card" msgstr "" -#: includes/admin/core/class-admin-metabox.php:810 +#: includes/admin/core/class-admin-metabox.php:811 msgid "Search Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:811 +#: includes/admin/core/class-admin-metabox.php:812 msgid "Results & Pagination" msgstr "" -#: includes/admin/core/class-admin-metabox.php:813 +#: includes/admin/core/class-admin-metabox.php:814 msgid "Styling: General" msgstr "" -#: includes/admin/core/class-admin-metabox.php:826 +#: includes/admin/core/class-admin-metabox.php:827 msgid "Administrative Permissions" msgstr "" -#: includes/admin/core/class-admin-metabox.php:834 +#: includes/admin/core/class-admin-metabox.php:835 msgid "General Permissions" msgstr "" -#: includes/admin/core/class-admin-metabox.php:842 +#: includes/admin/core/class-admin-metabox.php:843 msgid "Profile Access" msgstr "" -#: includes/admin/core/class-admin-metabox.php:853 +#: includes/admin/core/class-admin-metabox.php:854 msgid "Homepage Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:864 +#: includes/admin/core/class-admin-metabox.php:865 msgid "Registration Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:872 +#: includes/admin/core/class-admin-metabox.php:873 msgid "Login Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:880 +#: includes/admin/core/class-admin-metabox.php:881 msgid "Logout Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:888 +#: includes/admin/core/class-admin-metabox.php:889 msgid "Delete Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:896 +#: includes/admin/core/class-admin-metabox.php:897 msgid "Publish" msgstr "" -#: includes/admin/core/class-admin-metabox.php:945 +#: includes/admin/core/class-admin-metabox.php:946 msgid "WP Capabilities" msgstr "" -#: includes/admin/core/class-admin-metabox.php:972 +#: includes/admin/core/class-admin-metabox.php:973 msgid "Select Form Type" msgstr "" -#: includes/admin/core/class-admin-metabox.php:973 +#: includes/admin/core/class-admin-metabox.php:974 msgid "Form Builder" msgstr "" -#: includes/admin/core/class-admin-metabox.php:976 -#: includes/admin/core/class-admin-metabox.php:997 -#: includes/admin/core/class-admin-metabox.php:1019 +#: includes/admin/core/class-admin-metabox.php:977 +#: includes/admin/core/class-admin-metabox.php:998 +#: includes/admin/core/class-admin-metabox.php:1020 msgid "Customize this form" msgstr "" -#: includes/admin/core/class-admin-metabox.php:998 +#: includes/admin/core/class-admin-metabox.php:999 msgid "User Meta" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1020 +#: includes/admin/core/class-admin-metabox.php:1021 msgid "Options" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1072 +#: includes/admin/core/class-admin-metabox.php:1073 msgid "Directory #%s" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1165 +#: includes/admin/core/class-admin-metabox.php:1166 msgid "Form #%s" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1269 +#: includes/admin/core/class-admin-metabox.php:1270 msgid "Visibility" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1269 +#: includes/admin/core/class-admin-metabox.php:1270 msgid "Select where this field should appear. This option should only be changed on the profile form and allows you to show a field in one mode only (edit or view) or in both modes." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1271 +#: includes/admin/core/class-admin-metabox.php:1272 msgid "View everywhere" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1272 +#: includes/admin/core/class-admin-metabox.php:1273 msgid "Edit mode only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1273 +#: includes/admin/core/class-admin-metabox.php:1274 msgid "View mode only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1378 +#: includes/admin/core/class-admin-metabox.php:1379 msgid "Value" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1387 +#: includes/admin/core/class-admin-metabox.php:1388 msgid "Validate" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1387 +#: includes/admin/core/class-admin-metabox.php:1388 msgid "Does this field require a special validation" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1388 +#: includes/admin/core/class-admin-metabox.php:1389 msgid "Select a validation type..." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1432 +#: includes/admin/core/class-admin-metabox.php:1433 msgid "Custom Action" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1432 +#: includes/admin/core/class-admin-metabox.php:1433 msgid "If you want to apply your custom validation, you can use action hooks to add custom validation. Please refer to documentation for further details." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1446 -#: includes/admin/core/class-admin-metabox.php:1474 +#: includes/admin/core/class-admin-metabox.php:1447 +#: includes/admin/core/class-admin-metabox.php:1475 msgid "Icon" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1446 -#: includes/admin/core/class-admin-metabox.php:1474 +#: includes/admin/core/class-admin-metabox.php:1447 +#: includes/admin/core/class-admin-metabox.php:1475 msgid "Select an icon to appear in the field. Leave blank if you do not want an icon to show in the field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1501 +#: includes/admin/core/class-admin-metabox.php:1502 msgid "CSS Class" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1501 +#: includes/admin/core/class-admin-metabox.php:1502 msgid "Specify a custom CSS class to be applied to this element" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1511 +#: includes/admin/core/class-admin-metabox.php:1512 msgid "Thickness (in pixels)" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1511 +#: includes/admin/core/class-admin-metabox.php:1512 msgid "This is the width in pixels, e.g. 4 or 2, etc" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1521 +#: includes/admin/core/class-admin-metabox.php:1522 msgid "Optional Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1521 +#: includes/admin/core/class-admin-metabox.php:1522 msgid "Optional text to include with the divider" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1531 +#: includes/admin/core/class-admin-metabox.php:1532 msgid "Padding" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1531 +#: includes/admin/core/class-admin-metabox.php:1532 msgid "Set padding for this section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1541 +#: includes/admin/core/class-admin-metabox.php:1542 msgid "Margin" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1541 +#: includes/admin/core/class-admin-metabox.php:1542 msgid "Set margin for this section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1551 +#: includes/admin/core/class-admin-metabox.php:1552 msgid "Border" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1551 +#: includes/admin/core/class-admin-metabox.php:1552 msgid "Set border for this section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1561 -#: includes/admin/core/class-admin-metabox.php:1732 +#: includes/admin/core/class-admin-metabox.php:1562 +#: includes/admin/core/class-admin-metabox.php:1733 msgid "Style" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1561 +#: includes/admin/core/class-admin-metabox.php:1562 msgid "Choose the border style" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1563 -#: includes/admin/core/class-admin-metabox.php:1734 -msgid "Solid" -msgstr "" - #: includes/admin/core/class-admin-metabox.php:1564 #: includes/admin/core/class-admin-metabox.php:1735 -msgid "Dotted" +msgid "Solid" msgstr "" #: includes/admin/core/class-admin-metabox.php:1565 #: includes/admin/core/class-admin-metabox.php:1736 -msgid "Dashed" +msgid "Dotted" msgstr "" #: includes/admin/core/class-admin-metabox.php:1566 #: includes/admin/core/class-admin-metabox.php:1737 +msgid "Dashed" +msgstr "" + +#: includes/admin/core/class-admin-metabox.php:1567 +#: includes/admin/core/class-admin-metabox.php:1738 msgid "Double" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1576 +#: includes/admin/core/class-admin-metabox.php:1577 msgid "Border Radius" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1576 +#: includes/admin/core/class-admin-metabox.php:1577 msgid "Rounded corners can be applied by setting a pixels value here. e.g. 5px" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1586 +#: includes/admin/core/class-admin-metabox.php:1587 msgid "Border Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1586 +#: includes/admin/core/class-admin-metabox.php:1587 msgid "Give a color to this border" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1596 +#: includes/admin/core/class-admin-metabox.php:1597 msgid "Enable Row Heading" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1596 +#: includes/admin/core/class-admin-metabox.php:1597 msgid "Whether to enable a heading for this row" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1606 +#: includes/admin/core/class-admin-metabox.php:1607 msgid "Heading Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1606 +#: includes/admin/core/class-admin-metabox.php:1607 msgid "Enter the row heading text here" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1616 +#: includes/admin/core/class-admin-metabox.php:1617 msgid "Background Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1616 +#: includes/admin/core/class-admin-metabox.php:1617 msgid "This will be the background of entire section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1626 +#: includes/admin/core/class-admin-metabox.php:1627 msgid "Heading Background Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1626 +#: includes/admin/core/class-admin-metabox.php:1627 msgid "This will be the background of the heading section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1636 +#: includes/admin/core/class-admin-metabox.php:1637 msgid "Heading Text Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1636 +#: includes/admin/core/class-admin-metabox.php:1637 msgid "This will be the text color of heading part only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1646 +#: includes/admin/core/class-admin-metabox.php:1647 msgid "Text Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1646 +#: includes/admin/core/class-admin-metabox.php:1647 msgid "This will be the text color of entire section" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1656 +#: includes/admin/core/class-admin-metabox.php:1657 msgid "Icon Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1656 +#: includes/admin/core/class-admin-metabox.php:1657 msgid "This will be the color of selected icon. By default It will be the same color as heading text color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1666 +#: includes/admin/core/class-admin-metabox.php:1667 msgid "Color" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1666 +#: includes/admin/core/class-admin-metabox.php:1667 msgid "Select a color for this divider" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1676 +#: includes/admin/core/class-admin-metabox.php:1677 msgid "URL Alt Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1676 +#: includes/admin/core/class-admin-metabox.php:1677 msgid "Entering custom text here will replace the url with a text link" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1686 +#: includes/admin/core/class-admin-metabox.php:1687 msgid "Link Target" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1686 +#: includes/admin/core/class-admin-metabox.php:1687 msgid "Choose whether to open this link in same window or in a new window" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1688 +#: includes/admin/core/class-admin-metabox.php:1689 msgid "Open in new window" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1689 +#: includes/admin/core/class-admin-metabox.php:1690 msgid "Same window" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1699 +#: includes/admin/core/class-admin-metabox.php:1700 msgid "SEO Follow" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1699 +#: includes/admin/core/class-admin-metabox.php:1700 msgid "Whether to follow or nofollow this link by search engines" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1701 +#: includes/admin/core/class-admin-metabox.php:1702 msgid "Follow" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1702 +#: includes/admin/core/class-admin-metabox.php:1703 msgid "No-Follow" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1712 +#: includes/admin/core/class-admin-metabox.php:1713 msgid "Force strong password?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1712 +#: includes/admin/core/class-admin-metabox.php:1713 msgid "Turn on to force users to create a strong password (A combination of one lowercase letter, one uppercase letter, and one number). If turned on this option is only applied to register forms and not to login forms." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1722 +#: includes/admin/core/class-admin-metabox.php:1723 msgid "Automatically add a confirm password field?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1722 +#: includes/admin/core/class-admin-metabox.php:1723 msgid "Turn on to add a confirm password field. If turned on the confirm password field will only show on register forms and not on login forms." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1732 +#: includes/admin/core/class-admin-metabox.php:1733 msgid "This is the line-style of divider" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1748 +#: includes/admin/core/class-admin-metabox.php:1749 msgid "Time Intervals (in minutes)" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1748 +#: includes/admin/core/class-admin-metabox.php:1749 msgid "Choose the minutes interval between each time in the time picker." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1749 +#: includes/admin/core/class-admin-metabox.php:1750 msgid "e.g. 30, 60, 120" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1761 +#: includes/admin/core/class-admin-metabox.php:1762 msgid "Date User-Friendly Format" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1761 +#: includes/admin/core/class-admin-metabox.php:1762 msgid "The display format of the date which is visible to user." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1772 +#: includes/admin/core/class-admin-metabox.php:1773 msgid "Time Format" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1772 +#: includes/admin/core/class-admin-metabox.php:1773 msgid "Choose the displayed time-format for this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1774 #: includes/admin/core/class-admin-metabox.php:1775 +#: includes/admin/core/class-admin-metabox.php:1776 msgid "( 12-hr format )" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1776 +#: includes/admin/core/class-admin-metabox.php:1777 msgid "( 24-hr format )" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1787 +#: includes/admin/core/class-admin-metabox.php:1788 msgid "Use custom Date format" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1787 +#: includes/admin/core/class-admin-metabox.php:1788 msgid "This option overrides \"Date User-Friendly Format\" option. See https://www.php.net/manual/en/function.date.php" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1797 +#: includes/admin/core/class-admin-metabox.php:1798 msgid "Displayed Date Format" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1797 +#: includes/admin/core/class-admin-metabox.php:1798 msgid "Whether you wish to show the date in full or only show the years e.g. 25 Years" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1799 +#: includes/admin/core/class-admin-metabox.php:1800 msgid "Show full date" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1800 +#: includes/admin/core/class-admin-metabox.php:1801 msgid "Show years only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1816 +#: includes/admin/core/class-admin-metabox.php:1817 msgid "Disable specific weekdays" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1816 +#: includes/admin/core/class-admin-metabox.php:1817 msgid "Disable specific week days from being available for selection in this date picker" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1818 +#: includes/admin/core/class-admin-metabox.php:1819 msgid "Sunday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1819 +#: includes/admin/core/class-admin-metabox.php:1820 msgid "Monday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1820 +#: includes/admin/core/class-admin-metabox.php:1821 msgid "Tuesday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1821 +#: includes/admin/core/class-admin-metabox.php:1822 msgid "Wednesday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1822 +#: includes/admin/core/class-admin-metabox.php:1823 msgid "Thursday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1823 +#: includes/admin/core/class-admin-metabox.php:1824 msgid "Friday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1824 +#: includes/admin/core/class-admin-metabox.php:1825 msgid "Saturday" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1834 +#: includes/admin/core/class-admin-metabox.php:1835 msgid "Number of Years to pick from" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1834 +#: includes/admin/core/class-admin-metabox.php:1835 msgid "Number of years available for the date selection. Default to last 50 years" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1844 +#: includes/admin/core/class-admin-metabox.php:1845 msgid "Years Selection" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1844 +#: includes/admin/core/class-admin-metabox.php:1845 msgid "This decides which years should be shown relative to today date" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1846 +#: includes/admin/core/class-admin-metabox.php:1847 msgid "Equal years before / after today" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1847 +#: includes/admin/core/class-admin-metabox.php:1848 msgid "Past years only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1848 +#: includes/admin/core/class-admin-metabox.php:1849 msgid "Future years only" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1858 +#: includes/admin/core/class-admin-metabox.php:1859 msgid "Date Range Start" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1858 +#: includes/admin/core/class-admin-metabox.php:1859 msgid "Set the minimum date/day in range in the format YYYY/MM/DD" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1859 -#: includes/admin/core/class-admin-metabox.php:1869 +#: includes/admin/core/class-admin-metabox.php:1860 +#: includes/admin/core/class-admin-metabox.php:1870 msgid "YYYY/MM/DD" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1868 +#: includes/admin/core/class-admin-metabox.php:1869 msgid "Date Range End" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1868 +#: includes/admin/core/class-admin-metabox.php:1869 msgid "Set the maximum date/day in range in the format YYYY/MM/DD" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1878 +#: includes/admin/core/class-admin-metabox.php:1879 msgid "Set Date Range" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1878 +#: includes/admin/core/class-admin-metabox.php:1879 msgid "Whether to show a specific number of years or specify a date range to be available for the date picker." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1880 +#: includes/admin/core/class-admin-metabox.php:1881 msgid "Fixed Number of Years" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1881 +#: includes/admin/core/class-admin-metabox.php:1882 msgid "Specific Date Range" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1894 +#: includes/admin/core/class-admin-metabox.php:1895 msgid "Enter Shortcode" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1894 +#: includes/admin/core/class-admin-metabox.php:1895 msgid "Enter the shortcode in the following textarea and it will be displayed on the fields" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1895 +#: includes/admin/core/class-admin-metabox.php:1896 msgid "e.g. [my_custom_shortcode]" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1904 +#: includes/admin/core/class-admin-metabox.php:1905 msgid "Content Editor" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1904 +#: includes/admin/core/class-admin-metabox.php:1905 msgid "Edit the content of this field here" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1917 +#: includes/admin/core/class-admin-metabox.php:1918 msgid "Crop Feature" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1917 +#: includes/admin/core/class-admin-metabox.php:1918 msgid "Enable/disable crop feature for this image upload and define ratio" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1919 +#: includes/admin/core/class-admin-metabox.php:1920 msgid "Turn Off (Default)" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1920 +#: includes/admin/core/class-admin-metabox.php:1921 msgid "Crop and force 1:1 ratio" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1921 +#: includes/admin/core/class-admin-metabox.php:1922 msgid "Crop and force user-defined ratio" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1938 +#: includes/admin/core/class-admin-metabox.php:1939 msgid "Allowed Image Types" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1938 -#: includes/admin/core/class-admin-metabox.php:1956 +#: includes/admin/core/class-admin-metabox.php:1939 +#: includes/admin/core/class-admin-metabox.php:1957 msgid "Select the image types that you want to allow to be uploaded via this field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:1956 +#: includes/admin/core/class-admin-metabox.php:1957 msgid "Allowed File Types" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1973 +#: includes/admin/core/class-admin-metabox.php:1974 msgid "Drag & Drop Photo" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1976 +#: includes/admin/core/class-admin-metabox.php:1977 msgid "Drag & Drop File" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1981 -#: includes/admin/core/class-admin-metabox.php:2001 +#: includes/admin/core/class-admin-metabox.php:1982 +#: includes/admin/core/class-admin-metabox.php:2002 msgid "Upload Box Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1981 +#: includes/admin/core/class-admin-metabox.php:1982 msgid "This is the headline that appears in the upload box for this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1991 +#: includes/admin/core/class-admin-metabox.php:1992 msgid "Additional Instructions Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:1991 +#: includes/admin/core/class-admin-metabox.php:1992 msgid "If you need to add information or secondary line below the headline of upload box, enter it here" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2001 +#: includes/admin/core/class-admin-metabox.php:2002 msgid "The text that appears on the button. e.g. Upload" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2002 -#: includes/core/class-fields.php:1717 -#: includes/core/class-fields.php:1758 -#: includes/core/class-fields.php:2619 -#: includes/core/class-fields.php:2694 +#: includes/admin/core/class-admin-metabox.php:2003 +#: includes/core/class-fields.php:1727 +#: includes/core/class-fields.php:1768 +#: includes/core/class-fields.php:2629 +#: includes/core/class-fields.php:2704 msgid "Upload" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2011 +#: includes/admin/core/class-admin-metabox.php:2012 msgid "Maximum Size in bytes" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2011 +#: includes/admin/core/class-admin-metabox.php:2012 msgid "The maximum size for image that can be uploaded through this field. Leave empty for unlimited size." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2021 +#: includes/admin/core/class-admin-metabox.php:2022 msgid "Textarea Height" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2021 +#: includes/admin/core/class-admin-metabox.php:2022 msgid "The height of textarea in pixels. Default is 100 pixels" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2031 +#: includes/admin/core/class-admin-metabox.php:2032 msgid "Spacing" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2031 +#: includes/admin/core/class-admin-metabox.php:2032 msgid "This is the required spacing in pixels. e.g. 20px" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2041 +#: includes/admin/core/class-admin-metabox.php:2042 msgid "Allow multiple selections" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2041 +#: includes/admin/core/class-admin-metabox.php:2042 msgid "Enable/disable multiple selections for this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2051 +#: includes/admin/core/class-admin-metabox.php:2052 msgid "Maximum number of selections" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2051 +#: includes/admin/core/class-admin-metabox.php:2052 msgid "Enter a number here to force a maximum number of selections by user for this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2061 +#: includes/admin/core/class-admin-metabox.php:2062 msgid "Minimum number of selections" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2061 +#: includes/admin/core/class-admin-metabox.php:2062 msgid "Enter a number here to force a minimum number of selections by user for this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2071 +#: includes/admin/core/class-admin-metabox.php:2072 msgid "Maximum number of entries" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2071 +#: includes/admin/core/class-admin-metabox.php:2072 msgid "This is the max number of entries the user can add via field group." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2081 +#: includes/admin/core/class-admin-metabox.php:2082 msgid "Maximum allowed words" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2081 +#: includes/admin/core/class-admin-metabox.php:2082 msgid "If you want to enable a maximum number of words to be input in this textarea. Leave empty to disable this setting" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2091 +#: includes/admin/core/class-admin-metabox.php:2092 msgid "Minimum Number" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2091 +#: includes/admin/core/class-admin-metabox.php:2092 msgid "Minimum number that can be entered in this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2101 +#: includes/admin/core/class-admin-metabox.php:2102 msgid "Maximum Number" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2101 +#: includes/admin/core/class-admin-metabox.php:2102 msgid "Maximum number that can be entered in this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2111 +#: includes/admin/core/class-admin-metabox.php:2112 msgid "Minimum length" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2111 +#: includes/admin/core/class-admin-metabox.php:2112 msgid "If you want to enable a minimum number of characters to be input in this field. Leave empty to disable this setting" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2121 +#: includes/admin/core/class-admin-metabox.php:2122 msgid "Maximum length" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2121 +#: includes/admin/core/class-admin-metabox.php:2122 msgid "If you want to enable a maximum number of characters to be input in this field. Leave empty to disable this setting" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2131 +#: includes/admin/core/class-admin-metabox.php:2132 msgid "Does this textarea accept HTML?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2131 +#: includes/admin/core/class-admin-metabox.php:2132 msgid "Turn on/off HTML tags for this textarea" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2148 +#: includes/admin/core/class-admin-metabox.php:2149 msgid "Edit Choices" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2148 +#: includes/admin/core/class-admin-metabox.php:2149 msgid "Enter one choice per line. This will represent the available choices or selections available for user." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2158 +#: includes/admin/core/class-admin-metabox.php:2159 msgid "This is the title of the field for your reference in the backend. The title will not appear on the front-end of your website." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2169 +#: includes/admin/core/class-admin-metabox.php:2170 msgid "Unique ID" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2183 -#: includes/admin/core/class-admin-metabox.php:2189 -msgid "Meta Key" -msgstr "" - -#: includes/admin/core/class-admin-metabox.php:2183 +#: includes/admin/core/class-admin-metabox.php:2184 msgid "The meta key cannot be changed for duplicated fields or when editing an existing field. If you require a different meta key please create a new field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2189 +#: includes/admin/core/class-admin-metabox.php:2190 msgid "A meta key is required to store the entered info in this field in the database. The meta key should be unique to this field and be written in lowercase with an underscore ( _ ) separating words e.g country_list or job_title" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2202 +#: includes/admin/core/class-admin-metabox.php:2203 msgid "Help Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2202 +#: includes/admin/core/class-admin-metabox.php:2203 msgid "This is the text that appears in a tooltip when a user hovers over the info icon. Help text is useful for providing users with more information about what they should enter in the field. Leave blank if no help text is needed for field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2214 +#: includes/admin/core/class-admin-metabox.php:2215 msgid "Default Text" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2214 +#: includes/admin/core/class-admin-metabox.php:2215 msgid "Text to display by default in this field" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2220 +#: includes/admin/core/class-admin-metabox.php:2221 msgid "Default Date" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2220 -#: includes/admin/core/class-admin-metabox.php:2226 +#: includes/admin/core/class-admin-metabox.php:2221 +#: includes/admin/core/class-admin-metabox.php:2227 msgid "You may use all PHP compatible date formats such as: 2020-02-02, 02/02/2020, yesterday, today, tomorrow, next monday, first day of next month, +3 day" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2226 +#: includes/admin/core/class-admin-metabox.php:2227 msgid "Default Time" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2232 +#: includes/admin/core/class-admin-metabox.php:2233 msgid "Default Rating" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2232 +#: includes/admin/core/class-admin-metabox.php:2233 msgid "If you wish the rating field to be prefilled with a number of stars, enter it here." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2238 +#: includes/admin/core/class-admin-metabox.php:2239 msgid "Default Value" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2238 +#: includes/admin/core/class-admin-metabox.php:2239 msgid "This option allows you to pre-fill the field with a default value prior to the user entering a value in the field. Leave blank to have no default value" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2250 +#: includes/admin/core/class-admin-metabox.php:2251 msgid "The field label is the text that appears above the field on your front-end form. Leave blank to not show a label above field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2260 +#: includes/admin/core/class-admin-metabox.php:2261 msgid "Placeholder" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2260 +#: includes/admin/core/class-admin-metabox.php:2261 msgid "This is the text that appears within the field e.g please enter your email address. Leave blank to not show any placeholder text." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2270 +#: includes/admin/core/class-admin-metabox.php:2271 #: includes/class-config.php:134 #: includes/class-config.php:794 msgid "Members" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2271 +#: includes/admin/core/class-admin-metabox.php:2272 msgid "Only visible to profile owner and admins" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2272 +#: includes/admin/core/class-admin-metabox.php:2273 msgid "Only visible to profile owner and specific roles" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2273 +#: includes/admin/core/class-admin-metabox.php:2274 msgid "Only specific member roles" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2279 +#: includes/admin/core/class-admin-metabox.php:2280 msgid "Field privacy allows you to select who can view this field on the front-end. The site admin can view all fields regardless of the option set here." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2302 +#: includes/admin/core/class-admin-metabox.php:2303 msgid "Select member roles" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2302 +#: includes/admin/core/class-admin-metabox.php:2303 msgid "Select the member roles that can view this field on the front-end." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2328 +#: includes/admin/core/class-admin-metabox.php:2329 msgid "Is this field required?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2328 +#: includes/admin/core/class-admin-metabox.php:2329 msgid "This option allows you to set whether the field must be filled in before the form can be processed." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2342 +#: includes/admin/core/class-admin-metabox.php:2343 msgid "Can user edit this field?" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2342 +#: includes/admin/core/class-admin-metabox.php:2343 msgid "This option allows you to set whether or not the user can edit the information in this field." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2355 +#: includes/admin/core/class-admin-metabox.php:2356 msgid "Rating System" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2355 +#: includes/admin/core/class-admin-metabox.php:2356 msgid "Choose whether you want a 5-stars or 10-stars ratings based here." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2357 +#: includes/admin/core/class-admin-metabox.php:2358 msgid "5 stars rating system" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2358 +#: includes/admin/core/class-admin-metabox.php:2359 msgid "10 stars rating system" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2368 +#: includes/admin/core/class-admin-metabox.php:2369 msgid "Choices Callback" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2368 +#: includes/admin/core/class-admin-metabox.php:2369 msgid "Add a callback source to retrieve choices." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2379 +#: includes/admin/core/class-admin-metabox.php:2380 msgid "Parent Option" msgstr "" -#: includes/admin/core/class-admin-metabox.php:2379 +#: includes/admin/core/class-admin-metabox.php:2380 msgid "Dynamically populates the option based from selected parent option." msgstr "" -#: includes/admin/core/class-admin-metabox.php:2381 +#: includes/admin/core/class-admin-metabox.php:2382 msgid "No Selected" msgstr "" @@ -2988,7 +2989,7 @@ msgid "UM Action" msgstr "" #: includes/admin/core/class-admin-users.php:163 -#: includes/core/class-fields.php:2675 +#: includes/core/class-fields.php:2685 msgid "Apply" msgstr "" @@ -3998,8 +3999,8 @@ msgstr "" #: includes/admin/templates/modal/fonticons.php:14 #: includes/admin/templates/role/publish.php:24 #: includes/class-config.php:254 -#: includes/core/class-fields.php:2676 -#: includes/core/class-fields.php:2775 +#: includes/core/class-fields.php:2686 +#: includes/core/class-fields.php:2785 #: includes/core/um-actions-profile.php:812 #: includes/core/um-actions-profile.php:824 #: includes/core/um-actions-profile.php:1012 @@ -6770,103 +6771,103 @@ msgstr "" #. translators: %s: The message after registration process based on a role data and user status after registration #. translators: %s: Restricted taxonomy message. -#: includes/core/class-fields.php:1342 +#: includes/core/class-fields.php:1348 #: includes/core/um-actions-account.php:436 #: templates/message.php:8 #: templates/restricted-taxonomy.php:47 msgid "%s" msgstr "" -#: includes/core/class-fields.php:1363 +#: includes/core/class-fields.php:1369 msgid "Custom Field" msgstr "" -#: includes/core/class-fields.php:1706 +#: includes/core/class-fields.php:1716 msgid "Please upload a valid image!" msgstr "" -#: includes/core/class-fields.php:1720 +#: includes/core/class-fields.php:1730 msgid "Sorry this is not a valid image." msgstr "" -#: includes/core/class-fields.php:1723 +#: includes/core/class-fields.php:1733 msgid "This image is too large!" msgstr "" -#: includes/core/class-fields.php:1726 +#: includes/core/class-fields.php:1736 msgid "This image is too small!" msgstr "" -#: includes/core/class-fields.php:1729 +#: includes/core/class-fields.php:1739 msgid "You can only upload one image" msgstr "" -#: includes/core/class-fields.php:1761 +#: includes/core/class-fields.php:1771 msgid "Sorry this is not a valid file." msgstr "" -#: includes/core/class-fields.php:1764 +#: includes/core/class-fields.php:1774 msgid "This file is too large!" msgstr "" -#: includes/core/class-fields.php:1767 +#: includes/core/class-fields.php:1777 msgid "This file is too small!" msgstr "" -#: includes/core/class-fields.php:1770 +#: includes/core/class-fields.php:1780 msgid "You can only upload one file" msgstr "" -#: includes/core/class-fields.php:2299 +#: includes/core/class-fields.php:2309 msgid "Current Password" msgstr "" -#: includes/core/class-fields.php:2330 +#: includes/core/class-fields.php:2340 msgid "New Password" msgstr "" -#: includes/core/class-fields.php:2372 -#: includes/core/class-fields.php:2388 +#: includes/core/class-fields.php:2382 +#: includes/core/class-fields.php:2398 msgid "Confirm %s" msgstr "" -#: includes/core/class-fields.php:2629 +#: includes/core/class-fields.php:2639 msgid "Upload Photo" msgstr "" -#: includes/core/class-fields.php:2651 -#: includes/core/class-fields.php:2675 +#: includes/core/class-fields.php:2661 +#: includes/core/class-fields.php:2685 #: includes/core/um-actions-profile.php:1043 msgid "Change photo" msgstr "" -#: includes/core/class-fields.php:2675 -#: includes/core/class-fields.php:2774 +#: includes/core/class-fields.php:2685 +#: includes/core/class-fields.php:2784 msgid "Processing..." msgstr "" -#: includes/core/class-fields.php:2699 +#: includes/core/class-fields.php:2709 msgid "Upload File" msgstr "" -#: includes/core/class-fields.php:2741 +#: includes/core/class-fields.php:2751 #: includes/core/um-filters-fields.php:267 msgid "This file has been removed." msgstr "" -#: includes/core/class-fields.php:2744 +#: includes/core/class-fields.php:2754 msgid "Change file" msgstr "" -#: includes/core/class-fields.php:2774 +#: includes/core/class-fields.php:2784 msgid "Save" msgstr "" -#: includes/core/class-fields.php:4314 +#: includes/core/class-fields.php:4334 msgid "Your profile is looking a little empty. Why not add some information!" msgstr "" -#: includes/core/class-fields.php:4316 +#: includes/core/class-fields.php:4336 msgid "This user has not added any information to their profile yet." msgstr "" @@ -6921,7 +6922,7 @@ msgstr "" #: includes/core/class-mail.php:615 #: includes/core/class-password.php:703 -#: includes/core/class-profile.php:481 +#: includes/core/class-profile.php:484 msgid "Your set password" msgstr "" @@ -7026,7 +7027,7 @@ msgstr "" #: includes/core/class-password.php:553 #: includes/core/um-actions-account.php:83 -#: includes/core/um-actions-form.php:559 +#: includes/core/um-actions-form.php:567 msgid "Your password must contain at least one lowercase letter, one capital letter and one number" msgstr "" @@ -7035,7 +7036,7 @@ msgid "You must confirm your new password" msgstr "" #: includes/core/class-password.php:563 -#: includes/core/um-actions-form.php:568 +#: includes/core/um-actions-form.php:576 msgid "Your passwords do not match" msgstr "" @@ -7377,118 +7378,126 @@ msgstr "" msgid "You are only allowed to enter a maximum of %s words" msgstr "" -#: includes/core/um-actions-form.php:539 +#: includes/core/um-actions-form.php:540 +msgid "This field must contain at least %s characters" +msgstr "" + +#: includes/core/um-actions-form.php:542 msgid "Your %s must contain at least %s characters" msgstr "" -#: includes/core/um-actions-form.php:545 -msgid "Your %s must contain less than %s characters" +#: includes/core/um-actions-form.php:550 +msgid "This field must contain less than %s characters" msgstr "" #: includes/core/um-actions-form.php:552 +msgid "Your %s must contain less than %s characters" +msgstr "" + +#: includes/core/um-actions-form.php:560 msgid "You can not use HTML tags here" msgstr "" -#: includes/core/um-actions-form.php:565 +#: includes/core/um-actions-form.php:573 msgid "Please confirm your password" msgstr "" -#: includes/core/um-actions-form.php:574 +#: includes/core/um-actions-form.php:582 msgid "Please select at least %s choices" msgstr "" -#: includes/core/um-actions-form.php:580 +#: includes/core/um-actions-form.php:588 msgid "You can only select up to %s choices" msgstr "" -#: includes/core/um-actions-form.php:586 +#: includes/core/um-actions-form.php:594 msgid "Minimum number limit is %s" msgstr "" -#: includes/core/um-actions-form.php:592 +#: includes/core/um-actions-form.php:600 msgid "Maximum number limit is %s" msgstr "" -#: includes/core/um-actions-form.php:628 +#: includes/core/um-actions-form.php:636 msgid "Please enter numbers only in this field" msgstr "" -#: includes/core/um-actions-form.php:634 +#: includes/core/um-actions-form.php:642 msgid "Please enter a valid phone number" msgstr "" -#: includes/core/um-actions-form.php:640 -#: includes/core/um-actions-form.php:646 -#: includes/core/um-actions-form.php:652 -#: includes/core/um-actions-form.php:658 -#: includes/core/um-actions-form.php:671 -#: includes/core/um-actions-form.php:677 -#: includes/core/um-actions-form.php:683 +#: includes/core/um-actions-form.php:648 +#: includes/core/um-actions-form.php:654 +#: includes/core/um-actions-form.php:660 +#: includes/core/um-actions-form.php:666 +#: includes/core/um-actions-form.php:679 +#: includes/core/um-actions-form.php:685 +#: includes/core/um-actions-form.php:691 msgid "Please enter a valid %s username or profile URL" msgstr "" -#: includes/core/um-actions-form.php:665 +#: includes/core/um-actions-form.php:673 msgid "Please enter a valid %s profile URL" msgstr "" -#: includes/core/um-actions-form.php:689 +#: includes/core/um-actions-form.php:697 msgid "Please enter a valid URL" msgstr "" -#: includes/core/um-actions-form.php:696 -#: includes/core/um-actions-form.php:710 +#: includes/core/um-actions-form.php:704 +#: includes/core/um-actions-form.php:718 msgid "You must provide a username" msgstr "" -#: includes/core/um-actions-form.php:698 -#: includes/core/um-actions-form.php:712 +#: includes/core/um-actions-form.php:706 +#: includes/core/um-actions-form.php:720 msgid "Your username is already taken" msgstr "" -#: includes/core/um-actions-form.php:700 +#: includes/core/um-actions-form.php:708 msgid "Username cannot be an email" msgstr "" -#: includes/core/um-actions-form.php:702 -#: includes/core/um-actions-form.php:716 +#: includes/core/um-actions-form.php:710 +#: includes/core/um-actions-form.php:724 msgid "Your username contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:714 -#: includes/core/um-actions-form.php:736 -#: includes/core/um-actions-form.php:738 -#: includes/core/um-actions-form.php:750 -#: includes/core/um-actions-form.php:757 +#: includes/core/um-actions-form.php:722 +#: includes/core/um-actions-form.php:744 +#: includes/core/um-actions-form.php:746 +#: includes/core/um-actions-form.php:758 +#: includes/core/um-actions-form.php:765 msgid "This email is already linked to an existing account" msgstr "" -#: includes/core/um-actions-form.php:734 +#: includes/core/um-actions-form.php:742 msgid "You must provide your email" msgstr "" -#: includes/core/um-actions-form.php:740 #: includes/core/um-actions-form.php:748 -#: includes/core/um-actions-form.php:772 +#: includes/core/um-actions-form.php:756 +#: includes/core/um-actions-form.php:780 msgid "This is not a valid email" msgstr "" -#: includes/core/um-actions-form.php:742 +#: includes/core/um-actions-form.php:750 msgid "Your email contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:791 +#: includes/core/um-actions-form.php:799 msgid "You must provide a unique value" msgstr "" -#: includes/core/um-actions-form.php:801 +#: includes/core/um-actions-form.php:809 msgid "You must provide alphabetic letters" msgstr "" -#: includes/core/um-actions-form.php:813 +#: includes/core/um-actions-form.php:821 msgid "You must provide lowercase letters." msgstr "" -#: includes/core/um-actions-form.php:831 +#: includes/core/um-actions-form.php:839 msgid "Your user description must contain less than %s characters" msgstr "" From 16bdc0cf9c4e5cb912471ee19cbebda72cc1d108 Mon Sep 17 00:00:00 2001 From: Champ Camba Date: Mon, 22 Feb 2021 12:45:45 +0800 Subject: [PATCH 15/31] Fix admin user filters links in Dashboard > Users --- includes/admin/templates/dashboard/users.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/includes/admin/templates/dashboard/users.php b/includes/admin/templates/dashboard/users.php index 0a092780..68e42ab5 100644 --- a/includes/admin/templates/dashboard/users.php +++ b/includes/admin/templates/dashboard/users.php @@ -19,12 +19,12 @@ - + query()->count_users_by_status( 'approved' ); ?> - + @@ -32,12 +32,12 @@ - + query()->count_users_by_status( 'rejected' ); ?> - + @@ -51,12 +51,12 @@ @@ -64,12 +64,12 @@ @@ -77,12 +77,12 @@ From 9505d225020511c395a071513f4bcbeb03370161 Mon Sep 17 00:00:00 2001 From: andrewshuba Date: Tue, 23 Feb 2021 14:41:21 +0200 Subject: [PATCH 16/31] - add mycred meta data to a user meta table --- includes/admin/core/class-admin-settings.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 53a8e21e..d97c575f 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -127,6 +127,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $metakeys[] = '_completed'; $metakeys[] = '_reviews_avg'; + //myCred meta + if ( function_exists( 'mycred_get_types' ) ) { + $mycred_types = mycred_get_types(); + if ( ! empty( $mycred_types ) ) { + foreach ( array_keys( $mycred_types ) as $point_type ) { + $metakeys[] = $point_type; + } + } + } + $sortby_custom_keys = $wpdb->get_col( "SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key='_um_sortby_custom'" ); if ( empty( $sortby_custom_keys ) ) { $sortby_custom_keys = array(); From 781a0fd16f7249bcfb25e1b22625587961d9803a Mon Sep 17 00:00:00 2001 From: yuriinalivaiko Date: Tue, 23 Feb 2021 19:01:30 +0200 Subject: [PATCH 17/31] Allow users who has capability 'edit_users' to approve a user or change a user status --- includes/core/um-actions-core.php | 13 ++++++++----- includes/core/um-filters-user.php | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/includes/core/um-actions-core.php b/includes/core/um-actions-core.php index 65b2e0cd..1e69aad3 100644 --- a/includes/core/um-actions-core.php +++ b/includes/core/um-actions-core.php @@ -37,6 +37,9 @@ function um_action_request_process() { $uid = absint( $_REQUEST['uid'] ); } + $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) ); + $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); + switch ( $_REQUEST['um_action'] ) { default: /** @@ -85,7 +88,7 @@ function um_action_request_process() { break; case 'um_reject_membership': - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! $can_edit_users ) { wp_die( __( 'You do not have permission to make this action.', 'ultimate-member' ) ); } @@ -96,7 +99,7 @@ function um_action_request_process() { case 'um_approve_membership': case 'um_reenable': - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! $can_edit_users ) { wp_die( __( 'You do not have permission to make this action.', 'ultimate-member' ) ); } @@ -109,7 +112,7 @@ function um_action_request_process() { break; case 'um_put_as_pending': - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! $can_edit_users ) { wp_die( __( 'You do not have permission to make this action.', 'ultimate-member' ) ); } @@ -119,7 +122,7 @@ function um_action_request_process() { break; case 'um_resend_activation': - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! $can_edit_users ) { wp_die( __( 'You do not have permission to make this action.', 'ultimate-member' ) ); } @@ -132,7 +135,7 @@ function um_action_request_process() { break; case 'um_deactivate': - if ( ! current_user_can( 'manage_options' ) ) { + if ( ! $can_edit_users ) { wp_die( __( 'You do not have permission to make this action.', 'ultimate-member' ) ); } diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 317bb68c..30bd3246 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -13,7 +13,7 @@ function um_admin_user_actions_hook( $actions, $user_id ) { um_fetch_user( $user_id ); //if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) ) { - if ( current_user_can( 'manage_options' ) ) { + if ( current_user_can( 'edit_users' ) ) { if ( um_user( 'account_status' ) == 'awaiting_admin_review' ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); From fc668b2744b8f62e92fffbe4f94340505fbfd65d Mon Sep 17 00:00:00 2001 From: yuriinalivaiko Date: Wed, 24 Feb 2021 15:51:52 +0200 Subject: [PATCH 18/31] Send an email when the password is changed --- includes/core/class-password.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/includes/core/class-password.php b/includes/core/class-password.php index 6a0fc7d1..e31c55ff 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -618,8 +618,15 @@ if ( ! class_exists( 'um\core\Password' ) ) { if ( ( ! $errors->get_error_code() ) ) { reset_password( $user, $args['user_password'] ); - delete_user_meta( $args['user_id'], 'password_rst_attempts' ); + + // send the Password Changed Email + UM()->user()->password_changed(); + + // clear temporary data + update_user_meta( $user->ID, 'password_rst_attempts', 0 ); $this->setcookie( $rp_cookie, false ); + + // logout if ( is_user_logged_in() ) { wp_logout(); } From 2e1c892058254fc5a54b12e35a54c540d255a79a Mon Sep 17 00:00:00 2001 From: andrewshuba Date: Thu, 25 Feb 2021 15:03:03 +0200 Subject: [PATCH 19/31] - fix min and max values in a slider range --- includes/core/class-member-directory.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index c715b303..57943b7e 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -799,8 +799,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { default: { $meta = $wpdb->get_row( $wpdb->prepare( - "SELECT MIN( meta_value ) as min_meta, - MAX( meta_value ) as max_meta, + "SELECT MIN( CONVERT( meta_value, DECIMAL ) ) as min_meta, + MAX( CONVERT( meta_value, DECIMAL ) ) as max_meta, COUNT( DISTINCT meta_value ) as amount FROM {$wpdb->usermeta} WHERE meta_key = %s", From 5740bc637db26821d3a228b20b0aec86d46bcc21 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 13:13:44 +0200 Subject: [PATCH 20/31] - fixed: PHP notices and warnings - fixed: security vulnerability with User Account page and password field --- includes/core/class-external-integrations.php | 2 +- includes/core/class-fields.php | 3 +++ includes/core/um-actions-account.php | 4 ++++ includes/core/um-filters-fields.php | 13 +++++++++++++ includes/um-short-functions.php | 12 +++++++++--- readme.txt | 4 +++- ultimate-member.php | 2 +- 7 files changed, 34 insertions(+), 6 deletions(-) diff --git a/includes/core/class-external-integrations.php b/includes/core/class-external-integrations.php index 262f970b..db6c1698 100644 --- a/includes/core/class-external-integrations.php +++ b/includes/core/class-external-integrations.php @@ -146,7 +146,7 @@ if ( ! class_exists( 'um\core\External_Integrations' ) ) { */ function forumwp_fix() { if ( function_exists( 'FMWP' ) ) { - remove_filter( 'single_template', array( FMWP()->shortcodes(), 'cpt_template' ) ); + remove_filter( 'single_template', array( FMWP()->frontend()->shortcodes(), 'cpt_template' ) ); } } diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 9a9970e0..befe7ea3 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -3741,11 +3741,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $sort_col = array(); foreach ( $arr as $key => $row ) { if ( $key == 'form_id' ) { + unset( $arr['form_id'] ); continue; } if ( isset( $row[ $col ] ) ) { $sort_col[ $key ] = $row[ $col ]; + } else { + unset( $arr[ $key ] ); } } diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index d445515d..7a5f4c1f 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -276,6 +276,10 @@ function um_submit_account_details( $args ) { continue; } + if ( $k == 'single_user_password' ) { + continue; + } + $changes[ $k ] = $v; } diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 23163dfb..efa19b20 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -441,7 +441,20 @@ function um_get_custom_field_array( $array, $fields ) { if ( ! empty( $array['conditions'] ) ) { foreach ( $array['conditions'] as $key => $value ) { + if ( ! isset( $value[1] ) ) { + continue; + } + + if ( empty( $fields[ $value[1] ] ) ) { + continue; + } + + if ( empty( $fields[ $value[1] ]['metakey'] ) ) { + continue; + } + $condition_metakey = $fields[ $value[1] ]['metakey']; + if ( isset( $_POST[ $condition_metakey ] ) ) { $cond_value = ( $fields[ $value[1] ]['type'] == 'radio' ) ? $_POST[ $condition_metakey ][0] : $_POST[ $condition_metakey ]; list( $visibility, $parent_key, $op, $parent_value ) = $value; diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 2b2bff36..67c4c4f3 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -1555,8 +1555,14 @@ function um_can_view_field( $data ) { if ( ! is_user_logged_in() ) { $can_view = false; } else { - if ( ! um_is_user_himself() && ( empty( $current_user_roles ) || ( ! empty( $data['roles'] ) && count( array_intersect( $current_user_roles, $data['roles'] ) ) <= 0 ) ) ) { - $can_view = false; + if ( ! um_is_core_page( 'profile' ) ) { + if ( empty( $current_user_roles ) || ( ! empty( $data['roles'] ) && count( array_intersect( $current_user_roles, $data['roles'] ) ) <= 0 ) ) { + $can_view = false; + } + } else { + if ( ! um_is_user_himself() && ( empty( $current_user_roles ) || ( ! empty( $data['roles'] ) && count( array_intersect( $current_user_roles, $data['roles'] ) ) <= 0 ) ) ) { + $can_view = false; + } } } break; @@ -1885,7 +1891,7 @@ function um_youtube_id_from_url( $url ) { ([\w-]{10,12}) # Allow 10-12 for 11 char youtube id. $%x'; $result = preg_match( $pattern, $url, $matches ); - if (false !== $result) { + if ( false !== $result && isset( $matches[1] ) ) { return $matches[1]; } diff --git a/readme.txt b/readme.txt index 7f08d3f5..c9d00e94 100644 --- a/readme.txt +++ b/readme.txt @@ -155,9 +155,11 @@ The plugin works with popular caching plugins by automatically excluding Ultimat * To learn more about version 2.1 please see this [docs](https://docs.ultimatemember.com/article/1512-upgrade-2-1-0) * UM2.1+ is a significant update to the Member Directories' code base from 2.0.x. Please make sure you take a full-site backup with restore point before updating the plugin -= 2.1.16: March xx, 2021 = += 2.1.16: March 9, 2021 = * Bugfixes: + - Fixed PHP notices and warnings + - Fixed security vulnerability with User Account page and password field - Fixed user creating without username but based on first+last name with not-ASCII symbols = 2.1.15: December 24, 2020 = diff --git a/ultimate-member.php b/ultimate-member.php index 1e2d9c31..ec522c41 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ Plugin Name: Ultimate Member Plugin URI: http://ultimatemember.com/ Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress -Version: 2.1.16-alpha1 +Version: 2.1.16-beta1 Author: Ultimate Member Author URI: http://ultimatemember.com/ Text Domain: ultimate-member From 7f7dae9979526637a9a664330428bce9087f8dab Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 15:21:18 +0200 Subject: [PATCH 21/31] - reviewed No Index functionality; --- includes/admin/core/class-admin-settings.php | 6 ++-- includes/admin/templates/role/profile.php | 8 +++--- includes/class-config.php | 3 +- includes/core/class-user.php | 30 ++++++++++---------- includes/core/um-actions-profile.php | 4 +-- includes/core/um-filters-account.php | 2 +- includes/core/um-filters-profile.php | 10 ++----- readme.txt | 11 ++++--- 8 files changed, 36 insertions(+), 38 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 34c27484..d053da94 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -636,10 +636,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'type' => 'select', 'size' => 'small', 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'tooltip' => __( 'Hides the profile page for robots.', 'ultimate-member' ) . ' ' . __( 'This setting can be overridden by individual role settings.', 'ultimate-member' ), + 'tooltip' => __( 'Hides the profile page for robots. This setting can be overridden by individual role settings.', 'ultimate-member' ), 'options' => [ - '1' => __( 'Yes', 'ultimate-member' ), - '' => __( 'No', 'ultimate-member' ) + '0' => __( 'No', 'ultimate-member' ), + '1' => __( 'Yes', 'ultimate-member' ), ] ) ) diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index 0b19c247..02aa0ae8 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -47,11 +47,11 @@ 'size' => 'medium', 'name' => '_um_profile_noindex', 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'tooltip' => __( 'Hides the profile page for robots.', 'ultimate-member' ) . ' ' . __( 'The default value depends on the general users settings.', 'ultimate-member' ), + 'tooltip' => __( 'Hides the profile page for robots. The default value depends on the General > Users setting.', 'ultimate-member' ), 'options' => [ - '' => __( 'Default', 'ultimate-member' ), - '1' => __( 'Yes', 'ultimate-member' ), - '2' => __( 'No', 'ultimate-member' ) + '' => __( 'Default', 'ultimate-member' ), + '0' => __( 'No', 'ultimate-member' ), + '1' => __( 'Yes', 'ultimate-member' ), ], 'value' => ! empty( $role['_um_profile_noindex'] ) ? $role['_um_profile_noindex'] : '', ) diff --git a/includes/class-config.php b/includes/class-config.php index 1fa9b2cb..1f25edcc 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -574,8 +574,9 @@ if ( ! class_exists( 'um\Config' ) ) { 'custom_roles_increment' => 1, 'um_profile_object_cache_stop' => 0, 'rest_api_version' => '2.0', - 'member_directory_own_table' => 0, + 'member_directory_own_table' => 0, 'profile_show_html_bio' => 0, + 'profile_noindex' => 0, ); add_filter( 'um_get_tabs_from_config', '__return_true' ); diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 30254a7f..dc44b886 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1689,46 +1689,46 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * This method checks if the profile indexing is disabled * - * @since 2.1.14 [2020-12-22] - * @usage user()->is_profile_noindex(); ?> + * @param int $user_id + * + * @since 2.1.16 + * @usage user()->is_profile_noindex( $user_id ); ?> * * @return boolean Is the profile indexing disabled? */ - function is_profile_noindex(){ - $user_id = $this->id; - + function is_profile_noindex( $user_id ) { $profile_noindex = false; - - if ( !get_option( 'blog_public' ) ){ + + if ( ! get_option( 'blog_public' ) ) { // Option "Search engine visibility" in [wp-admin > Settings > Reading] $profile_noindex = true; - } elseif ( $this->is_private_profile( $user_id ) ){ + } elseif ( $this->is_private_profile( $user_id ) ) { // Setting "Profile Privacy" in [Account > Privacy] $profile_noindex = true; - } elseif ( get_user_meta( $user_id, 'profile_noindex', true ) === '1' ){ + } elseif ( get_user_meta( $user_id, 'profile_noindex', true ) === '1' ) { // Setting "Avoid indexing my profile by search engines in [Account > Privacy] $profile_noindex = true; - + } - - if( ! $profile_noindex ){ + + if ( ! $profile_noindex ) { $role = UM()->roles()->get_priority_user_role( $user_id ); $permissions = UM()->roles()->role_data( $role ); - + if ( isset( $permissions['profile_noindex'] ) && $permissions['profile_noindex'] === '1' ) { // Setting "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > User Roles > Edit Role] $profile_noindex = true; - } elseif ( empty( $permissions['profile_noindex'] ) && UM()->options()->get( 'profile_noindex' ) === '1' ){ + } elseif ( $permissions['profile_noindex'] === '' && UM()->options()->get( 'profile_noindex' ) === '1' ) { // Setting "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > Settings > General > Users] $profile_noindex = true; } } - return apply_filters( 'um_user_is_profile_noindex', $profile_noindex, $this ); + return apply_filters( 'um_user_is_profile_noindex', $profile_noindex, $user_id, $this ); } diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 900b3de3..19afb128 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -680,7 +680,7 @@ function um_profile_dynamic_meta_desc() { $user_id = um_get_requested_user(); - if( $user_id !== um_user('ID') ){ + if ( $user_id !== um_user('ID') ) { um_fetch_user( $user_id ); } @@ -692,7 +692,7 @@ function um_profile_dynamic_meta_desc() { * "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > User Roles > Edit Role] * "Avoid indexing profile by search engines" in [wp-admin > Ultimate Member > Settings > General > Users] */ - if ( UM()->user()->is_profile_noindex() ) { + if ( UM()->user()->is_profile_noindex( $user_id ) ) { echo ''; return; } diff --git a/includes/core/um-filters-account.php b/includes/core/um-filters-account.php index 7b963c3a..d7c6613b 100644 --- a/includes/core/um-filters-account.php +++ b/includes/core/um-filters-account.php @@ -48,7 +48,7 @@ add_filter( 'um_account_pre_updating_profile_array', 'um_account_sanitize_data', /** * Fix for the account field "Avoid indexing my profile by search engines" - * @since 2.1.14 [2020-12-15] + * @since 2.1.16 * @param bool $value * @return int */ diff --git a/includes/core/um-filters-profile.php b/includes/core/um-filters-profile.php index dc3969a4..be4395b3 100644 --- a/includes/core/um-filters-profile.php +++ b/includes/core/um-filters-profile.php @@ -12,21 +12,15 @@ */ function um_dynamic_user_profile_pagetitle( $title, $sep = '' ) { - $profile_title = UM()->options()->get( 'profile_title' ); - if ( um_is_core_page( 'user' ) && um_get_requested_user() ) { $user_id = um_get_requested_user(); - $privacy = get_user_meta( $user_id, 'profile_privacy', true ); - if ( $privacy == __( 'Only me', 'ultimate-member' ) || $privacy == 'Only me' ) { + if ( UM()->user()->is_profile_noindex( $user_id ) ) { return $title; } - $noindex = get_user_meta( $user_id, 'profile_noindex', true ); - if ( ! empty( $noindex ) ) { - return $title; - } + $profile_title = UM()->options()->get( 'profile_title' ); um_fetch_user( um_get_requested_user() ); diff --git a/readme.txt b/readme.txt index c9d00e94..f26a6ca5 100644 --- a/readme.txt +++ b/readme.txt @@ -157,15 +157,18 @@ The plugin works with popular caching plugins by automatically excluding Ultimat = 2.1.16: March 9, 2021 = +* Enhancements: + - Added: General and role setting to avoid indexing users' profiles + * Bugfixes: - - Fixed PHP notices and warnings - - Fixed security vulnerability with User Account page and password field - - Fixed user creating without username but based on first+last name with not-ASCII symbols + - Fixed: PHP notices and warnings + - Fixed: Security vulnerability with User Account page and password field + - Fixed: User creating without username but based on first+last name with not-ASCII symbols = 2.1.15: December 24, 2020 = * Bugfixes: - - Fixed conditional logic for the form fields without metakeys + - Fixed: Conditional logic for the form fields without metakeys = 2.1.14: December 22, 2020 = From d5912a573b14514cc32d77485d6f88ad39e63090 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 15:30:59 +0200 Subject: [PATCH 22/31] - changed readme; --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index f26a6ca5..4f71b99d 100644 --- a/readme.txt +++ b/readme.txt @@ -161,6 +161,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Added: General and role setting to avoid indexing users' profiles * Bugfixes: + - Fixed: Member Directory slider filter with NaN range - Fixed: PHP notices and warnings - Fixed: Security vulnerability with User Account page and password field - Fixed: User creating without username but based on first+last name with not-ASCII symbols From 00d30311deaaebfe836e39f142b229b6a85e0288 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 16:07:20 +0200 Subject: [PATCH 23/31] - changed readme; --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index 4f71b99d..4635a720 100644 --- a/readme.txt +++ b/readme.txt @@ -161,6 +161,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Added: General and role setting to avoid indexing users' profiles * Bugfixes: + - Fixed: Empty icons are shown in the popup "Choose from... available icons" - Fixed: Member Directory slider filter with NaN range - Fixed: PHP notices and warnings - Fixed: Security vulnerability with User Account page and password field From 98e266dc18204f6bc7bb69f5b48b12ceda9b2ce8 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 16:43:57 +0200 Subject: [PATCH 24/31] - updated readme; --- includes/core/class-member-directory-meta.php | 4 ++-- includes/core/class-member-directory.php | 2 +- readme.txt | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index bcddc2ad..87211a39 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -836,9 +836,9 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { ); $query = array( - 'select' => $this->select, + 'select' => $this->select, 'sql_where' => $sql_where, - 'having' => $this->having, + 'having' => $this->having, 'sql_limit' => $this->sql_limit, ); diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 56f981ab..9c4616b7 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -2528,7 +2528,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * } * ?> */ - $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids, $this->query_args ); + $user_ids = apply_filters( 'um_prepare_user_results_array', $user_ids, $this->query_args ); $sizes = UM()->options()->get( 'cover_thumb_sizes' ); diff --git a/readme.txt b/readme.txt index 4635a720..288c6c70 100644 --- a/readme.txt +++ b/readme.txt @@ -159,6 +159,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat * Enhancements: - Added: General and role setting to avoid indexing users' profiles + - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query * Bugfixes: - Fixed: Empty icons are shown in the popup "Choose from... available icons" From b58bcd46119456a05c266f8b7e38d28d65e91e5a Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 16:51:29 +0200 Subject: [PATCH 25/31] - updated readme; --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index 288c6c70..3141ab6f 100644 --- a/readme.txt +++ b/readme.txt @@ -162,6 +162,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query * Bugfixes: + - Fixed: Using myCRED points metakeys in UM usermeta table - Fixed: Empty icons are shown in the popup "Choose from... available icons" - Fixed: Member Directory slider filter with NaN range - Fixed: PHP notices and warnings From e8347fb45fa066ea6a1de991766208d0b26c3034 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 17:17:54 +0200 Subject: [PATCH 26/31] - fixed slider's range; --- includes/core/class-member-directory.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 53b886ce..b982f2f9 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -712,7 +712,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { -
+
borndate( strtotime( $meta['max_meta'] ) ), $this->borndate( strtotime( $meta['min_meta'] ) ) ); From 04933e576d244384fdbe23d28306ea7afbe086f3 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 17:42:25 +0200 Subject: [PATCH 27/31] - code review; --- includes/core/um-actions-core.php | 2 +- includes/core/um-filters-user.php | 8 +++++--- readme.txt | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/includes/core/um-actions-core.php b/includes/core/um-actions-core.php index 1e69aad3..b1a2624b 100644 --- a/includes/core/um-actions-core.php +++ b/includes/core/um-actions-core.php @@ -80,7 +80,7 @@ function um_action_request_process() { break; case 'um_switch_user': - if ( ! current_user_can( 'delete_users' ) ) { + if ( ! current_user_can( 'manage_options' ) ) { return; } UM()->user()->auto_login( $uid ); diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 30bd3246..d4e9eb1f 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -12,8 +12,10 @@ function um_admin_user_actions_hook( $actions, $user_id ) { um_fetch_user( $user_id ); - //if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) ) { - if ( current_user_can( 'edit_users' ) ) { + $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) ); + $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); + + if ( $can_edit_users ) { if ( um_user( 'account_status' ) == 'awaiting_admin_review' ) { $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); @@ -46,7 +48,7 @@ function um_admin_user_actions_hook( $actions, $user_id ) { $actions['um_delete'] = array( 'label' => __( 'Delete this user', 'ultimate-member' ) ); } - if ( current_user_can( 'delete_users' ) ) { + if ( current_user_can( 'manage_options' ) ) { $actions['um_switch_user'] = array( 'label' => __( 'Login as this user', 'ultimate-member' ) ); } diff --git a/readme.txt b/readme.txt index 3141ab6f..f00cf594 100644 --- a/readme.txt +++ b/readme.txt @@ -162,9 +162,11 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query * Bugfixes: + - Fixed: Using 'edit_users' capability instead of 'manage_options' for approve|reject membership + - Fixed: Using 'manage_options' capability instead of 'delete_users' for switching between members - Fixed: Using myCRED points metakeys in UM usermeta table - Fixed: Empty icons are shown in the popup "Choose from... available icons" - - Fixed: Member Directory slider filter with NaN range + - Fixed: Member Directory slider filter with NaN or decimal range - Fixed: PHP notices and warnings - Fixed: Security vulnerability with User Account page and password field - Fixed: User creating without username but based on first+last name with not-ASCII symbols From 6e0a711f4b1e0589fa07bc77d7dfecc13d579a7a Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Wed, 3 Mar 2021 17:55:12 +0200 Subject: [PATCH 28/31] - code review; --- includes/core/class-password.php | 5 ++++- includes/core/um-actions-login.php | 7 ++++++- readme.txt | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/includes/core/class-password.php b/includes/core/class-password.php index e31c55ff..ee589274 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -623,7 +623,10 @@ if ( ! class_exists( 'um\core\Password' ) ) { UM()->user()->password_changed(); // clear temporary data - update_user_meta( $user->ID, 'password_rst_attempts', 0 ); + $attempts = (int) get_user_meta( $user->ID, 'password_rst_attempts', true ); + if ( $attempts ) { + update_user_meta( $user->ID, 'password_rst_attempts', 0 ); + } $this->setcookie( $rp_cookie, false ); // logout diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php index d9eecf51..6de065fb 100644 --- a/includes/core/um-actions-login.php +++ b/includes/core/um-actions-login.php @@ -165,7 +165,12 @@ add_action( 'um_on_login_before_redirect', 'um_store_lastlogin_timestamp', 10, 1 function um_store_lastlogin_timestamp_( $login ) { $user = get_user_by( 'login', $login ); um_store_lastlogin_timestamp( $user->ID ); - delete_user_meta( $user->ID, 'password_rst_attempts' ); + + $attempts = (int) get_user_meta( $user->ID, 'password_rst_attempts', true ); + if ( $attempts ) { + //don't create meta but update if it's exists only + update_user_meta( $user->ID, 'password_rst_attempts', 0 ); + } } add_action( 'wp_login', 'um_store_lastlogin_timestamp_' ); diff --git a/readme.txt b/readme.txt index f00cf594..885b913c 100644 --- a/readme.txt +++ b/readme.txt @@ -160,8 +160,10 @@ The plugin works with popular caching plugins by automatically excluding Ultimat * Enhancements: - Added: General and role setting to avoid indexing users' profiles - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query + - Added: Change password email when password has been reset * Bugfixes: + - Fixed: Creating and removing usermeta data with `password_rst_attempts` key, just update if exists for now - Fixed: Using 'edit_users' capability instead of 'manage_options' for approve|reject membership - Fixed: Using 'manage_options' capability instead of 'delete_users' for switching between members - Fixed: Using myCRED points metakeys in UM usermeta table From 77e43cbcaece389602a20ea3a7b3f442af045ae3 Mon Sep 17 00:00:00 2001 From: nikitasinelnikov Date: Thu, 4 Mar 2021 16:23:29 +0200 Subject: [PATCH 29/31] - updated select2 library; --- assets/css/select2/select2.min.css | 1 - assets/js/select2/i18n/af.js | 2 +- assets/js/select2/i18n/ar.js | 2 +- assets/js/select2/i18n/az.js | 2 +- assets/js/select2/i18n/bg.js | 2 +- assets/js/select2/i18n/bn.js | 2 +- assets/js/select2/i18n/bs.js | 2 +- assets/js/select2/i18n/ca.js | 2 +- assets/js/select2/i18n/cs.js | 2 +- assets/js/select2/i18n/da.js | 2 +- assets/js/select2/i18n/de.js | 2 +- assets/js/select2/i18n/dsb.js | 2 +- assets/js/select2/i18n/el.js | 2 +- assets/js/select2/i18n/en.js | 2 +- assets/js/select2/i18n/es.js | 2 +- assets/js/select2/i18n/et.js | 2 +- assets/js/select2/i18n/eu.js | 2 +- assets/js/select2/i18n/fa.js | 2 +- assets/js/select2/i18n/fi.js | 2 +- assets/js/select2/i18n/fr.js | 2 +- assets/js/select2/i18n/gl.js | 2 +- assets/js/select2/i18n/he.js | 2 +- assets/js/select2/i18n/hi.js | 2 +- assets/js/select2/i18n/hr.js | 2 +- assets/js/select2/i18n/hsb.js | 2 +- assets/js/select2/i18n/hu.js | 2 +- assets/js/select2/i18n/hy.js | 2 +- assets/js/select2/i18n/id.js | 2 +- assets/js/select2/i18n/is.js | 2 +- assets/js/select2/i18n/it.js | 2 +- assets/js/select2/i18n/ja.js | 2 +- assets/js/select2/i18n/ka.js | 2 +- assets/js/select2/i18n/km.js | 2 +- assets/js/select2/i18n/ko.js | 2 +- assets/js/select2/i18n/lt.js | 2 +- assets/js/select2/i18n/lv.js | 2 +- assets/js/select2/i18n/mk.js | 2 +- assets/js/select2/i18n/ms.js | 2 +- assets/js/select2/i18n/nb.js | 2 +- assets/js/select2/i18n/ne.js | 2 +- assets/js/select2/i18n/nl.js | 2 +- assets/js/select2/i18n/pl.js | 2 +- assets/js/select2/i18n/ps.js | 2 +- assets/js/select2/i18n/pt-BR.js | 2 +- assets/js/select2/i18n/pt.js | 2 +- assets/js/select2/i18n/ro.js | 2 +- assets/js/select2/i18n/ru.js | 2 +- assets/js/select2/i18n/sk.js | 2 +- assets/js/select2/i18n/sl.js | 2 +- assets/js/select2/i18n/sq.js | 2 +- assets/js/select2/i18n/sr-Cyrl.js | 2 +- assets/js/select2/i18n/sr.js | 2 +- assets/js/select2/i18n/sv.js | 2 +- assets/js/select2/i18n/th.js | 2 +- assets/js/select2/i18n/tk.js | 2 +- assets/js/select2/i18n/tr.js | 2 +- assets/js/select2/i18n/uk.js | 2 +- assets/js/select2/i18n/vi.js | 2 +- assets/js/select2/i18n/zh-CN.js | 2 +- assets/js/select2/i18n/zh-TW.js | 2 +- assets/js/select2/select2.full.js | 6820 +++++++++++++++++++ assets/js/select2/select2.full.min.js | 4 +- includes/admin/core/class-admin-enqueue.php | 4 +- includes/core/class-enqueue.php | 2 +- 64 files changed, 6884 insertions(+), 65 deletions(-) delete mode 100644 assets/css/select2/select2.min.css create mode 100644 assets/js/select2/select2.full.js diff --git a/assets/css/select2/select2.min.css b/assets/css/select2/select2.min.css deleted file mode 100644 index 7c18ad59..00000000 --- a/assets/css/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.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/assets/js/select2/i18n/af.js b/assets/js/select2/i18n/af.js index 60a2ef32..32e5ac7d 100644 --- a/assets/js/select2/i18n/af.js +++ b/assets/js/select2/i18n/af.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ar.js b/assets/js/select2/i18n/ar.js index 5866da06..64e1caad 100644 --- a/assets/js/select2/i18n/ar.js +++ b/assets/js/select2/i18n/ar.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/az.js b/assets/js/select2/i18n/az.js index f15047a5..1d52c260 100644 --- a/assets/js/select2/i18n/az.js +++ b/assets/js/select2/i18n/az.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/bg.js b/assets/js/select2/i18n/bg.js index ad8915ee..73b730a7 100644 --- a/assets/js/select2/i18n/bg.js +++ b/assets/js/select2/i18n/bg.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/bn.js b/assets/js/select2/i18n/bn.js index e2a3926a..2d17b9d8 100644 --- a/assets/js/select2/i18n/bn.js +++ b/assets/js/select2/i18n/bn.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/bs.js b/assets/js/select2/i18n/bs.js index 89a88988..46b084d7 100644 --- a/assets/js/select2/i18n/bs.js +++ b/assets/js/select2/i18n/bs.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ca.js b/assets/js/select2/i18n/ca.js index 9e9e5ab9..82dbbb7a 100644 --- a/assets/js/select2/i18n/ca.js +++ b/assets/js/select2/i18n/ca.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/cs.js b/assets/js/select2/i18n/cs.js index 3b05cec1..7116d6c1 100644 --- a/assets/js/select2/i18n/cs.js +++ b/assets/js/select2/i18n/cs.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/da.js b/assets/js/select2/i18n/da.js index cfa74f48..cda32c34 100644 --- a/assets/js/select2/i18n/da.js +++ b/assets/js/select2/i18n/da.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/de.js b/assets/js/select2/i18n/de.js index 57e210f8..c2e61e58 100644 --- a/assets/js/select2/i18n/de.js +++ b/assets/js/select2/i18n/de.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/dsb.js b/assets/js/select2/i18n/dsb.js index 7bee0a00..02f283ab 100644 --- a/assets/js/select2/i18n/dsb.js +++ b/assets/js/select2/i18n/dsb.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/el.js b/assets/js/select2/i18n/el.js index d345ab21..d4922a1d 100644 --- a/assets/js/select2/i18n/el.js +++ b/assets/js/select2/i18n/el.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/en.js b/assets/js/select2/i18n/en.js index 5b99c966..3b192857 100644 --- a/assets/js/select2/i18n/en.js +++ b/assets/js/select2/i18n/en.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/es.js b/assets/js/select2/i18n/es.js index 2354519b..68afd6d2 100644 --- a/assets/js/select2/i18n/es.js +++ b/assets/js/select2/i18n/es.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/et.js b/assets/js/select2/i18n/et.js index af186735..070b61a2 100644 --- a/assets/js/select2/i18n/et.js +++ b/assets/js/select2/i18n/et.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/eu.js b/assets/js/select2/i18n/eu.js index 96751ad4..90d5e73f 100644 --- a/assets/js/select2/i18n/eu.js +++ b/assets/js/select2/i18n/eu.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/fa.js b/assets/js/select2/i18n/fa.js index 0180ad1b..e1ffdbed 100644 --- a/assets/js/select2/i18n/fa.js +++ b/assets/js/select2/i18n/fa.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/fi.js b/assets/js/select2/i18n/fi.js index 630144e1..ffed1247 100644 --- a/assets/js/select2/i18n/fi.js +++ b/assets/js/select2/i18n/fi.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/fr.js b/assets/js/select2/i18n/fr.js index 5c7c285f..dd02f973 100644 --- a/assets/js/select2/i18n/fr.js +++ b/assets/js/select2/i18n/fr.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/gl.js b/assets/js/select2/i18n/gl.js index 6a78d84c..208a0057 100644 --- a/assets/js/select2/i18n/gl.js +++ b/assets/js/select2/i18n/gl.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/he.js b/assets/js/select2/i18n/he.js index 2904dd22..25a8805a 100644 --- a/assets/js/select2/i18n/he.js +++ b/assets/js/select2/i18n/he.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/hi.js b/assets/js/select2/i18n/hi.js index 9428c29c..f3ed7984 100644 --- a/assets/js/select2/i18n/hi.js +++ b/assets/js/select2/i18n/hi.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/hr.js b/assets/js/select2/i18n/hr.js index 3a5ede48..cb3268db 100644 --- a/assets/js/select2/i18n/hr.js +++ b/assets/js/select2/i18n/hr.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/hsb.js b/assets/js/select2/i18n/hsb.js index 160318e8..3d5bf09d 100644 --- a/assets/js/select2/i18n/hsb.js +++ b/assets/js/select2/i18n/hsb.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/hu.js b/assets/js/select2/i18n/hu.js index 73debe09..4893aa2f 100644 --- a/assets/js/select2/i18n/hu.js +++ b/assets/js/select2/i18n/hu.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/hy.js b/assets/js/select2/i18n/hy.js index d7f11dcd..82300071 100644 --- a/assets/js/select2/i18n/hy.js +++ b/assets/js/select2/i18n/hy.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/id.js b/assets/js/select2/i18n/id.js index f9479b60..4a0b3bf0 100644 --- a/assets/js/select2/i18n/id.js +++ b/assets/js/select2/i18n/id.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/is.js b/assets/js/select2/i18n/is.js index b6770703..cca5bbec 100644 --- a/assets/js/select2/i18n/is.js +++ b/assets/js/select2/i18n/is.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/it.js b/assets/js/select2/i18n/it.js index 05f87cf0..507c7d9f 100644 --- a/assets/js/select2/i18n/it.js +++ b/assets/js/select2/i18n/it.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ja.js b/assets/js/select2/i18n/ja.js index 3f546061..451025e2 100644 --- a/assets/js/select2/i18n/ja.js +++ b/assets/js/select2/i18n/ja.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ka.js b/assets/js/select2/i18n/ka.js index 5d3ca4ac..60c593b7 100644 --- a/assets/js/select2/i18n/ka.js +++ b/assets/js/select2/i18n/ka.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/km.js b/assets/js/select2/i18n/km.js index bd78a0d3..4dca94f4 100644 --- a/assets/js/select2/i18n/km.js +++ b/assets/js/select2/i18n/km.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ko.js b/assets/js/select2/i18n/ko.js index 91a470aa..f2880fb0 100644 --- a/assets/js/select2/i18n/ko.js +++ b/assets/js/select2/i18n/ko.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/lt.js b/assets/js/select2/i18n/lt.js index ece6f692..f6a42155 100644 --- a/assets/js/select2/i18n/lt.js +++ b/assets/js/select2/i18n/lt.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/lv.js b/assets/js/select2/i18n/lv.js index 815d799b..806dc5c4 100644 --- a/assets/js/select2/i18n/lv.js +++ b/assets/js/select2/i18n/lv.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/mk.js b/assets/js/select2/i18n/mk.js index 79e870e4..cb7b84a2 100644 --- a/assets/js/select2/i18n/mk.js +++ b/assets/js/select2/i18n/mk.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ms.js b/assets/js/select2/i18n/ms.js index d3feef2b..6bd7eaa3 100644 --- a/assets/js/select2/i18n/ms.js +++ b/assets/js/select2/i18n/ms.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/nb.js b/assets/js/select2/i18n/nb.js index 953ff21e..25d89c68 100644 --- a/assets/js/select2/i18n/nb.js +++ b/assets/js/select2/i18n/nb.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ne.js b/assets/js/select2/i18n/ne.js index 536fbab8..1c39f672 100644 --- a/assets/js/select2/i18n/ne.js +++ b/assets/js/select2/i18n/ne.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/nl.js b/assets/js/select2/i18n/nl.js index 776c2df6..2b74058d 100644 --- a/assets/js/select2/i18n/nl.js +++ b/assets/js/select2/i18n/nl.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/pl.js b/assets/js/select2/i18n/pl.js index 7790a50c..4ca5748c 100644 --- a/assets/js/select2/i18n/pl.js +++ b/assets/js/select2/i18n/pl.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ps.js b/assets/js/select2/i18n/ps.js index 9d2cd8ca..9b008e4c 100644 --- a/assets/js/select2/i18n/ps.js +++ b/assets/js/select2/i18n/ps.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/pt-BR.js b/assets/js/select2/i18n/pt-BR.js index f26c8133..c991e255 100644 --- a/assets/js/select2/i18n/pt-BR.js +++ b/assets/js/select2/i18n/pt-BR.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/pt.js b/assets/js/select2/i18n/pt.js index 2068a7c2..b5da1a6b 100644 --- a/assets/js/select2/i18n/pt.js +++ b/assets/js/select2/i18n/pt.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ro.js b/assets/js/select2/i18n/ro.js index 4bff1c64..1ba7b40b 100644 --- a/assets/js/select2/i18n/ro.js +++ b/assets/js/select2/i18n/ro.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/ru.js b/assets/js/select2/i18n/ru.js index 267b995f..63a7d66c 100644 --- a/assets/js/select2/i18n/ru.js +++ b/assets/js/select2/i18n/ru.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sk.js b/assets/js/select2/i18n/sk.js index 64346a7a..5049528a 100644 --- a/assets/js/select2/i18n/sk.js +++ b/assets/js/select2/i18n/sk.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sl.js b/assets/js/select2/i18n/sl.js index 9b26c39a..4d0b7d3e 100644 --- a/assets/js/select2/i18n/sl.js +++ b/assets/js/select2/i18n/sl.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sq.js b/assets/js/select2/i18n/sq.js index 4999d21f..59162024 100644 --- a/assets/js/select2/i18n/sq.js +++ b/assets/js/select2/i18n/sq.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sr-Cyrl.js b/assets/js/select2/i18n/sr-Cyrl.js index 34fb0059..ce13ce8f 100644 --- a/assets/js/select2/i18n/sr-Cyrl.js +++ b/assets/js/select2/i18n/sr-Cyrl.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sr.js b/assets/js/select2/i18n/sr.js index 2293b587..dd407a06 100644 --- a/assets/js/select2/i18n/sr.js +++ b/assets/js/select2/i18n/sr.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/sv.js b/assets/js/select2/i18n/sv.js index ab5cd50c..1bc8724a 100644 --- a/assets/js/select2/i18n/sv.js +++ b/assets/js/select2/i18n/sv.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/th.js b/assets/js/select2/i18n/th.js index 5458cc09..63eab711 100644 --- a/assets/js/select2/i18n/th.js +++ b/assets/js/select2/i18n/th.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/tk.js b/assets/js/select2/i18n/tk.js index 2c8274d0..30255ff3 100644 --- a/assets/js/select2/i18n/tk.js +++ b/assets/js/select2/i18n/tk.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/tr.js b/assets/js/select2/i18n/tr.js index 5ab03b9b..fc4c0bf0 100644 --- a/assets/js/select2/i18n/tr.js +++ b/assets/js/select2/i18n/tr.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/uk.js b/assets/js/select2/i18n/uk.js index cf3febb2..63697e38 100644 --- a/assets/js/select2/i18n/uk.js +++ b/assets/js/select2/i18n/uk.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/vi.js b/assets/js/select2/i18n/vi.js index 90848f32..24f3bc2d 100644 --- a/assets/js/select2/i18n/vi.js +++ b/assets/js/select2/i18n/vi.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/zh-CN.js b/assets/js/select2/i18n/zh-CN.js index 4b98e42e..2c5649d3 100644 --- a/assets/js/select2/i18n/zh-CN.js +++ b/assets/js/select2/i18n/zh-CN.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/i18n/zh-TW.js b/assets/js/select2/i18n/zh-TW.js index 39b1a4e8..570a5669 100644 --- a/assets/js/select2/i18n/zh-TW.js +++ b/assets/js/select2/i18n/zh-TW.js @@ -1,3 +1,3 @@ -/*! Select2 4.0.12 | https://github.com/select2/select2/blob/master/LICENSE.md */ +/*! Select2 4.0.13 | 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/assets/js/select2/select2.full.js b/assets/js/select2/select2.full.js new file mode 100644 index 00000000..358572a6 --- /dev/null +++ b/assets/js/select2/select2.full.js @@ -0,0 +1,6820 @@ +/*! + * Select2 4.0.13 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 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.'); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + BaseSelection.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + BaseSelection.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + 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.isDisabled()) { + 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.isDisabled()) { + 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('input').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('input').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('input').trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('input').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('input').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('input').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 = { + top: 0, + left: 0 + }; + + if ( + $.contains(document.body, $offsetParent[0]) || + $offsetParent[0].isConnected + ) { + 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) { + self._syncA(); + self._syncS(null, mutations); + }); + 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); + + 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.isDisabled()) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._isChangeMutation = 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; + } else if ($.isArray(mutations)) { + $.each(mutations, function(evt, mutation) { + if (self._isChangeMutation(evt, mutation)) { + // We've found a change mutation. + // Let's escape from the loop and continue + changed = true; + return false; + } + }); + } + return changed; + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = this._isChangeMutation(evt, mutations); + var self = this; + + // 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.isDisabled()) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + if (this.isDisabled()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function (evt) { + if (!this.isOpen()) { + return; + } + + this.trigger('close', { originalEvent : evt }); + }; + + /** + * Helper method to abstract the "enabled" (not "disabled") state of this + * object. + * + * @return {true} if the instance is not disabled. + * @return {false} if the instance is disabled. + */ + Select2.prototype.isEnabled = function () { + return !this.isDisabled(); + }; + + /** + * Helper method to abstract the "disabled" state of this object. + * + * @return {true} if the disabled option is true. + * @return {false} if the disabled option is false. + */ + Select2.prototype.isDisabled = function () { + return this.options.get('disabled'); + }; + + 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('input').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={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(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=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={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(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 `
        - + query()->count_users_by_status( 'awaiting_admin_review' ); ?> - +
        - + query()->count_users_by_status( 'awaiting_email_confirmation' ); ?> - +
        - + query()->count_users_by_status( 'inactive' ); ?> - +