alchemy_cms 7.2.6 → 7.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (186) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -9
  3. data/Gemfile +4 -3
  4. data/Rakefile +1 -0
  5. data/alchemy_cms.gemspec +7 -7
  6. data/app/assets/builds/alchemy/admin/page-select.css +1 -0
  7. data/app/assets/builds/alchemy/admin/page-select.css.map +1 -0
  8. data/app/assets/builds/alchemy/admin/print.css +1 -0
  9. data/app/assets/builds/alchemy/admin/print.css.map +1 -0
  10. data/app/assets/builds/alchemy/admin.css +1 -0
  11. data/app/assets/builds/alchemy/admin.css.map +1 -0
  12. data/app/assets/builds/alchemy/welcome.css +1 -0
  13. data/app/assets/builds/alchemy/welcome.css.map +1 -0
  14. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css +1 -0
  15. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css.map +1 -0
  16. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css +1 -0
  17. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css.map +1 -0
  18. data/app/assets/config/alchemy_manifest.js +2 -5
  19. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +4 -0
  20. data/app/assets/stylesheets/alchemy/{_custom-properties.scss → _custom-properties.css} +28 -25
  21. data/app/assets/stylesheets/alchemy/_deprecated_variables.scss +45 -0
  22. data/app/assets/stylesheets/alchemy/_deprecation.scss +17 -0
  23. data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
  24. data/app/assets/stylesheets/alchemy/_mixins.scss +21 -24
  25. data/app/assets/stylesheets/alchemy/_variables.scss +99 -95
  26. data/app/assets/stylesheets/alchemy/{archive.scss → admin/archive.scss} +23 -23
  27. data/app/assets/stylesheets/alchemy/{attachment-select.scss → admin/attachment-select.scss} +2 -2
  28. data/app/assets/stylesheets/alchemy/{attachments.scss → admin/attachments.scss} +4 -4
  29. data/app/assets/stylesheets/alchemy/{base.scss → admin/base.scss} +9 -9
  30. data/app/assets/stylesheets/alchemy/{buttons.scss → admin/buttons.scss} +3 -3
  31. data/app/assets/stylesheets/alchemy/{clipboard.scss → admin/clipboard.scss} +9 -6
  32. data/app/assets/stylesheets/alchemy/{dashboard.scss → admin/dashboard.scss} +8 -8
  33. data/app/assets/stylesheets/alchemy/{dialogs.scss → admin/dialogs.scss} +20 -20
  34. data/app/assets/stylesheets/alchemy/{elements.scss → admin/elements.scss} +136 -96
  35. data/app/assets/stylesheets/alchemy/{errors.scss → admin/errors.scss} +22 -6
  36. data/app/assets/stylesheets/alchemy/{flash.scss → admin/flash.scss} +3 -3
  37. data/app/assets/stylesheets/alchemy/{flatpickr.scss → admin/flatpickr.scss} +55 -35
  38. data/app/assets/stylesheets/alchemy/{form_fields.scss → admin/form_fields.scss} +8 -6
  39. data/app/assets/stylesheets/alchemy/{forms.scss → admin/forms.scss} +20 -16
  40. data/app/assets/stylesheets/alchemy/{frame.scss → admin/frame.scss} +9 -9
  41. data/app/assets/stylesheets/alchemy/{image_library.scss → admin/image_library.scss} +34 -33
  42. data/app/assets/stylesheets/alchemy/admin/labels.scss +3 -0
  43. data/app/assets/stylesheets/alchemy/{list_filter.scss → admin/list_filter.scss} +4 -4
  44. data/app/assets/stylesheets/alchemy/{lists.scss → admin/lists.scss} +9 -7
  45. data/app/assets/stylesheets/alchemy/{navigation.scss → admin/navigation.scss} +19 -19
  46. data/app/assets/stylesheets/alchemy/{node-select.scss → admin/node-select.scss} +6 -6
  47. data/app/assets/stylesheets/alchemy/{nodes.scss → admin/nodes.scss} +12 -12
  48. data/app/assets/stylesheets/alchemy/{notices.scss → admin/notices.scss} +12 -8
  49. data/app/assets/stylesheets/alchemy/admin/page-select.scss +81 -0
  50. data/app/assets/stylesheets/alchemy/{pagination.scss → admin/pagination.scss} +10 -10
  51. data/app/assets/stylesheets/alchemy/{print.scss → admin/print.scss} +2 -6
  52. data/app/assets/stylesheets/alchemy/{resource_info.scss → admin/resource_info.scss} +6 -7
  53. data/app/assets/stylesheets/alchemy/{search.scss → admin/search.scss} +6 -6
  54. data/app/assets/stylesheets/alchemy/{selects.scss → admin/selects.scss} +46 -39
  55. data/app/assets/stylesheets/alchemy/{shoelace.scss → admin/shoelace.scss} +14 -14
  56. data/app/assets/stylesheets/alchemy/{sitemap.scss → admin/sitemap.scss} +19 -20
  57. data/app/assets/stylesheets/alchemy/{tables.scss → admin/tables.scss} +26 -22
  58. data/app/assets/stylesheets/alchemy/admin/tags.scss +158 -0
  59. data/app/assets/stylesheets/alchemy/{toolbar.scss → admin/toolbar.scss} +10 -10
  60. data/app/assets/stylesheets/alchemy/{typography.scss → admin/typography.scss} +3 -3
  61. data/app/assets/stylesheets/alchemy/{upload.scss → admin/upload.scss} +1 -1
  62. data/app/assets/stylesheets/alchemy/admin.scss +39 -45
  63. data/app/assets/stylesheets/alchemy/welcome.scss +57 -0
  64. data/app/assets/stylesheets/tinymce/skins/content/alchemy/{content.min.scss → content.scss} +5 -4
  65. data/app/assets/stylesheets/tinymce/skins/ui/alchemy/{skin.min.scss → skin.scss} +41 -41
  66. data/app/components/alchemy/admin/page_select.rb +3 -1
  67. data/app/components/alchemy/admin/resource/action.rb +46 -0
  68. data/app/components/alchemy/admin/resource/cell.rb +34 -0
  69. data/app/components/alchemy/admin/resource/header.rb +46 -0
  70. data/app/components/alchemy/admin/resource/table.rb +153 -0
  71. data/app/components/alchemy/ingredients/datetime_view.rb +2 -2
  72. data/app/controllers/alchemy/admin/base_controller.rb +2 -1
  73. data/app/controllers/alchemy/admin/elements_controller.rb +7 -3
  74. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +1 -1
  75. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  76. data/app/controllers/alchemy/admin/pictures_controller.rb +2 -2
  77. data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
  78. data/app/controllers/alchemy/base_controller.rb +2 -0
  79. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +2 -11
  80. data/app/decorators/alchemy/ingredient_editor.rb +17 -0
  81. data/app/helpers/alchemy/admin/pages_helper.rb +6 -10
  82. data/app/helpers/alchemy/base_helper.rb +2 -2
  83. data/app/helpers/alchemy/elements_block_helper.rb +13 -1
  84. data/app/helpers/alchemy/pages_helper.rb +2 -2
  85. data/app/javascript/alchemy_admin/components/element_editor.js +23 -31
  86. data/app/javascript/alchemy_admin/components/preview_window.js +2 -3
  87. data/app/javascript/alchemy_admin/picture_selector.js +38 -10
  88. data/app/models/alchemy/attachment.rb +0 -8
  89. data/app/models/alchemy/element/dom_id.rb +1 -0
  90. data/app/models/alchemy/element/element_ingredients.rb +0 -73
  91. data/app/models/alchemy/element/presenters.rb +4 -1
  92. data/app/models/alchemy/element.rb +6 -0
  93. data/app/models/alchemy/elements_repository.rb +2 -2
  94. data/app/models/alchemy/ingredient_validator.rb +10 -0
  95. data/app/models/alchemy/page/page_scopes.rb +1 -1
  96. data/app/models/alchemy/page.rb +3 -3
  97. data/app/models/alchemy/picture.rb +0 -10
  98. data/app/views/alchemy/admin/attachments/_files_list.html.erb +74 -16
  99. data/app/views/alchemy/admin/clipboard/index.html.erb +38 -33
  100. data/app/views/alchemy/admin/dashboard/_dashboard.html.erb +3 -0
  101. data/app/views/alchemy/admin/dashboard/_left_column.html.erb +4 -0
  102. data/app/views/alchemy/admin/dashboard/_right_column.html.erb +9 -0
  103. data/app/views/alchemy/admin/dashboard/_top.html.erb +12 -0
  104. data/app/views/alchemy/admin/dashboard/index.html.erb +1 -25
  105. data/app/views/alchemy/admin/elements/_element.html.erb +1 -2
  106. data/app/views/alchemy/admin/elements/_form.html.erb +1 -1
  107. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +10 -3
  108. data/app/views/alchemy/admin/ingredients/update.turbo_stream.erb +7 -0
  109. data/app/views/alchemy/admin/languages/_table.html.erb +16 -42
  110. data/app/views/alchemy/admin/nodes/_form.html.erb +1 -1
  111. data/app/views/alchemy/admin/pages/_table.html.erb +92 -27
  112. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -1
  113. data/app/views/alchemy/admin/pages/edit.html.erb +6 -8
  114. data/app/views/alchemy/admin/pages/index.html.erb +0 -4
  115. data/app/views/alchemy/admin/pictures/_form.html.erb +14 -12
  116. data/app/views/alchemy/admin/pictures/index.html.erb +1 -11
  117. data/app/views/alchemy/admin/pictures/update.turbo_stream.erb +6 -0
  118. data/app/views/alchemy/admin/resources/_resource.html.erb +2 -0
  119. data/app/views/alchemy/admin/resources/_resource_table.html.erb +3 -0
  120. data/app/views/alchemy/admin/resources/_table.html.erb +2 -0
  121. data/app/views/alchemy/admin/resources/index.html.erb +1 -1
  122. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  123. data/app/views/alchemy/admin/styleguide/index.html.erb +0 -4
  124. data/app/views/alchemy/admin/tags/index.html.erb +15 -14
  125. data/app/views/alchemy/base/403.html.erb +6 -0
  126. data/app/views/alchemy/base/500.html.erb +14 -12
  127. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +13 -11
  128. data/app/views/alchemy/ingredients/_headline_editor.html.erb +29 -22
  129. data/app/views/alchemy/ingredients/_link_editor.html.erb +17 -11
  130. data/app/views/alchemy/ingredients/_page_editor.html.erb +1 -0
  131. data/app/views/alchemy/ingredients/_picture_editor.html.erb +3 -4
  132. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +5 -1
  133. data/app/views/alchemy/ingredients/_select_editor.html.erb +2 -1
  134. data/app/views/alchemy/ingredients/_text_editor.html.erb +20 -14
  135. data/app/views/alchemy/ingredients/shared/_picture_css_class.html.erb +6 -0
  136. data/app/views/layouts/alchemy/admin.html.erb +4 -2
  137. data/bin/setup +2 -0
  138. data/bin/start +1 -1
  139. data/bun.lockb +0 -0
  140. data/config/alchemy/config.yml +9 -0
  141. data/config/locales/alchemy.en.yml +8 -29
  142. data/config/routes.rb +22 -22
  143. data/lib/alchemy/config.rb +3 -3
  144. data/lib/alchemy/install/tasks.rb +5 -2
  145. data/lib/alchemy/resources_helper.rb +7 -3
  146. data/lib/alchemy/test_support/capybara_helpers.rb +8 -5
  147. data/lib/alchemy/test_support/shared_uploader_examples.rb +0 -1
  148. data/lib/alchemy/upgrader/seven_point_three.rb +52 -0
  149. data/lib/alchemy/version.rb +1 -1
  150. data/lib/alchemy_cms.rb +1 -1
  151. data/lib/generators/alchemy/install/files/article.css +25 -0
  152. data/lib/generators/alchemy/install/files/custom.css +4 -0
  153. data/lib/generators/alchemy/install/install_generator.rb +6 -6
  154. data/lib/tasks/alchemy/upgrade.rake +29 -1
  155. data/vendor/assets/stylesheets/alchemy_admin/select2.css +1 -0
  156. data/vendor/assets/stylesheets/jquery.Jcrop.min.css +2 -0
  157. data/vendor/javascript/shoelace.min.js +62 -63
  158. data/vendor/javascript/tinymce.min.js +1 -1
  159. metadata +130 -105
  160. data/app/assets/images/alchemy/lupe.cur +0 -0
  161. data/app/assets/stylesheets/alchemy/labels.scss +0 -3
  162. data/app/assets/stylesheets/alchemy/page-select.scss +0 -66
  163. data/app/assets/stylesheets/alchemy/tags.scss +0 -155
  164. data/app/assets/stylesheets/alchemy/welcome.sass +0 -49
  165. data/app/views/alchemy/admin/attachments/_attachment.html.erb +0 -81
  166. data/app/views/alchemy/admin/languages/_language.html.erb +0 -50
  167. data/app/views/alchemy/admin/pages/_table_row.html.erb +0 -111
  168. data/app/views/alchemy/admin/pages/list/_table.html.erb +0 -31
  169. data/app/views/alchemy/admin/pictures/update.js.erb +0 -6
  170. data/app/views/alchemy/admin/tags/_tag.html.erb +0 -32
  171. data/app/views/alchemy/base/update.js.erb +0 -5
  172. data/lib/generators/alchemy/install/files/all.css +0 -11
  173. data/lib/generators/alchemy/install/files/article.scss +0 -30
  174. data/package.json +0 -52
  175. data/vendor/assets/stylesheets/alchemy_admin/select2.scss +0 -741
  176. data/vendor/assets/stylesheets/jquery.Jcrop.min.scss +0 -2
  177. /data/app/assets/stylesheets/alchemy/{fonts.scss → _fonts.scss} +0 -0
  178. /data/app/assets/stylesheets/alchemy/{hints.scss → admin/hints.scss} +0 -0
  179. /data/app/assets/stylesheets/alchemy/{icons.scss → admin/icons.scss} +0 -0
  180. /data/app/assets/stylesheets/alchemy/{images.scss → admin/images.scss} +0 -0
  181. /data/app/assets/stylesheets/alchemy/{preview_window.scss → admin/preview_window.scss} +0 -0
  182. /data/app/assets/stylesheets/alchemy/{spinner.scss → admin/spinner.scss} +0 -0
  183. /data/app/views/alchemy/admin/dashboard/{_locked_pages.html.erb → widgets/_locked_pages.html.erb} +0 -0
  184. /data/app/views/alchemy/admin/dashboard/{_recent_pages.html.erb → widgets/_recent_pages.html.erb} +0 -0
  185. /data/app/views/alchemy/admin/dashboard/{_sites.html.erb → widgets/_sites.html.erb} +0 -0
  186. /data/app/views/alchemy/admin/dashboard/{_users.html.erb → widgets/_users.html.erb} +0 -0
