administrate-field-active_storage 0.3.4 → 0.3.8

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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +21 -0
  3. data/.gitignore +0 -1
  4. data/.ruby-version +1 -1
  5. data/Gemfile.lock +217 -0
  6. data/README.md +8 -1
  7. data/administrate-field-active_storage.gemspec +3 -2
  8. data/app/views/fields/active_storage/_form.html.erb +4 -1
  9. data/app/views/fields/active_storage/_index.html.erb +19 -8
  10. data/app/views/fields/active_storage/_item.html.erb +2 -1
  11. data/app/views/fields/active_storage/_items.html.erb +6 -1
  12. data/app/views/fields/active_storage/_preview.html.erb +17 -3
  13. data/app/views/fields/active_storage/_show.html.erb +1 -1
  14. data/config/i18n-tasks.yml +8 -0
  15. data/config/locales/administrate-field-active_storage.en.yml +10 -0
  16. data/config/locales/administrate-field-active_storage.ru.yml +10 -0
  17. data/contribute.md +3 -0
  18. data/lib/administrate/field/active_storage.rb +3 -3
  19. data/spec/i18n_spec.rb +35 -0
  20. data/test_app/.browserslistrc +1 -0
  21. data/test_app/.gitattributes +10 -0
  22. data/{example-project → test_app}/.gitignore +9 -7
  23. data/test_app/.ruby-version +1 -0
  24. data/test_app/Gemfile +45 -0
  25. data/test_app/Gemfile.lock +237 -0
  26. data/{example-project → test_app}/README.md +0 -0
  27. data/{example-project → test_app}/Rakefile +1 -1
  28. data/test_app/app/assets/config/manifest.js +4 -0
  29. data/{example-project → test_app}/app/assets/images/.keep +0 -0
  30. data/{example-project → test_app}/app/assets/stylesheets/application.css +0 -0
  31. data/{example-project → test_app}/app/controllers/admin/application_controller.rb +3 -3
  32. data/test_app/app/controllers/admin/posts_controller.rb +46 -0
  33. data/{example-project → test_app}/app/controllers/application_controller.rb +0 -0
  34. data/{example-project/app/dashboards/user_dashboard.rb → test_app/app/dashboards/post_dashboard.rb} +29 -27
  35. data/{example-project → test_app}/app/helpers/application_helper.rb +0 -0
  36. data/test_app/app/javascript/packs/application.js +10 -0
  37. data/{example-project → test_app}/app/models/application_record.rb +0 -0
  38. data/test_app/app/models/post.rb +3 -0
  39. data/test_app/app/views/layouts/application.html.erb +16 -0
  40. data/test_app/bin/bundle +114 -0
  41. data/test_app/bin/rails +4 -0
  42. data/test_app/bin/rake +4 -0
  43. data/{example-project → test_app}/bin/setup +6 -9
  44. data/test_app/config/application.rb +35 -0
  45. data/{example-project/bin/bundle → test_app/config/boot.rb} +2 -2
  46. data/test_app/config/credentials.yml.enc +1 -0
  47. data/{example-project → test_app}/config/database.yml +1 -1
  48. data/{example-project → test_app}/config/environment.rb +1 -1
  49. data/{example-project → test_app}/config/environments/development.rb +21 -11
  50. data/{example-project → test_app}/config/environments/production.rb +36 -24
  51. data/{example-project → test_app}/config/environments/test.rb +20 -14
  52. data/{example-project → test_app}/config/initializers/application_controller_renderer.rb +0 -0
  53. data/{example-project → test_app}/config/initializers/assets.rb +0 -0
  54. data/test_app/config/initializers/backtrace_silencers.rb +8 -0
  55. data/{example-project → test_app}/config/initializers/content_security_policy.rb +5 -0
  56. data/{example-project → test_app}/config/initializers/cookies_serializer.rb +0 -0
  57. data/{example-project → test_app}/config/initializers/filter_parameter_logging.rb +3 -1
  58. data/{example-project → test_app}/config/initializers/inflections.rb +0 -0
  59. data/{example-project → test_app}/config/initializers/mime_types.rb +0 -0
  60. data/test_app/config/initializers/permissions_policy.rb +11 -0
  61. data/{example-project → test_app}/config/initializers/wrap_parameters.rb +0 -0
  62. data/{example-project → test_app}/config/locales/en.yml +1 -1
  63. data/{example-project → test_app}/config/puma.rb +13 -4
  64. data/test_app/config/routes.rb +9 -0
  65. data/{example-project → test_app}/config/storage.yml +0 -0
  66. data/{example-project → test_app}/config.ru +2 -1
  67. data/{example-project/db/migrate/20181221134334_create_active_storage_tables.active_storage.rb → test_app/db/migrate/20210118122804_create_active_storage_tables.active_storage.rb} +15 -5
  68. data/test_app/db/migrate/20210118122927_create_posts.rb +8 -0
  69. data/{example-project → test_app}/db/schema.rb +18 -10
  70. data/{example-project → test_app}/db/seeds.rb +1 -1
  71. data/test_app/lib/active_storage/fixture_set.rb +71 -0
  72. data/{example-project → test_app}/public/404.html +0 -0
  73. data/{example-project → test_app}/public/422.html +0 -0
  74. data/{example-project → test_app}/public/500.html +0 -0
  75. data/{example-project → test_app}/public/apple-touch-icon-precomposed.png +0 -0
  76. data/{example-project → test_app}/public/apple-touch-icon.png +0 -0
  77. data/{example-project → test_app}/public/favicon.ico +0 -0
  78. data/test_app/public/robots.txt +1 -0
  79. data/{example-project → test_app}/test/application_system_test_case.rb +0 -0
  80. data/test_app/test/controllers/admin/posts_controller_test.rb +14 -0
  81. data/test_app/test/fixtures/active_storage/attachments.yml +4 -0
  82. data/test_app/test/fixtures/active_storage/blobs.yml +2 -0
  83. data/test_app/test/fixtures/files/cover_image.jpg +0 -0
  84. data/test_app/test/fixtures/posts.yml +11 -0
  85. data/test_app/test/models/post_test.rb +9 -0
  86. data/test_app/test/test_helper.rb +20 -0
  87. metadata +97 -99
  88. data/Rakefile +0 -22
  89. data/example-project/.ruby-version +0 -1
  90. data/example-project/Gemfile +0 -67
  91. data/example-project/Gemfile.lock +0 -265
  92. data/example-project/app/assets/config/manifest.js +0 -3
  93. data/example-project/app/assets/javascripts/application.js +0 -16
  94. data/example-project/app/assets/javascripts/cable.js +0 -13
  95. data/example-project/app/assets/javascripts/channels/.keep +0 -0
  96. data/example-project/app/channels/application_cable/channel.rb +0 -4
  97. data/example-project/app/channels/application_cable/connection.rb +0 -4
  98. data/example-project/app/controllers/admin/users_controller.rb +0 -27
  99. data/example-project/app/controllers/concerns/.keep +0 -0
  100. data/example-project/app/controllers/users_controller.rb +0 -7
  101. data/example-project/app/jobs/application_job.rb +0 -2
  102. data/example-project/app/mailers/application_mailer.rb +0 -4
  103. data/example-project/app/models/concerns/.keep +0 -0
  104. data/example-project/app/models/user.rb +0 -3
  105. data/example-project/app/views/layouts/application.html.erb +0 -15
  106. data/example-project/app/views/layouts/mailer.html.erb +0 -13
  107. data/example-project/app/views/layouts/mailer.text.erb +0 -1
  108. data/example-project/bin/rails +0 -9
  109. data/example-project/bin/rake +0 -9
  110. data/example-project/bin/spring +0 -17
  111. data/example-project/bin/update +0 -31
  112. data/example-project/bin/yarn +0 -11
  113. data/example-project/config/application.rb +0 -19
  114. data/example-project/config/boot.rb +0 -4
  115. data/example-project/config/cable.yml +0 -10
  116. data/example-project/config/credentials.yml.enc +0 -1
  117. data/example-project/config/initializers/backtrace_silencers.rb +0 -7
  118. data/example-project/config/routes.rb +0 -10
  119. data/example-project/config/spring.rb +0 -6
  120. data/example-project/db/migrate/20181013145025_create_users.rb +0 -9
  121. data/example-project/lib/assets/.keep +0 -0
  122. data/example-project/lib/tasks/.keep +0 -0
  123. data/example-project/log/.keep +0 -0
  124. data/example-project/package.json +0 -5
  125. data/example-project/public/robots.txt +0 -1
  126. data/example-project/test/controllers/.keep +0 -0
  127. data/example-project/test/fixtures/.keep +0 -0
  128. data/example-project/test/fixtures/files/.keep +0 -0
  129. data/example-project/test/fixtures/users.yml +0 -7
  130. data/example-project/test/helpers/.keep +0 -0
  131. data/example-project/test/integration/.keep +0 -0
  132. data/example-project/test/mailers/.keep +0 -0
  133. data/example-project/test/models/.keep +0 -0
  134. data/example-project/test/models/user_test.rb +0 -7
  135. data/example-project/test/system/.keep +0 -0
  136. data/example-project/test/test_helper.rb +0 -10
  137. data/example-project/tmp/.keep +0 -0
  138. data/example-project/vendor/.keep +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5f396ea1832dd7c8848f9017c8b613fb8db660a180756a4e7e3ef1c3ca91a3b
