spina 0.12.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spina might be problematic. Click here for more details.

Files changed (210) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +65 -7
  3. data/app/assets/fonts/spina/ics_spina.eot +0 -0
  4. data/app/assets/fonts/spina/ics_spina.svg +65 -61
  5. data/app/assets/fonts/spina/ics_spina.ttf +0 -0
  6. data/app/assets/fonts/spina/ics_spina.woff +0 -0
  7. data/app/assets/fonts/spina/ics_spina.woff2 +0 -0
  8. data/app/assets/icons/spina/export.svg +10 -0
  9. data/app/assets/icons/spina/preview/ics_spina-preview.html +17 -1
  10. data/app/assets/images/spina/media_folder_placeholder.png +0 -0
  11. data/app/assets/images/spina/{admin/spina.png → spina-large.png} +0 -0
  12. data/app/assets/javascripts/spina/admin/application.js +50 -0
  13. data/app/assets/javascripts/spina/admin/controllers/infinite_scroll_controller.js +40 -0
  14. data/app/assets/javascripts/spina/admin/media_gallery.coffee +65 -0
  15. data/app/assets/javascripts/spina/admin/modal.coffee +0 -1
  16. data/app/assets/javascripts/spina/admin/pages.coffee.erb +2 -2
  17. data/app/assets/javascripts/spina/admin/{application.coffee.erb → scaffold.coffee} +20 -61
  18. data/app/assets/javascripts/spina/admin/trix.coffee.erb +5 -8
  19. data/app/assets/javascripts/spina/admin/uploads.coffee +2 -2
  20. data/app/assets/stylesheets/spina.sass +3 -3
  21. data/app/assets/stylesheets/spina/_buttons.sass +0 -1
  22. data/app/assets/stylesheets/spina/{_configuration.sass → _configuration.sass.erb} +5 -1
  23. data/app/assets/stylesheets/spina/_forms.sass +79 -20
  24. data/app/assets/stylesheets/spina/_gallery.sass +91 -3
  25. data/app/assets/stylesheets/spina/_ics_spina.scss +1 -0
  26. data/app/assets/stylesheets/spina/_tables.sass +4 -0
  27. data/app/assets/stylesheets/spina/_trix.sass +7 -4
  28. data/app/assets/stylesheets/spina_front_end.sass +19 -0
  29. data/app/controllers/concerns/spina/frontend.rb +29 -12
  30. data/app/controllers/spina/admin/admin_controller.rb +1 -1
  31. data/app/controllers/spina/admin/attachments_controller.rb +10 -5
  32. data/app/controllers/spina/admin/images_controller.rb +51 -0
  33. data/app/controllers/spina/admin/media_folders_controller.rb +37 -0
  34. data/app/controllers/spina/admin/media_picker_controller.rb +28 -0
  35. data/app/controllers/spina/admin/pages_controller.rb +16 -6
  36. data/app/controllers/spina/admin/resources_controller.rb +33 -0
  37. data/app/controllers/spina/admin/settings_controller.rb +56 -0
  38. data/app/controllers/spina/pages_controller.rb +0 -6
  39. data/app/helpers/spina/admin/pages_helper.rb +2 -2
  40. data/app/helpers/spina/admin_nav_helper.rb +7 -0
  41. data/app/helpers/spina/files_helper.rb +9 -0
  42. data/app/helpers/spina/images_helper.rb +17 -0
  43. data/app/helpers/spina/pages_helper.rb +17 -0
  44. data/app/models/concerns/spina/image_collectable.rb +23 -0
  45. data/app/models/concerns/spina/part.rb +7 -4
  46. data/app/models/spina/account.rb +10 -14
  47. data/app/models/spina/attachment.rb +8 -10
  48. data/app/models/spina/attachment_collection.rb +6 -1
  49. data/app/models/spina/current.rb +5 -0
  50. data/app/models/spina/image.rb +26 -0
  51. data/app/models/spina/{photo_collection.rb → image_collection.rb} +6 -6
  52. data/app/models/spina/image_collections_image.rb +6 -0
  53. data/app/models/spina/line.rb +1 -0
  54. data/app/models/spina/media_folder.rb +7 -0
  55. data/app/models/spina/navigation.rb +4 -0
  56. data/app/models/spina/navigation_item.rb +1 -1
  57. data/app/models/spina/page.rb +18 -13
  58. data/app/models/spina/page_part.rb +1 -0
  59. data/app/models/spina/resource.rb +16 -0
  60. data/app/models/spina/setting.rb +7 -0
  61. data/app/models/spina/structure.rb +2 -0
  62. data/app/models/spina/structure_item.rb +2 -0
  63. data/app/models/spina/structure_part.rb +2 -1
  64. data/app/models/spina/text.rb +1 -0
  65. data/app/views/dummy/show.html.haml +1 -0
  66. data/app/views/layouts/spina/admin/media_library.html.haml +6 -3
  67. data/app/views/layouts/spina/admin/pages.html.haml +4 -1
  68. data/app/views/layouts/spina/admin/resources.html.haml +10 -0
  69. data/app/views/spina/admin/accounts/style.html.haml +3 -2
  70. data/app/views/spina/admin/attachments/_attachment.html.haml +3 -3
  71. data/app/views/spina/admin/attachments/_select.html.haml +7 -15
  72. data/app/views/spina/admin/attachments/_select_collection.html.haml +7 -14
  73. data/app/views/spina/admin/attachments/create.js.erb +1 -3
  74. data/app/views/spina/admin/attachments/index.html.haml +4 -3
  75. data/app/views/spina/admin/attachments/insert.js.erb +5 -0
  76. data/app/views/spina/admin/image_collections/_image_collection.html.haml +5 -0
  77. data/app/views/spina/admin/images/_form.html.haml +5 -0
  78. data/app/views/spina/admin/images/_image.html.haml +10 -0
  79. data/app/views/spina/admin/images/create.js.erb +8 -0
  80. data/app/views/spina/admin/images/index.html.haml +22 -0
  81. data/app/views/spina/admin/images/index.js.erb +7 -0
  82. data/app/views/spina/admin/media_folders/_form.html.haml +14 -0
  83. data/app/views/spina/admin/media_folders/_media_folder.html.haml +8 -0
  84. data/app/views/spina/admin/media_folders/new.js.erb +1 -0
  85. data/app/views/spina/admin/media_folders/show.html.haml +17 -0
  86. data/app/views/spina/admin/media_picker/_modal.html.haml +26 -0
  87. data/app/views/spina/admin/media_picker/infinite_scroll.js.erb +5 -0
  88. data/app/views/spina/admin/media_picker/select.js.erb +28 -0
  89. data/app/views/spina/admin/media_picker/show.js.erb +1 -0
  90. data/app/views/spina/admin/navigations/_page.html.haml +2 -2
  91. data/app/views/spina/admin/navigations/edit.html.haml +1 -1
  92. data/app/views/spina/admin/pages/_form.html.haml +21 -15
  93. data/app/views/spina/admin/pages/_form_advanced.html.haml +53 -43
  94. data/app/views/spina/admin/pages/_form_page_content.html.haml +1 -1
  95. data/app/views/spina/admin/pages/_form_page_seo.html.haml +1 -1
  96. data/app/views/spina/admin/pages/_page_nested_list.html.haml +3 -3
  97. data/app/views/spina/admin/pages/index.html.haml +1 -1
  98. data/app/views/spina/admin/{page_partables → partables}/attachment_collections/_form.html.haml +1 -1
  99. data/app/views/spina/admin/{page_partables → partables}/attachments/_form.html.haml +4 -4
  100. data/app/views/spina/admin/partables/image_collections/_form.html.haml +16 -0
  101. data/app/views/spina/admin/partables/images/_form.html.haml +14 -0
  102. data/app/views/spina/admin/{page_partables → partables}/lines/_form.html.haml +1 -1
  103. data/app/views/spina/admin/{structure_partables → partables}/options/_form.html.haml +1 -1
  104. data/app/views/spina/admin/partables/photo_collections/_form.html.haml +4 -0
  105. data/app/views/spina/admin/partables/photos/_form.html.haml +4 -0
  106. data/app/views/spina/admin/{page_partables → partables}/structures/_form.html.haml +3 -3
  107. data/app/views/spina/admin/{page_partables → partables}/texts/_form.html.haml +1 -1
  108. data/app/views/spina/admin/password_resets/edit.html.haml +1 -1
  109. data/app/views/spina/admin/password_resets/new.html.haml +1 -1
  110. data/app/views/spina/admin/resources/edit.html.haml +49 -0
  111. data/app/views/spina/admin/resources/show.html.haml +14 -0
  112. data/app/views/spina/admin/sessions/new.html.haml +1 -1
  113. data/app/views/spina/admin/settings/_string_field.html.haml +4 -0
  114. data/app/views/spina/admin/settings/_wysiwyg_field.html.haml +4 -0
  115. data/app/views/spina/admin/settings/edit.html.haml +13 -0
  116. data/app/views/spina/admin/shared/_primary_navigation.html.haml +13 -5
  117. data/app/views/spina/admin/shared/_rich_text_field.html.haml +10 -10
  118. data/app/views/spina/admin/structure_items/_fields.html.haml +1 -1
  119. data/app/views/spina/admin/structure_partables/attachment_collections/_form.html.haml +14 -0
  120. data/app/views/spina/admin/structure_partables/attachments/_form.html.haml +13 -0
  121. data/app/views/spina/shared/_analytics.html.erb +8 -8
  122. data/app/views/spina/shared/_navigation.html.haml +3 -3
  123. data/app/views/spina/shared/_spina_link.html.haml +2 -0
  124. data/app/views/spina/sitemaps/show.xml.builder +2 -2
  125. data/config/initializers/assets.rb +6 -1
  126. data/config/locales/TH.yml +243 -0
  127. data/config/locales/bg.yml +250 -0
  128. data/config/locales/de.yml +67 -22
  129. data/config/locales/en.yml +29 -2
  130. data/config/locales/es.yml +58 -1
  131. data/config/locales/fr.yml +80 -32
  132. data/config/locales/id.yml +228 -0
  133. data/config/locales/nl.yml +32 -0
  134. data/config/locales/pl.yml +225 -0
  135. data/config/locales/pt-BR.yml +34 -3
  136. data/config/locales/ro.yml +225 -0
  137. data/config/locales/ru.yml +10 -0
  138. data/config/locales/sv.yml +223 -0
  139. data/config/routes.rb +13 -13
  140. data/db/migrate/10_create_spina_image_collections.rb +16 -0
  141. data/db/migrate/11_create_spina_resources.rb +15 -0
  142. data/db/migrate/1_create_spina_tables.rb +0 -19
  143. data/db/migrate/2_create_spina_translation_tables.rb +36 -6
  144. data/db/migrate/7_create_spina_settings.rb +11 -0
  145. data/db/migrate/8_create_spina_media_folders.rb +8 -0
  146. data/db/migrate/9_create_spina_images.rb +10 -0
  147. data/lib/generators/spina/install_generator.rb +2 -2
  148. data/lib/generators/spina/templates/app/views/default/pages/homepage.html.haml +3 -2
  149. data/lib/generators/spina/templates/app/views/default/pages/show.html.haml +2 -2
  150. data/lib/generators/spina/templates/app/views/default/shared/_navigation.html.haml +3 -5
  151. data/lib/generators/spina/templates/app/views/demo/pages/demo.html.haml +20 -23
  152. data/lib/generators/spina/templates/app/views/demo/pages/homepage.html.haml +2 -2
  153. data/lib/generators/spina/templates/app/views/demo/pages/show.html.haml +2 -2
  154. data/lib/generators/spina/templates/app/views/demo/shared/_navigation.html.haml +3 -5
  155. data/lib/generators/spina/templates/config/initializers/mobility.rb +6 -0
  156. data/lib/generators/spina/templates/config/initializers/spina.rb +3 -0
  157. data/lib/generators/spina/templates/config/initializers/themes/demo.rb +7 -7
  158. data/lib/spina.rb +0 -1
  159. data/lib/spina/engine.rb +6 -7
  160. data/lib/spina/plugin.rb +48 -3
  161. data/lib/spina/version.rb +1 -1
  162. data/vendor/assets/javascripts/spina/stimulus.umd.js +5 -0
  163. data/vendor/assets/javascripts/spina/trix.js +10 -9
  164. metadata +106 -103
  165. data/app/assets/images/spina/danger-zone-ribbon.png +0 -0
  166. data/app/assets/images/spina/spina_small.png +0 -0
  167. data/app/assets/javascripts/spina/admin/infinite_scroll.coffee +0 -25
  168. data/app/controllers/spina/admin/photos_controller.rb +0 -100
  169. data/app/models/concerns/spina/photo_collectable.rb +0 -24
  170. data/app/models/spina/photo.rb +0 -29
  171. data/app/models/spina/photo_collections_photo.rb +0 -6
  172. data/app/presenters/spina/pages/menu_presenter.rb +0 -63
  173. data/app/uploaders/spina/default_store_uploader.rb +0 -15
  174. data/app/uploaders/spina/file_uploader.rb +0 -6
  175. data/app/uploaders/spina/logo_uploader.rb +0 -13
  176. data/app/uploaders/spina/photo_uploader.rb +0 -23
  177. data/app/views/spina/admin/attachments/_fields.html.haml +0 -8
  178. data/app/views/spina/admin/attachments/insert.js.coffee +0 -5
  179. data/app/views/spina/admin/page_partables/options/_form.html.haml +0 -6
  180. data/app/views/spina/admin/page_partables/photo_collections/_form.html.haml +0 -17
  181. data/app/views/spina/admin/page_partables/photos/_form.html.haml +0 -14
  182. data/app/views/spina/admin/photos/_photo.html.haml +0 -8
  183. data/app/views/spina/admin/photos/_photo_collection.html.haml +0 -5
  184. data/app/views/spina/admin/photos/_photo_collection_select.html.haml +0 -23
  185. data/app/views/spina/admin/photos/_photo_link.html.haml +0 -11
  186. data/app/views/spina/admin/photos/_photo_multi_picker.html.haml +0 -3
  187. data/app/views/spina/admin/photos/_photo_select.html.haml +0 -16
  188. data/app/views/spina/admin/photos/_photo_single_picker.html.haml +0 -3
  189. data/app/views/spina/admin/photos/_photo_uploaded.html.haml +0 -4
  190. data/app/views/spina/admin/photos/_trix_select.html.haml +0 -11
  191. data/app/views/spina/admin/photos/create.js.erb +0 -4
  192. data/app/views/spina/admin/photos/index.html.haml +0 -13
  193. data/app/views/spina/admin/photos/index.js.erb +0 -5
  194. data/app/views/spina/admin/photos/insert_photo.js.erb +0 -10
  195. data/app/views/spina/admin/photos/insert_photo_collection.js.erb +0 -25
  196. data/app/views/spina/admin/photos/link.js.erb +0 -2
  197. data/app/views/spina/admin/photos/multi_picker_infinite_scroll.js.erb +0 -6
  198. data/app/views/spina/admin/photos/photo_collection_select.js.erb +0 -3
  199. data/app/views/spina/admin/photos/photo_select.js.erb +0 -3
  200. data/app/views/spina/admin/photos/single_picker_infinite_scroll.js.erb +0 -6
  201. data/app/views/spina/admin/photos/trix_infinite_scroll.js.erb +0 -4
  202. data/app/views/spina/admin/photos/trix_insert.js.erb +0 -2
  203. data/app/views/spina/admin/photos/trix_select.js.erb +0 -3
  204. data/app/views/spina/admin/structure_partables/lines/_form.html.haml +0 -5
  205. data/app/views/spina/admin/structure_partables/photo_collections/_form.html.haml +0 -17
  206. data/app/views/spina/admin/structure_partables/photos/_form.html.haml +0 -11
  207. data/app/views/spina/admin/structure_partables/texts/_form.html.haml +0 -5
  208. data/config/initializers/spina.rb +0 -0
  209. data/lib/generators/spina/templates/config/initializers/carrierwave.rb +0 -17
  210. data/lib/spina/railtie.rb +0 -9