@@ -205,3 +205,12 @@ format_matchers:
205
205
 
206
206
  # The layout used for rendering the +alchemy/admin/pages#show+ action.
207
207
  admin_page_preview_layout: application
208
+
209
+ # The sizes for the preview size select in the page editor.
210
+ page_preview_sizes:
211
+ - 360
212
+ - 640
213
+ - 768
214
+ - 1024
215
+ - 1280
216
+ - 1440
@@ -140,28 +140,6 @@ en:
140
140
  recent: Recently uploaded only
141
141
  without_tag: Without tag
142
142
 
143
- # === Translations for ingredient validations
144
- # Used when a user did not enter (correct) values to the ingredient field.
145
- #
146
- # Tip: You can define the validation messages translations different for each element and ingredient
147
- #
148
- # Example:
149
- #
150
- # en:
151
- # alchemy:
152
- # ingredient_validations:
153
- # contactform:
154
- # success_page:
155
- # blank: 'Please choose a follow up page.'
156
- # mail_to:
157
- # blank: 'Please provide an email address where the contact inquiries will be delivered to.'
158
- #
159
- ingredient_validations:
160
- errors:
161
- blank: "%{field} can't be blank"
162
- invalid: "%{field} has wrong format"
163
- taken: "%{field} has already been taken"
164
-
165
143
  default_ingredient_texts:
166
144
  lorem: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
167
145
  corporate_lorem: "Appropriately enable sustainable growth strategies vis-a-vis holistic materials. Energistically orchestrate open-source e-tailers vis-a-vis plug-and-play best practices. Uniquely plagiarize client-centric opportunities whereas plug-and-play ideas. Distinctively reconceptualize backward-compatible partnerships vis-a-vis reliable total linkage. Interactively fabricate highly efficient networks for clicks-and-mortar content. Collaboratively reconceptualize holistic markets via 2.0 architectures."
@@ -572,14 +550,15 @@ en:
572
550
  please_confirm: "Please confirm"
573
551
  please_wait: "Please wait"
574
552
  position_in_text: "Position in text"
575
- preview_size: "Preview size"
553
+ preview_size: "Preview Size"
576
554
  preview_sizes:
577
- "240": "240px (small phone)"
578
- "320": "320px (iPhone)"
579
- "480": "480px (small Tablet)"
580
- "768": "768px (iPad - Portrait)"
581
- "1024": "1024px (iPad - Landscape)"
582
- "1280": "1280px (Desktop)"
555
+ "auto": "Auto"
556
+ "360": "Phone (360px)"
557
+ "640": "Small Tablet (640px)"
558
+ "768": "iPad Portrait (768px)"
559
+ "1024": "iPad Landscape (1024px)"
560
+ "1280": "Laptop (1280px)"
561
+ "1440": "Desktop (1440px)"
583
562
  preview_url: Preview
