cm-admin 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linters.yml +6 -2
  3. data/.gitignore +1 -1
  4. data/.stylelintrc.json +3 -0
  5. data/Gemfile.lock +19 -18
  6. data/app/assets/javascripts/cm_admin/application.js +1 -0
  7. data/app/assets/javascripts/cm_admin/exports.js +1 -1
  8. data/app/assets/javascripts/cm_admin/scaffolds.js +5 -1
  9. data/app/assets/javascripts/cm_admin/shared_scaffolds.js +132 -0
  10. data/app/assets/stylesheets/cm_admin/base/auth.scss +113 -0
  11. data/app/assets/stylesheets/cm_admin/base/common.scss +2 -2
  12. data/app/assets/stylesheets/cm_admin/base/form.scss +4 -0
  13. data/app/assets/stylesheets/cm_admin/base/table.scss +2 -1
  14. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +2 -0
  15. data/app/assets/stylesheets/cm_admin/dependency/flatpickr.min.css +13 -0
  16. data/app/assets/stylesheets/cm_admin/helpers/_mixins.scss +1 -1
  17. data/app/assets/stylesheets/cm_admin/pages/history_page.scss +49 -0
  18. data/app/controllers/cm_admin/resource_controller.rb +31 -7
  19. data/app/javascript/packs/cm_admin/application.js +1 -0
  20. data/app/javascript/packs/cm_admin/scaffolds.js +1 -136
  21. data/app/views/cm_admin/main/_nested_fields.html.slim +1 -1
  22. data/app/views/cm_admin/main/_nested_table_form.html.slim +2 -2
  23. data/app/views/cm_admin/main/_tabs.html.slim +5 -1
  24. data/app/views/cm_admin/main/associated_show.html.slim +1 -1
  25. data/app/views/cm_admin/main/history.html.slim +17 -0
  26. data/app/views/cm_admin/main/new.html.slim +2 -5
  27. data/app/views/cm_admin/main/show.html.slim +1 -1
  28. data/app/views/layouts/_left_sidebar_nav.html.slim +15 -19
  29. data/app/views/layouts/cm_admin.html.slim +2 -1
  30. data/config/routes.rb +9 -1
  31. data/lib/cm_admin/constants.rb +4 -0
  32. data/lib/cm_admin/model.rb +2 -2
  33. data/lib/cm_admin/models/action.rb +2 -1
  34. data/lib/cm_admin/models/dsl_method.rb +17 -19
  35. data/lib/cm_admin/models/section.rb +38 -0
  36. data/lib/cm_admin/version.rb +1 -1
  37. data/lib/cm_admin/view_helpers/form_helper.rb +55 -30
  38. data/lib/cm_admin/view_helpers/page_info_helper.rb +8 -0
  39. data/lib/generators/cm_admin/templates/application_policy.rb +4 -0
  40. data/package-lock.json +61 -61
  41. data/package.json +1 -1
  42. data/yarn.lock +64 -46
  43. metadata +8 -5
  44. data/.github/workflows/.stylelintrc.json +0 -3
  45. data/lib/cm_admin/models/cm_show_section.rb +0 -19
  46. data/tmp/cache/webpacker/last-compilation-digest-development +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fef403882161b778959795eb4ee4b340a471913582710ed998d3d0c3c6d809eb
4
- data.tar.gz: 4f083b865564092997f8a959c22b05675c07bd2973f959a357cf0ee132295fcc
3
+ metadata.gz: faecf51ddd1a7dd895ec281a4beb4b4a88e8efe63918b41cac512f72ec27c460
4
+ data.tar.gz: d1e94c3ec4bc95e8bc4bc3a42572d62606019dec522cc172135e2201ccd63f63
5
5
  SHA512:
