alchemy_cms 6.0.0.b1 → 6.0.0.b2

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/alchemy_cms.gemspec +1 -1
  4. data/app/assets/stylesheets/alchemy/archive.scss +14 -0
  5. data/app/controllers/alchemy/admin/attachments_controller.rb +3 -3
  6. data/app/controllers/alchemy/admin/pages_controller.rb +1 -9
  7. data/app/controllers/alchemy/admin/pictures_controller.rb +21 -8
  8. data/app/controllers/alchemy/admin/resources_controller.rb +84 -10
  9. data/app/controllers/alchemy/api/elements_controller.rb +12 -8
  10. data/app/controllers/alchemy/api/pages_controller.rb +4 -2
  11. data/app/models/alchemy/attachment.rb +24 -7
  12. data/app/models/alchemy/element/presenters.rb +18 -1
  13. data/app/models/alchemy/ingredient.rb +5 -0
  14. data/app/models/alchemy/page.rb +10 -1
  15. data/app/models/alchemy/page/page_scopes.rb +4 -0
  16. data/app/models/alchemy/picture.rb +14 -38
  17. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -1
  18. data/app/views/alchemy/admin/attachments/index.html.erb +2 -3
  19. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -1
  20. data/app/views/alchemy/admin/pages/index.html.erb +2 -9
  21. data/app/views/alchemy/admin/partials/_search_form.html.erb +9 -0
  22. data/app/views/alchemy/admin/pictures/_archive.html.erb +1 -1
  23. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  24. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +4 -2
  25. data/app/views/alchemy/admin/pictures/index.html.erb +8 -3
  26. data/app/views/alchemy/admin/resources/_filter.html.erb +12 -0
  27. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +14 -17
  28. data/app/views/alchemy/admin/resources/_form.html.erb +2 -0
  29. data/app/views/alchemy/admin/resources/_table_header.html.erb +15 -0
  30. data/app/views/alchemy/admin/resources/index.html.erb +3 -11
  31. data/config/locales/alchemy.en.yml +85 -49
  32. data/lib/alchemy/forms/builder.rb +21 -1
  33. data/lib/alchemy/resource_filter.rb +40 -0
  34. data/lib/alchemy/resources_helper.rb +1 -16
  35. data/lib/alchemy/test_support/shared_ingredient_examples.rb +21 -3
  36. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +14 -6
  37. data/lib/alchemy/version.rb +1 -1
  38. data/lib/alchemy_cms.rb +1 -0
  39. data/lib/generators/alchemy/menus/templates/node.html.erb +1 -1
  40. data/lib/generators/alchemy/menus/templates/node.html.haml +1 -1
  41. data/lib/generators/alchemy/menus/templates/node.html.slim +1 -1
  42. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  43. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  44. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  45. data/package.json +1 -1
  46. metadata +10 -9
  47. data/app/views/alchemy/admin/attachments/_filter_bar.html.erb +0 -29
  48. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +0 -30
@@ -210,6 +210,11 @@ module Alchemy
210
210
  false
211
211
  end
212
212
 
213
+ # @return [Boolean]
214
+ def preview_ingredient?
215
+ !!definition[:as_element_title]
216
+ end
217
+
213
218
  private
214
219
 
215
220
  def hint_translation_attribute
@@ -182,7 +182,16 @@ module Alchemy
182
182
  end
183
183
 
184
184
  def alchemy_resource_filters
185
- %w[published not_public restricted]
185
+ [
186
+ {
187
+ name: :by_page_layout,
188
+ values: PageLayout.all.map { |p| [Alchemy.t(p["name"], scope: "page_layout_names"), p["name"]] },
189
+ },
190
+ {
191
+ name: :status,
192
+ values: %w[published not_public restricted],
193
+ },
194
+ ]
186
195
  end
187
196
 
188
197
  def searchable_alchemy_resource_attributes
@@ -8,6 +8,10 @@ module Alchemy
8
8
  extend ActiveSupport::Concern
9
9
 
10
10
  included do
11
+ # All pages of given page layout
12
+ #
13
+ scope :by_page_layout, ->(page_layout) { where(page_layout: page_layout) }
14
+
11
15
  # All language root pages
12
16
  #
13
17
  scope :language_roots, -> { where(language_root: true) }