@@ -4,7 +4,7 @@
4
4
  .horizontal-form-label
5
5
  = Spina::Page.human_attribute_name :seo_title
6
6
  .horizontal-form-content
7
- = f.text_field :seo_title, placeholder: Spina::Page.human_attribute_name(:seo_title_placeholder), value: f.object.read_attribute(:seo_title)
7
+ = f.text_field :seo_title, placeholder: Spina::Page.human_attribute_name(:seo_title_placeholder), value: f.object.seo_title(fallback: false, default: nil)
8
8
 
9
9
  .horizontal-form-group
10
10
  .horizontal-form-label
@@ -1,7 +1,7 @@
1
1
  %li.dd-item{data: {id: page_nested_list.id}}
2
- %div.dd-item-inner
2
+ .dd-item-inner
3
3
  = render partial: 'page', object: page_nested_list
4
4
 
5
- - if page_nested_list.children.active.present?
5
+ - if page_nested_list.children.active.regular_pages.any?
6
6
  %ol.dd-list
7
- = render partial: 'page_nested_list', collection: page_nested_list.children.active.sorted
7
+ = render partial: 'page_nested_list', collection: page_nested_list.children.active.sorted.regular_pages
@@ -32,4 +32,4 @@
32
32
  .well
33
33
  .dd#pages_list{data: {:"sort-url" => spina.sort_admin_pages_url }}
