cm-admin 3.0.7 → 3.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 672506812534b614e90c415af85104eab56d93f7808573caf22677f5b73617b0
4
- data.tar.gz: e237a7b69174f98bd98292774666b72d3dfd830fd26ff46be6f0250e9bfb5a2b
3
+ metadata.gz: 7470565c394ee297e76878ead64578e8fcb5cc7458b69516fc397f2577374d76
4
+ data.tar.gz: bf8f4e1694b6e8b4f5095f05eb9df1919a1fb4ce49d588d1fe576346cc76dd46
5
5
  SHA512:
6
- metadata.gz: efd0a5170f0b0096684233c972c050984d43e80c9e5969fbb8eca22177efac3241c118c0160cab52d93fed5a52f4cbf7efaa76311f57e5ec01bd730b5773bdba
7
- data.tar.gz: 3a61e79b3440d91dc992f68d2c6b7a981a36d396384af679add795bf2bd3f87ef917dba10e33e5943271d3b4e90b65ff427e6c946d96ba34fbc7b63b19ae719c
6
+ metadata.gz: 7e3de3b4dd2892626348a9feab18726c4cc370cca3d9a98625cb7e0a228f21b760413adb5f0e55607cfb4c02fb11625833f0dbd601e134d3dd14eb7aae733945
7
+ data.tar.gz: 9624eb827a4a5459f4f254e8f57f771afe8f9f6109493e136def8d1e9a0012aa76676fab59fbcd0851b8fcc6c9c9ef073c6a909e5b36bd393de269ec63b3ec82
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cm-admin (3.0.7)
4
+ cm-admin (3.0.9)
5
5
  caxlsx_rails
6
6
  cocoon (~> 1.2.15)
7
7
  csv-importer (~> 0.8.2)
@@ -79,15 +79,68 @@ $(document).on("click", function (e) {
79
79
  }
80
80
  });
81
81
 