@@ -116,6 +116,7 @@ module Alchemy
116
116
  scope :recent, -> { where("#{table_name}.created_at > ?", Time.current - 24.hours).order(:created_at) }
117
117
  scope :deletable, -> { where("#{table_name}.id NOT IN (SELECT picture_id FROM #{EssencePicture.table_name})") }
118
118
  scope :without_tag, -> { left_outer_joins(:taggings).where(gutentag_taggings: { id: nil }) }
119
+ scope :by_file_format, ->(format) { where(image_file_format: format) }
119
120
 
120
121
  # Class methods
121
122
 
@@ -134,6 +135,19 @@ module Alchemy
134
135
  @_url_class = klass
135
136
  end
136
137
 
138
+ def alchemy_resource_filters
139
+ [
140
+ {
141
+ name: :by_file_format,
142
+ values: distinct.pluck(:image_file_format),
143
+ },
144
+ {
145
+ name: :misc,
146
+ values: %w(recent last_upload without_tag),
147
+ },
148
+ ]
149
+ end
150
+
137
151
  def searchable_alchemy_resource_attributes
138
152
  %w(name image_file_name)
139
153
  end
@@ -144,34 +158,6 @@ module Alchemy
144
158
 
145
159
  Picture.where(upload_hash: last_picture.upload_hash)
146
160
  end
147
-
148
- def search_by(params, query, per_page = nil)
149
- pictures = query.result
150
-
151
- if params[:tagged_with].present?
152
- pictures = pictures.tagged_with(params[:tagged_with])
153
- end
154
-
155
- if params[:filter].present?
156
- pictures = pictures.filtered_by(params[:filter])
157
- end
158
-
159
- if per_page
160
- pictures = pictures.page(params[:page] || 1).per(per_page)
161
- end
162
-
163
- pictures.order(:name)
164
- end
165
-
166
- def filtered_by(filter = "")
167
- case filter
168
- when "recent" then recent
169
- when "last_upload" then last_upload
170
- when "without_tag" then without_tag
171
- else
172
- all
173
- end
174
- end
175
161
  end
176
162
 
177
163
  # Instance methods
@@ -203,16 +189,6 @@ module Alchemy
203
189
  nil
204
190
  end
205
191
 
206
- def previous(params = {})
207
- query = Picture.ransack(params[:q])
208
- Picture.search_by(params, query).where("name < ?", name).last
209
- end
210
-
211
- def next(params = {})
212
- query = Picture.ransack(params[:q])
213
- Picture.search_by(params, query).where("name > ?", name).first
214
- end
215
-
216
192
  # Updates name and tag_list attributes.
217
193
  #
218
194
  # Used by +Admin::PicturesController#update_multiple+
@@ -14,7 +14,7 @@
14
14
 
15
15
  <div id="assign_file_list" class="with_padding<%= search_filter_params[:tagged_with].present? ? ' filtered' : '' %>">
16
16
  <div id="library_sidebar">
17
- <%= render 'filter_bar' %>
17
+ <%= render 'filter_bar' if resource_has_filters %>
18
18
 
19
19
  <% if Alchemy::Attachment.tag_counts.any? %>
20
20
  <div class="tag-list">
@@ -7,8 +7,7 @@
7
7
  file_attribute: 'file' %>
8
8
  <% end %>
9
9
  </div>
10
- <%= render 'alchemy/admin/partials/search_form',
11
- additional_params: [:file_type, :tagged_with] %>
10
+ <%= render 'alchemy/admin/partials/search_form' %>
12
11
  <% end %>
13
12
 
14
13
  <div id="archive_all" class="with_tag_filter resources-table-wrapper">
@@ -16,7 +15,7 @@
16
15
  <%= render 'files_list' %>
17
16
 
18
17
  <div id="library_sidebar">
19
- <%= render 'filter_bar' %>
18
+ <%= render 'filter_bar' if resource_has_filters %>
20
19
 
21
20
  <% if Alchemy::Attachment.tag_counts.any? %>
22
21
  <div class="tag-list with_filter_bar<%= ' filtered' if search_filter_params[:tagged_with].present? %>">
@@ -74,4 +74,4 @@
74
74
  <% search_filter_params[:view] = "list" %>
75
75
  <%= render "alchemy/admin/partials/search_form",
76
76
  url: alchemy.admin_pages_path(search_filter_params.except(:q, :page)),
