trestle 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/trestle/admin.js +11 -10
  3. data/app/assets/javascripts/trestle/{_confirmation.js → components/_confirmation.js} +1 -1
  4. data/app/assets/javascripts/trestle/{_datepicker.js → components/_datepicker.js} +4 -4
  5. data/app/assets/javascripts/trestle/components/_dialog.js +107 -0
  6. data/app/assets/javascripts/trestle/{_errors.js → components/_errors.js} +2 -2
  7. data/app/assets/javascripts/trestle/components/_form.js +48 -0
  8. data/app/assets/javascripts/trestle/{_gallery.js → components/_gallery.js} +3 -3
  9. data/app/assets/javascripts/trestle/{_select.js → components/_select.js} +2 -2
  10. data/app/assets/javascripts/trestle/{_sidebar.js → components/_sidebar.js} +3 -1
  11. data/app/assets/javascripts/trestle/{_table.js → components/_table.js} +1 -1
  12. data/app/assets/javascripts/trestle/components/_tabs.js +24 -0
  13. data/app/assets/javascripts/trestle/components/_tooltips.js +3 -0
  14. data/app/assets/javascripts/trestle/core/_contexts.js +13 -0
  15. data/app/assets/javascripts/trestle/{_cookies.js → core/_cookies.js} +2 -1
  16. data/app/assets/javascripts/trestle/core/_events.js +39 -0
  17. data/app/assets/javascripts/trestle/core/_visit.js +10 -0
  18. data/app/assets/stylesheets/trestle/components/_buttons.scss +9 -0
  19. data/app/assets/stylesheets/trestle/components/_modal.scss +92 -0
  20. data/app/assets/stylesheets/trestle/components/_navigation.scss +47 -12
  21. data/app/assets/stylesheets/trestle/components/_sidebar.scss +1 -0
  22. data/app/assets/stylesheets/trestle/core/_defaults.scss +5 -1
  23. data/app/controllers/trestle/application_controller.rb +5 -1
  24. data/app/helpers/trestle/dialog_helper.rb +7 -0
  25. data/app/helpers/trestle/form_helper.rb +7 -0
  26. data/app/helpers/trestle/url_helper.rb +34 -6
  27. data/app/views/layouts/trestle/admin.html.erb +1 -1
  28. data/app/views/trestle/application/_dialog.html.erb +36 -0
  29. data/app/views/trestle/application/_tabs.html.erb +7 -1
  30. data/app/views/trestle/resource/edit.html.erb +5 -5
  31. data/app/views/trestle/resource/index.html.erb +2 -2
  32. data/app/views/trestle/resource/new.html.erb +2 -2
  33. data/app/views/trestle/resource/show.html.erb +5 -5
  34. data/bower.json +1 -1
  35. data/config/locales/en.yml +25 -21
  36. data/config/locales/fr.rb +18 -0
  37. data/config/locales/fr.yml +69 -0
  38. data/config/locales/nl.yml +14 -14
  39. data/config/locales/pl.rb +18 -0
  40. data/config/locales/pl.yml +70 -0
  41. data/config/locales/pt-BR.yml +22 -22
  42. data/lib/generators/trestle/resource/templates/admin.rb.erb +1 -1
  43. data/lib/trestle/admin.rb +14 -1
  44. data/lib/trestle/admin/builder.rb +10 -2
  45. data/lib/trestle/breadcrumb.rb +13 -0
  46. data/lib/trestle/configuration.rb +6 -1
  47. data/lib/trestle/form.rb +7 -3
  48. data/lib/trestle/form/automatic.rb +1 -1
  49. data/lib/trestle/reloader.rb +1 -1
  50. data/lib/trestle/resource.rb +20 -5
  51. data/lib/trestle/resource/builder.rb +15 -0
  52. data/lib/trestle/resource/controller.rb +19 -6
  53. data/lib/trestle/table.rb +4 -0
  54. data/lib/trestle/table/actions_column.rb +9 -7
  55. data/lib/trestle/table/column.rb +3 -2
  56. data/lib/trestle/table/row.rb +7 -1
  57. data/lib/trestle/version.rb +1 -1
  58. data/trestle.gemspec +3 -3
  59. data/vendor/assets/bower_components/trestle/select2/dist/js/select2.full.js +90 -69
  60. metadata +30 -19
  61. data/app/assets/javascripts/trestle/_form.js +0 -6
  62. data/app/assets/javascripts/trestle/_tabs.js +0 -13
  63. data/app/assets/javascripts/trestle/_tooltips.js +0 -3
