spree_backend 4.2.0.rc2 → 4.2.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/backend.js +0 -1
  3. data/app/assets/javascripts/spree/backend/address_states.js +20 -9
  4. data/app/assets/javascripts/spree/backend/calculator.js +2 -0
  5. data/app/assets/javascripts/spree/backend/checkouts/edit.js +99 -71
  6. data/app/assets/javascripts/spree/backend/line_items_on_order_edit.js +1 -1
  7. data/app/assets/javascripts/spree/backend/option_type_autocomplete.js +31 -37
  8. data/app/assets/javascripts/spree/backend/option_value_picker.js +50 -23
  9. data/app/assets/javascripts/spree/backend/product_picker.js +35 -19
  10. data/app/assets/javascripts/spree/backend/promotions.js +32 -27
  11. data/app/assets/javascripts/spree/backend/shipments.js +28 -37
  12. data/app/assets/javascripts/spree/backend/spree-select2.js +33 -14
  13. data/app/assets/javascripts/spree/backend/stock_transfer.js +32 -13
  14. data/app/assets/javascripts/spree/backend/taxon_autocomplete.js +30 -43
  15. data/app/assets/javascripts/spree/backend/taxons.js +60 -47
  16. data/app/assets/javascripts/spree/backend/user_picker.js +16 -18
  17. data/app/assets/javascripts/spree/backend/variant_autocomplete.js +23 -22
  18. data/app/assets/stylesheets/spree/backend/components/_badges.scss +1 -1
  19. data/app/assets/stylesheets/spree/backend/components/_tables.scss +2 -2
  20. data/app/assets/stylesheets/spree/backend/global/_variables.scss +1 -1
  21. data/app/assets/stylesheets/spree/backend/plugins/_select2_custom.scss +11 -0
  22. data/app/assets/stylesheets/spree/backend/plugins/select2_bootstrap4.scss +622 -0
  23. data/app/assets/stylesheets/spree/backend/spree_admin.css.scss +2 -1
  24. data/app/controllers/spree/admin/orders_controller.rb +15 -2
  25. data/app/controllers/spree/admin/products_controller.rb +2 -2
  26. data/app/controllers/spree/admin/states_controller.rb +1 -1
  27. data/app/controllers/spree/admin/taxons_controller.rb +15 -5
  28. data/app/helpers/spree/admin/base_helper.rb +21 -5
  29. data/app/helpers/spree/admin/navigation_helper.rb +11 -1
  30. data/app/helpers/spree/admin/payments_helper.rb +3 -3
  31. data/app/helpers/spree/admin/stock_movements_helper.rb +2 -0
  32. data/app/views/spree/admin/countries/index.html.erb +6 -6
  33. data/app/views/spree/admin/customer_returns/_return_item_decision.html.erb +3 -1
  34. data/app/views/spree/admin/customer_returns/_return_item_selection.html.erb +3 -1
  35. data/app/views/spree/admin/customer_returns/index.html.erb +2 -2
  36. data/app/views/spree/admin/customer_returns/new.html.erb +1 -1
  37. data/app/views/spree/admin/general_settings/edit.html.erb +25 -2
  38. data/app/views/spree/admin/option_types/index.html.erb +1 -1
  39. data/app/views/spree/admin/orders/_add_line_item.html.erb +1 -1
  40. data/app/views/spree/admin/orders/_add_product.html.erb +1 -1
  41. data/app/views/spree/admin/orders/_channel_form.html.erb +18 -0
  42. data/app/views/spree/admin/orders/_shipment.html.erb +3 -1
  43. data/app/views/spree/admin/orders/channel.html.erb +7 -0
  44. data/app/views/spree/admin/orders/customer_details/_autocomplete.js.erb +35 -12
  45. data/app/views/spree/admin/orders/customer_details/_form.html.erb +2 -2
  46. data/app/views/spree/admin/orders/customer_details/edit.html.erb +1 -1
  47. data/app/views/spree/admin/orders/index.html.erb +10 -11
  48. data/app/views/spree/admin/payment_methods/_form.html.erb +65 -46
  49. data/app/views/spree/admin/payment_methods/index.html.erb +1 -1
  50. data/app/views/spree/admin/products/_form.html.erb +4 -4
  51. data/app/views/spree/admin/products/index.html.erb +2 -1
  52. data/app/views/spree/admin/products/new.html.erb +2 -2
  53. data/app/views/spree/admin/promotion_rules/create.js.erb +1 -1
  54. data/app/views/spree/admin/promotions/_form.html.erb +1 -1
  55. data/app/views/spree/admin/promotions/actions/_create_line_items.html.erb +1 -1
  56. data/app/views/spree/admin/promotions/rules/_option_value.html.erb +8 -7
  57. data/app/views/spree/admin/promotions/rules/_product.html.erb +1 -1
  58. data/app/views/spree/admin/promotions/rules/_taxon.html.erb +1 -1
  59. data/app/views/spree/admin/promotions/rules/_user.html.erb +1 -1
  60. data/app/views/spree/admin/refunds/new.html.erb +1 -1
  61. data/app/views/spree/admin/reimbursements/edit.html.erb +4 -2
  62. data/app/views/spree/admin/reimbursements/show.html.erb +3 -1
  63. data/app/views/spree/admin/return_authorizations/_form.html.erb +7 -5
  64. data/app/views/spree/admin/return_authorizations/index.html.erb +2 -2
  65. data/app/views/spree/admin/return_index/customer_returns.html.erb +2 -2
  66. data/app/views/spree/admin/return_index/return_authorizations.html.erb +2 -2
  67. data/app/views/spree/admin/shared/_account_nav.html.erb +1 -1
  68. data/app/views/spree/admin/shared/_address_form.html.erb +7 -7
  69. data/app/views/spree/admin/shared/_head.html.erb +4 -0
  70. data/app/views/spree/admin/shared/_order_summary.html.erb +25 -21
  71. data/app/views/spree/admin/shared/_order_tabs.html.erb +9 -0
  72. data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
  73. data/app/views/spree/admin/shared/_translations.html.erb +1 -0
  74. data/app/views/spree/admin/shared/_update_order_state.js.erb +6 -2
  75. data/app/views/spree/admin/shared/named_types/_index.html.erb +1 -1
  76. data/app/views/spree/admin/shipping_methods/_form.html.erb +2 -2
  77. data/app/views/spree/admin/shipping_methods/index.html.erb +5 -1
  78. data/app/views/spree/admin/stock_locations/_form.html.erb +1 -1
  79. data/app/views/spree/admin/stock_locations/index.html.erb +2 -2
  80. data/app/views/spree/admin/stock_transfers/_stock_movements.html.erb +1 -1
  81. data/app/views/spree/admin/stock_transfers/index.html.erb +42 -37
  82. data/app/views/spree/admin/stock_transfers/new.html.erb +1 -1
  83. data/app/views/spree/admin/stores/_form.html.erb +64 -11
  84. data/app/views/spree/admin/stores/index.html.erb +11 -6
  85. data/app/views/spree/admin/tax_categories/index.html.erb +1 -1
  86. data/app/views/spree/admin/tax_rates/index.html.erb +2 -2
  87. data/app/views/spree/admin/taxons/_form.html.erb +39 -35
  88. data/app/views/spree/admin/taxons/index.html.erb +1 -1
  89. data/app/views/spree/admin/users/_addresses_form.html.erb +4 -6
  90. data/app/views/spree/admin/variants/_form.html.erb +2 -2
  91. data/app/views/spree/admin/zones/index.html.erb +1 -1
  92. data/config/routes.rb +7 -1
  93. data/spree_backend.gemspec +1 -1
  94. metadata +15 -14
  95. data/app/assets/javascripts/spree/backend/tag_picker.js +0 -52
  96. data/app/assets/stylesheets/spree/backend/plugins/_select2.scss +0 -190
  97. data/app/views/spree/admin/general_settings/_form.html.erb +0 -17