6
- metadata.gz: 444abf2ad421b1db1bdba4b506a7645e1d5e1653b78c6610c434f45999acc0b7b7ae11017df43f82f37058ec1cdff0aeb5b2a0a3ea0dc08e25c22b713d1cf6c0
7
- data.tar.gz: b3475419d75358580b07914f988183071b95ad7a2f891811a8dce9a89aa2b1d90237a0b7b8340619142f90ab62de50e3b50f0ffa626a948a09f306c12601acc5
6
+ metadata.gz: 93f0cc6ef4e82a7aa47c776fcf1bc4ce9eba0f3f728eac78c9ee6f28d6cf887e8189cdb800bf67af8aa85a93ce0ace51d36cc65f243e0e946f59f061cf97656d
7
+ data.tar.gz: 9472785aa3b6c2648be151f9d188d2084748cd35fbdadab91a9d53045eea06129bb09ec3e28e63ba371829988c0307720821862d467d9d008d1056e6033300af
@@ -23,8 +23,12 @@ jobs:
23
23
  uses: reviewdog/action-reek@v1
24
24
  with:
25
25
  reek_version: 6.1.1
26
- - name: runner / stylelint
27
- run: npx stylelint **/*.scss
26
+ - uses: actions/checkout@v3
27
+ - name: stylelint
28
+ uses: reviewdog/action-stylelint@v1
29
+ with:
30
+ reporter: github-pr-review # Change reporter.
31
+ stylelint_input: '**/*.scss'
28
32
  - name: coffeelint
29
33
  uses: reviewdog/action-coffeelint@v1
30
34
  with:
data/.gitignore CHANGED
@@ -5,7 +5,7 @@
5
5
  /doc/
6
6
  /pkg/
7
7
  /spec/reports/
8
- /tmp/
8
+ tmp/
9
9
  node_modules/
10
10
  public/cm-admin-packs/
11
11
  # rspec failure tracking
data/.stylelintrc.json ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "stylelint-config-standard-scss"
3
+ }
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cm-admin (1.0.2)
4
+ cm-admin (1.0.5)
5
5
  caxlsx_rails
6
6
  cocoon (~> 1.2.15)
7
7
  csv-importer (~> 0.8.2)
@@ -87,7 +87,7 @@ GEM
87
87
  ice_nine (~> 0.11.0)
88
88
  thread_safe (~> 0.3, >= 0.3.1)
89
89
  builder (3.2.4)
90
- caxlsx (3.3.0)
90
+ caxlsx (3.4.0)
91
91
  htmlentities (~> 4.3, >= 4.3.4)
92
92
  marcel (~> 1.0)
93
93
  nokogiri (~> 1.10, >= 1.10.4)
@@ -106,8 +106,8 @@ GEM
106
106
  descendants_tracker (0.0.4)
107
107
  thread_safe (~> 0.3, >= 0.3.1)
108
108
  diff-lcs (1.4.4)
109
- erubi (1.11.0)
110
- globalid (1.0.0)
109
+ erubi (1.12.0)
110
+ globalid (1.1.0)
111
111
  activesupport (>= 5.0)
112
112
  htmlentities (4.3.4)
113
113
  i18n (1.11.0)
@@ -118,10 +118,10 @@ GEM
118
118
  railties (>= 6.0.0)
119
119
  json (2.6.2)
120
120
  local_time (2.1.0)
121
- loofah (2.19.1)
121
+ loofah (2.20.0)
122
122
  crass (~> 1.0.2)
123
123
  nokogiri (>= 1.5.9)
124
- mail (2.8.0)
124
+ mail (2.8.1)
125
125
  mini_mime (>= 0.1.1)
126
126
  net-imap
127
127
  net-pop
@@ -130,7 +130,7 @@ GEM
130
130
  method_source (1.0.0)
131
131
  mini_mime (1.1.2)
132
132
  minitest (5.16.2)
133
- net-imap (0.3.3)
133
+ net-imap (0.3.4)
134
134
  date
135
135
  net-protocol
136
136
  net-pop (0.1.2)
@@ -139,8 +139,8 @@ GEM
139
139
  timeout
140
140
  net-smtp (0.3.3)
141
141
  net-protocol
142
- nio4r (2.5.8)
143
- nokogiri (1.13.10-arm64-darwin)
142
+ nio4r (2.5.9)
143
+ nokogiri (1.14.3-arm64-darwin)
144
144
  racc (~> 1.4)
145
145
  pagy (4.11.0)
146
146
  parallel (1.22.1)
@@ -148,11 +148,11 @@ GEM
148
148
  ast (~> 2.4.1)
