activeadmin_addons 1.10.0 → 2.0.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -17
  3. data/app/inputs/active_admin/inputs/select_input.rb +9 -5
  4. data/app/inputs/nested_level_input.rb +13 -7
  5. data/app/inputs/nested_select_input.rb +19 -13
  6. data/app/inputs/search_select_filter_input.rb +15 -1
  7. data/app/inputs/search_select_input.rb +6 -5
  8. data/app/inputs/tags_input.rb +5 -34
  9. data/app/javascript/activeadmin_addons/addons/slim-select-interactive-tag.js +78 -0
  10. data/app/javascript/activeadmin_addons/all.js +2 -7
  11. data/app/javascript/activeadmin_addons/config.js +8 -5
  12. data/app/javascript/activeadmin_addons/inputs/slim-select-nested.js +95 -0
  13. data/app/javascript/activeadmin_addons/inputs/slim-select-search.js +37 -0
  14. data/app/javascript/activeadmin_addons/inputs/slim-select-selected-list.js +103 -0
  15. data/app/javascript/activeadmin_addons/inputs/slim-select-simple-tags.js +22 -0
  16. data/app/javascript/activeadmin_addons/inputs/slim-select-tags.js +28 -0
  17. data/app/javascript/activeadmin_addons/inputs/slim-select-utils.js +70 -0
  18. data/app/javascript/activeadmin_addons/inputs/slim-select.js +93 -0
  19. data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/all.scss +4 -10
  20. data/app/javascript/activeadmin_addons/stylesheets/imports/slimselect.css +1 -0
  21. data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/inputs/selected-list.scss +0 -1
  22. data/app/javascript/activeadmin_addons/stylesheets/inputs/slim-select.scss +9 -0
  23. data/lib/activeadmin_addons/addons/image_builder.rb +2 -9
  24. data/lib/activeadmin_addons/addons/state_builder.rb +1 -0
  25. data/lib/activeadmin_addons/addons/tag_builder.rb +3 -22
  26. data/lib/activeadmin_addons/engine.rb +1 -6
  27. data/lib/activeadmin_addons/support/custom_builder.rb +1 -1
  28. data/lib/activeadmin_addons/support/input_base.rb +0 -42
  29. data/lib/activeadmin_addons/support/input_helpers/filter_input_methods.rb +1 -0
  30. data/lib/activeadmin_addons/support/input_helpers/input_html_helpers.rb +42 -0
  31. data/lib/activeadmin_addons/support/input_helpers/select_helpers.rb +10 -12
  32. data/lib/activeadmin_addons/support/select_filter_input_extension.rb +1 -3
  33. data/lib/activeadmin_addons/support/select_input_base.rb +11 -0
  34. data/lib/activeadmin_addons/version.rb +1 -1
  35. data/lib/activeadmin_addons.rb +4 -1
  36. data/lib/generators/activeadmin_addons/install/install_generator.rb +2 -1
  37. data/lib/generators/activeadmin_addons/install/templates/initializer.rb +2 -2
  38. data/lib/generators/activeadmin_addons/webpacker/webpacker_generator.rb +3 -6
  39. metadata +82 -196
  40. data/app/assets/images/fileicons/file_extension_3gp.png +0 -0
  41. data/app/assets/images/fileicons/file_extension_7z.png +0 -0
  42. data/app/assets/images/fileicons/file_extension_ace.png +0 -0
  43. data/app/assets/images/fileicons/file_extension_ai.png +0 -0
  44. data/app/assets/images/fileicons/file_extension_aif.png +0 -0
  45. data/app/assets/images/fileicons/file_extension_aiff.png +0 -0
  46. data/app/assets/images/fileicons/file_extension_amr.png +0 -0
  47. data/app/assets/images/fileicons/file_extension_asf.png +0 -0
  48. data/app/assets/images/fileicons/file_extension_asx.png +0 -0
  49. data/app/assets/images/fileicons/file_extension_bat.png +0 -0
  50. data/app/assets/images/fileicons/file_extension_bin.png +0 -0
  51. data/app/assets/images/fileicons/file_extension_bmp.png +0 -0
  52. data/app/assets/images/fileicons/file_extension_bup.png +0 -0
  53. data/app/assets/images/fileicons/file_extension_cab.png +0 -0
  54. data/app/assets/images/fileicons/file_extension_cbr.png +0 -0
  55. data/app/assets/images/fileicons/file_extension_cda.png +0 -0
  56. data/app/assets/images/fileicons/file_extension_cdl.png +0 -0
  57. data/app/assets/images/fileicons/file_extension_cdr.png +0 -0
  58. data/app/assets/images/fileicons/file_extension_chm.png +0 -0
  59. data/app/assets/images/fileicons/file_extension_dat.png +0 -0
  60. data/app/assets/images/fileicons/file_extension_divx.png +0 -0
  61. data/app/assets/images/fileicons/file_extension_dll.png +0 -0
  62. data/app/assets/images/fileicons/file_extension_dmg.png +0 -0
  63. data/app/assets/images/fileicons/file_extension_doc.png +0 -0
  64. data/app/assets/images/fileicons/file_extension_docx.png +0 -0
  65. data/app/assets/images/fileicons/file_extension_dss.png +0 -0
  66. data/app/assets/images/fileicons/file_extension_dvf.png +0 -0
  67. data/app/assets/images/fileicons/file_extension_dwg.png +0 -0
  68. data/app/assets/images/fileicons/file_extension_eml.png +0 -0
  69. data/app/assets/images/fileicons/file_extension_eps.png +0 -0
  70. data/app/assets/images/fileicons/file_extension_exe.png +0 -0
  71. data/app/assets/images/fileicons/file_extension_fla.png +0 -0
  72. data/app/assets/images/fileicons/file_extension_flv.png +0 -0
  73. data/app/assets/images/fileicons/file_extension_gif.png +0 -0
  74. data/app/assets/images/fileicons/file_extension_gz.png +0 -0
  75. data/app/assets/images/fileicons/file_extension_hqx.png +0 -0
  76. data/app/assets/images/fileicons/file_extension_htm.png +0 -0
  77. data/app/assets/images/fileicons/file_extension_html.png +0 -0
  78. data/app/assets/images/fileicons/file_extension_ifo.png +0 -0
  79. data/app/assets/images/fileicons/file_extension_indd.png +0 -0
  80. data/app/assets/images/fileicons/file_extension_iso.png +0 -0
  81. data/app/assets/images/fileicons/file_extension_jar.png +0 -0
  82. data/app/assets/images/fileicons/file_extension_jpeg.png +0 -0
  83. data/app/assets/images/fileicons/file_extension_jpg.png +0 -0
  84. data/app/assets/images/fileicons/file_extension_lnk.png +0 -0
  85. data/app/assets/images/fileicons/file_extension_log.png +0 -0
  86. data/app/assets/images/fileicons/file_extension_m4a.png +0 -0
  87. data/app/assets/images/fileicons/file_extension_m4b.png +0 -0
  88. data/app/assets/images/fileicons/file_extension_m4p.png +0 -0
  89. data/app/assets/images/fileicons/file_extension_m4v.png +0 -0
  90. data/app/assets/images/fileicons/file_extension_mcd.png +0 -0
  91. data/app/assets/images/fileicons/file_extension_mdb.png +0 -0
  92. data/app/assets/images/fileicons/file_extension_mid.png +0 -0
  93. data/app/assets/images/fileicons/file_extension_mov.png +0 -0
  94. data/app/assets/images/fileicons/file_extension_mp2.png +0 -0
  95. data/app/assets/images/fileicons/file_extension_mp3.png +0 -0
  96. data/app/assets/images/fileicons/file_extension_mp4.png +0 -0
  97. data/app/assets/images/fileicons/file_extension_mpeg.png +0 -0
  98. data/app/assets/images/fileicons/file_extension_mpg.png +0 -0
  99. data/app/assets/images/fileicons/file_extension_msi.png +0 -0
  100. data/app/assets/images/fileicons/file_extension_mswmm.png +0 -0
  101. data/app/assets/images/fileicons/file_extension_ogg.png +0 -0
  102. data/app/assets/images/fileicons/file_extension_pdf.png +0 -0
  103. data/app/assets/images/fileicons/file_extension_png.png +0 -0
  104. data/app/assets/images/fileicons/file_extension_pps.png +0 -0
  105. data/app/assets/images/fileicons/file_extension_ppt.png +0 -0
  106. data/app/assets/images/fileicons/file_extension_pptx.png +0 -0
  107. data/app/assets/images/fileicons/file_extension_ps.png +0 -0
  108. data/app/assets/images/fileicons/file_extension_psd.png +0 -0
  109. data/app/assets/images/fileicons/file_extension_pst.png +0 -0
  110. data/app/assets/images/fileicons/file_extension_ptb.png +0 -0
  111. data/app/assets/images/fileicons/file_extension_pub.png +0 -0
  112. data/app/assets/images/fileicons/file_extension_qbb.png +0 -0
  113. data/app/assets/images/fileicons/file_extension_qbw.png +0 -0
  114. data/app/assets/images/fileicons/file_extension_qxd.png +0 -0
  115. data/app/assets/images/fileicons/file_extension_ram.png +0 -0
  116. data/app/assets/images/fileicons/file_extension_rar.png +0 -0
  117. data/app/assets/images/fileicons/file_extension_rm.png +0 -0
  118. data/app/assets/images/fileicons/file_extension_rmvb.png +0 -0
  119. data/app/assets/images/fileicons/file_extension_rtf.png +0 -0
  120. data/app/assets/images/fileicons/file_extension_sea.png +0 -0
  121. data/app/assets/images/fileicons/file_extension_ses.png +0 -0
  122. data/app/assets/images/fileicons/file_extension_sit.png +0 -0
  123. data/app/assets/images/fileicons/file_extension_sitx.png +0 -0
  124. data/app/assets/images/fileicons/file_extension_ss.png +0 -0
  125. data/app/assets/images/fileicons/file_extension_swf.png +0 -0
  126. data/app/assets/images/fileicons/file_extension_tgz.png +0 -0
  127. data/app/assets/images/fileicons/file_extension_thm.png +0 -0
  128. data/app/assets/images/fileicons/file_extension_tif.png +0 -0
  129. data/app/assets/images/fileicons/file_extension_tmp.png +0 -0
  130. data/app/assets/images/fileicons/file_extension_torrent.png +0 -0
  131. data/app/assets/images/fileicons/file_extension_ttf.png +0 -0
  132. data/app/assets/images/fileicons/file_extension_txt.png +0 -0
  133. data/app/assets/images/fileicons/file_extension_unknown.png +0 -0
  134. data/app/assets/images/fileicons/file_extension_vcd.png +0 -0
  135. data/app/assets/images/fileicons/file_extension_vob.png +0 -0
  136. data/app/assets/images/fileicons/file_extension_wav.png +0 -0
  137. data/app/assets/images/fileicons/file_extension_wma.png +0 -0
  138. data/app/assets/images/fileicons/file_extension_wmv.png +0 -0
  139. data/app/assets/images/fileicons/file_extension_wps.png +0 -0
  140. data/app/assets/images/fileicons/file_extension_xls.png +0 -0
  141. data/app/assets/images/fileicons/file_extension_xlsx.png +0 -0
  142. data/app/assets/images/fileicons/file_extension_xpi.png +0 -0
  143. data/app/assets/images/fileicons/file_extension_zip.png +0 -0
  144. data/app/assets/images/material/icons/keyboard_arrow_down.svg +0 -4
  145. data/app/assets/images/material/icons/keyboard_arrow_left.svg +0 -4
  146. data/app/assets/images/material/icons/keyboard_arrow_right.svg +0 -4
  147. data/app/assets/images/material/icons/keyboard_arrow_up.svg +0 -4
  148. data/app/assets/images/material/icons/today.svg +0 -4
  149. data/app/assets/javascripts/activeadmin_addons/all.js +0 -753
  150. data/app/assets/stylesheets/activeadmin_addons/addons/material-datepicker.scss +0 -173
  151. data/app/assets/stylesheets/activeadmin_addons/addons/material-toggle_bool.scss +0 -52
  152. data/app/assets/stylesheets/activeadmin_addons/inputs/select2.scss +0 -3
  153. data/app/assets/stylesheets/activeadmin_addons/material.scss +0 -53
  154. data/app/javascript/activeadmin_addons/addons/interactive_select_tag.js +0 -95
  155. data/app/javascript/activeadmin_addons/inputs/nested-select.js +0 -170
  156. data/app/javascript/activeadmin_addons/inputs/search-select.js +0 -76
  157. data/app/javascript/activeadmin_addons/inputs/select2.js +0 -52
  158. data/app/javascript/activeadmin_addons/inputs/selected-list.js +0 -107
  159. data/app/javascript/activeadmin_addons/inputs/tags.js +0 -76
  160. data/lib/activeadmin_addons/addons/attachment_builder.rb +0 -60
  161. data/lib/activeadmin_addons/support/enumerize_formtastic_support.rb +0 -18
  162. data/lib/generators/activeadmin_addons/assets/assets_generator.rb +0 -53
  163. data/vendor/assets/select2/select2.css +0 -481
  164. data/vendor/assets/select2/select2.full.js +0 -6820
  165. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/addons/interactive_select_tag.scss +0 -0
  166. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/addons/toggle_bool.scss +0 -0
  167. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/imports/jquery-datepicker.scss +0 -0
  168. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/inputs/color-picker.scss +0 -0
  169. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/inputs/date-time-picker-filter.scss +0 -0
  170. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/inputs/date-time-picker.scss +0 -0
  171. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/inputs/numeric-range-filter.scss +0 -0
  172. /data/app/{assets/stylesheets/activeadmin_addons → javascript/activeadmin_addons/stylesheets}/vendor/palette-color-picker.scss +0 -0