@@ -34,7 +34,7 @@ module Trestle
34
34
  end
35
35
 
36
36
  def load_paths
37
- ActiveSupport::Dependencies.autoload_paths.grep(/\/app\/admin\Z/)
37
+ Trestle.config.load_paths.map { |path| path.respond_to?(:call) ? path.call : path }.flatten.map(&:to_s)
38
38
  end
39
39
 
40
40
  private
@@ -5,6 +5,9 @@ module Trestle
5
5
  autoload :Builder
6
6
  autoload :Controller
7
7
 
8
+ RESOURCE_ACTIONS = [:index, :show, :new, :create, :edit, :update, :destroy]
9
+ READONLY_ACTIONS = [:index, :show]
10
+
8
11
  class << self
9
12
  def adapter
10
13
  @adapter ||= Trestle.config.default_adapter.new(self)
@@ -122,26 +125,38 @@ module Trestle
122
125
  @model_name ||= Trestle::ModelName.new(model)
123
126
  end
124
127
 
128
+ def actions
129
+ @actions ||= (readonly? ? READONLY_ACTIONS : RESOURCE_ACTIONS).dup
130
+ end
131
+
125
132
  def readonly?
126
133
  options[:readonly]
127
134
  end
128
135
 
129
- def breadcrumb
130
- Breadcrumb.new(model_name.plural.titleize, path)
136
+ def default_breadcrumb
137
+ Breadcrumb.new(I18n.t("admin.breadcrumbs.#{admin_name}", default: model_name.plural.titleize), path)
131
138
  end
132
139
 
133
140
  def routes
134
141
  admin = self
135
142
 
136
143
  Proc.new do
137
- resources admin.admin_name, controller: admin.controller_namespace, as: admin.route_name, path: admin.options[:path], except: admin.disabled_routes do
144
+ resources admin.admin_name, controller: admin.controller_namespace, as: admin.route_name, path: admin.options[:path], except: (RESOURCE_ACTIONS - admin.actions) do
138
145
  instance_exec(&admin.additional_routes) if admin.additional_routes
139
146
  end
140
147
  end
141
148
  end
142
149
 
143
- def disabled_routes
144
- readonly? ? [:new, :create, :edit, :update, :destroy] : []
150
+ def return_locations
151
+ @return_locations ||= {
152
+ create: Proc.new { |instance| path(:show, id: to_param(instance)) },
153
+ update: Proc.new { |instance| path(:show, id: to_param(instance)) },
154
+ destroy: Proc.new { path(:index) }
155
+ }
156
+ end
157
+
158
+ def return_location(action, instance=nil)
159
+ instance_exec(instance, &return_locations[action])
145
160
  end
146
161
 
147
162
  private
@@ -14,6 +14,13 @@ module Trestle
14
14
  admin.adapter = adapter
15
15
  end
16
16
 
17
+ def remove_action(*actions)
18
+ actions.each do |action|
19
+ controller.remove_possible_method(action.to_sym)
20
+ admin.actions.delete(action.to_sym)
21
+ end
22
+ end
23
+
17
24
  def collection(&block)
18
25
  admin.collection = block
19
26
  end
@@ -83,6 +90,14 @@ module Trestle
83
90
 
84
91
  admin.scopes[name] = Scope.new(admin, name, options, &(scope || block))
85
92
  end
93
+
94
+ def return_to(options={}, &block)
95
+ actions = options.key?(:on) ? Array(options[:on]) : [:create, :update, :destroy]
96
+
97
+ actions.each do |action|
98
+ admin.return_locations[action.to_sym] = block
99
+ end
100
+ end
86
101
  end
87
102
  end
88
103
  end
@@ -1,12 +1,15 @@
1
1
  module Trestle
2
2
  class Resource