34
34
  %ol.dd-list
35
- = render partial: 'page_nested_list', collection: @pages.roots
35
+ = render partial: 'page_nested_list', collection: @pages
@@ -1,7 +1,7 @@
1
1
  .horizontal-form-label
2
2
  = f.object.title
3
3
  .horizontal-form-content
4
- = f.fields_for :page_partable, f.object.page_partable do |ff|
4
+ = f.fields_for :partable, f.object.partable do |ff|
5
5
  = link_to select_collection_admin_attachments_path(ff.object_name, selected_attachment_ids: ff.object.attachment_ids), remote: true, class: 'media_picker clearfix' do
6
6
  .placeholder
7
7
  %span.button.button-small.button-round
@@ -1,13 +1,13 @@
1
1
  .horizontal-form-label
2
2
  = f.object.title
3
3
  .horizontal-form-content
4
- = link_to select_admin_attachments_path(f.object_name, selected_attachment_id: f.object.page_partable.try(:id)), remote: true, class: 'media_picker clearfix' do
4
+ = link_to select_admin_attachments_path(f.object_name, selected_attachment_id: f.object.partable.try(:id)), remote: true, class: 'media_picker clearfix' do
5
5
  .placeholder
6
6
  %span.button.button-small.button-round
7
7
  %i.icon.icon-dots
8
8
  = t('spina.choose_from_library')
9
9
 
10
- - if f.object.page_partable && f.object.page_partable.file.present?
11
- .attachment= f.object.page_partable.name
10
+ - if f.object.partable && f.object.partable.file.attached?
11
+ .attachment= f.object.partable.name
12
12
 