149
149
  pundit (2.2.0)
150
150
  activesupport (>= 3.0.0)
151
- racc (1.6.1)
152
- rack (2.2.4)
153
- rack-proxy (0.7.4)
151
+ racc (1.6.2)
152
+ rack (2.2.6.4)
153
+ rack-proxy (0.7.6)
154
154
  rack
155
- rack-test (2.0.2)
155
+ rack-test (2.1.0)
156
156
  rack (>= 1.3)
157
157
  rails (7.0.3.1)
158
158
  actioncable (= 7.0.3.1)
@@ -171,7 +171,7 @@ GEM
171
171
  rails-dom-testing (2.0.3)
172
172
  activesupport (>= 4.2.0)
173
173
  nokogiri (>= 1.6)
174
- rails-html-sanitizer (1.4.4)
174
+ rails-html-sanitizer (1.5.0)
175
175
  loofah (~> 2.19, >= 2.19.1)
176
176
  railties (7.0.3.1)
177
177
  actionpack (= 7.0.3.1)
@@ -226,7 +226,7 @@ GEM
226
226
  thor (1.2.1)
227
227
  thread_safe (0.3.6)
228
228
  tilt (2.0.10)
229
- timeout (0.3.1)
229
+ timeout (0.3.2)
230
230
  tzinfo (2.0.4)
231
231
  concurrent-ruby (~> 1.0)
232
232
  unicode-display_width (2.3.0)
@@ -234,7 +234,7 @@ GEM
234
234
  axiom-types (~> 0.1)
235
235
  coercible (~> 1.0)
236
236
  descendants_tracker (~> 0.0, >= 0.0.3)
237
- webpacker (5.4.3)
237
+ webpacker (5.4.4)
238
238
  activesupport (>= 5.2)
239
239
  rack-proxy (>= 0.6.1)
240
240
  railties (>= 5.2)
@@ -242,10 +242,11 @@ GEM
242
242
  websocket-driver (0.7.5)
243
243
  websocket-extensions (>= 0.1.0)
244
244
  websocket-extensions (0.1.5)
245
- zeitwerk (2.6.6)
245
+ zeitwerk (2.6.7)
246
246
 
247
247
  PLATFORMS
248
- ruby
248
+ arm64-darwin-20
249
+ x86_64-linux
249
250
 
250
251
  DEPENDENCIES
251
252
  cm-admin!
@@ -1,4 +1,5 @@
1
1
  import './scaffolds.js';
2
+ import './shared_scaffolds.js';
2
3
  import './form_validation.js'
3
4
  import './quick_search.js'
4
5
  import './filters.js'
@@ -1,5 +1,5 @@
1
1
  $(document).on('click', '.export-to-file-btn', function(e) {
2
2
  e.preventDefault();
3
- query_param = window.location.href.split("?")[1]
3
+ var query_param = window.location.href.split("?")[1]
4
4
  $("#export-to-file-form").submit();
5
5
  });