3
3
  class Controller < Admin::Controller
4
+ after_action :set_trestle_location_header
5
+
4
6
  def index
5
7
  self.collection = admin.prepare_collection(params)
6
8
 
7
9
  respond_to do |format|
8
10
  format.html
9
11
  format.json { render json: collection }
12
+ format.js
10
13
  end
11
14
  end
12
15
 
@@ -16,6 +19,7 @@ module Trestle
16
19
  respond_to do |format|
17
20
  format.html
18
21
  format.json { render json: instance }
22
+ format.js
19
23
  end
20
24
  end
21
25
 
@@ -26,7 +30,7 @@ module Trestle
26
30
  respond_to do |format|
27
31
  format.html do
28
32
  flash[:message] = flash_message("success.create", default: "The %{lowercase_model_name} was successfully created.")
29
- redirect_to action: :show, id: admin.to_param(instance)
33
+ redirect_to(admin.return_location(:create, instance), turbolinks: false)
30
34
  end
31
35
  format.json { render json: instance, status: :created, location: { action: :show, id: admin.to_param(instance) } }
32
36
  format.js
@@ -35,9 +39,10 @@ module Trestle
35
39
  respond_to do |format|
36
40
  format.html do
37
41
  flash.now[:error] = flash_message("failure.create", default: "Please correct the errors below.")
38
- render "new"
42
+ render "new", status: :unprocessable_entity
39
43
  end
40
44
  format.json { render json: instance.errors, status: :unprocessable_entity }
45
+ format.js
41
46
  end
42
47
  end
43
48
  end
@@ -48,6 +53,7 @@ module Trestle
48
53
  respond_to do |format|
49
54
  format.html
50
55
  format.json { render json: instance }
56
+ format.js
51
57
  end
52
58
  end
53
59
 
@@ -63,7 +69,7 @@ module Trestle
63
69
  respond_to do |format|
64
70
  format.html do
65
71
  flash[:message] = flash_message("success.update", default: "The %{lowercase_model_name} was successfully updated.")
66
- redirect_to action: :show, id: admin.to_param(instance)
72
+ redirect_to(admin.return_location(:update, instance), turbolinks: false)
67
73
  end
68
74
  format.json { render json: instance, status: :ok }
69
75
  format.js
@@ -72,9 +78,10 @@ module Trestle
72
78
  respond_to do |format|
73
79
  format.html do
74
80
  flash.now[:error] = flash_message("failure.update", default: "Please correct the errors below.")
75
- render "show"
81
+ render "show", status: :unprocessable_entity
76
82
  end
77
83
  format.json { render json: instance.errors, status: :unprocessable_entity }
84
+ format.js
78
85
  end
79
86
  end
80
87
  end
@@ -87,14 +94,14 @@ module Trestle
87
94
  format.html do
88
95
  if success
89
96
  flash[:message] = flash_message("success.destroy", default: "The %{lowercase_model_name} was successfully deleted.")
90
- redirect_to action: :index
97
+ redirect_to admin.return_location(:destroy)
91
98
  else
92
99
  flash[:error] = flash_message("failure.destroy", default: "Could not delete %{lowercase_model_name}.")
93
100
 
94
101
  if self.instance = admin.find_instance(params)
95
102
  redirect_to action: :show, id: admin.to_param(instance)
96
103
  else
97
- redirect_to action: :index
104
+ redirect_to admin.return_location(:destroy)
98
105
  end
99
106
  end
100
107
  end
@@ -113,6 +120,12 @@ module Trestle
113
120
  def flash_message(type, options={})
114
121
  t("trestle.flash.#{type}", options.merge(model_name: admin.model_name, lowercase_model_name: admin.model_name.downcase))
115
122
  end
123
+
124
+ def set_trestle_location_header
125
+ unless request.headers["X-Trestle-Dialog"]
126
+ headers["X-Trestle-Location"] = request.path
127
+ end
128
+ end
116
129
  end
117
130
  end
118
131
  end
@@ -23,6 +23,10 @@ module Trestle
23
23
  options[:sortable] == true
24
24
  end
25
25
 
26
+ def autolink?
27
+ options[:autolink] != false
28
+ end
29
+
26
30
  def renderer(template)