77
- additional_params: [:view, :page_layout, :tagged_with, :filter] %>
77
+ additional_params: [:view] %>
@@ -24,15 +24,8 @@
24
24
  <%= paginate @pages, scope: alchemy, theme: "alchemy" %>
25
25
 
26
26
  <div id="library_sidebar">
27
- <%= render "page_layout_filter" %>
28
-
29
- <%= render "filter_bar",
30
- label: Alchemy::Page.human_attribute_name(:status),
31
- url: alchemy.admin_pages_path(search_filter_params.except(:filter, :page).merge(view: "list")) %>
32
-
33
- <% if resource_has_tags %>
34
- <%= render "tag_list" %>
35
- <% end %>
27
+ <%= render "filter_bar" if resource_has_filters %>
28
+ <%= render "tag_list" if resource_has_tags %>
36
29
  </div>
37
30
  <% else %>
38
31
  <% if @page_root %>
@@ -16,6 +16,15 @@
16
16
  id: 'search_field_clear',
17
17
  title: Alchemy.t(:click_to_show_all),
18
18
  style: search_filter_params.fetch(:q, {}).fetch(resource_handler.search_field_name, '').present? ? 'display: block' : 'display: none' %>
19
+
20
+ <% search_filter_params.fetch(:filter, []).each do |filter_param| %>
21
+ <%= hidden_field_tag "filter[#{filter_param[0]}]", filter_param[1], id: nil %>
22
+ <% end %>
23
+
24
+ <% if search_filter_params.fetch(:tagged_with, nil) %>
25
+ <%= hidden_field_tag :tagged_with, search_filter_params.fetch(:tagged_with), id: nil %>
26
+ <% end %>
27
+
19
28
  <% local_assigns.fetch(:additional_params, []).each do |additional_param| %>
20
29
  <%= hidden_field_tag additional_param, search_filter_params[additional_param], id: nil %>
21
30
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div id="library_sidebar">
2
- <%= render 'filter_bar' %>
2
+ <%= render 'filter_bar' if resource_has_filters %>
3
3
 
4
4
  <% if Alchemy::Picture.tag_counts.any? %>
5
5
  <div class="tag-list with_filter_bar<%= ' filtered' if search_filter_params[:tagged_with].present? %>">
@@ -3,7 +3,7 @@
3
3
  </div>
4
4
  <div id="assign_image_list" class="with_padding<%= search_filter_params[:tagged_with].present? ? ' filtered' : '' %>">
5
5
  <div id="library_sidebar">
6
- <%= render 'filter_bar' %>
6
+ <%= render 'filter_bar' if resource_has_filters %>
7
7
  <div class="tag-list">
8
8
  <%= render 'tag_list' %>
9
9
  </div>
@@ -7,8 +7,10 @@
7
7
  in_dialog: true,
8
8
  redirect_url: alchemy.admin_pictures_path(
9
9
  size: search_filter_params[:size],
10
- filter: 'last_upload',
11
- form_field_id: @form_field_id
10
+ filter: { misc: 'last_upload' },
11
+ form_field_id: @form_field_id,
12
+ content_id: @content.try(:id),
13
+ element_id: @element.try(:id)
12
14
  ) %>
13
15
  <div class="toolbar_spacer"></div>
14
16
  <% end %>
@@ -6,7 +6,7 @@
6
6
  file_attribute: 'image_file',
7
7
  redirect_url: alchemy.admin_pictures_path(
8
8
  size: @size,
9
- filter: 'last_upload'
9
+ filter: { misc: 'last_upload' }
10
10
  ) %>
11
11
  <div class="toolbar_spacer"></div>
12
12
  <% end %>
@@ -67,7 +67,7 @@
67
67
  </div>
68
68
 
69
69
  <%= render 'alchemy/admin/partials/search_form',
70
- additional_params: [:filter, :tagged_with, :size] %>
70
+ additional_params: [:size] %>
71
71
  <% end %>
72
72
 
73
73
  <div id="picture_archive" class="resources-table-wrapper with_tag_filter">
@@ -75,7 +75,12 @@
75
75
  <h2>
76
76
  <%= @pictures.total_count %>
77
77
  <%= Alchemy::Picture.model_name.human(count: @pictures.total_count) %>
