cm-admin 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) 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 +18 -17
  6. data/app/assets/javascripts/cm_admin/scaffolds.js +5 -1
  7. data/app/assets/stylesheets/cm_admin/base/auth.scss +113 -0
  8. data/app/assets/stylesheets/cm_admin/base/common.scss +2 -2
  9. data/app/assets/stylesheets/cm_admin/base/form.scss +4 -0
  10. data/app/assets/stylesheets/cm_admin/base/table.scss +2 -1
  11. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +1 -0
  12. data/app/assets/stylesheets/cm_admin/helpers/_mixins.scss +1 -1
  13. data/app/assets/stylesheets/cm_admin/pages/history_page.scss +49 -0
  14. data/app/controllers/cm_admin/resource_controller.rb +23 -5
  15. data/app/views/cm_admin/main/_nested_fields.html.slim +1 -1
  16. data/app/views/cm_admin/main/_nested_table_form.html.slim +2 -2
  17. data/app/views/cm_admin/main/_tabs.html.slim +5 -1
  18. data/app/views/cm_admin/main/associated_show.html.slim +1 -1
  19. data/app/views/cm_admin/main/history.html.slim +17 -0
  20. data/app/views/cm_admin/main/new.html.slim +2 -5
  21. data/app/views/cm_admin/main/show.html.slim +1 -1
  22. data/app/views/layouts/_left_sidebar_nav.html.slim +15 -19
  23. data/config/routes.rb +9 -1
  24. data/lib/cm_admin/constants.rb +4 -0
  25. data/lib/cm_admin/model.rb +2 -2
  26. data/lib/cm_admin/models/action.rb +2 -1
  27. data/lib/cm_admin/models/dsl_method.rb +11 -15
  28. data/lib/cm_admin/models/section.rb +38 -0
  29. data/lib/cm_admin/version.rb +1 -1
  30. data/lib/cm_admin/view_helpers/form_helper.rb +55 -30
  31. data/lib/cm_admin/view_helpers/page_info_helper.rb +6 -0
  32. data/lib/generators/cm_admin/templates/application_policy.rb +4 -0
  33. data/package-lock.json +61 -61
  34. data/package.json +1 -1
  35. data/yarn.lock +6589 -6425
  36. metadata +6 -5
  37. data/.github/workflows/.stylelintrc.json +0 -3
  38. data/lib/cm_admin/models/cm_show_section.rb +0 -19
  39. 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: 5f00ed8703bf0c8f35c6b9d5f403bc8db0804888e02b2036c23c0d610413cfc2
4
+ data.tar.gz: 18ff830bd0ca02cd53b31ca03c9012f575e2b90b098d80df02a05f1193f97023
5
5
  SHA512:
6
- metadata.gz: 444abf2ad421b1db1bdba4b506a7645e1d5e1653b78c6610c434f45999acc0b7b7ae11017df43f82f37058ec1cdff0aeb5b2a0a3ea0dc08e25c22b713d1cf6c0
7
- data.tar.gz: b3475419d75358580b07914f988183071b95ad7a2f891811a8dce9a89aa2b1d90237a0b7b8340619142f90ab62de50e3b50f0ffa626a948a09f306c12601acc5
6
+ metadata.gz: 0f2704eaff88ff0d98cdbae358d9cab8274b155f4ae522a31816316bfafac14771d695eb0ca9f8ea4e8eccb474953533ccccc58ddb39c1acf872143da16861f5
7
+ data.tar.gz: f380015428b39a3b6ea4666f23de193f192b8b88932b08d90048f18387de44712c8c9188f12f8d2931c775bebd4f3fa5d4b1b5b57cb27afd693080646558c20f
@@ -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.3)
5
5
  caxlsx_rails
6
6
  cocoon (~> 1.2.15)
7
7
  csv-importer (~> 0.8.2)
@@ -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!
@@ -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
+ });
@@ -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'
@@ -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,6 +93,14 @@ module CmAdmin
91
93
  end
92
94
  end
93
95
 
96
+ def cm_history(params)
97
+ @current_action = CmAdmin::Models::Action.find_by(@model, name: 'history')
98
+ resource_identifier
99
+ respond_to do |format|
100
+ format.html { render '/cm_admin/main/history' }
101
+ end
102
+ end
103
+
94
104
  def cm_custom_method(params)
95
105
  scoped_model = "CmAdmin::#{@model.name}Policy::Scope".constantize.new(Current.user, @model.name.constantize).resolve
96
106
  resource_identifier
@@ -126,8 +136,8 @@ module CmAdmin
126
136
  authorize controller_name.classify.constantize, policy_class: "CmAdmin::#{controller_name.classify}Policy".constantize if defined? "CmAdmin::#{controller_name.classify}Policy".constantize
127
137
  aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
128
138
  @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
139
+ nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
140
+ nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
131
141
  @reflections = @model.ar_model.reflect_on_all_associations
