decidim-assemblies 0.10.1 → 0.11.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/config/decidim_assemblies_manifest.js +1 -0
- data/app/assets/javascripts/decidim/assemblies/admin/assemblies.js.es6 +57 -4
- data/app/assets/javascripts/decidim/assemblies/assemblies.js.es6 +18 -0
- data/app/commands/decidim/assemblies/admin/copy_assembly.rb +9 -9
- data/app/commands/decidim/assemblies/admin/create_assembly.rb +33 -1
- data/app/commands/decidim/assemblies/admin/create_assembly_admin.rb +2 -2
- data/app/commands/decidim/assemblies/admin/update_assembly.rb +31 -1
- data/app/constraints/decidim/assemblies/{current_feature.rb → current_component.rb} +7 -7
- data/app/controllers/decidim/assemblies/admin/assemblies_controller.rb +17 -6
- data/app/controllers/decidim/assemblies/admin/{feature_permissions_controller.rb → component_permissions_controller.rb} +2 -2
- data/app/controllers/decidim/assemblies/admin/{features_controller.rb → components_controller.rb} +2 -2
- data/app/controllers/decidim/assemblies/admin/participatory_space_private_users_controller.rb +26 -0
- data/app/controllers/decidim/assemblies/assemblies_controller.rb +10 -4
- data/app/controllers/decidim/assemblies/assembly_widgets_controller.rb +1 -1
- data/app/forms/decidim/assemblies/admin/assembly_copy_form.rb +1 -1
- data/app/forms/decidim/assemblies/admin/assembly_form.rb +63 -2
- data/app/helpers/decidim/assemblies/admin/assemblies_helper.rb +20 -0
- data/app/helpers/decidim/assemblies/assemblies_helper.rb +51 -0
- data/app/models/decidim/assemblies/abilities/admin/admin_ability.rb +1 -0
- data/app/models/decidim/assemblies/abilities/admin/assembly_admin_ability.rb +3 -3
- data/app/models/decidim/assemblies/abilities/admin/assembly_moderator_ability.rb +1 -1
- data/app/models/decidim/assembly.rb +102 -2
- data/app/presenters/decidim/assemblies/admin_log/assembly_presenter.rb +20 -1
- data/app/presenters/decidim/assemblies/assembly_stats_presenter.rb +9 -9
- data/app/presenters/decidim/log/value_types/assembly_presenter.rb +28 -0
- data/app/queries/decidim/assemblies/organization_prioritized_assemblies.rb +3 -2
- data/app/queries/decidim/assemblies/organization_published_assemblies.rb +3 -1
- data/app/queries/decidim/assemblies/visible_assemblies.rb +20 -0
- data/app/views/decidim/assemblies/_assembly.html.erb +1 -1
- data/app/views/decidim/assemblies/admin/assemblies/_form.html.erb +76 -1
- data/app/views/decidim/assemblies/admin/assemblies/edit.html.erb +3 -4
- data/app/views/decidim/assemblies/admin/assemblies/index.html.erb +20 -4
- data/app/views/decidim/assemblies/admin/assemblies/new.html.erb +2 -2
- data/app/views/decidim/assemblies/admin/assembly_copies/_form.html.erb +1 -1
- data/app/views/decidim/assemblies/admin/assembly_copies/new.html.erb +1 -1
- data/app/views/decidim/assemblies/admin/assembly_user_roles/edit.html.erb +1 -1
- data/app/views/decidim/assemblies/admin/assembly_user_roles/index.html.erb +1 -1
- data/app/views/decidim/assemblies/admin/assembly_user_roles/new.html.erb +1 -1
- data/app/views/decidim/assemblies/assemblies/_nav_breadcumb.html.erb +11 -0
- data/app/views/decidim/assemblies/assemblies/_promoted_assembly.html.erb +1 -1
- data/app/views/decidim/assemblies/assemblies/_statistics.html.erb +1 -1
- data/app/views/decidim/assemblies/assemblies/index.html.erb +1 -1
- data/app/views/decidim/assemblies/assemblies/show.html.erb +129 -7
- data/app/views/decidim/assemblies/assembly_widgets/show.html.erb +1 -1
- data/app/views/layouts/decidim/_assembly_header.html.erb +13 -13
- data/app/views/layouts/decidim/admin/assemblies.html.erb +1 -1
- data/app/views/layouts/decidim/admin/assembly.html.erb +15 -10
- data/app/views/layouts/decidim/assembly.html.erb +2 -2
- data/config/locales/ca.yml +71 -1
- data/config/locales/en.yml +71 -1
- data/config/locales/es.yml +71 -1
- data/config/locales/eu.yml +71 -1
- data/config/locales/fi.yml +71 -1
- data/config/locales/fr.yml +88 -18
- data/config/locales/gl.yml +71 -1
- data/config/locales/it.yml +71 -1
- data/config/locales/nl.yml +105 -35
- data/config/locales/pl.yml +71 -1
- data/config/locales/pt-BR.yml +71 -1
- data/config/locales/pt.yml +71 -1
- data/config/locales/ru.yml +0 -1
- data/config/locales/sv.yml +71 -1
- data/config/locales/uk.yml +0 -1
- data/db/migrate/20180124083729_add_private_to_assemblies.rb +7 -0
- data/db/migrate/20180226103942_add_parent_child_relation_to_assemblies.rb +22 -0
- data/db/migrate/20180302121116_add_fields_to_assemblies.rb +25 -0
- data/lib/decidim/assemblies/admin_engine.rb +11 -5
- data/lib/decidim/assemblies/engine.rb +7 -7
- data/lib/decidim/assemblies/participatory_space.rb +89 -34
- data/lib/decidim/assemblies/test/factories.rb +24 -0
- data/lib/decidim/assemblies/version.rb +1 -1
- metadata +23 -13
@@ -23,8 +23,8 @@ module Decidim
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def define_assembly_abilities
|
26
|
-
can :manage,
|
27
|
-
can_manage_assembly?(
|
26
|
+
can :manage, Component do |component|
|
27
|
+
can_manage_assembly?(component.participatory_space)
|
28
28
|
end
|
29
29
|
|
30
30
|
can :manage, Category do |category|
|
@@ -48,7 +48,7 @@ module Decidim
|
|
48
48
|
end
|
49
49
|
|
50
50
|
can [:unreport, :hide], Reportable do |reportable|
|
51
|
-
can_manage_assembly?(reportable.
|
51
|
+
can_manage_assembly?(reportable.component.participatory_space)
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -3,7 +3,22 @@
|
|
3
3
|
module Decidim
|
4
4
|
# Interaction between a user and an organization can be done via an Assembly.
|
5
5
|
# It's a unit of action from the Organization point of view that groups
|
6
|
-
# several
|
6
|
+
# several components (proposals, debates...) that can be enabled or disabled.
|
7
|
+
#
|
8
|
+
# An assembly can have children. This is implemented using a PostgreSQL extension: LTREE
|
9
|
+
# The LTREE extension allows us to save, query on and manipulate trees (hierarchical data
|
10
|
+
# structures). It uses the path enumeration algorithm, which calls for each node in the
|
11
|
+
# tree to record the path from the root you would have to follow to reach that node.
|
12
|
+
#
|
13
|
+
# We use the `parents_path` column to save the path and query the tree. Example:
|
14
|
+
#
|
15
|
+
# A (root assembly) parent = null, parents_path = A
|
16
|
+
# B (root assembly) parent = null, parents_path = B
|
17
|
+
# |- C (child assembly of B, descendant of B) parent = B, parents_path = B.C
|
18
|
+
# |- D (child assembly of C, descendant of B,C) parent = C, parents_path = B.C.D
|
19
|
+
# |- E (child assembly of C, descendant of B,C) parent = C, parents_path = B.C.E
|
20
|
+
# |- F (child assembly of E, descendant of B,C,E) parent = E, parents_path = B.C.E.F
|
21
|
+
#
|
7
22
|
class Assembly < ApplicationRecord
|
8
23
|
include Decidim::HasAttachments
|
9
24
|
include Decidim::HasAttachmentCollections
|
@@ -14,6 +29,12 @@ module Decidim
|
|
14
29
|
include Decidim::HasReference
|
15
30
|
include Decidim::Traceable
|
16
31
|
include Decidim::Loggable
|
32
|
+
include Decidim::ParticipatorySpaceResourceable
|
33
|
+
include Decidim::HasPrivateUsers
|
34
|
+
|
35
|
+
SOCIAL_HANDLERS = [:twitter, :facebook, :instagram, :youtube, :github].freeze
|
36
|
+
ASSEMBLY_TYPES = %w(government executive consultative_advisory participatory working_group commission others).freeze
|
37
|
+
CREATED_BY = %w(city_council public others).freeze
|
17
38
|
|
18
39
|
belongs_to :organization,
|
19
40
|
foreign_key: "decidim_organization_id",
|
@@ -28,7 +49,10 @@ module Decidim
|
|
28
49
|
dependent: :destroy,
|
29
50
|
as: :participatory_space
|
30
51
|
|
31
|
-
has_many :
|
52
|
+
has_many :components, as: :participatory_space, dependent: :destroy
|
53
|
+
|
54
|
+
has_many :children, foreign_key: "parent_id", class_name: "Decidim::Assembly", inverse_of: :parent, dependent: :destroy
|
55
|
+
belongs_to :parent, foreign_key: "parent_id", class_name: "Decidim::Assembly", inverse_of: :children, optional: true, counter_cache: :children_count
|
32
56
|
|
33
57
|
validates :slug, uniqueness: { scope: :organization }
|
34
58
|
validates :slug, presence: true, format: { with: Decidim::Assembly.slug_format }
|
@@ -36,6 +60,15 @@ module Decidim
|
|
36
60
|
mount_uploader :hero_image, Decidim::HeroImageUploader
|
37
61
|
mount_uploader :banner_image, Decidim::BannerImageUploader
|
38
62
|
|
63
|
+
scope :visible_for, lambda { |user|
|
64
|
+
joins("LEFT JOIN decidim_participatory_space_private_users ON
|
65
|
+
decidim_participatory_space_private_users.privatable_to_id = #{table_name}.id")
|
66
|
+
.where("(private_space = ? and decidim_participatory_space_private_users.decidim_user_id = ?)
|
67
|
+
or private_space = ? or (private_space = ? and is_transparent = ?)", true, user, false, true, true)
|
68
|
+
}
|
69
|
+
|
70
|
+
after_create :set_parents_path
|
71
|
+
after_update :set_parents_path, :update_children_paths, if: :saved_change_to_parent_id?
|
39
72
|
# Scope to return only the promoted assemblies.
|
40
73
|
#
|
41
74
|
# Returns an ActiveRecord::Relation.
|
@@ -54,5 +87,72 @@ module Decidim
|
|
54
87
|
def to_param
|
55
88
|
slug
|
56
89
|
end
|
90
|
+
|
91
|
+
def self_and_ancestors
|
92
|
+
self.class.where("#{self.class.table_name}.parents_path @> ?", parents_path).order("string_to_array(#{self.class.table_name}.parents_path::text, '.')")
|
93
|
+
end
|
94
|
+
|
95
|
+
def ancestors
|
96
|
+
self_and_ancestors.where.not(id: id)
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.private_assemblies
|
100
|
+
where(private_space: true)
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.public_spaces
|
104
|
+
super.where(private_space: false).or(Decidim::Assembly.where(private_space: true).where(is_transparent: true))
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
# When an assembly changes their parent, we need to update the parents_path attribute
|
110
|
+
# E.g. If we have the following tree:
|
111
|
+
#
|
112
|
+
# A (root assembly) parent = null, parents_path = A
|
113
|
+
# B (root assembly) parent = null, parents_path = B
|
114
|
+
# |- C (child assembly of B, descendant of B) parent = B, parents_path = B.C
|
115
|
+
# |- D (child assembly of C, descendant of B,C) parent = C, parents_path = B.C.D
|
116
|
+
#
|
117
|
+
# And we change the parent of C to A, this function updates their parents_path attribute:
|
118
|
+
#
|
119
|
+
# |- C (child assembly of *A*, descendant of *A*) parent = *A*, parents_path = *A*.C
|
120
|
+
#
|
121
|
+
# Note: updating parents_path in their descendants is done in the `update_children_paths` function.
|
122
|
+
#
|
123
|
+
# rubocop:disable Rails/SkipsModelValidations
|
124
|
+
def set_parents_path
|
125
|
+
update_column(:parents_path, [parent&.parents_path, id].select(&:present?).join("."))
|
126
|
+
end
|
127
|
+
# rubocop:enable Rails/SkipsModelValidations
|
128
|
+
|
129
|
+
# When an assembly changes their parent, we need to update the parents_path attribute on their descendants
|
130
|
+
# E.g. If we have the following tree:
|
131
|
+
#
|
132
|
+
# A (root assembly) parent = null, parents_path = A
|
133
|
+
# B (root assembly) parent = null, parents_path = B
|
134
|
+
# |- C (child assembly of B, descendant of B) parent = B, parents_path = B.C
|
135
|
+
# |- D (child assembly of C, descendant of B,C) parent = C, parents_path = B.C.D
|
136
|
+
# |- E (child assembly of C, descendant of B,C) parent = C, parents_path = B.C.E
|
137
|
+
# |- F (child assembly of E, descendant of B,C,E) parent = E, parents_path = B.C.E.F
|
138
|
+
#
|
139
|
+
# And we change the parent of C to A, this function updates the parents_path attribute in their
|
140
|
+
# descendants assemblies (D, E and F):
|
141
|
+
#
|
142
|
+
# |- D (child assembly of C, descendant of *A*,C) parent = C, parents_path = *A*.C.D
|
143
|
+
# |- E (child assembly of C, descendant of *A*,C) parent = C, parents_path = *A*.C.E
|
144
|
+
# |- F (child assembly of E, descendant of *A*,C,E) parent = E, parents_path = *A*.C.E.F
|
145
|
+
#
|
146
|
+
# Note: updating parents_path of C (the assembly in which we have changed the parent) is done in the `set_parents_path` function.
|
147
|
+
#
|
148
|
+
# rubocop:disable Rails/SkipsModelValidations
|
149
|
+
def update_children_paths
|
150
|
+
self.class.where(
|
151
|
+
["#{self.class.table_name}.parents_path <@ :old_path AND #{self.class.table_name}.id != :id", old_path: parents_path_before_last_save, id: id]
|
152
|
+
).update_all(
|
153
|
+
["parents_path = :new_path || subpath(parents_path, nlevel(:old_path))", new_path: parents_path, old_path: parents_path_before_last_save]
|
154
|
+
)
|
155
|
+
end
|
156
|
+
# rubocop:enable Rails/SkipsModelValidations
|
57
157
|
end
|
58
158
|
end
|
@@ -35,7 +35,26 @@ module Decidim
|
|
35
35
|
slug: :default,
|
36
36
|
subtitle: :i18n,
|
37
37
|
target: :i18n,
|
38
|
-
title: :i18n
|
38
|
+
title: :i18n,
|
39
|
+
purpose_of_action: :i18n,
|
40
|
+
assembly_type: :string,
|
41
|
+
assembly_type_other: :i8n,
|
42
|
+
creation_date: :date,
|
43
|
+
created_by: :string,
|
44
|
+
created_by_other: :i18n,
|
45
|
+
duration: :date,
|
46
|
+
included_at: :date,
|
47
|
+
closing_date: :date,
|
48
|
+
closing_date_reason: :i18n,
|
49
|
+
internal_organisation: :i18n,
|
50
|
+
is_transparent: :boolean,
|
51
|
+
special_features: :i18n,
|
52
|
+
twitter_handler: :string,
|
53
|
+
facebook_handler: :string,
|
54
|
+
instagram_handler: :string,
|
55
|
+
youtube_handler: :string,
|
56
|
+
github_handler: :string,
|
57
|
+
parent_id: :assembly
|
39
58
|
}
|
40
59
|
end
|
41
60
|
|
@@ -9,8 +9,8 @@ module Decidim
|
|
9
9
|
|
10
10
|
# Public: Render a collection of primary stats.
|
11
11
|
def highlighted
|
12
|
-
highlighted_stats =
|
13
|
-
highlighted_stats = highlighted_stats.concat(
|
12
|
+
highlighted_stats = component_stats(priority: StatsRegistry::HIGH_PRIORITY)
|
13
|
+
highlighted_stats = highlighted_stats.concat(component_stats(priority: StatsRegistry::MEDIUM_PRIORITY))
|
14
14
|
highlighted_stats = highlighted_stats.reject(&:empty?)
|
15
15
|
highlighted_stats = highlighted_stats.reject { |_manifest, _name, data| data.zero? }
|
16
16
|
grouped_highlighted_stats = highlighted_stats.group_by { |stats| stats.first.name }
|
@@ -30,22 +30,22 @@ module Decidim
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
def
|
34
|
-
Decidim.
|
35
|
-
|
33
|
+
def component_stats(conditions)
|
34
|
+
Decidim.component_manifests.map do |component_manifest|
|
35
|
+
component_manifest.stats.filter(conditions).with_context(published_components).map { |name, data| [component_manifest, name, data] }.flatten
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def render_stats_data(
|
39
|
+
def render_stats_data(component_manifest, name, data, index)
|
40
40
|
safe_join([
|
41
|
-
index.zero? ? manifest_icon(
|
41
|
+
index.zero? ? manifest_icon(component_manifest) : " / ".html_safe,
|
42
42
|
content_tag(:span, "#{number_with_delimiter(data)} " + I18n.t(name, scope: "decidim.assemblies.statistics"),
|
43
43
|
class: "#{name} process_stats-text")
|
44
44
|
])
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
48
|
-
@
|
47
|
+
def published_components
|
48
|
+
@published_components ||= Component.where(participatory_space: assembly).published
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Log
|
5
|
+
module ValueTypes
|
6
|
+
# This class presents the given value as a Decidim::Assembly. Check
|
7
|
+
# the `DefaultPresenter` for more info on how value
|
8
|
+
# presenters work.
|
9
|
+
class AssemblyPresenter < DefaultPresenter
|
10
|
+
# Public: Presents the value as a Decidim::Assembly. If the assembly
|
11
|
+
# can be found, it shows its title. Otherwise it shows its ID.
|
12
|
+
#
|
13
|
+
# Returns an HTML-safe String.
|
14
|
+
def present
|
15
|
+
return unless value
|
16
|
+
return h.translated_attribute(assembly.title) if assembly
|
17
|
+
I18n.t("not_found", id: value, scope: "decidim.log.value_types.assembly_presenter")
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def assembly
|
23
|
+
@assembly ||= Decidim::Assembly.find_by(id: value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -5,13 +5,14 @@ module Decidim
|
|
5
5
|
# This query class filters public assemblies given an organization in a
|
6
6
|
# meaningful prioritized order.
|
7
7
|
class OrganizationPrioritizedAssemblies < Rectify::Query
|
8
|
-
def initialize(organization)
|
8
|
+
def initialize(organization, user = nil)
|
9
9
|
@organization = organization
|
10
|
+
@user = user
|
10
11
|
end
|
11
12
|
|
12
13
|
def query
|
13
14
|
Rectify::Query.merge(
|
14
|
-
OrganizationPublishedAssemblies.new(@organization),
|
15
|
+
OrganizationPublishedAssemblies.new(@organization, @user),
|
15
16
|
PrioritizedAssemblies.new
|
16
17
|
).query
|
17
18
|
end
|
@@ -4,13 +4,15 @@ module Decidim
|
|
4
4
|
module Assemblies
|
5
5
|
# This query class filters published assemblies given an organization.
|
6
6
|
class OrganizationPublishedAssemblies < Rectify::Query
|
7
|
-
def initialize(organization)
|
7
|
+
def initialize(organization, user = nil)
|
8
8
|
@organization = organization
|
9
|
+
@user = user
|
9
10
|
end
|
10
11
|
|
11
12
|
def query
|
12
13
|
Rectify::Query.merge(
|
13
14
|
OrganizationAssemblies.new(@organization),
|
15
|
+
VisibleAssemblies.new(@user),
|
14
16
|
PublishedAssemblies.new
|
15
17
|
).query
|
16
18
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Assemblies
|
5
|
+
# This query class filters assemblies given a current_user.
|
6
|
+
class VisibleAssemblies < Rectify::Query
|
7
|
+
def initialize(user)
|
8
|
+
@user = user
|
9
|
+
end
|
10
|
+
|
11
|
+
def query
|
12
|
+
if @user
|
13
|
+
Decidim::Assembly.visible_for(@user.id)
|
14
|
+
else
|
15
|
+
Decidim::Assembly.public_spaces
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<%= link_to assembly_path(assembly), class: "card__link" do %>
|
9
9
|
<h4 class="card__title"><%= translated_attribute assembly.title %></h4>
|
10
10
|
<% end %>
|
11
|
-
<p class="card__desc"><%= decidim_sanitize html_truncate(translated_attribute(assembly.short_description), length: 630, separator:
|
11
|
+
<p class="card__desc"><%= decidim_sanitize html_truncate(translated_attribute(assembly.short_description), length: 630, separator: "...") %></p>
|
12
12
|
</div>
|
13
13
|
<div class="card__footer">
|
14
14
|
<div class="card__support">
|
@@ -1,5 +1,7 @@
|
|
1
1
|
<%= javascript_include_tag "decidim/slug_form" %>
|
2
2
|
|
3
|
+
<%= form.hidden_field :parent_id, value: @form.parent_id %>
|
4
|
+
|
3
5
|
<div class="card">
|
4
6
|
<div class="card-divider">
|
5
7
|
<h2 class="card-title"><%= t "assemblies.form.title", scope: "decidim.admin" %></h2>
|
@@ -76,7 +78,7 @@
|
|
76
78
|
</div>
|
77
79
|
|
78
80
|
<div class="row column">
|
79
|
-
<%= form.select :area_id, option_groups_from_collection_for_select(current_organization.area_types, :areas, :translated_name, :id, :translated_name, current_assembly.try(:decidim_area_id)), include_blank: t(".select_an_area")
|
81
|
+
<%= form.select :area_id, option_groups_from_collection_for_select(current_organization.area_types, :areas, :translated_name, :id, :translated_name, current_assembly.try(:decidim_area_id)), include_blank: t(".select_an_area") %>
|
80
82
|
</div>
|
81
83
|
|
82
84
|
<div class="row column">
|
@@ -90,6 +92,79 @@
|
|
90
92
|
<div class="row column">
|
91
93
|
<%= form.check_box :show_statistics %>
|
92
94
|
</div>
|
95
|
+
|
96
|
+
<div class="row column">
|
97
|
+
<% if @form.processes_for_select %>
|
98
|
+
<%= form.select :participatory_processes_ids,
|
99
|
+
options_for_select(@form.processes_for_select, selected: processes_selected ),
|
100
|
+
{ include_blank: false },
|
101
|
+
{ multiple: true, class: "chosen-select" } %>
|
102
|
+
<% end %>
|
103
|
+
</div>
|
104
|
+
|
105
|
+
<div class="row column">
|
106
|
+
<%= form.translated :editor, :purpose_of_action %>
|
107
|
+
</div>
|
108
|
+
|
109
|
+
<div class="row column">
|
110
|
+
<%= form.translated :editor, :composition %>
|
111
|
+
</div>
|
112
|
+
|
113
|
+
<div class="row column">
|
114
|
+
<%= form.select :assembly_type, @form.assembly_types_for_select, { include_blank: t(".select_an_assembly_type") }, { multiple: false } %>
|
115
|
+
</div>
|
116
|
+
|
117
|
+
<div class="row column" id="assembly_type_other">
|
118
|
+
<%= form.translated :text_field, :assembly_type_other %>
|
119
|
+
</div>
|
120
|
+
|
121
|
+
<div class="row column">
|
122
|
+
<%= form.date_field :creation_date %>
|
123
|
+
</div>
|
124
|
+
|
125
|
+
<div class="row column">
|
126
|
+
<%= form.select :created_by, @form.created_by_for_select, { include_blank: t(".select_a_created_by") }, { multiple: false } %>
|
127
|
+
</div>
|
128
|
+
|
129
|
+
<div class="row column" id="created_by_other">
|
130
|
+
<%= form.translated :text_field, :created_by_other %>
|
131
|
+
</div>
|
132
|
+
|
133
|
+
<div class="row column">
|
134
|
+
<%= form.date_field :duration %>
|
135
|
+
</div>
|
136
|
+
|
137
|
+
<div class="row column">
|
138
|
+
<%= form.date_field :included_at %>
|
139
|
+
</div>
|
140
|
+
|
141
|
+
<div class="row column" id="closing_date_div">
|
142
|
+
<%= form.date_field :closing_date %>
|
143
|
+
</div>
|
144
|
+
|
145
|
+
<div class="row column" id="closing_date_reason_div">
|
146
|
+
<%= form.translated :editor, :closing_date_reason %>
|
147
|
+
</div>
|
148
|
+
|
149
|
+
<div class="row column">
|
150
|
+
<%= form.translated :editor, :internal_organisation %>
|
151
|
+
</div>
|
152
|
+
|
153
|
+
<div class="row column" id="private_space">
|
154
|
+
<%= form.check_box :private_space %>
|
155
|
+
</div>
|
156
|
+
|
157
|
+
<div class="row column" id="is_transparent">
|
158
|
+
<%= form.check_box :is_transparent %>
|
159
|
+
</div>
|
160
|
+
|
161
|
+
<div class="row column" id="special_features">
|
162
|
+
<%= form.translated :editor, :special_features %>
|
163
|
+
</div>
|
164
|
+
|
165
|
+
<div class="columns xlarge-6">
|
166
|
+
<%= form.social_field :text_field, :social_handlers, Decidim::Assembly::SOCIAL_HANDLERS, label: t("social_handlers", scope: "decidim.assemblies.admin.assemblies.form") %>
|
167
|
+
</div>
|
93
168
|
</div>
|
94
169
|
</div>
|
95
170
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<%= decidim_form_for(@form, html: { class: "form edit_assembly" }) do |f| %>
|
2
|
-
<%= render partial:
|
1
|
+
<%= decidim_form_for(@form, html: { class: "form edit_assembly assembly_form_admin" }) do |f| %>
|
2
|
+
<%= render partial: "form", object: f %>
|
3
3
|
<div class="button--double form-general-submit">
|
4
|
-
<%= f.submit t("assemblies.edit.update", scope: "decidim.admin"), class: "button"
|
4
|
+
<%= f.submit t("assemblies.edit.update", scope: "decidim.admin"), class: "button" %>
|
5
5
|
|
6
6
|
<% if can? :publish, current_assembly %>
|
7
7
|
<% if current_assembly.published? %>
|
@@ -16,4 +16,3 @@
|
|
16
16
|
<% end %>
|
17
17
|
</div>
|
18
18
|
<% end %>
|
19
|
-
|
@@ -1,7 +1,11 @@
|
|
1
1
|
<div class="card" id="assemblies">
|
2
2
|
<div class="card-divider">
|
3
3
|
<h2 class="card-title">
|
4
|
-
|
4
|
+
<% parent_assembly.self_and_ancestors.each do |assembly| %>
|
5
|
+
<%= link_to "#{translated_attribute(assembly.title)} > ", edit_assembly_path(assembly) %>
|
6
|
+
<% end if parent_assembly %>
|
7
|
+
<%= t "decidim.admin.titles.assemblies" %>
|
8
|
+
<%= link_to t("actions.new", scope: "decidim.admin", name: t("models.assembly.name", scope: "decidim.admin")), new_assembly_path(parent_id: parent_assembly&.id), class: "button tiny button--title" if can? :create, Decidim::Assembly %>
|
5
9
|
</h2>
|
6
10
|
</div>
|
7
11
|
<div class="card-section">
|
@@ -11,6 +15,7 @@
|
|
11
15
|
<tr>
|
12
16
|
<th><%= t("models.assembly.fields.title", scope: "decidim.admin") %></th>
|
13
17
|
<th><%= t("models.assembly.fields.created_at", scope: "decidim.admin") %></th>
|
18
|
+
<th><%= t("models.assembly.fields.private", scope: "decidim.admin") %></th>
|
14
19
|
<th class="table-list__actions"><%= t("models.assembly.fields.published", scope: "decidim.admin") %></th>
|
15
20
|
<th></th>
|
16
21
|
</tr>
|
@@ -20,7 +25,7 @@
|
|
20
25
|
<tr>
|
21
26
|
<td>
|
22
27
|
<% if assembly.promoted? %>
|
23
|
-
<span data-tooltip class="icon-state icon-highlight" aria-haspopup="true"
|
28
|
+
<span data-tooltip class="icon-state icon-highlight" aria-haspopup="true" data-disable-hover="false" title="<%= t("models.assembly.fields.promoted", scope: "decidim.admin") %>">
|
24
29
|
<%= icon "star" %>
|
25
30
|
</span>
|
26
31
|
<% end %>
|
@@ -37,11 +42,18 @@
|
|
37
42
|
<td>
|
38
43
|
<%= l assembly.created_at, format: :short %>
|
39
44
|
</td>
|
45
|
+
<td class="table-list__state">
|
46
|
+
<% if assembly.private_space? %>
|
47
|
+
<strong class="text-alert"><%= t("assemblies.index.private", scope: "decidim.admin") %></strong>
|
48
|
+
<% else %>
|
49
|
+
<strong class="text-success"><%= t("assemblies.index.public", scope: "decidim.admin") %></strong>
|
50
|
+
<% end %>
|
51
|
+
</td>
|
40
52
|
<td class="table-list__state">
|
41
53
|
<% if assembly.published? %>
|
42
|
-
<strong class="text-success"><%= t(
|
54
|
+
<strong class="text-success"><%= t("assemblies.index.published", scope: "decidim.admin") %></strong>
|
43
55
|
<% else %>
|
44
|
-
<strong class="text-alert"><%= t(
|
56
|
+
<strong class="text-alert"><%= t("assemblies.index.not_published", scope: "decidim.admin") %></strong>
|
45
57
|
<% end %>
|
46
58
|
</td>
|
47
59
|
<td class="table-list__actions">
|
@@ -53,6 +65,10 @@
|
|
53
65
|
<%= icon_link_to "pencil", edit_assembly_path(assembly), t("actions.configure", scope: "decidim.admin"), class: "action-icon--new" %>
|
54
66
|
<% end %>
|
55
67
|
|
68
|
+
<% if assembly.children_count > 0 || can?(:create, assembly) %>
|
69
|
+
<%= icon_link_to "dial", decidim_admin_assemblies.assemblies_path(parent_id: assembly.id), t("decidim.admin.titles.assemblies"), class: "action-icon--dial" %>
|
70
|
+
<% end %>
|
71
|
+
|
56
72
|
<% if can? :preview, assembly %>
|
57
73
|
<%= icon_link_to "eye", decidim_assemblies.assembly_path(assembly), t("actions.preview", scope: "decidim.admin"), class: "action-icon--preview" %>
|
58
74
|
<% end %>
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<%= t "assemblies.new.title", scope: "decidim.admin" %>
|
3
3
|
</h2>
|
4
4
|
|
5
|
-
<%= decidim_form_for(@form, html: { class: "form new_assembly" }) do |f| %>
|
6
|
-
<%= render partial:
|
5
|
+
<%= decidim_form_for(@form, html: { class: "form new_assembly assembly_form_admin" }) do |f| %>
|
6
|
+
<%= render partial: "form", object: f %>
|
7
7
|
|
8
8
|
<div class="button--double form-general-submit">
|
9
9
|
<%= f.submit t("assemblies.new.create", scope: "decidim.admin") %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= decidim_form_for(@form, url: assembly_copies_path(current_assembly), method: :post, html: { class: "form copy_assembly" }) do |f| %>
|
2
|
-
<%= render partial:
|
2
|
+
<%= render partial: "form", object: f, locals: { title: t("assembly_copies.new.title", scope: "decidim.admin"), select: t("assembly_copies.new.select", scope: "decidim.admin")} %>
|
3
3
|
|
4
4
|
<div class="button--double form-general-submit">
|
5
5
|
<%= f.submit t("assembly_copies.new.copy", scope: "decidim.admin") %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= decidim_form_for(@form, url: assembly_user_role_path(@user_role.assembly, @user_role), html: { class: "form edit_assembly_user_roles" }) do |f| %>
|
2
|
-
<%= render partial:
|
2
|
+
<%= render partial: "form", object: f, locals: { title: t("assembly_user_roles.edit.title", scope: "decidim.admin") } %>
|
3
3
|
|
4
4
|
<div class="button--double form-general-submit">
|
5
5
|
<%= f.submit t("assembly_user_roles.edit.update", scope: "decidim.admin") %>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<h2 class="card-title">
|
4
4
|
<%= t("assembly_user_roles.index.assembly_admins_title", scope: "decidim.admin") %>
|
5
5
|
<% if can? :create, Decidim::AssemblyUserRole %>
|
6
|
-
<%= link_to t("actions.new", scope: "decidim.admin", name: t("models.assembly_user_role.name", scope: "decidim.admin")), new_assembly_user_role_path(current_assembly), class:
|
6
|
+
<%= link_to t("actions.new", scope: "decidim.admin", name: t("models.assembly_user_role.name", scope: "decidim.admin")), new_assembly_user_role_path(current_assembly), class: "button tiny button--title new" %>
|
7
7
|
<% end %>
|
8
8
|
</h2>
|
9
9
|
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= decidim_form_for(@form, html: { class: "form new_assembly_user_role" }) do |f| %>
|
2
|
-
<%= render partial:
|
2
|
+
<%= render partial: "form", object: f, locals: { title: t("assembly_user_roles.new.title", scope: "decidim.admin") } %>
|
3
3
|
|
4
4
|
<div class="button--double form-general-submit">
|
5
5
|
<%= f.submit t("assembly_user_roles.new.create", scope: "decidim.admin") %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<div class="lines-breadcrumb">
|
2
|
+
<% root = assemblies.shift %>
|
3
|
+
<%= link_to translated_attribute(root.title), assembly_path(root) %>
|
4
|
+
|
5
|
+
<% assemblies.each do |assembly| %>
|
6
|
+
<span class="breadcrumb--separator">></span>
|
7
|
+
<div>
|
8
|
+
<%= link_to translated_attribute(assembly.title), assembly_path(assembly) %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
</div>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<%= link_to assembly_path(promoted_assembly), class: "card__link" do %>
|
6
6
|
<h2 class="card__title"><%= translated_attribute promoted_assembly.title %></h2>
|
7
7
|
<% end %>
|
8
|
-
<%= decidim_sanitize html_truncate(translated_attribute(promoted_assembly.short_description), length: 630, separator:
|
8
|
+
<%= decidim_sanitize html_truncate(translated_attribute(promoted_assembly.short_description), length: 630, separator: "...") %>
|
9
9
|
<%= link_to assembly_path(promoted_assembly), class: "button secondary small hollow card__button" do %>
|
10
10
|
<%= t("assemblies.promoted_assembly.more_info", scope: "layouts.decidim") %>
|
11
11
|
<% end %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<section class="extended" id="assembly-statistics" class="statistics">
|
2
2
|
<div class="row column">
|
3
|
-
<h4 class="section-heading"><%= t("statistics.headline", scope: "decidim.assemblies"
|
3
|
+
<h4 class="section-heading"><%= t("statistics.headline", scope: "decidim.assemblies") %></h3>
|
4
4
|
</div>
|
5
5
|
<div class="row">
|
6
6
|
<div class="columns small-centered mediumlarge-12 large-12 process_stats">
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<main class="wrapper">
|
4
4
|
<% if promoted_assemblies.any? %>
|
5
|
-
<section id
|
5
|
+
<section id="highlighted-assemblies" class="row section">
|
6
6
|
<h1 class="section-heading"><%= t("assemblies.index.promoted_assemblies", scope: "layouts.decidim") %></h1>
|
7
7
|
<%= render partial: "promoted_assembly", collection: promoted_assemblies, as: :promoted_assembly %>
|
8
8
|
</section>
|