decidim-core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/decidim.js.es6 +2 -0
- data/app/assets/javascripts/decidim/account_form.js.es6 +27 -0
- data/app/assets/javascripts/decidim/editor.js.es6 +9 -2
- data/app/assets/javascripts/decidim/form_filter.component.js.es6 +1 -1
- data/app/assets/javascripts/decidim/form_filter.component.test.js +2 -2
- data/app/assets/javascripts/decidim/history.js.es6 +7 -4
- data/app/commands/decidim/create_registration.rb +2 -1
- data/app/commands/decidim/destroy_account.rb +47 -0
- data/app/constraints/decidim/current_feature.rb +4 -5
- data/app/controllers/concerns/decidim/needs_participatory_process.rb +6 -1
- data/app/controllers/decidim/account_controller.rb +25 -2
- data/app/controllers/decidim/authorizations_controller.rb +2 -2
- data/app/controllers/decidim/pages_controller.rb +4 -2
- data/app/forms/decidim/delete_account_form.rb +8 -0
- data/app/forms/decidim/registration_form.rb +13 -0
- data/app/helpers/decidim/action_authorization_helper.rb +10 -4
- data/app/helpers/decidim/decidim_form_helper.rb +96 -0
- data/app/helpers/decidim/omniauth_helper.rb +1 -1
- data/app/helpers/decidim/resource_helper.rb +3 -36
- data/app/mailers/decidim/reported_mailer.rb +5 -3
- data/app/models/decidim/attachment.rb +1 -1
- data/app/models/decidim/authorization.rb +1 -1
- data/app/models/decidim/categorization.rb +8 -0
- data/app/models/decidim/category.rb +7 -2
- data/app/models/decidim/feature.rb +3 -5
- data/app/models/decidim/identity.rb +0 -1
- data/app/models/decidim/moderation.rb +0 -2
- data/app/models/decidim/participatory_process.rb +4 -2
- data/app/models/decidim/report.rb +1 -1
- data/app/models/decidim/resource_link.rb +1 -2
- data/app/models/decidim/static_page.rb +1 -2
- data/app/models/decidim/user.rb +16 -3
- data/app/models/decidim/user_group.rb +5 -3
- data/app/presenters/decidim/resource_locator_presenter.rb +48 -0
- data/app/services/decidim/authorization_handler.rb +4 -7
- data/app/services/decidim/resource_search.rb +3 -1
- data/app/uploaders/decidim/avatar_uploader.rb +2 -2
- data/app/uploaders/decidim/image_uploader.rb +1 -1
- data/app/uploaders/decidim/official_image_footer_uploader.rb +1 -5
- data/app/uploaders/decidim/official_image_header_uploader.rb +1 -5
- data/app/uploaders/decidim/organization_logo_uploader.rb +1 -1
- data/app/views/decidim/account/delete.html.erb +30 -0
- data/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +2 -2
- data/app/views/decidim/reported_mailer/hide.html.erb +5 -1
- data/app/views/decidim/reported_mailer/report.html.erb +5 -1
- data/app/views/layouts/decidim/user_profile.html.erb +2 -1
- data/config/initializers/devise.rb +9 -9
- data/config/locales/ca.yml +20 -3
- data/config/locales/en.yml +20 -3
- data/config/locales/es.yml +20 -3
- data/config/locales/eu.yml +0 -3
- data/config/locales/fi.yml +0 -2
- data/config/locales/fr.yml +0 -3
- data/config/locales/it.yml +350 -0
- data/config/locales/nl.yml +0 -2
- data/config/routes.rb +5 -1
- data/db/migrate/20160817115213_devise_create_decidim_users.rb +1 -0
- data/db/migrate/20160919104837_create_decidim_organizations.rb +2 -0
- data/db/migrate/20160920140207_devise_invitable_add_to_decidim_users.rb +2 -0
- data/db/migrate/20160920141039_user_belongs_to_organization.rb +2 -0
- data/db/migrate/20160920141151_user_has_roles.rb +2 -0
- data/db/migrate/20161005130108_add_participatory_processes.rb +4 -2
- data/db/migrate/20161005153007_add_description_to_organizations.rb +2 -0
- data/db/migrate/20161006085629_add_confirmable_to_devise.rb +2 -0
- data/db/migrate/20161010085443_add_name_to_users.rb +2 -0
- data/db/migrate/20161010102356_translate_processes.rb +2 -0
- data/db/migrate/20161010131544_add_locale_to_users.rb +2 -0
- data/db/migrate/20161011125616_add_hero_image_to_processes.rb +2 -0
- data/db/migrate/20161011141033_add_banner_image_to_processes.rb +2 -0
- data/db/migrate/20161013134732_add_promoted_flag_to_processes.rb +2 -0
- data/db/migrate/20161017085822_add_participatory_process_steps.rb +4 -2
- data/db/migrate/20161018091013_create_decidim_authorizations.rb +2 -0
- data/db/migrate/20161019072016_add_active_flag_to_step.rb +7 -1
- data/db/migrate/20161020080756_add_position_to_steps.rb +2 -0
- data/db/migrate/20161025125300_add_published_at_to_processes.rb +2 -0
- data/db/migrate/20161107152228_remove_not_null_on_step_position.rb +2 -0
- data/db/migrate/20161108093802_create_decidim_static_pages.rb +2 -0
- data/db/migrate/20161110092735_add_index_for_process_slug_organization.rb +5 -3
- data/db/migrate/20161110105712_create_decidim_features.rb +2 -0
- data/db/migrate/20161116115156_create_attachments.rb +4 -2
- data/db/migrate/20161123085134_add_categories.rb +2 -0
- data/db/migrate/20161130105257_create_decidim_scopes.rb +2 -0
- data/db/migrate/20161209134715_make_organization_description_optional.rb +2 -0
- data/db/migrate/20161213094244_add_avatar_to_users.rb +2 -0
- data/db/migrate/20161214152811_add_logo_to_organizations.rb +2 -0
- data/db/migrate/20170110133113_add_configuration_to_features.rb +2 -0
- data/db/migrate/20170110153807_add_handler_to_organization.rb +2 -0
- data/db/migrate/20170113150627_create_resource_links.rb +2 -0
- data/db/migrate/20170116110851_create_identities.rb +2 -0
- data/db/migrate/20170116135237_loosen_step_requirements.rb +2 -0
- data/db/migrate/20170117142904_add_uniqueness_field_to_authorizations.rb +2 -0
- data/db/migrate/20170119145359_create_user_groups.rb +2 -0
- data/db/migrate/20170119150255_create_user_group_memberships.rb +2 -0
- data/db/migrate/20170119150649_add_show_statistics_to_organization.rb +3 -1
- data/db/migrate/20170120120733_add_user_groups_verified.rb +2 -0
- data/db/migrate/20170123134023_make_attachments_polymorphic.rb +2 -0
- data/db/migrate/20170123140857_add_avatar_to_user_groups.rb +2 -0
- data/db/migrate/20170125135937_rename_attachable_to_attached_to.rb +3 -1
- data/db/migrate/20170125152026_add_weight_to_features.rb +2 -0
- data/db/migrate/20170126151123_add_extra_info_to_processes.rb +6 -4
- data/db/migrate/20170128140553_add_timestamps_to_identities.rb +2 -0
- data/db/migrate/20170130132833_add_favicon_to_decidim_organizations.rb +2 -0
- data/db/migrate/20170131134349_add_action_permissions_to_decidim_features.rb +2 -0
- data/db/migrate/20170202084913_add_comments_and_replies_notifications_to_users.rb +2 -0
- data/db/migrate/20170203150545_add_newsletter_notifications_to_users.rb +2 -0
- data/db/migrate/20170206083118_rename_extra_info_on_processes.rb +2 -0
- data/db/migrate/20170206142116_add_published_at_to_decidim_features.rb +2 -0
- data/db/migrate/20170207091021_add_social_media_handlers_to_organization.rb +2 -0
- data/db/migrate/20170207093048_add_organization_logo_and_url.rb +3 -1
- data/db/migrate/20170213081133_create_decidim_newsletters.rb +2 -0
- data/db/migrate/20170215115407_add_organization_custom_reference.rb +2 -0
- data/db/migrate/20170220110740_remove_steps_short_description.rb +2 -0
- data/db/migrate/20170221094835_add_scopes_to_processes.rb +2 -0
- data/db/migrate/20170228142440_add_participatory_process_groups.rb +2 -0
- data/db/migrate/20170306144354_add_secondary_hosts_to_organizations.rb +2 -0
- data/db/migrate/20170307084957_create_reports.rb +2 -0
- data/db/migrate/20170308091316_create_moderations.rb +2 -0
- data/db/migrate/20170313095436_add_available_authorizations_to_organization.rb +2 -0
- data/db/migrate/20170404132616_change_steps_end_and_start_date_to_date.rb +2 -0
- data/db/migrate/20170405091801_change_decidim_user_email_index_uniqueness.rb +2 -0
- data/db/migrate/20170405094028_add_organization_to_identities.rb +2 -0
- data/db/migrate/20170405094258_change_decidim_identities_provider_uid_index_uniqueness.rb +3 -1
- data/db/migrate/20170529150743_add_rejected_at_to_user_groups.rb +2 -0
- data/db/migrate/20170605140421_add_deleted_fields_to_users.rb +8 -0
- data/db/migrate/20170606102659_set_email_unique_in_organization_conditional.rb +8 -0
- data/db/migrate/20170608142521_add_organization_to_user_groups.rb +14 -0
- data/db/migrate/20170612070905_add_uniqueness_to_name_and_document_number_to_user_groups.rb +8 -0
- data/db/migrate/20170612100253_create_decidim_categorizations.rb +12 -0
- data/db/seeds.rb +10 -8
- data/lib/decidim/authorable.rb +2 -2
- data/lib/decidim/core.rb +1 -1
- data/lib/decidim/core/api/author_interface.rb +6 -0
- data/lib/decidim/core/api/user_group_type.rb +14 -0
- data/lib/decidim/core/api/user_type.rb +10 -0
- data/lib/decidim/core/engine.rb +1 -1
- data/lib/decidim/core/test/factories.rb +12 -0
- data/lib/decidim/core/test/shared_examples/manage_moderations_examples.rb +3 -3
- data/lib/decidim/core/version.rb +2 -2
- data/lib/decidim/feature_manifest.rb +2 -3
- data/lib/decidim/form_builder.rb +3 -2
- data/lib/decidim/has_category.rb +3 -1
- data/lib/decidim/has_scope.rb +5 -2
- data/lib/decidim/query_extensions.rb +2 -2
- data/lib/decidim/reportable.rb +3 -3
- data/lib/decidim/stats_registry.rb +2 -2
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fr.js +14 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.it.js +14 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.nl.js +14 -0
- metadata +45 -17
- data/app/models/decidim/component.rb +0 -52
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d96ba296398fd826bdcf4c32066893664f91f190
|
|
4
|
+
data.tar.gz: e378de5bd40d0cbd7f95e811e921cbbce3fd3f15
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c5ad0b5762d5c1c9d2ec61392c7a22587ecc4d769f35dbe938be51513f0446df6104c75fb36e34cf5260ba104a71ab5bb591527a3706e5f1e8e1a22155515ba2
|
|
7
|
+
data.tar.gz: 5d32c6d26f18146787b85c53c019bb549d0a3569b90dcae89588a4a7249f6f472e2addad8b08b911276472b487809462b45639277f58fe346aaa95aaa2417c73
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// = require jquery
|
|
1
2
|
// = require decidim/foundation
|
|
2
3
|
// = require modernizr
|
|
3
4
|
// = require svg4everybody.min
|
|
@@ -8,6 +9,7 @@
|
|
|
8
9
|
// = require decidim/history
|
|
9
10
|
// = require decidim/append_elements
|
|
10
11
|
// = require decidim/user_registrations
|
|
12
|
+
// = require decidim/account_form
|
|
11
13
|
|
|
12
14
|
/* globals svg4everybody */
|
|
13
15
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Since the delete account has a modal to confirm it we need to copy the content of the
|
|
3
|
+
* reason field to the hidden field in the form inside the modal.
|
|
4
|
+
*/
|
|
5
|
+
$(() => {
|
|
6
|
+
const $deleteAccountForm = $('.delete-account');
|
|
7
|
+
const $deleteAccountModalForm = $('.delete-account-modal');
|
|
8
|
+
|
|
9
|
+
if ($deleteAccountForm.length > 0) {
|
|
10
|
+
const $openModalButton = $('.open-modal-button');
|
|
11
|
+
const $modal = $('#deleteConfirm');
|
|
12
|
+
|
|
13
|
+
$openModalButton.on('click', (event) => {
|
|
14
|
+
try {
|
|
15
|
+
const reasonValue = $deleteAccountForm.find('textarea#delete_account_delete_reason').val();
|
|
16
|
+
$deleteAccountModalForm.find('input#delete_account_delete_reason').val(reasonValue);
|
|
17
|
+
$modal.foundation('open');
|
|
18
|
+
} catch (error) {
|
|
19
|
+
console.error(error); // eslint-disable-line no-console
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
event.stopPropagation();
|
|
24
|
+
return false;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
@@ -5,7 +5,7 @@ $(() => {
|
|
|
5
5
|
const $container = $('.editor-container');
|
|
6
6
|
const quillFormats = ['bold', 'italic', 'link', 'underline', 'header', 'list', 'video'];
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const createQuillEditor = (container) => {
|
|
9
9
|
const toolbar = $(container).data('toolbar');
|
|
10
10
|
|
|
11
11
|
let quillToolbar = [
|
|
@@ -39,6 +39,13 @@ $(() => {
|
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
quill.root.innerHTML = $input.val();
|
|
42
|
+
quill.root.innerHTML = $input.val() || '';
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
$container.each((idx, container) => {
|
|
46
|
+
createQuillEditor(container);
|
|
43
47
|
});
|
|
48
|
+
|
|
49
|
+
window.Decidim = window.Decidim || {};
|
|
50
|
+
window.Decidim.createQuillEditor = createQuillEditor;
|
|
44
51
|
});
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* Finds the values of the location
|
|
57
|
+
* Finds the values of the location params that match the given regexp.
|
|
58
58
|
* @private
|
|
59
59
|
* @param {Regexp} regex - a Regexp to match the params.
|
|
60
60
|
* @returns {String[]} - An array of values of the params that match the regexp.
|
|
@@ -70,14 +70,14 @@ describe('FormFilterComponent', () => {
|
|
|
70
70
|
it('clears the form data', () => {
|
|
71
71
|
spyOn(subject, '_clearForm');
|
|
72
72
|
|
|
73
|
-
window.onpopstate();
|
|
73
|
+
window.onpopstate({ isTrusted: true });
|
|
74
74
|
|
|
75
75
|
expect(subject._clearForm).toHaveBeenCalled();
|
|
76
76
|
});
|
|
77
77
|
|
|
78
78
|
it('sets the correct form fields based on the current location', () => {
|
|
79
79
|
spyOn(subject, '_getLocation').and.returnValue('/filters?filter[scope_id][]=1&scope_id[]=2&filter[category_id]=2');
|
|
80
|
-
window.onpopstate();
|
|
80
|
+
window.onpopstate({ isTrusted: true });
|
|
81
81
|
|
|
82
82
|
expect($(selector).find('select').val()).toEqual('2');
|
|
83
83
|
expect($(selector).find('input[name="filter[scope_id][]"][value="1"]')[0].checked).toBeTruthy();
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
((exports) => {
|
|
5
5
|
let callbacks = {};
|
|
6
6
|
|
|
7
|
-
exports.onpopstate = () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
exports.onpopstate = (event) => {
|
|
8
|
+
// Ensure the event is caused by user action
|
|
9
|
+
if (event.isTrusted) {
|
|
10
|
+
for (let callbackId in callbacks) {
|
|
11
|
+
if (callbacks.hasOwnProperty(callbackId)) {
|
|
12
|
+
callbacks[callbackId]();
|
|
13
|
+
}
|
|
11
14
|
}
|
|
12
15
|
}
|
|
13
16
|
};
|
|
@@ -48,7 +48,8 @@ module Decidim
|
|
|
48
48
|
UserGroupMembership.create!(user: @user,
|
|
49
49
|
user_group: UserGroup.new(name: form.user_group_name,
|
|
50
50
|
document_number: form.user_group_document_number,
|
|
51
|
-
phone: form.user_group_phone
|
|
51
|
+
phone: form.user_group_phone,
|
|
52
|
+
decidim_organization_id: form.current_organization.id))
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
# This command destroys the user's account.
|
|
5
|
+
class DestroyAccount < Rectify::Command
|
|
6
|
+
# Destroy a user's account.
|
|
7
|
+
#
|
|
8
|
+
# user - The user to be updated.
|
|
9
|
+
# form - The form with the data.
|
|
10
|
+
def initialize(user, form)
|
|
11
|
+
@user = user
|
|
12
|
+
@form = form
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def call
|
|
16
|
+
return broadcast(:invalid) unless @form.valid?
|
|
17
|
+
|
|
18
|
+
Decidim::User.transaction do
|
|
19
|
+
destroy_user_account!
|
|
20
|
+
destroy_user_identities
|
|
21
|
+
destroy_user_group_memberships
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
broadcast(:ok)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def destroy_user_account!
|
|
30
|
+
@user.name = ""
|
|
31
|
+
@user.email = ""
|
|
32
|
+
@user.delete_reason = @form.delete_reason
|
|
33
|
+
@user.deleted_at = Time.current
|
|
34
|
+
@user.skip_reconfirmation!
|
|
35
|
+
@user.remove_avatar!
|
|
36
|
+
@user.save!
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def destroy_user_identities
|
|
40
|
+
@user.identities.destroy_all
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def destroy_user_group_memberships
|
|
44
|
+
Decidim::UserGroupMembership.where(user: @user).destroy_all
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -28,7 +28,7 @@ module Decidim
|
|
|
28
28
|
|
|
29
29
|
env["decidim.current_participatory_process"] ||= @participatory_process
|
|
30
30
|
|
|
31
|
-
feature = detect_current_feature(
|
|
31
|
+
feature = detect_current_feature(params)
|
|
32
32
|
|
|
33
33
|
return false unless feature
|
|
34
34
|
|
|
@@ -38,12 +38,11 @@ module Decidim
|
|
|
38
38
|
|
|
39
39
|
private
|
|
40
40
|
|
|
41
|
-
def detect_current_feature(
|
|
42
|
-
params = request.params
|
|
41
|
+
def detect_current_feature(params)
|
|
43
42
|
return nil unless params["feature_id"]
|
|
44
43
|
|
|
45
|
-
@participatory_process.features.
|
|
46
|
-
params["feature_id"]
|
|
44
|
+
@participatory_process.features.find do |feature|
|
|
45
|
+
params["feature_id"] == feature.id.to_s && feature.manifest_name == @manifest.name.to_s
|
|
47
46
|
end
|
|
48
47
|
end
|
|
49
48
|
end
|
|
@@ -19,7 +19,7 @@ module Decidim
|
|
|
19
19
|
#
|
|
20
20
|
# Returns the current ParticipatoryProcess.
|
|
21
21
|
def current_participatory_process
|
|
22
|
-
@current_participatory_process ||=
|
|
22
|
+
@current_participatory_process ||= detect_participatory_process
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
private
|
|
@@ -27,6 +27,11 @@ module Decidim
|
|
|
27
27
|
def verify_participatory_process
|
|
28
28
|
raise ActionController::RoutingError, "Participatory process not found." unless current_participatory_process
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
def detect_participatory_process
|
|
32
|
+
request.env["current_participatory_process"] ||
|
|
33
|
+
current_organization.participatory_processes.find_by(id: params[:participatory_process_id] || params[:id])
|
|
34
|
+
end
|
|
30
35
|
end
|
|
31
36
|
end
|
|
32
37
|
end
|
|
@@ -18,8 +18,8 @@ module Decidim
|
|
|
18
18
|
@account = form(AccountForm).from_params(params)
|
|
19
19
|
|
|
20
20
|
UpdateAccount.call(current_user, @account) do
|
|
21
|
-
on(:ok) do |
|
|
22
|
-
flash.now[:notice] = if
|
|
21
|
+
on(:ok) do |email_is_unconfirmed|
|
|
22
|
+
flash.now[:notice] = if email_is_unconfirmed
|
|
23
23
|
t("account.update.success_with_email_confirmation", scope: "decidim")
|
|
24
24
|
else
|
|
25
25
|
t("account.update.success", scope: "decidim")
|
|
@@ -36,6 +36,29 @@ module Decidim
|
|
|
36
36
|
render action: :show
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
def delete
|
|
40
|
+
authorize! :delete, current_user
|
|
41
|
+
@form = form(DeleteAccountForm).from_model(current_user)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def destroy
|
|
45
|
+
authorize! :delete, current_user
|
|
46
|
+
@form = form(DeleteAccountForm).from_params(params)
|
|
47
|
+
|
|
48
|
+
DestroyAccount.call(current_user, @form) do
|
|
49
|
+
on(:ok) do
|
|
50
|
+
sign_out(current_user)
|
|
51
|
+
flash[:notice] = t("account.destroy.success", scope: "decidim")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
on(:invalid) do
|
|
55
|
+
flash[:alert] = t("account.destroy.error", scope: "decidim")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
redirect_to decidim.root_path
|
|
60
|
+
end
|
|
61
|
+
|
|
39
62
|
private
|
|
40
63
|
|
|
41
64
|
def authorizations
|
|
@@ -63,7 +63,7 @@ module Decidim
|
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
def handler_name
|
|
66
|
-
params[:handler] || params
|
|
66
|
+
params[:handler] || params.dig(:authorization_handler, :handler_name)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def valid_handler
|
|
@@ -72,7 +72,7 @@ module Decidim
|
|
|
72
72
|
logger.warn "Invalid authorization handler given: #{handler_name} doesn't"\
|
|
73
73
|
"exist or you haven't added it to `Decidim.authorization_handlers`"
|
|
74
74
|
|
|
75
|
-
redirect_to(
|
|
75
|
+
redirect_to(authorizations_path) && (return false)
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def only_one_handler?
|
|
@@ -25,11 +25,13 @@ module Decidim
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def promoted_participatory_processes
|
|
28
|
-
@
|
|
28
|
+
@promoted_participatory_processes ||=
|
|
29
|
+
OrganizationPrioritizedParticipatoryProcesses.new(current_organization) | PromotedParticipatoryProcesses.new
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def highlighted_participatory_processes
|
|
32
|
-
@
|
|
33
|
+
@highlighted_participatory_processes ||=
|
|
34
|
+
OrganizationParticipatoryProcesses.new(current_organization) | HighlightedParticipatoryProcesses.new
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
private
|
|
@@ -28,6 +28,8 @@ module Decidim
|
|
|
28
28
|
validates :user_group_phone, presence: true, if: :user_group?
|
|
29
29
|
|
|
30
30
|
validate :email_unique_in_organization
|
|
31
|
+
validate :user_group_name_unique_in_organization
|
|
32
|
+
validate :user_group_document_number_unique_in_organization
|
|
31
33
|
|
|
32
34
|
def user_group?
|
|
33
35
|
sign_up_as == "user_group"
|
|
@@ -38,5 +40,16 @@ module Decidim
|
|
|
38
40
|
def email_unique_in_organization
|
|
39
41
|
errors.add :email, :taken if User.where(email: email, organization: current_organization).first.present?
|
|
40
42
|
end
|
|
43
|
+
|
|
44
|
+
def user_group_name_unique_in_organization
|
|
45
|
+
errors.add :user_group_name, :taken if UserGroup.where(name: user_group_name, decidim_organization_id: current_organization.id).first.present?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def user_group_document_number_unique_in_organization
|
|
49
|
+
errors.add :user_group_document_number, :taken if UserGroup.where(
|
|
50
|
+
document_number: user_group_document_number,
|
|
51
|
+
decidim_organization_id: current_organization.id
|
|
52
|
+
).first.present?
|
|
53
|
+
end
|
|
41
54
|
end
|
|
42
55
|
end
|
|
@@ -33,10 +33,10 @@ module Decidim
|
|
|
33
33
|
html_options = arguments[2]
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
unless
|
|
36
|
+
unless current_user_authorized?(action)
|
|
37
37
|
html_options ||= {}
|
|
38
38
|
html_options["onclick"] = "event.preventDefault();"
|
|
39
|
-
html_options["data-toggle"] = "#{action.to_s.underscore}AuthorizationModal"
|
|
39
|
+
html_options["data-toggle"] = current_user ? "#{action.to_s.underscore}AuthorizationModal" : "loginModal"
|
|
40
40
|
url = ""
|
|
41
41
|
end
|
|
42
42
|
|
|
@@ -66,9 +66,9 @@ module Decidim
|
|
|
66
66
|
html_options = arguments[2] || {}
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
unless
|
|
69
|
+
unless current_user_authorized?(action)
|
|
70
70
|
html_options["onclick"] = "event.preventDefault();"
|
|
71
|
-
html_options["data-toggle"] = "#{action.to_s.underscore}AuthorizationModal"
|
|
71
|
+
html_options["data-toggle"] = current_user ? "#{action.to_s.underscore}AuthorizationModal" : "loginModal"
|
|
72
72
|
url = ""
|
|
73
73
|
end
|
|
74
74
|
|
|
@@ -78,5 +78,11 @@ module Decidim
|
|
|
78
78
|
button_to(body, url, html_options)
|
|
79
79
|
end
|
|
80
80
|
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def current_user_authorized?(action)
|
|
85
|
+
current_user && action_authorization(action).ok?
|
|
86
|
+
end
|
|
81
87
|
end
|
|
82
88
|
end
|
|
@@ -15,5 +15,101 @@ module Decidim
|
|
|
15
15
|
options[:data].update(abide: true, "live-validate" => true, "validate-on-blur" => true)
|
|
16
16
|
form_for(record, options, &block)
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
# A custom helper to include an editor field without requiring a form object
|
|
20
|
+
#
|
|
21
|
+
# name - The input name
|
|
22
|
+
# value - The input value
|
|
23
|
+
# options - The set of options to send to the field
|
|
24
|
+
# :label - The Boolean value to create or not the input label (optional) (default: true)
|
|
25
|
+
# :toolbar - The String value to configure WYSIWYG toolbar. It should be 'basic' or
|
|
26
|
+
# or 'full' (optional) (default: 'basic')
|
|
27
|
+
# :lines - The Integer to indicate how many lines should editor have (optional)
|
|
28
|
+
#
|
|
29
|
+
# Returns a rich editor to be included in a html template.
|
|
30
|
+
def editor_field_tag(name, value, options = {})
|
|
31
|
+
options[:toolbar] ||= "basic"
|
|
32
|
+
options[:lines] ||= 10
|
|
33
|
+
|
|
34
|
+
content_tag(:div, class: "editor") do
|
|
35
|
+
template = ""
|
|
36
|
+
template += label_tag(name, options[:label]) if options[:label] != false
|
|
37
|
+
template += hidden_field_tag(name, value, options)
|
|
38
|
+
template += content_tag(:div, nil, class: "editor-container", data: {
|
|
39
|
+
toolbar: options[:toolbar]
|
|
40
|
+
}, style: "height: #{options[:lines]}rem")
|
|
41
|
+
template.html_safe
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# A custom helper to include a translated field without requiring a form object.
|
|
46
|
+
#
|
|
47
|
+
# type - The type of the translated input field.
|
|
48
|
+
# object_name - The object name used to identify the Foundation tabs.
|
|
49
|
+
# name - The name of the input which will be suffixed with the corresponding locales.
|
|
50
|
+
# value - A hash containing the value for each locale.
|
|
51
|
+
# options - An optional hash of options.
|
|
52
|
+
# * enable_tabs: Adds the data-tabs attribute so Foundation picks up automatically.
|
|
53
|
+
# * tabs_id: The id to identify the Foundation tabs element.
|
|
54
|
+
# * label: The label used for the field.
|
|
55
|
+
#
|
|
56
|
+
# Returns a Foundation tabs element with the translated input field.
|
|
57
|
+
def translated_field_tag(type, object_name, name, value = {}, options = {})
|
|
58
|
+
locales = available_locales
|
|
59
|
+
|
|
60
|
+
tabs_id = options[:tabs_id] || "#{object_name}-#{name}-tabs"
|
|
61
|
+
enabled_tabs = options[:enable_tabs].nil? ? true : options[:enable_tabs]
|
|
62
|
+
tabs_panels_data = enabled_tabs ? { tabs: true } : {}
|
|
63
|
+
|
|
64
|
+
if locales.count == 1
|
|
65
|
+
return send(
|
|
66
|
+
type,
|
|
67
|
+
"#{name}_#{locales.first.to_s.gsub("-", "__")}",
|
|
68
|
+
options.merge(label: options[:label])
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
label_tabs = content_tag(:div, class: "label--tabs") do
|
|
73
|
+
field_label = label_tag(name, options[:label])
|
|
74
|
+
|
|
75
|
+
tabs_panels = "".html_safe
|
|
76
|
+
if options[:label] != false
|
|
77
|
+
tabs_panels = content_tag(:ul, class: "tabs tabs--lang", id: tabs_id, data: tabs_panels_data) do
|
|
78
|
+
locales.each_with_index.inject("".html_safe) do |string, (locale, index)|
|
|
79
|
+
string + content_tag(:li, class: tab_element_class_for("title", index)) do
|
|
80
|
+
title = I18n.with_locale(locale) { I18n.t("name", scope: "locale") }
|
|
81
|
+
tab_content_id = "#{tabs_id}-#{name}-panel-#{index}"
|
|
82
|
+
content_tag(:a, title, href: "##{tab_content_id}")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
safe_join [field_label, tabs_panels]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
tabs_content = content_tag(:div, class: "tabs-content", data: { tabs_content: tabs_id }) do
|
|
92
|
+
locales.each_with_index.inject("".html_safe) do |string, (locale, index)|
|
|
93
|
+
tab_content_id = "#{tabs_id}-#{name}-panel-#{index}"
|
|
94
|
+
string + content_tag(:div, class: tab_element_class_for("panel", index), id: tab_content_id) do
|
|
95
|
+
send(type, "#{object_name}[#{name_with_locale(name, locale)}]", value[locale.to_s], options.merge(id: "#{tabs_id}_#{name}_#{locale}", label: false))
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
safe_join [label_tabs, tabs_content]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Helper method used by `translated_field_tag`
|
|
104
|
+
def tab_element_class_for(type, index)
|
|
105
|
+
element_class = "tabs-#{type}"
|
|
106
|
+
element_class += " is-active" if index.zero?
|
|
107
|
+
element_class
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Helper method used by `translated_field_tag`
|
|
111
|
+
def name_with_locale(name, locale)
|
|
112
|
+
"#{name}_#{locale.to_s.gsub("-", "__")}"
|
|
113
|
+
end
|
|
18
114
|
end
|
|
19
115
|
end
|