4
- data.tar.gz: 0e87c2670d021f05baaef9e8a38fb93ba142da11d4bbebdb72b971a9a716f9a0
3
+ metadata.gz: 7d685dc2a380f464f63d5b78dfd5a3c967e4a22ec7b28218f8e8bd8f22d5039e
4
+ data.tar.gz: ae36c6c3b520706249cf3bb917f1441cd22506f9ea0761fb14f51834406e2c7d
5
5
  SHA512:
6
- metadata.gz: 1735bce16f591be4615fe9fa817b51b73c4df8a725d77a2b3b1b92b746a7bd515ab5e3df3b51814932d26a11f0dae6c545a6e582f32c08a947c1913fb0c8de13
7
- data.tar.gz: 5d1654ccac549cee8fbbba1ded8cb15899cf05922aa083f3463b7207e3d8cee5e812f7b696bd7b999ba5b27608ac569bb23310702510092ada71ee7f4db5ca0f
6
+ metadata.gz: 91b86562577256f867aa848391004229f58200757c8ddddc9895d22d6907c15472d5e0308e292323979787687f9362a7aba9b2d7f2ec63cad8ac4151d6559069
7
+ data.tar.gz: 842ece6e36fb7592cbea4a99a362af6862824cb74f60dfe4f7d28a07a0a95d7174669e7a3e68dce5152efa9a4ce35309ac6271c685e335b1990e24ebdf352ad9
@@ -0,0 +1,21 @@
1
+ name: CI
2
+
3
+ on: [push,pull_request]
4
+
5
+ env:
6
+ RAILS_MASTER_KEY: ca18e029a12884a87e96cf6a64a12fb5
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - uses: ruby/setup-ruby@v1
14
+ - uses: actions/cache@v2
15
+ with:
16
+ path: vendor/bundle
17
+ key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
18
+ restore-keys: |
19
+ bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-
20
+ - run: test_app/bin/setup
21
+ - run: cd test_app && bundle exec rails test
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.5
1
+ 3.0.0
data/Gemfile.lock ADDED
@@ -0,0 +1,217 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ administrate-field-active_storage (0.3.6)
5
+ administrate (>= 0.2.2)
6
+ rails (>= 6.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ actioncable (6.1.1)
12
+ actionpack (= 6.1.1)
13
+ activesupport (= 6.1.1)
14
+ nio4r (~> 2.0)
15
+ websocket-driver (>= 0.6.1)
16
+ actionmailbox (6.1.1)
17
+ actionpack (= 6.1.1)
18
+ activejob (= 6.1.1)
19
+ activerecord (= 6.1.1)
20
+ activestorage (= 6.1.1)
21
+ activesupport (= 6.1.1)
22
+ mail (>= 2.7.1)
23
+ actionmailer (6.1.1)
24
+ actionpack (= 6.1.1)
25
+ actionview (= 6.1.1)
26
+ activejob (= 6.1.1)
27
+ activesupport (= 6.1.1)
28
+ mail (~> 2.5, >= 2.5.4)
29
+ rails-dom-testing (~> 2.0)
30
+ actionpack (6.1.1)
31
+ actionview (= 6.1.1)
32
+ activesupport (= 6.1.1)
33
+ rack (~> 2.0, >= 2.0.9)
34
+ rack-test (>= 0.6.3)
35
+ rails-dom-testing (~> 2.0)
36
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
37
+ actiontext (6.1.1)
38
+ actionpack (= 6.1.1)
39
+ activerecord (= 6.1.1)
40
+ activestorage (= 6.1.1)
41
+ activesupport (= 6.1.1)
42
+ nokogiri (>= 1.8.5)
43
+ actionview (6.1.1)
44
+ activesupport (= 6.1.1)
45
+ builder (~> 3.1)
46
+ erubi (~> 1.4)
47
+ rails-dom-testing (~> 2.0)
48
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
49
+ activejob (6.1.1)
50
+ activesupport (= 6.1.1)
51
+ globalid (>= 0.3.6)
52
+ activemodel (6.1.1)
53
+ activesupport (= 6.1.1)
54
+ activerecord (6.1.1)
55
+ activemodel (= 6.1.1)
56
+ activesupport (= 6.1.1)
57
+ activestorage (6.1.1)
58
+ actionpack (= 6.1.1)
59
+ activejob (= 6.1.1)
60
+ activerecord (= 6.1.1)
61
+ activesupport (= 6.1.1)
62
+ marcel (~> 0.3.1)
63
+ mimemagic (~> 0.3.2)
64
+ activesupport (6.1.1)
65
+ concurrent-ruby (~> 1.0, >= 1.0.2)
66
+ i18n (>= 1.6, < 2)
67
+ minitest (>= 5.1)
68
+ tzinfo (~> 2.0)
69
+ zeitwerk (~> 2.3)
70
+ administrate (0.14.0)
71
+ actionpack (>= 4.2)
72
+ actionview (>= 4.2)
73
+ activerecord (>= 4.2)
74
+ autoprefixer-rails (>= 6.0)
75
+ datetime_picker_rails (~> 0.0.7)
76
+ jquery-rails (>= 4.0)
77
+ kaminari (>= 1.0)
78
+ momentjs-rails (~> 2.8)
79
+ sassc-rails (~> 2.1)
80
+ selectize-rails (~> 0.6)
81
+ ast (2.4.2)
82
+ autoprefixer-rails (10.2.0.0)
83
+ execjs
84
+ builder (3.2.4)
85
+ concurrent-ruby (1.1.8)
86
+ crass (1.0.6)
87
+ datetime_picker_rails (0.0.7)
88
+ momentjs-rails (>= 2.8.1)
89
+ erubi (1.10.0)
90
+ execjs (2.7.0)
91
+ ffi (1.14.2)
92
+ globalid (0.4.2)
93
+ activesupport (>= 4.2.0)
94
+ highline (2.0.3)
95
+ i18n (1.8.7)
96
+ concurrent-ruby (~> 1.0)
97
+ i18n-tasks (0.9.34)
98
+ activesupport (>= 4.0.2)
99
+ ast (>= 2.1.0)
100
+ erubi
101
+ highline (>= 2.0.0)
102
+ i18n
103
+ parser (>= 2.2.3.0)
104
+ rails-i18n
105
+ rainbow (>= 2.2.2, < 4.0)
106
+ terminal-table (>= 1.5.1)
107
+ jquery-rails (4.4.0)
108
+ rails-dom-testing (>= 1, < 3)
109
+ railties (>= 4.2.0)
110
+ thor (>= 0.14, < 2.0)
111
+ kaminari (1.2.1)
112
+ activesupport (>= 4.1.0)
113
+ kaminari-actionview (= 1.2.1)
114
+ kaminari-activerecord (= 1.2.1)
115
+ kaminari-core (= 1.2.1)
116
+ kaminari-actionview (1.2.1)
117
+ actionview
118
+ kaminari-core (= 1.2.1)
119
+ kaminari-activerecord (1.2.1)
120
+ activerecord
121
+ kaminari-core (= 1.2.1)
122
+ kaminari-core (1.2.1)
123
+ loofah (2.9.0)
124
+ crass (~> 1.0.2)
125
+ nokogiri (>= 1.5.9)
126
+ mail (2.7.1)
127
+ mini_mime (>= 0.1.1)
128
+ marcel (0.3.3)
129
+ mimemagic (~> 0.3.2)
130
+ method_source (1.0.0)
131
+ mimemagic (0.3.5)
132
+ mini_mime (1.0.2)
133
+ minitest (5.14.3)
134
+ momentjs-rails (2.20.1)
135
+ railties (>= 3.1)
136
+ nio4r (2.5.4)
137
+ nokogiri (1.11.1-x86_64-darwin)
138
+ racc (~> 1.4)
139
+ nokogiri (1.11.1-x86_64-linux)
140
+ racc (~> 1.4)
141
+ parser (3.0.0.0)
142
+ ast (~> 2.4.1)
143
+ racc (1.5.2)
144
+ rack (2.2.3)
145
+ rack-test (1.1.0)
146
+ rack (>= 1.0, < 3)
147
+ rails (6.1.1)
148
+ actioncable (= 6.1.1)
149
+ actionmailbox (= 6.1.1)
150
+ actionmailer (= 6.1.1)
151
+ actionpack (= 6.1.1)
152
+ actiontext (= 6.1.1)
153
+ actionview (= 6.1.1)
154
+ activejob (= 6.1.1)
155
+ activemodel (= 6.1.1)
156
+ activerecord (= 6.1.1)
157
+ activestorage (= 6.1.1)
158
+ activesupport (= 6.1.1)
159
+ bundler (>= 1.15.0)
160
+ railties (= 6.1.1)
161
+ sprockets-rails (>= 2.0.0)
162
+ rails-dom-testing (2.0.3)
163
+ activesupport (>= 4.2.0)
164
+ nokogiri (>= 1.6)
165
+ rails-html-sanitizer (1.3.0)
166
+ loofah (~> 2.3)
167
+ rails-i18n (6.0.0)
168
+ i18n (>= 0.7, < 2)
169
+ railties (>= 6.0.0, < 7)
170
+ railties (6.1.1)
171
+ actionpack (= 6.1.1)
172
+ activesupport (= 6.1.1)
173
+ method_source
174
+ rake (>= 0.8.7)
175
+ thor (~> 1.0)
176
+ rainbow (3.0.0)
177
+ rake (13.0.3)
178
+ sassc (2.4.0)
179
+ ffi (~> 1.9)
180
+ sassc-rails (2.1.2)
181
+ railties (>= 4.0.0)
182
+ sassc (>= 2.0)
183
+ sprockets (> 3.0)
184
+ sprockets-rails
185
+ tilt
186
+ selectize-rails (0.12.6)
187
+ sprockets (4.0.2)
188
+ concurrent-ruby (~> 1.0)
189
+ rack (> 1, < 3)
190
+ sprockets-rails (3.2.2)
191
+ actionpack (>= 4.0)
192
+ activesupport (>= 4.0)
193
+ sprockets (>= 3.0.0)
194
+ sqlite3 (1.4.2)
195
+ terminal-table (3.0.0)
196
+ unicode-display_width (~> 1.1, >= 1.1.1)
197
+ thor (1.1.0)
198
+ tilt (2.0.10)
199
+ tzinfo (2.0.4)
200
+ concurrent-ruby (~> 1.0)
201
+ unicode-display_width (1.7.0)
202
+ websocket-driver (0.7.3)
203
+ websocket-extensions (>= 0.1.0)
204
+ websocket-extensions (0.1.5)
205
+ zeitwerk (2.4.2)
206
+
207
+ PLATFORMS
208
+ x86_64-darwin-20
209
+ x86_64-linux
210
+
211
+ DEPENDENCIES
212
+ administrate-field-active_storage!
213
+ i18n-tasks (~> 0.9.34)
214
+ sqlite3 (~> 1.4)
215
+
216
+ BUNDLED WITH
217
+ 2.2.14
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Administrate::Field::ActiveStorage
2
2
  ![rails](https://img.shields.io/badge/rails-%3E%3D5.2.0-red.svg)
3
+ ![CI](https://github.com/Dreamersoul/administrate-field-active_storage/workflows/CI/badge.svg)
3
4
 
4
5
  ## Things To Know:
5
6
  - To preview pdf files you need to install `mupdf` or `Poppler`.
@@ -16,7 +17,7 @@ gem "image_processing"
16
17
 
17
18
  for rails 5.x use the following
18
19
  ```ruby
19
- gem 'administrate-field-active_storage' -v 0.1.8
20
+ gem 'administrate-field-active_storage', "0.1.8"
20
21
  ```
21
22
 
22
23
  Install:
@@ -59,6 +60,8 @@ class ModelDashboard < Administrate::BaseDashboard
59
60
  ```
60
61
  I know it is not ideal, if you have a workaround please submit a PR.
61
62
 
63
+ Note: Rails 6 introduced a new config to determine the behavior on updates to `has_many_attached`. Setting `Rails.application.config.active_storage.replace_on_assign_to_many` to `true` will overwrite any existing values (purging the old ones), and setting it to `false` will append the new values.
64
+
62
65
  ### Prevent N+1 queries
63
66
  In order to prevent N+1 queries from active storage you have to modify your admin model controller, below an example for a model called `User` and with attached avatars
64
67
  ```ruby
@@ -201,6 +204,10 @@ Defaults to `false`.
201
204
 
202
205
  Don't forget to include [ActiveStorage JavaScript](https://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads). You can use `rails generate administrate:assets:javascripts` to be able to customize Administrate JavaScripts in your application.
203
206
 
207
+ ## I18n
208
+
209
+ You can see translation example [here](https://github.com/Dreamersoul/administrate-field-active_storage/blob/master/config/locales/administrate-field-active_storage.en.yml).
210
+
204
211
  ## Things To Do:
205
212
  - [x] upload single file
206
213
  - [x] adding image support through url_for to support 3rd party cloud storage
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "administrate-field-active_storage"
5
- gem.version = "0.3.4"
5
+ gem.version = "0.3.8"
6
6
  gem.authors = ["Hamad AlGhanim"]
7
7
  gem.email = ["hamadyalghanim@gmail.com"]
8
8
  gem.homepage = "https://github.com/Dreamersoul/administrate-field-active_storage"
@@ -17,5 +17,6 @@ Gem::Specification.new do |gem|
17
17
  gem.add_dependency "administrate", ">= 0.2.2"
18
18
  gem.add_dependency "rails", ">= 6.0"
19
19
 
20
- gem.add_development_dependency "rspec", "~> 3.4"
20
+ gem.add_development_dependency 'sqlite3', '~> 1.4'
21
+ gem.add_development_dependency 'i18n-tasks', '~> 0.9.34'
21
22
  end
@@ -25,7 +25,10 @@ By default, the input is a text field for the image's URL.
25
25
  <% end %>
26
26
 
27
27
  <div>
28
- <%= field.can_add_attachment? ? "Add:" : "Replace:" %>
28
+ <%= field.can_add_attachment? ?
29
+ I18n.t("administrate.fields.active_storage.add", default: 'Add') :
30
+ I18n.t("administrate.fields.active_storage.replace", default: 'Replace')
31
+ %>
29
32
  <%= f.file_field field.attribute, multiple: field.many?, direct_upload: field.direct? %>
30
33
  </div>
31
34
  </div>
@@ -16,23 +16,34 @@ By default, the attribute is rendered as an image tag.
16
16
  %>
17
17
 
18
18
  <% if field.attached? %>
19
- <style> <%# figure out a way to remove this %>
19
+ <style type="text/css" nonce="<%= content_security_policy_nonce %>"> <%# figure out a way to remove this %>
20
20
  td img {
21
21
  max-height: unset !important;
22
22
  }
23
23
  </style>
24
24
  <% if field.index_display_preview? %>
25
- <%= render partial: 'fields/active_storage/preview',
26
- locals: {
27
- field: field,
28
- attachment: field.attachments[0],
29
- size: field.index_preview_size
30
- } %>
25
+ <% if field.many? %>
26
+ <%= render partial: 'fields/active_storage/items',
27
+ locals: {
28
+ field: field,
29
+ size: field.index_preview_size
30
+ } %>
31
+ <% else %>
32
+ <%= render partial: 'fields/active_storage/item',
33
+ locals: {
34
+ field: field,
35
+ attachment: field.data,
36
+ size: field.index_preview_size
37
+ } %>
38
+ <% end %>
31
39
  <% end %>
32
40
 
33
41
  <% if field.index_display_count? %>
34
42
  <div class="attachments-count">
35
- <%= pluralize(field.attachments.count, 'Attachment') %>
43
+ <%= pluralize(field.attachments.count,
44
+ I18n.t("administrate.fields.active_storage.attachment", default: 'Attachment')
45
+ )
46
+ %>
36
47
  </div>
37
48
  <% end %>
38
49
  <% end %>
@@ -36,7 +36,8 @@ controlled via a boolean local variable.
36
36
  <% if field.destroy_url.present? %>
37
37
  <% destroy_url = field.destroy_url.call(namespace, field.data.record, attachment) %>
38
38
  <div>
39
- <%= link_to 'Remove', destroy_url, method: :delete, class: 'remove-attachment-link' %>
39
+ <%= link_to I18n.t("administrate.fields.active_storage.remove", default: 'Remove'),
40
+ destroy_url, method: :delete, class: 'remove-attachment-link', data: { confirm: t("administrate.actions.confirm") } %>
40
41
  </div>
41
42
  <hr>
42
43
  <% end %>
@@ -11,10 +11,15 @@ This partial renders one or more attachments
11
11
  - `removable`:
12
12
  A boolean used to control the display of a `Remove` link which
13
13
  is used to destroy a single attachment. Defaults to `false`
14
+ - `size`:
15
+ [x, y]
16
+ Maximum size of the ActiveStorage preview.
17
+ Defaults to `field.show_preview_size`.
14
18
  %>
15
19
 
16
20
  <%
17
21
  removable = local_assigns.fetch(:removable, false)
22
+ size = local_assigns.fetch(:size, field.show_preview_size)
18
23
  %>
19
24
 
20
25
  <% field.attachments.each do |attachment| %>
@@ -24,7 +29,7 @@ This partial renders one or more attachments
24
29
  field: field,
25
30
  attachment: attachment,
26
31
  removable: removable,
27
- size: field.show_preview_size
32
+ size: size
28
33
  } %>
29
34
  </div>
30
35
  <% end %>
@@ -1,4 +1,11 @@
1
- <div style="width: <%=size[0]%>px; height: auto; overflow: hidden;">
1
+ <style type="text/css" nonce="<%= content_security_policy_nonce %>">
2
+ #as-field-<%= attachment.id %> {
3
+ width: <%=size[0]/2%>px;
4
+ height: auto;
5
+ overflow: hidden;
6
+ }
7
+ </style>
8
+ <div id="as-field-<%= attachment.id %>">
2
9
  <% if attachment.image? %>
3
10
  <% if attachment.variable? %>
4
11
  <%= image_tag(field.variant(attachment, resize_to_limit: size)) %>
@@ -6,14 +13,21 @@
6
13
  <%= image_tag(field.url(attachment)) %>
7
14
  <% end %>
8
15
  <% elsif attachment.video? %>
16
+ <style type="text/css" nonce="<%= content_security_policy_nonce %>">
17
+ #as-field-video-<%= attachment.id %> {
18
+ object-fit: contain;
19
+ width: 100%;
20
+ height: 100%;
21
+ }
22
+ </style>
9
23
  <% if attachment.previewable? %>
10
24
  <%= video_tag(field.url(attachment),
11
25
  poster: field.preview(attachment, resize_to_limit: size),
12
26
  controls: true,
13
27
  autobuffer: true,
14
- style: "object-fit: contain; width: 100%; height: 100%;") %>
28
+ id: "as-field-video-#{attachment.id}") %>
15
29
  <% else %>