13
- = f.hidden_field :page_partable_id
13
+ = f.hidden_field :partable_id
@@ -0,0 +1,16 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ = f.fields_for :partable, f.object.partable do |ff|
5
+ = link_to admin_media_picker_path(selected_ids: ff.object.image_ids, hidden_field_id: "media_picker_#{ff.object.object_id}", multiple: true), remote: true, class: 'media_picker clearfix' do
6
+ .placeholder
7
+ %span.button.button-small.button-round
8
+ %i.icon.icon-dots
9
+ =t 'spina.images.choose_images'
10
+
11
+ .image-collection
12
+ - if ff.object.images.any?
13
+ = render 'spina/admin/image_collections/image_collection', images: ff.object.images.sorted_by_image_collection
14
+
15
+ = ff.hidden_field :image_tokens, value: ff.object.image_ids.join(","), data: {hidden_field_id: "media_picker_#{ff.object.object_id}"}
16
+ = ff.hidden_field :image_positions, value: ff.object.images.sorted_by_image_collection.pluck(:image_id).join(","), class: 'image-positions'
@@ -0,0 +1,14 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ = link_to admin_media_picker_path(selected_ids: [f.object.partable_id], hidden_field_id: "media_picker_#{f.object.object_id}"), remote: true, class: 'media_picker clearfix' do
5
+ .placeholder
6
+ %span.button.button-small.button-round
7
+ %i.icon.icon-dots
8
+ =t 'spina.images.choose_image'
9
+
10
+ - if f.object.partable.file.attached?
11
+ .image
12
+ = image_tag variant(f.object.partable.file, resize: "300x300^", crop: "300x300+0+0")
13
+
14
+ = f.hidden_field :partable_id, data: {hidden_field_id: "media_picker_#{f.object.object_id}"}
@@ -1,5 +1,5 @@
1
1
  .horizontal-form-label
2
2
  = f.object.title
3
3
  .horizontal-form-content
4
- = f.fields_for :page_partable, f.object.page_partable do |ff|
4
+ = f.fields_for :partable, f.object.partable do |ff|
5
5
  = ff.text_field :content, placeholder: "#{t 'spina.pages.page_part'} #{f.object.name.downcase}"
@@ -1,7 +1,7 @@
1
1
  .horizontal-form-label
2
2
  = f.object.title
3
3
  .horizontal-form-content
4
- = f.fields_for :structure_partable, f.object.structure_partable do |ff|
4
+ = f.fields_for :partable, f.object.partable do |ff|
5
5
  .select-dropdown
6
6
  = ff.label :value, f.object.title
7
7
  = ff.select :value, f.object.options[:values].map{|o| [option_label(f.object, o), o]}, prompt: true
@@ -0,0 +1,4 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ %em{style: 'line-height: 28px; color: #333'} Spina::PhotoCollection is deprecated. Please change this PagePart to Spina::ImageCollection using <span style="background: #f1f1f1; border-radius: 3px; padding: 2px 8px; white-space: nowrap">rails spina:photo_to_image</span>
@@ -0,0 +1,4 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ %em{style: 'line-height: 28px; color: #333'} Spina::Photo is deprecated. Please change this PagePart to Spina::Image using <span style="background: #f1f1f1; border-radius: 3px; padding: 2px 8px; white-space: nowrap">rails spina:photo_to_image</span>
@@ -4,18 +4,18 @@
4
4
  %label= f.object.title
5
5
 
6
6
  %ul
7
- - f.object.page_partable.structure_items.sort_by(&:position).each_with_index do |structure_item, index|
7
+ - f.object.page_partable.structure_items.sort_by{|item|item.position.to_i}.each_with_index do |structure_item, index|
8
8
  %li{class: ('active' if index == 0), data: {structure_item_id: structure_item.object_id}}
9
9
  = link_to "#structure_form_pane_#{structure_item.object_id}" do
10
10
  %i.icon.icon-bars.sortable-handle
11
11
  = structure_item.structure_parts.first.try(:structure_partable).try(:content)
12
12
 
13
- = f.fields_for :page_partable do |ff|
13
+ = f.fields_for :partable do |ff|
14
14
  - ff.object.page_part = f.object
15
15
  = link_to_add_structure_item_fields ff do
16
16
  = icon('plus')
17
17
 
18
18
  .structure-form-content
19
19
  = f.fields_for :page_partable do |ff|
20
- = ff.fields_for :structure_items, ff.object.structure_items.sort_by(&:position) do |fff|
20
+ = ff.fields_for :structure_items, ff.object.structure_items.sort_by{|item|item.position.to_i} do |fff|
21
21
  = render 'spina/admin/structure_items/fields', f: fff
@@ -1,5 +1,5 @@
1
1
  .horizontal-form-label
2
2
  = f.object.title
3
3
  .horizontal-form-content
4
- = f.fields_for :page_partable, f.object.page_partable do |ff|
4
+ = f.fields_for :partable, f.object.partable do |ff|
5
5
  = render 'spina/admin/shared/rich_text_field', f: ff, field: :content
@@ -1,5 +1,5 @@
1
1
  = form_for @user, url: spina.admin_password_reset_path(params[:id]), html: {id: "login_wrapper"} do |f|
2
- = image_tag 'spina/admin/spina.png', class: 'animated fadeInDown'
2
+ = image_tag 'spina/spina-large.png', class: 'animated fadeInDown'
3
3
  - if @user.errors.any?
4
4
  .failed-to-login.animated.fadeInDown
5
5
  .icon.icon-cross
@@ -1,5 +1,5 @@
1
1
  = form_tag spina.admin_password_resets_path, method: :post, id: "login_wrapper" do
2
- = image_tag 'spina/admin/spina.png'
2
+ = image_tag 'spina/spina-large.png'
3
3
  - if flash[:alert].present?
4
4
  .failed-to-login.animated.fadeInDown
5
5
  .icon.icon-cross