78
- <%= Alchemy.t("picture_library.filter.#{search_filter_params[:filter]}") if search_filter_params[:filter].present? %>
78
+ <% if search_filter_params[:filter].present? %>
79
+ <%= Alchemy.t("filtered_by") %>
80
+ <% search_filter_params[:filter].each do |k, v| %>
81
+ <span class="applied-filter"><%= Alchemy.t("filters.picture.#{k}.values.#{v}") %></span>
82
+ <% end %>
83
+ <% end %>
79
84
  </h2>
80
85
  </div>
81
86
  <%= render 'archive' %>
@@ -0,0 +1,12 @@
1
+ <label>
2
+ <h3><%= Alchemy.t("name", scope: ["filters", resource_name, filter.name]) || Alchemy.t('Filter') %></h3>
3
+ <%= select_tag(
4
+ filter.name,
5
+ options_for_select(
6
+ filter.options_for_select, params[:filter].try(:[], filter.name)
7
+ ),
8
+ include_blank: Alchemy.t(:all, scope: ['resources', resource_name, 'filters']),
9
+ data: { remote: !!request.xhr? },
10
+ class: 'alchemy_selectbox'
11
+ ) %>
12
+ </label>
@@ -1,28 +1,25 @@
1
1
  <div id="filter_bar">
2
- <label>
3
- <h3><%= local_assigns[:label] || Alchemy.t('Filter') %></h3>
4
- <%= select_tag(
5
- 'resource_filter',
6
- options_for_select(
7
- resource_filter_select, search_filter_params[:filter]
8
- ),
9
- include_blank: Alchemy.t(:all, scope: ['resources', resource_name, 'filters']),
10
- data: { remote: !!request.xhr? },
11
- class: 'alchemy_selectbox'
12
- ) %>
13
- </label>
2
+ <%= render partial: "filter", collection: resource_filters_for_select %>
14
3
  </div>
15
4
 
16
5
  <script type="text/javascript">