132
142
  nested_tables.each do |table_name|
133
143
  reflection = @reflections.select {|x| x if x.name == table_name}.first
@@ -162,6 +172,7 @@ module CmAdmin
162
172
  return @ar_object unless @current_action.child_records
163
173
 
164
174
  child_records = @ar_object.send(@current_action.child_records)
175
+ child_records = apply_scopes(child_records)
165
176
  @reflection = @model.ar_model.reflect_on_association(@current_action.child_records)
166
177
  @associated_model = if @reflection.klass.column_names.include?('type')
167
178
  CmAdmin::Model.find_by(name: @reflection.plural_name.classify)
@@ -176,6 +187,13 @@ module CmAdmin
176
187
  return @ar_object, @associated_model, @associated_ar_object
177
188
  end
178
189
 
190
+ def apply_scopes(records)
191
+ @current_action.scopes.each do |scope|
192
+ records = records.send(scope)
193
+ end
194
+ records
195
+ end
196
+
179
197
  def filter_by(params, records, filter_params={}, sort_params={})
180
198
  filtered_result = OpenStruct.new
181
199
  cm_model = @associated_model || @model
@@ -211,8 +229,8 @@ module CmAdmin
211
229
  Hash[x.name.to_s.gsub('_attachment', ''), []]
212
230
  end
213
231
  }.compact
