activeadmin_addons_rails6 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +24 -0
  4. data/app/assets/images/fileicons/file_extension_3gp.png +0 -0
  5. data/app/assets/images/fileicons/file_extension_7z.png +0 -0
  6. data/app/assets/images/fileicons/file_extension_ace.png +0 -0
  7. data/app/assets/images/fileicons/file_extension_ai.png +0 -0
  8. data/app/assets/images/fileicons/file_extension_aif.png +0 -0
  9. data/app/assets/images/fileicons/file_extension_aiff.png +0 -0
  10. data/app/assets/images/fileicons/file_extension_amr.png +0 -0
  11. data/app/assets/images/fileicons/file_extension_asf.png +0 -0
  12. data/app/assets/images/fileicons/file_extension_asx.png +0 -0
  13. data/app/assets/images/fileicons/file_extension_bat.png +0 -0
  14. data/app/assets/images/fileicons/file_extension_bin.png +0 -0
  15. data/app/assets/images/fileicons/file_extension_bmp.png +0 -0
  16. data/app/assets/images/fileicons/file_extension_bup.png +0 -0
  17. data/app/assets/images/fileicons/file_extension_cab.png +0 -0
  18. data/app/assets/images/fileicons/file_extension_cbr.png +0 -0
  19. data/app/assets/images/fileicons/file_extension_cda.png +0 -0
  20. data/app/assets/images/fileicons/file_extension_cdl.png +0 -0
  21. data/app/assets/images/fileicons/file_extension_cdr.png +0 -0
  22. data/app/assets/images/fileicons/file_extension_chm.png +0 -0
  23. data/app/assets/images/fileicons/file_extension_dat.png +0 -0
  24. data/app/assets/images/fileicons/file_extension_divx.png +0 -0
  25. data/app/assets/images/fileicons/file_extension_dll.png +0 -0
  26. data/app/assets/images/fileicons/file_extension_dmg.png +0 -0
  27. data/app/assets/images/fileicons/file_extension_doc.png +0 -0
  28. data/app/assets/images/fileicons/file_extension_docx.png +0 -0
  29. data/app/assets/images/fileicons/file_extension_dss.png +0 -0
  30. data/app/assets/images/fileicons/file_extension_dvf.png +0 -0
  31. data/app/assets/images/fileicons/file_extension_dwg.png +0 -0
  32. data/app/assets/images/fileicons/file_extension_eml.png +0 -0
  33. data/app/assets/images/fileicons/file_extension_eps.png +0 -0
  34. data/app/assets/images/fileicons/file_extension_exe.png +0 -0
  35. data/app/assets/images/fileicons/file_extension_fla.png +0 -0
  36. data/app/assets/images/fileicons/file_extension_flv.png +0 -0
  37. data/app/assets/images/fileicons/file_extension_gif.png +0 -0
  38. data/app/assets/images/fileicons/file_extension_gz.png +0 -0
  39. data/app/assets/images/fileicons/file_extension_hqx.png +0 -0
  40. data/app/assets/images/fileicons/file_extension_htm.png +0 -0
  41. data/app/assets/images/fileicons/file_extension_html.png +0 -0
  42. data/app/assets/images/fileicons/file_extension_ifo.png +0 -0
  43. data/app/assets/images/fileicons/file_extension_indd.png +0 -0
  44. data/app/assets/images/fileicons/file_extension_iso.png +0 -0
  45. data/app/assets/images/fileicons/file_extension_jar.png +0 -0
  46. data/app/assets/images/fileicons/file_extension_jpeg.png +0 -0
  47. data/app/assets/images/fileicons/file_extension_jpg.png +0 -0
  48. data/app/assets/images/fileicons/file_extension_lnk.png +0 -0
  49. data/app/assets/images/fileicons/file_extension_log.png +0 -0
  50. data/app/assets/images/fileicons/file_extension_m4a.png +0 -0
  51. data/app/assets/images/fileicons/file_extension_m4b.png +0 -0
  52. data/app/assets/images/fileicons/file_extension_m4p.png +0 -0
  53. data/app/assets/images/fileicons/file_extension_m4v.png +0 -0
  54. data/app/assets/images/fileicons/file_extension_mcd.png +0 -0
  55. data/app/assets/images/fileicons/file_extension_mdb.png +0 -0
  56. data/app/assets/images/fileicons/file_extension_mid.png +0 -0
  57. data/app/assets/images/fileicons/file_extension_mov.png +0 -0
  58. data/app/assets/images/fileicons/file_extension_mp2.png +0 -0
  59. data/app/assets/images/fileicons/file_extension_mp3.png +0 -0
  60. data/app/assets/images/fileicons/file_extension_mp4.png +0 -0
  61. data/app/assets/images/fileicons/file_extension_mpeg.png +0 -0
  62. data/app/assets/images/fileicons/file_extension_mpg.png +0 -0
  63. data/app/assets/images/fileicons/file_extension_msi.png +0 -0
  64. data/app/assets/images/fileicons/file_extension_mswmm.png +0 -0
  65. data/app/assets/images/fileicons/file_extension_ogg.png +0 -0
  66. data/app/assets/images/fileicons/file_extension_pdf.png +0 -0
  67. data/app/assets/images/fileicons/file_extension_png.png +0 -0
  68. data/app/assets/images/fileicons/file_extension_pps.png +0 -0
  69. data/app/assets/images/fileicons/file_extension_ppt.png +0 -0
  70. data/app/assets/images/fileicons/file_extension_pptx.png +0 -0
  71. data/app/assets/images/fileicons/file_extension_ps.png +0 -0
  72. data/app/assets/images/fileicons/file_extension_psd.png +0 -0
  73. data/app/assets/images/fileicons/file_extension_pst.png +0 -0
  74. data/app/assets/images/fileicons/file_extension_ptb.png +0 -0
  75. data/app/assets/images/fileicons/file_extension_pub.png +0 -0
  76. data/app/assets/images/fileicons/file_extension_qbb.png +0 -0
  77. data/app/assets/images/fileicons/file_extension_qbw.png +0 -0
  78. data/app/assets/images/fileicons/file_extension_qxd.png +0 -0
  79. data/app/assets/images/fileicons/file_extension_ram.png +0 -0
  80. data/app/assets/images/fileicons/file_extension_rar.png +0 -0
  81. data/app/assets/images/fileicons/file_extension_rm.png +0 -0
  82. data/app/assets/images/fileicons/file_extension_rmvb.png +0 -0
  83. data/app/assets/images/fileicons/file_extension_rtf.png +0 -0
  84. data/app/assets/images/fileicons/file_extension_sea.png +0 -0
  85. data/app/assets/images/fileicons/file_extension_ses.png +0 -0
  86. data/app/assets/images/fileicons/file_extension_sit.png +0 -0
  87. data/app/assets/images/fileicons/file_extension_sitx.png +0 -0
  88. data/app/assets/images/fileicons/file_extension_ss.png +0 -0
  89. data/app/assets/images/fileicons/file_extension_swf.png +0 -0
  90. data/app/assets/images/fileicons/file_extension_tgz.png +0 -0
  91. data/app/assets/images/fileicons/file_extension_thm.png +0 -0
  92. data/app/assets/images/fileicons/file_extension_tif.png +0 -0
  93. data/app/assets/images/fileicons/file_extension_tmp.png +0 -0
  94. data/app/assets/images/fileicons/file_extension_torrent.png +0 -0
  95. data/app/assets/images/fileicons/file_extension_ttf.png +0 -0
  96. data/app/assets/images/fileicons/file_extension_txt.png +0 -0
  97. data/app/assets/images/fileicons/file_extension_unknown.png +0 -0
  98. data/app/assets/images/fileicons/file_extension_vcd.png +0 -0
  99. data/app/assets/images/fileicons/file_extension_vob.png +0 -0
  100. data/app/assets/images/fileicons/file_extension_wav.png +0 -0
  101. data/app/assets/images/fileicons/file_extension_wma.png +0 -0
  102. data/app/assets/images/fileicons/file_extension_wmv.png +0 -0
  103. data/app/assets/images/fileicons/file_extension_wps.png +0 -0
  104. data/app/assets/images/fileicons/file_extension_xls.png +0 -0
  105. data/app/assets/images/fileicons/file_extension_xlsx.png +0 -0
  106. data/app/assets/images/fileicons/file_extension_xpi.png +0 -0
  107. data/app/assets/images/fileicons/file_extension_zip.png +0 -0
  108. data/app/assets/images/material/icons/keyboard_arrow_down.svg +4 -0
  109. data/app/assets/images/material/icons/keyboard_arrow_left.svg +4 -0
  110. data/app/assets/images/material/icons/keyboard_arrow_right.svg +4 -0
  111. data/app/assets/images/material/icons/keyboard_arrow_up.svg +4 -0
  112. data/app/assets/images/material/icons/today.svg +4 -0
  113. data/app/assets/javascripts/activeadmin_addons/all.js +753 -0
  114. data/app/assets/stylesheets/activeadmin_addons/addons/interactive_select_tag.scss +30 -0
  115. data/app/assets/stylesheets/activeadmin_addons/addons/material-datepicker.scss +173 -0
  116. data/app/assets/stylesheets/activeadmin_addons/addons/material-toggle_bool.scss +52 -0
  117. data/app/assets/stylesheets/activeadmin_addons/addons/toggle_bool.scss +52 -0
  118. data/app/assets/stylesheets/activeadmin_addons/all.scss +19 -0
  119. data/app/assets/stylesheets/activeadmin_addons/imports/jquery-datepicker.scss +1 -0
  120. data/app/assets/stylesheets/activeadmin_addons/imports/webpack/jquery-datepicker.scss +1 -0
  121. data/app/assets/stylesheets/activeadmin_addons/inputs/color-picker.scss +4 -0
  122. data/app/assets/stylesheets/activeadmin_addons/inputs/date-time-picker.scss +5 -0
  123. data/app/assets/stylesheets/activeadmin_addons/inputs/numeric-range-filter.scss +12 -0
  124. data/app/assets/stylesheets/activeadmin_addons/inputs/select2.scss +3 -0
  125. data/app/assets/stylesheets/activeadmin_addons/inputs/selected-list.scss +27 -0
  126. data/app/assets/stylesheets/activeadmin_addons/material.scss +53 -0
  127. data/app/assets/stylesheets/activeadmin_addons/vendor/palette-color-picker.scss +155 -0
  128. data/app/inputs/active_admin/inputs/select_input.rb +11 -0
  129. data/app/inputs/ajax_filter_input.rb +6 -0
  130. data/app/inputs/color_picker_input.rb +37 -0
  131. data/app/inputs/date_range_input.rb +5 -0
  132. data/app/inputs/date_time_picker_input.rb +64 -0
  133. data/app/inputs/nested_level_input.rb +51 -0
  134. data/app/inputs/nested_select_input.rb +88 -0
  135. data/app/inputs/numeric_range_filter_input.rb +27 -0
  136. data/app/inputs/range_select_input.rb +6 -0
  137. data/app/inputs/search_select_filter_input.rb +12 -0
  138. data/app/inputs/search_select_input.rb +29 -0
  139. data/app/inputs/selected_list_input.rb +54 -0
  140. data/app/inputs/tags_input.rb +55 -0
  141. data/app/javascript/activeadmin_addons/addons/interactive_select_tag.js +95 -0
  142. data/app/javascript/activeadmin_addons/addons/toggle_bool.js +39 -0
  143. data/app/javascript/activeadmin_addons/all.js +14 -0
  144. data/app/javascript/activeadmin_addons/config.js +10 -0
  145. data/app/javascript/activeadmin_addons/inputs/color-picker.js +16 -0
  146. data/app/javascript/activeadmin_addons/inputs/date-time-picker.js +28 -0
  147. data/app/javascript/activeadmin_addons/inputs/nested-select.js +170 -0
  148. data/app/javascript/activeadmin_addons/inputs/search-select.js +76 -0
  149. data/app/javascript/activeadmin_addons/inputs/select2.js +52 -0
  150. data/app/javascript/activeadmin_addons/inputs/selected-list.js +107 -0
  151. data/app/javascript/activeadmin_addons/inputs/tags.js +76 -0
  152. data/app/javascript/activeadmin_addons/vendor/jquery_palette_color_picker/palette-color-picker.js +265 -0
  153. data/lib/activeadmin_addons.rb +27 -0
  154. data/lib/activeadmin_addons/active_admin_config.rb +9 -0
  155. data/lib/activeadmin_addons/addons/attachment_builder.rb +60 -0
  156. data/lib/activeadmin_addons/addons/bool_builder.rb +31 -0
  157. data/lib/activeadmin_addons/addons/image_builder.rb +12 -0
  158. data/lib/activeadmin_addons/addons/list_builder.rb +73 -0
  159. data/lib/activeadmin_addons/addons/number_builder.rb +25 -0
  160. data/lib/activeadmin_addons/addons/state_builder.rb +39 -0
  161. data/lib/activeadmin_addons/addons/tag_builder.rb +91 -0
  162. data/lib/activeadmin_addons/addons/toggle_bool_builder.rb +44 -0
  163. data/lib/activeadmin_addons/engine.rb +19 -0
  164. data/lib/activeadmin_addons/support/custom_builder.rb +91 -0
  165. data/lib/activeadmin_addons/support/enumerize_formtastic_support.rb +18 -0
  166. data/lib/activeadmin_addons/support/input_base.rb +53 -0
  167. data/lib/activeadmin_addons/support/input_helpers/filter_input.rb +8 -0
  168. data/lib/activeadmin_addons/support/input_helpers/filter_input_methods.rb +32 -0
  169. data/lib/activeadmin_addons/support/input_helpers/input_html_helpers.rb +43 -0
  170. data/lib/activeadmin_addons/support/input_helpers/input_methods.rb +67 -0
  171. data/lib/activeadmin_addons/support/input_helpers/input_options_handler.rb +90 -0
  172. data/lib/activeadmin_addons/support/input_helpers/select_helpers.rb +89 -0
  173. data/lib/activeadmin_addons/support/set_datepicker.rb +13 -0
  174. data/lib/activeadmin_addons/version.rb +3 -0
  175. data/lib/activeadmin_addons_rails_6.rb +5 -0
  176. data/lib/generators/activeadmin_addons/assets/assets_generator.rb +53 -0
  177. data/lib/generators/activeadmin_addons/install/install_generator.rb +19 -0
  178. data/lib/generators/activeadmin_addons/install/templates/initializer.rb +12 -0
  179. data/lib/generators/activeadmin_addons/webpacker/webpacker_generator.rb +35 -0
  180. data/lib/tasks/activeadmin_addons_tasks.rake +4 -0
  181. data/vendor/assets/select2/select2.css +481 -0
  182. data/vendor/assets/select2/select2.full.js +6820 -0
  183. metadata +544 -0