27
31
  Renderer.new(self, template)
28
32
  end
@@ -13,8 +13,10 @@ module Trestle
13
13
  end
14
14
 
15
15
  def default_actions
16
+ admin = table.admin
17
+
16
18
  ->(action) do
17
- action.delete
19
+ action.delete if admin && admin.actions.include?(:destroy)
18
20
  end
19
21
  end
20
22
 
@@ -23,29 +25,29 @@ module Trestle
23
25
 
24
26
  delegate :table, to: :@column
25
27
 
26
- delegate :icon, :admin_url_for, :concat, :link_to, to: :@template
28
+ delegate :concat, :icon, :link_to, :admin_url_for, :admin_link_to, to: :@template
27
29
 
28
30
  def initialize(column, template, instance)
29
31
  @column, @template, @instance = column, template, instance
30
32
  end
31
33
 
32
34
  def show
33
- button(icon("fa fa-info"), admin_url_for(instance, admin: table.admin, action: :show), class: "btn-info")
35
+ button(icon("fa fa-info"), instance, action: :show, class: "btn-info")
34
36
  end
35
37
 
36
38
  def edit
37
- button(icon("fa fa-pencil"), admin_url_for(instance, admin: table.admin, action: :edit), class: "btn-warning")
39
+ button(icon("fa fa-pencil"), instance, action: :edit, class: "btn-warning")
38
40
  end
39
41
 
40
42
  def delete
41
- button(icon("fa fa-trash"), admin_url_for(instance, admin: table.admin, action: :destroy), method: :delete, class: "btn-danger", data: { toggle: "confirm-delete", placement: "left" })
43
+ button(icon("fa fa-trash"), instance, action: :destroy, method: :delete, class: "btn-danger", data: { toggle: "confirm-delete", placement: "left" })
42
44
  end
43
45
 
44
- def button(content, url, options={})
46
+ def button(content, instance_or_url, options={})
45
47
  options[:class] = Array(options[:class])
46
48
  options[:class] << "btn" unless options[:class].include?("btn")
47
49
 
48
- concat link_to(content, url, options)
50
+ concat admin_link_to(content, instance_or_url, options.reverse_merge(admin: table.admin))
49
51
  end
50
52
  alias_method :link, :button
51
53
  end
@@ -39,7 +39,7 @@ module Trestle
39
39
  end
40
40
 
41
41
  class Renderer
42
- delegate :options, to: :@column
42
+ delegate :options, :table, to: :@column
43
43
 
44
44
  def initialize(column, template)
45
45
  @column, @template = column, template
@@ -58,11 +58,12 @@ module Trestle
58
58
  content = @template.format_value(value, options)
59
59
 
60
60
  if value.respond_to?(:id) && options[:link] != false
61
+ # Column value was a model instance (e.g. from an association).
61
62
  # Automatically link to instance's admin if available
62
63
  content = @template.admin_link_to(content, value)
63
64
  elsif options[:link]
64
65
  # Explicitly link to the specified admin, or the table's admin
65
- content = @template.admin_link_to(content, instance, admin: options[:admin] || @column.table.admin)
66
+ content = @template.admin_link_to(content, instance, admin: options[:admin] || table.admin)
66
67
  end
67
68
 
68
69
  content
@@ -21,9 +21,15 @@ module Trestle
21
21
 
22
22
  def options(instance)
23
23
  options = Trestle::Options.new
24
- options.merge!(data: { url: admin_url_for(instance) }) if table.admin
24
+
25
+ if table.admin && table.autolink?
26
+ options.merge!(data: { url: admin_url_for(instance) })
27
+ options.merge!(data: { behavior: "dialog" }) if table.admin.form.dialog?
28
+ end
29
+
25
30
  options.merge!(@row.options)
26
31
  options.merge!(@template.instance_exec(instance, &@row.block)) if @row.block
32
+
27
33
  options
28
34
  end
29
35
 
@@ -1,3 +1,3 @@
1
1
  module Trestle
2
- VERSION = "0.8.5"
2
+ VERSION = "0.8.6"
3
3
  end