214
- nested_tables = @model.available_fields[:new].except(:fields).keys
215
- nested_tables += @model.available_fields[:edit].except(:fields).keys
232
+ nested_tables = @model.available_fields[:new].map(&:nested_table_fields).map(&:keys).flatten
233
+ nested_tables += @model.available_fields[:edit].map(&:nested_table_fields).map(&:keys).flatten
216
234
  nested_fields = nested_tables.uniq.map {|table|
217
235
  Hash[
218
236
  table.to_s + '_attributes',
@@ -1,4 +1,4 @@
1
- - fields = @model.available_fields[ action(action_name) ][assoc_name]
1
+ - fields = section.nested_table_fields[assoc_name]
2
2
  - if fields.count == 1
3
3
  .nested-single-field.nested-fields
4
4
  - fields.each do |field|
@@ -3,7 +3,7 @@
3
3
  .accordion.nested-form-accordion
4
4
  = f.fields_for table_name do |record|
5
5
  - if record.object.persisted?
6
- = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
6
+ = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name, section: section }
7
7
  - if @reflections.select {|x| x if x.name == table_name}.first.macro == :has_many
8
8
  .links
9
- = link_to_add_association "+ Add #{table_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: table_name }}, class: 'd-inline-block secondary-btn mt-2'
9
+ = link_to_add_association "+ Add #{table_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: table_name, section: section }}, class: 'd-inline-block secondary-btn mt-2'
@@ -4,4 +4,8 @@ ul.nav.nav-pills
4
4
  - if nav_item.custom_action.empty? || (nav_item.custom_action.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{nav_item.custom_action}?"))
5
5
  li.nav-item
6
6
  - nav_item_action_name = nav_item.custom_action.present? ? nav_item.custom_action : 'show'
7
- = link_to tab_display_name(nav_item.nav_item_name), cm_admin.send("#{@ar_object.model_name.singular}_#{nav_item_action_name}_path", @ar_object.id), class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
7
+ = link_to tab_display_name(nav_item.nav_item_name), cm_admin.send("#{@ar_object.model_name.singular}_#{nav_item_action_name}_path", @ar_object.id), class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
8
+ // current_action_name is defined when action trail is added to that model
9
+ - if defined?(@ar_object.current_action_name)
10
+ li.nav-item
11
+ = link_to 'History', cm_admin.send("#{@ar_object.model_name.singular}_history_path", @ar_object.id), class: "nav-link #{ action_name == 'history' ? 'active' : ''}"
@@ -2,5 +2,5 @@
2
2
  .info-section
3
3
  p.section-heading = section.section_name
4
4
  .paper
5
- - section.available_section_fields.each do |field|
5
+ - section.section_fields.each do |field|
6
6
  = show_field(@associated_ar_object, field)
@@ -0,0 +1,17 @@
1
+ .show-page.cm-page-container
2
+ .show-page__tabs.sticky-container.page-top-bar
3
+ .cm-tabs-bar
4
+ == render 'cm_admin/main/top_navbar'
5
+ == render 'cm_admin/main/tabs'
6
+ .show-page__inner.scrollable
7
+ .history-box
8
+ - @ar_object.action_trails.each do |at|
9
+ .history-item
10
+ .profile-pic
11
+ img alt=("profile") src="https://www.pngitem.com/pimgs/m/264-2647677_avatar-icon-human-user-avatar-svg-hd-png.png"
12
+ .history-info
13
+ span.bold-text = at.actor.first_name
14
+ span.normal-text = at.trail_type.titleize
15
+ span.normal-text the
16
+ span.bold-text = at.entity_type
17
+ span.light-text = at.created_at.strftime("%B")
@@ -15,8 +15,5 @@
15
15
  ul
16
16
  - @ar_object.errors.full_messages.each do |error_message|
17
17
  li = error_message
18
- .form-container
19
- p.form-title
20
- | Section heading
21
- .form-container__inner
22
- = generate_form(@ar_object.class.name.constantize.new, @model)
18
+
19
+ = generate_form(@ar_object.class.name.constantize.new, @model)
@@ -12,5 +12,5 @@
12
12
  .info-section
13
13
  p.section-heading = section.section_name
14
14
  .paper
15
- - section.available_section_fields.each do |field|
15
+ - section.section_fields.each do |field|
16
16
  = show_field(@ar_object, field)
@@ -12,23 +12,19 @@
12
12
 
13
13
  .sidebar-menu__tabs-wrapper
14
14
 
15
-
16
- .sidebar__footer
17
- .profile-name
18
- span.profile-avatar J
19
- | John Doe
20
- .profile-popup.hidden
21
- .profile-info
22
- .profile-info__left
23
- p.name-text John Doe
24
- p.email-text johndoe@commutatus.com
25
- .profile-info__right J
26
- .page-options
27
- = link_to '/', class: 'page-link'
28
- | Profile
29
- = link_to '', class: 'page-link'
30
- | Settings
31
- .auth-option
32
- = link_to '/sign-out', method: :delete, class: 'auth-link'
33
- | Logout
15
+ - if defined?(user_full_name)
16
+ .sidebar__footer
17
+ .menu-item
18
+ .profile-name
19
+ span.profile-avatar J
20
+ | #{user_full_name}
21
+ .profile-popup.hidden
22
+ .profile-info
23
+ .profile-info__left
24
+ p.name-text = user_full_name
25
+ p.email-text = current_user.email
26
+ .profile-info__right
27
+ .auth-option
28
+ = link_to destroy_user_session_path, method: :delete, class: 'auth-link', data: { turbo_method: :delete }
29
+ | Logout
34
30
  = render 'layouts/quick_links'
data/config/routes.rb CHANGED
@@ -16,9 +16,17 @@ CmAdmin::Engine.routes.draw do
16
16
  send(:post, 'import', to: "#{model.name.underscore}#import", as: "#{model.name.underscore}_import")
17
17
  end
18
18
  end
19
+
19
20
  model.available_actions.sort_by {|act| act.name}.each do |act|
20
21
  scope model.name.tableize do
21
- send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
22
+ # Define route only when action trail related field is present
23
+ if act.name == 'history'
24
+ if defined?(model.ar_model.new.current_action_name)
25
+ send(:get, ':id/history', to: "#{model.name.underscore}#history", as: "#{model.name.underscore}_history")
26
+ end
27
+ else
28
+ send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
29
+ end
22
30
  end
23
31
  end
24
32
  end
@@ -28,6 +28,10 @@ module CmAdmin
28
28
  verb: :delete,
29
29
  path: ':id'
30
30
  },
31
+ history: {
32
+ verb: :get,
33
+ path: ':id/history'
34
+ },
31
35
  custom_action: {
32
36
  verb: :post
33
37
  }
@@ -8,7 +8,7 @@ require_relative 'models/blocks'
8
8
  require_relative 'models/column'
9
9
  require_relative 'models/filter'
10
10
  require_relative 'models/export'
11
- require_relative 'models/cm_show_section'
11
+ require_relative 'models/section'
12
12
  require_relative 'models/tab'
13
13
  require_relative 'models/dsl_method'
14
14
  require 'pagy'
@@ -36,7 +36,7 @@ module CmAdmin
36
36
  @additional_permitted_fields ||= []
37
37
  @current_action = nil
38
38
  @available_tabs ||= []
39
- @available_fields ||= {index: [], show: [], edit: {fields: []}, new: {fields: []}}
39
+ @available_fields ||= {index: [], show: [], edit: [], new: []}
40
40
  @params = nil
41
41
  @filters ||= []
42
42
  instance_eval(&block) if block_given?
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  include Actions::Blocks
7
7
  attr_accessor :name, :display_name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
8
8
  :child_records, :is_nested_field, :nested_table_name, :parent, :display_if, :route_type, :code_block,
9
- :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name
9
+ :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name, :scopes
10
10
 
11
11
  VALID_SORT_DIRECTION = Set[:asc, :desc].freeze
12
12
 
@@ -34,6 +34,7 @@ module CmAdmin
34
34
  self.action_type = :default
35
35
  self.sort_column = :created_at
36
36
  self.sort_direction = :desc
37
+ self.scopes ||= []
37
38
  self.icon_name = 'fa fa-th-large'
38
39
  end
39
40