17
6
  $(function() {
18
- $('#resource_filter').on('change', function(e) {
7
+ $('select', '#filter_bar').on('change', function(e) {
19
8
  var $this = $(this);
20
- var url = '<%= local_assigns[:url] || resources_path(resource_handler.namespaced_resources_name, search_filter_params.except(:filter).to_h) %>';
9
+ var filter_param = 'filter['+$this.attr('name')+']';
10
+ var path = '<%= resources_path(resource_handler.namespaced_resources_name) %>';
11
+ var params = new URLSearchParams('<%= raw search_filter_params.to_query %>');
12
+
13
+ if ($this.val() === "") {
14
+ params.delete(filter_param);
15
+ } else {
16
+ params.set(filter_param, $this.val());
17
+ }
18
+
21
19
  if ($this.data('remote') === true) {
22
- $.get(url, {filter: $this.val()}, null, 'script');
20
+ $.get(path, params.toString(), null, 'script');
23
21
  } else {
24
- delimiter = url.match(/\?/) ? '&' : '?';
25
- Turbolinks.visit(url + delimiter + 'filter=' + encodeURIComponent($this.val()));
22
+ Turbolinks.visit(path + '?' + params.toString());
26
23
  }
27
24
  return false;
28
25
  });
@@ -6,6 +6,8 @@
6
6
  label_method: relation[:attr_method],
7
7
  include_blank: Alchemy.t(:blank, scope: 'resources.relation_select'),
8
8
  input_html: {class: 'alchemy_selectbox'} %>
9
+ <% elsif attribute[:type].in? %i[date time datetime] %>
10
+ <%= f.datepicker attribute[:name], resource_attribute_field_options(attribute) %>
9
11
  <% else %>
10
12
  <%= f.input attribute[:name], resource_attribute_field_options(attribute) %>
11
13
  <% end %>
@@ -1,4 +1,19 @@
1
1
  <div class="resources-header">
2
+ <% if search_filter_params[:filter].present? %>
3
+ <b><%= Alchemy.t("filtered_by") %></b>
4
+ <% search_filter_params[:filter].each do |k, v| %>
5
+ <%- tmp_params = search_filter_params.dup -%>
6
+ <%- tmp_params[:filter] = tmp_params[:filter].except(k) -%>
7
+ <%- dismiss_filter_url = resource_url_proxy.url_for(
8
+ { action: 'index' }.merge(tmp_params.except(:page))
9
+ ) -%>
10
+ <div class="applied-filter">
11
+ <%= Alchemy.t("filters.#{resource_handler.resource_name}.#{k}.values.#{v}", default: v) %>
12
+ <%= link_to render_icon(:times, size: 'xs'), dismiss_filter_url, class: 'dismiss-filter' %>
13
+ </div>
14
+ <% end %>
15
+ <% end %>
16
+
2
17
  <h2>
3
18
  <%= resources_instance_variable.total_count %>
4
19
  <%= resource_model.model_name.human(count: resources_instance_variable.total_count) %>
@@ -21,10 +21,7 @@
21
21
  dialog: false,
22
22
  if_permitted_to: [:index, resource_model]
23
23
  ) %>
24
- <%= render 'alchemy/admin/partials/search_form', additional_params: [
25
- resource_has_filters ? :filter : nil,
26
- resource_has_tags ? :tagged_with : nil
27
- ].compact %>
24
+ <%= render 'alchemy/admin/partials/search_form' %>
28
25
  <% end %>
29
26
 
30
27
  <div id="archive_all" class="resources-table-wrapper<%= ' with_tag_filter' if resource_has_tags || resource_has_filters %>">
@@ -33,13 +30,8 @@
33
30
 
34
31
  <% if resource_has_tags || resource_has_filters %>
35
32
  <div id="library_sidebar">
36
- <% if resource_has_filters %>
37
- <%= render 'filter_bar' %>
38
- <% end %>
39
-
40
- <% if resource_has_tags %>
41
- <%= render 'tag_list' %>
42
- <% end %>
33
+ <%= render 'filter_bar' if resource_has_filters %>
34
+ <%= render 'tag_list' if resource_has_tags %>
43
35
  </div>
44
36
  <% end %>
45
37
  </div>
@@ -57,6 +57,90 @@ en:
57
57
  main_menu: Main Menu
58
58
  footer_menu: Footer Menu
59
59
 
60
+ # == Mime Types translations
61
+ # These are human readable mime types used for the document-type row in archive files.
62
+ #
63
+ mime_types: &mime_types
64
+ application/msexcel: Excel Spreadsheet
65
+ application/mspowerpoint: PowerPoint Presentation
66
+ application/msword: Word Document
67
+ application/pdf: PDF Document
68
+ application/rtf: RTF Document
69
+ application/vcard: vCard
70
+ application/vnd:
71
+ ms-excel: Excel Spreadsheet
72
+ ms-powerpoint: PowerPoint Presentation
73
+ ms-word: Word Document
74
+ openxmlformats-officedocument:
75
+ presentationml:
76
+ presentation: PowerPoint 2007 Presentation
77
+ spreadsheetml:
78
+ sheet: Excel 2007 Spreadsheet
79
+ wordprocessingml:
80
+ document: Word 2007 Document
81
+ application/x-flash-video: Flash Video
82
+ application/x-rar: RAR Archive
83
+ application/x-shockwave-flash: Flash Movie
84
+ application/zip: ZIP Archive
85
+ audio/mp4: MPEG-4 Audio
86
+ audio/mpeg: MP3 Audio
87
+ audio/wav: WAV Audio
88
+ audio/x-wav: WAV Audio
89
+ image/gif: GIF Image
90
+ image/jpeg: JPG Image
91
+ image/png: PNG Image
92
+ image/tiff: TIFF Image
93
+ image/x-psd: Photoshop File
94
+ image/svg+xml: SVG Image
95
+ text/plain: Plain Text Document
96
+ text/x-vcard: vCard
97
+ video/mp4: MPEG-4 Video
98
+ video/mpeg: MPEG Video
99
+ video/quicktime: Quicktime Video
100
+ video/x-flv: Flash Video
101
+ video/x-ms-wmv: Windows Media Video
102
+ video/x-msvideo: AVI Video
103
+
104
+ # === Translations for filter names and values
105
+ # Used in the right filter column in case the model has `alchemy_resource_filters` defined.
106
+ #
107
+ filters:
108
+ page:
109
+ by_page_layout:
110
+ name: Page Type
111
+ status:
112
+ name: Status
113
+ values:
114
+ not_public: Unpublished
115
+ published: Published
116
+ restricted: Restricted
117
+ picture:
118
+ by_file_format:
119
+ name: File Type
120
+ values:
121
+ gif: GIF Image
122
+ jpeg: JPG Image
123
+ png: PNG Image
124
+ tiff: TIFF Image
125
+ misc:
126
+ name: Miscellaneous
127
+ values:
128
+ last_upload: Last upload only
129
+ recent: Recently uploaded only
130
+ without_tag: Without tag
131
+ attachment:
132
+ by_file_type:
133
+ name: File Type
134
+ values:
135
+ <<: *mime_types
136
+ misc:
137
+ name: Miscellaneous
138
+ values:
139
+ last_upload: Last upload only
140
+ recent: Recently uploaded only
141
+ without_tag: Without tag
142
+ deletable: Not linked by file content
143
+
60
144
  # === Translations for content validations
61
145
  # Used when a user did not enter (correct) values to the content field.
62
146
  #
@@ -132,49 +216,6 @@ en:
132
216
  editor: "Editor"
133
217
  admin: "Administrator"
134
218
 
135
- # == Mime Types translations
136
- # These are human readable mime types used for the document-type row in archive files.
137
- mime_types:
138
- application/msexcel: Excel Spreadsheet
139
- application/mspowerpoint: PowerPoint Presentation
140
- application/msword: Word Document
141
- application/pdf: PDF Document
142
- application/rtf: RTF Document
143
- application/vcard: vCard
144
- application/vnd:
145
- ms-excel: Excel Spreadsheet
146
- ms-powerpoint: PowerPoint Presentation
147
- ms-word: Word Document
148
- openxmlformats-officedocument:
149
- presentationml:
150
- presentation: PowerPoint 2007 Presentation
151
- spreadsheetml:
152
- sheet: Excel 2007 Spreadsheet
153
- wordprocessingml:
154
- document: Word 2007 Document
155
- application/x-flash-video: Flash Video
156
- application/x-rar: RAR Archive
157
- application/x-shockwave-flash: Flash Movie
158
- application/zip: ZIP Archive
159
- audio/mp4: MPEG-4 Audio
160
- audio/mpeg: MP3 Audio
161
- audio/wav: WAV Audio
162
- audio/x-wav: WAV Audio
163
- image/gif: GIF Image
164
- image/jpeg: JPG Image
165
- image/png: PNG Image
166
- image/tiff: TIFF Image
167
- image/x-psd: Photoshop File
168
- image/svg+xml: SVG Image
169
- text/plain: Plain Text Document
170
- text/x-vcard: vCard
171
- video/mp4: MPEG-4 Video
172
- video/mpeg: MPEG Video
173
- video/quicktime: Quicktime Video
174
- video/x-flv: Flash Video
175
- video/x-ms-wmv: Windows Media Video
176
- video/x-msvideo: AVI Video
177
-
178
219
  link_target_options:
179
220
  default: Same Window
180
221
  blank: New Window/Tab
@@ -403,6 +444,7 @@ en:
403
444
  female: "Female"
404
445
  file: "File"
405
446
  file_rename_error: "Error renaming file."
447
+ filtered_by: "Filtered by"
406
448
  from_at: "from %{by} at %{at}"
407
449
  height: "Height"
408
450
  help:
@@ -435,7 +477,6 @@ en:
435
477
  javascript_disabled_text: "Alchemy needs Javascript to run smoothly. Please enable it in your browser settings."
436
478
  language_code_placeholder: 'i.e. en'
437
479
  language_pages_copied: "Language tree successfully copied."
438
- last_upload_only: "Last upload only"
439
480
  left: "left"
440
481
  legacy_url_info_text: "A link is a redirect from an old URL to the current URL of this page. This redirect happens with a <a href='https://support.google.com/webmasters/answer/93633' target='_blank'>301 status code</a>."
441
482
  link_image: "Link this image."
@@ -519,11 +560,6 @@ en:
519
560
  comma_seperated: "Separate by comma"
520
561
  password: "Password"
521
562
  paste: "paste"
522
- picture_library:
523
- filter:
524
- last_upload: "from last upload"
525
- recent: "that where recently uploaded"
526
- without_tag: "without tag"
527
563
  pictures_in_page: "%{page} in %{pictures}"
528
564
  place_link: "Link text"
529
565
  player_version: "Flash Player version"