@@ -35,9 +35,9 @@ Gem::Specification.new do |spec|
35
35
 
36
36
  spec.add_dependency "railties", ">= 4.2.0"
37
37
  spec.add_dependency "activemodel", ">= 4.2.0"
38
- spec.add_dependency "sass-rails", "~> 5.0.6"
39
- spec.add_dependency "autoprefixer-rails", "~> 7.1.2"
40
- spec.add_dependency "kaminari", "~> 1.0.1"
38
+ spec.add_dependency "sass-rails", ">= 5.0.6"
39
+ spec.add_dependency "autoprefixer-rails", ">= 7.1.2"
40
+ spec.add_dependency "kaminari", "~> 1.1.0"
41
41
 
42
42
  spec.add_development_dependency "bundler", "~> 1.12"
43
43
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Select2 4.0.3
2
+ * Select2 4.0.5
3
3
  * https://select2.github.io
4
4
  *
5
5
  * Released under the MIT license
@@ -9,19 +9,33 @@
9
9
  if (typeof define === 'function' && define.amd) {
10
10
  // AMD. Register as an anonymous module.
11
11
  define(['jquery'], factory);
12
- } else if (typeof exports === 'object') {
12
+ } else if (typeof module === 'object' && module.exports) {
13
13
  // Node/CommonJS
14
- factory(require('jquery'));
14
+ module.exports = function (root, jQuery) {
15
+ if (jQuery === undefined) {
16
+ // require('jQuery') returns a factory that requires window to
17
+ // build a jQuery instance, we normalize how we use modules
18
+ // that require this pattern but the window provided is a noop
19
+ // if it's defined (how jquery works)
20
+ if (typeof window !== 'undefined') {
21
+ jQuery = require('jquery');
22
+ }
23
+ else {
24
+ jQuery = require('jquery')(root);
25
+ }
26
+ }
27
+ factory(jQuery);
28
+ return jQuery;
29
+ };
15
30
  } else {
16
31
  // Browser globals
17
32
  factory(jQuery);
18
33
  }