@@ -0,0 +1,49 @@
1
+ - if @resource.errors.any?
2
+ - content_for :notifications do
3
+ .notification.notification-danger.animated.fadeInRight
4
+ = icon('exclamation')
5
+ .notification-message
6
+ =t 'spina.notifications.alert'
7
+ %small= @resource.errors.full_messages.join('<br />').html_safe
8
+ = link_to '#', data: {close_notification: true} do
9
+ = icon('cross')
10
+
11
+ = form_with model: @resource, url: spina.admin_resource_path(@resource) do |f|
12
+ %header#header
13
+ .breadcrumbs= render_breadcrumbs separator: '<div class="divider"></div>'
14
+
15
+ #header_actions
16
+ %button.button.button-primary{type: 'submit', style: 'margin-right: 0'}
17
+ = icon('check')
18
+ =t 'spina.save'
19
+
20
+ .well
21
+ .horizontal-form
22
+ .horizontal-form-group
23
+ .horizontal-form-label
24
+ = Spina::Resource.human_attribute_name :label
25
+ .horizontal-form-content
26
+ = f.text_field :label, placeholder: Spina::Resource.human_attribute_name(:label)
27
+
28
+ .horizontal-form-group
29
+ .horizontal-form-label
30
+ = Spina::Resource.human_attribute_name :order_by
31
+ .horizontal-form-content
32
+ .select-dropdown
33
+ - options = [[Spina::Page.human_attribute_name(:title), 'title']]
34
+ = f.select :order_by, options_for_select(options, f.object.order_by), include_blank: Spina::Page.human_attribute_name(:created_at)
35
+
36
+ .horizontal-form-group
37
+ .horizontal-form-label
38
+ = Spina::Resource.human_attribute_name :view_template
39
+ .horizontal-form-content
40
+ .select-dropdown
41
+ - options = options_for_select(current_theme.view_templates.map { |template| [template[:title], template[:name]] }, @resource.view_template)
42
+ = f.select :view_template, options, include_blank: true
43
+
44
+ .horizontal-form-group
45
+ .horizontal-form-label
46
+ = Spina::Resource.human_attribute_name :parent_page
47
+ .horizontal-form-content
48
+ .select-dropdown
49
+ = f.select :parent_page_id, page_ancestry_options(f.object), include_blank: Spina::Resource.human_attribute_name(:no_parent)
@@ -0,0 +1,14 @@
1
+ - content_for(:header_actions) do
2
+
3
+ = link_to spina.edit_admin_resource_path(@resource), class: 'button' do
4
+ = t('spina.resources.edit')
5
+
6
+ = link_to spina.new_admin_page_path(params: {resource_id: @resource.id, view_template: @resource.view_template.presence || 'show'}), class: 'button button-primary icon-only', style: 'margin-right: 0' do
7
+ = icon('plus')
8
+
9
+ .well
10
+ .dd#pages_list
11
+ %ol.dd-list
12
+ - @resource.pages.each do |page|
13
+ %li.dd-item
14
+ .dd-item-inner= render partial: 'spina/admin/pages/page', object: page
@@ -1,5 +1,5 @@
1
1
  = form_tag spina.admin_sessions_path, id: "login_wrapper" do
2
- = image_tag 'spina/admin/spina.png', class: 'animated fadeInDown'
2
+ = image_tag 'spina/spina-large.png', class: 'animated fadeInDown'
3
3
  - if flash[:alert].present?
4
4
  .failed-to-login.animated.fadeInDown
5
5
  .icon.icon-cross
@@ -0,0 +1,4 @@
1
+ .horizontal-form-label
2
+ = f.label attribute, t("spina.#{plugin.namespace}.settings.#{attribute}")
3
+ .horizontal-form-content
4
+ = f.text_field attribute, placeholder: t("spina.#{plugin.namespace}.settings.#{attribute}_placeholder")
@@ -0,0 +1,4 @@
1
+ .horizontal-form-label
2
+ = f.label attribute, t("spina.#{plugin.namespace}.settings.#{attribute}")
3
+ .horizontal-form-content
4
+ = render 'spina/admin/shared/rich_text_field', f: f, field: attribute
@@ -0,0 +1,13 @@
1
+ = form_for @setting, url: admin_settings_path do |f|
2
+ %header#header
3
+ = render partial: 'spina/admin/shared/breadcrumbs'
4
+
5
+ #header_actions
6
+ %button.button.button-primary{type: 'submit'}
7
+ = icon('check')
8
+ = t('spina.settings.save')
9
+
10
+ .well
11
+ .horizontal-form
12
+ - plugin.settings.each do |key, value|
13
+ .horizontal-form-group= render "#{value.is_a?(Hash) ? value.first.first : value}_field", f: f, attribute: key
@@ -1,20 +1,25 @@
1
1
  %nav#primary.transformed{data: {turbolinks_permanent: true}}
2
2
  %ul
3
- %li{class: ('active' if (%w[pages photos attachments navigations] + Spina::Plugin.all.map { |plugin| plugin.namespace if current_theme.plugins.include?(plugin.name) }).include? controller_name)}
3
+ %li{class: ('active' if (%w[pages photos attachments navigations resources] + Spina::Plugin.all.map { |plugin| plugin.namespace if current_theme.plugins.include?(plugin.name) }).include? controller_name)}
4
4
  = link_to spina.admin_pages_path do
5
5
  = icon('home')
6
6
  = t('spina.website.title')
7
7
  = icon('caret-right')
8
8
 
9
9
  %ul
10
- %li{class: ('active' if current_admin_path.start_with?('/pages') || current_admin_path.start_with?('/navigations'))}
10
+ %li{class: ('active' if (current_admin_path.start_with?('/pages') || current_admin_path.start_with?('/navigations')) && @page&.resource.blank?)}
11
11
  = link_to t('spina.website.pages'), spina.admin_pages_path
12
- %li{class: ('active' if current_admin_path.start_with?('/photos', '/attachments'))}
13
- = link_to t('spina.website.media_library'), spina.admin_photos_path
12
+ %li{class: ('active' if current_admin_path.start_with?('/images', '/attachments'))}
13
+ = link_to t('spina.website.media_library'), spina.admin_images_path
14
+
14
15
  - Spina::Plugin.all.each do |plugin|
15
16
  - if current_theme.plugins.include? plugin.name
16
17
  - if lookup_context.exists? "spina/admin/hooks/#{ plugin.namespace }/_website_secondary_navigation"
17
18
  = render "spina/admin/hooks/#{ plugin.namespace }/website_secondary_navigation", plugin: plugin
19
+
20
+ - Spina::Resource.order(:label).each do |resource|
21
+ %li{class: ('active' if (@resource || @page&.resource) == resource)}= link_to resource.label, spina.admin_resource_path(resource)
22
+
18
23
  %li
19
24
  = link_to '#', class: 'back-to-main-menu' do
20
25
  = icon('caret-left')
@@ -48,6 +53,9 @@
48
53
  - if current_theme.plugins.include? plugin.name
49
54
  - if lookup_context.exists? "spina/admin/hooks/#{ plugin.namespace }/_settings_secondary_navigation"
50
55
  = render "spina/admin/hooks/#{ plugin.namespace }/settings_secondary_navigation", plugin: plugin
56
+ - if plugin.settings.present?
57
+ %li{class: ('active' if controller_name == 'settings' and params[:plugin] == plugin.namespace)}
58
+ = link_to t("spina.#{plugin.namespace}.title"), spina.admin_edit_settings_path(plugin.namespace)
51
59
 
52
60
  %li
53
61
  = link_to '#', class: 'back-to-main-menu' do
@@ -57,4 +65,4 @@
57
65
  %li.bottom
58
66
  = link_to spina.admin_logout_path, data: {turbolinks: false} do
59
67
  = icon('power-off')