@@ -41,4 +41,8 @@ $(document).on('turbolinks:load', function () {
41
41
  flatpickr("[data-behaviour='date-only']", {
42
42
  dateFormat: "d-m-Y"
43
43
  })
44
- })
44
+ })
45
+
46
+ $(document).on('click', '.menu-item', function(e) {
47
+ $('.profile-popup').toggleClass('hidden');
48
+ });
@@ -0,0 +1,132 @@
1
+ // This file is shared between rails 6 and 7 version
2
+
3
+ $(document).on("keypress keyup blur", "[data-behaviour='decimal-only'], [data-behaviour='filter'][data-filter-type='range']", function (e) {
4
+ var charCode = (e.which) ? e.which : e.keyCode
5
+ if (charCode > 31 && (charCode != 46 &&(charCode < 48 || charCode > 57)))
6
+ return false;
7
+ return true;
8
+ });
9
+
10
+ $(document).on("keypress keyup blur", "[data-behaviour='integer-only']", function (event) {
11
+ $(this).val($(this).val().replace(/[^\d].+/, ""));
12
+ if ((event.which < 48 || event.which > 57)) {
13
+ event.preventDefault();
14
+ }
15
+ });
16
+
17
+ $(document).on('click', '.row-action-cell', function(e) {
18
+ e.stopPropagation();
19
+ if ($(this).hasClass('opacity-1')) {
20
+ $('.row-action-cell').removeClass('opacity-1')
21
+ } else {
22
+ $('.row-action-cell').removeClass('opacity-1')
23
+ $(this).addClass('opacity-1');
24
+ }
25
+ $(this).find('.table-export-popup').toggle('hidden')
26
+ });
27
+
28
+
29
+ $(document).on('click', '.drawer-btn', function(e) {
30
+ e.stopPropagation();
31
+ var drawer_el = $(this).parent().closest('.drawer').find('.cm-drawer')
32
+ if (drawer_el.hasClass('hidden')) {
33
+ drawer_el.removeClass('hidden');
34
+ drawer_container = drawer_el.find('.drawer-container')
35
+ if (drawer_container.hasClass('drawer-slide-out')) {
36
+ drawer_container.removeClass('drawer-slide-out');
37
+ }
38
+ drawer_container.addClass('drawer-slide-in');
39
+ } else {
40
+ return drawer_el.addClass('hidden');
41
+ }
42
+ });
43
+
44
+ $(document).on('click', '.drawer-close', function(e) {
45
+ e.stopPropagation();
46
+ $('.drawer-container').removeClass('drawer-slide-in');
47
+ $('.drawer-container').addClass('drawer-slide-out');
48
+ setTimeout(() => {
49
+ $('.cm-drawer').addClass('hidden');
50
+ }, 300);
51
+ });
52
+
53
+ $(document).on('change', '[data-field-type="linked-field"]', function(e) {
54
+ e.stopPropagation();
55
+ var params = {}
56
+ params[$(this).data('field-name')] = $(this).val()
57
+ var request_url = $(this).data('target-url') + '?' + $.param(params);
58
+ console.log(request_url)
59
+ $.ajax(request_url, {
60
+ type: 'GET',
61
+ success: function(data) {
62
+ apply_response_to_field(data)
63
+ },
64
+ error: function(jqxhr, textStatus, errorThrown) {
65
+ alert('Something went wrong. Please try again later.\n' + errorThrown);
66
+ }
67
+ });
68
+ });
69
+
70
+ function apply_response_to_field(response) {
71
+ $.each(response['fields'], function(key, value) {
72
+ switch(value['target_type']) {
73
+ case 'select':
74
+ update_options_in_select(value['target_value'])
75
+ break;
76
+ case 'input':
77
+ update_options_input_value(value['target_value'])
78
+ break;
79
+ case 'toggle_visibility':
80
+ toggle_field_visibility(value['target_value'])
81
+ }
82
+ })
83
+ }
84
+
85
+ function update_options_input_value(field_obj) {
86
+ var input_tag = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
87
+ input_tag.val(field_obj['field_value'])
88
+ }
89
+
90
+ function update_options_in_select(field_obj) {
91
+ var select_tag = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
92
+ select_tag.empty();
93
+ $.each(field_obj['field_value'], function(key, value) {
94
+ select_tag.append($("<option></option>")
95
+ .attr("value", value[1]).text(value[0]));
96
+ });
97
+ }
98
+
99
+ function toggle_field_visibility(field_obj) {
100
+ var element = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
101
+ element.closest('.input-wrapper').toggleClass('hidden')
102
+ }
103
+
104
+ $(document).on('cocoon:after-insert', '.nested-field-wrapper', function(e) {
105
+ e.stopPropagation();
106
+ replaceAccordionTitle($(this))
107
+ });
108
+
109
+ $(document).on('cocoon:after-remove', '.nested-field-wrapper', function(e) {
110
+ e.stopPropagation();
111
+ replaceAccordionTitle($(this))
112
+ });
113
+
114
+ $(document).ready( function () {
115
+ $('.nested-field-wrapper').each(function() {
116
+ replaceAccordionTitle($(this))
117
+ })
118
+ });
119
+
120
+ var replaceAccordionTitle = function(element) {
121
+ var i = 0;
122
+ var table_name = $(element).data('table-name')
123
+ var model_name = $(element).data('model-name')
124
+ $(element).find('.accordion-item:visible').each(function() {
125
+ i++;
126
+ var accordion_title = model_name + ' ' + i
127
+ var accordion_id = table_name + '-' + i
128
+ $(this).find('.accordion-button').text(accordion_title);
129
+ $(this).find('.accordion-button').attr('data-bs-target', '#' + accordion_id);
130
+ $(this).find('.accordion-collapse').attr('id', accordion_id);
131
+ });
132
+ }
@@ -71,3 +71,116 @@
71
71
  }
