decidim-core 0.0.1.alpha9 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +0 -25
- data/app/assets/config/decidim_core_manifest.js +1 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_400.eot +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_400.svg +345 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_400.ttf +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_400.woff +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_400.woff2 +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_600.eot +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_600.svg +339 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_600.ttf +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_600.woff +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_600.woff2 +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_900.eot +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_900.svg +342 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_900.ttf +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_900.woff +0 -0
- data/app/assets/fonts/decidim/Source_Sans_Pro_900.woff2 +0 -0
- data/app/assets/images/decidim/default-avatar.svg +14 -0
- data/app/assets/javascripts/decidim.js.es6 +5 -5
- data/app/assets/javascripts/decidim/editor.js.es6 +46 -0
- data/app/assets/stylesheets/decidim/_variables.scss +12 -13
- data/app/assets/stylesheets/decidim/application.sass +4 -1
- data/app/assets/stylesheets/decidim/editor.sass +4 -0
- data/app/assets/stylesheets/decidim/modules/_card-grid.scss +4 -1
- data/app/assets/stylesheets/decidim/modules/_cards.scss +5 -0
- data/app/assets/stylesheets/decidim/modules/_navbar.scss +1 -0
- data/app/assets/stylesheets/decidim/modules/_process-header.scss +24 -75
- data/app/assets/stylesheets/decidim/modules/_process-nav.scss +0 -1
- data/app/assets/stylesheets/decidim/modules/_process-phase.scss +80 -0
- data/app/assets/stylesheets/decidim/utils/_fontface.scss +39 -1
- data/app/assets/stylesheets/decidim/utils/_helpers.scss +25 -0
- data/app/assets/stylesheets/decidim/utils/_keyframes.scss +21 -0
- data/app/assets/stylesheets/decidim/utils/_mixins.scss +37 -0
- data/app/assets/stylesheets/decidim/utils/_settings.scss +11 -5
- data/app/commands/decidim/authorize_user.rb +2 -2
- data/app/constraints/decidim/current_feature.rb +48 -0
- data/app/controllers/concerns/decidim/form_factory.rb +80 -0
- data/app/controllers/concerns/decidim/locale_switcher.rb +17 -10
- data/app/controllers/concerns/decidim/needs_participatory_process.rb +33 -0
- data/app/controllers/decidim/application_controller.rb +1 -1
- data/app/controllers/decidim/devise/confirmations_controller.rb +1 -1
- data/app/controllers/decidim/devise/passwords_controller.rb +1 -1
- data/app/controllers/decidim/devise/registrations_controller.rb +1 -1
- data/app/controllers/decidim/devise/sessions_controller.rb +16 -2
- data/app/controllers/decidim/pages_controller.rb +14 -0
- data/app/controllers/decidim/participatory_processes_controller.rb +7 -0
- data/app/forms/decidim/form.rb +15 -0
- data/app/forms/translatable_presence_validator.rb +31 -0
- data/app/helpers/decidim/application_helper.rb +17 -2
- data/app/helpers/decidim/layout_helper.rb +8 -1
- data/app/helpers/decidim/localized_locales_helper.rb +43 -0
- data/app/helpers/decidim/participatory_process_helper.rb +16 -0
- data/app/helpers/decidim/translations_helper.rb +17 -0
- data/app/models/decidim/category.rb +35 -0
- data/app/models/decidim/component.rb +51 -0
- data/app/models/decidim/feature.rb +30 -0
- data/app/models/decidim/organization.rb +20 -1
- data/app/models/decidim/participatory_process.rb +43 -4
- data/app/models/decidim/participatory_process_attachment.rb +56 -0
- data/app/models/decidim/scope.rb +14 -0
- data/app/models/decidim/static_page.rb +56 -0
- data/app/models/decidim/user.rb +2 -0
- data/app/queries/decidim/organization_participatory_processes.rb +17 -0
- data/app/services/decidim/authorization_handler.rb +2 -2
- data/app/types/decidim/process_step_type.rb +24 -0
- data/app/types/decidim/process_type.rb +16 -0
- data/app/types/decidim/user_type.rb +14 -0
- data/app/uploaders/decidim/attachment_uploader.rb +70 -0
- data/app/uploaders/decidim/avatar_uploader.rb +14 -0
- data/app/uploaders/decidim/banner_image_uploader.rb +1 -1
- data/app/uploaders/decidim/hero_image_uploader.rb +1 -1
- data/app/uploaders/decidim/homepage_image_uploader.rb +11 -0
- data/app/uploaders/decidim/image_uploader.rb +46 -0
- data/app/uploaders/decidim/organization_logo_uploader.rb +9 -0
- data/app/views/decidim/devise/registrations/new.html.erb +1 -1
- data/app/views/decidim/participatory_processes/_documents.html.erb +26 -0
- data/app/views/decidim/participatory_processes/_photos.html.erb +16 -0
- data/app/views/decidim/participatory_processes/_promoted_process.html.erb +1 -1
- data/app/views/decidim/participatory_processes/show.html.erb +16 -11
- data/app/views/kaminari/decidim/_first_page.html.erb +11 -0
- data/app/views/kaminari/decidim/_gap.html.erb +8 -0
- data/app/views/kaminari/decidim/_last_page.html.erb +11 -0
- data/app/views/kaminari/decidim/_next_page.html.erb +11 -0
- data/app/views/kaminari/decidim/_page.html.erb +12 -0
- data/app/views/kaminari/decidim/_paginator.html.erb +25 -0
- data/app/views/kaminari/decidim/_prev_page.html.erb +11 -0
- data/app/views/layouts/decidim/_application.html.erb +17 -0
- data/app/views/layouts/decidim/_footer.html.erb +5 -3
- data/app/views/layouts/decidim/_header.html.erb +8 -21
- data/app/views/layouts/decidim/_language_chooser.html.erb +14 -0
- data/app/views/layouts/decidim/_logo.html.erb +17 -13
- data/app/views/layouts/decidim/_process_header.html.erb +34 -0
- data/app/views/layouts/decidim/_process_header_steps.html.erb +26 -0
- data/app/views/layouts/decidim/_user_menu.html.erb +2 -0
- data/app/views/layouts/decidim/application.html.erb +3 -0
- data/app/views/layouts/decidim/participatory_process.html.erb +15 -0
- data/app/views/pages/decidim_page.html.erb +12 -0
- data/app/views/pages/home.html.erb +106 -2
- data/config/i18n-tasks.yml +3 -1
- data/config/locales/ca.yml +40 -10
- data/config/locales/en.yml +39 -4
- data/config/locales/es.yml +44 -14
- data/config/routes.rb +14 -1
- data/db/migrate/20160919104837_create_decidim_organizations.rb +4 -0
- data/db/migrate/20161005153007_add_description_to_organizations.rb +1 -3
- data/db/migrate/20161010102356_translate_processes.rb +4 -4
- data/db/migrate/20161017085822_add_participatory_process_steps.rb +3 -3
- data/db/migrate/20161107152228_remove_not_null_on_step_position.rb +5 -0
- data/db/migrate/20161108093802_create_decidim_static_pages.rb +11 -0
- data/db/migrate/20161110092735_add_index_for_process_slug_organization.rb +8 -0
- data/db/migrate/20161110105712_create_decidim_features.rb +9 -0
- data/db/migrate/20161116115156_create_attachments.rb +18 -0
- data/db/migrate/20161123085134_add_categories.rb +10 -0
- data/db/migrate/20161130105257_create_decidim_scopes.rb +9 -0
- data/db/migrate/20161209134715_make_organization_description_optional.rb +5 -0
- data/db/migrate/20161213094244_add_avatar_to_users.rb +5 -0
- data/db/migrate/20161214152811_add_logo_to_organizations.rb +5 -0
- data/db/seeds.rb +36 -6
- data/db/seeds/Exampledocument.pdf +0 -0
- data/{app/assets/images/decidim/hero-home.jpg → db/seeds/homepage_image.jpg} +0 -0
- data/lib/decidim/core.rb +55 -2
- data/lib/decidim/core/engine.rb +16 -2
- data/lib/decidim/core/version.rb +11 -2
- data/lib/decidim/feature_manifest.rb +71 -0
- data/lib/decidim/features.rb +8 -0
- data/lib/decidim/features/base_controller.rb +32 -0
- data/lib/decidim/features/namer.rb +35 -0
- data/lib/decidim/form_builder.rb +140 -6
- data/lib/decidim/page_finder.rb +48 -0
- data/lib/decidim/query_extensions.rb +33 -0
- data/lib/decidim/translatable_attributes.rb +1 -24
- data/vendor/assets/javascripts/quill.min.js +14 -0
- data/vendor/assets/javascripts/quill.min.js.map +1 -0
- data/vendor/assets/stylesheets/quill.bubble.css +843 -0
- data/vendor/assets/stylesheets/quill.core.css +362 -0
- data/vendor/assets/stylesheets/quill.snow.css +881 -0
- metadata +164 -32
- data/LICENSE.txt +0 -619
- data/app/views/decidim/participatory_processes/_process_header_home.html.erb +0 -18
- data/app/views/pages/terms.ca.html.erb +0 -4
- data/app/views/pages/terms.en.html.erb +0 -4
- data/app/views/pages/terms.es.html.erb +0 -4
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
# This type represents a User.
|
4
|
+
UserType = GraphQL::ObjectType.define do
|
5
|
+
name "User"
|
6
|
+
description "A user"
|
7
|
+
|
8
|
+
field :name, types.String, "The user's name"
|
9
|
+
|
10
|
+
field :avatarUrl, !types.String, "The user's avatar url" do
|
11
|
+
resolve ->(obj, _args, _ctx) { obj.avatar.url }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
# This class deals with uploading attachments to a ParticipatoryProcess.
|
5
|
+
class AttachmentUploader < ApplicationUploader
|
6
|
+
include CarrierWave::MiniMagick
|
7
|
+
|
8
|
+
process :set_content_type_and_size_in_model
|
9
|
+
process :validate_dimensions
|
10
|
+
version :thumbnail, if: :image? do
|
11
|
+
process resize_to_fit: [nil, 237]
|
12
|
+
end
|
13
|
+
version :big, if: :image? do
|
14
|
+
process resize_to_limit: [nil, 1000]
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
# CarrierWave automatically calls this method and validates the content
|
20
|
+
# type fo the temp file to match against any of these options.
|
21
|
+
def content_type_whitelist
|
22
|
+
[
|
23
|
+
%r{image\/},
|
24
|
+
%r{application\/vnd.oasis.opendocument},
|
25
|
+
%r{application\/vnd.ms-},
|
26
|
+
%r{application\/msword},
|
27
|
+
%r{application\/vnd.ms-word},
|
28
|
+
%r{application\/vnd.openxmlformats-officedocument},
|
29
|
+
%r{application\/vnd.oasis.opendocument},
|
30
|
+
%r{application\/pdf},
|
31
|
+
%r{application\/rtf}
|
32
|
+
]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Checks if the file is an image based on the content type. We need this so
|
36
|
+
# we only create different versions of the file when it's an image.
|
37
|
+
#
|
38
|
+
# new_file - The uploaded file.
|
39
|
+
#
|
40
|
+
# Returns a Boolean.
|
41
|
+
def image?(new_file)
|
42
|
+
new_file.content_type.start_with? "image"
|
43
|
+
end
|
44
|
+
|
45
|
+
# Copies the content type and file size to the model where this is mounted.
|
46
|
+
#
|
47
|
+
# Returns nothing.
|
48
|
+
def set_content_type_and_size_in_model
|
49
|
+
model.content_type = file.content_type if file.content_type
|
50
|
+
model.file_size = file.size
|
51
|
+
end
|
52
|
+
|
53
|
+
# A simple check to avoid DoS with maliciously crafted images, or just to
|
54
|
+
# avoid reckless users that upload gigapixels images.
|
55
|
+
#
|
56
|
+
# See https://hackerone.com/reports/390
|
57
|
+
def validate_dimensions
|
58
|
+
return unless image?(self)
|
59
|
+
|
60
|
+
manipulate! do |image|
|
61
|
+
raise CarrierWave::IntegrityError, I18n.t("carrierwave.errors.image_too_big") if image.dimensions.any? { |dimension| dimension > max_image_height_or_width }
|
62
|
+
image
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def max_image_height_or_width
|
67
|
+
8000
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
# This class deals with uploading avatars to a User.
|
5
|
+
class AvatarUploader < ImageUploader
|
6
|
+
include CarrierWave::MiniMagick
|
7
|
+
|
8
|
+
process :validate_dimensions
|
9
|
+
|
10
|
+
def default_url(*)
|
11
|
+
ActionController::Base.helpers.asset_path("decidim/default-avatar.svg")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
# This class deals with uploading hero images to ParticipatoryProcesses.
|
4
|
+
class HomepageImageUploader < ImageUploader
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
version :big do
|
8
|
+
process resize_to_limit: [nil, 2000]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Decidim
|
3
|
+
# This class deals with uploading hero images to ParticipatoryProcesses.
|
4
|
+
class ImageUploader < ApplicationUploader
|
5
|
+
include CarrierWave::MiniMagick
|
6
|
+
|
7
|
+
process :validate_size, :validate_dimensions
|
8
|
+
|
9
|
+
# CarrierWave automatically calls this method and validates the content
|
10
|
+
# type fo the temp file to match against any of these options.
|
11
|
+
def content_type_whitelist
|
12
|
+
[
|
13
|
+
%r{image\/}
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
# A simple check to avoid DoS with maliciously crafted images, or just to
|
18
|
+
# avoid reckless users that upload gigapixels images.
|
19
|
+
#
|
20
|
+
# See https://hackerone.com/reports/390
|
21
|
+
def validate_dimensions
|
22
|
+
manipulate! do |image|
|
23
|
+
validation_error!(I18n.t("carrierwave.errors.image_too_big")) if image.dimensions.any? { |dimension| dimension > max_image_height_or_width }
|
24
|
+
image
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate_size
|
29
|
+
manipulate! do |image|
|
30
|
+
validation_error!(I18n.t("carrierwave.errors.image_too_big")) if image.size > 10.megabytes
|
31
|
+
image
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def max_image_height_or_width
|
36
|
+
8000
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def validation_error!(text)
|
42
|
+
model.errors.add(mounted_as, text)
|
43
|
+
raise CarrierWave::IntegrityError, text
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
<fieldset>
|
40
40
|
<div class="field">
|
41
|
-
<%= f.check_box :tos_agreement, label: t(".tos_agreement", link: link_to(t(".terms"), page_path(
|
41
|
+
<%= f.check_box :tos_agreement, label: t(".tos_agreement", link: link_to(t(".terms"), page_path("terms-and-conditions"))) %>
|
42
42
|
</div>
|
43
43
|
</fieldset>
|
44
44
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<% if documents.any? %>
|
2
|
+
<div class="section documents">
|
3
|
+
<h4 class="section-heading"><%= t(".related_documents") %></h4>
|
4
|
+
<div class="card card--list">
|
5
|
+
<% documents.each do |document| %>
|
6
|
+
<div class="card--list__item">
|
7
|
+
<div class="card--list__text">
|
8
|
+
<div>
|
9
|
+
<a href="<%= document.url %>" class="card__link">
|
10
|
+
<h6 class="card--list__heading heading6">
|
11
|
+
<%= translated_attribute(document.title) %> <small><%= document.file_type %> <%= number_to_human_size(document.file_size) %></small>
|
12
|
+
</h6>
|
13
|
+
<span class="text-small"><%= translated_attribute(document.description) %></span>
|
14
|
+
</a>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="card--list__data">
|
18
|
+
<%= link_to document.url, class: "card--list__data__icon" do %>
|
19
|
+
<%= icon "cloud-download" %>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if photos.any? %>
|
2
|
+
<div class="section images">
|
3
|
+
<h4 class="section-heading"><%= t(".related_photos") %></h4>
|
4
|
+
<div class="gallery row">
|
5
|
+
<% photos.in_groups_of(3, false).each do |group| %>
|
6
|
+
<% group.each_with_index do |photo, index| %>
|
7
|
+
<div class="columns small-6 medium-4 <%= (index == 2 || photo == group.last ? "end" : "") %>">
|
8
|
+
<%= link_to photo.big_url do %>
|
9
|
+
<%= image_tag photo.thumbnail_url, class:"thumbnail", alt: strip_tags(translated_attribute(photo.description)) %>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<%= link_to participatory_process_path(promoted_process), class: "card__link" do %>
|
6
6
|
<h2 class="card__title"><%= translated_attribute promoted_process.title %></h2>
|
7
7
|
<% end %>
|
8
|
-
|
8
|
+
<%== html_truncate(translated_attribute(promoted_process.description), length: 630, separator: ' ') %>
|
9
9
|
<%= link_to participatory_process_path(promoted_process), class: "button secondary small hollow card__button" do %>
|
10
10
|
<%= t(".more_info", scope: "layouts") %>
|
11
11
|
<% end %>
|
@@ -1,15 +1,20 @@
|
|
1
|
-
<
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<div class="lead">
|
8
|
-
<%== translated_attribute(participatory_process.short_description) %>
|
9
|
-
</div>
|
10
|
-
<%== translated_attribute(participatory_process.description) %>
|
1
|
+
<div class="row column">
|
2
|
+
<div class="row">
|
3
|
+
<div class="columns medium-7 mediumlarge-8">
|
4
|
+
<div class="section">
|
5
|
+
<div class="lead">
|
6
|
+
<%== translated_attribute(participatory_process.short_description) %>
|
11
7
|
</div>
|
8
|
+
<%== translated_attribute(participatory_process.description) %>
|
12
9
|
</div>
|
13
10
|
</div>
|
14
11
|
</div>
|
15
|
-
</
|
12
|
+
</div>
|
13
|
+
<% if participatory_process.attachments.any? %>
|
14
|
+
<div class="row attachments">
|
15
|
+
<div class="columns large-8">
|
16
|
+
<%= render partial: "documents", locals: { documents: participatory_process.documents } %>
|
17
|
+
<%= render partial: "photos", locals: { photos: participatory_process.photos } %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "First" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the first page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
total_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<li class="first">
|
10
|
+
<%= link_to_unless current_page.first?, t('views.pagination.first').html_safe, url, remote: remote %>
|
11
|
+
</li>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%# Non-link tag that stands for skipped pages...
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
total_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
-%>
|
8
|
+
<li class="page gap"><%= t('views.pagination.truncate').html_safe %></li>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Last" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the last page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
total_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<li class="last">
|
10
|
+
<%= link_to_unless current_page.last?, t('views.pagination.last').html_safe, url, remote: remote %>
|
11
|
+
</li>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Next" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the next page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
total_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<li class="pagination-next">
|
10
|
+
<%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, rel: 'next', remote: remote %>
|
11
|
+
</li>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%# Link showing page number
|
2
|
+
- available local variables
|
3
|
+
page: a page object for "this" page
|
4
|
+
url: url to this page
|
5
|
+
current_page: a page object for the currently displayed page
|
6
|
+
total_pages: total number of pages
|
7
|
+
per_page: number of items to fetch per page
|
8
|
+
remote: data-remote
|
9
|
+
-%>
|
10
|
+
<li class="page<%= ' current' if page.current? %>">
|
11
|
+
<%= link_to_unless page.current?, page, url, {remote: remote, rel: page.rel} %>
|
12
|
+
</li>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<%# The container tag
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
total_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
paginator: the paginator that renders the pagination tags inside
|
8
|
+
-%>
|
9
|
+
<%= paginator.render do -%>
|
10
|
+
<ul class="pagination text-center" role="navigation" aria-label="Pagination">
|
11
|
+
<%= first_page_tag unless current_page.first? %>
|
12
|
+
<%= prev_page_tag unless current_page.first? %>
|
13
|
+
<% each_page do |page| -%>
|
14
|
+
<% if page.display_tag? -%>
|
15
|
+
<%= page_tag page %>
|
16
|
+
<% elsif !page.was_truncated? -%>
|
17
|
+
<%= gap_tag %>
|
18
|
+
<% end -%>
|
19
|
+
<% end -%>
|
20
|
+
<% unless current_page.out_of_range? %>
|
21
|
+
<%= next_page_tag unless current_page.last? %>
|
22
|
+
<%= last_page_tag unless current_page.last? %>
|
23
|
+
<% end %>
|
24
|
+
</ul>
|
25
|
+
<% end -%>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Previous" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the previous page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
total_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<li class="pagination-previous">
|
10
|
+
<%= link_to_unless current_page.first?, t('views.pagination.previous').html_safe, url, rel: 'prev', remote: remote %>
|
11
|
+
</li>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= decidim_page_title %></title>
|
5
|
+
<%= csrf_meta_tags %>
|
6
|
+
|
7
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
|
8
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
|
9
|
+
<%= render partial: 'layouts/decidim/meta' %>
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<%= render partial: 'layouts/decidim/header' %>
|
14
|
+
<%= yield %>
|
15
|
+
<%= render partial: 'layouts/decidim/footer' %>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -3,11 +3,13 @@
|
|
3
3
|
<div class="main-footer">
|
4
4
|
<div class="row">
|
5
5
|
<div class="medium-8 large-6 large-offset-3 column main__footer__nav">
|
6
|
+
<% if current_organization.static_pages.any? %>
|
6
7
|
<ul class="footer-nav">
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
<% current_organization.static_pages.each do |page| %>
|
9
|
+
<li><%= link_to translated_attribute(page.title), decidim.page_path(page) %></a></li>
|
10
|
+
<% end %>
|
10
11
|
</ul>
|
12
|
+
<% end %>
|
11
13
|
</div>
|
12
14
|
</div>
|
13
15
|
</div>
|
@@ -23,20 +23,7 @@
|
|
23
23
|
<div class="logo-wrapper">
|
24
24
|
<%= render partial: "layouts/decidim/logo" %>
|
25
25
|
</div>
|
26
|
-
|
27
|
-
<ul class="dropdown menu" data-dropdown-menu>
|
28
|
-
<li class="is-dropdown-submenu-parent">
|
29
|
-
<%= link_to t(current_locale, scope: "locales") %>
|
30
|
-
<% if available_locales.length > 1 %>
|
31
|
-
<ul class="menu is-dropdown-submenu">
|
32
|
-
<% available_locales.each do |locale| %>
|
33
|
-
<li><%= link_to t(locale, scope: "locales"), locale_path(locale: locale), method: :post%></li>
|
34
|
-
<% end %>
|
35
|
-
<% end %>
|
36
|
-
</ul>
|
37
|
-
</li>
|
38
|
-
</ul>
|
39
|
-
</div>
|
26
|
+
<%= render partial: "layouts/decidim/language_chooser" %>
|
40
27
|
<div class="hide-for-medium topbar__menu">
|
41
28
|
<button type="button" data-toggle="offCanvas">
|
42
29
|
<%= icon "menu", aria_label: t('.navigation'), role: "img" %>
|
@@ -46,14 +33,14 @@
|
|
46
33
|
<div class="topbar__dropmenu topbar__user__logged">
|
47
34
|
<ul class="dropdown menu" data-dropdown-menu>
|
48
35
|
<li class="is-dropdown-submenu-parent show-for-medium">
|
49
|
-
<%= link_to current_user.name, account_path %>
|
36
|
+
<%= link_to current_user.name, decidim.account_path %>
|
50
37
|
<ul class="menu is-dropdown-subeenu js-append usermenu-off-canvas">
|
51
|
-
|
38
|
+
<%= render partial: "layouts/decidim/user_menu" %>
|
52
39
|
</ul>
|
53
40
|
<span data-set="nav-login-holder" class="show-for-medium">
|
54
41
|
<!-- Repeated due to dropdown limitations -->
|
55
42
|
<ul class="menu is-dropdown-submenu js-append usermenu-off-canvas">
|
56
|
-
|
43
|
+
<%= render partial: "layouts/decidim/user_menu" %>
|
57
44
|
</ul>
|
58
45
|
</span>
|
59
46
|
</li>
|
@@ -62,8 +49,8 @@
|
|
62
49
|
<% else %>
|
63
50
|
<div class="topbar__user show-for-medium" data-set="nav-login-holder">
|
64
51
|
<div class="topbar__user__login js-append">
|
65
|
-
<%= link_to t('.sign_up'), new_user_registration_path, class: "sign-up-link" %>
|
66
|
-
<%= link_to t('.sign_in'), new_user_session_path, class: "sign-in-link" %>
|
52
|
+
<%= link_to t('.sign_up'), decidim.new_user_registration_path, class: "sign-up-link" %>
|
53
|
+
<%= link_to t('.sign_in'), decidim.new_user_session_path, class: "sign-in-link" %>
|
67
54
|
</div>
|
68
55
|
</div>
|
69
56
|
<% end %>
|
@@ -74,10 +61,10 @@
|
|
74
61
|
<div class="row">
|
75
62
|
<ul class="main-nav">
|
76
63
|
<li>
|
77
|
-
<%= active_link_to t("menu.home", scope: "decidim"), root_path, active: :exact, class: "main-nav__link", class_active: "main-nav__link
|
64
|
+
<%= active_link_to t("menu.home", scope: "decidim"), decidim.root_path, active: :exact, class: "main-nav__link", class_active: "main-nav__link--active" %>
|
78
65
|
</li>
|
79
66
|
<li>
|
80
|
-
<%= active_link_to t("menu.processes", scope: "decidim"), participatory_processes_path, active: :inclusive, class: "main-nav__link", class_active: "main-nav__link--active" %>
|
67
|
+
<%= active_link_to t("menu.processes", scope: "decidim"), decidim.participatory_processes_path, active: :inclusive, class: "main-nav__link", class_active: "main-nav__link--active" %>
|
81
68
|
</li>
|
82
69
|
</ul>
|
83
70
|
</div>
|