60
- =t 'spina.logout'
68
+ =t 'spina.logout'
@@ -13,21 +13,21 @@
13
13
  .icon.icon-list-ul
14
14
  %button.button.button-small{ type: 'button', tabindex: -1, title: 'Link', data: { trix_action: 'link', trix_attribute: 'href', trix_key: 'k' }}
15
15
  .icon.icon-link
16
- %button.button.button-small.js-trix-photo{ type: 'button', tabindex: -1, title: 'Photo', data: { trix_action: 'photo', trix_attribute: 'photo' }}
16
+ %button.button.button-small.js-trix-image{ type: 'button', tabindex: -1, title: 'Image', data: { trix_action: 'image', trix_attribute: 'image' }}
17
17
  .icon.icon-picture-o
18
18
 
19
19
  .button-group.pull-left
20
20
  %button.button.button-small{ type: 'button', tabindex: -1, title: 'h1', data: { trix_attribute: 'heading1' }} H1
21
- %button.button.button-small{ type: 'button', tabindex: -1, title: 'h1', data: { trix_attribute: 'heading2' }} H2
22
- %button.button.button-small{ type: 'button', tabindex: -1, title: 'h2', data: { trix_attribute: 'heading3' }} H3
23
- %button.button.button-small{ type: 'button', tabindex: -1, title: 'h3', data: { trix_attribute: 'heading4' }} H4
24
- %button.button.button-small{ type: 'button', tabindex: -1, title: 'h4', data: { trix_attribute: 'heading5' }} H5
25
- %button.button.button-small{ type: 'button', tabindex: -1, title: 'h5', data: { trix_attribute: 'heading6' }} H6
21
+ %button.button.button-small{ type: 'button', tabindex: -1, title: 'h2', data: { trix_attribute: 'heading2' }} H2
22
+ %button.button.button-small{ type: 'button', tabindex: -1, title: 'h3', data: { trix_attribute: 'heading3' }} H3
23
+ %button.button.button-small{ type: 'button', tabindex: -1, title: 'h4', data: { trix_attribute: 'heading4' }} H4
24
+ %button.button.button-small{ type: 'button', tabindex: -1, title: 'h5', data: { trix_attribute: 'heading5' }} H5
25
+ %button.button.button-small{ type: 'button', tabindex: -1, title: 'h6', data: { trix_attribute: 'heading6' }} H6
26
26
 
27
- .dialogs
28
- .dialog.link_dialog{ data: { trix_attribute: 'href', trix_dialog: 'href'}}
29
- .link_url_fields
30
- %input{type: 'text', name: 'href', placeholder: 'Enter a URL…', required: true}
27
+ .trix-dialogs{data: {trix_dialogs: true}}
28
+ .trix-dialog.trix-dialog--link{ data: { trix_dialog_attribute: 'href', trix_dialog: 'href'}}
29
+ .trix-dialog__link-fields
30
+ %input.trix-input.trix-input--dialog{type: 'text', name: 'href', placeholder: 'Enter a URL…', required: true, data: {trix_input: true}}
31
31
  .button-group
32
32
  %input.button{type: 'button', tabindex: -1, value: 'Link', data: { trix_method: 'setAttribute'}}
33
33
  %input.button{type: 'button', tabindex: -1, value: 'Unlink', data: { trix_method: 'removeAttribute'}}
@@ -2,7 +2,7 @@
2
2
  / Structure parts
3
3
  = f.fields_for :structure_parts, build_structure_parts(f.object.structure.try(:page_part).try(:name), f.object) do |ff|
4
4
  .structure-form-part
5
- = render "spina/admin/structure_partables/#{partable_type_partial_namespace(ff.object.structure_partable_type)}/form", f: ff
5
+ = render "spina/admin/partables/#{partable_type_partial_namespace(ff.object.structure_partable_type)}/form", f: ff
6
6
 
7
7
  = ff.hidden_field :id
8
8
  = ff.hidden_field :title
@@ -0,0 +1,14 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ = f.fields_for :structure_partable, f.object.structure_partable do |ff|
5
+ = link_to spina.select_collection_admin_attachments_path(ff.object_name, selected_attachment_ids: ff.object.attachment_ids), remote: true, class: 'media_picker clearfix' do
6
+ .placeholder
7
+ %span.button.button-small.button-round
8
+ %i.icon.icon-dots
9
+ = t('spina.choose_from_library')
10
+
11
+ - if ff.object.attachments.any?
12
+ - ff.object.attachments.each do |attachment|
13
+ .attachment= attachment.name
14
+ = ff.hidden_field :attachment_tokens, value: ff.object.attachment_ids.join(",")
@@ -0,0 +1,13 @@
1
+ .horizontal-form-label
2
+ = f.object.title
3
+ .horizontal-form-content
4
+ = link_to spina.select_admin_attachments_path(f.object_name, selected_attachment_id: f.object.structure_partable.try(:id)), remote: true, class: "media_picker" do
5
+ .placeholder
6
+ %span.button.button-small.button-round
7
+ %i.icon.icon-dots
8
+ = t('spina.choose_from_library')
9
+
10
+ - if f.object.structure_partable && f.object.structure_partable.file.present?
11
+ .attachment= f.object.structure_partable.name
12
+
13
+ = f.hidden_field :structure_partable_id
@@ -1,11 +1,11 @@
1
1
  <script type="text/javascript">
2
- var _gaq = _gaq || [];
3
- _gaq.push(['_setAccount', '<%= current_account.google_analytics %>']);
4
- _gaq.push(['_trackPageview']);
2
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
3
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
4
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
5
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
5
6
 
6
- (function() {
7
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
8
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
9
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
10
- })();
7
+ ga('create', '<%= current_account.google_analytics %>', 'auto');
8
+ ga('set', 'anonymizeIp', true);
9
+ ga('send', 'pageview');
11
10
  </script>
11
+
@@ -1,3 +1,3 @@
1
- - pages = current_spina_user.present? ? Spina::Page.active : Spina::Page.live
2
- - menu = Spina::Pages::MenuPresenter.new(pages.in_menu.arrange(order: :position), self, @page)
3
- = menu.to_html
1
+ %ul
2
+ - Spina::Page.live.all.each do |page|
3
+ %li{class: ('active' if page == current_page)}= page.menu_title, page.materialized_path
@@ -0,0 +1,2 @@
1
+ - if current_spina_user
2
+ = link_to 'Admin', spina.admin_root_path, class: 'spina-link', data: { turbolinks: false }
@@ -7,8 +7,8 @@ xml.urlset "xmlns" => "http://www.google.com/schemas/sitemap/0.9", "xmlns:xhtml"
7
7
 
8
8
  # Translations