584
563
  publish_page_language_not_public: Cannot publish page if language is not public
585
564
  publish_page_not_allowed: You have not the permission to publish this page
data/config/routes.rb CHANGED
@@ -5,15 +5,15 @@ require "alchemy/routing_constraints"
5
5
  Alchemy::Engine.routes.draw do
6
6
  root to: "pages#index"
7
7
 
8
- get "/sitemap.xml" => "pages#sitemap", :format => "xml"
8
+ get "/sitemap.xml", to: "pages#sitemap", format: "xml"
9
9
 
10
10
  scope Alchemy.admin_path, {constraints: Alchemy.admin_constraints} do
11
- get "/" => redirect("#{Alchemy.admin_path}/dashboard"), :as => :admin
12
- get "/dashboard" => "admin/dashboard#index", :as => :admin_dashboard
13
- get "/dashboard/info" => "admin/dashboard#info", :as => :dashboard_info
14
- get "/help" => "admin/dashboard#help", :as => :help
15
- get "/dashboard/update_check" => "admin/dashboard#update_check", :as => :update_check
16
- get "/leave" => "admin/base#leave", :as => :leave_admin
11
+ get "/", to: redirect("#{Alchemy.admin_path}/dashboard"), as: :admin
12
+ get "/dashboard", to: "admin/dashboard#index", as: :admin_dashboard
13
+ get "/dashboard/info", to: "admin/dashboard#info", as: :dashboard_info
14
+ get "/help", to: "admin/dashboard#help", as: :help
15
+ get "/dashboard/update_check", to: "admin/dashboard#update_check", as: :update_check
16
+ get "/leave", to: "admin/base#leave", as: :leave_admin
17
17
  end
18
18
 
19
19
  namespace :admin, {path: Alchemy.admin_path, constraints: Alchemy.admin_constraints} do
@@ -105,13 +105,13 @@ Alchemy::Engine.routes.draw do
105
105
 
106
106
  resources :sites
107
107
 
108
- get "/styleguide" => "styleguide#index"
108
+ get "/styleguide", to: "styleguide#index"
109
109
  end
110
110
 
111
- get "/attachment/:id/download(/:name)" => "attachments#download",
112
- :as => :download_attachment
113
- get "/attachment/:id/show(/:name)" => "attachments#show",
114
- :as => :show_attachment
111
+ get "/attachment/:id/download(/:name)", to: "attachments#download",
112
+ as: :download_attachment
113
+ get "/attachment/:id/show(/:name)", to: "attachments#show",
114
+ as: :show_attachment
115
115
 
116
116
  resources :messages, only: [:index, :new, :create]
117
117
  resources :elements, only: :show
@@ -123,8 +123,8 @@ Alchemy::Engine.routes.draw do
123
123
  resources :elements, only: [:index, :show]
124
124
 
125
125
  resources :pages, only: [:index] do
126
- get "elements" => "elements#index", :as => "elements"
127
- get "elements/:named" => "elements#index", :as => "named_elements"
126
+ get "elements", to: "elements#index", as: "elements"
127
+ get "elements/:named", to: "elements#index", as: "named_elements"
128
128
  collection do
129
129
  get :nested
130
130
  end
@@ -133,8 +133,8 @@ Alchemy::Engine.routes.draw do
133
133
  end
134
134
  end
135
135
 
136
- get "/pages/*urlname(.:format)" => "pages#show", :as => "page"
137
- get "/admin/pages/:id(.:format)" => "pages#show", :as => "preview_page"
136
+ get "/pages/*urlname(.:format)", to: "pages#show", as: "page"
137
+ get "/admin/pages/:id(.:format)", to: "pages#show", as: "preview_page"
138
138
 
139
139
  resources :nodes, only: [:index] do
140
140
  member do
@@ -144,14 +144,14 @@ Alchemy::Engine.routes.draw do
144
144
  end
145
145
  end
146
146
 