@@ -0,0 +1,28 @@
1
+ const classes = ['tags-input'];
2
+
3
+ // eslint-disable-next-line max-statements
4
+ function settings(el) {
5
+ const isRelation = el.dataset.relation === 'true';
6
+ const collection = el.dataset.collection ? JSON.parse(el.dataset.collection) : null;
7
+
8
+ const parsedCollection = collection && collection.map((item) => {
9
+ const { id, ...rest } = item;
10
+
11
+ return { ...rest, value: id, selected: !!item.selected };
12
+ });
13
+
14
+ const events = {};
15
+ if (!isRelation) {
16
+ events.addable = (value) => value;
17
+ }
18
+
19
+ return {
20
+ data: parsedCollection,
21
+ events,
22
+ };
23
+ }
24
+
25
+ export {
26
+ settings,
27
+ classes,
28
+ };
@@ -0,0 +1,70 @@
1
+ import merge from 'lodash.merge';
2
+
3
+ function parseObjectToQuery(obj, prefix) {
4
+ let queryArray = [];
5
+ Object.keys(obj).forEach(key => {
6
+ const value = obj[key];
7
+ const prefixedKey = prefix ? `${prefix}[${key}]` : key;
8
+ if (Array.isArray(value)) {
9
+ value.forEach((v, i) => {
10
+ queryArray = [...queryArray, parseObjectToQuery(v, `${prefixedKey}[${i}]`)];
11
+ });
12
+ } else if (typeof value === 'object') {
13
+ queryArray = [...queryArray, parseObjectToQuery(value, prefixedKey)];
14
+ } else {
15
+ queryArray.push(`${prefixedKey}=${encodeURIComponent(value)}`);
16
+ }
17
+ });
18
+
19
+ return queryArray.join('&');
20
+ }
21
+
22
+ export function ransackSearch(search, currentData, settings) {
23
+ return new Promise((resolve, reject) => {
24
+ if (search.length < settings.minimumInputLength) {
25
+ reject(`Please enter ${settings.minimumInputLength} or more characters`);
26
+ }
27
+
28
+ const defaultQuery = {
29
+ order: settings.order,
30
+ q: {
31
+ groupings: [settings.textQuery],
32
+ combinator: 'and',
33
+ },
34
+ };
35
+
36
+ const finalQuery = merge({}, defaultQuery, settings.query);
37
+ const csrfTokenEl = document.querySelector('meta[name="csrf-token"]');
38
+ const csrfToken = csrfTokenEl ? csrfTokenEl.getAttribute('content') : null;
39
+
40
+ const queryString = parseObjectToQuery(finalQuery);
41
+ fetch(`${settings.url}?${queryString}`, {
42
+ method: 'GET',
43
+ headers: {
44
+ 'X-CSRF-TOKEN': csrfToken,
45
+ 'Accept': 'application/json',
46
+ 'Content-Type': 'application/json',
47
+ },
48
+ })
49
+ .then((response) => response.json())
50
+ .then((res) => {
51
+ let data = res;
52
+ if (data.constructor === Object) {
53
+ data = data[settings.responseRoot];
54
+ }
55
+
56
+ const options = data.map(resource => {
57
+ if (!resource[settings.displayName]) {
58
+ resource[settings.displayName] = `No display name for id #${resource.id.toString()}`;
59
+ }
60
+
61
+ return {
62
+ value: resource.id,
63
+ text: resource[settings.displayName],
64
+ };
65
+ });
66
+
67
+ resolve(options);
68
+ });
69
+ });
70
+ }
@@ -0,0 +1,93 @@
1
+ import SlimSelect from 'slim-select';
2
+ import merge from 'lodash.merge';
3
+
4
+ import * as searchSelect from './slim-select-search';
5
+ import * as simpleTagsSelect from './slim-select-simple-tags';
6
+ import * as nestedSelect from './slim-select-nested';
7
+ import * as selectedListSelect from './slim-select-selected-list';
8
+ import * as tagsSelect from './slim-select-tags';
9
+
10
+ const SELECT_CLASS = 'select:not(.default-select)';
11
+ const SLIM_SELECT_CLASS = 'select.slim-select';
12
+
13
+ const selectTypes = {
14
+ searchSelect,
15
+ simpleTagsSelect,
16
+ nestedSelect,
17
+ selectedListSelect,
18
+ tagsSelect,
19
+ };
20
+
21
+ // eslint-disable-next-line max-statements, complexity
22
+ function setupSelect(el) {
23
+ let settings = {
24
+ select: el,
25
+ settings: {
26
+ allowDeselect: true,
27
+ placeholderText: 'Select Value',
28
+ },
29
+ };
30
+
31
+ const selectStyles = window.getComputedStyle(el);
32
+ el.style.width = el.dataset.width;
33
+ el.style.fontSize = selectStyles.fontSize;
34
+
35
+ const searchSelectFilter = el.closest('.filter_form_field');
36
+ if (searchSelectFilter) {
37
+ if (searchSelectFilter.classList.contains('search_select_filter') ||
38
+ searchSelectFilter.classList.contains('filter_string')) {
39
+ settings.settings.allowDeselect = false;
40
+ }
41
+
42
+ if (el.options.length > 0) {
43
+ el.style.width = el.dataset.width || selectStyles.width;
44
+ if (selectStyles.display === 'inline-block') {
45
+ el.style.display = 'inline-flex';
46
+ }
47
+ }
48
+ }
49
+
50
+ const emptyOption = el.querySelector('option[value=""]');
51
+ if (!emptyOption) {
52
+ el.insertAdjacentHTML('afterbegin', '<option value=""></option>');
53
+ }
54
+ el.querySelector('option[value=""]').dataset.placeholder = true;
55
+
56
+ Object.keys(selectTypes).forEach((type) => {
57
+ if (selectTypes[type].classes.some((className) => el.classList.contains(className))) {
58
+ settings = merge({}, settings, selectTypes[type].settings(el));
59
+ if (selectTypes[type].init) {
60
+ selectTypes[type].init(el);
61
+ }
62
+ }
63
+ });
64
+
65
+ // eslint-disable-next-line no-new
66
+ new SlimSelect(settings);
67
+ }
68
+
69
+ function initSelects(node = document) {
70
+ if (document.querySelector('body').dataset.defaultSelect === 'slim-select') {
71
+ node.querySelectorAll(SELECT_CLASS).forEach(setupSelect);
72
+ }
73
+
74
+ node.querySelectorAll(SLIM_SELECT_CLASS).forEach(setupSelect);
75
+ }
76
+
77
+ // mutation observer to add slim select to new elements
78
+ const observer = new MutationObserver((mutations) => {
79
+ mutations.forEach((mutation) => {
80
+ if (mutation.type === 'childList') {
81
+ mutation.addedNodes.forEach((node) => {
82
+ if (node instanceof Element) {
83
+ initSelects(node);
84
+ }
85
+ });
86
+ }
87
+ });
88
+ });
89
+
90
+ window.addEventListener('load', () => {
91
+ initSelects();
92
+ observer.observe(document.querySelector('body'), { attributes: false, childList: true, subtree: true });
93
+ });
@@ -1,20 +1,14 @@
1
- @import 'select2';
2
1
  @import 'imports/jquery-datepicker';