16
- <%= video_tag(field.url(attachment), controls: true, autobuffer: true, style: "object-fit: contain; width: 100%; height: 100%;") %>
30
+ <%= video_tag(field.url(attachment), controls: true, autobuffer: true, id: "as-field-video-#{attachment.id}") %>
17
31
  <% end %>
18
32
  <% elsif attachment.audio? %>
19
33
  <%= audio_tag(field.url(attachment), autoplay: false, controls: true) %>
@@ -18,5 +18,5 @@ By default, the attribute is rendered as an image tag.
18
18
  <% if field.attached? %>
19
19
  <%= render partial: 'fields/active_storage/items', locals: { field: field } %>
20
20
  <% else %>
21
- No attachment
21
+ <%= I18n.t("administrate.fields.active_storage.no_attachment", default: 'No attachment') %>
22
22
  <% end %>
@@ -0,0 +1,8 @@
1
+ base_locale: en
2
+
3
+ data:
4
+ read:
5
+ - config/locales/administrate-field-active_storage.%{locale}.yml
6
+
7
+ ignore:
8
+ - 'administrate.actions.*'
@@ -0,0 +1,10 @@
1
+ ---
2
+ en:
3
+ administrate:
4
+ fields:
5
+ active_storage:
6
+ add: Add
7
+ attachment: Attachment
8
+ no_attachment: No attachment
9
+ remove: Remove
10
+ replace: Replace
@@ -0,0 +1,10 @@
1
+ ---
2
+ ru:
3
+ administrate:
4
+ fields:
5
+ active_storage:
6
+ add: Добавить
7
+ attachment: Вложение
8
+ no_attachment: Нет
9
+ remove: Удалить
10
+ replace: Заменить
data/contribute.md CHANGED
@@ -11,3 +11,6 @@
11
11
  - Daniel Tinoco [@0urobor0s](https://github.com/0urobor0s)
12
12
  - Matthew Hui [@mhui](https://github.com/mhui)
13
13
  - Sébastien Dubois [@sedubois](https://github.com/sedubois)
14
+ - Jazzy Gasper [@jazzygasper](https://github.com/jazzygasper)
15
+ - David Ma [@taikon](https://github.com/taikon)
16
+ - Dmitry Davydov [@haukot](https://github.com/haukot)
@@ -16,7 +16,7 @@ module Administrate
16
16
  end
17
17
 
18
18
  def index_display_count?
19
- options.fetch(:index_display_count) { attachments.present? && attachments.count != 1 }
19
+ options.fetch(:index_display_count) { attached? && attachments.count != 1 }
20
20
  end
21
21
 
22
22
  def show_display_preview?
@@ -50,7 +50,7 @@ module Administrate
50
50
  end
51
51
 
52
52
  def variant(attachment, options)
53
- Rails.application.routes.url_helpers.rails_representation_path(attachment.variant(combine_options: options), only_path: true)
53
+ Rails.application.routes.url_helpers.rails_representation_path(attachment.variant(options), only_path: true)
54
54
  end
55
55
 
56
56
  def url(attachment)
@@ -70,7 +70,7 @@ module Administrate
70
70
  end
71
71
 
72
72
  def attachments
73
- data.attachments if attached?
73
+ many? ? data.attachments : [data.attachment] if attached?
74
74
  end
75
75
  end
76
76
  end
data/spec/i18n_spec.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'i18n/tasks'
4
+
5
+ # Template i18n-tasks test file from https://github.com/glebm/i18n-tasks/blob/main/templates/rspec/i18n_spec.rb
6
+ RSpec.describe I18n do
7
+ let(:i18n) { I18n::Tasks::BaseTask.new }
8
+ let(:missing_keys) { i18n.missing_keys }
9
+ let(:unused_keys) { i18n.unused_keys }
10
+ let(:inconsistent_interpolations) { i18n.inconsistent_interpolations }
11
+
12
+ it 'does not have missing keys' do
13
+ expect(missing_keys).to be_empty,
14
+ "Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing' to show them"
15
+ end
16
+
17
+ it 'does not have unused keys' do
18
+ expect(unused_keys).to be_empty,
19
+ "#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to show them"
20
+ end
21
+
22
+ it 'files are normalized' do
23
+ non_normalized = i18n.non_normalized_paths
24
+ error_message = "The following files need to be normalized:\n" \
25
+ "#{non_normalized.map { |path| " #{path}" }.join("\n")}\n" \
26
+ "Please run `i18n-tasks normalize' to fix"
27
+ expect(non_normalized).to be_empty, error_message
28
+ end
29
+
30
+ it 'does not have inconsistent interpolations' do
31
+ error_message = "#{inconsistent_interpolations.leaves.count} i18n keys have inconsistent interpolations.\n" \
32
+ "Run `i18n-tasks check-consistent-interpolations' to show them"
33
+ expect(inconsistent_interpolations).to be_empty, error_message
34
+ end
35
+ end
@@ -0,0 +1 @@
1
+ defaults
@@ -0,0 +1,10 @@
1
+ # See https://git-scm.com/docs/gitattributes for more about git attribute files.
2
+
3
+ # Mark the database schema as having been generated.
4
+ db/schema.rb linguist-generated
5
+
6
+ # Mark the yarn lockfile as having been generated.
7
+ yarn.lock linguist-generated
8
+
9
+ # Mark any vendored files as having been vendored.
10
+ vendor/* linguist-vendored
@@ -9,22 +9,24 @@
9
9
 
10
10
  # Ignore the default SQLite database.
11
11
  /db/*.sqlite3
12
- /db/*.sqlite3-journal
12
+ /db/*.sqlite3-*
13
13
 
14
14
  # Ignore all logfiles and tempfiles.
15
15
  /log/*
16
16
  /tmp/*
17
- !/log/.keep
18
- !/tmp/.keep
19
17
 
20
- # Ignore uploaded files in development
18
+ # Ignore uploaded files in development.
21
19
  /storage/*
22
20
 
23
- /node_modules
24
- /yarn-error.log
25
-
26
21
  /public/assets
27
22
  .byebug_history
28
23
 
29
24
  # Ignore master key for decrypting credentials and more.
30
25
  /config/master.key
26
+
27
+ /public/packs
28
+ /public/packs-test
29
+ /node_modules
30
+ /yarn-error.log
31
+ yarn-debug.log*
32
+ .yarn-integrity
@@ -0,0 +1 @@
1
+ ruby-3.0.0
data/test_app/Gemfile ADDED
@@ -0,0 +1,45 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ruby '3.0.0'
5
+
6
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
7
+ gem 'rails', '~> 6.1.1'
8
+ # Use sqlite3 as the database for Active Record
9
+ gem 'sqlite3', '~> 1.4'
10
+ # Use Puma as the app server
11
+ gem 'puma', '~> 5.0'
12
+ # Use SCSS for stylesheets
13
+ gem 'sass-rails', '>= 6'
14
+ # Use Active Model has_secure_password
15
+ # gem 'bcrypt', '~> 3.1.7'
16
+
17
+ # Use Active Storage variant
18
+ # gem 'image_processing', '~> 1.2'
19
+
20
+ group :development, :test do
21
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
22
+ gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
23
+ end
24
+
25
+ group :development do
26
+ # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
27
+ gem 'web-console', '>= 4.1.0'
28
+ # Display performance information such as SQL time and flame graphs for each request in your browser.
29
+ # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
30
+ gem 'rack-mini-profiler', '~> 2.0'
31
+ end
32
+
33
+ group :test do
34
+ # Adds support for Capybara system testing and selenium driver
35
+ gem 'capybara', '>= 3.26'
36
+ gem 'selenium-webdriver'
37
+ # Easy installation and use of web drivers to run system tests with browsers
38
+ # gem 'webdrivers'
39
+ end
40
+
41
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
42
+ gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
43
+
44
+ gem "administrate", "~> 0.14.0"
45
+ gem "administrate-field-active_storage", path: ".."