decidim-core 0.9.3 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/decidim/append_redirect_url_to_modals.js.es6 +1 -1
- data/app/assets/javascripts/decidim/data_picker.js.es6 +32 -28
- data/app/assets/javascripts/decidim/form_filter.component.js.es6 +2 -2
- data/app/assets/javascripts/decidim/foundation.js.es6 +1 -2
- data/app/assets/stylesheets/decidim/_decidim.scss +6 -1
- data/app/assets/stylesheets/decidim/modules/_address.scss +4 -0
- data/app/assets/stylesheets/decidim/modules/_block-banner.scss +39 -0
- data/app/assets/stylesheets/decidim/modules/_buttons.scss +76 -1
- data/app/assets/stylesheets/decidim/modules/_callout.scss +4 -0
- data/app/assets/stylesheets/decidim/modules/_cards.scss +117 -16
- data/app/assets/stylesheets/decidim/modules/_collapsible-list.scss +19 -0
- data/app/assets/stylesheets/decidim/modules/_data-picker.scss +0 -1
- data/app/assets/stylesheets/decidim/modules/_docs-manager.scss +16 -0
- data/app/assets/stylesheets/decidim/modules/_icons.scss +13 -4
- data/app/assets/stylesheets/decidim/modules/_margins.scss +39 -0
- data/app/assets/stylesheets/decidim/modules/_modules.scss +4 -0
- data/app/assets/stylesheets/decidim/modules/_navbar.scss +26 -0
- data/app/assets/stylesheets/decidim/modules/_process-phase.scss +49 -0
- data/app/assets/stylesheets/decidim/modules/_reveal.scss +39 -0
- data/app/assets/stylesheets/decidim/modules/_typography.scss +45 -0
- data/app/assets/stylesheets/decidim/modules/_wizard-steps.scss +45 -0
- data/app/assets/stylesheets/decidim/utils/_helpers.scss +14 -0
- data/app/assets/stylesheets/decidim/utils/_mixins.scss +34 -0
- data/app/assets/stylesheets/decidim/utils/_settings.scss +6 -3
- data/app/commands/decidim/create_report.rb +2 -2
- data/app/controllers/decidim/devise/invitations_controller.rb +1 -1
- data/app/controllers/decidim/features/base_controller.rb +1 -1
- data/app/controllers/decidim/locales_controller.rb +1 -1
- data/app/forms/decidim/registration_form.rb +1 -1
- data/app/helpers/decidim/decidim_form_helper.rb +26 -1
- data/app/helpers/decidim/meta_tags_helper.rb +2 -0
- data/app/helpers/decidim/resource_reference_helper.rb +24 -0
- data/app/helpers/decidim/scopes_helper.rb +22 -4
- data/app/helpers/decidim/view_hooks_helper.rb +6 -3
- data/app/mailers/decidim/messaging/conversation_mailer.rb +2 -0
- data/app/models/decidim/abilities/base_ability.rb +1 -1
- data/app/models/decidim/action_log.rb +57 -0
- data/app/models/decidim/area.rb +25 -0
- data/app/models/decidim/area_type.rb +20 -0
- data/app/models/decidim/attachment.rb +3 -0
- data/app/models/decidim/attachment_collection.rb +16 -0
- data/app/models/decidim/authorization.rb +1 -0
- data/app/models/decidim/categorization.rb +2 -0
- data/app/models/decidim/category.rb +8 -0
- data/app/models/decidim/feature.rb +6 -1
- data/app/models/decidim/moderation.rb +7 -0
- data/app/models/decidim/newsletter.rb +7 -0
- data/app/models/decidim/organization.rb +9 -0
- data/app/models/decidim/participatory_process_user_role.rb +9 -0
- data/app/models/decidim/resource_link.rb +8 -1
- data/app/models/decidim/scope.rb +7 -0
- data/app/models/decidim/static_page.rb +7 -0
- data/app/models/decidim/user.rb +5 -1
- data/app/models/decidim/user_group.rb +7 -0
- data/app/presenters/decidim/admin_log/feature_presenter.rb +43 -0
- data/app/presenters/decidim/admin_log/moderation_presenter.rb +48 -0
- data/app/presenters/decidim/admin_log/newsletter_presenter.rb +47 -0
- data/app/presenters/decidim/admin_log/newsletter_resource_presenter.rb +18 -0
- data/app/presenters/decidim/admin_log/organization_presenter.rb +84 -0
- data/app/presenters/decidim/admin_log/scope_presenter.rb +54 -0
- data/app/presenters/decidim/admin_log/static_page_presenter.rb +48 -0
- data/app/presenters/decidim/admin_log/static_page_resource_presenter.rb +18 -0
- data/app/presenters/decidim/admin_log/user_group_presenter.rb +31 -0
- data/app/presenters/decidim/admin_log/user_presenter.rb +59 -0
- data/app/presenters/decidim/area_presenter.rb +14 -0
- data/app/presenters/decidim/area_type_presenter.rb +14 -0
- data/app/presenters/decidim/category_presenter.rb +14 -0
- data/app/presenters/decidim/log/base_presenter.rb +253 -0
- data/app/presenters/decidim/log/diff_presenter.rb +120 -0
- data/app/presenters/decidim/log/resource_presenter.rb +71 -0
- data/app/presenters/decidim/log/space_presenter.rb +63 -0
- data/app/presenters/decidim/log/user_presenter.rb +85 -0
- data/app/presenters/decidim/log/value_types/area_presenter.rb +28 -0
- data/app/presenters/decidim/log/value_types/date_presenter.rb +20 -0
- data/app/presenters/decidim/log/value_types/default_presenter.rb +43 -0
- data/app/presenters/decidim/log/value_types/locale_presenter.rb +20 -0
- data/app/presenters/decidim/log/value_types/percentage_presenter.rb +21 -0
- data/app/presenters/decidim/log/value_types/scope_presenter.rb +28 -0
- data/app/presenters/decidim/log/value_types/scope_type_presenter.rb +28 -0
- data/app/presenters/decidim/user_presenter.rb +1 -1
- data/app/services/decidim/action_authorizer.rb +1 -1
- data/app/services/decidim/action_logger.rb +108 -0
- data/app/services/decidim/events_manager.rb +1 -1
- data/app/services/decidim/log/diff_changeset_calculator.rb +135 -0
- data/app/services/decidim/resource_search.rb +2 -8
- data/app/services/decidim/settings_change.rb +31 -0
- data/app/services/decidim/traceability.rb +57 -11
- data/app/types/decidim/core/component_type.rb +12 -0
- data/app/types/decidim/core/date_time_type.rb +12 -0
- data/app/types/decidim/core/date_type.rb +13 -0
- data/app/types/decidim/core/decidim_type.rb +23 -0
- data/app/types/decidim/core/localized_string_type.rb +14 -0
- data/app/types/decidim/core/organization_type.rb +20 -0
- data/app/types/decidim/core/participatory_space_type.rb +12 -0
- data/app/types/decidim/core/session_type.rb +19 -0
- data/app/types/decidim/core/statistic_type.rb +22 -0
- data/app/types/decidim/core/translated_field_type.rb +45 -0
- data/app/types/decidim/core/user_group_type.rb +39 -0
- data/app/types/decidim/core/user_type.rb +41 -0
- data/app/validators/etiquette_validator.rb +1 -1
- data/app/views/decidim/application/_attachments.html.erb +4 -0
- data/app/views/decidim/application/_collection.html.erb +14 -0
- data/app/views/decidim/application/_document.html.erb +19 -0
- data/app/views/decidim/application/_documents.html.erb +8 -23
- data/app/views/decidim/shared/_announcement.html.erb +3 -2
- data/app/views/decidim/shared/_tags.html.erb +1 -0
- data/app/views/decidim/widgets/_data_picker.html.erb +6 -0
- data/app/views/layouts/decidim/mailer.html.erb +2 -2
- data/config/initializers/devise.rb +3 -3
- data/config/locales/ca.yml +65 -11
- data/config/locales/en.yml +64 -10
- data/config/locales/es.yml +66 -12
- data/config/locales/eu.yml +61 -10
- data/config/locales/fi.yml +64 -10
- data/config/locales/fr.yml +64 -10
- data/config/locales/gl.yml +64 -10
- data/config/locales/it.yml +64 -10
- data/config/locales/nl.yml +64 -10
- data/config/locales/pl.yml +60 -10
- data/config/locales/pt-BR.yml +64 -10
- data/config/locales/pt.yml +64 -10
- data/config/locales/sv.yml +64 -10
- data/config/locales/uk.yml +72 -0
- data/db/migrate/20170215115407_add_organization_custom_reference.rb +1 -1
- data/db/migrate/20170313095436_add_available_authorizations_to_organization.rb +1 -1
- data/db/migrate/20171207182729_create_decidim_attachment_collections.rb +12 -0
- data/db/migrate/20180130093153_add_action_log.rb +18 -0
- data/db/migrate/20180206143340_fix_reference_for_all_resources.rb +13 -0
- data/db/migrate/20180215104821_create_decidim_area_types.rb +11 -0
- data/db/migrate/20180215104945_create_decidim_areas.rb +12 -0
- data/db/migrate/20180221101934_fix_nickname_index.rb +1 -1
- data/db/migrate/20180226140756_add_version_to_action_logs.rb +19 -0
- data/db/migrate/20180314085339_rename_maximum_votes_per_proposal_to_threshold_per_proposal.rb +27 -0
- data/db/migrate/20180326075746_change_event_name_and_class_to_rename_to_publish_proposal_event.rb +17 -0
- data/db/seeds.rb +28 -0
- data/lib/decidim/abilities/participatory_process_role_ability.rb +2 -2
- data/lib/decidim/api/author_interface.rb +25 -0
- data/lib/decidim/api/component_interface.rb +16 -0
- data/lib/decidim/api/participatory_space_interface.rb +38 -0
- data/lib/decidim/authorable.rb +8 -0
- data/lib/decidim/core.rb +27 -9
- data/lib/decidim/core/engine.rb +3 -4
- data/lib/decidim/core/test.rb +2 -0
- data/lib/decidim/core/test/factories.rb +62 -6
- data/lib/decidim/core/test/shared_examples/announcements_examples.rb +1 -1
- data/lib/decidim/core/test/shared_examples/comments_examples.rb +47 -5
- data/lib/decidim/core/test/shared_examples/component_type.rb +7 -0
- data/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +63 -0
- data/lib/decidim/core/test/shared_examples/has_attachments.rb +21 -0
- data/lib/decidim/core/test/shared_examples/has_reference.rb +1 -1
- data/lib/decidim/core/test/shared_examples/simple_event.rb +27 -1
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/events/author_event.rb +1 -1
- data/lib/decidim/events/base_event.rb +1 -1
- data/lib/decidim/events/simple_event.rb +21 -0
- data/lib/decidim/exporters/excel.rb +1 -1
- data/lib/decidim/feature_manifest.rb +2 -0
- data/lib/decidim/form_builder.rb +37 -3
- data/lib/decidim/has_attachment_collections.rb +18 -0
- data/lib/decidim/has_attachments.rb +14 -0
- data/lib/decidim/has_category.rb +5 -0
- data/lib/decidim/has_reference.rb +4 -4
- data/lib/decidim/loggable.rb +32 -0
- data/lib/decidim/participable.rb +0 -2
- data/lib/decidim/participatory_space_manifest.rb +2 -0
- data/lib/decidim/publicable.rb +2 -2
- data/lib/decidim/query_extensions.rb +46 -14
- data/lib/decidim/resourceable.rb +15 -6
- data/lib/decidim/scopable.rb +35 -1
- data/lib/decidim/scopable_feature.rb +16 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.ca.js +0 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.es.js +0 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.eu.js +0 -0
- data/vendor/assets/javascripts/datepicker-locales/foundation-datepicker.fi.js +0 -0
- data/vendor/assets/javascripts/leaflet.markercluster.js +0 -0
- metadata +91 -38
- data/app/commands/decidim/remove_admin.rb +0 -25
- data/app/helpers/decidim/feature_reference_helper.rb +0 -25
- data/lib/decidim/core/api.rb +0 -13
- data/lib/decidim/core/api/author_interface.rb +0 -18
- data/lib/decidim/core/api/decidim_type.rb +0 -17
- data/lib/decidim/core/api/localized_string_type.rb +0 -12
- data/lib/decidim/core/api/process_step_type.rb +0 -19
- data/lib/decidim/core/api/process_type.rb +0 -17
- data/lib/decidim/core/api/session_type.rb +0 -17
- data/lib/decidim/core/api/translated_field_type.rb +0 -43
- data/lib/decidim/core/api/user_group_type.rb +0 -37
- data/lib/decidim/core/api/user_type.rb +0 -39
- data/lib/decidim/devise_failure_app.rb +0 -36
- data/lib/decidim/has_scope.rb +0 -25
- data/lib/decidim/i18n_exceptions.rb +0 -15
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module AdminLog
|
5
|
+
# This class holds the logic to present a `Decidim::StaticPage`
|
6
|
+
# for the `AdminLog` log.
|
7
|
+
#
|
8
|
+
# Usage should be automatic and you shouldn't need to call this class
|
9
|
+
# directly, but here's an example:
|
10
|
+
#
|
11
|
+
# action_log = Decidim::ActionLog.last
|
12
|
+
# view_helpers # => this comes from the views
|
13
|
+
# StaticPagePresenter.new(action_log, view_helpers).present
|
14
|
+
class StaticPagePresenter < Decidim::Log::BasePresenter
|
15
|
+
private
|
16
|
+
|
17
|
+
def diff_fields_mapping
|
18
|
+
{
|
19
|
+
content: :i18n,
|
20
|
+
slug: :default,
|
21
|
+
title: :i18n
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Private: Caches the object that will be responsible of presenting the static page.
|
26
|
+
# Overwrites the method so that we can use a custom presenter to show the correct
|
27
|
+
# path for ther page.
|
28
|
+
#
|
29
|
+
# Returns an object that responds to `present`.
|
30
|
+
def resource_presenter
|
31
|
+
@resource_presenter ||= Decidim::AdminLog::StaticPageResourcePresenter.new(action_log.resource, h, action_log.extra["resource"])
|
32
|
+
end
|
33
|
+
|
34
|
+
def i18n_labels_scope
|
35
|
+
"activemodel.attributes.static_page"
|
36
|
+
end
|
37
|
+
|
38
|
+
def action_string
|
39
|
+
case action
|
40
|
+
when "create", "delete", "update"
|
41
|
+
"decidim.admin_log.static_page.#{action}"
|
42
|
+
else
|
43
|
+
super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module AdminLog
|
5
|
+
# This class extends the default resource presenter for logs, so that
|
6
|
+
# it can properly link to the static page.
|
7
|
+
class StaticPageResourcePresenter < Decidim::Log::ResourcePresenter
|
8
|
+
private
|
9
|
+
|
10
|
+
# Private: Finds the public link for the given static page..
|
11
|
+
#
|
12
|
+
# Returns an HTML-safe String.
|
13
|
+
def resource_path
|
14
|
+
@resource_path ||= h.decidim.page_path(resource)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module AdminLog
|
5
|
+
# This class holds the logic to present a `Decidim::UserGroup`
|
6
|
+
# for the `AdminLog` log.
|
7
|
+
#
|
8
|
+
# Usage should be automatic and you shouldn't need to call this class
|
9
|
+
# directly, but here's an example:
|
10
|
+
#
|
11
|
+
# action_log = Decidim::ActionLog.last
|
12
|
+
# view_helpers # => this comes from the views
|
13
|
+
# UserGroupPresenter.new(action_log, view_helpers).present
|
14
|
+
class UserGroupPresenter < Decidim::Log::BasePresenter
|
15
|
+
private
|
16
|
+
|
17
|
+
def has_diff?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def action_string
|
22
|
+
case action
|
23
|
+
when "verify", "reject"
|
24
|
+
"decidim.admin_log.user_group.#{action}"
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module AdminLog
|
5
|
+
# This class holds the logic to present a `Decidim::User`
|
6
|
+
# for the `AdminLog` log.
|
7
|
+
#
|
8
|
+
# Usage should be automatic and you shouldn't need to call this class
|
9
|
+
# directly, but here's an example:
|
10
|
+
#
|
11
|
+
# action_log = Decidim::ActionLog.last
|
12
|
+
# view_helpers # => this comes from the views
|
13
|
+
# UserPresenter.new(action_log, view_helpers).present
|
14
|
+
class UserPresenter < Decidim::Log::BasePresenter
|
15
|
+
private
|
16
|
+
|
17
|
+
def action_string
|
18
|
+
case action
|
19
|
+
when "invite", "officialize", "remove_from_admin", "unofficialize"
|
20
|
+
"decidim.admin_log.user.#{action}"
|
21
|
+
else
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def i18n_params
|
27
|
+
super.merge(
|
28
|
+
role: I18n.t("models.user.fields.roles.#{user_role}", scope: "decidim.admin")
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
def user_role
|
33
|
+
action_log.extra.dig("extra", "invited_user_role")
|
34
|
+
end
|
35
|
+
|
36
|
+
def user_badge
|
37
|
+
action_log.extra.dig("extra", "officialized_user_badge") || Hash.new("")
|
38
|
+
end
|
39
|
+
|
40
|
+
def previous_user_badge
|
41
|
+
action_log.extra.dig("extra", "officialized_user_badge_previous") || Hash.new("")
|
42
|
+
end
|
43
|
+
|
44
|
+
# We fake the changeset for officialization actions.
|
45
|
+
def changeset
|
46
|
+
Decidim::Log::DiffChangesetCalculator.new(
|
47
|
+
{ badge: [previous_user_badge, user_badge] },
|
48
|
+
{ badge: :i18n },
|
49
|
+
i18n_labels_scope
|
50
|
+
).changeset
|
51
|
+
end
|
52
|
+
|
53
|
+
# If the action is officialization, then we want to show the diff
|
54
|
+
def has_diff?
|
55
|
+
%w(officialize unofficialize).include?(action)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
#
|
5
|
+
# Decorator for areas
|
6
|
+
#
|
7
|
+
class AreaPresenter < SimpleDelegator
|
8
|
+
include Decidim::TranslationsHelper
|
9
|
+
|
10
|
+
def translated_name
|
11
|
+
@translated_name ||= translated_attribute name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
#
|
5
|
+
# Decorator for area types
|
6
|
+
#
|
7
|
+
class AreaTypePresenter < SimpleDelegator
|
8
|
+
include Decidim::TranslationsHelper
|
9
|
+
|
10
|
+
def translated_name
|
11
|
+
@translated_name ||= translated_attribute name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
#
|
5
|
+
# Decorator for categories
|
6
|
+
#
|
7
|
+
class CategoryPresenter < SimpleDelegator
|
8
|
+
include Decidim::TranslationsHelper
|
9
|
+
|
10
|
+
def translated_name
|
11
|
+
@translated_name ||= translated_attribute name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Log
|
5
|
+
# This class holds the logic to present a resource for any activity log.
|
6
|
+
# It is supposed to be a base class for all other log renderers, as it defines
|
7
|
+
# some helpful methods that later presenters can use.
|
8
|
+
#
|
9
|
+
# Most presenters that inherit from this class will only need to overwrite
|
10
|
+
# the `action_string` method, which defines what I18n key will be used for
|
11
|
+
# each action. Other methods that might be interesting to overwrite are those
|
12
|
+
# named `present_*`. Check the source code and the method docs to see how they
|
13
|
+
# work.
|
14
|
+
#
|
15
|
+
# See `Decidim::ActionLog#render_log` for more info on the log types and
|
16
|
+
# presenters.
|
17
|
+
#
|
18
|
+
# Usage should be automatic and you shouldn't need to call this class
|
19
|
+
# directly, but here's an example:
|
20
|
+
#
|
21
|
+
# action_log = Decidim::ActionLog.last
|
22
|
+
# view_helpers # => this comes from the views
|
23
|
+
# BasePresenter.new(action_log, view_helpers).present
|
24
|
+
class BasePresenter
|
25
|
+
# Public: Initializes the presenter.
|
26
|
+
#
|
27
|
+
# action_log - An instance of Decidim::ActionLog
|
28
|
+
# view_helpers - An object holding the view helpers at the render time.
|
29
|
+
# Most probably should come automatically from the views.
|
30
|
+
def initialize(action_log, view_helpers)
|
31
|
+
@action_log = action_log
|
32
|
+
@view_helpers = view_helpers
|
33
|
+
end
|
34
|
+
|
35
|
+
# Public: Renders the given `action_log`.
|
36
|
+
#
|
37
|
+
# action_log - An instance of Decidim::ActionLog.last
|
38
|
+
# view_helpers - An object holding the view helpers at the render time.
|
39
|
+
# Most probably should come automatically from the views.
|
40
|
+
#
|
41
|
+
# Returns an HTML-safe String.
|
42
|
+
def present
|
43
|
+
present_action_log
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
attr_reader :action_log, :view_helpers
|
49
|
+
alias h view_helpers
|
50
|
+
|
51
|
+
delegate :action, to: :action_log
|
52
|
+
|
53
|
+
# Private: Caches the object that will be responsible of presenting the space
|
54
|
+
# where the action is performed.
|
55
|
+
#
|
56
|
+
# Returns an object that responds to `present`.
|
57
|
+
def space_presenter
|
58
|
+
@space_presenter ||= Decidim::Log::SpacePresenter.new(
|
59
|
+
action_log.participatory_space,
|
60
|
+
h,
|
61
|
+
action_log.extra["participatory_space"]
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Private: Caches the object that will be responsible of presenting the resource
|
66
|
+
# affected by the given action.
|
67
|
+
#
|
68
|
+
# Returns an object that responds to `present`.
|
69
|
+
def resource_presenter
|
70
|
+
@resource_presenter ||= Decidim::Log::ResourcePresenter.new(action_log.resource, h, action_log.extra["resource"])
|
71
|
+
end
|
72
|
+
|
73
|
+
# Private: Caches the object that will be responsible of presenting the user
|
74
|
+
# that performed the given action.
|
75
|
+
#
|
76
|
+
# Returns an object that responds to `present`.
|
77
|
+
def user_presenter
|
78
|
+
@user_presenter ||= Decidim::Log::UserPresenter.new(action_log.user, h, action_log.extra["user"])
|
79
|
+
end
|
80
|
+
|
81
|
+
# Private: Presents the date the action was performed.
|
82
|
+
#
|
83
|
+
# Returns an HTML-safe String.
|
84
|
+
def present_log_date
|
85
|
+
h.content_tag(:div, class: "logs__log__date") do
|
86
|
+
h.localize(action_log.created_at, format: :decidim_short)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Private: Presents the dropdown, if needed, to display the diff.
|
91
|
+
#
|
92
|
+
# Returns an HTML-safe String.
|
93
|
+
def present_dropdown
|
94
|
+
return h.content_tag(:div, "", class: "logs__log__actions") unless has_diff?
|
95
|
+
|
96
|
+
h.content_tag(:div, class: "logs__log__actions") do
|
97
|
+
h.content_tag(:a, "", class: "logs__log__actions-dropdown", data: { toggle: h.dom_id(action_log) })
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Private presents the explanation of the action. It will
|
102
|
+
# hold the author name, the action type, the resource affected
|
103
|
+
# and the participatory space the resource belongs to.
|
104
|
+
#
|
105
|
+
# Returns an HTML-safe String.
|
106
|
+
def present_explanation
|
107
|
+
h.content_tag(:div, class: "logs__log__explanation") do
|
108
|
+
I18n.t(
|
109
|
+
action_string,
|
110
|
+
i18n_params
|
111
|
+
).html_safe
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Private: Presents the contents of the log.
|
116
|
+
# It holds the date of the action and the explanation.
|
117
|
+
#
|
118
|
+
# Returns an HTML-safe String.
|
119
|
+
def present_content
|
120
|
+
h.content_tag(:div, class: "logs__log__content") do
|
121
|
+
present_log_date + present_explanation + present_dropdown
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Private: Caches the object that will be responsible of presenting the diff
|
126
|
+
# of the given action.
|
127
|
+
#
|
128
|
+
# Returns an object that responds to `present` and `visible?`.
|
129
|
+
def diff_presenter
|
130
|
+
@diff_presenter ||= Decidim::Log::DiffPresenter.new(
|
131
|
+
changeset,
|
132
|
+
view_helpers,
|
133
|
+
show_previous_value?: show_previous_value_in_diff?
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Private: Presents the diff of the log, if needed
|
138
|
+
# It holds the names of the attributes that have changed,
|
139
|
+
# and the old and new values.
|
140
|
+
#
|
141
|
+
# Returns an HTML-safe String.
|
142
|
+
def present_diff
|
143
|
+
return "".html_safe unless has_diff?
|
144
|
+
|
145
|
+
diff_presenter.present
|
146
|
+
end
|
147
|
+
|
148
|
+
# Private: Presents the log content with a default form.
|
149
|
+
#
|
150
|
+
# Returns an HTML-safe String.
|
151
|
+
def present_action_log
|
152
|
+
classes = ["logs__log"] + action_log_extra_classes.to_a
|
153
|
+
h.content_tag(:li, id: h.dom_id(action_log), class: classes.join(" "), data: { toggler: ".logs__log--expanded" }) do
|
154
|
+
h.concat(present_content)
|
155
|
+
h.concat(present_diff)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Private: Finds the name of the I18n key that will be used for the
|
160
|
+
# current log action.
|
161
|
+
#
|
162
|
+
# Returns a String.
|
163
|
+
def action_string
|
164
|
+
case action.to_s
|
165
|
+
when "create", "update", "delete"
|
166
|
+
generate_action_string(action)
|
167
|
+
else
|
168
|
+
generate_action_string(:unknown_action)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Private: Generates the correct action string considering if
|
173
|
+
# the space is present or not.
|
174
|
+
#
|
175
|
+
# action - A String with the name of the action
|
176
|
+
#
|
177
|
+
# Returns a String.
|
178
|
+
def generate_action_string(action)
|
179
|
+
string = if action_log.participatory_space.present?
|
180
|
+
"#{action}_with_space"
|
181
|
+
else
|
182
|
+
action
|
183
|
+
end
|
184
|
+
"decidim.log.base_presenter.#{string}"
|
185
|
+
end
|
186
|
+
|
187
|
+
# Private: The params to be sent to the i18n string.
|
188
|
+
#
|
189
|
+
# Returns a Hash.
|
190
|
+
def i18n_params
|
191
|
+
{
|
192
|
+
user_name: user_presenter.present,
|
193
|
+
resource_name: resource_presenter.present,
|
194
|
+
space_name: space_presenter.present
|
195
|
+
}
|
196
|
+
end
|
197
|
+
|
198
|
+
# Private: Calculates if the diff has to be shown or not.
|
199
|
+
#
|
200
|
+
# Returns a Boolean.
|
201
|
+
def has_diff?
|
202
|
+
%w(update create).include?(action.to_s) && action_log.version.present?
|
203
|
+
end
|
204
|
+
|
205
|
+
# Private: Calculates whether the diff should show the previous value
|
206
|
+
# or not, based on the current action name.
|
207
|
+
#
|
208
|
+
# Returns a Boolean.
|
209
|
+
def show_previous_value_in_diff?
|
210
|
+
action != "create"
|
211
|
+
end
|
212
|
+
|
213
|
+
# Private: Sets a default list of attributes to be rendered in
|
214
|
+
# the diff, and how they should be rendered. Custom renderers
|
215
|
+
# will probably want to overwrite this method to fulfill their
|
216
|
+
# needs.
|
217
|
+
#
|
218
|
+
# When the value is `nil`, then it renders all fields.
|
219
|
+
#
|
220
|
+
# Returns a Hash or `nil`.
|
221
|
+
def diff_fields_mapping
|
222
|
+
nil
|
223
|
+
end
|
224
|
+
|
225
|
+
# Private: The I18n scope where the resource fields are found, so
|
226
|
+
# the diff can properly generate the labels.
|
227
|
+
#
|
228
|
+
# Returns a String.
|
229
|
+
def i18n_labels_scope; end
|
230
|
+
|
231
|
+
# Private: Holds a list of extra classes to apply to the action log
|
232
|
+
# HTML element.
|
233
|
+
#
|
234
|
+
# Returns an Array of Strings.
|
235
|
+
def action_log_extra_classes
|
236
|
+
return ["logs__log--deletion"] if action.to_s == "delete"
|
237
|
+
[]
|
238
|
+
end
|
239
|
+
|
240
|
+
# Private: Calculates the changeset to be rendered. Uses the values
|
241
|
+
# from the `diff_fields_mapping` method.
|
242
|
+
#
|
243
|
+
# Returns an Array of Hashes.
|
244
|
+
def changeset
|
245
|
+
Decidim::Log::DiffChangesetCalculator.new(
|
246
|
+
action_log.version.changeset,
|
247
|
+
diff_fields_mapping,
|
248
|
+
i18n_labels_scope
|
249
|
+
).changeset
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|