3
2
  @import 'vendor/palette-color-picker';
3
+ @import 'imports/slimselect';
4
+
5
+ $error-color: #932419;
4
6
 
5
7
  @import 'inputs/numeric-range-filter';
6
8
  @import 'inputs/date-time-picker-filter';
7
9
  @import 'inputs/color-picker';
8
10
  @import 'inputs/date-time-picker';
9
- @import 'inputs/select2';
10
11
  @import 'inputs/selected-list';
12
+ @import 'inputs/slim-select';
11
13
  @import 'addons/toggle_bool';
12
14
  @import 'addons/interactive_select_tag';
13
-
14
- $error-color: #932419;
15
-
16
- li.error {
17
- .select2-selection {
18
- border-color: $error-color;
19
- }
20
- }
@@ -0,0 +1 @@
1
+ :root{--ss-primary-color: #5897fb;--ss-bg-color: #ffffff;--ss-font-color: #4d4d4d;--ss-font-placeholder-color: #8d8d8d;--ss-disabled-color: #dcdee2;--ss-border-color: #dcdee2;--ss-highlight-color: #fffb8c;--ss-success-color: #00b755;--ss-error-color: #dc3545;--ss-main-height: 30px;--ss-content-height: 300px;--ss-spacing-l: 7px;--ss-spacing-m: 5px;--ss-spacing-s: 3px;--ss-animation-timing: 0.2s;--ss-border-radius: 4px}@keyframes ss-valueIn{0%{transform:scale(0);opacity:0}100%{transform:scale(1);opacity:1}}@keyframes ss-valueOut{0%{transform:scale(1);opacity:1}100%{transform:scale(0);opacity:0}}.ss-hide{display:none !important}.ss-main{display:flex;flex-direction:row;position:relative;user-select:none;color:var(--ss-font-color);min-height:var(--ss-main-height);width:100%;padding:var(--ss-spacing-s);cursor:pointer;border:1px solid var(--ss-border-color);border-radius:var(--ss-border-radius);background-color:var(--ss-bg-color);outline:0;box-sizing:border-box;transition:background-color var(--ss-animation-timing)}.ss-main:focus{box-shadow:0 0 5px var(--ss-primary-color)}.ss-main.ss-disabled{background-color:var(--ss-disabled-color);cursor:not-allowed}.ss-main.ss-disabled .ss-values .ss-disabled{color:var(--ss-font-color)}.ss-main.ss-disabled .ss-values .ss-value .ss-value-delete{cursor:not-allowed}.ss-main.ss-open-above{border-top-left-radius:0px;border-top-right-radius:0px}.ss-main.ss-open-below{border-bottom-left-radius:0px;border-bottom-right-radius:0px}.ss-main .ss-values{display:inline-flex;flex-wrap:wrap;gap:var(--ss-spacing-m);flex:1 1 100%}.ss-main .ss-values .ss-placeholder{display:flex;padding:var(--ss-spacing-s) var(--ss-spacing-m) var(--ss-spacing-s) var(--ss-spacing-m);margin:auto 0px auto 0px;line-height:1em;align-items:center;width:100%;color:var(--ss-font-placeholder-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss-main .ss-values .ss-max{display:flex;user-select:none;align-items:center;width:fit-content;font-size:12px;color:var(--ss-bg-color);line-height:1;padding:var(--ss-spacing-s) var(--ss-spacing-m);background-color:var(--ss-primary-color);border-radius:var(--ss-border-radius)}.ss-main .ss-values .ss-single{display:flex;margin:auto 0px auto var(--ss-spacing-s)}.ss-main .ss-values .ss-value{display:flex;user-select:none;align-items:center;width:fit-content;background-color:var(--ss-primary-color);border-radius:var(--ss-border-radius);animation-name:ss-valueIn;animation-duration:var(--ss-animation-timing);animation-timing-function:ease-out;animation-fill-mode:both}.ss-main .ss-values .ss-value.ss-value-out{animation-name:ss-valueOut;animation-duration:var(--ss-animation-timing);animation-timing-function:ease-out}.ss-main .ss-values .ss-value .ss-value-text{font-size:12px;color:var(--ss-bg-color);line-height:1;padding:var(--ss-spacing-s) var(--ss-spacing-m)}.ss-main .ss-values .ss-value .ss-value-delete{display:flex;align-items:center;height:var(--ss-spacing-l);width:var(--ss-spacing-l);padding:var(--ss-spacing-s) var(--ss-spacing-m);cursor:pointer;border-left:solid 1px var(--ss-bg-color)}.ss-main .ss-values .ss-value .ss-value-delete svg{height:var(--ss-spacing-l);width:var(--ss-spacing-l)}.ss-main .ss-values .ss-value .ss-value-delete svg path{fill:none;stroke:var(--ss-bg-color);stroke-width:18;stroke-linecap:round;stroke-linejoin:round}.ss-main .ss-deselect{display:flex;align-self:center;justify-content:flex-end;flex:0 1 auto;width:8px;height:8px;margin:0 var(--ss-spacing-m) 0 var(--ss-spacing-m)}.ss-main .ss-deselect svg{width:8px;height:8px}.ss-main .ss-deselect svg path{fill:none;stroke:var(--ss-font-color);stroke-width:20;stroke-linecap:round;stroke-linejoin:round}.ss-main .ss-arrow{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;width:12px;height:12px;margin:auto var(--ss-spacing-m) auto var(--ss-spacing-m)}.ss-main .ss-arrow path{fill:none;stroke:var(--ss-font-color);stroke-width:18;stroke-linecap:round;stroke-linejoin:round;transition-timing-function:ease-out;transition:var(--ss-animation-timing)}.ss-content{position:absolute;display:flex;height:auto;flex-direction:column;width:auto;max-height:var(--ss-content-height);box-sizing:border-box;border:solid 1px var(--ss-border-color);background-color:var(--ss-bg-color);transition:transform var(--ss-animation-timing),opacity var(--ss-animation-timing);opacity:0;transform:scaleY(0);transform-origin:center top;overflow:hidden;z-index:10000}.ss-content.ss-relative{position:relative;height:100%}.ss-content.ss-open-above{flex-direction:column-reverse;opacity:1;transform:scaleY(1);transform-origin:center bottom;border-top-left-radius:var(--ss-border-radius);border-top-right-radius:var(--ss-border-radius)}.ss-content.ss-open-below{opacity:1;transform:scaleY(1);transform-origin:center top;border-bottom-left-radius:var(--ss-border-radius);border-bottom-right-radius:var(--ss-border-radius)}.ss-content .ss-search{flex:0 1 auto;display:flex;flex-direction:row;padding:var(--ss-spacing-l) var(--ss-spacing-l) var(--ss-spacing-m) var(--ss-spacing-l)}.ss-content .ss-search input{display:inline-flex;font-size:inherit;line-height:inherit;flex:1 1 auto;width:100%;min-width:0px;padding:var(--ss-spacing-m) var(--ss-spacing-l);margin:0;border:1px solid var(--ss-border-color);border-radius:var(--ss-border-radius);background-color:var(--ss-bg-color);outline:0;text-align:left;box-sizing:border-box}.ss-content .ss-search input::placeholder{color:var(--ss-font-placeholder-color);vertical-align:middle}.ss-content .ss-search input:focus{box-shadow:0 0 5px var(--ss-primary-color)}.ss-content .ss-search .ss-addable{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;flex:0 0 auto;height:auto;margin:0 0 0 var(--ss-spacing-m);border:1px solid var(--ss-border-color);border-radius:var(--ss-border-radius)}.ss-content .ss-search .ss-addable svg{display:flex;align-items:center;justify-content:flex-end;flex:0 1 auto;width:12px;height:12px;margin:auto var(--ss-spacing-m) auto var(--ss-spacing-m)}.ss-content .ss-search .ss-addable svg path{fill:none;stroke:var(--ss-font-color);stroke-width:18;stroke-linecap:round;stroke-linejoin:round}.ss-content .ss-list{flex:1 1 auto;height:auto;overflow-x:hidden;overflow-y:auto}.ss-content .ss-list .ss-error{color:var(--ss-error-color);padding:var(--ss-spacing-l)}.ss-content .ss-list .ss-searching{color:var(--ss-font-color);padding:var(--ss-spacing-l)}.ss-content .ss-list .ss-optgroup.ss-close .ss-option{display:none !important}.ss-content .ss-list .ss-optgroup .ss-optgroup-label{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:var(--ss-spacing-m) var(--ss-spacing-l) var(--ss-spacing-m) var(--ss-spacing-l)}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-label-text{flex:1 1 auto;font-weight:bold;color:var(--ss-font-color)}.ss-content .ss-list .ss-optgroup .ss-optgroup-label:has(.ss-arrow){cursor:pointer}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions{flex:0 1 auto;display:flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--ss-spacing-m)}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall{flex:0 0 auto;display:flex;flex-direction:row;cursor:pointer}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall:hover{opacity:.5}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall.ss-selected svg path{stroke:var(--ss-error-color)}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall span{flex:0 1 auto;display:flex;align-items:center;justify-content:center;font-size:60%;text-align:center;padding:0 var(--ss-spacing-s) 0 0}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg{flex:0 1 auto;width:13px;height:13px}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg path{fill:none;stroke:var(--ss-success-color);stroke-linecap:round;stroke-linejoin:round}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg:first-child{stroke-width:5}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-selectall svg:last-child{stroke-width:11}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable{flex:0 1 auto;display:flex;flex-direction:row;cursor:pointer}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable .ss-arrow{flex:1 1 auto;width:10px;height:10px}.ss-content .ss-list .ss-optgroup .ss-optgroup-label .ss-optgroup-actions .ss-closable .ss-arrow path{fill:none;stroke:var(--ss-font-color);stroke-width:18;stroke-linecap:round;stroke-linejoin:round;transition-timing-function:ease-out;transition:var(--ss-animation-timing)}.ss-content .ss-list .ss-optgroup .ss-option{padding:var(--ss-spacing-s) var(--ss-spacing-s) var(--ss-spacing-s) calc(var(--ss-spacing-l)*3)}.ss-content .ss-list .ss-option{display:flex;padding:var(--ss-spacing-m) var(--ss-spacing-l) var(--ss-spacing-m) var(--ss-spacing-l);color:var(--ss-font-color);cursor:pointer;user-select:none}.ss-content .ss-list .ss-option:hover{color:var(--ss-bg-color);background-color:var(--ss-primary-color)}.ss-content .ss-list .ss-option.ss-highlighted,.ss-content .ss-list .ss-option:not(.ss-disabled).ss-selected{color:var(--ss-bg-color);background-color:var(--ss-primary-color)}.ss-content .ss-list .ss-option.ss-disabled{cursor:not-allowed;background-color:var(--ss-disabled-color)}.ss-content .ss-list .ss-option.ss-disabled:hover{color:var(--ss-font-color)}.ss-content .ss-list .ss-option .ss-search-highlight{background-color:var(--ss-highlight-color)}
@@ -3,7 +3,6 @@ $selected-list-btn-hover-color: #333;
3
3
 
4
4
  .selected-list-container {
5
5
  display: inline-block;
6
- width: 80%;
7
6
 
8
7
  .selected-item {
9
8
  height: 25px;
@@ -0,0 +1,9 @@
1
+ .ss-main {
2
+ width: auto;
3
+ }
4
+
5
+ li.error {
6
+ .ss-main {
7
+ border-color: $error-color;
8
+ }
9
+ }
@@ -3,22 +3,15 @@ module ActiveAdminAddons
3
3
  def render
4
4
  return nil if data.nil?
5
5
 
6
- if Object.const_defined?('Paperclip::Attachment') && data.is_a?(Paperclip::Attachment)
7
- paperclip_data
8
- elsif Object.const_defined?('Shrine::UploadedFile') && data.is_a?(Shrine::UploadedFile)
6
+ if Object.const_defined?('Shrine::UploadedFile') && data.is_a?(Shrine::UploadedFile)
9
7
  shrine_data
10
8
  else
11
- raise "you need to pass a paperclip or shrine image attribute"
9
+ raise "you need to pass a shrine image attribute"
12
10
  end
13
11
  end
14
12
 
15
13
  private
16
14
 
17
- def paperclip_data
18
- style = options.fetch(:style, :original)
19
- context.image_tag(data.url(style)) if data.file?
20
- end
21
-
22
15
  def shrine_data
23
16
  image_options = options[:image_options].presence || {}
24
17
  if options[:style] && derivatives.include?(options[:style])
@@ -11,6 +11,7 @@ module ActiveAdminAddons
11
11
  def render
12
12
  raise "you need to install AASM gem first" unless defined? AASM
13
13
  raise "the #{attribute} is not an AASM state" unless state_attribute?
14
+
14
15
  context.status_tag(model.aasm(machine_name).human_state, class: status_class_for_model)
15
16
  end
16
17
 
@@ -1,13 +1,8 @@
1
1
  module ActiveAdminAddons
2
2
  class TagBuilder < CustomBuilder
3
3
  def render
4
- @enum_attr = if enumerize_attr?
5
- :enumerize
6
- elsif rails_enum_attr?
7
- :enum
8
- end
4
+ raise "you need to pass an enum attribute" unless rails_enum_attr?
9
5
 
10
- raise "you need to pass an enumerize or enum attribute" unless @enum_attr
11
6
  append_tag
12
7
  end
13
8
 
@@ -36,11 +31,7 @@ module ActiveAdminAddons
36
31
  end
37
32
 
38
33
  def display_data
39
- if @enum_attr == :enumerize
40
- data.text
41
- else
42
- EnumUtils.translate_enum_option(model.class, attribute.to_s, data)
43
- end
34
+ EnumUtils.translate_enum_option(model.class, attribute.to_s, data)
44
35
  end
45
36
 
46
37
  def interactive_params(klass)
@@ -72,17 +63,7 @@ module ActiveAdminAddons
72
63
 
73
64
  def possible_values
74
65
  klass = model.class
75
- if @enum_attr == :enumerize
76
- klass.enumerized_attributes[attribute.to_s].values.map { |value| [value.capitalize, value] }
77
- else
78
- EnumUtils.options_for_select(klass, attribute.to_s)
79
- end
80
- end
81
-
82
- def enumerize_attr?
83
- data.is_a?("Enumerize::Value".constantize)
84
- rescue NameError
85
- false
66
+ EnumUtils.options_for_select(klass, attribute.to_s)
86
67
  end
87
68
 
88
69
  def rails_enum_attr?
@@ -1,18 +1,13 @@
1
1
  module ActiveAdminAddons
2
2
  module Rails
3
3
  class Engine < ::Rails::Engine
4
- require 'sassc'
5
- require 'sassc-rails'
6
4
  require "xdan-datetimepicker-rails"
7
5
  require "require_all"
8
- require "active_material"
9
6
 
10
- initializer "initialize addons" do |app|
7
+ initializer "initialize addons" do |_app|
11
8
  require_rel "support"
12
9
  require_rel "addons"
13
10
  require_rel "active_admin_config"
14
- app.config.assets.precompile += %w(select.scss fileicons/*.png switches/switch_*.png
15
- material/icons *.svg)
16
11
  end
17
12
  end
18
13
  end
@@ -79,7 +79,7 @@ module ActiveAdminAddons
79
79
  end
80
80
 
81
81
  def has_label?
82
- has_opts? ? args.length == 3 : args.length == 2
82
+ args.length == (has_opts? ? 3 : 2)
83
83
  end
84
84
 
85
85
  def has_opts?
@@ -7,47 +7,5 @@ module ActiveAdminAddons
7
7
  include InputOptionsHandler
8
8
  include InputMethods
9
9
  include InputHtmlHelpers
10
-
11
- def to_html
12
- load_input_class
13
- load_control_attributes
14
- render_custom_input
15
- if parts.any?
16
- return input_wrapping { parts_to_html }
17
- else
18
- super
19
- end
20
- end
21
-
22
- def input_html_options
23
- # maxwidth and size are added by Formtastic::Inputs::StringInput
24
- # but according to the HTML standard these are not valid attributes
25
- # on the inputs provided by this module
26
- super.except(:maxlength, :size).merge(control_attributes)
27
- end
28
-
29
- def parts_to_html
30
- parts.flatten.join("\n").html_safe
31
- end
32
-
33
- def load_input_class
34
- load_class(self.class.to_s.underscore.dasherize)
35
- end
36
-
37
- def load_control_attributes
38
- # Override on child classes if needed
39
- end
40
-
41
- def render_custom_input
42
- # Override on child classes if needed
43
- end
44
-
45
- def parts
46
- @parts ||= []
47
- end
48
-
49
- def concat(part)
50
- parts << part
51
- end
52
10
  end
53
11
  end
@@ -14,6 +14,7 @@ module ActiveAdminAddons
14
14
  end
15
15
 
16
16
  return unless result
17
+
17
18
  result.values.first.value
18
19
  end
19
20
 
@@ -40,5 +40,47 @@ module ActiveAdminAddons
40
40
  value: value
41
41
  )
42
42
  end
43
+
44
+ def to_html
45
+ load_input_class
46
+ load_control_attributes
47
+ render_custom_input
48
+ if parts.any?
49
+ input_wrapping { parts_to_html }
50
+ else
51
+ super
52
+ end
53
+ end
54
+
55
+ def input_html_options
56
+ # maxwidth and size are added by Formtastic::Inputs::StringInput
57
+ # but according to the HTML standard these are not valid attributes
58
+ # on the inputs provided by this module
59
+ super.except(:maxlength, :size).merge(control_attributes)
60
+ end
61
+
62
+ def load_input_class
63
+ load_class(self.class.to_s.underscore.dasherize)
64
+ end
65
+
66
+ def load_control_attributes
67
+ # Override on child classes if needed
68
+ end
69
+
70
+ def render_custom_input
71
+ # Override on child classes if needed
72
+ end
73
+
74
+ def parts_to_html
75
+ parts.flatten.join("\n").html_safe # rubocop:disable Rails/OutputSafety
76
+ end
77
+
78
+ def concat(part)
79
+ parts << part
80
+ end
81
+
82
+ def parts
83
+ @parts ||= []
84
+ end
43
85
  end
44
86
  end
@@ -14,7 +14,7 @@ module ActiveAdminAddons
14
14
  end
15
15
 
16
16
  def initial_collection_to_select_options
17
- initial_options = [[nil]] # add blank option
17
+ initial_options = [] # add blank option
18
18
  selected = selected_item
19
19
 
20
20
  if selected
@@ -57,21 +57,19 @@ module ActiveAdminAddons
57
57
  end
58
58
 
59
59
  def selected_collection
60
- @selected_collection ||= begin
61
- if active_record_relation?(collection)
62
- collection.model.where(id: input_value)
63
- else
64
- method_model.where(id: input_value)
65
- end
66
- end
60
+ @selected_collection ||= if active_record_relation?(collection)
61
+ collection.model.where(id: input_value)
62
+ else
63
+ method_model.where(id: input_value)
64
+ end
67
65
  end
68
66
 
69
67
  def selected_item
70
68
  @selected_item ||= begin
71
- input_association_value
72
- rescue NoMethodError
73
- selected_collection.first
74
- end
69
+ input_association_value
70
+ rescue NoMethodError
71
+ selected_collection.first
72
+ end
75
73
  end
76
74
 
77
75
  private
@@ -14,6 +14,4 @@ module ActiveAdminAddons
14
14
  end
15
15
  end
16
16
 
17
- ::ActiveAdmin::Inputs::Filters::SelectInput.send(
18
- :prepend, ActiveAdminAddons::SelectFilterInputExtension
19
- )
17
+ ::ActiveAdmin::Inputs::Filters::SelectInput.prepend ActiveAdminAddons::SelectFilterInputExtension
@@ -0,0 +1,11 @@
1
+ require_relative "input_helpers/input_options_handler"
2
+ require_relative "input_helpers/input_methods"
3
+ require_relative "input_helpers/input_html_helpers"
4
+
5
+ module ActiveAdminAddons
6
+ class SelectInputBase < Formtastic::Inputs::SelectInput
7
+ include InputOptionsHandler
8
+ include InputMethods
9
+ include InputHtmlHelpers
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveadminAddons
2
- VERSION = "1.10.0"
2
+ VERSION = "2.0.0.beta.2"
3
3
  end
@@ -4,17 +4,20 @@ module ActiveadminAddons
4
4
  attr_writer :default_select, :datetime_picker_default_options, :datetime_picker_input_format
5
5
 
6
6
  def default_select
7
- return "select2" unless @default_select
7
+ return "slim-select" unless @default_select
8
+
8
9
  @default_select
9
10
  end
10
11
 
11
12
  def datetime_picker_default_options
12
13
  return {} unless @datetime_picker_default_options
14
+
13
15
  @datetime_picker_default_options
14
16
  end
15
17
 
16
18
  def datetime_picker_input_format
17
19
  return "%Y-%m-%d %H:%M" unless @datetime_picker_input_format
20
+
18
21
  @datetime_picker_input_format
19
22
  end
20
23
 
@@ -11,7 +11,8 @@ module ActiveadminAddons
11
11
  if use_webpacker?
12
12
  generate "activeadmin_addons:webpacker"
13
13
  else
14
- generate "activeadmin_addons:assets"
14
+ puts "ActiveAdmin Addons requires ActiveAdmin installed with webpacker. "\
15
+ "Please run 'rails generate active_admin:install --webpacker' and then 'rails generate activeadmin_addons:install'"
15
16
  end
16
17
  end
17
18
 
@@ -1,9 +1,9 @@
1
1
  ActiveadminAddons.setup do |config|
2
2
  # Change to "default" if you want to use ActiveAdmin's default select control.
3
- # config.default_select = "select2"
3
+ # config.default_select = "slim-select"
4
4
 
5
5
  # Set default options for DateTimePickerInput. The options you can provide are the same as in
6
- # xdan's datetimepicker library (https://github.com/xdan/datetimepicker/tree/2.5.4). Yo need to
6
+ # xdan's datetimepicker library (https://github.com/xdan/datetimepicker/tree/2.5.4). You need to
7
7
  # pass a ruby hash, avoid camelCase keys. For example: use min_date instead of minDate key.
8
8
  # config.datetime_picker_default_options = {}
9
9
 
@@ -11,20 +11,17 @@ module ActiveadminAddons
11
11
  def add_stylesheets
12
12
  file_path = 'app/javascript/stylesheets/active_admin.scss'
13
13
 
14
- begin
15
- prepend_file(file_path, css_assets)
16
- end
14
+ prepend_file(file_path, css_assets)
17
15
  end
18
16
 
19
17
  def install_package
20
- run "yarn add activeadmin_addons"
18
+ run "yarn add activeadmin_addons@beta"
21
19
  end
22
20
 
23
21
  private
24
22
 
25
23
  def js_assets
26
- to_add = "import \"activeadmin_addons\"\n"
27
- to_add
24
+ "import \"activeadmin_addons\"\n"
28
25
  end
29
26
 
30
27
  def css_assets