@@ -0,0 +1,76 @@
1
+ var initializer = function() {
2
+ setupSearchSelect(document);
3
+
4
+ $(document).on('has_many_add:after', function(event, container) {
5
+ setupSearchSelect(container);
6
+ });
7
+
8
+ function setupSearchSelect(container) {
9
+ $('.search-select-input, .search-select-filter-input, ajax-filter-input', container).each(function(i, el) {
10
+ var element = $(el);
11
+ var url = element.data('url');
12
+ var fields = element.data('fields');
13
+ var predicate = element.data('predicate');
14
+ var displayName = element.data('display-name');
15
+ var width = element.data('width');
16
+ var responseRoot = element.data('response-root');
17
+ var minimumInputLength = element.data('minimum-input-length');
18
+ var order = element.data('order');
19
+
20
+ var selectOptions = {
21
+ width: width,
22
+ minimumInputLength: minimumInputLength,
23
+ placeholder: '',
24
+ allowClear: true,
25
+ ajax: {
26
+ url: url,
27
+ dataType: 'json',
28
+ delay: 250,
29
+ cache: true,
30
+ data: function(params) {
31
+ var textQuery = { m: 'or' };
32
+ fields.forEach(function(field) {
33
+ if (field == 'id') {
34
+ textQuery[field + '_eq'] = params.term;
35
+ } else {
36
+ textQuery[field + '_' + predicate] = params.term;
37
+ }
38
+ });
39
+
40
+ var query = {
41
+ order: order,
42
+ q: {
43
+ groupings: [textQuery],
44
+ combinator: 'and',
45
+ },
46
+ };
47
+
48
+ return query;
49
+ },
50
+ processResults: function(data) {
51
+ if (data.constructor == Object) {
52
+ data = data[responseRoot];
53
+ }
54
+
55
+ return {
56
+ results: jQuery.map(data, function(resource) {
57
+ if (!resource[displayName]) {
58
+ resource[displayName] = 'No display name for id #' + resource.id.toString();
59
+ }
60
+ return {
61
+ id: resource.id,
62
+ text: resource[displayName].toString(),
63
+ };
64
+ }),
65
+ };
66
+ },
67
+ },
68
+ };
69
+
70
+ $(el).select2(selectOptions);
71
+ });
72
+ }
73
+ };
74
+
75
+ $(initializer);
76
+ $(document).on('turbolinks:load', initializer);
@@ -0,0 +1,52 @@
1
+ var initializer = function() {
2
+ configureSelect2(document);
3
+
4
+ $(document).on('has_many_add:after', function(event, container) {
5
+ configureSelect2(container);
6
+ });
7
+
8
+ function configureSelect2(container) {
9
+ if (window.ActiveadminAddons.config.defaultSelect == 'select2') {
10
+ $('select:not(.default-select)', container).each(function(i, el) {
11
+ setupSelect2(el);
12
+ });
13
+ }
14
+
15
+ $('select.select2', container).each(function(i, el) {
16
+ setupSelect2(el);
17
+ });
18
+
19
+ function setupSelect2(select) {
20
+ var selectConfig = {
21
+ placeholder: '',
22
+ width: '80%',
23
+ allowClear: true,
24
+ };
25
+
26
+ function isFilter(path) {
27
+ return $(select).closest(path).length > 0;
28
+ }
29
+
30
+ if (isFilter('.select_and_search')) {
31
+ selectConfig.width = 'resolve';
32
+ selectConfig.allowClear = false;
33
+ } else if (isFilter('.filter_select')) {
34
+ selectConfig.width = 'resolve';
35
+ }
36
+
37
+ $(select).select2(selectConfig);
38
+
39
+ // Related with https://github.com/select2/select2/issues/3320
40
+ $(select).on('select2:unselecting', function() {
41
+ $(this).data('unselecting', true);
42
+ }).on('select2:open', function() {
43
+ if ($(this).data('unselecting')) {
44
+ $(this).select2('close').removeData('unselecting');
45
+ }
46
+ });
47
+ }
48
+ }
49
+ };
50
+
51
+ $(initializer);
52
+ $(document).on('turbolinks:load', initializer);
@@ -0,0 +1,107 @@
1
+ var initializer = function() {
2
+ setupSelectedList(document);
3
+
4
+ $(document).on('has_many_add:after', function(event, container) {
5
+ setupSelectedList(container);
6
+ });
7
+
8
+ function setupSelectedList(container) {
9
+ $('.selected-list-container').click(function(event) {
10
+ var item = $(event.target);
11
+ if (item.hasClass('selected-item')) {
12
+ item.remove();
13
+ }
14
+ });
15
+
16
+ $('.selected-list-input', container).each(function(i, el) {
17
+ var element = $(el);
18
+ var url = element.data('url');
19
+ var fields = element.data('fields');
20
+ var predicate = element.data('predicate');
21
+ var displayName = element.data('display-name');
22
+ var method = element.data('method');
23
+ var model = element.data('model');
24
+ var prefix = model + '_' + method;
25
+ var responseRoot = element.data('response-root');
26
+ var minimumInputLength = element.data('minimum-input-length');
27
+ var order = element.data('order');
28
+
29
+ var selectOptions = {
30
+ minimumInputLength: minimumInputLength,
31
+ allowClear: true,
32
+ ajax: {
33
+ url: url,
34
+ dataType: 'json',
35
+ delay: 250,
36
+ cache: true,
37
+ data: function(params) {
38
+ var textQuery = { m: 'or' };
39
+ fields.forEach(function(field) {
40
+ textQuery[field + '_' + predicate] = params.term;
41
+ });
42
+
43
+ var query = {
44
+ order: order,
45
+ q: {
46
+ groupings: [textQuery],
47
+ combinator: 'and',
48
+ },
49
+ };
50
+
51
+ return query;
52
+ },
53
+ processResults: function(data) {
54
+ if (data.constructor == Object) {
55
+ data = data[responseRoot];
56
+ }
57
+
58
+ return {
59
+ results: jQuery.map(data, function(resource) {
60
+ return {
61
+ id: resource.id,
62
+ text: resource[displayName].toString(),
63
+ };
64
+ }),
65
+ };
66
+ },
67
+ },
68
+ };
69
+
70
+ $(el).on('select2:select', onItemSelected);
71
+ $(el).on('select2:close', onSelectClosed);
72
+ $(el).select2(selectOptions);
73
+
74
+ function onItemSelected(event) {
75
+ var data = event.params.data;
76
+ var selectedItemsContainer = $("[id='" + prefix + "_selected_values']");
77
+ var itemName = model + '[' + method + '][]';
78
+ var itemId = prefix + '_' + data.id;
79
+
80
+ if ($('#' + itemId).length > 0) {
81
+ return;
82
+ }
83
+
84
+ var item = $('<div>' + data.text + '</div>').attr({
85
+ class: 'selected-item',
86
+ id: itemId,
87
+ });
88
+
89
+ var hiddenInput = $('<input>').attr({
90
+ name: itemName,
91
+ type: 'hidden',
92
+ value: data.id,
93
+ });
94
+
95
+ item.appendTo(selectedItemsContainer);
96
+ hiddenInput.appendTo(item);
97
+ }
98
+
99
+ function onSelectClosed() {
100
+ $(el).val(null).trigger('change');
101
+ }
102
+ });
103
+ }
104
+ };
105
+
106
+ $(initializer);
107
+ $(document).on('turbolinks:load', initializer);
@@ -0,0 +1,76 @@
1
+ var initializer = function() {
2
+ setupTags(document);
3
+
4
+ $(document).on('has_many_add:after', function(event, container) {
5
+ setupTags(container);
6
+ });
7
+
8
+ function setupTags(container) {
9
+ $('.tags-input', container).each(function(i, el) {
10
+ var model = $(el).data('model');
11
+ var method = $(el).data('method');
12
+ var prefix = model + '_' + method;
13
+ var isRelation = !!$(el).data('relation');
14
+ var collection = $(el).data('collection');
15
+ var width = $(el).data('width');
16
+ var selectOptions = {
17
+ width: width,
18
+ multiple: true,
19
+ tags: true,
20
+ data: collection,
21
+ };
22
+
23
+ if (!!isRelation) {
24
+ selectOptions.createTag = function() {
25
+ return undefined;
26
+ };
27
+ }
28
+
29
+ $(el).on('select2:select', onItemAdded);
30
+ $(el).on('select2:unselect', onItemRemoved);
31
+ $(el).select2(selectOptions);
32
+
33
+ function getSelectedItems() {
34
+ var choices = $(el).parent('li.input').find('.select2-selection__choice');
35
+ return $.map(choices, function(item) {
36
+ return $(item).attr('title');
37
+ });
38
+ }
39
+
40
+ function fillHiddenInput() {
41
+ var hiddenInput = $('#' + prefix);
42
+ hiddenInput.val(getSelectedItems().join());
43
+ }
44
+
45
+ function onItemRemoved(event) {
46
+ if (isRelation) {
47
+ var itemId = '[id=\'' + prefix + '_' + event.params.data.id + '\']';
48
+ $(itemId).remove();
49
+ } else {
50
+ fillHiddenInput();
51
+ }
52
+ }
53
+
54
+ function onItemAdded(event) {
55
+ if (isRelation) {
56
+ var value = event.params.data.id;
57
+ var selectedItemsContainer = $("[id='" + prefix + "_selected_values']");
58
+ var itemName = model + '[' + method + '][]';
59
+ var itemId = prefix + '_' + value;
60
+
61
+ $('<input>').attr({
62
+ id: itemId,
63
+ name: itemName,
64
+ type: 'hidden',
65
+ value: value,
66
+ }).appendTo(selectedItemsContainer);
67
+ } else {
68
+ fillHiddenInput();
69
+ }
70
+ }
71
+ });
72
+ }
73
+ };
74
+
75
+ $(initializer);
76
+ $(document).on('turbolinks:load', initializer);
@@ -0,0 +1,265 @@
1
+ /*!
2
+ * JQuery Palette Color Picker v1.13 by Carlos Cabo ( @putuko )
3
+ * https://github.com/carloscabo/jquery-palette-color-picker
4
+ */
5
+ (function($) {
6
+ // La magia aquí
7
+ 'use strict';
8
+
9
+ // Public core
10
+ $.paletteColorPicker = function( el, options ) {
11
+ var
12
+ ns = 'palette-color-picker', // Base attr / class
13
+ $el = $(el),
14
+ plugin = this,
15
+ timer = null,
16
+ current_value = $el.val(),
17
+ target = $el.attr('name'),
18
+ $button = $('<div>')
19
+ .addClass(ns+'-button')
20
+ .attr('data-target', target),
21
+ $bubble = $('<div>')
22
+ .addClass(ns+'-bubble'),
23
+
24
+ // Final settings will be stored here
25
+ settings = {},
26
+
27
+ // Default settings
28
+ defaults = {
29
+ custom_class: null,
30
+ colors: null,
31
+ position: 'upside', // upside | downside
32
+ insert: 'before', // default
33
+ clear_btn: 'first', // default
34
+ timeout: 2000, // default
35
+ set_background: false, // default
36
+ close_all_but_this: false // default
37
+ },
38
+
39
+ click_handler = ('ontouchstart' in document.documentElement ? 'touchstart click' : 'click');
40
+
41
+ // Init
42
+ plugin.init = function() {
43
+ // Extand settings with user options
44
+ plugin.settings = $.extend({}, defaults, options);
45
+
46
+ // If input has not value add it
47
+ var
48
+ val = $el.attr('value');
49
+ if (typeof val === typeof undefined || val === false) {
50
+ val = '';
51
+ $el.attr('value', val);
52
+ }
53
+
54
+ // Backup initial value
55
+ $el.attr('data-initialvalue', $el.attr('value') );
56
+
57
+ // If color were not passed as options get them from data-palette attribute
58
+ if (plugin.settings.colors === null) {
59
+ plugin.settings.colors = $el.data('palette');
60
+ }
61
+
62
+ // If color is array of string, convert to obj
63
+ if (typeof plugin.settings.colors[0] === 'string') {
64
+ plugin.settings.colors = $.map(plugin.settings.colors, function(el, idx) {
65
+ var b = {}; b[el] = el; return b;
66
+ });
67
+ }
68
+
69
+ // Capitalize position
70
+ plugin.settings.insert = plugin.settings.insert.charAt(0).toUpperCase() + plugin.settings.insert.slice(1);
71
+
72
+ // Add custom_class
73
+ if (plugin.settings.custom_class) {
74
+ $bubble.addClass(plugin.settings.custom_class);
75
+ }
76
+
77
+ // Create color swatches
78
+ $.each( plugin.settings.colors, function( idx, obj ) {
79
+ var
80
+ key = Object.keys( obj )[0],
81
+ col = obj[key],
82
+ $sw = $('<span>').addClass('swatch')
83
+ .attr({
84
+ 'title': key,
85
+ 'data-color': col,
86
+ 'data-name': key
87
+ }).css('background-color', col);
88
+
89
+ if ( key === current_value ) {
90
+ $sw.addClass('active');
91
+ $button.css('background', col);
92
+ }
93
+
94
+ $sw.appendTo( $bubble );
95
+ });
96
+
97
+ // Create clear button if not null
98
+ if (plugin.settings.clear_btn !== null) {
99
+ var
100
+ $clear_btn = $('<span>').addClass('swatch clear').attr('title', 'Clear selection');
101
+ if (plugin.settings.clear_btn === 'last') {
102
+ $clear_btn.addClass('last').appendTo( $bubble );
103
+ } else {
104
+ $clear_btn.prependTo( $bubble );
105
+ }
106
+ }
107
+
108
+ // Public
109
+ plugin.destroy = function() {
110
+ $button.remove();
111
+ $.removeData( $el[0] );
112
+ };
113
+
114
+ // Clears all
115
+ plugin.clear = function() {
116
+ $bubble.find('.active').removeClass('active');
117
+ $button.removeAttr('style');
118
+ $el.val('');
119
+ };
120
+
121
+ // Reset to initial value
122
+ plugin.reset = function() {
123
+ // Dont had initial value
124
+ if ( $el.attr('data-initialvalue') === '' ) {
125
+ plugin.clear();
126
+ } else {
127
+ // Had initial value
128
+ var iv = $el.attr('data-initialvalue');
129
+ $bubble.find('[data-name="'+iv+'"]').trigger('click');
130
+ }
131
+ };
132
+
133
+ // reload value after it has been changed programatically
134
+ plugin.reload = function() {
135
+
136
+ var newVal = $el.val();
137
+ if ( newVal === '' || typeof newVal === typeof undefined || newVal === false ) {
138
+ // Doesn't have the value to load so loading initial value
139
+ plugin.reset();
140
+ } else {
141
+ // setting the value to new value
142
+ if($bubble.find('[data-name="'+newVal+'"]').length) {
143
+ // value will only be set if the color exists in options
144
+ $bubble.find('[data-name="'+newVal+'"]').trigger('click');
145
+ } else {
146
+ // setting to the initial value if color does not exists
147
+ plugin.reset();
148
+ }
149
+ }
150
+ };
151
+
152
+ // Events
153
+ // Simple click
154
+ $button.append( $bubble ).on( click_handler, function(e){
155
+ e.preventDefault();
156
+ e.stopPropagation();
157
+ var $b = $( this );
158
+
159
+ // don't close on clicking the bubble
160
+ if (!$(e.target).hasClass(ns+'-bubble')) {
161
+
162
+ // Call the callback, if set
163
+ if (typeof plugin.settings.onbeforeshow_callback === 'function') {
164
+ plugin.settings.onbeforeshow_callback(this);
165
+ }
166
+
167
+ $b.toggleClass('active');
168
+ var $current_bubble = $b.find('.'+ns+'-bubble');
169
+ // Forces hiding other bubbles
170
+ if (plugin.settings.close_all_but_this) {
171
+ $('.'+ns+'-bubble').not($current_bubble).fadeOut();
172
+ }
173
+ $current_bubble.fadeToggle();
174
+
175
+ if ($b.hasClass('active')) {
176
+ clearTimeout(plugin.timer);
177
+ plugin.timer = setTimeout(function(){
178
+ $b.trigger('pcp.fadeout');
179
+ }, plugin.settings.timeout);
180
+ }
181
+ }
182
+ })
183
+ // Fade timer
184
+ .on('pcp.fadeout', function() {
185
+ $( this ).removeClass('active').find('.'+ns+'-bubble').fadeOut();
186
+ })
187
+ // Enter bubble
188
+ .on('mouseenter', '.'+ns+'-bubble', function() {
189
+ clearTimeout(plugin.timer);
190
+ })
191
+ // Leave bubble
192
+ .on('mouseleave', '.'+ns+'-bubble', function() {
193
+ plugin.timer = setTimeout(function(){
194
+ $button.trigger('pcp.fadeout');
195
+ }, plugin.settings.timeout);
196
+ })
197
+ // Click on swatches
198
+ .on(click_handler, '.'+ns+'-bubble span.swatch', function(e){
199
+ e.preventDefault();
200
+ e.stopPropagation();
201
+ var
202
+ col = $( this ).attr('data-color'),
203
+ name = $( this ).attr('data-name'),
204
+ // Select all button in document with same data target to keep them synconized
205
+ $button = $('.'+ns+'-button[data-target="' + $( this ).closest( '.'+ns+'-button' ).attr('data-target') + '"]'),
206
+ $bubble = $( this ).closest( '.'+ns+'-bubble' );
207
+
208
+ // console.log('.'+ns+'-button [data-target="' + $( this ).closest( '.'+ns+'-button' ).attr('data-target') + '"]');
209
+ $bubble.find('.active').removeClass('active');
210
+
211
+ // Set background on color
212
+ // User clicked in the clear swatch
213
+ if ( $(e.target).is('.clear') ) {
214
+ $button.removeAttr('style');
215
+ col = '';
216
+ } else {
217
+ $(this).addClass('active');
218
+ $button.css('background', col);
219
+ }
220
+
221
+ // Call the callback, if set
222
+ if (typeof plugin.settings.onchange_callback === "function") {
223
+ plugin.settings.onchange_callback(col);
224
+ }
225
+
226
+ if( plugin.settings.set_background === false ) {
227
+ $('[name="' + $button.attr('data-target') + '"]').val(name);
228
+ } else {
229
+ $('[name="' + $button.attr('data-target') + '"]').css({'background-color' : col});
230
+ }
231
+ })['insert'+plugin.settings.insert]( $el );
232
+
233
+ // Upside / downside, default is upside
234
+ if ( plugin.settings.position === 'downside' || ($el.offset().top) + 20 < $bubble.outerHeight() ) {
235
+ $bubble.addClass('downside');
236
+ }
237
+
238
+ };
239
+
240
+ // Close on clicking outside the palette
241
+ $('body').on(click_handler,function(event) {
242
+ if (!$(event.target).hasClass(ns+'-button')) {
243
+ $( $button ).removeClass('active').find('.'+ns+'-bubble').fadeOut();
244
+ }
245
+ });
246
+
247
+ // Start
248
+ plugin.init();
249
+ };
250
+
251
+ // add the plugin to the jQuery.fn object
252
+ $.fn.paletteColorPicker = function(options) {
253
+ return this.each(function() {
254
+ if (typeof $(this).data('paletteColorPickerPlugin') === 'undefined') {
255
+ $(this).data('paletteColorPickerPlugin', new $.paletteColorPicker(this, options));
256
+ }
257
+ });
258
+ };
259
+
260
+ })(jQuery);
261
+
262
+ // Sample usage
263
+ // $(function() {
264
+ // $('[data-palette-color-picker]').paletteColorPicker();
265
+ // });