147
- get "/:locale" => "pages#index",
148
- :constraints => {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
149
- :as => :show_language_root
147
+ get "/:locale", to: "pages#index",
148
+ constraints: {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
149
+ as: :show_language_root
150
150
 
151
151
  # The page show action has to be last route
152
152
  constraints(locale: Alchemy::RoutingConstraints::LOCALE_REGEXP) do
153
- get "(/:locale)/*urlname(.:format)" => "pages#show",
154
- :constraints => Alchemy::RoutingConstraints.new,
155
- :as => :show_page
153
+ get "(/:locale)/*urlname(.:format)", to: "pages#show",
154
+ constraints: Alchemy::RoutingConstraints.new,
155
+ as: :show_page
156
156
  end
157
157
  end
@@ -46,17 +46,17 @@ module Alchemy
46
46
 
47
47
  # Alchemy default configuration
48
48
  def alchemy_config
49
- read_file(File.join(File.dirname(__FILE__), "..", "..", "config/alchemy/config.yml"))
49
+ read_file Engine.root.join("config/alchemy/config.yml")
50
50
  end
51
51
 
52
52
  # Application specific configuration
53
53
  def main_app_config
54
- read_file("#{Rails.root}/config/alchemy/config.yml")
54
+ read_file Rails.root.join("config/alchemy/config.yml")
55
55
  end
56
56
 
57
57
  # Rails Environment specific configuration
58
58
  def env_specific_config
59
- read_file("#{Rails.root}/config/alchemy/#{Rails.env}.config.yml")
59
+ read_file Rails.root.join("config/alchemy/#{Rails.env}.config.yml")
60
60
  end
61
61
 
62
62
  # Tries to load yaml file from given path.
@@ -5,6 +5,8 @@ require "thor"
5
5
  module Alchemy
6
6
  module Install
7
7
  class Tasks < Thor
8
+ SENTINEL = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
9
+
8
10
  include Thor::Actions
9
11
 
10
12
  no_tasks do
@@ -15,8 +17,9 @@ module Alchemy
15
17
  unless auto_accept
16
18
  mountpoint = ask("- At which path do you want to mount Alchemy CMS at?", default: mountpoint)
17
19
  end
18
- sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
19
- inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine => '#{mountpoint}'\n", {after: sentinel, verbose: true}
20
+
21
+ inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine, at: '#{mountpoint}'\n",
22
+ {after: SENTINEL, verbose: true}
20
23
  end
21
24
 
22
25
  def set_primary_language(code: "en", name: "English", auto_accept: false)
@@ -10,7 +10,7 @@ module Alchemy
10
10
  #
11
11
 
12
12
  def resource_window_size
13
- @resource_window_size ||= "420x#{100 + resource_handler.attributes.length * 40}"
13
+ @resource_window_size ||= "480x#{100 + resource_handler.attributes.length * 40}"
14
14
  end
15
15
 
16
16
  def resource_instance_variable
@@ -87,6 +87,8 @@ module Alchemy
87
87
  options[:time_format] || :"alchemy.time"
88
88
  end
89
89
  value = l(attribute_value, format: localization_format)
90
+ elsif attribute[:type] == :boolean
91
+ value = attribute_value ? '<alchemy-icon name="check"></alchemy-icon>'.html_safe : nil
90
92
  else
91
93
  value = attribute_value
92
94
  end
@@ -128,7 +130,7 @@ module Alchemy
128
130
  # Returns the attribute's column for sorting
129
131
  #
130
132
  # If the attribute contains a resource_relation, then the table and column for related model will be returned.
131
- #
133
+ # @deprecated
132
134
  def sortable_resource_header_column(attribute)
133
135
  if (relation = attribute[:relation])
134
136
  "#{relation[:model_association].name}_#{relation[:attr_method]}"
@@ -136,6 +138,7 @@ module Alchemy
136
138
  attribute[:name]
137
139
  end
138
140
  end
141
+ deprecate sortable_resource_header_column: "Please `render Alchemy::Admin::Resource::Table instead`", deprecator: Alchemy::Deprecation
139
142
 
140
143
  # Renders the row for a resource record in the resources table.
141
144
  #
@@ -154,12 +157,13 @@ module Alchemy
154
157
  # </tr>
155
158
  #
156
159
  # NOTE: Alchemy gives you a local variable named like your resource
157
- #
160
+ # @deprecated
158
161
  def render_resources(icon: nil)
159
162
  render partial: resource_name, collection: resources_instance_variable, locals: {icon: icon}
160
163
  rescue ActionView::MissingTemplate
161
164
  render partial: "resource", collection: resources_instance_variable, locals: {icon: icon}
162
165
  end
166
+ deprecate render_resources: "Please `render Alchemy::Admin::Resource::Table instead`", deprecator: Alchemy::Deprecation
163
167
 
164
168
  def resource_has_tags
165
169
  resource_model.respond_to?(:tag_counts) && resource_model.tag_counts.any?
@@ -40,9 +40,12 @@ module Alchemy
40
40
 
41
41
  within_entire_page do
42
42
  find("input.select2-input.select2-focused").set(value)
43
- expect(page).to have_selector(".select2-result-label", visible: true)
44
- find("div.select2-result-label", text: /#{Regexp.escape(value)}/i, match: :prefer_exact).click
45
- expect(page).not_to have_selector(".select2-result-label")
43
+ expect(page).to_not have_selector(".select2-searching")
44
+ unless options[:select] == false
45
+ expect(page).to have_selector(".select2-result-label", visible: true)
46
+ find("div.select2-result-label", text: /#{Regexp.escape(value)}/i, match: :prefer_exact).click
47
+ expect(page).not_to have_selector(".select2-result-label")
48
+ end
46
49
  end
47
50
  end
48
51
 
@@ -60,8 +63,8 @@ module Alchemy
60
63
 
61
64
  private
62
65
 
63
- def within_entire_page(&block)
64
- within(:xpath, "//body", &block)
66
+ def within_entire_page(&)
67
+ within(:xpath, "//body", &)
65
68
  end
66
69
 
67
70
  def find_label_by_text(text)
@@ -7,6 +7,5 @@ RSpec.shared_examples_for "having a json uploader error message" do
7
7
  expect(response.status).to eq(422)
8
8
  json = JSON.parse(response.body)
9
9
  expect(json).to have_key("message")
10
- expect(json).to have_key("files")
11
10
  end
12
11
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "thor"
5
+
6
+ module Alchemy
7
+ class Upgrader::SevenPointThree < Upgrader
8
+ include Thor::Base
9
+ include Thor::Actions
10
+
11
+ source_root Alchemy::Engine.root.join("lib/generators/alchemy/install/files")
12
+
13
+ class << self
14
+ def remove_admin_stylesheets
15
+ if File.exist? "vendor/assets/stylesheets/alchemy/admin/all.css"
16
+ log "Removing Alchemy admin stylesheets."
17
+ FileUtils.rm_f "vendor/assets/stylesheets/alchemy/admin/all.css"
18
+ end
19
+ end
20
+
21
+ def generate_custom_css_entrypoint
22
+ if File.exist? "app/assets/config/manifest.js"
23
+ log "Generating alchemy/admin/custom.css entrypoint file."
24
+ task.copy_file "custom.css", "app/assets/stylesheets/alchemy/admin/custom.css"
25
+ task.append_to_file "app/assets/config/manifest.js", "//= link alchemy/admin/custom.css\n"
26
+ todo(<<~TODO, "Custom styles have been moved to `app/assets/alchemy/admin/custom.css`")
27
+ Check the new `app/assets/alchemy/admin/custom.css` file for any custom styles you might
28
+ have added to the old `vendor/assets/stylesheets/alchemy/admin/all.css` file.
29
+ TODO
30
+ end
31
+ end
32
+
33
+ def show_resource_table_notice
34
+ custom_modules = Alchemy::Modules.alchemy_modules.reject { _1["engine_name"] == "alchemy" }
35
+ return if custom_modules.none?
36
+
37
+ todo(<<~TODO, "Resource templates have been updated.")
38
+ We updated the resource templates to use the newly introduced
39
+ `Alchemy::Admin::Resource::Table` view component.
40
+
41
+ Please update your resource templates accordingly.
42
+ TODO
43
+ end
44
+
45
+ private
46
+
47
+ def task
48
+ @_task || new
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Alchemy
4
- VERSION = "7.2.6"
4
+ VERSION = "7.3.1"
5
5
 
6
6
  def self.version
7
7
  VERSION
data/lib/alchemy_cms.rb CHANGED
@@ -17,8 +17,8 @@ require "jquery-rails"
17
17
  require "kaminari"
18
18
  require "non_stupid_digest_assets"
19
19
  require "ransack"
20
- require "sassc-rails"
21
20
  require "simple_form"
21
+ require "sprockets/rails"
22
22
  require "turbo-rails"
23
23
  require "userstamp"
24
24
  require "view_component"
@@ -0,0 +1,25 @@
1
+ article {
2
+ width: 50%;
3
+ font: 16px/20px Helvetica, Arial, sans-serif;
4
+ color: #333;
5
+ margin: 1em auto;
6
+ padding: 0.5em 1em;
7
+ background: #f4f4f4;
8
+ }
9
+ article h2 {
10
+ font-size: 24px;
11
+ line-height: 1.25;
12
+ font-weight: bold;
13
+ }
14
+ article a {
15
+ color: #5588D3;
16
+ }
17
+ article img {
18
+ max-width: 100%;
19
+ }
20
+ article figure {
21
+ margin: 0;
22
+ }
23
+ article figcaption {
24
+ font-size: 14px;
25
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ * Edit this file to add custom styles to the Alchemy admin interface.
3
+ * This file will be loaded after the default Alchemy admin stylesheets.
4
+ */
@@ -65,21 +65,21 @@ module Alchemy
65
65
 
66
66
  def install_assets
67
67
  copy_file "all.js", app_vendor_assets_path.join("javascripts", "alchemy", "admin", "all.js")
68
- copy_file "all.css", app_vendor_assets_path.join("stylesheets", "alchemy", "admin", "all.css")
68
+ copy_file "custom.css", app_assets_path.join("stylesheets/alchemy/admin/custom.css")
69
+ append_to_file Rails.root.join("app/assets/config/manifest.js"), "//= link alchemy/admin/custom.css\n"
69
70
  end
70
71
 
71
72
  def copy_demo_views
72
73
  return if options[:skip_demo_files]
73
74
 
74
75
  copy_file "application.html.erb", app_views_path.join("layouts", "application.html.erb")
75
- copy_file "article.scss", app_assets_path.join("stylesheets", "alchemy", "elements", "article.scss")
76
+ copy_file "article.css", app_assets_path.join("stylesheets", "alchemy", "elements", "_article.css")
76
77
 
77
- stylesheet_require = " *= require_tree ./alchemy/elements\n"
78
+ stylesheet_require = %(@import "alchemy/elements/article";\n)
78
79
  if File.exist?(app_assets_path.join("stylesheets", "application.css"))
79
- insert_into_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require,
80
- before: " */"
80
+ prepend_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require
81
81
  else
82
- create_file app_assets_path.join("stylesheets", "application.css"), "/*\n#{stylesheet_require} */\n"
82
+ create_file app_assets_path.join("stylesheets", "application.css"), stylesheet_require
83
83
  end
84
84
 
85
85
  copy_file "_article.html.erb", app_views_path.join("alchemy", "elements", "_article.html.erb")
@@ -7,7 +7,8 @@ namespace :alchemy do
7
7
  desc "Upgrades your app to AlchemyCMS v#{Alchemy::VERSION}."
8
8
  task upgrade: [
9
9
  "alchemy:upgrade:prepare",
10
- "alchemy:upgrade:7.0:run"
10
+ "alchemy:upgrade:7.0:run",
11
+ "alchemy:upgrade:7.3:run"
11
12
  ] do
12
13
  Alchemy::Upgrader.display_todos
13
14
  end
@@ -38,6 +39,14 @@ namespace :alchemy do
38
39
  Alchemy::Upgrader.display_todos
39
40
  end
40
41
 
42
+ desc "Upgrade Alchemy to v7.3"
43
+ task "7.3" => [
44
+ "alchemy:upgrade:prepare",
45
+ "alchemy:upgrade:7.3:run"
46
+ ] do
47
+ Alchemy::Upgrader.display_todos
48
+ end
49
+
41
50
  namespace "7.0" do
42
51
  task "run" => [
43
52
  "alchemy:upgrade:7.0:remove_admin_entrypoint"
@@ -49,5 +58,24 @@ namespace :alchemy do
49
58
  Alchemy::Upgrader::SevenPointZero.remove_admin_entrypoint
50
59
  end
51
60
  end
61
+
62
+ namespace "7.3" do
63
+ task "run" => [
64
+ "alchemy:upgrade:7.3:remove_admin_stylesheets",
65
+ "alchemy:upgrade:7.3:generate_custom_css_entrypoint"
66
+ ] do
67
+ Alchemy::Upgrader::SevenPointThree.show_resource_table_notice
68
+ end
69
+
70
+ desc "Remove alchemy admin stylesheets"
71
+ task remove_admin_stylesheets: [:environment] do
72
+ Alchemy::Upgrader::SevenPointThree.remove_admin_stylesheets
73
+ end
74
+
75
+ desc "Generate custom css entrypoint"
76
+ task generate_custom_css_entrypoint: [:environment] do
77
+ Alchemy::Upgrader::SevenPointThree.generate_custom_css_entrypoint
78
+ end
79
+ end
52
80
  end
53
81
  end
@@ -0,0 +1 @@
1
+ .select2-container{margin:0;position:relative;display:inline-block;vertical-align:middle}.select2-container,.select2-drop,.select2-search,.select2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-choice{display:block;overflow:hidden;position:relative;white-space:nowrap;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html[dir=rtl] .select2-container .select2-choice{padding:0 8px 0 0}.select2-container.select2-drop-above .select2-choice{border-bottom-color:#aaa;border-radius:0 0 4px 4px;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));background-image:-webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);background-image:-moz-linear-gradient(center bottom, #eee 0%, #fff 90%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffff", endColorstr="#eeeeee", GradientType=0);background-image:linear-gradient(to bottom, #eee 0%, #fff 90%)}.select2-container.select2-allowclear .select2-choice .select2-chosen{margin-right:38px}.select2-container .select2-choice>.select2-chosen{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;float:none;width:auto}html[dir=rtl] .select2-container .select2-choice>.select2-chosen{margin-left:26px;margin-right:0}.select2-container .select2-choice abbr{display:none;width:12px;height:12px;position:absolute;right:24px;top:8px;font-size:1px;text-decoration:none;border:0;background:right top no-repeat;cursor:pointer;outline:0}.select2-container.select2-allowclear .select2-choice abbr{display:inline-block}.select2-container .select2-choice abbr:hover{background-position:right -11px;cursor:pointer}.select2-drop-mask{border:0;margin:0;padding:0;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:9998;background-color:#fff;filter:alpha(opacity=0)}.select2-drop{width:100%;margin-top:-1px;position:absolute;z-index:9999;top:100%;background:#fff;color:#000;border:1px solid #aaa;border-top:0;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15)}.select2-drop.select2-drop-above{margin-top:1px;border-top:1px solid #aaa;border-bottom:0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 -4px 5px rgba(0,0,0,.15);box-shadow:0 -4px 5px rgba(0,0,0,.15)}.select2-drop-active{border:1px solid #5897fb;border-top:none}.select2-drop.select2-drop-above.select2-drop-active{border-top:1px solid #5897fb}.select2-drop-auto-width{border-top:1px solid #aaa;width:auto}.select2-container .select2-choice .select2-arrow{display:inline-block;position:absolute;right:0;border-radius:0 4px 4px 0}html[dir=rtl] .select2-container .select2-choice .select2-arrow{left:0;right:auto;border-left:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px}.select2-container .select2-choice .select2-arrow b{display:block;width:100%;height:100%}html[dir=rtl] .select2-container .select2-choice .select2-arrow b{background-position:2px 1px}.select2-search{display:inline-block;width:100%;min-height:26px;margin:0;padding:4px 4px 0 4px;position:relative;z-index:10000;white-space:nowrap}.select2-search input{width:100%;height:auto !important;min-height:26px;padding:4px 20px 4px 5px;margin:0}html[dir=rtl] .select2-search input{padding:4px 5px 4px 20px;background:#fff no-repeat -37px -22px;background:no-repeat -37px -22px,-webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));background:no-repeat -37px -22px,-webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);background:no-repeat -37px -22px,-moz-linear-gradient(center bottom, #fff 85%, #eee 99%);background:no-repeat -37px -22px,linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0}.select2-search input.select2-active{background:#fff no-repeat 100%;background:no-repeat 100%,-webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));background:no-repeat 100%,-webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);background:no-repeat 100%,-moz-linear-gradient(center bottom, #fff 85%, #eee 99%);background:no-repeat 100%,linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0}.select2-container-active .select2-choice,.select2-container-active .select2-choices{border:1px solid #5897fb;outline:none;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-dropdown-open .select2-choice{border-bottom-color:rgba(0,0,0,0);-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;border-bottom-left-radius:0;border-bottom-right-radius:0;background-color:#eee;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));background-image:-webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);background-image:-moz-linear-gradient(center bottom, #fff 0%, #eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#eeeeee", endColorstr="#ffffff", GradientType=0);background-image:linear-gradient(to top, #fff 0%, #eee 50%)}.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{border:1px solid #5897fb;border-top-color:rgba(0,0,0,0);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));background-image:-webkit-linear-gradient(center top, #fff 0%, #eee 50%);background-image:-moz-linear-gradient(center top, #fff 0%, #eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#eeeeee", endColorstr="#ffffff", GradientType=0);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%)}.select2-dropdown-open .select2-choice .select2-arrow{background:rgba(0,0,0,0);border-left:none;filter:none}html[dir=rtl] .select2-dropdown-open .select2-choice .select2-arrow{border-right:none}.select2-dropdown-open .select2-choice .select2-arrow b{background-position:-18px 1px}html[dir=rtl] .select2-dropdown-open .select2-choice .select2-arrow b{background-position:-16px 1px}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.select2-results{max-height:200px;padding:0 0 0 4px;margin:4px 4px 4px 0;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:rgba(0,0,0,0)}html[dir=rtl] .select2-results{padding:0 4px 0 0;margin:4px 0 4px 4px}.select2-results ul.select2-result-sub{margin:0;padding-left:0}.select2-results li{list-style:none;display:list-item;background-image:none}.select2-results li.select2-result-with-children>.select2-result-label{font-weight:bold}.select2-results .select2-result-label{padding:3px 7px 4px;margin:0;cursor:pointer;min-height:1em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select2-results-dept-1 .select2-result-label{padding-left:20px}.select2-results-dept-2 .select2-result-label{padding-left:40px}.select2-results-dept-3 .select2-result-label{padding-left:60px}.select2-results-dept-4 .select2-result-label{padding-left:80px}.select2-results-dept-5 .select2-result-label{padding-left:100px}.select2-results-dept-6 .select2-result-label{padding-left:110px}.select2-results-dept-7 .select2-result-label{padding-left:120px}.select2-results .select2-highlighted{background:#3875d7;color:#fff}.select2-results li em{background:#feffde;font-style:normal}.select2-results .select2-highlighted em{background:rgba(0,0,0,0)}.select2-results .select2-highlighted ul{background:#fff;color:#000}.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-ajax-error,.select2-results .select2-selection-limit{background:#f4f4f4;display:list-item;padding-left:5px}.select2-results .select2-disabled.select2-highlighted{color:#666;background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-disabled{background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-selected{display:none}.select2-more-results.select2-active{background:#f4f4f4 no-repeat 100%}.select2-results .select2-ajax-error{background:rgba(255,50,50,.2)}.select2-more-results{background:#f4f4f4;display:list-item}.select2-container.select2-container-disabled .select2-choice{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container.select2-container-disabled .select2-choice .select2-arrow{background-color:#f4f4f4;background-image:none;border-left:0}.select2-container.select2-container-disabled .select2-choice abbr{display:none}.select2-container-multi .select2-choices{height:auto !important;height:1%;margin:0;padding:0 5px 0 0;position:relative;border:1px solid #aaa;cursor:text;overflow:hidden;background-color:#fff;background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));background-image:-webkit-linear-gradient(top, #eee 1%, #fff 15%);background-image:-moz-linear-gradient(top, #eee 1%, #fff 15%);background-image:linear-gradient(to bottom, #eee 1%, #fff 15%)}html[dir=rtl] .select2-container-multi .select2-choices{padding:0 0 0 5px}.select2-locked{padding:3px 5px 3px 5px !important}.select2-container-multi .select2-choices{min-height:26px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #5897fb;outline:none;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-container-multi .select2-choices li{float:left;list-style:none}html[dir=rtl] .select2-container-multi .select2-choices li{float:right}.select2-container-multi .select2-choices .select2-search-field{margin:0;padding:0;white-space:nowrap}.select2-container-multi .select2-choices .select2-search-field input{padding:5px;margin:1px 0;font-family:sans-serif;font-size:100%;color:#666;outline:0;border:0;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,0) !important}.select2-container-multi .select2-choices .select2-search-field input.select2-active{background:#fff no-repeat 100% !important}.select2-default{color:#999 !important}.select2-container-multi .select2-choices .select2-search-choice{padding:3px 5px 3px 18px;margin:3px 0 3px 5px;position:relative;line-height:13px;color:#333;cursor:default;border:1px solid #aaa;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#eeeeee", endColorstr="#f4f4f4", GradientType=0);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));background-image:-webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);background-image:-moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);background-image:linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%)}html[dir=rtl] .select2-container-multi .select2-choices .select2-search-choice{margin:3px 5px 3px 0;padding:3px 18px 3px 5px}.select2-container-multi .select2-choices .select2-search-choice .select2-chosen{cursor:default}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#d4d4d4}.select2-search-choice-close{display:block;width:12px;height:13px;position:absolute;right:3px;top:4px;font-size:1px;outline:none;background:right top no-repeat}html[dir=rtl] .select2-search-choice-close{right:auto;left:3px}.select2-container-multi .select2-search-choice-close{left:3px}html[dir=rtl] .select2-container-multi .select2-search-choice-close{left:auto;right:2px}.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover{background-position:right -11px}.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close{background-position:right -11px}.select2-container-multi.select2-container-disabled .select2-choices{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice{padding:3px 5px 3px 5px;border:1px solid #ddd;background-image:none;background-color:#f4f4f4}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none;background:none}.select2-result-selectable .select2-match,.select2-result-unselectable .select2-match{text-decoration:underline}.select2-offscreen,.select2-offscreen:focus{clip:rect(0 0 0 0) !important;width:1px !important;height:1px !important;border:0 !important;margin:0 !important;padding:0 !important;overflow:hidden !important;position:absolute !important;outline:0 !important;left:0px !important;top:0px !important}.select2-display-none{display:none}.select2-measure-scrollbar{position:absolute;top:-10000px;left:-10000px;width:100px;height:100px;overflow:scroll}@media only screen and (-webkit-min-device-pixel-ratio: 1.5),only screen and (min-resolution: 2dppx){.select2-search input,.select2-search-choice-close,.select2-container .select2-choice abbr,.select2-container .select2-choice .select2-arrow b{background-image:url("select2x2.png") !important;background-repeat:no-repeat !important;background-size:60px 40px !important}.select2-search input{background-position:100% -21px !important}}
@@ -0,0 +1,2 @@
1
+ /* jquery.Jcrop.min.css v0.9.15 (build:20180819) */
2
+ .jcrop-holder{direction:ltr;text-align:left;-ms-touch-action:none}.jcrop-hline,.jcrop-vline{background:#fff url("Jcrop.gif");font-size:0;position:absolute}.jcrop-vline{height:100%;width:1px!important}.jcrop-vline.right{right:0}.jcrop-hline{height:1px!important;width:100%}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{height:100%;width:100%;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none}.jcrop-handle{background-color:#333;border:1px #eee solid;width:7px;height:7px;font-size:1px}.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%}.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%}.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0}.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0}.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{margin-right:-4px;right:0}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-hline,.jcrop-light .jcrop-vline{background:#fff;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-hline,.jcrop-dark .jcrop-vline{background:#000;filter:alpha(opacity=70)!important;opacity:.7!important}.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#fff;border-color:#000;border-radius:3px}.solid-line .jcrop-hline,.solid-line .jcrop-vline{background:#fff}.jcrop-holder img,img.jcrop-preview{max-width:none}