9
9
  page.translations.each do |translation|
10
- if translation.locale.in? Spina.config.locales
11
- Globalize.with_locale(translation.locale) do
10
+ if translation.locale.in? Spina.config.locales.map(&:to_s)
11
+ Mobility.with_locale(translation.locale) do
12
12
  xml.xhtml(:link, rel: "alternate", hreflang: translation.locale, href: "#{request.protocol}#{request.host}#{page.materialized_path}")
13
13
  end
14
14
  end
@@ -1 +1,6 @@
1
- Rails.application.config.assets.precompile += %w(spina/spina.png spina/admin/spina.png spina/spina_small.png)
1
+ Rails.application.config.assets.precompile += %w[
2
+ spina_front_end.css
3
+ spina/spina.png
4
+ spina/spina-large.png
5
+ spina/media_folder_placeholder.png
6
+ ]
@@ -0,0 +1,243 @@
1
+ th:
2
+ spina:
3
+ cancel: ยกเลิก
4
+ close: ปิด
5
+ choose_from_library: เลือกจากไลบารี
6
+ edit: แก้ไข
7
+ save: บันทึก
8
+ delete: ลบ
9
+ permanently_delete: ลบอย่างถาวร
10
+ delete_confirmation: "คุณแน่ใจหรือไม่ว่าต้องการลบ <strong>%{subject}</strong>?"
11
+ login: ลงชื่อเข้าใช้
12
+ preview_website: ตัวอย่างเว็บไซต์
13
+ search: ค้นหา
14
+ ago: อายุ
15
+ edit_website: แก้ไขเว็บไซต์
16
+ logout: ลงชื่อออก
17
+ main_menu: เมนูหลัก
18
+
19
+ settings:
20
+ title: การตั้งค่า
21
+ save: บันทึก
22
+
23
+ forgot_password:
24
+ new: ลืมรหัสผ่าน
25
+ request: ขอรหัสผ่านใหม่
26
+ unknown_user: ไม่มีผู้ใช้รายนี้
27
+ save: บันทึกรหัสผ่านใหม่
28
+ success: คุณสามารถใช้รหัสผ่านใหม่ได้
29
+ mail_subject: รีเซ็ตรหัสผ่านของคุณ
30
+ expired: โทเค็นของคุณเพื่อรีเซ็ตรหัสผ่านหมดอายุแล้ว
31
+
32
+ modal:
33
+ agree: "ตกลง"
34
+ cancel: "ยกเลิก"
35
+
36
+ notifications:
37
+ information: ข้อมูล
38
+ alert: อ้าว!เกิดข้อผิดพลาด
39
+ login: คุณต้องเข้าสู่ระบบก่อน
40
+ wrong_username_or_password: อีเมลหรือรหัสผ่านไม่ถูกต้อง
41
+
42
+ website:
43
+ title: ไซต์ของคุณ
44
+ pages: หน้าเพจ
45
+ all_pages: หน้าเพจทั้งหมด
46
+ pages_description: "ทุกหน้าในเว็บไซต์ของคุณ"
47
+ media_library: มีเดียไลบรารี
48
+ media_library_description: "คุณจะพบรูปภาพและเอกสารทั้งหมดของคุณ"
49
+ documents: เอกสาร
50
+ photos: รูปภาพ
51
+
52
+ pages:
53
+ new: หน้าใหม่
54
+ create_page: "สร้างหน้าใหม่ %{template}"
55
+ change_order: เปลี่ยนออเดอร์
56
+ done_changing_order: การสั่งซื้อเสร็จสิ้น
57
+ page_content: เนื้อหา
58
+ page_seo: เครื่องมือค้นหา
59
+ advanced: ขั้นสูง
60
+ page_part: ส่วนของหน้า
61
+ photos_picker: เลือกรูปภาพ
62
+ photo_picker: เลือกรูปภาพ
63
+ delete_confirmation: "คุณแน่ใจหรือไม่ว่าต้องการลบหน้านี้ <strong>%{subject}</strong>?"
64
+ save: บันทึกหน้า
65
+ concept: คอนเซ็ปท์
66
+ show_in_menu: มองไม่เห็น
67
+ skip_to_first_child: ข้ามไปที่หน้าแรก
68
+ invisible_to_search_engines: เว็บไซต์ของคุณไม่สามารถใช้งานได้กับเครื่องมือค้นหา
69
+ invisible_to_search_engines_description: ป้อนการตั้งค่าเพื่อเปิดใช้งานเครื่องมือค้นหา
70
+ rebuild_materialized_path: กำหนดเส้นทางที่สร้างขึ้นใหม่
71
+ materialize_path_confirmation: "คุณแน่ใจหรือว่าต้องการสร้างเส้นทางสำหรับหน้านี้ใหม่"
72
+ saving: กำลังบันทึก
73
+ saved: บันทึกเสร็จสิ้น
74
+
75
+ users:
76
+ new: ผู้ใช้ใหม่
77
+ save: บันทึกผู้ใช้
78
+ delete_confirmation: "คุณแน่ใจหรือไม่ว่าต้องการลบผู้ใช้นี้ <strong>%{user}</strong>?"
79
+ cannot_be_created: ไม่สามารถบันทึกการสร้างได้
80
+
81
+ photos:
82
+ delete_confirmation: "คุณแน่ใจหรือไม่ว่าต้องการลบ <strong> รูปภาพนี้ </strong>?"
83
+ insert_photos: แทรกหลายรูปภาพ
84
+ select_images: เลือกรูปภาพ
85
+ insert_photo: แทรกรูปภาพ
86
+ link: "URL รูปภาพของคุณ:"
87
+ cannot_be_created: "รูปภาพของคุณไม่สามารถประมวลผลได้:"
88
+ upload_image: อัปโหลดรูปภาพ
89
+ organize: จัดระเบียบรูปภาพ
90
+ done_organizing: เสร็จสิ้นการจัดรูปภาพ
91
+ new_folder: โฟลเดอร์ใหม่
92
+ delete_folder: ลบโฟลเดอร์
93
+
94
+ wysiwyg:
95
+ paragraph: ย่อหน้า
96
+ heading_1: ส่วนหัว 1
97
+ heading_2: ส่วนหัว 2
98
+ heading_3: ส่วนหัว 3
99
+ quote: อ้างอิง
100
+ insert_link: แทรกลิงค์
101
+
102
+ preferences:
103
+ title: การกำหนดลักษณะ
104
+ account: ทั่วไป
105
+ account_description: ความชอบส่วนบุคคล
106
+ account_save: บันทึกการตั้งค่า
107
+ style: สไตล์
108
+ style_description: เลือกธีมที่เหมาะกับแบรนด์ของคุณ
109
+ style_save: บันทึกสไตล์
110
+ users: ผู้ใช้
111
+ users_description: จัดการผู้ใช้และผู้ดูแลระบบ
112
+ social_media: เครือข่ายทางสังคม
113
+ social_media_description: บัญชี Facebook และ Twitter
114
+ social_media_save: บันทึกเครือข่ายสังคมออนไลน์
115
+ Analytics: วิเคราะห์และเครื่องมือค้นหา
116
+ analytics_description: เชื่อมโยงบัญชีของคุณเพื่อการวิเคราะห์แบบเรียลไทม์
117
+ analytics_save: บันทึกการตั้งค่า
118
+ domain_name_settings: การกำหนดค่าโดเมน
119
+ domain_name_settings_description: ตั้งค่าโดเมนของคุณเอง
120
+
121
+ attachments:
122
+ insert: 'แทรกเอกสาร'
123
+ insert_multiple: 'แทรกเอกสาร'
124
+
125
+ media_library:
126
+ photos: รูปภาพ
127
+ attachments: เอกสาร
128
+
129
+ activerecord:
130
+ models:
131
+ spina/page:
132
+ one: หน้าเพจ
133
+ other: หลายๆหน้าเพจ
134
+ spina/user:
135
+ one: ผู้ใช้
136
+ other: หลายๆผู้ใช้
137
+ spina/photo:
138
+ one: รูปภาพ
139
+ other: หลายๆรูปภาพ
140
+ spina/attachment:
141
+ one: เอกสาร
142
+ other: หลายๆเอกสาร
143
+
144
+ attributes:
145
+ spina/account:
146
+ name: ชื่อเว็บไซต์
147
+ address: ที่อยู่
148
+ postal_code: รหัสไปรษณีย์
149
+ city: เมือง
150
+ phone: โทรศัพท์
151
+ email: อีเมล
152
+ kvk_identifier: การค้า
153
+ kvk_identifier_description: คำอธิบายทางการค้า
154
+ vat_identifier: ภาษีมูลค่าเพิ่ม
155
+ vat_identifier_description: คำอธิบายภาษีมูลค่าเพิ่ม
156
+ theme: ธีม
157
+ logo: โลโก้
158
+ google_analytics: วิเคราะห์ทาง Google
159
+ google_site_verification: ตรวจสอบไซต์
160
+ robots_allowed: ยอมรับ
161
+ facebook: Facebook
162
+ twitter: Twitter
163
+ google_plus: Google+
164
+
165
+ spina/attachment:
166
+ created_at: สร้าง
167
+ name: ชื่อ
168
+ size: ขนาด
169
+
170
+ spina/page:
171
+ title: ชื่อเรื่อง
172
+ title_placeholder: ชื่อเรื่องของหน้า
173
+ seo_title: SEO <title>
174
+ seo_title_placeholder: ชื่อนี้ใช้ใน <title> -tag
175
+ description: คำอธิบาย meta
176
+ description_description: คำอธิบายนี้จะปรากฏในผลลัพธ์การค้นหา
177
+ description_placeholder: คำอธิบายโดยย่อของหน้าเว็บของคุณ
178
+ draft: การร่าง
179
+ draft_description: เหมาะสำหรับหน้าเว็บของคุณที่ยังไม่เสร็จสมบูรณ์
180
+ skip_to_first_child: ส่งใหม่
181
+ skip_to_first_child_description: ส่งต่อไปยังหน้าแรก
182
+ link_url: เปลี่ยนหน้า
183
+ link_url_description: ส่งต่อไปยัง URL
184
+ link_url_placeholder: เช่น http://www.example.com/
185
+ show_in_menu: แสดงการนำทาง
186
+ show_in_menu_description: "ถ้าหน้านี้ถูกปิดใช้งานจะไม่ปรากฏการนำทางของคุณ"
187
+ menu_title: ชื่อการนำทาง
188
+ menu_title_placeholder: เว้นว่างไว้เพื่อใช้ชื่อหน้า
189
+ view_template: เทมเพลตของเพจ
190
+ ancestry: หน้าแรก
191
+ no_parent: ไม่มีเพจระดับบน
192
+
193
+ spina/user:
194
+ email: อีเมล
195
+ password: รหัสผ่าน
196
+ name: ชื่อ
197
+ name_placeholder: ชื่อ
198
+ อีเมล: อีเมล
199
+ email_description: อีเมลของคุณต้องไม่ซ้ำใคร
200
+ password: รหัสผ่าน
201
+ password_description: เว้นว่างไว้เพื่อเก็บรหัสผ่าน
202
+ password_confirmation: ยืนยันรหัสผ่าน
203
+ admin: ผู้ดูแลระบบ
204
+ user: ผู้ใช้
205
+ admin_description: ผู้ดูแลระบบสามารถสร้างผู้ใช้
206
+ role: บทบาท
207
+ last_logged_in: เข้าสู่ระบบครั้งล่าสุด
208
+
209
+ spina/media_folder:
210
+ name: ชื่อ
211
+
212
+ spina/navigation:
213
+ label: เครื่องหมายป้ายกำกับ
214
+ auto_add_pages: เพิ่มหน้าเพจโดยอัตโนมัติ
215
+ auto_add_pages_description: เพจใหม่จะถูกเพิ่มลงในการนำทางนี้โดยอัตโนมัติ
216
+ pages: หน้าเพจ
217
+ pages_description: เลือกหน้าเพจที่คุณต้องการใช้ในการนำทางนี้
218
+
219
+ spina/user:
220
+ email: อีเมล
221
+ password: รหัสผ่าน
222
+ name: ชื่อ
223
+ name_placeholder: ชื่อ
224
+ email: อีเมล
225
+ email_description: อีเมลของคุณต้องไม่ซ้ำ
226
+ password: รหัสผ่าน
227
+ password_description: ปล่อยว่างเพื่อเก็บรหัสผ่านของคุณ
228
+ password_confirmation: ยืนยันรหัสผ่าน
229
+ admin: ผู้ดูแลระบบ
230
+ user: ผู้ใช้
231
+ admin_description: ผู้ดูแลระบบสามารถสร้างผู้ใช้ได้
232
+ role: บทบาท
233
+ last_logged_in: ป้อนครั้งสุดท้าย
234
+
235
+ misc:
236
+ messages:
237
+ zero: "0 ข้อความ"
238
+ one: "1 ข้อความ"
239
+ other: "%{count} ข้อความใหม่"
240
+
241
+ languages:
242
+ en: ภาษาอังกฤษ
243
+ nl: ไทย