19
- }(function (jQuery) {
34
+ } (function (jQuery) {
20
35
  // This is needed so we can catch the AMD loader configuration and use it
21
36
  // The inner file should be wrapped (by `banner.start.js`) in a function that
22
37
  // returns the AMD loader references.
23
- var S2 =
24
- (function () {
38
+ var S2 =(function () {
25
39
  // Restore the Select2 AMD loader so it can be used
26
40
  // Needed mostly in the language files, where the loader is not inserted
27
41
  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
@@ -30,13 +44,11 @@
30
44
  var S2;(function () { if (!S2 || !S2.requirejs) {
31
45
  if (!S2) { S2 = {}; } else { require = S2; }
32
46
  /**
33
- * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
34
- * Available via the MIT or new BSD license.
35
- * see: http://github.com/jrburke/almond for details
47
+ * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
48
+ * Released under MIT license, http://github.com/requirejs/almond/LICENSE
36
49
  */
37
50
  //Going sloppy to avoid 'use strict' string cost, but strict practices should
38
51
  //be followed.
39
- /*jslint sloppy: true */
40
52
  /*global setTimeout: false */
41
53
 
42
54
  var requirejs, require, define;
@@ -64,60 +76,58 @@ var requirejs, require, define;
64
76
  */
65
77
  function normalize(name, baseName) {
66
78
  var nameParts, nameSegment, mapValue, foundMap, lastIndex,
67
- foundI, foundStarMap, starI, i, j, part,
79
+ foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
68
80
  baseParts = baseName && baseName.split("/"),
69
81
  map = config.map,
70
82
  starMap = (map && map['*']) || {};
71
83
 
72
84
  //Adjust any relative paths.
73
- if (name && name.charAt(0) === ".") {
74
- //If have a base name, try to normalize against it,
75
- //otherwise, assume it is a top-level require that will
76
- //be relative to baseUrl in the end.
77
- if (baseName) {
78
- name = name.split('/');
79
- lastIndex = name.length - 1;
80
-
81
- // Node .js allowance:
82
- if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
83
- name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
84
- }
85
+ if (name) {
86
+ name = name.split('/');
87
+ lastIndex = name.length - 1;
88
+
89
+ // If wanting node ID compatibility, strip .js from end
90
+ // of IDs. Have to do this here, and not in nameToUrl
91
+ // because node allows either .js or non .js to map
92
+ // to same file.
93
+ if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
94
+ name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
95
+ }
85
96
 
86
- //Lop off the last part of baseParts, so that . matches the
87
- //"directory" and not name of the baseName's module. For instance,
88
- //baseName of "one/two/three", maps to "one/two/three.js", but we
89
- //want the directory, "one/two" for this normalization.
90
- name = baseParts.slice(0, baseParts.length - 1).concat(name);
91
-
92
- //start trimDots
93
- for (i = 0; i < name.length; i += 1) {
94
- part = name[i];
95
- if (part === ".") {
96
- name.splice(i, 1);
97
- i -= 1;
98
- } else if (part === "..") {
99
- if (i === 1 && (name[2] === '..' || name[0] === '..')) {
100
- //End of the line. Keep at least one non-dot
101
- //path segment at the front so it can be mapped
102
- //correctly to disk. Otherwise, there is likely
103
- //no path mapping for a path starting with '..'.
104
- //This can still fail, but catches the most reasonable
105
- //uses of ..
106
- break;
107
- } else if (i > 0) {
108
- name.splice(i - 1, 2);
109
- i -= 2;
110
- }
97
+ // Starts with a '.' so need the baseName
98
+ if (name[0].charAt(0) === '.' && baseParts) {
99
+ //Convert baseName to array, and lop off the last part,
100
+ //so that . matches that 'directory' and not name of the baseName's
101
+ //module. For instance, baseName of 'one/two/three', maps to
102
+ //'one/two/three.js', but we want the directory, 'one/two' for
103
+ //this normalization.
104
+ normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
105
+ name = normalizedBaseParts.concat(name);
106
+ }
107
+
108
+ //start trimDots
109
+ for (i = 0; i < name.length; i++) {
110
+ part = name[i];
111
+ if (part === '.') {
112
+ name.splice(i, 1);
113
+ i -= 1;
114
+ } else if (part === '..') {
115
+ // If at the start, or previous value is still ..,
116
+ // keep them so that when converted to a path it may
117
+ // still work when converted to a path, even though
118
+ // as an ID it is less than ideal. In larger point
119
+ // releases, may be better to just kick out an error.
120
+ if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
121
+ continue;
122
+ } else if (i > 0) {
123
+ name.splice(i - 1, 2);
124
+ i -= 2;
111
125
  }
112
126
  }
113
- //end trimDots
114
-
115
- name = name.join("/");
116
- } else if (name.indexOf('./') === 0) {
117
- // No baseName, so this is ID is resolved relative
118
- // to baseUrl, pull off the leading dot.
119
- name = name.substring(2);
120
127
  }
128
+ //end trimDots
129
+
130
+ name = name.join('/');
121
131
  }
122
132
 
123
133
  //Apply map config if available.
@@ -230,32 +240,39 @@ var requirejs, require, define;
230
240
  return [prefix, name];
231
241
  }
232
242
 
243
+ //Creates a parts array for a relName where first part is plugin ID,
244
+ //second part is resource ID. Assumes relName has already been normalized.
245
+ function makeRelParts(relName) {
246
+ return relName ? splitPrefix(relName) : [];
247
+ }
248
+
233
249
  /**
234
250
  * Makes a name map, normalizing the name, and using a plugin
235
251
  * for normalization if necessary. Grabs a ref to plugin
236
252
  * too, as an optimization.
237
253
  */
238
- makeMap = function (name, relName) {
254
+ makeMap = function (name, relParts) {
239
255
  var plugin,
240
256
  parts = splitPrefix(name),
241
- prefix = parts[0];
257
+ prefix = parts[0],
258
+ relResourceName = relParts[1];
242
259
 
243
260
  name = parts[1];
244
261
 
245
262
  if (prefix) {
246
- prefix = normalize(prefix, relName);
263
+ prefix = normalize(prefix, relResourceName);
247
264
  plugin = callDep(prefix);
248
265
  }
249
266
 
250
267
  //Normalize according
251
268
  if (prefix) {
252
269
  if (plugin && plugin.normalize) {
253
- name = plugin.normalize(name, makeNormalize(relName));
270
+ name = plugin.normalize(name, makeNormalize(relResourceName));
254
271
  } else {
255
- name = normalize(name, relName);
272
+ name = normalize(name, relResourceName);
256
273
  }
257
274
  } else {
258
- name = normalize(name, relName);
275
+ name = normalize(name, relResourceName);
259
276
  parts = splitPrefix(name);
260
277
  prefix = parts[0];
261
278
  name = parts[1];
@@ -302,13 +319,14 @@ var requirejs, require, define;
302
319
  };
303
320
 
304
321
  main = function (name, deps, callback, relName) {
305
- var cjsModule, depName, ret, map, i,
322
+ var cjsModule, depName, ret, map, i, relParts,
306
323
  args = [],
307
324
  callbackType = typeof callback,
308
325
  usingExports;
309
326
 
310
327
  //Use name if no relName
311
328
  relName = relName || name;
329
+ relParts = makeRelParts(relName);
312
330
 
313
331
  //Call the callback to define the module, if necessary.
314
332
  if (callbackType === 'undefined' || callbackType === 'function') {
@@ -317,7 +335,7 @@ var requirejs, require, define;
317
335
  //Default to [require, exports, module] if no deps
318
336
  deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
319
337
  for (i = 0; i < deps.length; i += 1) {
320
- map = makeMap(deps[i], relName);
338
+ map = makeMap(deps[i], relParts);
321
339
  depName = map.f;
322
340
 
323
341
  //Fast path CommonJS standard dependencies.
@@ -373,7 +391,7 @@ var requirejs, require, define;
373
391
  //deps arg is the module name, and second arg (if passed)
374
392
  //is just the relName.
375
393
  //Normalize module name, if it contains . or ..
376
- return callDep(makeMap(deps, callback).f);
394
+ return callDep(makeMap(deps, makeRelParts(callback)).f);
377
395
  } else if (!deps.splice) {
378
396
  //deps is a config object, not an array.
379
397
  config = deps;
@@ -1837,7 +1855,7 @@ S2.define('select2/selection/search',[
1837
1855
  var $search = $(
1838
1856
  '<li class="select2-search select2-search--inline">' +
1839
1857
  '<input class="select2-search__field" type="search" tabindex="-1"' +
1840
- ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
1858
+ ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
1841
1859
  ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
1842
1860
  '</li>'
1843
1861
  );
@@ -3191,7 +3209,7 @@ S2.define('select2/data/select',[
3191
3209
  }
3192
3210
  }
3193
3211
 
3194
- if (data.id) {
3212
+ if (data.id !== undefined) {
3195
3213
  option.value = data.id;
3196
3214
  }
3197
3215
 
@@ -3550,7 +3568,10 @@ S2.define('select2/data/tags',[
3550
3568
  }, true)
3551
3569
  );
3552
3570
 
3553
- var checkText = option.text === params.term;
3571
+ var optionText = (option.text || '').toUpperCase();
3572
+ var paramsTerm = (params.term || '').toUpperCase();
3573
+
3574
+ var checkText = optionText === paramsTerm;
3554
3575
 
3555
3576
  if (checkText || checkChildren) {
3556
3577
  if (child) {
@@ -3888,7 +3909,7 @@ S2.define('select2/dropdown/search',[
3888
3909
  var $search = $(
3889
3910
  '<span class="select2-search select2-search--dropdown">' +
3890
3911
  '<input class="select2-search__field" type="search" tabindex="-1"' +
3891
- ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
3912
+ ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
3892
3913
  ' spellcheck="false" role="textbox" />' +
3893
3914
  '</span>'
3894
3915
  );
@@ -3941,7 +3962,7 @@ S2.define('select2/dropdown/search',[
3941
3962
  });
3942
3963
 
3943
3964
  container.on('focus', function () {
3944
- if (container.isOpen()) {
3965
+ if (!container.isOpen()) {
3945
3966
  self.$search.focus();
3946
3967
  }
3947
3968
  });