@@ -33,73 +33,74 @@ $(function () {
33
33
 
34
34
  if (taxonId.length > 0) {
35
35
  taxonId.select2({
36
- dropdownCssClass: 'taxon_select_box',
37
36
  placeholder: Spree.translations.find_a_taxon,
37
+ minimumInputLength: 3,
38
+ multiple: false,
38
39
  ajax: {
39
40
  url: Spree.routes.taxons_api,
40
41
  datatype: 'json',
41
- data: function (term, page) {
42
+ data: function (params, page) {
42
43
  return {
43
44
  per_page: 50,
44
45
  page: page,
45
46
  without_children: true,
46
- token: Spree.api_key,
47
47
  q: {
48
- name_cont: term
49
- }
48
+ name_cont: params.term
49
+ },
50
+ token: Spree.api_key
50
51
  }
51
52
  },
52
- results: function (data, page) {
53
+ processResults: function (data, page) {
53
54
  var more = page < data.pages
55
+ var results = formatTaxonList(data.taxons)
56
+
54
57
  return {
55
- results: data['taxons'],
56
- more: more
58
+ results: results,
59
+ pagination: {
60
+ more: more
61
+ }
57
62
  }
58
63
  }
59
64
  },
60
- formatResult: formatTaxon,
61
- formatSelection: formatTaxon
62
- })
63
- }
64
-
65
- taxonId.on('change', function (e) {
66
- var el = $('#taxon_products')
67
- $.ajax({
68
- url: Spree.routes.taxon_products_api,
69
- data: {
70
- id: e.val,
71
- token: Spree.api_key
72
- }
73
- }).done(function (data) {
74
- var i, j, len, len1, product, ref, ref1, results, variant
75
- el.empty()
76
- if (data.products.length === 0) {
77
- return $('#taxon_products').html('<div class="alert alert-info">' + Spree.translations.no_results + '</div>')
78
- } else {
79
- ref = data.products
80
- results = []
81
- for (i = 0, len = ref.length; i < len; i++) {
82
- product = ref[i]
83
- if (product.master.images[0] !== void 0 && product.master.images[0].small_url !== void 0) {
84
- product.image = product.master.images[0].small_url
85
- } else {
86
- ref1 = product.variants
87
- for (j = 0, len1 = ref1.length; j < len1; j++) {
88
- variant = ref1[j]
89
- if (variant.images[0] !== void 0 && variant.images[0].small_url !== void 0) {
90
- product.image = variant.images[0].small_url
91
- break
65
+ templateResult: formatTaxon,
66
+ templateSelection: formatTaxon
67
+ }).on('select2:select', function (e) {
68
+ var el = $('#taxon_products')
69
+ $.ajax({
70
+ url: Spree.routes.taxon_products_api,
71
+ data: { id: e.params.data.id, token: Spree.api_key }
72
+ }).done(function (data) {
73
+ var i, j, len, len1, product, ref, ref1, results, variant
74
+ el.empty()
75
+ if (data.products.length === 0) {
76
+ return $('#taxon_products').html('<div class="alert alert-info">' + Spree.translations.no_results + '</div>')
77
+ } else {
78
+ ref = data.products
79
+ results = []
80
+ for (i = 0, len = ref.length; i < len; i++) {
81
+ product = ref[i]
82
+ if (product.master.images[0] !== void 0 && product.master.images[0].small_url !== void 0) {
83
+ product.image = product.master.images[0].small_url
84
+ } else {
85
+ ref1 = product.variants
86
+ for (j = 0, len1 = ref1.length; j < len1; j++) {
87
+ variant = ref1[j]
88
+ if (variant.images[0] !== void 0 && variant.images[0].small_url !== void 0) {
89
+ product.image = variant.images[0].small_url
90
+ break
91
+ }
92
92
  }
93
93
  }
94
+ results.push(el.append(productTemplate({
95
+ product: product
96
+ })))
94
97
  }
95
- results.push(el.append(productTemplate({
96
- product: product
97
- })))
98
+ return results
98
99
  }
99
- return results
100
- }
100
+ })
101
101
  })
102
- })
102
+ }
103
+
103
104
  taxonProducts.on('click', '.js-delete-product', function (e) {
104
105
  var currentTaxonId = $('#taxon_id').val()
105
106
  var product = $(this).parents('.product')
@@ -126,6 +127,18 @@ $(function () {
126
127
  $('.variant_autocomplete').variantAutocomplete()
127
128
 
128
129
  function formatTaxon (taxon) {
129
- return Select2.util.escapeMarkup(taxon.pretty_name)
130
+ if (taxon.loading) {
131
+ return taxon.text;
132
+ }
133
+ return taxon.pretty_name
134
+ }
135
+
136
+ function formatTaxonList(values) {
137
+ return values.map(function (obj) {
138
+ return {
139
+ id: obj.id,
140
+ pretty_name: obj.pretty_name
141
+ }
142
+ })
130
143
  }
131
144
  })
@@ -1,40 +1,38 @@
1
1
  $.fn.userAutocomplete = function () {
2
2
  'use strict'
3
3
 
4
- function formatUser (user) {
5
- return Select2.util.escapeMarkup(user.email)
4
+ function formatUserList(values) {
5
+ return values.map(function (obj) {
6
+ return {
7
+ id: obj.id,
8
+ text: obj.email
9
+ }
10
+ })
6
11
  }
7
12
 
8
13
  this.select2({
9
- minimumInputLength: 1,
10
14
  multiple: true,
11
- initSelection: function (element, callback) {
12
- $.get(Spree.routes.users_api, {
13
- ids: element.val().split(','),
14
- token: Spree.api_key
15
- }, function (data) {
16
- callback(data.users)
17
- })
18
- },
15
+ minimumInputLength: 1,
19
16
  ajax: {
20
17
  url: Spree.routes.users_api,
21
- datatype: 'json',
22
- data: function (term) {
18
+ dataType: 'json',
19
+ data: function (params) {
23
20
  return {
24
21
  q: {
25
- email_start: term
22
+ email_start: params.term
26
23
  },
27
24
  token: Spree.api_key
28
25
  }
29
26
  },
30
- results: function (data) {
27
+ processResults: function(data) {
31
28
  return {
32
- results: data.users
29
+ results: formatUserList(data.users)
33
30
  }
34
31
  }
35
32
  },
36
- formatResult: formatUser,
37
- formatSelection: formatUser
33
+ templateSelection: function (data) {
34
+ return data.text
35
+ }
38
36
  })
39
37
  }
40
38
 
@@ -9,53 +9,54 @@ $(function () {
9
9
  }
10
10
  })
11
11
 
12
- function formatVariantResult (variant) {
12
+ function formatVariantResult(variant) {
13
+ if (variant.loading) {
14
+ return variant.text
15
+ }
16
+
13
17
  if (variant['images'][0] !== undefined && variant['images'][0].mini_url !== undefined) {
14
18
  variant.image = variant.images[0].mini_url
15
19
  }
16
- return variantTemplate({
20
+ return $(variantTemplate({
17
21
  variant: variant
18
- })
22
+ }))
19
23
  }
20
24
 
21
25
  $.fn.variantAutocomplete = function () {
26
+
27
+ // deal with initSelection
22
28
  return this.select2({
23
29
  placeholder: Spree.translations.variant_placeholder,
24
30
  minimumInputLength: 3,
25
- initSelection: function (element, callback) {
26
- return $.get(Spree.routes.variants_api + '/' + element.val(), {
27
- token: Spree.api_key
28
- }).done(function (data) {
29
- return callback(data)
30
- })
31
- },
31
+ quietMillis: 200,
32
32
  ajax: {
33
33
  url: Spree.url(Spree.routes.variants_api),
34
- quietMillis: 200,
35
- datatype: 'json',
36
- data: function (term) {
37
- return {
34
+ dataType: 'json',
35
+ data: function (params) {
36
+ var query = {
38
37
  q: {
39
- search_by_product_name_or_sku: term
38
+ search_by_product_name_or_sku: params.term
40
39
  },
41
40
  token: Spree.api_key
42
41
  }
42
+
43
+ return query;
43
44
  },
44
- results: function (data) {
45
+ processResults: function(data) {
45
46
  window.variants = data['variants']
46
47
  return {
47
- results: data['variants']
48
+ results: data.variants
48
49
  }
49
50
  }
50
51
  },
51
- formatResult: formatVariantResult,
52
- formatSelection: function (variant) {
53
- // eslint-disable-next-line no-extra-boolean-cast
52
+ templateResult: formatVariantResult,
53
+ templateSelection: function(variant) {
54
54
  if (!!variant.options_text) {
55
- return Select2.util.escapeMarkup(variant.name + '(' + variant.options_text + ')')
55
+ return variant.name + '(' + variant.options_text + ')'
56
56
  } else {
57
- return Select2.util.escapeMarkup(variant.name)
57
+ return variant.name
58
58
  }
59
59
  }
60
60
  })
61
+
61
62
  }
@@ -42,5 +42,5 @@
42
42
  .badge-inactive,
43
43
  .badge-notice,
44
44
  .badge-partial {
45
- @include badge-variant($warning);
45
+ @include badge-variant($light);
46
46
  }
@@ -21,7 +21,7 @@ table.table {
21
21
  }
22
22
 
23
23
  .badge {
24
- font-size: 0.85em;
24
+ text-transform: uppercase;
25
25
  }
26
26
 
27
27
  thead {
@@ -126,7 +126,7 @@ div.table-responsive table.table-bordered {
126
126
 
127
127
  .sortable-drag-v {
128
128
  border: 1px solid $info;
129
- border-radius: 5px;
129
+ border-radius: $border-radius;
130
130
  width:100%;
131
131
  text-align: right;
132
132
  opacity: 0;
@@ -11,7 +11,7 @@
11
11
  /*------------------------------------------
12
12
  Components
13
13
  -----------------------------------------*/
14
- $border-radius: 2px;
14
+ $border-radius: 5px;
15
15
 
16
16
  /*------------------------------------------
17
17
  Fonts
@@ -0,0 +1,11 @@
1
+ // Stop an open select2-dropdown from appearing over fixed nav bar.
2
+ .select2-dropdown {
3
+ z-index: 1028;
4
+ }
5
+
6
+ // Hides the empty <li> tag highligted in open select2-dropdown.
7
+ ul.select2-results__options {
8
+ li:empty {
9
+ display: none;
10
+ }
11
+ }
@@ -0,0 +1,622 @@
1
+ // Variables directly translating Bootstrap variables
2
+ // -------------------------
3
+ $s2bs-border-radius-base: $border-radius !default;
4
+ $s2bs-border-radius-large: $border-radius-lg !default;
5
+ $s2bs-border-radius-small: $border-radius-sm !default;
6
+ $s2bs-btn-default-bg: transparent !default;
7
+ $s2bs-btn-default-border: $dark !default;
8
+ $s2bs-btn-default-color: $dark !default;
9
+ $s2bs-caret-padding: $custom-select-indicator-padding !default;
10
+ $s2bs-caret-width-base: 0.25rem !default;
11
+ $s2bs-caret-width-large: 0.3125rem !default;
12
+ $s2bs-cursor-disabled: not-allowed !default;
13
+ $s2bs-dropdown-bg: $dropdown-bg !default;
14
+ $s2bs-dropdown-header-color: $dropdown-header-color !default;
15
+ $s2bs-dropdown-link-active-bg: $dropdown-link-active-bg !default;
16
+ $s2bs-dropdown-link-active-color: $dropdown-link-active-color !default;
17
+ $s2bs-dropdown-link-disabled-color: $dropdown-link-disabled-color !default;
18
+ $s2bs-dropdown-link-hover-bg: $dropdown-link-hover-bg !default;
19
+ $s2bs-dropdown-link-hover-color: $dropdown-link-hover-color !default;
20
+ $s2bs-font-size-base: $font-size-base !default;
21
+ $s2bs-font-size-large: $font-size-lg !default;
22
+ $s2bs-font-size-small: $font-size-sm !default;
23
+ $s2bs-padding-base-horizontal: $custom-select-padding-x !default;
24
+ $s2bs-padding-large-horizontal: $input-padding-x-lg !default;
25
+ $s2bs-padding-small-horizontal: $input-padding-x-sm !default;
26
+ $s2bs-padding-base-vertical: $custom-select-padding-y !default;
27
+ $s2bs-padding-large-vertical: $input-btn-padding-y-lg !default;
28
+ $s2bs-padding-small-vertical: $input-btn-padding-y-sm !default;
29
+ $s2bs-line-height: $custom-select-line-height !default;
30
+ $s2bs-input-bg: $input-bg !default;
31
+ $s2bs-input-bg-disabled: $input-disabled-bg !default;
32
+ $s2bs-input-color: $input-color !default;
33
+ $s2bs-input-color-placeholder: $input-placeholder-color !default;
34
+ $s2bs-input-border: $input-border-color !default;
35
+ $s2bs-input-border-width: $input-border-width !default;
36
+ $s2bs-input-border-focus: $input-focus-border-color !default;
37
+ $s2bs-input-border-radius: $input-border-radius !default;
38
+ $s2bs-input-height-base: $input-height !default;
39
+ $s2bs-input-height-large: $input-height-lg !default;
40
+ $s2bs-input-height-small: $input-height-sm !default;
41
+
42
+
43
+ // Theme-specific variables
44
+ // -------------------------
45
+ $s2bs-dropdown-arrow-color: $s2bs-input-color-placeholder !default;
46
+ $s2bs-dropdown-box-shadow: 0 6px 12px rgba(0,0,0,.175) !default;
47
+ $s2bs-dropdown-box-shadow-above: 0px -6px 12px rgba(0,0,0,.175) !default;
48
+ $s2bs-clear-selection-color: $s2bs-dropdown-arrow-color !default;
49
+ $s2bs-clear-selection-hover-color: $s2bs-btn-default-color !default;
50
+ $s2bs-remove-choice-color: $s2bs-input-color-placeholder !default;
51
+ $s2bs-remove-choice-hover-color: $s2bs-btn-default-color !default;
52
+ $s2bs-selection-choice-border-radius: $s2bs-border-radius-base !default;
53
+ $s2bs-dropdown-header-padding-vertical: $s2bs-padding-base-vertical !default;
54
+ $s2bs-dropdown-header-font-size: $s2bs-font-size-small !default;
55
+
56
+
57
+ // Bootstrap defaults not available as pre-defined variables
58
+ // These should not be overridden.
59
+ // -------------------------
60
+ $s2bs-form-control-default-box-shadow: inset 0 1px 1px rgba(0,0,0,.075) !default;
61
+ $s2bs-form-control-focus-box-shadow: $s2bs-form-control-default-box-shadow, 0 0 8px rgba($s2bs-input-border-focus, 0.6) !default;
62
+ $s2bs-form-control-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;
63
+
64
+
65
+ //
66
+ // Mixins
67
+ // --------------------------------------------------
68
+ @mixin bootstrap-input-defaults($font-size: $s2bs-font-size-base) {
69
+ @include box-shadow($s2bs-form-control-default-box-shadow);
70
+ background-color: $s2bs-input-bg;
71
+ border: $s2bs-input-border-width solid $s2bs-input-border;
72
+ @include border-radius($s2bs-input-border-radius);
73
+ color: $s2bs-input-color;
74
+ font-size: $font-size;
75
+ }
76
+
77
+ @mixin validation-state-focus($color) {
78
+ $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($color, 20%);
79
+
80
+ .select2-dropdown,
81
+ .select2-selection {
82
+ border-color: $color;
83
+ }
84
+
85
+ .select2-container--focus .select2-selection,
86
+ .select2-container--open .select2-selection {
87
+ @include box-shadow($shadow);
88
+ border-color: darken($color, 10%);
89
+ }
90
+
91
+ &.select2-drop-active {
92
+ border-color: darken($color, 10%);
93
+
94
+ &.select2-drop.select2-drop-above {
95
+ border-top-color: darken($color, 10%);
96
+ }
97
+ }
98
+ }
99
+
100
+ @mixin dropdown-arrow {
101
+ .select2-selection--single {
102
+ .select2-selection__arrow b {
103
+ border-color: transparent transparent $s2bs-dropdown-arrow-color transparent;
104
+ border-width: 0 $s2bs-caret-width-large $s2bs-caret-width-large $s2bs-caret-width-large;
105
+ }
106
+ }
107
+ }
108
+
109
+ .select2-container--bootstrap4 {
110
+ display: block;
111
+
112
+ .select2-selection {
113
+ @include bootstrap-input-defaults;
114
+ outline: 0;
115
+
116
+ &.form-control {
117
+ @include border-radius($s2bs-border-radius-base);
118
+ }
119
+ }
120
+
121
+ .select2-search__field {
122
+ outline: 0;
123
+
124
+ &::-webkit-input-placeholder {
125
+ color: $s2bs-input-color-placeholder;
126
+ }
127
+
128
+ &::-moz-placeholder {
129
+ color: $s2bs-input-color-placeholder;
130
+ opacity: 1;
131
+ }
132
+
133
+ &:-moz-placeholder {
134
+ color: $s2bs-input-color-placeholder;
135
+ }
136
+
137
+ &:-ms-input-placeholder {
138
+ color: $s2bs-input-color-placeholder;
139
+ }
140
+ }
141
+
142
+ .select2-search--dropdown {
143
+ .select2-search__field {
144
+ @include bootstrap-input-defaults;
145
+ }
146
+ }
147
+
148
+ .select2-results__group {
149
+ color: $s2bs-dropdown-header-color;
150
+ display: block;
151
+ padding: $s2bs-dropdown-header-padding-vertical $s2bs-padding-base-horizontal;
152
+ font-size: $s2bs-dropdown-header-font-size;
153
+ line-height: $s2bs-line-height;
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .select2-results__option {
158
+ padding: $s2bs-padding-base-vertical $s2bs-padding-base-horizontal;
159
+ font-size: $s2bs-font-size-base;
160
+
161
+ &[role=group] {
162
+ padding: 0;
163
+ }
164
+
165
+ &[aria-disabled=true] {
166
+ color: $s2bs-dropdown-link-disabled-color;
167
+ cursor: $s2bs-cursor-disabled;
168
+ }
169
+
170
+ &[aria-selected=true] {
171
+ background-color: $s2bs-dropdown-link-hover-bg;
172
+ color: $s2bs-dropdown-link-hover-color;
173
+ }
174
+ &--highlighted[aria-selected] {
175
+ background-color: $s2bs-dropdown-link-active-bg;
176
+ color: $s2bs-dropdown-link-active-color;
177
+ }
178
+
179
+ .select2-results__option {
180
+ padding: $s2bs-padding-base-vertical $s2bs-padding-base-horizontal;
181
+
182
+ .select2-results__group {
183
+ padding-left: 0;
184
+ }
185
+
186
+ .select2-results__option {
187
+ margin-left: -$s2bs-padding-base-horizontal;
188
+ padding-left: $s2bs-padding-base-horizontal*2;
189
+
190
+ .select2-results__option {
191
+ margin-left: -$s2bs-padding-base-horizontal*2;
192
+ padding-left: $s2bs-padding-base-horizontal*3;
193
+
194
+ .select2-results__option {
195
+ margin-left: -$s2bs-padding-base-horizontal*3;
196
+ padding-left: $s2bs-padding-base-horizontal*4;
197
+
198
+ .select2-results__option {
199
+ margin-left: -$s2bs-padding-base-horizontal*4;
200
+ padding-left: $s2bs-padding-base-horizontal*5;
201
+
202
+ .select2-results__option {
203
+ margin-left: -$s2bs-padding-base-horizontal*5;
204
+ padding-left: $s2bs-padding-base-horizontal*6;
205
+ }
206
+ }
207
+ }
208
+ }
209
+ }
210
+ }
211
+ }
212
+
213
+ &.select2-container--focus,
214
+ &.select2-container--open {
215
+ .select2-selection {
216
+ @include box-shadow($s2bs-form-control-focus-box-shadow);
217
+ @include transition($s2bs-form-control-transition);
218
+ border-color: $s2bs-input-border-focus;
219
+ }
220
+ }
221
+
222
+ .select2-selection__clear {
223
+ margin-top: -2px; //make up for lowercase line centering
224
+ padding-left: 3px;
225
+ padding-right: 3px;
226
+ margin-left: -3px;
227
+ margin-right: -3px;
228
+ color: $s2bs-clear-selection-color;
229
+ cursor: pointer;
230
+ float: right;
231
+ font-weight: bold;
232
+
233
+ &:hover {
234
+ color: $s2bs-clear-selection-hover-color;
235
+ }
236
+ }
237
+
238
+ .select2-selection--multiple {
239
+ min-height: $s2bs-input-height-base;
240
+ padding: 0;
241
+ height: auto;
242
+ cursor: text;
243
+
244
+ .select2-selection__rendered {
245
+ box-sizing: border-box;
246
+ display: block;
247
+ line-height: $s2bs-line-height;
248
+ list-style: none;
249
+ margin: 0;
250
+ overflow: hidden;
251
+ padding: $s2bs-padding-base-vertical $s2bs-padding-base-horizontal 0 $s2bs-padding-base-horizontal;
252
+ width: 100%;
253
+ text-overflow: ellipsis;
254
+ white-space: nowrap;
255
+ }
256
+
257
+ .select2-selection__placeholder {
258
+ color: $s2bs-input-color-placeholder;
259
+ float: left;
260
+ margin-top: 5px;
261
+ }
262
+
263
+ .select2-selection__clear {
264
+ border: $s2bs-input-border-width solid transparent;
265
+ margin-bottom: calc(#{$s2bs-padding-base-horizontal/2} + 2px);
266
+ }
267
+
268
+ .select2-selection__choice {
269
+ color: $s2bs-input-color;
270
+ background: $s2bs-btn-default-bg;
271
+ border: $s2bs-input-border-width solid $s2bs-btn-default-border;
272
+ @include border-radius($s2bs-selection-choice-border-radius);
273
+ cursor: default;
274
+ float: left;
275
+ overflow: hidden;
276
+ text-overflow: ellipsis;
277
+ max-width: 100%;
278
+ margin: 0 $s2bs-padding-base-horizontal/2 $s2bs-padding-base-horizontal/2 0;
279
+ padding: 0 $s2bs-padding-base-horizontal;
280
+ }
281
+
282
+ .select2-search--inline {
283
+ margin-bottom: $s2bs-padding-base-horizontal/2;
284
+
285
+ .select2-search__field {
286
+ background: transparent;
287
+
288
+ line-height: $s2bs-line-height;
289
+ margin-top: 0;
290
+ }
291
+ }
292
+
293
+ .select2-selection__choice__remove {
294
+ color: $s2bs-remove-choice-color;
295
+ cursor: pointer;
296
+ display: inline-block;
297
+ font-weight: bold;
298
+ margin-right: $s2bs-padding-base-horizontal / 2;
299
+ margin-left: -($s2bs-padding-base-horizontal / 2);
300
+
301
+ &:hover {
302
+ color: $s2bs-remove-choice-hover-color;
303
+ }
304
+ }
305
+ }
306
+
307
+ &.select2-container--disabled {
308
+ .select2-selection {
309
+ border-color: $s2bs-input-border;
310
+ @include box-shadow(none);
311
+ }
312
+
313
+ .select2-selection,
314
+ .select2-search__field { /* stylelint-disable-line no-descending-specificity */
315
+ cursor: $s2bs-cursor-disabled;
316
+ }
317
+
318
+ .select2-selection,
319
+ .select2-selection--multiple .select2-selection__choice {
320
+ background-color: $s2bs-input-bg-disabled;
321
+ }
322
+
323
+ .select2-selection__clear,
324
+ .select2-selection--multiple .select2-selection__choice__remove {
325
+ display: none;
326
+ }
327
+ }
328
+
329
+ .select2-selection--single {
330
+ display: flex;
331
+ align-items: center;
332
+ height: $s2bs-input-height-base;
333
+ line-height: $s2bs-line-height;
334
+ padding: 0 ($s2bs-padding-base-horizontal + $s2bs-caret-padding) 0 $s2bs-padding-base-horizontal;
335
+
336
+ .select2-selection__arrow {
337
+ display: flex;
338
+ justify-content: center;
339
+ align-items: center;
340
+ position: absolute;
341
+ top: 0;
342
+ bottom: 0;
343
+ right: $s2bs-padding-base-horizontal;
344
+
345
+ b {
346
+ border-color: $s2bs-dropdown-arrow-color transparent transparent transparent;
347
+ border-style: solid;
348
+ border-width: $s2bs-caret-width-base $s2bs-caret-width-base 0 $s2bs-caret-width-base;
349
+ }
350
+ }
351
+
352
+ .select2-selection__rendered {
353
+ flex-grow: 1;
354
+ padding: 0 3px 0 0;
355
+ margin-right: -3px;
356
+ color: $s2bs-input-color;
357
+ }
358
+
359
+ .select2-selection__placeholder {
360
+ color: $s2bs-input-color-placeholder;
361
+ }
362
+ }
363
+
364
+ .input-group-lg & .select2-selection {
365
+ &.select2-container--open {
366
+ @include dropdown-arrow;
367
+ }
368
+ }
369
+
370
+ &.select2-container--open {
371
+ .select2-selection .select2-selection__arrow b {
372
+ border-color: transparent transparent $s2bs-dropdown-arrow-color transparent;
373
+ border-width: 0 $s2bs-caret-width-base $s2bs-caret-width-base $s2bs-caret-width-base;
374
+ }
375
+
376
+ &.select2-container--below {
377
+ .select2-selection {
378
+ @include border-bottom-radius(0);
379
+ border-bottom-color: transparent;
380
+ }
381
+ }
382
+
383
+ &.select2-container--above {
384
+ .select2-selection {
385
+ @include border-top-radius(0);
386
+ border-top-color: transparent;
387
+ }
388
+ }
389
+ }
390
+
391
+ .select2-dropdown {
392
+ @include box-shadow($s2bs-dropdown-box-shadow);
393
+ border-color: $s2bs-input-border-focus;
394
+ border-width: $s2bs-input-border-width;
395
+ overflow-x: hidden;
396
+ margin-top: -1px;
397
+
398
+ background-color: $dropdown-bg;
399
+
400
+ &--above {
401
+ @include box-shadow($s2bs-dropdown-box-shadow-above);
402
+ margin-top: 1px;
403
+ }
404
+ }
405
+
406
+ .select2-results > .select2-results__options {
407
+ max-height: 200px;
408
+ overflow-y: auto;
409
+ }
410
+
411
+ .select2-selection--single.input-sm,
412
+ .input-group-sm & .select2-selection--single,
413
+ .form-group-sm & .select2-selection--single {
414
+ @include border-radius($s2bs-border-radius-small);
415
+ font-size: $s2bs-font-size-small;
416
+ height: $s2bs-input-height-small;
417
+ line-height: $s2bs-line-height;
418
+
419
+ // .select2-selection__arrow b { }
420
+ }
421
+
422
+ .select2-selection--multiple.input-sm,
423
+ .input-group-sm & .select2-selection--multiple,
424
+ .form-group-sm & .select2-selection--multiple {
425
+ min-height: $s2bs-input-height-small;
426
+ @include border-radius($s2bs-border-radius-small);
427
+
428
+ .select2-selection__rendered
429
+ {
430
+ padding: $s2bs-padding-small-vertical $s2bs-padding-small-horizontal 0 $s2bs-padding-small-horizontal;
431
+ font-size: $s2bs-font-size-small;
432
+ }
433
+
434
+ .select2-selection__clear {
435
+ margin-bottom: calc(#{$s2bs-padding-small-horizontal/2} + 2px);
436
+ }
437
+
438
+ .select2-selection__choice {
439
+ line-height: $s2bs-line-height;
440
+ margin: 0 $s2bs-padding-small-horizontal/2 $s2bs-padding-small-horizontal/2 0;
441
+ padding: 0 $s2bs-padding-small-horizontal;
442
+ }
443
+
444
+ .select2-search--inline {
445
+ margin-bottom: $s2bs-padding-small-horizontal/2;
446
+ .select2-search__field {
447
+ font-size: $s2bs-font-size-small;
448
+ }
449
+ }
450
+
451
+ .select2-selection__choice__remove {
452
+ margin-right: $s2bs-padding-small-horizontal / 2;
453
+ margin-left: -($s2bs-padding-small-horizontal / 2);
454
+ }
455
+ }
456
+
457
+ .select2-selection--single.input-lg,
458
+ .input-group-lg & .select2-selection--single,
459
+ .form-group-lg & .select2-selection--single {
460
+ @include border-radius($s2bs-border-radius-large);
461
+ font-size: $s2bs-font-size-large;
462
+ height: $s2bs-input-height-large;
463
+ line-height: $s2bs-line-height;
464
+ padding: $s2bs-padding-large-vertical ($s2bs-padding-large-horizontal + $s2bs-caret-padding) $s2bs-padding-large-vertical $s2bs-padding-large-horizontal;
465
+
466
+ .select2-selection__arrow {
467
+ b {
468
+ border-width: $s2bs-caret-width-large $s2bs-caret-width-large 0 $s2bs-caret-width-large;
469
+ }
470
+ }
471
+ }
472
+
473
+ .select2-selection--multiple.input-lg,
474
+ .input-group-lg & .select2-selection--multiple,
475
+ .form-group-lg & .select2-selection--multiple {
476
+ min-height: $s2bs-input-height-large;
477
+ @include border-radius($s2bs-border-radius-large);
478
+
479
+ .select2-selection__rendered
480
+ {
481
+ padding: $s2bs-padding-large-vertical $s2bs-padding-large-horizontal 0 $s2bs-padding-large-horizontal;
482
+ font-size: $s2bs-font-size-large;
483
+ }
484
+
485
+ .select2-selection__clear {
486
+ margin-bottom: calc(#{$s2bs-padding-large-horizontal/2} + 2px);
487
+ }
488
+
489
+ .select2-selection__choice {
490
+ font-size: $s2bs-font-size-large;
491
+ margin: 0 $s2bs-padding-large-horizontal/2 $s2bs-padding-large-horizontal/2 0;
492
+ padding: 0 $s2bs-padding-large-horizontal;
493
+
494
+ }
495
+
496
+ .select2-search--inline {
497
+ margin-bottom: $s2bs-padding-large-horizontal/2;
498
+ .select2-search__field {
499
+ font-size: $s2bs-font-size-large;
500
+ }
501
+ }
502
+
503
+ .select2-selection__choice__remove {
504
+ margin-right: $s2bs-padding-large-horizontal / 2;
505
+ margin-left: -($s2bs-padding-large-horizontal / 2);
506
+ }
507
+ }
508
+
509
+ .select2-selection.input-lg.select2-container--open {
510
+ @include dropdown-arrow;
511
+ }
512
+
513
+ &[dir="rtl"] {
514
+
515
+ .select2-selection--single {
516
+ padding-left: $s2bs-padding-base-horizontal + $s2bs-caret-padding;
517
+ padding-right: $s2bs-padding-base-horizontal;
518
+
519
+ .select2-selection__rendered {
520
+ padding-right: 0;
521
+ padding-left: 0;
522
+ text-align: right;
523
+ }
524
+
525
+ .select2-selection__clear {
526
+ float: left;
527
+ }
528
+
529
+ .select2-selection__arrow {
530
+ left: $s2bs-padding-base-horizontal;
531
+ right: auto;
532
+
533
+ b {
534
+ margin-left: 0;
535
+ }
536
+ }
537
+ }
538
+
539
+ .select2-selection--multiple {
540
+ .select2-selection__choice,
541
+ .select2-selection__placeholder,
542
+ .select2-search--inline {
543
+ float: right;
544
+ }
545
+
546
+ .select2-selection__choice {
547
+ margin-left: 0;
548
+ margin-right: $s2bs-padding-base-horizontal/2;
549
+ }
550
+
551
+ .select2-selection__choice__remove {
552
+ margin-left: 2px;
553
+ margin-right: auto;
554
+ }
555
+ }
556
+ }
557
+ }
558
+
559
+ .has-warning {
560
+ @include validation-state-focus($warning);
561
+ }
562
+
563
+ .has-error {
564
+ @include validation-state-focus($danger);
565
+ }
566
+
567
+ .has-success {
568
+ @include validation-state-focus($success);
569
+ }
570
+
571
+ .input-group > .select2-container--bootstrap4 {
572
+ display: table;
573
+ table-layout: fixed;
574
+ position: relative;
575
+ z-index: 2;
576
+ width: 100%;
577
+ margin-bottom: 0;
578
+
579
+ > .selection > .select2-selection.form-control {
580
+ float: none;
581
+ }
582
+
583
+ &.select2-container--open,
584
+ &.select2-container--focus{
585
+ z-index: 3;
586
+ }
587
+
588
+
589
+ &,
590
+ .input-group-btn,
591
+ .input-group-btn .btn {
592
+ vertical-align: top;
593
+ }
594
+ }
595
+
596
+ .input-group > .select2-hidden-accessible {
597
+ &:first-child + .select2-container--bootstrap4 > .selection > .select2-selection,
598
+ &:first-child + .select2-container--bootstrap4 > .selection > .select2-selection.form-control {
599
+ @include border-right-radius(0);
600
+ }
601
+
602
+ &:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection,
603
+ &:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection.form-control {
604
+ border-radius: 0;
605
+ }
606
+
607
+ &:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection,
608
+ &:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection.form-control {
609
+ @include border-left-radius(0);
610
+ }
611
+ }
612
+
613
+ .form-control.select2-hidden-accessible {
614
+ position: absolute !important;
615
+ width: 1px !important;
616
+ }
617
+
618
+ .form-inline .select2-container--bootstrap4 {
619
+ @include media-breakpoint-up(sm) {
620
+ display: inline-block;
621
+ }
622
+ }