72
72
  }
73
73
  }
74
+
75
+ .sidebar__footer {
76
+ position: absolute;
77
+ bottom: 0;
78
+ z-index: 100;
79
+ width: 100%;
80
+ padding: 16px 0;
81
+ box-shadow: inset 0px 1px 0px rgba(255, 255, 255, 0.15);
82
+ .menu-item {
83
+ @include font($size: $t4-text, $color: $ink-lightest-clr);
84
+ padding: 8px 24px;
85
+ @include transition-linear();
86
+ cursor: pointer;
87
+ &:hover {
88
+ color: $white;
89
+ background: rgba(255, 255, 255, 0.1);
90
+ }
91
+ }
92
+ .profile-name {
93
+ @include flex($align: center);
94
+ position: relative;
95
+ line-height: 22px;
96
+ @include font($size: $t4-text, $color: $ink-lightest-clr);
97
+ cursor: pointer;
98
+ .profile-avatar {
99
+ @include flex($justify: center, $align: center);
100
+ width: 22px;
101
+ height: 22px;
102
+ margin-right: 8px;
103
+ @include font($size: 10px, $color: $white, $weight: 900);
104
+ background-color: $brand-color;
105
+ vertical-align: middle;
106
+ border-radius: 50%;
107
+ img {
108
+ width: 22px;
109
+ border-radius: $circle;
110
+ }
111
+ }
112
+ }
113
+ .profile-popup {
114
+ position: absolute;
115
+ left: 228px;
116
+ bottom: 10px;
117
+ width: 268px;
118
+ min-height: 100px;
119
+ overflow: hidden;
120
+ background-color: $white;
121
+ box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.16);
122
+ border-radius: $radius-4;
123
+ animation: fadeIn 0.2s linear;
124
+ .profile-info {
125
+ display: grid;
126
+ grid-template-columns: 1fr 32px;
127
+ grid-gap: 9px;
128
+ padding: 8px 16px;
129
+ box-shadow: inset 0px -1px 0px rgba(148, 151, 155, 0.15);
130
+ &__left {
131
+ .name-text {
132
+ @include font($size: $t4-text);
133
+ line-height: 22px;
134
+ margin: 0;
135
+ }
136
+ .email-text {
137
+ @include font($size: $t4-text, $color: $ink-lightest-clr);
138
+ line-height: 22px;
139
+ margin: 0;
140
+ width: 200px;
141
+ }
142
+ }
143
+ &__right {
144
+ @include flex($justify: center, $align: center);
145
+ width: 32px;
146
+ height: 32px;
147
+ @include font($color: $white, $weight: 600);
148
+ background-color: $brand-color;
149
+ vertical-align: middle;
150
+ border-radius: 50%;
151
+ img {
152
+ width: 32px;
153
+ border-radius: $circle;
154
+ }
155
+ }
156
+ }
157
+ .page-options {
158
+ padding: 8px 0;
159
+ box-shadow: inset 0px -1px 0px rgba(148, 151, 155, 0.15);
160
+ .page-link {
161
+ display: block;
162
+ @include font($size: $t4-text);
163
+ line-height: 22px;
164
+ padding: 4px 16px;
165
+ border: none;
166
+ @include transition-linear();
167
+ &:hover {
168
+ background-color: $grey-lighter-clr;
169
+ }
170
+ }
171
+ }
172
+ .auth-option {
173
+ padding: 8px 0;
174
+ .auth-link {
175
+ display: block;
176
+ @include font($size: $t4-text);
177
+ line-height: 22px;
178
+ padding: 4px 16px;
179
+ @include transition-linear();
180
+ &:hover {
181
+ background-color: $grey-lighter-clr;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
@@ -16,8 +16,8 @@
16
16
  border-radius: $radius-4;
17
17
  z-index: 1;
18
18
  &.table-export-popup {
19
- top: 50px;
20
- right: 10px;
19
+ top: 40px;
20
+ right: 30px;
21
21
  width: 156px;
22
22
  padding: 8px 0;
23
23
  animation: fadeIn .2s ease-in-out;
@@ -16,6 +16,10 @@
16
16
  }
17
17
  .form-wrapper {
18
18
  .form-container {
19
+ margin-top: 32px;
20
+ &:nth-child(1) {
21
+ margin-top: 0;
22
+ }
19
23
  .form-title {
20
24
  @include font($size: $t3-text, $color: $primary-text-clr, $weight: bold);
21
25
  line-height: 24px;
@@ -149,6 +149,7 @@
149
149
  background: $gradient-one;
150
150
  display: none;
151
151
  transition: all 0.1s linear;
152
+ z-index: 3;
152
153
  .row-action-tool {
153
154
  display: flex;
154
155
  align-items: center;
@@ -175,7 +176,7 @@
175
176
  position: sticky;
176
177
  top: 0;
177
178
  background-color: $white;
178
- z-index: 3;
179
+ z-index: 4;
179
180
  }
180
181
  }
181
182
 
@@ -11,6 +11,7 @@
11
11
  * It is generally better to create a new file per style scope.
12
12
  *
13
13
  *= require 'cm_admin/pages/import_page'
14
+ *= require 'cm_admin/pages/history_page'
14
15
  *= require 'cm_admin/base/table'
15
16
  *= require 'cm_admin/base/navbar'
16
17
  *= require 'cm_admin/base/sidebar'
@@ -23,6 +24,7 @@
23
24
  *= require 'cm_admin/base/common'
24
25
  *= require 'cm_admin/components/index'
25
26
  *= require 'cm_admin/dependency/bootstrap.min'
27
+ *= require 'cm_admin/dependency/flatpickr.min'
26
28
  *= require 'cm_admin/scaffold'
27
29
  *= require_self
28
30
  */
@@ -0,0 +1,13 @@
1
+ .flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
2
+ /*rtl:begin:ignore*/left:0/*
3
+ /*rtl:end:ignore*/}/*
4
+ /*rtl:begin:ignore*/
5
+ /*
6
+ /*rtl:end:ignore*/
7
+ .flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/*
8
+ /*rtl:begin:ignore*/right:0/*
9
+ /*rtl:end:ignore*/}/*
10
+ /*rtl:begin:ignore*/
11
+ /*
12
+ /*rtl:end:ignore*/
13
+ .flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
@@ -1,6 +1,6 @@
1
1
  @import "variable";
2
2
 
3
- @mixin flex($direction, $justify, $align, $wrap) {
3
+ @mixin flex($direction: row, $justify: normal, $align: normal, $wrap: nowrap) {
4
4
  display: flex;
5
5
  flex-direction: $direction;
6
6
  justify-content: $justify;
@@ -0,0 +1,49 @@
1
+ @import "../helpers/index.scss";
2
+
3
+ // History page styles
4
+ .history-box {
5
+ width: 752px;
6
+ padding: 24px;
7
+ background: #ffffff;
8
+ border: 1px solid $grey-light-clr;
9
+ border-radius: 4px;
10
+ .history-item {
11
+ display: grid;
12
+ grid-template-columns: 32px 1fr;
13
+ grid-gap: 8px;
14
+ align-items: center;
15
+ margin-bottom: 32px;
16
+ &:nth-last-child(1) {
17
+ margin-bottom: 0;
18
+ }
19
+ .profile-pic {
20
+ img {
21
+ width: 32px;
22
+ height: 32px;
23
+ object-fit: cover;
24
+ border-radius: 50%;
25
+ }
26
+ }
27
+ .history-info {
28
+ display: inline-flex;
29
+ font-family: 'Open Sans', sans-serif;
30
+ font-size: 14px;
31
+ line-height: 22px;
32
+ .bold-text {
33
+ font-weight: 600;
34
+ color: #1d21d9;
35
+ margin-right: 4px;
36
+ }
37
+ .normal-text {
38
+ font-weight: 400;
39
+ color: #1d21d9;
40
+ margin-right: 4px;
41
+ }
42
+ .light-text {
43
+ font-weight: 400;
44
+ color: $ink-lighter-clr;
45
+ margin-right: 4px;
46
+ }
47
+ }
48
+ }
49
+ }
@@ -8,7 +8,9 @@ module CmAdmin
8
8
  def cm_index(params)
9
9
  @current_action = CmAdmin::Models::Action.find_by(@model, name: 'index')
10
10
  # Based on the params the filter and pagination object to be set
11
- @ar_object = filter_by(params, nil, @model.filter_params(params))
11
+ records = "CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user, @model.name.constantize).resolve
12
+ records = apply_scopes(records)
13
+ @ar_object = filter_by(params, records, @model.filter_params(params))
12
14
  # resource_identifier
13
15
  respond_to do |format|
14
16
  if request.xhr?
@@ -91,9 +93,23 @@ module CmAdmin
91
93
  end
92
94
  end
93
95
 
94
- def cm_custom_method(params)
95
- scoped_model = "CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user, @model.name.constantize).resolve
96
+ def cm_history(params)
97
+ @current_action = CmAdmin::Models::Action.find_by(@model, name: 'history')
96
98
  resource_identifier
99
+ respond_to do |format|
100
+ format.html { render '/cm_admin/main/history' }
101
+ end
102
+ end
103
+
104
+ def cm_custom_method(params)
105
+ records = "CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user, @model.name.constantize).resolve
106
+ @current_action = @action
107
+ if @action.parent == 'index'
108
+ records = apply_scopes(records)
109
+ @ar_object = filter_by(params, records, @model.filter_params(params))
110
+ else
111
+ resource_identifier
112
+ end
97
113
  respond_to do |format|
98
114
  if @action.action_type == :custom
99
115
  if @action.child_records
@@ -126,8 +142,8 @@ module CmAdmin
126
142
  authorize controller_name.classify.constantize, policy_class: "CmAdmin::#{controller_name.classify}Policy".constantize if defined? "CmAdmin::#{controller_name.classify}Policy".constantize
127
143
  aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
128
144
  @associated_ar_object = aar_model.find(params[:aar_id]) if params[:aar_id]
129
- nested_tables = @model.available_fields[:new].except(:fields).keys
130
- nested_tables += @model.available_fields[:edit].except(:fields).keys
145
+ nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
146
+ nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
131
147
  @reflections = @model.ar_model.reflect_on_all_associations
132
148
  nested_tables.each do |table_name|
133
149
  reflection = @reflections.select {|x| x if x.name == table_name}.first
@@ -162,6 +178,7 @@ module CmAdmin
162
178
  return @ar_object unless @current_action.child_records
163
179
 
164
180
  child_records = @ar_object.send(@current_action.child_records)
181
+ child_records = apply_scopes(child_records)
165
182
  @reflection = @model.ar_model.reflect_on_association(@current_action.child_records)
166
183
  @associated_model = if @reflection.klass.column_names.include?('type')
167
184
  CmAdmin::Model.find_by(name: @reflection.plural_name.classify)
@@ -176,6 +193,13 @@ module CmAdmin
176
193
  return @ar_object, @associated_model, @associated_ar_object
177
194
  end
178
195
 
196
+ def apply_scopes(records)
197
+ @current_action.scopes.each do |scope|
198
+ records = records.send(scope)
199
+ end
200
+ records
201
+ end
202
+
179
203
  def filter_by(params, records, filter_params={}, sort_params={})
180
204
  filtered_result = OpenStruct.new
181
205
  cm_model = @associated_model || @model
@@ -211,8 +235,8 @@ module CmAdmin
211
235
  Hash[x.name.to_s.gsub('_attachment', ''), []]
212
236
  end
213
237
  }.compact
214
- nested_tables = @model.available_fields[:new].except(:fields).keys
215
- nested_tables += @model.available_fields[:edit].except(:fields).keys
238
+ nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
239
+ nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
216
240
  nested_fields = nested_tables.uniq.map {|table|
217
241
  Hash[
218
242
  table.to_s + '_attributes',