82
- $(document).on("click", ".destroy-attachment button", function (e) {
82
+ $(document).on("click", '[data-section="destroy-attachment"] button', function (e) {
83
83
  e.preventDefault();
84
- var ar_id = $(this).parent(".destroy-attachment").data("ar-id");
85
- $(this).parent(".destroy-attachment").addClass("hidden");
84
+ var ar_id = $(this).parent('[data-section="destroy-attachment"]').data("ar-id");
85
+ $(this).parent('[data-section="destroy-attachment"]').addClass("hidden");
86
+ $(this).closest('[data-field-type="single_file_upload"]').find('input').removeClass('hidden')
86
87
  $(this).append(
87
88
  '<input type="text" name="attachment_destroy_ids[]" value="' + ar_id + '"/>'
88
89
  );
89
90
  });
90
91
 
92
+ $(document).on('change', '[data-field-type="single_file_upload"] input', function(e) {
93
+ console.log("File changed")
94
+ const [file] = $(this)[0].files
95
+ if (file) {
96
+ // blah.src = URL.createObjectURL(file)
97
+ const upload_div = $(this).closest('[data-field-type="single_file_upload"]')
98
+ $(upload_div).find('input').addClass('hidden')
99
+ $(upload_div).find('[data-section="destroy-attachment"]').removeClass("hidden")
100
+ $(upload_div).find('[data-section="image-preview"]').html(`<div data-section="destroy-attachment" data-attachment-name="listing[media_items_attributes][0]_attachment_attachments">\
101
+ <span class="btn-link">${file.name}</span>\
102
+ <button class="btn-ghost">\
103
+ <i class="fa-regular fa-trash-can"></i>\
104
+ </button>\
105
+ </div>`
106
+ )
107
+ var allowExtention = ".jpg,.bmp,.gif,.png";
108
+ var extention = file.name.substring(file.name.lastIndexOf(".") + 1).toLowerCase();
109
+
110
+ if (allowExtention.indexOf(extention) > -1) {
111
+ var img = $('<img height="50" width="50" class="rounded"/>');
112
+ img.attr("src", URL.createObjectURL(file));
113
+ $(upload_div).find('[data-section="image-preview"]').find('[data-section="destroy-attachment"]').prepend(img);
114
+ }
115
+ }
116
+ })
117
+
118
+ $(document).on('change', '[data-field-type="multi_file_upload"] input', function(e) {
119
+ console.log("File changed")
120
+ const files = $(this)[0].files
121
+ const element_id = $(this).attr('id')
122
+ const upload_div = $(this).closest('[data-field-type="multi_file_upload"]')
123
+ $(upload_div).find('[data-section="image-preview"]').html('')
124
+ if (files) {
125
+ $.each(files, function(index, file) {
126
+ $(upload_div).find('[data-section="destroy-attachment"]').removeClass("hidden");
127
+ $(upload_div).find('[data-section="image-preview"]').append(`<div data-section="destroy-attachment" data-index="${index}" data-attachment-name="${element_id}_attachments">\
128
+ <span class="btn-link">${file.name}</span>\
129
+ </div>`
130
+ )
131
+ var allowExtention = ".jpg,.bmp,.gif,.png";
132
+ var extention = file.name.substring(file.name.lastIndexOf(".") + 1).toLowerCase();
133
+
134
+ if (allowExtention.indexOf(extention) > -1) {
135
+ var img = $('<img height="50" width="50" class="rounded"/>');
136
+ img.attr("src", URL.createObjectURL(file));
137
+ $(upload_div).find('[data-section="image-preview"]').find(`[data-index="${index}"]`).prepend(img);
138
+ }
139
+ })
140
+
141
+ }
142
+ })
143
+
91
144
  $(document).on(
92
145
  "click",
93
146
  '[data-behaviour="permission-check-box"]',
@@ -61,9 +61,23 @@
61
61
  }
62
62
 
63
63
  //upload attachment style
64
- .destroy-attachment {
64
+ [data-section="destroy-attachment"] {
65
65
  margin-top: 4px;
66
66
  }
67
+ [data-section="image-preview"] {
68
+ [data-section="destroy-attachment"] {
69
+ background-color: $grey-lightest-clr;
70
+ mix-blend-mode: multiply;
71
+ padding: 8px;
72
+ margin-bottom: 5px;
73
+ .btn-ghost {
74
+ float: right;
75
+ margin-top: 12px;
76
+ }
77
+ }
78
+ }
79
+
80
+
67
81
 
68
82
  //Form card UI
69
83
  .form-card {
@@ -290,19 +290,22 @@
290
290
  .nested-form-table {
291
291
  @extend .table, .table-light, .table-hover, .table-bordered, .m-0;
292
292
  width: max-content;
293
- .item-delete-cell {
294
- vertical-align: middle;
295
- text-align: center;
296
- }
297
293
  }
298
- th:nth-child(1) {
299
- min-width: 47px;
300
- max-width: 47px;
294
+ [data-behaviour="action-icons"] {
295
+ min-width: 48px;
296
+ max-width: 48px;
297
+ text-align: center;
298
+ }
299
+ [data-section="action-icon-header"] {
300
+ min-width: 48px;
301
+ max-width: 48px;
301
302
  }
302
- td:nth-child(1) {
303
- min-width: 47px;
304
- max-width: 47px;
303
+ [data-action-title-pad="2"] {
304
+ padding-left: 53px !important;
305
305
  }
306
+ [data-action-title-pad="3"] {
307
+ padding-left: 101px !important;
308
+ }
306
309
  th,
307
310
  td {
308
311
  min-width: 120px;
@@ -1,11 +1,11 @@
1
1
  - if nested_table_field.display_type == :table
2
2
  tr.nested-fields
3
3
  - if nested_table_field.is_positionable.call(f.object)
4
- td
5
- i class='fa-solid fa-arrows-up-down-left-right drag-handle'
4
+ td data-behaviour='action-icons'
5
+ i class='fa-solid fa-grip-dots-vertical drag-handle pointer'
6
6
  = f.hidden_field :position, class: 'hidden-position'
7
7
  - if nested_table_field.is_deletable.call(f.object)
8
- td.item-delete-cell
8
+ td.item-delete-cell data-behaviour='action-icons'
9
9
  = link_to_remove_association "", f, class: 'fa-regular fa-trash-can btn-ghost'
10
10
  - nested_table_field.fields.each do |field|
11
11
  td data-field-type="#{field.input_type}"
@@ -4,19 +4,23 @@
4
4
  .nested-field-wrapper data-table-name=assoc_name data-model-name=assoc_name.to_s.classify
5
5
  / label.field-label = nested_table_field.label.to_s.titleize
6
6
  - uniq_no = Random.rand(10000)
7
+ - colspan_count = 1
7
8
  .nested-form-table-wrapper
8
9
  table.nested-form-table
9
10
  thead
10
11
  tr
11
12
  - if nested_table_field.is_positionable.call(f.object)
12
- th
13
- |
13
+ - colspan_count +=1
14
14
  - if nested_table_field.is_deletable.call(f.object)
15
- th
16
- |
17
- - nested_table_field.fields.each do |field|
18
- th data-field-type="#{field.input_type}"
19
- - if field.label
15
+ - colspan_count +=1
16
+ - nested_table_field.fields.each_with_index do |field, index|
17
+ - if index.zero?
18
+ th data-field-type="#{field.input_type}" data-action-title-pad="#{colspan_count}" colspan="#{colspan_count}"
19
+ - if field.label
20
+ = field.label.to_s || field.field_name.to_s.titleize
21
+ - else
22
+ th data-field-type="#{field.input_type}"
23
+ - if field.label
20
24
  = field.label.to_s || field.field_name.to_s.titleize
21
25
  tbody class="insert-cocoon-position-#{uniq_no}" data-section='nested-form-body'
22
26
  = f.fields_for table_name do |record|
@@ -1,38 +1,39 @@
1
- .form-page.permission-form
2
- .form-page__body
3
- .form-container
4
- = form_for CmPermission.new, url: cm_admin.send('cm_create_role_permission_cm_role_path', @ar_object), method: :post do |f|
5
- - cm_models = CmAdmin.config.cm_admin_models.sort_by{|k, v| k.display_name}
6
- - cm_models.each do |model|
7
- - next if model.override_policy == true
8
- .row
9
- .col.form-container
10
- p.form-title
11
- = model.model_name
12
- .form-container__inner
13
- .row
14
- .col
15
- .form-field.disabled
16
- .form-check
17
- .permission-form__checkbox-wrapper
18
- - saved_permission = @ar_object.cm_permissions.where(ar_model_name: model.name)
19
- - available_actions = model.available_actions.reject {|x| ['custom_action_modal', 'custom_action', 'create', 'update'].include?(x.name)}
20
- - is_checked = (saved_permission.count >= available_actions.count)
21
- input.form-check-input[type="checkbox" value="" data-behaviour="permission-check-all" checked=is_checked]
22
- .cm-checkbox-label
23
- span.action-name
24
- | All
25
- - model.available_actions.each do |action|
26
- - permission = @ar_object.cm_permissions.where(ar_model_name: model.name, action_name: action.name).first
27
- - unless ['custom_action_modal', 'custom_action', 'create', 'update'].include?(action.name)
1
+ .form-page.permission-form
2
+ .form-page__body
3
+ .form-container
4
+ = form_for CmPermission.new, url: cm_admin.send('cm_create_role_permission_cm_role_path', @ar_object), method: :post do |f|
5
+ - cm_models = CmAdmin.config.cm_admin_models.sort_by{|k, v| k.display_name}
6
+ .form-section-container
7
+ - cm_models.each do |model|
8
+ - next if model.override_policy == true
9
+ .row
10
+ .col.form-container
11
+ p.form-title
12
+ = model.model_name
13
+ .form-container__inner
14
+ .row
15
+ .col
16
+ .form-field.disabled
28
17
  .form-check
29
18
  .permission-form__checkbox-wrapper
30
- input.form-check-input[type="checkbox" value="#{action.name}" checked=permission.present? name="role_permission[#{model.name}][#{action.name}][is_checked]" data-behaviour="permission-check-box"]
19
+ - saved_permission = @ar_object.cm_permissions.where(ar_model_name: model.name)
20
+ - available_actions = model.available_actions.reject {|x| ['custom_action_modal', 'custom_action', 'create', 'update'].include?(x.name)}
21
+ - is_checked = (saved_permission.count >= available_actions.count)
22
+ input.form-check-input[type="checkbox" value="" data-behaviour="permission-check-all" checked=is_checked]
31
23
  .cm-checkbox-label
32
24
  span.action-name
33
- = action.display_name || action.name.titleize
34
- .cm-select-tag class="#{permission.present? ? '' : 'hidden'}"
35
- = select_tag(:policy_scope_name, options_for_select(model.policy_scopes.map{|policy_hash| [policy_hash[:display_name], policy_hash[:scope_name]]}, permission&.scope_name), {name: "role_permission[#{model.name}][#{action.name}][scope_name]", class: 'select-2', id: "policy-scope-#{model.name}-#{action.name}"})
36
- div
37
- = f.submit 'Save Changes', class: "btn-cta"
38
- = link_to 'Discard', cm_admin.send('cm_index_cm_role_path'), class: "btn-secondary ml-10"
25
+ | All
26
+ - model.available_actions.each do |action|
27
+ - permission = @ar_object.cm_permissions.where(ar_model_name: model.name, action_name: action.name).first
28
+ - unless ['custom_action_modal', 'custom_action', 'create', 'update'].include?(action.name)
29
+ .form-check
30
+ .permission-form__checkbox-wrapper
31
+ input.form-check-input[type="checkbox" value="#{action.name}" checked=permission.present? name="role_permission[#{model.name}][#{action.name}][is_checked]" data-behaviour="permission-check-box"]
32
+ .cm-checkbox-label
33
+ span.action-name
34
+ = action.display_name || action.name.titleize
35
+ .cm-select-tag class="#{permission.present? ? '' : 'hidden'}"
36
+ = select_tag(:policy_scope_name, options_for_select(model.policy_scopes.map{|policy_hash| [policy_hash[:display_name], policy_hash[:scope_name]]}, permission&.scope_name), {name: "role_permission[#{model.name}][#{action.name}][scope_name]", class: 'select-2', id: "policy-scope-#{model.name}-#{action.name}"})
37
+ .form-submit-button-container
38
+ = f.submit 'Save Changes', class: "btn-cta"
39
+ = link_to 'Discard', cm_admin.send('cm_index_cm_role_path'), class: "btn-secondary ml-10"
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = '3.0.7'
2
+ VERSION = '3.0.9'
3
3
  end
@@ -189,28 +189,28 @@ module CmAdmin
189
189
  end
190
190
 
191
191
  def cm_single_file_upload_field(form_obj, cm_field, _value, required_class, _target_action, _ajax_url)
192
- content_tag(:div) do
192
+ content_tag(:div, data: { 'field-type': 'single_file_upload' }) do
193
+ concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
193
194
  concat form_obj.file_field cm_field.field_name,
194
195
  merge_wrapper_options(
195
196
  {
196
- class: "field-control #{required_class}",
197
+ class: "field-control #{required_class} #{form_obj.object.send(cm_field.field_name).attached? ? 'hidden' : ''}",
197
198
  disabled: cm_field.disabled.call(form_obj.object)
198
199
  }, cm_field.html_attrs
199
200
  )
200
- concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
201
201
  end
202
202
  end
203
203
 
204
204
  def cm_multi_file_upload_field(form_obj, cm_field, _value, required_class, _target_action, _ajax_url)
205
- content_tag(:div) do
205
+ content_tag(:div, data: { 'field-type': 'multi_file_upload' }) do
206
+ concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
206
207
  concat form_obj.file_field cm_field.field_name,
207
208
  merge_wrapper_options(
208
209
  {
209
- multiple: true, class: "field-control #{required_class}",
210
+ multiple: true, class: "field-control #{required_class}}",
210
211
  disabled: cm_field.disabled.call(form_obj.object)
211
212
  }, cm_field.html_attrs
212
213
  )
213
- concat attachment_list(form_obj, cm_field, _value, required_class, _target_action)
214
214
  end
215
215
  end
216
216
 
@@ -219,7 +219,7 @@ module CmAdmin
219
219
  attachment_name = "#{form_obj.object_name}_#{cm_field.field_name}_attachments"
220
220
  return if defined?(::Paperclip) && attached.instance_of?(::Paperclip::Attachment)
221
221
 
222
- content_tag(:div) do
222
+ content_tag(:div, data: { section: 'image-preview'}) do
223
223
  if attached.class == ActiveStorage::Attached::Many
224
224
  attached.each do |attachment|
225
225
  concat attachment_with_icon(cm_field, attachment, attachment_name:)
@@ -231,16 +231,16 @@ module CmAdmin
231
231
  end
232
232
 
233
233
  def attachment_with_icon(cm_field, attachment, attachment_name:)
234
- content_tag(:div, class: 'destroy-attachment', data: { ar_id: attachment.id, attachment_name: }) do
235
- concat(content_tag(:button, '', class: 'btn-ghost') do
236
- concat tag.i(class: 'fa-regular fa-trash-can')
237
- end)
238
- concat content_tag(:span, attachment.filename.to_s, class: 'btn-link')
234
+ content_tag(:div, data: { section: 'destroy-attachment', ar_id: attachment.id, attachment_name: }) do
239
235
  concat(content_tag(:a, href: attachment.url, target: '_blank') do
240
236
  if attachment.content_type.include?('image')
241
237
  image_tag(attachment.url, height: 50, width: 50, class: "rounded")
242
238
  end
243
239
  end) if cm_field.image_preview
240
+ concat content_tag(:span, attachment.filename.to_s, class: 'btn-link')
241
+ concat(content_tag(:button, '', class: 'btn-ghost') do
242
+ concat tag.i(class: 'fa-regular fa-trash-can')
243
+ end) if cm_field.input_type == :single_file_upload
244
244
  end
245
245
  end
246
246
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cm-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.7
4
+ version: 3.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael