decidim-external_newsletter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +124 -0
  4. data/Rakefile +81 -0
  5. data/app/controllers/decidim/external_newsletter/admin/application_controller.rb +15 -0
  6. data/app/controllers/decidim/external_newsletter/application_controller.rb +13 -0
  7. data/app/helpers/decidim/external_newsletter/application_helper.rb +11 -0
  8. data/app/models/decidim/external_newsletter/application_record.rb +10 -0
  9. data/app/packs/entrypoints/decidim-exernal_newsletter.js +2 -0
  10. data/app/packs/images/decidim/external_newsletter/icon.svg +1 -0
  11. data/app/packs/src/external_newsletter/remove_newsletter_modal.js.es6 +1 -0
  12. data/app/packs/stylesheets/decidim/external_newsletter/components/_inline-form-footer.scss +3 -0
  13. data/app/packs/stylesheets/decidim/external_newsletter/external_newsletter.scss +4 -0
  14. data/app/views/decidim/devise/invitations/edit.html.erb +67 -0
  15. data/app/views/decidim/devise/registrations/new.html.erb +96 -0
  16. data/app/views/decidim/notifications_settings/show.html.erb +76 -0
  17. data/app/views/decidim/notifications_settings/show.html.erb.026 +53 -0
  18. data/app/views/layouts/decidim/_external_newsletter.html.erb +56 -0
  19. data/app/views/layouts/decidim/_main_footer.html.erb +32 -0
  20. data/config/i18n-tasks.yml +10 -0
  21. data/config/locales/en.yml +8 -0
  22. data/config/locales/fr.yml +8 -0
  23. data/lib/decidim/external_newsletter/admin.rb +10 -0
  24. data/lib/decidim/external_newsletter/admin_engine.rb +29 -0
  25. data/lib/decidim/external_newsletter/engine.rb +23 -0
  26. data/lib/decidim/external_newsletter/test/factories.rb +9 -0
  27. data/lib/decidim/external_newsletter/version.rb +14 -0
  28. data/lib/decidim/external_newsletter.rb +12 -0
  29. metadata +91 -0
data/README.md ADDED
@@ -0,0 +1,124 @@
1
+ <h1 align="center"><img src="https://github.com/octree-gva/meta/blob/main/decidim/static/header.png?raw=true" alt="Decidim - Octree Participatory democracy on a robust and open source solution" /></h1>
2
+ <h4 align="center">
3
+ <a href="https://www.octree.ch">Octree</a> |
4
+ <a href="https://octree.ch/en/contact-us/">Contact Us</a> |
5
+ <a href="https://blog.octree.ch">Our Blog (FR)</a><br/><br/>
6
+ <a href="https://decidim.org">Decidim</a> |
7
+ <a href="https://docs.decidim.org/en/">Decidim Docs</a> |
8
+ <a href="https://meta.decidim.org">Participatory Governance (meta decidim)</a><br/><br/>
9
+ <a href="https://matrix.to/#/+decidim:matrix.org">Decidim Community (Matrix+Element.io)</a>
10
+ </h4>
11
+ <p align="center">
12
+ <a href="https://participer.lausanne.ch">
13
+ <img
14
+ src="https://github.com/octree-gva/meta/blob/main/decidim/static/participer_lausanne/chip.png?raw=true"
15
+ alt="Lausanne Participe — Une plateforme de participation pour imaginer et réaliser ensemble" />
16
+ </a>
17
+ <a href="https://opencollective.com/voca">
18
+ <img
19
+ src="https://github.com/octree-gva/meta/blob/main/decidim/static/opencollective_chip.png?raw=true"
20
+ alt="Voca – Open-Source SaaS platform for Decidim" />
21
+ </a>
22
+ </p>
23
+
24
+
25
+ # Decidim: Use External Newsletter
26
+
27
+ This module removes newsletters from Decidim, to use external newsletters, sponsored by the [Lausanne Participe](https://participer.lausanne.ch) platform.
28
+
29
+ ## Why it's needed?
30
+ Participation is wide, and can use many digital tools. To have a broader newsletter, that includes the whole participation space of the city we need:
31
+
32
+ - Subscribers to the newsletters don't need an account to subscribe, just an email
33
+ - The newsletter sending need to be managed by a restricted group of persons.
34
+ - The form to register to the newsletter needs to be included in every digital spaces involving participation.
35
+
36
+ ## Usage
37
+
38
+ This gem removes functionnalities, and add very little to the instance.
39
+ The database is not afftected, but we give some Rake Tasks to comply to RGPD and clean previously installed Decidim.
40
+
41
+ ## Installation
42
+
43
+ Add this line to your application's Gemfile:
44
+
45
+ ```ruby
46
+ gem "decidim-external_newsletter"
47
+ ```
48
+
49
+ And then execute:
50
+
51
+ ```bash
52
+ bundle
53
+ ```
54
+
55
+ ## Testing
56
+ ```
57
+ bundle exec rake test_app
58
+ ```
59
+
60
+ ## Local development
61
+ First, you need to run an empty database with a decidim dev container which runs nothing.
62
+ ```
63
+ docker-compose down -v --remove-orphans
64
+ docker-compose up -d
65
+ ```
66
+ Once created, you access the decidim container
67
+ ```
68
+ # Get the id of the decidim dev container
69
+ docker ps --format {{.ID}} --filter=label=org.label-schema.name=dec
70
+ idim
71
+ # f16bd5314386
72
+ docker exec -it f16bd5314386 bash
73
+ ```
74
+ You are now in bash, run manually `docker-entrypoint`.
75
+ ```
76
+ # Will check your environment and do migrations if needed
77
+ docker-entrypoint
78
+ ```
79
+ You are now ready to use your container in the way you want for development:
80
+
81
+ * Run a rails server: `bundle exec rails s -b 0.0.0.0`
82
+ * Have live-reload on your assets: `bin/webpack-dev-server`
83
+ * Execute tasks, like `bundle exec rails g migration AddSomeColumn`
84
+ * etc.
85
+ ```
86
+ bundle exec rails s -b 0.0.0.0 # rails server
87
+ bin/webpack-dev-server
88
+ etc.
89
+ ```
90
+
91
+ To stop everything, uses:
92
+ - `docker-compose down` to stop the containers
93
+ - `docker-compose down -v` to stop the containers and remove all previously saved data.
94
+
95
+ ### Debugging
96
+ To debug something on the container:
97
+ 1. Ensure `decidim-app` is running
98
+ ```bash
99
+ docker ps --all
100
+ # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
101
+ # 511c5048485c decidim-module-external_newsletter-decidim-app "sleep infinity" 28 minutes ago Up 28 minutes 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:3035->3035/tcp, :::3035->3035/tcp decidim-external_newsletter-app
102
+ # a08934c17b68 postgres:14-alpine "docker-entrypoint.s…" 28 minutes ago Up 28 minutes (healthy) 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp decidim-module-external_newsletter-pg-1
103
+
104
+ ```
105
+
106
+ 2. Run `docker exec -it decidim-app bash`
107
+ 3. Run
108
+ - `tail -f $ROOT/log/development.log` to **access logs**
109
+ - `bundle exec rails restart` to **restart rails server AND keeps webpacker running**
110
+ - `cd $ROOT` to access the `development_app`
111
+ - `cd $ROOT/../decidim_module_external_newsletter` to access the module directory
112
+
113
+ ## Contributing
114
+
115
+ See [Decidim](https://github.com/decidim/decidim).
116
+
117
+ ## License
118
+
119
+ This engine is distributed under the [GNU AFFERO GENERAL PUBLIC LICENSE](LICENSE-AGPLv3.txt)
120
+
121
+ <br /><br />
122
+ <p align="center">
123
+ <img src="https://raw.githubusercontent.com/octree-gva/meta/main/decidim/static/octree_and_decidim.png" height="90" alt="Decidim Installation by Octree" />
124
+ </p>
data/Rakefile ADDED
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/dev/common_rake"
4
+
5
+ def install_module(path)
6
+ Dir.chdir(path) do
7
+ # system("bundle exec rake decidim_vocacity_gem_tasks:install:migrations")
8
+ end
9
+ end
10
+
11
+ def seed_db(path)
12
+ Dir.chdir(path) do
13
+ system("bundle exec rake db:seed")
14
+ end
15
+ end
16
+
17
+ desc "Prepare for testing"
18
+ task :prepare_tests do
19
+ # Remove previous existing db, and recreate one.
20
+ disable_docker_compose = ENV.fetch("DISABLED_DOCKER_COMPOSE", "false") == "true"
21
+ unless disable_docker_compose
22
+ system("docker-compose down -v")
23
+ system("docker-compose up -d --remove-orphans")
24
+ end
25
+ ENV["RAILS_ENV"] = "test"
26
+ databaseYml = {
27
+ "test" => {
28
+ "adapter" => "postgresql",
29
+ "encoding" => "unicode",
30
+ "host" => ENV.fetch("DATABASE_HOST", "localhost"),
31
+ "port" => ENV.fetch("DATABASE_PORT", "5432").to_i,
32
+ "username" => ENV.fetch("DATABASE_USERNAME", "decidim"),
33
+ "password" => ENV.fetch("DATABASE_PASSWORD", "TEST-insecure-password"),
34
+ "database" => "decidim_test"
35
+ }
36
+ }
37
+ config_file = File.expand_path("spec/dummy/config/database.yml", __dir__)
38
+ File.open(config_file, "w") { |f| YAML.dump(databaseYml, f) }
39
+ Dir.chdir("spec/dummy") do
40
+ system("bundle exec rails db:migrate")
41
+ end
42
+ end
43
+
44
+ desc "Generates a dummy app for testing"
45
+ task :test_app do
46
+ Bundler.with_original_env do
47
+ generate_decidim_app(
48
+ "spec/dummy",
49
+ "--app_name",
50
+ "decidim_test",
51
+ "--path",
52
+ "../..",
53
+ "--skip_spring",
54
+ "--demo",
55
+ "--force_ssl",
56
+ "false",
57
+ "--locales",
58
+ "en,fr,es"
59
+ )
60
+ end
61
+ install_module("spec/dummy")
62
+ Rake::Task["prepare_tests"].invoke
63
+ end
64
+
65
+ desc "Generates a development app"
66
+ task :development_app do
67
+ Bundler.with_original_env do
68
+ generate_decidim_app(
69
+ "development_app",
70
+ "--app_name",
71
+ "#{base_app_name}_development_app",
72
+ "--path",
73
+ "..",
74
+ "--recreate_db",
75
+ "--demo"
76
+ )
77
+ end
78
+
79
+ install_module("development_app")
80
+ seed_db("development_app")
81
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ExternalNewsletter
5
+ module Admin
6
+ # This controller is the abstract class from which all other controllers of
7
+ # this engine inherit.
8
+ #
9
+ # Note that it inherits from `Decidim::Admin::Components::BaseController`, which
10
+ # override its layout and provide all kinds of useful methods.
11
+ class ApplicationController < Decidim::Admin::Components::BaseController
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ExternalNewsletter
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ExternalNewsletter
5
+ # Custom helpers, scoped to the external newsletter engine.
6
+ #
7
+ module ApplicationHelper
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ExternalNewsletter
5
+ # Abstract class from which all models in this engine inherit.
6
+ class ApplicationRecord < ActiveRecord::Base
7
+ self.abstract_class = true
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ import "src/decidim/external_newsletter/remove_newsletter_modal.js.es6"
2
+ require.context("../images", true);
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35"><path d="M17.5 35A17.5 17.5 0 1 1 35 17.5 17.52 17.52 0 0 1 17.5 35zm0-33.06A15.56 15.56 0 1 0 33.06 17.5 15.57 15.57 0 0 0 17.5 1.94zm9.5 13.7H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zm0 3.68H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zM22.26 23H8a1 1 0 0 1 0-1.94h14.26a1 1 0 0 1 0 1.94z"/></svg>
@@ -0,0 +1,3 @@
1
+ #newsletter_subscription .inf-form > div{
2
+ background: red!important;
3
+ }
@@ -0,0 +1,4 @@
1
+ @import "components/*";
2
+ body{
3
+ background: blue !important
4
+ }
@@ -0,0 +1,67 @@
1
+ <div class="wrapper">
2
+ <div class="row collapse">
3
+ <div class="row collapse">
4
+ <div class="columns large-8 large-centered text-center page-title">
5
+ <h1><%= t "devise.invitations.edit.header" %></h1>
6
+
7
+ <p><%= t("devise.invitations.edit.subtitle").html_safe %></p>
8
+ </div>
9
+ </div>
10
+
11
+ <div class="row">
12
+ <div class="columns large-6 medium-10 medium-centered">
13
+ <%= decidim_form_for resource, namespace: "invitation", as: resource_name, url: invitation_path(resource_name, invite_redirect: params[:invite_redirect]), html: { method: :put, class: "register-form new_user" } do |f| %>
14
+ <div class="card">
15
+ <div class="card__content">
16
+ <legend><%= t("sign_up_as.legend", scope: "decidim.devise.registrations.new") %></legend>
17
+
18
+ <%= form_required_explanation %>
19
+
20
+ <%= f.hidden_field :invitation_token %>
21
+
22
+ <div class="user-nickname">
23
+ <div class="field">
24
+ <%= f.text_field :nickname, help_text: t("devise.invitations.edit.nickname_help", organization: current_organization.name), required: "required", prefix: { value: "@", small: 1, large: 1 } %>
25
+ </div>
26
+ </div>
27
+
28
+ <% if f.object.class.require_password_on_accepting %>
29
+ <div class="field">
30
+ <p><%= f.password_field :password, required: "required", minlength: ::Devise.password_length.min, maxlength: ::Devise.password_length.max %></p>
31
+ </div>
32
+
33
+ <div class="field">
34
+ <p><%= f.password_field :password_confirmation, required: "required", minlength: ::Devise.password_length.min, maxlength: ::Devise.password_length.max %></p>
35
+ </div>
36
+ <% end %>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="card" id="card__tos">
41
+ <div class="card__content">
42
+ <fieldset>
43
+ <legend><%= t("tos_title", scope: "decidim.devise.registrations.new") %></legend>
44
+ <p class="tos-text"><%= strip_tags(translated_attribute(terms_and_conditions_page.content)) %></p>
45
+ </fieldset>
46
+
47
+ <div class="field">
48
+ <% link = link_to t("terms", scope: "decidim.devise.registrations.new"), page_path("terms-and-conditions"), target: "_blank" %>
49
+ <% label = t("tos_agreement", scope: "decidim.devise.registrations.new", link: link) %>
50
+ <%= f.check_box :tos_agreement, label: label, required: "required" %>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="card">
56
+ <div class="card__content">
57
+ <div class="actions">
58
+ <%= f.submit t("devise.invitations.edit.submit_button"), class: "button expanded" %>
59
+ </div>
60
+ </div>
61
+ </div>
62
+
63
+ <% end %>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
@@ -0,0 +1,96 @@
1
+ <% add_decidim_page_title(t(".sign_up")) %>
2
+
3
+ <% content_for :devise_links do %>
4
+ <%= render "decidim/devise/shared/links" %>
5
+ <% end %>
6
+
7
+ <div class="wrapper">
8
+ <div class="row collapse">
9
+ <div class="row collapse">
10
+ <div class="columns large-8 large-centered text-center page-title">
11
+ <h1><%= t(".sign_up") %></h1>
12
+ <p>
13
+ <%= t(".subtitle") %>
14
+ </p>
15
+ <p>
16
+ <%= t(".already_have_an_account?") %>
17
+ <%= link_to t(".sign_in"), new_user_session_path %>
18
+ </p>
19
+ </div>
20
+ </div>
21
+
22
+ <% cache current_organization do %>
23
+ <%= render "decidim/devise/shared/omniauth_buttons" %>
24
+ <% end %>
25
+
26
+ <div class="row">
27
+ <div class="columns large-6 medium-10 medium-centered">
28
+
29
+ <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { class: "register-form new_user", id: "register-form" }) do |f| %>
30
+ <%= invisible_captcha %>
31
+ <div class="card">
32
+ <div class="card__content">
33
+ <%= form_required_explanation %>
34
+
35
+ <div class="user-person">
36
+ <div class="field">
37
+ <%= f.text_field :name, help_text: t(".username_help") %>
38
+ </div>
39
+ </div>
40
+
41
+ <div class="user-nickname">
42
+ <div class="field">
43
+ <%= f.text_field :nickname, help_text: t(".nickname_help", organization: current_organization.name), prefix: { value: "@", small: 1, large: 1 } %>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="field">
48
+ <%= f.email_field :email %>
49
+ </div>
50
+
51
+ <div class="field">
52
+ <%= f.password_field :password, help_text: t("decidim.external_newsletter.devise.registrations.new.password_help", deep_interpolation: true, minimun_characters: ::PasswordValidator::MINIMUM_LENGTH), autocomplete: "off" %>
53
+ </div>
54
+
55
+ <div class="field">
56
+ <%= f.password_field :password_confirmation %>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <div class="card" id="card__tos">
62
+ <div class="card__content">
63
+ <h3><%= t(".tos_title") %></h3>
64
+
65
+ <p class="tos-text">
66
+ <%= strip_tags(translated_attribute(terms_and_conditions_page.content)) %>
67
+ </p>
68
+
69
+ <div class="field">
70
+ <%= f.check_box :tos_agreement, label: t(".tos_agreement", link: link_to(t(".terms"), page_path("terms-and-conditions"))) %>
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="card" id="card__newsletter" style="display:none">
76
+ <div class="card__content">
77
+ <h3><%= t(".newsletter_title") %></h3>
78
+ <div class="field">
79
+ <%= f.check_box :newsletter, label: t(".newsletter"), checked: true %>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="card">
85
+ <div class="card__content">
86
+ <div class="actions">
87
+ <%= f.submit t("devise.registrations.new.sign_up"), class: "button expanded" %>
88
+ </div>
89
+ <%= yield :devise_links %>
90
+ </div>
91
+ </div>
92
+ <% end %>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </div>
@@ -0,0 +1,76 @@
1
+ <% add_decidim_page_title(t("notifications_settings", scope: "layouts.decidim.user_profile")) %>
2
+ <% content_for(:subtitle) { t("notifications_settings", scope: "layouts.decidim.user_profile") } %>
3
+
4
+ <%= form_for(@notifications_settings, url: notifications_settings_path, method: :put, class: "user-form") do |f| %>
5
+ <p><strong><%= t(".receive_notifications_about") %></strong></p>
6
+ <div class="switch tiny switch-with-label notifications_from_own_activity">
7
+ <%= f.label :notifications_from_own_activity do %>
8
+ <%= f.check_box :notifications_from_own_activity, label: false, class: "switch-input" %>
9
+ <span class="switch-paddle"></span>
10
+ <span class="switch-label"><%= t(".own_activity") %></span>
11
+ <% end %>
12
+ </div>
13
+ <div class="switch tiny switch-with-label notifications_from_followed">
14
+ <%= f.label :notifications_from_followed do %>
15
+ <%= f.check_box :notifications_from_followed, label: false, class: "switch-input" %>
16
+ <span class="switch-paddle"></span>
17
+ <span class="switch-label"><%= t(".everything_followed") %></span>
18
+ <% end %>
19
+ </div>
20
+
21
+ <p><strong><%= t(".notifications_sending_frequency") %></strong></p>
22
+ <%= f.collection_radio_buttons :notifications_sending_frequency, frequencies_collection, :first, :last, { checked: @notifications_settings.notifications_sending_frequency || "daily" } %>
23
+
24
+ <p><strong><%= t(".direct_messages") %></strong></p>
25
+ <div class="switch tiny switch-with-label allow_public_contact">
26
+ <label>
27
+ <%= f.check_box :allow_public_contact, label: false, class: "switch-input" %>
28
+ <span class="switch-paddle"></span>
29
+ <span class="switch-label"><%= t(".allow_public_contact") %></span>
30
+ </label>
31
+ </div>
32
+
33
+ <% if current_user.moderator? %>
34
+ <p><strong><%= t(".administrators") %></strong></p>
35
+ <div class="switch tiny switch-with-label email_on_moderations">
36
+ <label>
37
+ <%= f.check_box :email_on_moderations, label: false, class: "switch-input" %>
38
+ <span class="switch-paddle"></span>
39
+ <span class="switch-label"><%= t(".email_on_moderations") %></span>
40
+ </label>
41
+ </div>
42
+
43
+ <% Decidim.notification_settings_registry.manifests.filter{ |a| a.settings_area == :administrators }.each do |manifest| %>
44
+ <div class="switch tiny switch-with-label notification_settings">
45
+ <label>
46
+ <%= f.check_box "notification_settings[#{manifest.name}]",
47
+ checked: ["1", true].include?(current_user.notification_settings.fetch(manifest.name.to_s, manifest.default_value)),
48
+ label: false,
49
+ class: "switch-input" %>
50
+ <span class="switch-paddle"></span>
51
+ <span class="switch-label"><%= t(".notification_settings.#{manifest.name}") %></span>
52
+ </label>
53
+ </div>
54
+ <% end %>
55
+
56
+ <% end %>
57
+
58
+ <% if @notifications_settings.meet_push_notifications_requirements? %>
59
+ <div class="push-notifications js-sw-mandatory">
60
+ <p><strong><%= t(".push_notifications") %></strong></p>
61
+ <p id="push-notifications-reminder" class="push-notifications__reminder"><i><%= t(".push_notifications_reminder") %></i></p>
62
+ <div class="switch tiny switch-with-label allow_push_notifications">
63
+ <label>
64
+ <%= check_box_tag :allow_push_notifications, 0, false, class: "switch-input" %>
65
+ <span class="switch-paddle"></span>
66
+ <span class="switch-label"><%= t(".allow_push_notifications") %></span>
67
+ </label>
68
+ </div>
69
+ </div>
70
+
71
+ <input id="vapidPublicKey" name="vapid_public_key" type="hidden" value="<%= Base64.urlsafe_decode64(Rails.application.secrets.vapid[:public_key]).bytes %>">
72
+ <input id="subKeys" name="sub_key" type="hidden" value="<%= current_user.notifications_subscriptions.keys %>">
73
+ <% end %>
74
+
75
+ <%= f.submit t(".update_notifications_settings") %>
76
+ <% end %>
@@ -0,0 +1,53 @@
1
+ <% add_decidim_page_title(t("notifications_settings", scope: "layouts.decidim.user_profile")) %>
2
+ <% content_for(:subtitle) { t("notifications_settings", scope: "layouts.decidim.user_profile") } %>
3
+
4
+ <div class="row">
5
+ <%= form_for(@notifications_settings, url: notifications_settings_path, method: :put, class: "user-form") do |f| %>
6
+ <p><strong><%= t(".receive_notifications_about") %></strong></p>
7
+ <div class="switch tiny switch-with-label notifications_from_own_activity">
8
+ <%= f.label :notifications_from_own_activity do %>
9
+ <%= f.check_box :notifications_from_own_activity, label: false, class: "switch-input" %>
10
+ <span class="switch-paddle"></span>
11
+ <span class="switch-label"><%= t(".own_activity") %></span>
12
+ <% end %>
13
+ </div>
14
+ <div class="switch tiny switch-with-label notifications_from_followed">
15
+ <%= f.label :notifications_from_followed do %>
16
+ <%= f.check_box :notifications_from_followed, label: false, class: "switch-input" %>
17
+ <span class="switch-paddle"></span>
18
+ <span class="switch-label"><%= t(".everything_followed") %></span>
19
+ <% end %>
20
+ </div>
21
+
22
+ <p><strong><%= t(".send_notifications_by_email") %></strong></p>
23
+ <div class="switch tiny switch-with-label email_on_notification">
24
+ <%= f.label :email_on_notification do %>
25
+ <%= f.check_box :email_on_notification, label: false, class: "switch-input" %>
26
+ <span class="switch-paddle"></span>
27
+ <span class="switch-label"><%= t(".email_on_notification") %></span>
28
+ <% end %>
29
+ </div>
30
+
31
+ <p><strong><%= t(".direct_messages") %></strong></p>
32
+ <div class="switch tiny switch-with-label allow_public_contact">
33
+ <label>
34
+ <%= f.check_box :allow_public_contact, label: false, class: "switch-input" %>
35
+ <span class="switch-paddle"></span>
36
+ <span class="switch-label"><%= t(".allow_public_contact") %></span>
37
+ </label>
38
+ </div>
39
+
40
+ <% if @notifications_settings.user_is_moderator?(current_user) %>
41
+ <p><strong><%= t(".administrators") %></strong></p>
42
+ <div class="switch tiny switch-with-label email_on_moderations">
43
+ <label>
44
+ <%= f.check_box :email_on_moderations, label: false, class: "switch-input" %>
45
+ <span class="switch-paddle"></span>
46
+ <span class="switch-label"><%= t(".email_on_moderations") %></span>
47
+ </label>
48
+ </div>
49
+ <% end %>
50
+
51
+ <%= f.submit t(".update_notifications_settings") %>
52
+ <% end %>
53
+ </div>
@@ -0,0 +1,56 @@
1
+ <% if ENV.fetch('DECIDIM_EXTERNAL_NEWSLETTER', nil).present? %>
2
+ <style>
3
+ #newsletter_subscription .inf-form {
4
+ padding: 2rem 1.2rem;
5
+ background: #EEE;
6
+ text-align: center;
7
+ }
8
+ #newsletter_subscription .inf-form h4 {
9
+ font-size: 1.375rem;
10
+ color: inherit;
11
+ font-weight: inherit;
12
+ }
13
+ #newsletter_subscription .inf-form > div {
14
+ background: transparent;
15
+ margin: 0;
16
+ padding: 0;
17
+ text-align: center;
18
+ font-family: "Source Sans Pro", Helvetica, Roboto, Arial, sans-serif;
19
+ }
20
+ #newsletter_subscription .inf-form .inf-input{
21
+ max-width:25rem;
22
+ margin: 0 auto;
23
+ }
24
+ #newsletter_subscription .inf-form .inf-input.inf-error span.inf-message {
25
+ color: var(--alert);
26
+ transform: translateY(-16px);
27
+ }
28
+ #newsletter_subscription .inf-form .inf-submit {
29
+ text-align: center;
30
+ }
31
+ #newsletter_subscription .inf-form .inf-submit input,
32
+ #newsletter_subscription .inf-form .inf-submit input:hover {
33
+ display: inline-block;
34
+ vertical-align: middle;
35
+ margin: 0 0 1rem 0;
36
+ padding: 0.85em 1em;
37
+ border: 1px solid transparent;
38
+ border-radius: 4px;
39
+ transition: background-color 0.25s ease-out, color 0.25s ease-out;
40
+ font-family: inherit;
41
+ font-size: 1rem;
42
+ -webkit-appearance: none;
43
+ line-height: 1;
44
+ text-align: center;
45
+ cursor: pointer;
46
+ background: var(--primary);
47
+ }
48
+ #newsletter_subscription .inf-form .inf-submit input:hover {
49
+ opacity:0.8
50
+ }
51
+ </style>
52
+ <div id="newsletter_subscription">
53
+ <script type="text/javascript" src="<%= ENV.fetch("DECIDIM_EXTERNAL_NEWSLETTER") %>"></script>
54
+ </div>
55
+ <% end %>
56
+
@@ -0,0 +1,32 @@
1
+ <%= render partial: "layouts/decidim/external_newsletter" %>
2
+
3
+ <div class="main-footer">
4
+ <% if current_organization.official_img_footer.attached? %>
5
+ <%= link_to current_organization.official_url, class: "main-footer__badge" do %>
6
+ <%= image_tag current_organization.attached_uploader(:official_img_footer).path, alt: current_organization.name %>
7
+ <% end %>
8
+ <% end %>
9
+ <div class="row">
10
+ <div class="medium-8 large-6 large-offset-3 column">
11
+ <nav class="main__footer__nav">
12
+ <ul class="footer-nav">
13
+ <% organization_pages = current_organization.static_pages_accessible_for(current_user) %>
14
+ <% if organization_pages.any? %>
15
+ <% current_organization.static_page_topics.where(show_in_footer: true).each do |page_topic| %>
16
+ <% topic_pages = page_topic.accessible_pages_for(current_user) %>
17
+ <% if topic_pages.any? %>
18
+ <li><%= link_to translated_attribute(page_topic.title), decidim.page_path(topic_pages.first) %></li>
19
+ <% end %>
20
+ <% end %>
21
+
22
+ <% organization_pages.where(show_in_footer: true).each do |page| %>
23
+ <li><%= link_to translated_attribute(page.title), decidim.page_path(page) %></li>
24
+ <% end %>
25
+ <% end %>
26
+ <li><%= link_to t("layouts.decidim.footer.download_open_data"), decidim.open_data_download_path %></li>
27
+ </ul>
28
+ </nav>
29
+ </div>
30
+ <%= render partial: "layouts/decidim/social_media_links" %>
31
+ </div>
32
+ </div>