Merged with master and solved conflicts

This commit is contained in:
iagirre
2018-01-10 13:23:39 +01:00
804 changed files with 21062 additions and 9208 deletions

View File

@@ -32,3 +32,4 @@ exclude_paths:
- files/
- public/
- tmp/
- vendor/

View File

@@ -11,3 +11,6 @@ insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[*.yml]
insert_final_newline = false

1
.gitignore vendored
View File

@@ -20,6 +20,7 @@
/config/database.yml
/config/secrets.yml
/config/deploy-secrets.yml
/config/maintenance.yml
/coverage

View File

@@ -1,6 +1,9 @@
inherit_from: .rubocop_todo.yml
require: rubocop-rspec
AllCops:
DisplayCopNames: true
DisplayStyleGuide: true
Include:
- '**/Rakefile'
- '**/config.ru'
@@ -9,60 +12,177 @@ AllCops:
- 'config/**/*'
- 'script/**/*'
TargetRubyVersion: 2.3
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
# to ignore them, so only the ones explicitly set in this file are enabled.
DisabledByDefault: true
Rails:
Enabled: true
Documentation:
Enabled: false
Metrics/LineLength:
Max: 140
Max: 100
Layout/IndentationConsistency:
EnforcedStyle: rails
Style/EmptyMethod:
RSpec/AlignLeftLetBrace:
Enabled: false
Style/StringLiterals:
RSpec/AlignRightLetBrace:
Enabled: false
Style/SymbolProc:
RSpec/AnyInstance:
Enabled: false
Style/FrozenStringLiteralComment:
RSpec/AroundBlock:
Enabled: true
RSpec/BeEql:
Enabled: true
RSpec/BeforeAfterAll:
Enabled: true
Capybara/CurrentPathExpectation:
Enabled: true
Capybara/FeatureMethods:
Enabled: false
Style/PercentLiteralDelimiters:
RSpec/ContextWording:
Enabled: false
Style/SymbolArray:
RSpec/DescribeClass:
Enabled: true
RSpec/DescribeMethod:
Enabled: true
RSpec/DescribeSymbol:
Enabled: true
RSpec/DescribedClass:
Enabled: true
RSpec/EmptyExampleGroup:
Enabled: true
RSpec/EmptyLineAfterSubject:
Enabled: true
RSpec/ExampleLength:
Enabled: false
Layout/EmptyLinesAroundClassBody:
RSpec/ExampleWording:
Enabled: true
RSpec/ExpectActual:
Enabled: true
RSpec/ExpectInHook:
Enabled: true
RSpec/ExpectOutput:
Enabled: true
RSpec/FilePath:
Enabled: true
RSpec/Focus:
Enabled: true
RSpec/HookArgument:
Enabled: true
RSpec/ImplicitExpect:
Enabled: true
EnforcedStyle: should
RSpec/InstanceSpy:
Enabled: true
RSpec/InstanceVariable:
Enabled: false
Layout/EmptyLinesAroundBlockBody:
RSpec/InvalidPredicateMatcher:
Enabled: true
RSpec/ItBehavesLike:
Enabled: true
RSpec/IteratedExpectation:
Enabled: true
RSpec/LeadingSubject:
Enabled: true
RSpec/LetBeforeExamples:
Enabled: true
RSpec/LetSetup:
Enabled: true
RSpec/MessageChain:
Enabled: true
RSpec/MessageExpectation:
Enabled: true
RSpec/MessageSpies:
Enabled: true
EnforcedStyle: receive
RSpec/MultipleDescribes:
Enabled: true
RSpec/MultipleExpectations:
Enabled: false
Layout/EmptyLinesAroundModuleBody:
RSpec/MultipleSubjects:
Enabled: true
RSpec/NamedSubject:
Enabled: false
Layout/SpaceBeforeBlockBraces:
Enabled: false
RSpec/NestedGroups:
Enabled: true
Max: 4
Layout/SpaceInsideBrackets:
Enabled: false
RSpec/NotToNot:
Enabled: true
Layout/SpaceInsideHashLiteralBraces:
Enabled: false
RSpec/OverwritingSetup:
Enabled: true
Layout/SpaceInsideBlockBraces:
Enabled: false
RSpec/PredicateMatcher:
Enabled: true
Layout/TrailingBlankLines:
Enabled: false
RSpec/RepeatedDescription:
Enabled: true
Rails/ApplicationRecord:
Enabled: false
RSpec/RepeatedExample:
Enabled: true
RSpec/ReturnFromStub:
Enabled: true
RSpec/ScatteredLet:
Enabled: true
RSpec/ScatteredSetup:
Enabled: true
RSpec/SharedContext:
Enabled: true
RSpec/SingleArgumentMessageChain:
Enabled: true
RSpec/SubjectStub:
Enabled: true
RSpec/VerifiedDoubles:
Enabled: true
RSpec/VoidExpect:
Enabled: true

View File

@@ -1,26 +1,25 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2017-07-07 21:23:30 +0200 using RuboCop version 0.49.1.
# on 2018-01-06 19:20:18 +0100 using RuboCop version 0.52.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
# Offense count: 45
# Offense count: 40
# Cop supports --auto-correct.
# Configuration parameters: EnforcedHashRocketStyle, SupportedHashRocketStyles, EnforcedColonStyle, SupportedColonStyles, EnforcedLastArgumentHashStyle, SupportedLastArgumentHashStyles.
# Configuration parameters: EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
# SupportedColonStyles: key, separator, table
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
Layout/AlignHash:
Exclude:
- 'app/controllers/officing/results_controller.rb'
- 'spec/controllers/legislation/annotations_controller_spec.rb'
- 'spec/features/admin/banners_spec.rb'
# Offense count: 50
# Offense count: 64
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_parameter, with_fixed_indentation
Layout/AlignParameters:
Enabled: false
@@ -33,9 +32,9 @@ Layout/ClosingParenthesisIndentation:
- 'spec/models/legislation/annotation_spec.rb'
- 'spec/rails_helper.rb'
# Offense count: 51
# Offense count: 37
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: leading, trailing
Layout/DotPosition:
Exclude:
@@ -64,15 +63,8 @@ Layout/EmptyLineAfterMagicComment:
# Offense count: 1
# Cop supports --auto-correct.
Layout/EmptyLines:
Exclude:
- 'app/controllers/admin/budget_investment_milestones_controller.rb'
# Offense count: 2
# Cop supports --auto-correct.
Layout/EmptyLinesAroundMethodBody:
Exclude:
- 'app/models/abilities/administrator.rb'
- 'lib/graph_ql/api_types_creator.rb'
# Offense count: 2
@@ -85,7 +77,7 @@ Layout/ExtraSpacing:
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: consistent, special_for_inner_method_call, special_for_inner_method_call_in_parentheses
Layout/FirstParameterIndentation:
Exclude:
@@ -93,14 +85,14 @@ Layout/FirstParameterIndentation:
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, IndentationWidth.
# Configuration parameters: IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_brackets
Layout/IndentArray:
EnforcedStyle: consistent
# Offense count: 10
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_braces
Layout/IndentHash:
Exclude:
@@ -108,7 +100,7 @@ Layout/IndentHash:
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
Layout/IndentHeredoc:
Exclude:
@@ -117,7 +109,7 @@ Layout/IndentHeredoc:
# Offense count: 10
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: normal, rails
Layout/IndentationConsistency:
Exclude:
@@ -126,13 +118,13 @@ Layout/IndentationConsistency:
- 'spec/models/legislation/draft_version_spec.rb'
- 'spec/models/proposal_spec.rb'
# Offense count: 23
# Offense count: 59
# Cop supports --auto-correct.
# Configuration parameters: Width, IgnoredPatterns.
Layout/IndentationWidth:
Enabled: false
# Offense count: 7
# Offense count: 6
# Cop supports --auto-correct.
Layout/LeadingCommentSpace:
Exclude:
@@ -140,12 +132,11 @@ Layout/LeadingCommentSpace:
- 'app/controllers/budgets/ballot/lines_controller.rb'
- 'spec/features/budgets/ballots_spec.rb'
- 'spec/features/comments/poll_questions_spec.rb'
- 'spec/features/officing/voters_spec.rb'
- 'spec/support/common_actions.rb'
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: symmetrical, new_line, same_line
Layout/MultilineArrayBraceLayout:
Exclude:
@@ -155,7 +146,7 @@ Layout/MultilineArrayBraceLayout:
# Offense count: 9
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: symmetrical, new_line, same_line
Layout/MultilineHashBraceLayout:
Exclude:
@@ -168,7 +159,7 @@ Layout/MultilineHashBraceLayout:
# Offense count: 17
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: symmetrical, new_line, same_line
Layout/MultilineMethodCallBraceLayout:
Exclude:
@@ -181,9 +172,9 @@ Layout/MultilineMethodCallBraceLayout:
- 'spec/models/legislation/annotation_spec.rb'
- 'spec/rails_helper.rb'
# Offense count: 71
# Offense count: 59
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented, indented_relative_to_receiver
Layout/MultilineMethodCallIndentation:
Exclude:
@@ -201,13 +192,12 @@ Layout/MultilineMethodCallIndentation:
- 'spec/models/proposal_spec.rb'
- 'spec/models/user_spec.rb'
# Offense count: 8
# Offense count: 5
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented
Layout/MultilineOperationIndentation:
Exclude:
- 'app/controllers/officing/results_controller.rb'
- 'app/helpers/users_helper.rb'
- 'app/helpers/valuation_helper.rb'
- 'app/models/user.rb'
@@ -226,13 +216,44 @@ Layout/SpaceBeforeFirstArg:
Exclude:
- 'spec/factories.rb'
# Offense count: 33
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBrackets.
# SupportedStyles: space, no_space, compact
# SupportedStylesForEmptyBrackets: space, no_space
Layout/SpaceInsideArrayLiteralBrackets:
Exclude:
- 'app/controllers/valuation/budget_investments_controller.rb'
- 'app/controllers/valuation/spending_proposals_controller.rb'
- 'app/helpers/admin_helper.rb'
- 'app/helpers/budgets_helper.rb'
- 'app/helpers/geozones_helper.rb'
- 'app/helpers/proposals_helper.rb'
- 'app/helpers/valuation_helper.rb'
- 'app/models/budget/investment.rb'
- 'app/models/budget/investment/milestone.rb'
- 'app/models/legislation/process.rb'
- 'app/models/legislation/proposal.rb'
- 'app/models/poll/question/answer.rb'
- 'app/models/proposal.rb'
- 'spec/factories.rb'
- 'spec/lib/graphql_spec.rb'
# Offense count: 2
# Cop supports --auto-correct.
Layout/SpaceInsideRangeLiteral:
Exclude:
- 'app/models/legislation/annotation.rb'
# Offense count: 38
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: space, no_space
Layout/SpaceInsideReferenceBrackets:
Exclude:
- 'app/helpers/settings_helper.rb'
# Offense count: 39
Lint/AmbiguousBlockAssociation:
Exclude:
- 'spec/controllers/comments_controller_spec.rb'
@@ -244,6 +265,14 @@ Lint/AmbiguousBlockAssociation:
- 'spec/models/debate_spec.rb'
- 'spec/models/proposal_spec.rb'
- 'spec/models/user_spec.rb'
- 'spec/shared/models/map_validations.rb'
# Offense count: 3
Lint/DuplicateMethods:
Exclude:
- 'app/models/budget/result.rb'
- 'lib/comment_tree.rb'
- 'lib/email_digest.rb'
# Offense count: 2
Lint/HandleExceptions:
@@ -253,40 +282,22 @@ Lint/HandleExceptions:
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: runtime_error, standard_error
Lint/InheritException:
Exclude:
- 'app/controllers/concerns/feature_flags.rb'
# Offense count: 1
Lint/LiteralInCondition:
Lint/LiteralAsCondition:
Exclude:
- 'app/models/budget/investment.rb'
# Offense count: 51
Lint/ParenthesesAsGroupedExpression:
Exclude:
- 'spec/factories.rb'
- 'spec/features/admin/organizations_spec.rb'
- 'spec/features/budgets/investments_spec.rb'
- 'spec/features/campaigns_spec.rb'
- 'spec/features/debates_spec.rb'
- 'spec/features/management/managed_users_spec.rb'
- 'spec/features/management/proposals_spec.rb'
- 'spec/features/management/spending_proposals_spec.rb'
- 'spec/features/management/users_spec.rb'
- 'spec/features/proposals_spec.rb'
- 'spec/models/debate_spec.rb'
# Offense count: 13
# Offense count: 3
# Cop supports --auto-correct.
Lint/StringConversionInInterpolation:
Exclude:
- 'app/models/poll/null_result.rb'
- 'app/models/poll/partial_result.rb'
- 'app/models/poll/white_result.rb'
- 'app/models/poll/total_result.rb'
# Offense count: 15
# Cop supports --auto-correct.
@@ -311,47 +322,106 @@ Lint/UnusedMethodArgument:
- 'app/mailers/mailer.rb'
- 'app/models/abilities/everyone.rb'
# Offense count: 278
# Offense count: 335
Lint/UselessAssignment:
Enabled: false
# Offense count: 1
# Offense count: 2
Lint/Void:
Exclude:
- 'app/controllers/polls_controller.rb'
- 'app/models/setting.rb'
# Offense count: 74
# Offense count: 86
Metrics/AbcSize:
Max: 54
Max: 77
# Offense count: 454
# Offense count: 513
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
Max: 1071
Max: 1242
# Offense count: 8
# Offense count: 11
# Configuration parameters: CountComments.
Metrics/ClassLength:
Max: 256
Max: 266
# Offense count: 10
# Offense count: 13
Metrics/CyclomaticComplexity:
Max: 10
# Offense count: 53
# Offense count: 25
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Metrics/LineLength:
Max: 248
# Offense count: 71
# Configuration parameters: CountComments.
Metrics/MethodLength:
Max: 49
Max: 68
# Offense count: 1
# Configuration parameters: CountComments.
Metrics/ModuleLength:
Max: 214
Max: 273
# Offense count: 7
# Offense count: 3
# Configuration parameters: CountKeywordArgs.
Metrics/ParameterLists:
Max: 7
# Offense count: 8
Metrics/PerceivedComplexity:
Max: 11
# Offense count: 10
Naming/AccessorMethodName:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/concerns/commentable_actions.rb'
- 'app/controllers/management/proposals_controller.rb'
- 'app/controllers/management/spending_proposals_controller.rb'
- 'app/controllers/proposals_controller.rb'
- 'lib/merged_comment_tree.rb'
# Offense count: 2
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
Exclude:
- 'Capfile'
- 'Gemfile'
# Offense count: 10
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
# NamePrefix: is_, has_, have_
# NamePrefixBlacklist: is_, has_, have_
# NameWhitelist: is_a?
# MethodDefinitionMacros: define_method, define_singleton_method
Naming/PredicateName:
Exclude:
- 'spec/**/*'
- 'app/controllers/concerns/has_filters.rb'
- 'app/controllers/concerns/has_orders.rb'
- 'app/helpers/banners_helper.rb'
- 'app/helpers/debates_helper.rb'
- 'app/models/budget/ballot.rb'
- 'app/models/user.rb'
# Offense count: 95
# Configuration parameters: EnforcedStyle.
# SupportedStyles: snake_case, normalcase, non_integer
Naming/VariableNumber:
Enabled: false
# Offense count: 2
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect.
Performance/HashEachMethods:
Exclude:
- 'app/models/ahoy/data_source.rb'
# Offense count: 6
# Cop supports --auto-correct.
Performance/RedundantMatch:
@@ -360,16 +430,18 @@ Performance/RedundantMatch:
- 'app/controllers/valuation/spending_proposals_controller.rb'
- 'app/helpers/embed_videos_helper.rb'
# Offense count: 16
# Offense count: 18
# Cop supports --auto-correct.
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/FindBy:
Exclude:
- 'app/models/budget/ballot.rb'
- 'app/models/concerns/relationable.rb'
- 'app/models/geozone.rb'
- 'app/models/legislation/question.rb'
- 'app/models/officing/residence.rb'
- 'app/models/poll/booth.rb'
- 'app/models/poll/voter.rb'
- 'app/models/setting.rb'
- 'app/models/signature.rb'
@@ -385,6 +457,12 @@ Rails/HasAndBelongsToMany:
Exclude:
- 'app/models/poll.rb'
# Offense count: 52
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasManyOrHasOneDependent:
Enabled: false
# Offense count: 37
# Cop supports --auto-correct.
# Configuration parameters: Include.
@@ -402,38 +480,75 @@ Rails/HttpPositionalArguments:
- 'spec/controllers/pages_controller_spec.rb'
- 'spec/controllers/users/registrations_controller_spec.rb'
# Offense count: 20
# Offense count: 71
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/InverseOf:
Enabled: false
# Offense count: 28
# Configuration parameters: Include.
# Include: app/controllers/**/*.rb
Rails/LexicallyScopedActionFilter:
Exclude:
- 'app/controllers/admin/banners_controller.rb'
- 'app/controllers/admin/poll/officer_assignments_controller.rb'
- 'app/controllers/admin/poll/polls_controller.rb'
- 'app/controllers/admin/tags_controller.rb'
- 'app/controllers/concerns/search.rb'
- 'app/controllers/debates_controller.rb'
- 'app/controllers/legislation/proposals_controller.rb'
- 'app/controllers/management/proposals_controller.rb'
- 'app/controllers/moderation/comments_controller.rb'
- 'app/controllers/moderation/debates_controller.rb'
- 'app/controllers/moderation/proposals_controller.rb'
- 'app/controllers/proposals_controller.rb'
- 'app/controllers/users/registrations_controller.rb'
- 'app/controllers/valuation/budget_investments_controller.rb'
- 'app/controllers/valuation/spending_proposals_controller.rb'
# Offense count: 19
Rails/OutputSafety:
Exclude:
- 'app/controllers/admin/legislation/draft_versions_controller.rb'
- 'app/controllers/admin/legislation/processes_controller.rb'
- 'app/controllers/admin/legislation/questions_controller.rb'
- 'app/controllers/budgets/investments_controller.rb'
- 'app/controllers/direct_uploads_controller.rb'
- 'app/controllers/spending_proposals_controller.rb'
- 'app/helpers/application_helper.rb'
- 'app/helpers/documents_helper.rb'
- 'app/helpers/text_with_links_helper.rb'
- 'app/helpers/users_helper.rb'
- 'app/helpers/valuation_helper.rb'
# Offense count: 70
# Offense count: 7
# Cop supports --auto-correct.
Rails/Presence:
Exclude:
- 'app/controllers/concerns/commentable_actions.rb'
- 'app/controllers/users/sessions_controller.rb'
- 'app/helpers/welcome_helper.rb'
- 'app/models/legislation/proposal.rb'
- 'app/models/proposal.rb'
- 'app/models/valuator.rb'
# Offense count: 72
# Configuration parameters: Blacklist.
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
Rails/SkipsModelValidations:
Enabled: false
# Offense count: 10
Style/AccessorMethodName:
# Offense count: 4
# Configuration parameters: Environments.
# Environments: development, test, production
Rails/UnknownEnv:
Exclude:
- 'app/controllers/application_controller.rb'
- 'app/controllers/concerns/commentable_actions.rb'
- 'app/controllers/management/proposals_controller.rb'
- 'app/controllers/management/spending_proposals_controller.rb'
- 'app/controllers/proposals_controller.rb'
- 'lib/merged_comment_tree.rb'
- 'lib/census_api.rb'
- 'lib/sms_api.rb'
# Offense count: 1
# Offense count: 8
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: braces, no_braces, context_dependent
Style/BracesAroundHashParameters:
Exclude:
@@ -441,8 +556,9 @@ Style/BracesAroundHashParameters:
- 'spec/features/budgets/investments_spec.rb'
- 'spec/features/proposals_spec.rb'
# Offense count: 119
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Offense count: 126
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle.
# SupportedStyles: nested, compact
Style/ClassAndModuleChildren:
Enabled: false
@@ -454,20 +570,13 @@ Style/ClassVars:
- 'app/models/organization.rb'
- 'app/models/user.rb'
# Offense count: 6
# Offense count: 8
# Cop supports --auto-correct.
Style/ColonMethodCall:
Exclude:
- 'spec/models/budget/investment_spec.rb'
# Offense count: 12
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly, IncludeTernaryExpressions.
# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions.
# SupportedStyles: assign_to_condition, assign_inside_condition
Style/ConditionalAssignment:
Exclude:
- 'app/controllers/admin/poll/booth_assignments_controller.rb'
- 'app/controllers/admin/poll/officer_assignments_controller.rb'
- 'app/controllers/admin/poll/questions_controller.rb'
- 'app/controllers/comments_controller.rb'
- 'app/controllers/management/spending_proposals_controller.rb'
@@ -475,71 +584,65 @@ Style/ConditionalAssignment:
- 'app/controllers/verification/sms_controller.rb'
- 'lib/graph_ql/api_types_creator.rb'
# Offense count: 19
Style/DateTime:
Exclude:
- 'app/models/user.rb'
- 'spec/controllers/admin/api/stats_controller_spec.rb'
- 'spec/factories.rb'
- 'spec/features/admin/banners_spec.rb'
- 'spec/models/ahoy/data_source_spec.rb'
# Offense count: 1
Style/DoubleNegation:
Exclude:
- 'app/models/flag.rb'
# Offense count: 1
# Offense count: 6
# Cop supports --auto-correct.
Style/EmptyCaseCondition:
Style/Encoding:
Exclude:
- 'app/models/concerns/verification.rb'
- 'spec/features/debates_spec.rb'
- 'spec/features/proposal_ballots_spec.rb'
- 'spec/features/proposals_spec.rb'
- 'spec/mailers/devise_mailer_spec.rb'
- 'spec/models/debate_spec.rb'
- 'spec/models/proposal_spec.rb'
# Offense count: 2
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Style/FileName:
Exclude:
- 'Capfile'
- 'Gemfile'
# Offense count: 56
# Offense count: 61
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
# Offense count: 12
# Offense count: 49
# Cop supports --auto-correct.
# Configuration parameters: MaxLineLength.
Style/IfUnlessModifier:
Exclude:
- 'app/controllers/annotations_controller.rb'
- 'app/controllers/application_controller.rb'
- 'app/controllers/graphql_controller.rb'
- 'app/controllers/legislation/annotations_controller.rb'
- 'app/controllers/valuation/budget_investments_controller.rb'
- 'app/controllers/verification/letter_controller.rb'
- 'app/controllers/welcome_controller.rb'
- 'app/helpers/embed_videos_helper.rb'
- 'app/mailers/mailer.rb'
- 'app/models/proposal.rb'
- 'app/models/spending_proposal.rb'
Enabled: false
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: line_count_dependent, lambda, literal
Style/Lambda:
Exclude:
- 'app/models/comment.rb'
- 'app/models/concerns/followable.rb'
- 'app/models/direct_message.rb'
- 'app/models/vote.rb'
- 'lib/graph_ql/api_types_creator.rb'
# Offense count: 1
# Cop supports --auto-correct.
Style/MethodCallWithoutArgsParentheses:
# Offense count: 10
Style/MixinUsage:
Exclude:
- 'app/controllers/management/document_verifications_controller.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: require_parentheses, require_no_parentheses, require_no_parentheses_except_multiline
Style/MethodDefParentheses:
Exclude:
- 'spec/helpers/comments_helper_spec.rb'
- 'lib/census_api.rb'
- 'lib/local_census.rb'
- 'spec/features/comments/budget_investments_spec.rb'
- 'spec/features/comments/debates_spec.rb'
- 'spec/features/comments/legislation_annotations_spec.rb'
- 'spec/features/comments/legislation_questions_spec.rb'
- 'spec/features/comments/polls_spec.rb'
- 'spec/features/comments/proposals_spec.rb'
- 'spec/features/comments/topics_spec.rb'
- 'spec/rails_helper.rb'
# Offense count: 1
Style/MultilineBlockChain:
@@ -552,17 +655,14 @@ Style/MultilineIfThen:
Exclude:
- 'app/controllers/management/users_controller.rb'
# Offense count: 15
# Offense count: 13
# Cop supports --auto-correct.
Style/MutableConstant:
Exclude:
- 'app/models/activity.rb'
- 'app/models/budget/reclassified_vote.rb'
- 'app/models/legislation/draft_version.rb'
- 'app/models/poll/null_result.rb'
- 'app/models/poll/partial_result.rb'
- 'app/models/poll/white_result.rb'
- 'app/models/poll/total_result.rb'
- 'app/models/proposal.rb'
- 'app/models/signature_sheet.rb'
- 'app/models/site_customization/content_block.rb'
@@ -572,34 +672,15 @@ Style/MutableConstant:
- 'lib/tag_sanitizer.rb'
- 'lib/wysiwyg_sanitizer.rb'
# Offense count: 29
# Cop supports --auto-correct.
Style/NestedParenthesizedCalls:
Exclude:
- 'spec/features/debates_spec.rb'
- 'spec/features/emails_spec.rb'
- 'spec/features/valuation/budget_investments_spec.rb'
- 'spec/features/valuation/spending_proposals_spec.rb'
- 'spec/helpers/settings_helper_spec.rb'
- 'spec/helpers/verification_helper_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
# SupportedStyles: skip_modifier_ifs, always
Style/Next:
Exclude:
- 'app/controllers/officing/results_controller.rb'
# Offense count: 54
# Cop supports --auto-correct.
# Configuration parameters: Strict.
Style/NumericLiterals:
MinDigits: 9
# Offense count: 19
# Offense count: 20
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles.
# Configuration parameters: AutoCorrect, EnforcedStyle.
# SupportedStyles: predicate, comparison
Style/NumericPredicate:
Exclude:
@@ -625,34 +706,9 @@ Style/ParallelAssignment:
- 'lib/active_model/dates.rb'
- 'spec/support/common_actions.rb'
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: AllowSafeAssignment.
Style/ParenthesesAroundCondition:
Exclude:
- 'app/controllers/proposals_controller.rb'
- 'app/models/debate.rb'
- 'app/models/proposal.rb'
# Offense count: 11
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
# NamePrefix: is_, has_, have_
# NamePrefixBlacklist: is_, has_, have_
# NameWhitelist: is_a?
Style/PredicateName:
Exclude:
- 'spec/**/*'
- 'app/controllers/concerns/has_filters.rb'
- 'app/controllers/concerns/has_orders.rb'
- 'app/helpers/banners_helper.rb'
- 'app/helpers/debates_helper.rb'
- 'app/models/budget/ballot.rb'
- 'app/models/user.rb'
- 'lib/census_api.rb'
# Offense count: 4
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: compact, exploded
Style/RaiseArgs:
Exclude:
@@ -668,18 +724,15 @@ Style/RedundantBegin:
- 'app/controllers/graphql_controller.rb'
- 'app/models/legislation/annotation.rb'
# Offense count: 55
# Offense count: 7
# Cop supports --auto-correct.
Style/RedundantParentheses:
Enabled: false
# Offense count: 3
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
Style/RegexpLiteral:
Exclude:
- 'app/controllers/related_contents_controller.rb'
- 'app/helpers/embed_videos_helper.rb'
- 'app/models/poll/question/answer/video.rb'
- 'spec/customization_engine_spec.rb'
# Offense count: 6
@@ -691,45 +744,70 @@ Style/RescueModifier:
- 'app/controllers/verification/sms_controller.rb'
- 'app/models/concerns/measurable.rb'
# Offense count: 1
# Offense count: 11
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, explicit
Style/RescueStandardError:
Exclude:
- 'app/controllers/graphql_controller.rb'
- 'app/controllers/related_contents_controller.rb'
- 'app/helpers/locales_helper.rb'
- 'app/models/legislation/annotation.rb'
- 'lib/local_census.rb'
- 'lib/manager_authenticator.rb'
- 'lib/tasks/emails.rake'
- 'spec/shared/features/nested_documentable.rb'
- 'spec/shared/features/nested_imageable.rb'
# Offense count: 15
# Cop supports --auto-correct.
# Configuration parameters: ConvertCodeThatCanStartToReturnNil.
Style/SafeNavigation:
Exclude:
- 'app/controllers/legislation/draft_versions_controller.rb'
- 'app/controllers/sandbox_controller.rb'
- 'app/controllers/verification/letter_controller.rb'
- 'app/helpers/users_helper.rb'
- 'app/models/concerns/galleryable.rb'
- 'app/models/concerns/imageable.rb'
- 'app/models/legislation/proposal.rb'
- 'app/models/proposal.rb'
- 'app/models/signature.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: single_quotes, double_quotes
Style/StringLiteralsInInterpolation:
Exclude:
- 'spec/features/budgets/investments_spec.rb'
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInArguments:
Exclude:
- 'app/controllers/legislation/answers_controller.rb'
# Offense count: 9
# Configuration parameters: SupportedStyles.
# SupportedStyles: snake_case, camelCase
Style/VariableName:
EnforcedStyle: snake_case
# Offense count: 107
# Configuration parameters: EnforcedStyle, SupportedStyles.
# SupportedStyles: snake_case, normalcase, non_integer
Style/VariableNumber:
Enabled: false
- 'app/models/user.rb'
# Offense count: 31
# Cop supports --auto-correct.
# Configuration parameters: SupportedStyles, WordRegex.
# Configuration parameters: WordRegex.
# SupportedStyles: percent, brackets
Style/WordArray:
EnforcedStyle: percent
MinSize: 9
MinSize: 8
# Offense count: 10
RSpec/DescribeClass:
Exclude:
- 'spec/customization_engine_spec.rb'
- 'spec/i18n_spec.rb'
- 'spec/lib/acts_as_paranoid_aliases_spec.rb'
- 'spec/lib/cache_spec.rb'
- 'spec/lib/graphql_spec.rb'
- 'spec/lib/tasks/communities_spec.rb'
- 'spec/lib/tasks/dev_seed_spec.rb'
- 'spec/lib/tasks/settings_spec.rb'
- 'spec/models/abilities/organization_spec.rb'
- 'spec/views/welcome/index.html.erb_spec.rb'
# Offense count: 2
# Configuration parameters: SkipBlocks, EnforcedStyle.
# SupportedStyles: described_class, explicit
RSpec/DescribedClass:
Exclude:
- 'spec/controllers/concerns/has_filters_spec.rb'
- 'spec/controllers/concerns/has_orders_spec.rb'
# Offense count: 1
# Configuration parameters: IgnoreSymbolicNames.
RSpec/VerifiedDoubles:
Exclude:
- 'spec/models/verification/management/email_spec.rb'

View File

@@ -4,15 +4,17 @@ addons:
rvm:
- "2.3.2"
cache: bundler
bundler_args: --without development
before_script:
- "for i in config/*.example; do cp \"$i\" \"${i/.example}\"; done"
- bundle exec rake db:setup
script:
- "bundle exec rake assets:precompile RAILS_ENV=test"
- "bundle exec rake knapsack:rspec"
- "bin/knapsack_pro_rspec"
env:
global:
- CI_NODE_TOTAL=2
- KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
- KNAPSACK_PRO_CI_NODE_TOTAL=2
matrix:
- CI_NODE_INDEX=0
- CI_NODE_INDEX=1
- KNAPSACK_PRO_CI_NODE_INDEX=0
- KNAPSACK_PRO_CI_NODE_INDEX=1

View File

@@ -1,38 +1,199 @@
### 0.9 - 2017-06-15
# Changelog
All notable changes to this project will be documented in this file.
* New features
* Budgets
* Basic polls
* Collaborative legistlation
* Custom pages
* GraphQL API
* Improved admin section
* Enhancements
* Improved admin section
* Rails 4.2.8
* Ruby 2.3.2
* Bug fixes
* CKEditor locale compilation fixed
* Fixed bugs in mobile layouts
* Deprecations
* SpendingProposals are deprecated now in favor of Budgets
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
### 0.8 - 2016-07-21
## [Unreleased](https://github.com/consul/consul/compare/v0.12...consul:master)
* New features
* Support for customization schema, vía specific custom files, assets and folders
* Enhancements
* Rails 2.4.7
* Ruby 2.3.1
* Bug fixes
* Fixed bug causing errors on user deletion
### Added
- Added Drafting phase to Budgets https://github.com/consul/consul/pull/2285
- Allow admins to destroy budgets without investments https://github.com/consul/consul/pull/2283
- Added rubocop-rspec gem, enabled cops one by one fixing offenses.
- Added CSV download link to budget_investments https://github.com/consul/consul/pull/2147
- Added Capistrano task to automate maintenance mode https://github.com/consul/consul/pull/1932
### 0.7 - 2016-04-25
### Changed
- Updated multiple minor & patch gem versions thanks to [Depfu](https://depfu.com)
- Updated rubocop version and ignored all cops by default
- Removed legislation section arrows and duplicate html tag thanks to [xarlybovi](https://github.com/xarlybovi) https://github.com/consul/consul/issues/1704
- Display proposal and investment image when sharing in social networks https://github.com/consul/consul/pull/2202
- Redirect admin to budget lists after edit https://github.com/consul/consul/pull/2284
- Improve budget investment form https://github.com/consul/consul/pull/2280
- Prevent edition of investments if budget is in the final phase https://github.com/consul/consul/pull/2223
* New features
* Debates
* Proposals
* Basic Spending Proposals
* Enhancements
* Rails 2.4.6
* Ruby 2.2.3
### Deprecated
### Removed
- Spending Proposals urls from sitemap, that model is getting entirely deprecated soon.
### Fixed
### Security
## [0.12.0](https://github.com/consul/consul/compare/v0.11...v0.12) - 2018-01-03
### Added
- Added Images to Budget Investment's Milestones https://github.com/consul/consul/pull/2186
- Added Documents to Budget Investment's Milestones https://github.com/consul/consul/pull/2191
- Added Publication Date Budget Investment's Milestones https://github.com/consul/consul/pull/2188
- New setting `feature.allow_images` to allow upload and show images for both (proposals and budget investment projects). Set it manually through console with `Setting['feature.allow_images'] = true`
- Related Content feature. Now Debates & Proposals can be related https://github.com/consul/consul/issues/1164
- Map validations https://github.com/consul/consul/pull/2207
- Added spec for 'rake db:dev_seed' task https://github.com/consul/consul/pull/2201
- Adds timestamps to polls https://github.com/consul/consul/pull/2180 (Run `rake polls:initialize_timestamps` to initialize attributes created_at and updated_at with the current time for all existing polls, or manually through console set correct values)
### Changed
- Some general Design improvements https://github.com/consul/consul/pull/2170 https://github.com/consul/consul/pull/2198
- Improved Communities design https://github.com/consul/consul/pull/1904
- Made Milestones description required & hided title usage https://github.com/consul/consul/pull/2195
- Improved generic error message https://github.com/consul/consul/pull/2217
- Improved Sitemap for SEO https://github.com/consul/consul/pull/2215
### Fixed
- Notifications for hidden resources https://github.com/consul/consul/pull/2172
- Notifications exceptions https://github.com/consul/consul/pull/2187
- Fixed map location update https://github.com/consul/consul/pull/2213
## [0.11.0](https://github.com/consul/consul/compare/v0.10...v0.11) - 2017-12-05
### Added
- Allow social media image meta tags to be overwritten https://github.com/consul/consul/pull/1756 & https://github.com/consul/consul/pull/2153
- Allow users to verify their account against a local Census https://github.com/consul/consul/pull/1752
- Make Proposals & Budgets Investments followable by users https://github.com/consul/consul/pull/1727
- Show user followable activity on public user page https://github.com/consul/consul/pull/1750
- Add Budget results view & table https://github.com/consul/consul/pull/1748
- Improved Budget winners calculations https://github.com/consul/consul/pull/1738
- Allow Documents to be uploaded to Proposals and Budget Investments https://github.com/consul/consul/pull/1809
- Allow Communities creation on Proposals and Budget Investments (Run rake task 'communities:associate_community') https://github.com/consul/consul/pull/1815 https://github.com/consul/consul/pull/1833
- Allow user to geolocate Proposals and Budget Investments on a map https://github.com/consul/consul/pull/1864
- Legislation Process Proposals https://github.com/consul/consul/pull/1906
- Autocomplete user tags https://github.com/consul/consul/pull/1905
- GraphQL API docs https://github.com/consul/consul/pull/1763
- Show recommended proposals and debates to users based in their interests https://github.com/consul/consul/pull/1824
- Allow images & videos to be added to Poll questions https://github.com/consul/consul/pull/1835 https://github.com/consul/consul/pull/1915
- Add Poll Shifts, to soon replace Poll OfficerAssignments usage entirely (for now just partially)
- Added dropdown menu for advanced users https://github.com/consul/consul/pull/1761
- Help text headers and footers https://github.com/consul/consul/pull/1807
- Added a couple of steps for linux installation guidelines https://github.com/consul/consul/pull/1846
- Added TotalResult model, to replace Poll::FinalRecount https://github.com/consul/consul/pull/1866 1885
- Preview Budget Results by admins https://github.com/consul/consul/pull/1923
- Added comments to Polls https://github.com/consul/consul/pull/1961
- Added images & videos to Polls https://github.com/consul/consul/pull/1990 https://github.com/consul/consul/pull/1989
- Poll Answers are orderable now https://github.com/consul/consul/pull/2037
- Poll Booth Assigment management https://github.com/consul/consul/pull/2087
- Legislation processes documents https://github.com/consul/consul/pull/2084
- Poll results https://github.com/consul/consul/pull/2082
- Poll stats https://github.com/consul/consul/pull/2075
- Poll stats on admin panel https://github.com/consul/consul/pull/2102
- Added investment user tags admin interface https://github.com/consul/consul/pull/2068
- Added Poll comments to GraphQL API https://github.com/consul/consul/pull/2148
- Added option to unassign Valuator role https://github.com/consul/consul/pull/2110
- Added search by name/email on several Admin sections https://github.com/consul/consul/pull/2105
- Added Docker support https://github.com/consul/consul/pull/2127 & documentation https://consul_docs.gitbooks.io/docs/content/en/getting_started/docker.html
- Added population restriction validation on Budget Headings https://github.com/consul/consul/pull/2115
- Added a `/consul.json` route that returns installation details (current release version and feature flags status) for a future dashboard app https://github.com/consul/consul/pull/2164
### Changed
- Gem versions locked & cleanup https://github.com/consul/consul/pull/1730
- Upgraded many minor versions https://github.com/consul/consul/pull/1747
- Rails 4.2.10 https://github.com/consul/consul/pull/2128
- Updated Code of Conduct to use contributor covenant 1.4 https://github.com/consul/consul/pull/1733
- Improved consistency to all "Go back" buttons https://github.com/consul/consul/pull/1770
- New CONSUL brand https://github.com/consul/consul/pull/1808
- Admin panel redesign https://github.com/consul/consul/pull/1875 https://github.com/consul/consul/pull/2060
- Swapped Poll White/Null/Total Results for Poll Recount https://github.com/consul/consul/pull/1963
- Improved Poll index view https://github.com/consul/consul/pull/1959 https://github.com/consul/consul/pull/1987
- Update secrets and deploy secrets example files https://github.com/consul/consul/pull/1966
- Improved Poll Officer panel features
- Consistency across all admin profiles sections https://github.com/consul/consul/pull/2089
- Improved dev_seeds with more Poll content https://github.com/consul/consul/pull/2121
- Comment count now updates live after publishing a new one https://github.com/consul/consul/pull/2090
### Removed
- Removed Tolk gem usage, we've moved to Crowdin service https://github.com/consul/consul/pull/1729
- Removed Polls manual recounts (model Poll::FinalRecount) https://github.com/consul/consul/pull/1764
- Skipped specs for deprecated Spending Proposal model https://github.com/consul/consul/pull/1773
- Moved Documentation to https://github.com/consul/docs https://github.com/consul/consul/pull/1861
- Remove Poll Officer recounts, add Final & Totals votes https://github.com/consul/consul/pull/1919
- Remove deprecated Poll results models https://github.com/consul/consul/pull/1964
- Remove deprecated Poll::Question valid_answers attribute & usage https://github.com/consul/consul/pull/2073 https://github.com/consul/consul/pull/2074
### Fixed
- Foundation settings stylesheet https://github.com/consul/consul/pull/1766
- Budget milestone date localization https://github.com/consul/consul/pull/1734
- Return datetime format for en locale https://github.com/consul/consul/pull/1795
- Show bottom proposals button only if proposals exists https://github.com/consul/consul/pull/1798
- Check SMS verification in a more consistent way https://github.com/consul/consul/pull/1832
- Allow only YouTube/Vimeo URLs on 'video_url' attributes https://github.com/consul/consul/pull/1854
- Remove empty comments html https://github.com/consul/consul/pull/1862
- Fixed admin/poll routing errors https://github.com/consul/consul/pull/1863
- Display datepicker arrows https://github.com/consul/consul/pull/1869
- Validate presence poll presence on Poll::Question creation https://github.com/consul/consul/pull/1868
- Switch flag/unflag buttons on use via ajax https://github.com/consul/consul/pull/1883
- Flaky specs fixed https://github.com/consul/consul/pull/1888
- Fixed link back from moderation dashboard to root_path https://github.com/consul/consul/pull/2132
- Fixed Budget random pagination order https://github.com/consul/consul/pull/2131
- Fixed `direct_messages_max_per_day` set to nil https://github.com/consul/consul/pull/2100
- Fixed notification link error when someone commented a Topic https://github.com/consul/consul/pull/2094
- Lots of small UI/UX/SEO/SEM improvements
## [0.10.0](https://github.com/consul/consul/compare/v0.9...v0.10) - 2017-07-05
### Added
- Milestones on Budget Investment's
- Feature flag to enable/disable Legislative Processes
- Locale site pages customization
- Incompatible investments
### Changed
- Localization files reorganization. Check migration instruction at https://github.com/consul/consul/releases/tag/v0.10
- Rails 4.2.9
## [0.9.0](https://github.com/consul/consul/compare/v0.8...v0.9) - 2017-06-15
### Added
- Budgets
- Basic polls
- Collaborative legistlation
- Custom pages
- GraphQL API
- Improved admin section
### Changed
- Improved admin section
- Rails 4.2.8
- Ruby 2.3.2
### Deprecated
- SpendingProposals are deprecated now in favor of Budgets
### Fixed
- CKEditor locale compilation fixed
- Fixed bugs in mobile layouts
## [0.8.0](https://github.com/consul/consul/compare/v0.7...v0.8)- 2016-07-21
### Added
- Support for customization schema, vía specific custom files, assets and folders
### Changed
- Rails 4.2.7
- Ruby 2.3.1
### Fixed
- Fixed bug causing errors on user deletion
## [0.7.0] - 2016-04-25
### Added
- Debates
- Proposals
- Basic Spending Proposals
### Changed
- Rails 4.2.6
- Ruby 2.2.3
[Unreleased]: https://github.com/consul/consul/compare/v0.12...consul:master
[0.12.0]: https://github.com/consul/consul/compare/v0.11...v0.12
[0.11.0]: https://github.com/consul/consul/compare/v0.10...v0.11
[0.10.0]: https://github.com/consul/consul/compare/v0.9...v0.10
[0.9.0]: https://github.com/consul/consul/compare/v0.8...v0.9
[0.8.0]: https://github.com/consul/consul/compare/v0.7...v0.8

View File

@@ -5,8 +5,9 @@
* Raimond García [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000)
* Juanjo Bazán [github](https://github.com/xuanxu) | [twitter](https://twitter.com/xuanxu)
* Enrique García Cota [github](https://github.com/kikito) | [twitter](https://twitter.com/otikik)
* Alberto García Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza)
* Alberto García Cabeza [github](https://github.com/decabeza)
* Alberto Calderón [github](https://github.com/bertocq) | [twitter](https://twitter.com/bertocq)
* Maria Checa [github](https://github.com/MariaCheca)
## Code of conduct

View File

@@ -5,8 +5,9 @@
* Raimond García [github](https://github.com/voodoorai2000) | [twitter](https://twitter.com/voodoorai2000)
* Juanjo Bazán [github](https://github.com/xuanxu) | [twitter](https://twitter.com/xuanxu)
* Enrique García Cota [github](https://github.com/kikito) | [twitter](https://twitter.com/otikik)
* Alberto García Cabeza [github](https://github.com/decabeza) | [twitter](https://twitter.com/decabeza)
* Alberto García Cabeza [github](https://github.com/decabeza)
* Alberto Calderón [github](https://github.com/bertocq) | [twitter](https://twitter.com/bertocq)
* Maria Checa [github](https://github.com/MariaCheca)
## Código de conducta

37
Dockerfile Normal file
View File

@@ -0,0 +1,37 @@
# # Select ubuntu as the base image
FROM coreapps/ruby2.3
# Install essential Linux packages
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev postgresql-client nodejs
# Define where our application will live inside the image
ENV RAILS_ROOT /var/www/consul
# Create application home. App server will need the pids dir so just create everything in one shot
RUN mkdir -p $RAILS_ROOT/tmp/pids
# Set our working directory inside the image
WORKDIR $RAILS_ROOT
# Use the Gemfiles as Docker cache markers. Always bundle before copying app src.
# (the src likely changed and we don't want to invalidate Docker's cache too early)
# http://ilikestuffblog.com/2014/01/06/how-to-skip-bundle-install-when-deploying-a-rails-app-to-docker/
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
COPY Gemfile_custom Gemfile_custom
# Prevent bundler warnings; ensure that the bundler version executed is >= that which created Gemfile.lock
RUN gem install bundler
# Finish establishing our Ruby enviornment
RUN bundle install --full-index
# Copy the Rails application into place
COPY . .
# Define the script we want run once the container boots
# Use the "exec" form of CMD so our script shuts down gracefully on SIGTERM (i.e. `docker stop`)
#CMD [ "config/containers/app_cmd.sh" ]
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

61
Gemfile
View File

@@ -1,13 +1,13 @@
source 'https://rubygems.org'
gem 'rails', '4.2.9'
gem 'rails', '4.2.10'
gem 'acts-as-taggable-on', '~> 4.0.0'
gem 'acts_as_votable', '~> 0.10.0'
gem 'acts-as-taggable-on', '~> 5.0.0'
gem 'acts_as_votable', '~> 0.11.1'
gem 'ahoy_matey', '~> 1.6.0'
gem 'ancestry', '~> 2.2.2'
gem 'browser', '~> 2.3.0'
gem 'cancancan', '~> 1.16.0'
gem 'ancestry', '~> 3.0.1'
gem 'browser', '~> 2.5.2'
gem 'cancancan', '~> 2.1.2'
gem 'ckeditor', '~> 4.2.3'
gem 'cocoon', '~> 1.2.9'
gem 'coffee-rails', '~> 4.2.1'
@@ -20,70 +20,75 @@ gem 'devise_security_extension', '~> 0.10.0'
gem 'foundation-rails', '~> 6.2.4.0'
gem 'foundation_rails_helper', '~> 2.0.0'
gem 'graphiql-rails', '~> 1.4.1'
gem 'graphql', '~> 1.6.3'
gem 'graphql', '~> 1.7.7'
gem 'groupdate', '~> 3.2.0'
gem 'initialjs-rails', '~> 0.2.0.5'
gem 'invisible_captcha', '~> 0.9.2'
gem 'invisible_captcha', '~> 0.10.0'
gem 'jquery-fileupload-rails'
gem 'jquery-rails', '~> 4.3.1'
gem 'jquery-ui-rails', '~> 6.0.1'
gem 'kaminari', '~> 1.0.1'
gem 'kaminari', '~> 1.1.1'
gem 'newrelic_rpm', '~> 4.1.0.333'
gem 'omniauth', '~> 1.6.1'
gem 'omniauth', '~> 1.8.1'
gem 'omniauth-facebook', '~> 4.0.0'
gem 'omniauth-google-oauth2', '~> 0.4.0'
gem 'omniauth-twitter', '~> 1.4.0'
gem 'paperclip', '~> 5.1.0'
gem 'paranoia', '~> 2.3.1'
gem 'paranoia', '~> 2.4.0'
gem 'pg', '~> 0.21.0'
gem 'pg_search', '~> 2.0.1'
gem 'rails-assets-markdown-it', '~> 8.2.1', source: 'https://rails-assets.org'
gem 'redcarpet', '~> 3.4.0'
gem 'responders', '~> 2.4.0'
gem 'rinku', '~> 2.0.2', require: 'rails_rinku'
gem 'rollbar', '~> 2.14.1'
gem 'rollbar', '~> 2.15.5'
gem 'rubyzip', '~> 1.2.0'
gem 'sass-rails', '~> 5.0', '>= 5.0.4'
gem 'savon', '~> 2.11.1'
gem 'sitemap_generator', '~> 5.3.1'
gem 'social-share-button', '~> 0.10'
gem 'sitemap_generator', '~> 6.0.0'
gem 'social-share-button', '~> 1.1'
gem 'sprockets', '~> 3.7.1'
gem 'turbolinks', '~> 2.5.3'
gem 'turnout', '~> 2.4.0'
gem 'uglifier', '~> 3.2.0'
gem 'unicorn', '~> 5.3.0'
gem 'whenever', '~> 0.9.7', require: false
gem 'uglifier', '~> 4.1.2'
gem 'unicorn', '~> 5.4.0'
gem 'whenever', '~> 0.10.0', require: false
source 'https://rails-assets.org' do
gem 'rails-assets-leaflet'
gem 'rails-assets-markdown-it', '~> 8.2.1'
end
group :development, :test do
gem "bullet", '~> 5.5.1'
gem 'byebug', '~> 9.0.6'
gem 'factory_girl_rails', '~> 4.8.0'
gem "faker", '~> 1.7.3'
gem 'bullet', '~> 5.7.0'
gem 'byebug', '~> 9.1.0'
gem 'factory_bot_rails', '~> 4.8.2'
gem 'faker', '~> 1.8.7'
gem 'i18n-tasks', '~> 0.9.15'
gem 'knapsack', '~> 1.13.3'
gem 'knapsack_pro', '~> 0.53.0'
gem 'launchy', '~> 2.4.3'
gem 'letter_opener_web', '~> 1.3.1'
gem 'quiet_assets', '~> 1.1.0'
gem 'rubocop', '~> 0.49.1', require: false
gem 'spring', '~> 2.0.1'
gem 'spring-commands-rspec', '~> 1.0.4'
end
group :test do
gem 'capybara', '~> 2.14.0'
gem 'capybara', '~> 2.17.0'
gem 'coveralls', '~> 0.8.21', require: false
gem 'database_cleaner', '~> 1.6.1'
gem 'email_spec', '~> 2.1.0'
gem 'poltergeist', '~> 1.15.0'
gem 'poltergeist', '~> 1.17.0'
gem 'rspec-rails', '~> 3.6'
end
group :development do
gem 'capistrano', '~> 3.8.1', require: false
gem 'capistrano', '~> 3.10.1', require: false
gem 'capistrano-bundler', '~> 1.2', require: false
gem "capistrano-rails", '~> 1.2.3', require: false
gem 'capistrano-rails', '~> 1.3.1', require: false
gem 'capistrano3-delayed-job', '~> 1.7.3'
gem 'mdl', '~> 0.4.0', require: false
gem 'rubocop', '~> 0.52.1', require: false
gem 'rubocop-rspec', '~> 1.21.0', require: false
gem 'rvm1-capistrano3', '~> 1.4.0', require: false
gem 'scss_lint', '~> 0.54.0', require: false
gem 'web-console', '~> 3.3.0'

View File

@@ -2,45 +2,45 @@ GEM
remote: https://rubygems.org/
remote: https://rails-assets.org/
specs:
actionmailer (4.2.9)
actionpack (= 4.2.9)
actionview (= 4.2.9)
activejob (= 4.2.9)
actionmailer (4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 1.0, >= 1.0.5)
actionpack (4.2.9)
actionview (= 4.2.9)
activesupport (= 4.2.9)
actionpack (4.2.10)
actionview (= 4.2.10)
activesupport (= 4.2.10)
rack (~> 1.6)
rack-test (~> 0.6.2)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (4.2.9)
activesupport (= 4.2.9)
actionview (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 1.0, >= 1.0.5)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (4.2.9)
activesupport (= 4.2.9)
activejob (4.2.10)
activesupport (= 4.2.10)
globalid (>= 0.3.0)
activemodel (4.2.9)
activesupport (= 4.2.9)
activemodel (4.2.10)
activesupport (= 4.2.10)
builder (~> 3.1)
activerecord (4.2.9)
activemodel (= 4.2.9)
activesupport (= 4.2.9)
activerecord (4.2.10)
activemodel (= 4.2.10)
activesupport (= 4.2.10)
arel (~> 6.0)
activesupport (4.2.9)
activesupport (4.2.10)
i18n (~> 0.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
acts-as-taggable-on (4.0.0)
activerecord (>= 4.0)
acts_as_votable (0.10.0)
addressable (2.5.1)
public_suffix (~> 2.0, >= 2.0.2)
acts-as-taggable-on (5.0.0)
activerecord (>= 4.2.8)
acts_as_votable (0.11.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
ahoy_matey (1.6.0)
addressable
browser (~> 2.0)
@@ -57,8 +57,8 @@ GEM
akami (1.3.1)
gyoku (>= 0.4.0)
nokogiri
ancestry (2.2.2)
activerecord (>= 3.0.0)
ancestry (3.0.1)
activerecord (>= 3.2.0)
arel (6.0.4)
ast (2.3.0)
babel-source (5.8.35)
@@ -66,34 +66,34 @@ GEM
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
bcrypt (3.1.11)
browser (2.3.0)
browser (2.5.2)
builder (3.2.3)
bullet (5.5.1)
bullet (5.7.1)
activesupport (>= 3.0.0)
uniform_notifier (~> 1.10.0)
byebug (9.0.6)
cancancan (1.16.0)
capistrano (3.8.2)
uniform_notifier (~> 1.11.0)
byebug (9.1.0)
cancancan (2.1.2)
capistrano (3.10.1)
airbrussh (>= 1.0.0)
i18n
rake (>= 10.0.0)
sshkit (>= 1.9.0)
capistrano-bundler (1.2.0)
capistrano-bundler (1.3.0)
capistrano (~> 3.1)
sshkit (~> 1.2)
capistrano-rails (1.2.3)
capistrano-rails (1.3.1)
capistrano (~> 3.1)
capistrano-bundler (~> 1.1)
capistrano3-delayed-job (1.7.3)
capistrano3-delayed-job (1.7.5)
capistrano (~> 3.0, >= 3.0.0)
daemons (~> 1.2.4)
capybara (2.14.4)
capybara (2.17.0)
addressable
mime-types (>= 1.16)
mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
xpath (>= 2.0, < 4.0)
chronic (0.10.2)
ckeditor (4.2.4)
cocaine
@@ -102,7 +102,7 @@ GEM
cliver (0.3.2)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
cocoon (1.2.10)
cocoon (1.2.11)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
railties (>= 4.0.0)
@@ -117,9 +117,10 @@ GEM
term-ansicolor (~> 1.3)
thor (~> 0.19.4)
tins (~> 1.6)
daemons (1.2.4)
crass (1.0.3)
daemons (1.2.6)
dalli (2.7.6)
database_cleaner (1.6.1)
database_cleaner (1.6.2)
debug_inspector (0.0.3)
delayed_job (4.1.3)
activesupport (>= 3.0, < 5.2)
@@ -149,16 +150,16 @@ GEM
launchy (~> 2.1)
mail (~> 2.6)
errbase (0.0.3)
erubi (1.6.1)
erubi (1.7.0)
erubis (2.7.0)
execjs (2.7.0)
factory_girl (4.8.0)
factory_bot (4.8.2)
activesupport (>= 3.0.0)
factory_girl_rails (4.8.0)
factory_girl (~> 4.8.0)
factory_bot_rails (4.8.2)
factory_bot (~> 4.8.2)
railties (>= 3.0.0)
faker (1.7.3)
i18n (~> 0.5)
faker (1.8.7)
i18n (>= 0.7)
faraday (0.12.1)
multipart-post (>= 1.2, < 3)
foundation-rails (6.2.4.0)
@@ -172,23 +173,24 @@ GEM
railties (>= 4.1)
tzinfo (~> 1.2, >= 1.2.2)
geocoder (1.4.4)
globalid (0.4.0)
globalid (0.4.1)
activesupport (>= 4.2.0)
graphiql-rails (1.4.2)
graphiql-rails (1.4.8)
rails
graphql (1.6.4)
graphql (1.7.7)
groupdate (3.2.0)
activesupport (>= 3)
gyoku (1.3.1)
builder (>= 2.1.2)
hashie (3.5.5)
highline (1.7.8)
hashie (3.5.7)
highline (1.7.10)
htmlentities (4.3.4)
httpi (2.4.2)
rack
socksify
i18n (0.8.6)
i18n-tasks (0.9.18)
i18n (0.9.1)
concurrent-ruby (~> 1.0)
i18n-tasks (0.9.19)
activesupport (>= 4.0.2)
ast (>= 2.1.0)
easy_translate (>= 0.5.0)
@@ -200,7 +202,7 @@ GEM
terminal-table (>= 1.5.1)
initialjs-rails (0.2.0.5)
railties (>= 3.1, < 6.0)
invisible_captcha (0.9.3)
invisible_captcha (0.10.0)
rails (>= 3.2.0)
jquery-fileupload-rails (0.4.7)
actionpack (>= 3.1)
@@ -214,22 +216,21 @@ GEM
railties (>= 3.2.16)
json (2.1.0)
jwt (1.5.6)
kaminari (1.0.1)
kaminari (1.1.1)
activesupport (>= 4.1.0)
kaminari-actionview (= 1.0.1)
kaminari-activerecord (= 1.0.1)
kaminari-core (= 1.0.1)
kaminari-actionview (1.0.1)
kaminari-actionview (= 1.1.1)
kaminari-activerecord (= 1.1.1)
kaminari-core (= 1.1.1)
kaminari-actionview (1.1.1)
actionview
kaminari-core (= 1.0.1)
kaminari-activerecord (1.0.1)
kaminari-core (= 1.1.1)
kaminari-activerecord (1.1.1)
activerecord
kaminari-core (= 1.0.1)
kaminari-core (1.0.1)
kgio (2.11.0)
knapsack (1.13.3)
kaminari-core (= 1.1.1)
kaminari-core (1.1.1)
kgio (2.11.1)
knapsack_pro (0.53.0)
rake
timecop (>= 0.1.0)
kramdown (1.14.0)
launchy (2.4.3)
addressable (~> 2.3)
@@ -239,10 +240,11 @@ GEM
actionmailer (>= 3.2)
letter_opener (~> 1.0)
railties (>= 3.2)
loofah (2.0.3)
loofah (2.1.1)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.6.6)
mime-types (>= 1.16, < 4)
mail (2.7.0)
mini_mime (>= 0.1.1)
mdl (0.4.0)
kramdown (~> 1.12, >= 1.12.0)
mixlib-cli (~> 1.7, >= 1.7.0)
@@ -251,19 +253,20 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mimemagic (0.3.2)
mini_portile2 (2.2.0)
minitest (5.10.3)
mini_mime (1.0.0)
mini_portile2 (2.3.0)
minitest (5.11.1)
mixlib-cli (1.7.0)
mixlib-config (2.2.4)
multi_json (1.12.1)
multi_json (1.12.2)
multi_xml (0.6.0)
multipart-post (2.0.0)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
net-ssh (4.1.0)
net-ssh (4.2.0)
newrelic_rpm (4.1.0.333)
nokogiri (1.8.0)
mini_portile2 (~> 2.2.0)
nokogiri (1.8.1)
mini_portile2 (~> 2.3.0)
nori (2.6.0)
oauth (0.5.3)
oauth2 (1.4.0)
@@ -272,7 +275,7 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.6.1)
omniauth (1.8.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
@@ -298,22 +301,22 @@ GEM
cocaine (~> 0.5.5)
mime-types
mimemagic (~> 0.3.0)
parallel (1.11.2)
paranoia (2.3.1)
parallel (1.12.1)
paranoia (2.4.0)
activerecord (>= 4.0, < 5.2)
parser (2.4.0.0)
ast (~> 2.2)
parser (2.4.0.2)
ast (~> 2.3)
pg (0.21.0)
pg_search (2.0.1)
activerecord (>= 4.2)
activesupport (>= 4.2)
arel (>= 6)
poltergeist (1.15.0)
poltergeist (1.17.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
powerpack (0.1.1)
public_suffix (2.0.5)
public_suffix (3.0.1)
quiet_assets (1.1.0)
railties (>= 3.1, < 5.0)
rack (1.6.8)
@@ -323,69 +326,72 @@ GEM
rack
rack-test (0.6.3)
rack (>= 1.0)
rails (4.2.9)
actionmailer (= 4.2.9)
actionpack (= 4.2.9)
actionview (= 4.2.9)
activejob (= 4.2.9)
activemodel (= 4.2.9)
activerecord (= 4.2.9)
activesupport (= 4.2.9)
rails (4.2.10)
actionmailer (= 4.2.10)
actionpack (= 4.2.10)
actionview (= 4.2.10)
activejob (= 4.2.10)
activemodel (= 4.2.10)
activerecord (= 4.2.10)
activesupport (= 4.2.10)
bundler (>= 1.3.0, < 2.0)
railties (= 4.2.9)
railties (= 4.2.10)
sprockets-rails
rails-assets-leaflet (1.1.0)
rails-assets-markdown-it (8.2.2)
rails-deprecated_sanitizer (1.0.3)
activesupport (>= 4.2.0.alpha)
rails-dom-testing (1.0.8)
activesupport (>= 4.2.0.beta, < 5.0)
rails-dom-testing (1.0.9)
activesupport (>= 4.2.0, < 5.0)
nokogiri (~> 1.6)
rails-deprecated_sanitizer (>= 1.0.1)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
railties (4.2.9)
actionpack (= 4.2.9)
activesupport (= 4.2.9)
railties (4.2.10)
actionpack (= 4.2.10)
activesupport (= 4.2.10)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rainbow (2.2.2)
rake
raindrops (0.18.0)
rake (12.0.0)
raindrops (0.19.0)
rake (12.3.0)
redcarpet (3.4.0)
referer-parser (0.3.0)
request_store (1.3.2)
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
rinku (2.0.3)
rollbar (2.14.1)
rinku (2.0.4)
rollbar (2.15.5)
multi_json
rspec-core (3.6.0)
rspec-support (~> 3.6.0)
rspec-expectations (3.6.0)
rspec-core (3.7.1)
rspec-support (~> 3.7.0)
rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.6.0)
rspec-mocks (3.6.0)
rspec-support (~> 3.7.0)
rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.6.0)
rspec-rails (3.6.1)
rspec-support (~> 3.7.0)
rspec-rails (3.7.2)
actionpack (>= 3.0)
activesupport (>= 3.0)
railties (>= 3.0)
rspec-core (~> 3.6.0)
rspec-expectations (~> 3.6.0)
rspec-mocks (~> 3.6.0)
rspec-support (~> 3.6.0)
rspec-support (3.6.0)
rubocop (0.49.1)
rspec-core (~> 3.7.0)
rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.7.0)
rspec-support (~> 3.7.0)
rspec-support (3.7.0)
rubocop (0.52.1)
parallel (~> 1.10)
parser (>= 2.3.3.1, < 3.0)
parser (>= 2.4.0.2, < 3.0)
powerpack (~> 0.1)
rainbow (>= 1.99.1, < 3.0)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.8.1)
rubocop-rspec (1.21.0)
rubocop (>= 0.52.0)
ruby-progressbar (1.9.0)
rubyzip (1.2.1)
rvm1-capistrano3 (1.4.0)
capistrano (~> 3.0)
@@ -393,7 +399,7 @@ GEM
safely_block (0.2.0)
errbase
sass (3.4.25)
sass-rails (5.0.6)
sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
@@ -415,9 +421,9 @@ GEM
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.1)
sitemap_generator (5.3.1)
sitemap_generator (6.0.0)
builder (~> 3.0)
social-share-button (0.10.0)
social-share-button (1.1.0)
coffee-rails
socksify (1.7.1)
spring (2.0.2)
@@ -435,7 +441,7 @@ GEM
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
sshkit (1.14.0)
sshkit (1.15.1)
net-scp (>= 1.1.2)
net-ssh (>= 2.8.0)
term-ansicolor (1.6.0)
@@ -445,8 +451,7 @@ GEM
thor (0.19.4)
thread (0.2.2)
thread_safe (0.3.6)
tilt (2.0.7)
timecop (0.9.1)
tilt (2.0.8)
tins (1.15.0)
turbolinks (2.5.3)
coffee-rails
@@ -455,15 +460,15 @@ GEM
rack (>= 1.3, < 3)
rack-accept (~> 0.4)
tilt (>= 1.4, < 3)
tzinfo (1.2.3)
tzinfo (1.2.4)
thread_safe (~> 0.1)
uglifier (3.2.0)
uglifier (4.1.3)
execjs (>= 0.3.0, < 3)
unicode-display_width (1.3.0)
unicorn (5.3.0)
unicorn (5.4.0)
kgio (~> 2.6)
raindrops (~> 0.7)
uniform_notifier (1.10.0)
uniform_notifier (1.11.0)
user_agent_parser (2.3.1)
uuidtools (2.1.5)
warden (1.2.7)
@@ -475,31 +480,31 @@ GEM
activemodel (>= 4.2)
debug_inspector
railties (>= 4.2)
websocket-driver (0.6.5)
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
whenever (0.9.7)
websocket-extensions (0.1.3)
whenever (0.10.0)
chronic (>= 0.6.3)
xpath (2.1.0)
nokogiri (~> 1.3)
xpath (3.0.0)
nokogiri (~> 1.8)
PLATFORMS
ruby
DEPENDENCIES
acts-as-taggable-on (~> 4.0.0)
acts_as_votable (~> 0.10.0)
acts-as-taggable-on (~> 5.0.0)
acts_as_votable (~> 0.11.1)
ahoy_matey (~> 1.6.0)
ancestry (~> 2.2.2)
browser (~> 2.3.0)
bullet (~> 5.5.1)
byebug (~> 9.0.6)
cancancan (~> 1.16.0)
capistrano (~> 3.8.1)
ancestry (~> 3.0.1)
browser (~> 2.5.2)
bullet (~> 5.7.0)
byebug (~> 9.1.0)
cancancan (~> 2.1.2)
capistrano (~> 3.10.1)
capistrano-bundler (~> 1.2)
capistrano-rails (~> 1.2.3)
capistrano-rails (~> 1.3.1)
capistrano3-delayed-job (~> 1.7.3)
capybara (~> 2.14.0)
capybara (~> 2.17.0)
ckeditor (~> 4.2.3)
cocoon (~> 1.2.9)
coffee-rails (~> 4.2.1)
@@ -512,59 +517,61 @@ DEPENDENCIES
devise-async (~> 0.10.2)
devise_security_extension (~> 0.10.0)
email_spec (~> 2.1.0)
factory_girl_rails (~> 4.8.0)
faker (~> 1.7.3)
factory_bot_rails (~> 4.8.2)
faker (~> 1.8.7)
foundation-rails (~> 6.2.4.0)
foundation_rails_helper (~> 2.0.0)
graphiql-rails (~> 1.4.1)
graphql (~> 1.6.3)
graphql (~> 1.7.7)
groupdate (~> 3.2.0)
i18n-tasks (~> 0.9.15)
initialjs-rails (~> 0.2.0.5)
invisible_captcha (~> 0.9.2)
invisible_captcha (~> 0.10.0)
jquery-fileupload-rails
jquery-rails (~> 4.3.1)
jquery-ui-rails (~> 6.0.1)
kaminari (~> 1.0.1)
knapsack (~> 1.13.3)
kaminari (~> 1.1.1)
knapsack_pro (~> 0.53.0)
launchy (~> 2.4.3)
letter_opener_web (~> 1.3.1)
mdl (~> 0.4.0)
newrelic_rpm (~> 4.1.0.333)
omniauth (~> 1.6.1)
omniauth (~> 1.8.1)
omniauth-facebook (~> 4.0.0)
omniauth-google-oauth2 (~> 0.4.0)
omniauth-twitter (~> 1.4.0)
paperclip (~> 5.1.0)
paranoia (~> 2.3.1)
paranoia (~> 2.4.0)
pg (~> 0.21.0)
pg_search (~> 2.0.1)
poltergeist (~> 1.15.0)
poltergeist (~> 1.17.0)
quiet_assets (~> 1.1.0)
rails (= 4.2.9)
rails (= 4.2.10)
rails-assets-leaflet!
rails-assets-markdown-it (~> 8.2.1)!
redcarpet (~> 3.4.0)
responders (~> 2.4.0)
rinku (~> 2.0.2)
rollbar (~> 2.14.1)
rollbar (~> 2.15.5)
rspec-rails (~> 3.6)
rubocop (~> 0.49.1)
rubocop (~> 0.52.1)
rubocop-rspec (~> 1.21.0)
rubyzip (~> 1.2.0)
rvm1-capistrano3 (~> 1.4.0)
sass-rails (~> 5.0, >= 5.0.4)
savon (~> 2.11.1)
scss_lint (~> 0.54.0)
sitemap_generator (~> 5.3.1)
social-share-button (~> 0.10)
sitemap_generator (~> 6.0.0)
social-share-button (~> 1.1)
spring (~> 2.0.1)
spring-commands-rspec (~> 1.0.4)
sprockets (~> 3.7.1)
turbolinks (~> 2.5.3)
turnout (~> 2.4.0)
uglifier (~> 3.2.0)
unicorn (~> 5.3.0)
uglifier (~> 4.1.2)
unicorn (~> 5.4.0)
web-console (~> 3.3.0)
whenever (~> 0.9.7)
whenever (~> 0.10.0)
BUNDLED WITH
1.15.3
1.16.0

View File

@@ -1,4 +1,4 @@
![Logo of CONSUL](https://raw.githubusercontent.com/consul/consul/master/public/consul_logo.png)
![CONSUL logo](https://raw.githubusercontent.com/consul/consul/master/public/consul_logo.png)
# CONSUL
@@ -21,13 +21,13 @@ This is the opensource code repository of the eParticipation website CONSUL, ori
## Current state
Development started on [2015 July 15th](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6). Code was deployed to production on 2015 september 7th to [decide.madrid.es](https://decide.madrid.es). Since then new features are added often. You can take a look at the current features in [features]( http://www.decide.es/en/) or [docs](https://github.com/consul/consul/tree/master/doc) and future features in the [open issues list](https://github.com/consul/consul/issues). For current status on upcoming features go to [Roadmap](https://github.com/consul/consul/projects/6)
Development started on [2015 July 15th](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6). Code was deployed to production on 2015 september 7th to [decide.madrid.es](https://decide.madrid.es). Since then new features are added often. You can take a look at the current features at the [project's website](http://consulproject.org/) and future features at the [Roadmap](https://github.com/consul/consul/projects/6) and [open issues list](https://github.com/consul/consul/issues).
## Configuration for development and test environments
**NOTE**: For more detailed instructions check the [docs](https://github.com/consul/docs/tree/master/en/getting_started/prerequisites)
Prerequisites: install git, Ruby 2.3.2, bundler gem, and PostgreSQL (>=9.4).
Prerequisites: install git, Ruby 2.3.2, `bundler` gem, and PostgreSQL (>=9.4).
```bash
git clone https://github.com/consul/consul.git
@@ -67,7 +67,7 @@ But for some actions like voting, you will need a verified user, the seeds file
## Documentation
Please check the ongoing documentation at https://consul_docs.gitbooks.io/docs/content/ to learn more about how to start your own CONSUL fork, install it, customize it and learn to use it from an administrator/maintainer perspective. You can contribute to it at https://github.com/consul/docs
Check the ongoing documentation at [https://consul_docs.gitbooks.io/docs/content/](https://consul_docs.gitbooks.io/docs/content/) to learn more about how to start your own CONSUL fork, install it, customize it and learn to use it from an administrator/maintainer perspective. You can contribute to it at [https://github.com/consul/docs](https://github.com/consul/docs)
## License
@@ -76,3 +76,7 @@ Code published under AFFERO GPL v3 (see [LICENSE-AGPLv3.txt](LICENSE-AGPLv3.txt)
## Contributions
See [CONTRIBUTING.md](CONTRIBUTING.md)
## Local development with Docker
Please check the documentation at [https://consul_docs.gitbooks.io/docs/content/en/getting_started/docker.html](https://consul_docs.gitbooks.io/docs/content/en/getting_started/docker.html)

View File

@@ -21,7 +21,7 @@ Este es el repositorio de código abierto de la Aplicación de Participación Ci
## Estado del proyecto
El desarrollo de esta aplicación comenzó el [15 de Julio de 2015](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6) y el código fue puesto en producción el día 7 de Septiembre de 2015 en [decide.madrid.es](https://decide.madrid.es). Desde entonces se le añaden mejoras y funcionalidades constantemente. Las funcionalidades actuales se pueden consultar en [características](http://www.decide.es/es/) o en la [documentación](https://github.com/consul/consul/tree/master/doc) y las siguientes funcionaliades en la lista de [tareas por hacer](https://github.com/consul/consul/issues). Para conocer el estado actual de las próximas caracteristicas, vaya a [Roadmap](https://github.com/consul/consul/projects/6)
El desarrollo de esta aplicación comenzó el [15 de Julio de 2015](https://github.com/consul/consul/commit/8db36308379accd44b5de4f680a54c41a0cc6fc6) y el código fue puesto en producción el día 7 de Septiembre de 2015 en [decide.madrid.es](https://decide.madrid.es). Desde entonces se le añaden mejoras y funcionalidades constantemente. Las funcionalidades actuales se pueden consultar en la [la página del projecto](http://consulproject.org/es) y las futuras funcionalidades en el [Roadmap](https://github.com/consul/consul/projects/6) y [el listado de issues](https://github.com/consul/consul/issues).
## Configuración para desarrollo y tests
@@ -29,8 +29,7 @@ El desarrollo de esta aplicación comenzó el [15 de Julio de 2015](https://gith
Prerequisitos: tener instalado git, Ruby 2.3.2, la gema `bundler` y PostgreSQL (9.4 o superior).
```
```bash
git clone https://github.com/consul/consul.git
cd consul
bundle install
@@ -68,7 +67,7 @@ Pero para ciertas acciones, como apoyar, necesitarás un usuario verificado, el
## Documentación
Por favor visita la documentación que está siendo completada en https://consul_docs.gitbooks.io/docs/content/ para conocer más sobre este proyecto, como comenzar tu propio fork, instalarlo, customizarlo y usarlo como administrador/mantenedor. Puedes colaborar en ella en https://github.com/consul/docs
Por favor visita la documentación que está siendo completada en [https://consul_docs.gitbooks.io/docs/content/](https://consul_docs.gitbooks.io/docs/content/) para conocer más sobre este proyecto, como comenzar tu propio fork, instalarlo, customizarlo y usarlo como administrador/mantenedor. Puedes colaborar en ella en [https://github.com/consul/docs](https://github.com/consul/docs)
## Licencia
@@ -77,3 +76,7 @@ El código de este proyecto está publicado bajo la licencia AFFERO GPL v3 (ver
## Contribuciones
Ver fichero [CONTRIBUTING_ES.md](CONTRIBUTING_ES.md)
## Desarrollo en local con Docker
Puedes leer la guía en [https://consul_docs.gitbooks.io/docs/content/es/getting_started/docker.html](https://consul_docs.gitbooks.io/docs/content/es/getting_started/docker.html)

View File

@@ -4,4 +4,4 @@
require File.expand_path('../config/application', __FILE__)
Rails.application.load_tasks
Knapsack.load_tasks if defined?(Knapsack)
KnapsackPro.load_tasks if defined?(KnapsackPro)

Binary file not shown.

View File

@@ -62,4 +62,12 @@
<glyph glyph-name="expand" unicode="&#48;" d="M26 168l-26-158c0-2 1-5 3-7 0 0 0 0 0 0 2-2 5-3 7-3l158 27c3 0 6 3 7 6 1 3 0 7-3 9l-30 31 82 82c4 4 4 9 0 13l-57 57c-3 3-9 3-12 0l-83-83-31 31c-2 2-5 3-9 2-3-1-5-4-6-7z m460 176l26 158c0 2-1 5-3 7 0 0 0 0 0 0-2 2-5 3-7 3l-158-27c-3 0-6-3-7-6-1-3 0-7 3-9l30-31-82-82c-4-4-4-9 0-13l57-57c3-3 9-3 12 0l83 83 31-31c2-2 5-3 9-2 3 1 5 4 6 7z"/>
<glyph glyph-name="telegram" unicode="&#49;" d="M504 509c6-5 9-11 8-18l-73-439c-1-6-4-10-10-13-2-2-5-2-8-2-3 0-5 0-7 1l-130 53-69-84c-3-5-8-7-14-7-2 0-4 0-6 1-4 1-7 4-9 7-2 3-3 6-3 10l0 100 247 303-306-265-113 47c-7 2-10 7-11 15 0 8 3 14 9 17l476 274c2 2 5 3 9 3 4 0 7-1 10-3z"/>
<glyph glyph-name="instagram" unicode="&#50;" d="M426 105l0 185-39 0c4-12 6-25 6-38 0-24-6-46-18-66-13-20-29-36-50-48-21-12-44-18-69-18-37 0-69 13-96 39-27 26-40 57-40 93 0 13 2 26 6 38l-41 0 0-185c0-5 2-10 5-13 4-3 8-5 13-5l305 0c5 0 9 2 13 5 3 3 5 8 5 13z m-81 152c0 23-9 44-26 60-18 17-38 25-63 25-24 0-45-8-62-25-17-16-26-37-26-60 0-24 9-44 26-61 17-16 38-25 62-25 25 0 45 9 63 25 17 17 26 37 26 61z m81 103l0 47c0 5-2 10-6 14-4 4-8 6-14 6l-50 0c-5 0-10-2-14-6-4-4-5-9-5-14l0-47c0-6 1-10 5-14 4-4 9-6 14-6l50 0c6 0 10 2 14 6 4 4 6 8 6 14z m49 59l0-326c0-16-5-29-16-40-11-11-24-16-40-16l-326 0c-16 0-29 5-40 16-11 11-16 24-16 40l0 326c0 16 5 29 16 40 11 11 24 16 40 16l326 0c16 0 29-5 40-16 11-11 16-24 16-40z"/>
<glyph glyph-name="image" unicode="&#51;" d="M165 347c0-15-6-28-16-38-11-11-24-16-39-16-16 0-28 5-39 16-11 10-16 23-16 38 0 16 5 29 16 39 11 11 23 16 39 16 15 0 28-5 39-16 10-10 16-23 16-39z m292-109l0-128-402 0 0 55 91 91 46-46 146 147z m28 201l-458 0c-2 0-4-1-6-3-2-2-3-4-3-6l0-348c0-2 1-4 3-6 2-2 4-3 6-3l458 0c2 0 4 1 6 3 2 2 3 4 3 6l0 348c0 2-1 4-3 6-2 2-4 3-6 3z m45-9l0-348c0-12-4-23-13-32-9-9-20-13-32-13l-458 0c-12 0-23 4-32 13-9 9-13 20-13 32l0 348c0 12 4 23 13 32 9 9 20 13 32 13l458 0c12 0 23-4 32-13 9-9 13-20 13-32z"/>
<glyph glyph-name="search-plus" unicode="&#52;" d="M311 283l0-18c0-2-1-4-3-6-2-2-4-3-6-3l-64 0 0-64c0-2-1-5-3-6-2-2-4-3-6-3l-19 0c-2 0-4 1-6 3-2 1-3 4-3 6l0 64-64 0c-2 0-4 1-6 3-2 2-3 4-3 6l0 18c0 3 1 5 3 7 2 2 4 3 6 3l64 0 0 64c0 2 1 4 3 6 2 2 4 3 6 3l19 0c2 0 4-1 6-3 2-2 3-4 3-6l0-64 64 0c2 0 4-1 6-3 2-2 3-4 3-7z m36-9c0 36-12 66-37 91-25 25-55 37-91 37-35 0-65-12-90-37-25-25-38-55-38-91 0-35 13-65 38-90 25-25 55-38 90-38 36 0 66 13 91 38 25 25 37 55 37 90z m147-237c0-11-4-19-11-26-7-7-16-11-26-11-10 0-19 4-26 11l-98 98c-34-24-72-36-114-36-27 0-53 5-78 16-25 11-46 25-64 43-18 18-32 39-43 64-10 25-16 51-16 78 0 28 6 54 16 78 11 25 25 47 43 65 18 18 39 32 64 43 25 10 51 15 78 15 28 0 54-5 79-15 24-11 46-25 64-43 18-18 32-40 43-65 10-24 16-50 16-78 0-42-12-80-36-114l98-98c7-7 11-15 11-25z"/>
<glyph glyph-name="search-minus" unicode="&#53;" d="M311 283l0-18c0-2-1-4-3-6-2-2-4-3-6-3l-165 0c-2 0-4 1-6 3-2 2-3 4-3 6l0 18c0 3 1 5 3 7 2 2 4 3 6 3l165 0c2 0 4-1 6-3 2-2 3-4 3-7z m36-9c0 36-12 66-37 91-25 25-55 37-91 37-35 0-65-12-90-37-25-25-38-55-38-91 0-35 13-65 38-90 25-25 55-38 90-38 36 0 66 13 91 38 25 25 37 55 37 90z m147-237c0-11-4-19-11-26-7-7-16-11-26-11-10 0-19 4-26 11l-98 98c-34-24-72-36-114-36-27 0-53 5-78 16-25 11-46 25-64 43-18 18-32 39-43 64-10 25-16 51-16 78 0 28 6 54 16 78 11 25 25 47 43 65 18 18 39 32 64 43 25 10 51 15 78 15 28 0 54-5 79-15 24-11 46-25 64-43 18-18 32-40 43-65 10-24 16-50 16-78 0-42-12-80-36-114l98-98c7-7 11-15 11-25z"/>
<glyph glyph-name="calculator" unicode="&#54;" d="M110 73c0 10-4 19-11 26-7 7-16 11-26 11-10 0-19-4-26-11-7-7-10-16-10-26 0-10 3-19 10-26 7-7 16-10 26-10 10 0 19 3 26 10 7 7 11 16 11 26z m109 0c0 10-3 19-10 26-7 7-16 11-26 11-10 0-19-4-26-11-7-7-11-16-11-26 0-10 4-19 11-26 7-7 16-10 26-10 10 0 19 3 26 10 7 7 10 16 10 26z m-109 110c0 10-4 19-11 26-7 7-16 10-26 10-10 0-19-3-26-10-7-7-10-16-10-26 0-10 3-19 10-26 7-7 16-11 26-11 10 0 19 4 26 11 7 7 11 16 11 26z m219-110c0 10-3 19-11 26-7 7-15 11-25 11-11 0-19-4-26-11-7-7-11-16-11-26 0-10 4-19 11-26 7-7 15-10 26-10 10 0 18 3 25 10 8 7 11 16 11 26z m-110 110c0 10-3 19-10 26-7 7-16 10-26 10-10 0-19-3-26-10-7-7-11-16-11-26 0-10 4-19 11-26 7-7 16-11 26-11 10 0 19 4 26 11 7 7 10 16 10 26z m-109 110c0 10-4 18-11 25-7 8-16 11-26 11-10 0-19-3-26-11-7-7-10-15-10-25 0-11 3-19 10-26 7-7 16-11 26-11 10 0 19 4 26 11 7 7 11 15 11 26z m219-110c0 10-3 19-11 26-7 7-15 10-25 10-11 0-19-3-26-10-7-7-11-16-11-26 0-10 4-19 11-26 7-7 15-11 26-11 10 0 18 4 25 11 8 7 11 16 11 26z m-110 110c0 10-3 18-10 25-7 8-16 11-26 11-10 0-19-3-26-11-7-7-11-15-11-25 0-11 4-19 11-26 7-7 16-11 26-11 10 0 19 4 26 11 7 7 10 15 10 26z m220-220l0 110c0 10-4 18-11 26-7 7-16 10-26 10-10 0-18-3-25-10-8-8-11-16-11-26l0-110c0-10 3-18 11-26 7-7 15-10 25-10 10 0 19 3 26 10 7 8 11 16 11 26z m-110 220c0 10-3 18-11 25-7 8-15 11-25 11-11 0-19-3-26-11-7-7-11-15-11-25 0-11 4-19 11-26 7-7 15-11 26-11 10 0 18 4 25 11 8 7 11 15 11 26z m110 91l0 73c0 5-2 9-6 13-3 4-7 5-12 5l-366 0c-5 0-9-1-13-5-4-4-5-8-5-13l0-73c0-5 1-9 5-13 4-3 8-5 13-5l366 0c5 0 9 2 12 5 4 4 6 8 6 13z m0-91c0 10-4 18-11 25-7 8-16 11-26 11-10 0-18-3-26-11-7-7-10-15-10-25 0-11 3-19 10-26 8-7 16-11 26-11 10 0 19 4 26 11 7 7 11 15 11 26z m36 182l0-438c0-10-3-19-10-26-8-7-16-11-26-11l-402 0c-10 0-19 4-26 11-7 7-11 16-11 26l0 438c0 10 4 19 11 26 7 7 16 11 26 11l402 0c10 0 18-4 26-11 7-7 10-16 10-26z"/>
<glyph glyph-name="map-marker" unicode="&#55;" d="M329 329c0 20-7 38-21 52-15 14-32 21-52 21-20 0-37-7-52-21-14-14-21-32-21-52 0-20 7-37 21-52 15-14 32-21 52-21 20 0 37 7 52 21 14 15 21 32 21 52z m73 0c0-21-3-38-9-51l-104-221c-3-6-8-11-14-15-6-4-12-5-19-5-7 0-13 1-19 5-6 4-11 9-14 15l-104 221c-6 13-9 30-9 51 0 41 14 75 43 104 28 28 63 42 103 42 40 0 75-14 103-42 29-29 43-63 43-104z"/>
<glyph glyph-name="user-plus" unicode="&#56;" d="M165 256c-31 0-57 11-78 32-21 22-32 47-32 78 0 30 11 56 32 77 21 22 47 32 78 32 30 0 56-10 77-32 22-21 32-47 32-77 0-31-10-56-32-78-21-21-47-32-77-32z m274-37l100 0c3 0 5 0 7-2 2-2 3-4 3-7l0-55c0-2-1-4-3-6-2-2-4-3-7-3l-100 0 0-100c0-3-1-5-3-7-2-2-4-2-6-2l-55 0c-3 0-5 0-7 2-1 2-2 4-2 7l0 100-101 0c-2 0-4 1-6 3-2 2-3 4-3 6l0 55c0 3 1 5 3 7 2 2 4 2 6 2l101 0 0 101c0 2 1 5 2 6 2 2 4 3 7 3l55 0c2 0 4-1 6-3 2-1 3-4 3-6z m-210-64c0-9 3-18 10-25 8-8 16-11 26-11l73 0 0-68c-13-10-29-14-49-14l-249 0c-23 0-42 6-56 19-14 13-21 32-21 55 0 10 1 20 1 29 1 10 2 20 4 31 2 11 5 22 8 31 3 10 7 19 12 28 5 9 11 17 18 23 7 7 15 12 24 16 10 3 21 5 32 5 4 0 8-1 11-5 15-11 30-20 45-26 14-6 30-8 47-8 17 0 32 2 47 8 14 6 29 15 44 26 4 4 7 5 11 5 25 0 46-9 62-27l-64 0c-10 0-18-4-26-11-7-7-10-16-10-26z"/>
<glyph glyph-name="file-text-o" unicode="&#57;" d="M456 403c5-5 10-12 14-21 4-9 5-18 5-25l0-330c0-7-2-14-8-19-5-5-11-8-19-8l-384 0c-8 0-14 3-19 8-6 5-8 12-8 19l0 458c0 7 2 14 8 19 5 5 11 8 19 8l256 0c8 0 16-2 25-6 9-4 17-8 22-13z m-127 70l0-107 108 0c-2 5-4 9-7 11l-89 90c-2 2-6 4-12 6z m110-436l0 292-119 0c-8 0-14 3-19 8-6 5-8 12-8 20l0 118-220 0 0-438z m-293 246c0 3 1 5 3 7 2 2 4 3 6 3l202 0c2 0 4-1 6-3 2-2 3-4 3-7l0-18c0-3-1-5-3-6-2-2-4-3-6-3l-202 0c-2 0-4 1-6 3-2 1-3 3-3 6z m211-64c2 0 4 0 6-2 2-2 3-4 3-7l0-18c0-3-1-5-3-7-2-1-4-2-6-2l-202 0c-2 0-4 1-6 2-2 2-3 4-3 7l0 18c0 3 1 5 3 7 2 2 4 2 6 2z m0-73c2 0 4-1 6-2 2-2 3-4 3-7l0-18c0-3-1-5-3-7-2-1-4-2-6-2l-202 0c-2 0-4 1-6 2-2 2-3 4-3 7l0 18c0 3 1 5 3 7 2 1 4 2 6 2z"/>
<glyph glyph-name="file-text" unicode="&#33;" d="M456 376c3-3 5-6 8-10l-135 0 0 135c4-3 8-6 10-8z m-136-47l155 0 0-302c0-7-2-14-8-19-5-5-11-8-19-8l-384 0c-8 0-14 3-19 8-6 5-8 12-8 19l0 458c0 7 2 14 8 19 5 5 11 8 19 8l229 0 0-155c0-8 2-15 8-20 5-5 11-8 19-8z m46-210l0 18c0 3-1 5-3 7-2 1-4 2-6 2l-202 0c-2 0-4-1-6-2-2-2-3-4-3-7l0-18c0-3 1-5 3-7 2-1 4-2 6-2l202 0c2 0 4 1 6 2 2 2 3 4 3 7z m0 73l0 18c0 3-1 5-3 7-2 2-4 2-6 2l-202 0c-2 0-4 0-6-2-2-2-3-4-3-7l0-18c0-3 1-5 3-7 2-1 4-2 6-2l202 0c2 0 4 1 6 2 2 2 3 4 3 7z m0 73l0 18c0 3-1 5-3 7-2 2-4 3-6 3l-202 0c-2 0-4-1-6-3-2-2-3-4-3-7l0-18c0-3 1-5 3-6 2-2 4-3 6-3l202 0c2 0 4 1 6 3 2 1 3 3 3 6z"/>
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -14,6 +14,8 @@
//= require jquery_ujs
//= require jquery-ui/widgets/datepicker
//= require jquery-ui/i18n/datepicker-es
//= require jquery-ui/widgets/autocomplete
//= require jquery-ui/widgets/sortable
//= require jquery-fileupload/basic
//= require foundation
//= require turbolinks
@@ -62,8 +64,16 @@
//= require followable
//= require flaggable
//= require documentable
//= require imageable
//= require tree_navigator
//= require custom
//= require tag_autocomplete
//= require polls_admin
//= require leaflet
//= require map
//= require polls
//= require sortable
//= require table_sortable
var initialize_modules = function() {
App.Comments.initialize();
@@ -98,10 +108,17 @@ var initialize_modules = function() {
App.WatchFormChanges.initialize();
App.TreeNavigator.initialize();
App.Documentable.initialize();
App.Imageable.initialize();
App.TagAutocomplete.initialize();
App.PollsAdmin.initialize();
App.Map.initialize();
App.Polls.initialize();
App.Sortable.initialize();
App.TableSortable.initialize();
};
$(function(){
Turbolinks.enableProgressBar()
Turbolinks.enableProgressBar();
$(document).ready(initialize_modules);
$(document).on('page:load', initialize_modules);

View File

@@ -1,101 +1,156 @@
App.Documentable =
initialize: ->
@initializeDirectUploads()
@initializeInterface()
initializeDirectUploads: ->
inputFiles = $('.js-document-attachment')
$.each inputFiles, (index, input) ->
App.Documentable.initializeDirectUploadInput(input)
$('input.js-document-attachment[type=file]').fileupload
$('#nested-documents').on 'cocoon:after-remove', (e, insertedItem) ->
App.Documentable.unlockUploads()
paramName: "document[attachment]"
$('#nested-documents').on 'cocoon:after-insert', (e, nested_document) ->
input = $(nested_document).find('.js-document-attachment')
App.Documentable.initializeDirectUploadInput(input)
if $(nested_document).closest('#nested-documents').find('.document:visible').length >= $('#nested-documents').data('max-documents-allowed')
App.Documentable.lockUploads()
initializeDirectUploadInput: (input) ->
inputData = @buildData([], input)
@initializeRemoveCachedDocumentLink(input, inputData)
$(input).fileupload
paramName: "attachment"
formData: null
add: (e, data) ->
wrapper = $(e.target).closest('.document')
index = $(e.target).data('index')
is_nested_document = $(e.target).data('nested-document')
$(wrapper).find('.progress-bar-placeholder').empty()
data.progressBar = $(wrapper).find('.progress-bar-placeholder').html('<div class="progress-bar"><div class="loading-bar uploading"></div></div>')
$(wrapper).find('.progress-bar-placeholder').css('display','block')
data.formData = {
"document[title]": $(wrapper).find('input.document-title').val() || data.files[0].name
"index": index,
"nested_document": is_nested_document
}
data = App.Documentable.buildFileUploadData(e, data)
App.Documentable.clearProgressBar(data)
App.Documentable.setProgressBar(data, 'uploading')
data.submit()
change: (e, data) ->
wrapper = $(e.target).parent()
$.each(data.files, (index, file)->
$(wrapper).find('.file-name').text(file.name)
)
$.each data.files, (index, file) ->
App.Documentable.setFilename(inputData, file.name)
fail: (e, data) ->
$(data.cachedAttachmentField).val("")
App.Documentable.clearFilename(data)
App.Documentable.setProgressBar(data, 'errors')
App.Documentable.clearInputErrors(data)
App.Documentable.setInputErrors(data)
$(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove()
$(data.addAttachmentLabel).addClass('error')
$(data.addAttachmentLabel).show()
done: (e, data) ->
$(data.cachedAttachmentField).val(data.result.cached_attachment)
App.Documentable.setTitleFromFile(data, data.result.filename)
App.Documentable.setProgressBar(data, 'complete')
App.Documentable.setFilename(data, data.result.filename)
App.Documentable.clearInputErrors(data)
$(data.addAttachmentLabel).hide()
$(data.wrapper).find(".attachment-actions").removeClass('small-12').addClass('small-6 float-right')
$(data.wrapper).find(".attachment-actions .action-remove").removeClass('small-3').addClass('small-12')
destroyAttachmentLink = $(data.result.destroy_link)
$(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink)
$(destroyAttachmentLink).on 'click', (e) ->
e.preventDefault()
e.stopPropagation()
App.Documentable.doDeleteCachedAttachmentRequest(this.href, data)
progress: (e, data) ->
progress = parseInt(data.loaded / data.total * 100, 10)
$(data.progressBar).find('.loading-bar').css 'width', progress + '%'
return
initializeInterface: ->
input_files = $('input.js-document-attachment[type=file]')
buildFileUploadData: (e, data) ->
data = @buildData(data, e.target)
return data
$.each input_files, (index, file) ->
wrapper = $(file).parent()
App.Documentable.watchRemoveDocumentbutton(wrapper)
buildData: (data, input) ->
wrapper = $(input).closest('.direct-upload')
data.input = input
data.wrapper = wrapper
data.progressBar = $(wrapper).find('.progress-bar-placeholder')
data.errorContainer = $(wrapper).find('.attachment-errors')
data.fileNameContainer = $(wrapper).find('p.file-name')
data.destroyAttachmentLinkContainer = $(wrapper).find('.action-remove')
data.addAttachmentLabel = $(wrapper).find('.action-add label')
data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']")
data.titleField = $(wrapper).find("input[name$='[title]']")
$(wrapper).find('.progress-bar-placeholder').css('display', 'block')
return data
watchRemoveDocumentbutton: (wrapper) ->
remove_document_button = $(wrapper).find('.remove-document')
$(remove_document_button).on 'click', (e) ->
clearFilename: (data) ->
$(data.fileNameContainer).text('')
$(data.fileNameContainer).hide()
clearInputErrors: (data) ->
$(data.errorContainer).find('small.error').remove()
clearProgressBar: (data) ->
$(data.progressBar).find('.loading-bar').removeClass('complete errors uploading').css('width', "0px")
setFilename: (data, file_name) ->
$(data.fileNameContainer).text(file_name)
$(data.fileNameContainer).show()
setProgressBar: (data, klass) ->
$(data.progressBar).find('.loading-bar').addClass(klass)
setTitleFromFile: (data, title) ->
if $(data.titleField).val() == ""
$(data.titleField).val(title)
setInputErrors: (data) ->
errors = '<small class="error">' + data.jqXHR.responseJSON.errors + '</small>'
$(data.errorContainer).append(errors)
lockUploads: ->
$('#max-documents-notice').removeClass('hide')
$('#new_document_link').addClass('hide')
unlockUploads: ->
$('#max-documents-notice').addClass('hide')
$('#new_document_link').removeClass('hide')
doDeleteCachedAttachmentRequest: (url, data) ->
$.ajax
type: "POST"
url: url
dataType: "json"
data: { "_method": "delete" }
complete: ->
$(data.cachedAttachmentField).val("")
$(data.addAttachmentLabel).show()
App.Documentable.clearFilename(data)
App.Documentable.clearInputErrors(data)
App.Documentable.clearProgressBar(data)
App.Documentable.unlockUploads()
$(data.wrapper).find(".attachment-actions").addClass('small-12').removeClass('small-6 float-right')
$(data.wrapper).find(".attachment-actions .action-remove").addClass('small-3').removeClass('small-12')
if $(data.input).data('nested-document') == true
$(data.wrapper).remove()
else
$(data.wrapper).find('a.remove-cached-attachment').remove()
initializeRemoveCachedDocumentLink: (input, data) ->
wrapper = $(input).closest(".direct-upload")
remove_document_link = $(wrapper).find('a.remove-cached-attachment')
$(remove_document_link).on 'click', (e) ->
e.preventDefault()
$(wrapper).remove()
$('#new_document_link').show()
$('.max-documents-notice').hide()
e.stopPropagation()
App.Documentable.doDeleteCachedAttachmentRequest(this.href, data)
uploadNestedDocument: (id, nested_document, result) ->
$('#' + id).replaceWith(nested_document)
@updateLoadingBar(id, result)
@initialize()
uploadPlainDocument: (id, nested_document, result) ->
$('#' + id).replaceWith(nested_document)
@updateLoadingBar(id, result)
@initialize()
updateLoadingBar: (id, result) ->
if result
$('#' + id).find('.loading-bar').addClass 'complete'
else
$('#' + id).find('.loading-bar').addClass 'errors'
$('#' + id).find('.progress-bar-placeholder').css('display','block')
new: (nested_fields) ->
$(".documents-list").append(nested_fields)
@initialize()
destroyNestedDocument: (id, notice) ->
removeDocument: (id) ->
$('#' + id).remove()
@updateNotice(notice)
replacePlainDocument: (id, notice, plain_document) ->
$('#' + id).replaceWith(plain_document)
@updateNotice(notice)
@initialize()
updateNotice: (notice) ->
if $('[data-alert]').length > 0
$('[data-alert]').replaceWith(notice)
else
$("body").append(notice)
updateNewDocumentButton: (link) ->
if $('.document').length >= $('.documents').data('max-documents')
$('#new_document_link').hide()
$('.max-documents-notice').removeClass('hide')
$('.max-documents-notice').show()
else if $('#new_document_link').length > 0
$('#new_document_link').replaceWith(link)
$('.max-documents-notice').hide()
else
$('.max-documents-notice').hide()
$(link).insertBefore('.documents hr:last')

View File

@@ -0,0 +1,166 @@
App.Imageable =
initialize: ->
inputFiles = $('.js-image-attachment')
$.each inputFiles, (index, input) ->
App.Imageable.initializeDirectUploadInput(input)
$('#nested-image').on 'cocoon:after-remove', (e, item) ->
$("#new_image_link").removeClass('hide')
$('#nested-image').on 'cocoon:before-insert', (e, nested_image) ->
if $(".js-image-attachment").length > 0
$(".js-image-attachment").closest('.image').remove()
$('#nested-image').on 'cocoon:after-insert', (e, nested_image) ->
$("#new_image_link").addClass('hide')
input = $(nested_image).find('.js-image-attachment')
App.Imageable.initializeDirectUploadInput(input)
initializeDirectUploadInput: (input) ->
inputData = @buildData([], input)
@initializeRemoveCachedImageLink(input, inputData)
$(input).fileupload
paramName: "attachment"
formData: null
add: (e, data) ->
data = App.Imageable.buildFileUploadData(e, data)
App.Imageable.clearProgressBar(data)
App.Imageable.setProgressBar(data, 'uploading')
data.submit()
change: (e, data) ->
$.each data.files, (index, file) ->
App.Imageable.setFilename(inputData, file.name)
fail: (e, data) ->
$(data.cachedAttachmentField).val("")
App.Imageable.clearFilename(data)
App.Imageable.setProgressBar(data, 'errors')
App.Imageable.clearInputErrors(data)
App.Imageable.setInputErrors(data)
App.Imageable.clearPreview(data)
$(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove()
$(data.addAttachmentLabel).addClass('error')
$(data.addAttachmentLabel).show()
done: (e, data) ->
$(data.cachedAttachmentField).val(data.result.cached_attachment)
App.Imageable.setTitleFromFile(data, data.result.filename)
App.Imageable.setProgressBar(data, 'complete')
App.Imageable.setFilename(data, data.result.filename)
App.Imageable.clearInputErrors(data)
$(data.addAttachmentLabel).hide()
$(data.wrapper).find(".attachment-actions").removeClass('small-12').addClass('small-6 float-right')
$(data.wrapper).find(".attachment-actions .action-remove").removeClass('small-3').addClass('small-12')
App.Imageable.setPreview(data)
destroyAttachmentLink = $(data.result.destroy_link)
$(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink)
$(destroyAttachmentLink).on 'click', (e) ->
e.preventDefault()
e.stopPropagation()
App.Imageable.doDeleteCachedAttachmentRequest(this.href, data)
progress: (e, data) ->
progress = parseInt(data.loaded / data.total * 100, 10)
$(data.progressBar).find('.loading-bar').css 'width', progress + '%'
return
buildFileUploadData: (e, data) ->
data = @buildData(data, e.target)
return data
buildData: (data, input) ->
wrapper = $(input).closest('.direct-upload')
data.input = input
data.wrapper = wrapper
data.progressBar = $(wrapper).find('.progress-bar-placeholder')
data.preview = $(wrapper).find('.image-preview')
data.errorContainer = $(wrapper).find('.attachment-errors')
data.fileNameContainer = $(wrapper).find('p.file-name')
data.destroyAttachmentLinkContainer = $(wrapper).find('.action-remove')
data.addAttachmentLabel = $(wrapper).find('.action-add label')
data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']")
data.titleField = $(wrapper).find("input[name$='[title]']")
$(wrapper).find('.progress-bar-placeholder').css('display', 'block')
return data
clearFilename: (data) ->
$(data.fileNameContainer).text('')
$(data.fileNameContainer).hide()
clearInputErrors: (data) ->
$(data.errorContainer).find('small.error').remove()
clearProgressBar: (data) ->
$(data.progressBar).find('.loading-bar').removeClass('complete errors uploading').css('width', "0px")
clearPreview: (data) ->
$(data.wrapper).find('.image-preview').remove()
setFilename: (data, file_name) ->
$(data.fileNameContainer).text(file_name)
$(data.fileNameContainer).show()
setProgressBar: (data, klass) ->
$(data.progressBar).find('.loading-bar').addClass(klass)
setTitleFromFile: (data, title) ->
if $(data.titleField).val() == ""
$(data.titleField).val(title)
setInputErrors: (data) ->
errors = '<small class="error">' + data.jqXHR.responseJSON.errors + '</small>'
$(data.errorContainer).append(errors)
setPreview: (data) ->
image_preview = '<div class="small-12 column text-center image-preview"><figure><img src="' + data.result.attachment_url + '" class="cached-image"/></figure></div>'
if $(data.preview).length > 0
$(data.preview).replaceWith(image_preview)
else
$(image_preview).insertBefore($(data.wrapper).find(".attachment-actions"))
data.preview = $(data.wrapper).find('.image-preview')
doDeleteCachedAttachmentRequest: (url, data) ->
$.ajax
type: "POST"
url: url
dataType: "json"
data: { "_method": "delete" }
complete: ->
$(data.cachedAttachmentField).val("")
$(data.addAttachmentLabel).show()
App.Imageable.clearFilename(data)
App.Imageable.clearInputErrors(data)
App.Imageable.clearProgressBar(data)
App.Imageable.clearPreview(data)
$('#new_image_link').removeClass('hide')
$(data.wrapper).find(".attachment-actions").addClass('small-12').removeClass('small-6 float-right')
$(data.wrapper).find(".attachment-actions .action-remove").addClass('small-3').removeClass('small-12')
if $(data.input).data('nested-image') == true
$(data.wrapper).remove()
else
$(data.wrapper).find('a.remove-cached-attachment').remove()
initializeRemoveCachedImageLink: (input, data) ->
wrapper = $(input).closest(".direct-upload")
remove_image_link = $(wrapper).find('a.remove-cached-attachment')
$(remove_image_link).on 'click', (e) ->
e.preventDefault()
e.stopPropagation()
App.Imageable.doDeleteCachedAttachmentRequest(this.href, data)
removeImage: (id) ->
$('#' + id).remove()
$("#new_image_link").removeClass('hide')

View File

@@ -1,14 +1,9 @@
App.Legislation =
initialize: ->
$('#js-toggle-debate').on
click: ->
$('#debate-show').toggle()
$('#js-toggle-small-debate').on
click: ->
$('#debate-show').toggle()
$('span').toggleClass('icon-angle-up')
$(this).find($('span')).toggleClass('icon-angle-up')
$('form#new_legislation_answer input.button').hide()
$('form#new_legislation_answer input[type=radio]').on
@@ -19,7 +14,3 @@ App.Legislation =
$('form#draft_version_go_to_version select').on
change: ->
$('form#draft_version_go_to_version').submit()
$('#js-toggle-legislation-process-header').on
click: ->
$('[data-target="legislation-header-full"]').toggle()

View File

@@ -0,0 +1,86 @@
App.Map =
initialize: ->
maps = $('*[data-map]')
if maps.length > 0
$.each maps, (index, map) ->
App.Map.initializeMap map
$('.js-toggle-map').on
click: ->
App.Map.toogleMap()
initializeMap: (element) ->
mapCenterLatitude = $(element).data('map-center-latitude')
mapCenterLongitude = $(element).data('map-center-longitude')
markerLatitude = $(element).data('marker-latitude')
markerLongitude = $(element).data('marker-longitude')
zoom = $(element).data('map-zoom')
mapTilesProvider = $(element).data('map-tiles-provider')
mapAttribution = $(element).data('map-tiles-provider-attribution')
latitudeInputSelector = $(element).data('latitude-input-selector')
longitudeInputSelector = $(element).data('longitude-input-selector')
zoomInputSelector = $(element).data('zoom-input-selector')
removeMarkerSelector = $(element).data('marker-remove-selector')
editable = $(element).data('marker-editable')
marker = null;
markerIcon = L.divIcon(
className: 'map-marker'
iconSize: [30, 30]
iconAnchor: [15, 40]
html: '<div class="map-icon"></div>')
createMarker = (latitude, longitude) ->
markerLatLng = new (L.LatLng)(latitude, longitude)
marker = L.marker(markerLatLng, { icon: markerIcon, draggable: editable })
if editable
marker.on 'dragend', updateFormfields
marker.addTo(map)
return marker
removeMarker = (e) ->
e.preventDefault()
if marker
map.removeLayer(marker)
marker = null;
clearFormfields()
return
moveOrPlaceMarker = (e) ->
if marker
marker.setLatLng(e.latlng)
else
marker = createMarker(e.latlng.lat, e.latlng.lng)
updateFormfields()
return
updateFormfields = ->
$(latitudeInputSelector).val marker.getLatLng().lat
$(longitudeInputSelector).val marker.getLatLng().lng
$(zoomInputSelector).val map.getZoom()
return
clearFormfields = ->
$(latitudeInputSelector).val ''
$(longitudeInputSelector).val ''
$(zoomInputSelector).val ''
return
mapCenterLatLng = new (L.LatLng)(mapCenterLatitude, mapCenterLongitude)
map = L.map(element.id).setView(mapCenterLatLng, zoom)
L.tileLayer(mapTilesProvider, attribution: mapAttribution).addTo map
if markerLatitude && markerLongitude
marker = createMarker(markerLatitude, markerLongitude)
if editable
$(removeMarkerSelector).on 'click', removeMarker
map.on 'zoomend', updateFormfields
map.on 'click', moveOrPlaceMarker
toogleMap: ->
$('.map').toggle()
$('.location-map-remove-marker-button').toggle()

View File

@@ -0,0 +1,44 @@
App.Polls =
generateToken: ->
token = ''
rand = ''
for n in [0..5]
rand = Math.random().toString(36).substr(2) # remove `0.`
token = token + rand;
token = token.substring(0, 64)
return token
replaceToken: ->
for link in $('.js-question-answer')
token_param = link.search.slice(-6)
if token_param == "token="
link.href = link.href + @token
initialize: ->
@token = App.Polls.generateToken()
App.Polls.replaceToken()
$(".js-question-answer").on
click: =>
token_message = $(".js-token-message")
if !token_message.is(':visible')
token_message.html(token_message.html() + "<br><strong>" + @token + "</strong>");
token_message.show()
false
$(".zoom-link").on "click", (event) ->
element = event.target
answer = $(element).closest('div.answer')
if $(answer).hasClass('medium-6')
$(answer).removeClass("medium-6");
$(answer).addClass("answer-divider");
unless $(answer).hasClass('first')
$(answer).insertBefore($(answer).prev('div.answer'));
else
$(answer).addClass("medium-6");
$(answer).removeClass("answer-divider");
unless $(answer).hasClass('first')
$(answer).insertAfter($(answer).next('div.answer'));

View File

@@ -0,0 +1,12 @@
App.PollsAdmin =
initialize: ->
$("select[class='js-poll-shifts']").on
change: ->
switch ($(this).val())
when 'vote_collection'
$("select[class='js-shift-vote-collection-dates']").show();
$("select[class='js-shift-recount-scrutiny-dates']").hide();
when 'recount_scrutiny'
$("select[class='js-shift-recount-scrutiny-dates']").show();
$("select[class='js-shift-vote-collection-dates']").hide();

View File

@@ -22,11 +22,13 @@ App.PreventDoubleSubmission =
initialize: ->
$('form').on('submit', (event) ->
buttons = $(this).find(':button, :submit')
App.PreventDoubleSubmission.disable_buttons(buttons)
).on('ajax:success', ->
buttons = $(this).find(':button, :submit')
App.PreventDoubleSubmission.reset_buttons(buttons)
unless event.target.id == "new_officing_voter"
buttons = $(this).find(':button, :submit')
App.PreventDoubleSubmission.disable_buttons(buttons)
).on('ajax:success', (event) ->
unless event.target.id == "new_officing_voter"
buttons = $(this).find(':button, :submit')
App.PreventDoubleSubmission.reset_buttons(buttons)
)
false

View File

@@ -0,0 +1,9 @@
App.Sortable =
initialize: ->
$(".sortable").sortable
update: (event, ui) ->
new_order = $(this).sortable('toArray', {attribute: 'data-answer-id'});
$.ajax
url: $('.sortable').data('js-url'),
data: {ordered_list: new_order},
type: 'POST'

View File

@@ -0,0 +1,23 @@
App.TableSortable =
getCellValue: (row, index) ->
$(row).children('td').eq(index).text()
comparer: (index) ->
(a, b) ->
valA = App.TableSortable.getCellValue(a, index)
valB = App.TableSortable.getCellValue(b, index)
return if $.isNumeric(valA) and $.isNumeric(valB) then valA - valB else valA.localeCompare(valB)
initialize: ->
$('table.sortable th').click ->
table = $(this).parents('table').eq(0)
rows = table.find('tr:gt(0)').not('tfoot tr').toArray().sort(App.TableSortable.comparer($(this).index()))
@asc = !@asc
if !@asc
rows = rows.reverse()
i = 0
while i < rows.length
table.append rows[i]
i++
return

View File

@@ -0,0 +1,34 @@
App.TagAutocomplete =
split: ( val ) ->
return (val.split( /,\s*/ ))
extractLast: ( term ) ->
return (App.TagAutocomplete.split( term ).pop())
init_autocomplete: ->
$('.tag-autocomplete').autocomplete
source: (request, response) ->
$.ajax
url: $('.tag-autocomplete').data('js-url'),
data: {search: App.TagAutocomplete.extractLast( request.term )},
type: 'GET',
dataType: 'json'
success: ( data ) ->
response( data );
minLength: 0,
search: ->
App.TagAutocomplete.extractLast( this.value );
focus: ->
return false;
select: ( event, ui ) -> (
terms = App.TagAutocomplete.split( this.value );
terms.pop();
terms.push( ui.item.value );
terms.push( "" );
this.value = terms.join( ", " );
return false;);
initialize: ->
App.TagAutocomplete.init_autocomplete();

View File

@@ -75,3 +75,5 @@ $accordion-content-color: foreground($accordion-background, $text);
$tab-item-font-size: $base-font-size;
$tab-item-padding: $line-height / 2 0;
$tab-content-border: $border;
$orbit-bullet-diameter: 0.8rem;

View File

@@ -8,38 +8,105 @@
// 06. Polls
// 07. Legislation
// 08. CMS
// 09. Map
//
// 01. Global styles
// -----------------
$admin-color: #cf3638;
$admin-color: #245b80;
$sidebar: #245b80;
$sidebar-hover: #25597c;
$sidebar-active: #f4fcd0;
.admin {
h2 {
font-weight: 100;
margin-bottom: $line-height;
&.title {
text-transform: uppercase;
}
}
.back {
float: none;
}
.header {
border: 0;
}
.top-links {
background: darken($admin-color, 15%);
}
.back-web {
padding-top: $line-height / 4;
text-decoration: underline;
background: #000;
}
.top-bar {
background: $admin-color !important;
background: #fff !important;
border-bottom: 1px solid #eee;
box-shadow: 0 2px 2px #eee;
color: #000;
height: auto;
[class^="icon-"]:not(.icon-circle) {
font-size: $base-font-size;
}
}
.top-bar-title {
h1 {
margin-bottom: 0;
margin-top: $line-height / 2;
@include breakpoint(medium) {
margin-left: $line-height / 2;
}
small {
color: #000;
text-transform: uppercase;
}
}
a {
color: #000 !important;
line-height: $line-height !important;
@include breakpoint(medium) {
line-height: $line-height !important;
}
}
}
.top-bar .menu > li {
@include breakpoint(medium) {
height: auto !important;
padding-top: $line-height / 2;
}
a {
color: #000 !important;
}
}
.menu-icon.dark {
&::after,
&:hover::after {
background: #000 !important;
box-shadow: 0 7px 0 #000, 0 14px 0 #000 !important;
}
}
.notifications .icon-circle {
color: $admin-color;
}
.dropdown.menu > .is-dropdown-submenu-parent > a::after {
border-color: #000 transparent transparent;
}
.fieldset {
@@ -54,7 +121,8 @@ $admin-color: #cf3638;
}
}
th, td {
th,
td {
text-align: left;
&.text-center {
@@ -81,6 +149,7 @@ $admin-color: #cf3638;
}
table {
.break {
word-break: break-word;
}
@@ -107,9 +176,19 @@ $admin-color: #cf3638;
max-width: none;
}
.menu.simple .active {
border-bottom: 2px solid $admin-color;
color: $admin-color;
.menu.simple {
margin-bottom: $line-height / 2;
h2 {
font-weight: bold;
margin-bottom: $line-height / 3;
}
.active {
border-bottom: 2px solid $admin-color;
color: $admin-color;
font-weight: bold;
}
}
.tabs-panel {
@@ -191,10 +270,17 @@ $admin-color: #cf3638;
}
}
.sortable thead th:hover {
text-decoration: underline;
cursor: pointer;
}
// 02. Sidebar
// -----------
.admin-sidebar {
background: $sidebar;
background: linear-gradient(to bottom, #245b80 0%, #488fb5 100%);
border-right: 1px solid $border;
@include breakpoint(medium) {
@@ -208,7 +294,7 @@ $admin-color: #cf3638;
padding: 0;
[class^="icon-"] {
color: $admin-color;
color: #fff;
display: inline-block;
font-size: rem-calc(24);
line-height: $line-height;
@@ -219,39 +305,32 @@ $admin-color: #cf3638;
}
li {
background: #fff;
margin: 0;
outline: 0;
ul {
margin-left: $line-height / 1.5;
border-left: 1px solid $border;
border-left: 1px solid $sidebar-hover;
padding-left: $line-height / 2;
}
&.section-title {
border-bottom: 1px solid $border;
}
&.active a {
background: #f3f6f7;
border-radius: rem-calc(6);
color: $admin-color;
background: $sidebar-hover;
border-left: 2px solid $sidebar-active;
font-weight: bold;
}
}
li a {
color: $text;
color: #fff;
display: block;
line-height: rem-calc(48);
padding-left: rem-calc(12);
vertical-align: top;
&:hover {
background: #f3f6f7;
border-radius: rem-calc(6);
color: $admin-color;
background: $sidebar-hover;
color: #fff;
text-decoration: none;
}
}
@@ -259,7 +338,13 @@ $admin-color: #cf3638;
.is-accordion-submenu-parent {
> a::after {
border-color: $admin-color transparent transparent;
border: 0;
content: '\61' !important;
font-family: "icons" !important;
height: auto;
position: absolute !important;
right: 30px;
top: 6px !important;
}
}
@@ -525,6 +610,7 @@ table {
.callout {
height: $line-height * 2;
line-height: $line-height * 2;
margin: 0;
padding: 0 $line-height / 2;
}
}
@@ -898,3 +984,51 @@ table {
border: 0;
}
}
// 09. Map
// --------------
.map {
width: 100%;
height: 350px;
.map-marker {
visibility: visible;
position: absolute;
left: 50%;
top: 50%;
margin-top: -5px;
.map-icon {
width: 30px;
height: 30px;
border-radius: 50% 50% 50% 0;
background: #00cae9;
transform: rotate(-45deg);
}
.map-icon::after {
content: '';
width: 14px;
height: 14px;
margin: 8px 0 0 8px;
background: #fff;
position: absolute;
border-radius: 50%;
}
}
.map-attributtion {
visibility: visible;
height: auto;
}
}
.map-marker {
visibility: hidden;
}
.map-attributtion {
visibility: hidden;
height: 0;
}

View File

@@ -16,4 +16,7 @@
@import 'annotator_overrides';
@import 'jquery-ui/datepicker';
@import 'datepicker_overrides';
@import 'documentable';
@import 'jquery-ui/autocomplete';
@import 'autocomplete_overrides';
@import 'jquery-ui/sortable';
@import 'leaflet';

View File

@@ -0,0 +1,40 @@
// Overrides styles of jquery-ui/autocomplete
//
/* Autocomplete
----------------------------------*/
.ui-autocomplete {
position: absolute;
cursor: default;
}
/* workarounds */
* html .ui-autocomplete {
width: 1px;
} /* without this, the menu expands to 100% in IE6 */
/* Menu
----------------------------------*/
.ui-menu {
list-style: none;
padding: $line-height / 4 $line-height / 3;
display: block;
background: #fff;
border: 1px solid $border;
font-size: $small-font-size;
.ui-menu-item {
.ui-menu-item-wrapper {
padding: $line-height / 4 $line-height / 3;
position: relative;
}
.ui-state-hover,
.ui-state-active {
background: #ececec;
border-radius: rem-calc(6);
}
}
}

View File

@@ -1,63 +0,0 @@
.progress-bar-placeholder {
display: none;
}
.document-form {
.document .file-name {
margin-top: 0;
}
.progress-bar-placeholder {
margin-bottom: 15px;
}
.document .loading-bar.errors {
margin-top: $line-height * 2;
}
}
.document {
.button {
font-weight: normal;
}
.progress-bar {
width: 100%;
background-color: $light-gray;
}
.js-document-attachment {
display: none;
}
.file-name {
margin-top: $line-height / 2;
}
.loading-bar {
height: 5px;
width: 0;
transition: width 500ms ease-out;
&.uploading {
background-color: $dark-gray;
}
&.complete {
background-color: $success-color;
width: 100%;
}
&.errors {
background-color: $alert-color;
width: 100%;
margin-top: $line-height / 2;
}
}
.loading-bar.no-transition {
transition: none;
}
}

View File

@@ -4,6 +4,7 @@
@import 'consul_settings';
@import 'custom_settings';
@import 'foundation';
@import 'motion-ui/motion-ui';
@include foundation-global-styles;
@include foundation-grid;
@@ -37,3 +38,7 @@
@include foundation-title-bar;
@include foundation-top-bar;
@include foundation-menu-icon;
@include foundation-orbit;
@include motion-ui-transitions;
@include motion-ui-animations;

View File

@@ -97,10 +97,6 @@
content: '\72';
}
.icon-documents::before {
content: '\68';
}
.icon-proposals::before {
content: '\68';
}
@@ -260,3 +256,35 @@
.icon-instagram::before {
content: '\32';
}
.icon-image::before {
content: '\33';
}
.icon-search-plus::before {
content: '\34';
}
.icon-search-minus::before {
content: '\35';
}
.icon-calculator::before {
content: '\36';
}
.icon-map-marker::before {
content: '\37';
}
.icon-user-plus::before {
content: '\38';
}
.icon-file-text-o::before {
content: '\39';
}
.icon-file-text::before {
content: '\21';
}

View File

@@ -18,7 +18,10 @@
// 16. Flags
// 17. Activity
// 18. Banners
// 19. Documents
// 19. Recommended Section Home
// 20. Documents
// 21. Related content
// 22. Images
//
// 01. Global styles
@@ -154,6 +157,10 @@ a {
margin-bottom: $line-height;
}
.margin-left {
margin-left: $line-height;
}
.margin-right {
margin-right: $line-height;
}
@@ -205,19 +212,42 @@ a {
.menu.simple {
border-bottom: 1px solid $border;
margin-bottom: $line-height;
clear: both;
margin-bottom: $line-height / 2;
li {
padding-bottom: rem-calc(7);
font-size: $base-font-size;
margin-bottom: 0;
margin-right: $line-height / 2;
@include breakpoint(medium) {
margin-right: $line-height * 1.5;
}
a {
color: $text-medium;
color: $text;
display: inline-block;
font-weight: bold;
position: relative;
text-align: left;
&:hover {
color: $link;
}
}
&.active {
border-bottom: 2px solid $brand;
color: $brand;
}
&:not(.active) {
margin-bottom: $line-height / 3;
}
}
h2 {
font-size: $base-font-size;
}
}
@@ -278,7 +308,11 @@ a {
.icon-angle-left {
clear: both;
color: $text-medium;
float: left;
display: inline-block;
}
.back:not([class^="icon-"]) {
text-decoration: underline;
}
.tabs-content {
@@ -286,13 +320,16 @@ a {
}
.tabs {
border: {
left: 0;
right: 0;
top: 0;
};
border-left: 0;
border-right: 0;
border-top: 0;
margin-bottom: $line-height;
.tabs-title {
font-size: $base-font-size;
margin-bottom: 0;
}
.tabs-title > a {
color: $text-medium;
margin-bottom: rem-calc(-1);
@@ -320,10 +357,36 @@ a {
background: $brand;
}
.truncate-horizontal-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.align-top {
vertical-align: top;
}
.aling-middle {
vertical-align: middle;
}
.table {
display: table;
}
.table-cell {
display: table-cell;
}
.off-canvas-content {
box-shadow: none;
}
.uppercase {
text-transform: uppercase;
}
// 02. Header
// ----------
@@ -367,7 +430,11 @@ header {
.top-bar-title a {
@include logo;
line-height: rem-calc(80) !important;
line-height: rem-calc(80);
@include breakpoint(medium) {
line-height: rem-calc(80);
}
&:hover {
text-decoration: none;
@@ -587,7 +654,7 @@ header {
text-align: left;
@include breakpoint(medium) {
margin-right: $line-height * 1.5;
margin-right: $line-height;
}
&:hover {
@@ -1083,8 +1150,13 @@ form {
color: #ecf00b;
font-size: rem-calc(10);
position: absolute;
right: 8px;
left: 12px;
top: 6px;
@include breakpoint(medium) {
left: auto;
right: 8px;
}
}
}
@@ -1972,94 +2044,55 @@ table {
// ------------
.activity {
margin-bottom: $line-height * 2;
.accordion li {
margin-bottom: $line-height / 2;
.accordion-title {
border-bottom: 1px solid $border;
background: #f8f9fb;
font-size: $small-font-size;
padding: $line-height / 2;
}
.accordion-content {
padding: 0;
}
}
.accordion .title {
display: block;
line-height: $line-height;
}
.accordion .icon {
font-size: rem-calc(20);
float: left;
margin-right: $line-height / 3;
&.icon-debates {
margin-top: rem-calc(3);
}
}
table {
border: 0;
margin-bottom: 0;
}
td {
position: relative;
&:first-child {
padding-left: $line-height * 1.5;
width: 75%;
}
&::before {
color: $brand;
font-family: "icons" !important;
font-size: rem-calc(24);
left: 4px;
position: absolute;
}
}
.activity-comments td:first-child::before {
content: 'e';
top: 18px;
}
.activity-debates td:first-child::before {
content: 'i';
top: 14px;
}
.activity-proposals {
td:first-child::before {
content: 'h';
top: 18px;
}
.retired {
text-decoration: line-through;
}
}
.activity-investment-projects td:first-child::before,
.activity-ballot td:first-child::before {
content: '\53';
top: 10px;
.retired {
text-decoration: line-through;
}
}
.public-interests {
margin-top: $line-height;
.column {
padding-left: 0;
li {
margin-right: $line-height / 4;
span {
background: none;
border: 1px solid #ececec;
}
}
}
.following {
.follow-list {
list-style-type: circle;
padding: $line-height / 2;
li {
margin-bottom: $line-height / 2;
margin-left: $line-height;
}
}
h3 {
font-size: rem-calc(24);
margin-top: $line-height;
padding-left: rem-calc(30);
position: relative;
span {
left: 0;
position: absolute;
top: 2px;
}
}
.interests {
@include breakpoint(medium) {
border-left: 1px solid #ececec;
padding-left: $line-height;
}
}
}
@@ -2136,68 +2169,146 @@ table {
}
}
// 19. Documents
.document-form form {
// 19. Recommended Section Home
// ----------------------------
.radio-buttons {
label {
margin-right: $line-height;
}
.home-page {
.push {
display: none;
}
}
.section-recommended {
padding: $line-height * 2 0;
h2 {
margin-bottom: $line-height * 2;
}
.source-option-link {
input {
padding-bottom: 0;
.debates,
.proposals,
.budget-investments {
@include breakpoint(medium) {
margin-bottom: 0;
}
.error {
@include breakpoint(small) {
margin-bottom: $line-height;
}
label {
&.error {
margin-bottom: 0;
}
.button.hollow {
margin-top: rem-calc(15);
}
}
.source-option-file {
.file-name {
label {
.card {
@include breakpoint(small medium) {
float: none;
}
@include breakpoint(large) {
float: left;
}
}
.card-section {
padding: $line-height 0;
max-width: rem-calc(300);
margin: 0 auto;
p {
font-size: rem-calc(15);
text-align: left;
}
}
@include breakpoint(small medium) {
float: none;
margin-top: 0;
margin-left: 0;
margin-bottom: 0;
}
.orbit {
height: rem-calc(300);
@include breakpoint(large) {
float: left;
margin-bottom: 0;
margin-top: $line-height / 2;
margin-left: $line-height;
}
.orbit-wrapper {
max-height: rem-calc(250);
overflow: hidden;
position: relative;
}
.orbit-bullets {
@include orbit-bullets;
width: 100%;
}
}
}
.attachment-errors {
margin-bottom: $line-height;
.card .orbit .orbit-wrapper .truncate {
background: image-url('truncate.png');
background-repeat: repeat-x;
bottom: 0;
height: rem-calc(20);
position: absolute;
width: 100%;
}
.debates-inner {
border-top: 4px solid $debates;
}
.proposals-inner {
border-top: 4px solid $proposals;
}
.budget-investments-inner {
border-top: 4px solid $budget;
}
.debates-inner,
.proposals-inner,
.budget-investments-inner {
background: #fff;
max-height: rem-calc(350);
@include breakpoint(small) {
max-height: rem-calc(400);
}
h4 {
margin-top: $line-height;
margin-bottom: 0;
font-size: rem-calc(18);
min-height: rem-calc(50);
}
h5 {
font-size: $small-font-size;
text-align: left;
}
}
.carousel-image {
.card .orbit {
height: rem-calc(480);
.orbit-wrapper {
max-height: rem-calc(450);
}
}
.debates-inner,
.proposals-inner,
.budget-investments-inner {
max-height: rem-calc(500);
@include breakpoint(small) {
max-height: rem-calc(600);
}
}
}
.carousel-image .orbit-wrapper img {
display: block;
@include breakpoint(small) {
margin: 0 auto;
}
}
}
// 20. Documents
// -------------
.documents-list {
table {
@@ -2254,6 +2365,149 @@ table {
}
}
}
}
.additional-document-link {
background: $highlight-soft;
border: 1px solid $highlight;
display: block;
margin: $line-height / 2 0;
padding: $line-height / 2;
position: relative;
a {
word-wrap: break-word;
}
.icon-document {
color: #007bb7;
display: inline-block;
font-size: rem-calc(24);
line-height: $line-height;
vertical-align: middle;
}
}
.document-divider {
background: #fafafa;
border-bottom: 1px solid #eee;
}
// 21. Related content
// -------------------
.related-content {
border-top: 1px solid $border;
h2 {
font-size: rem-calc(24);
span {
color: #4f4f4f;
font-weight: normal;
}
}
}
.add-related-content {
display: block;
@include breakpoint(medium) {
float: right;
}
}
.related-content-list {
list-style-type: none;
margin-left: 0;
li {
border-bottom: 1px solid $border;
margin-bottom: 0 !important;
padding: $line-height / 2;
&:first-child {
border-top: 1px solid $border;
}
@include breakpoint(medium) {
.score-actions {
display: none;
float: right;
}
}
&:hover {
background: #f9f9f9;
.score-actions {
display: block;
}
}
}
h3 {
font-size: $base-font-size;
font-weight: normal;
}
.related-content-title {
color: #4f4f4f;
font-size: rem-calc(12);
text-transform: uppercase;
}
.flag {
margin-top: $line-height / 2;
}
}
.relate-content-score {
display: block;
@include breakpoint(medium) {
text-align: center;
}
a {
font-weight: bold;
margin-right: $line-height;
padding-left: rem-calc(20);
position: relative;
text-decoration: none;
&.score-positive:before,
&.score-negative:before {
font-family: 'icons';
left: 0;
position: absolute;
}
&.score-positive {
color: $color-success;
&:before {
color: $color-success;
content: '\6c';
}
}
&.score-negative {
color: $color-alert;
&:before {
color: $color-alert;
content: '\76';
}
}
}
}
// 22. Images
// -----------------
.images .button {
margin-top: $line-height / 2;
}

View File

@@ -39,10 +39,6 @@ $border-dark: darken($border, 10%);
}
}
.legislation-debate-show {
display: none;
}
.debate-add-info {
border-top: 1px solid $border-dark;
margin-top: $line-height;
@@ -109,16 +105,13 @@ $border-dark: darken($border, 10%);
li {
cursor: pointer;
display: inline-block;
margin: 0 1rem 1rem 0;
margin-bottom: $line-height;
margin-right: $line-height;
transition: all 0.4s;
border-bottom: 2px solid transparent;
@include breakpoint(medium) {
margin-left: $line-height * 2;
}
&:first-of-type {
margin-left: 0;
margin-bottom: 0;
}
&:hover,
@@ -360,10 +353,6 @@ $border-dark: darken($border, 10%);
.legislation-allegation {
padding-top: 1rem;
.legislation-debate-show {
margin-top: 2rem;
}
.headline {
margin-bottom: 0;
@@ -459,11 +448,11 @@ $border-dark: darken($border, 10%);
span {
vertical-align: inherit;
font-style: normal;
}
a {
text-decoration: underline;
color: $text-medium;
}
.see-changes {
color: $text-medium;
text-decoration: underline;
}
}
@@ -477,6 +466,7 @@ $border-dark: darken($border, 10%);
}
.draft-allegation {
@include breakpoint(medium) {
display: flex;
padding-left: 0.9375rem;
@@ -493,7 +483,6 @@ $border-dark: darken($border, 10%);
}
}
// Panel calcs for desktop
@media screen and (min-width: 40em) {
.calc-index {
width: calc(35% - 25px);
@@ -509,6 +498,7 @@ $border-dark: darken($border, 10%);
width: rem-calc(50);
.draft-panel {
.panel-title {
display: none;
}
@@ -912,19 +902,15 @@ $border-dark: darken($border, 10%);
display: inline-block;
}
}
.show-for-medium {
.panel-title {
display: none;
}
}
}
}
}
// 08. Legislation changes
// -----------------
.legislation-changes {
ul {
list-style: none;
margin-left: 0;
@@ -936,35 +922,36 @@ $border-dark: darken($border, 10%);
margin-right: 0.25rem;
content: '';
}
}
}
.changes-link {
display: block;
margin-left: 1rem;
font-size: $small-font-size;
.changes-link {
display: block;
margin-left: 1rem;
font-size: $small-font-size;
@include breakpoint(medium) {
display: inline-block;
}
@include breakpoint(medium) {
display: inline-block;
}
a {
span {
text-decoration: underline;
}
a {
.icon-external {
text-decoration: none;
color: #999;
line-height: 0;
vertical-align: sub;
margin-left: 0.5rem;
}
span {
text-decoration: underline;
}
&:active,
&:focus,
&:hover {
text-decoration: none;
}
}
.icon-external {
text-decoration: none;
color: #999;
line-height: 0;
vertical-align: sub;
margin-left: 0.5rem;
}
&:active,
&:focus,
&:hover {
text-decoration: none;
}
}
}
@@ -972,6 +959,7 @@ $border-dark: darken($border, 10%);
// 09. Legislation comments
// -----------------
.legislation-comments {
.pull-right {
@@ -1020,6 +1008,7 @@ $border-dark: darken($border, 10%);
// 10. Legislation draft comment
// -----------------
.legislation-comment {
.annotation-share-comment {

View File

@@ -1,7 +1,9 @@
// Table of Contents
//
// 01. Logo
//
// 02. Orbit bullets
// 03. Direct uploads
// ------------------
// 01. Logo
// --------
@@ -30,3 +32,108 @@
}
}
}
// 02. Orbit bullet
// ----------------
@mixin orbit-bullets {
@include disable-mouse-outline;
position: relative;
margin-top: $orbit-bullet-margin-top;
margin-bottom: $orbit-bullet-margin-bottom;
text-align: center;
button {
width: $orbit-bullet-diameter;
height: $orbit-bullet-diameter;
margin: $orbit-bullet-margin;
border-radius: 50%;
background-color: $orbit-bullet-background;
&:hover {
background-color: $orbit-bullet-background-active;
}
&.is-active {
background-color: $orbit-bullet-background-active;
}
}
}
// 03. Direct uploads
// ------------------
@mixin direct-uploads {
.cached-image {
max-width: rem-calc(150);
max-height: rem-calc(150);
}
.progress-bar-placeholder {
display: none;
margin-bottom: $line-height;
}
.document,
.image {
.document-attachment,
.image-attachment {
padding-left: 0;
p {
margin-bottom: 0;
}
}
.attachment-errors {
> .js-image-attachment,
> .js-document-attachment {
display: none;
~ .error {
display: inline-block;
}
}
}
}
.button {
font-weight: normal;
}
.progress-bar {
width: 100%;
background-color: $light-gray;
}
.file-name {
margin-top: 0;
}
.loading-bar {
height: 5px;
width: 0;
transition: width 500ms ease-out;
&.uploading {
background-color: $dark-gray;
}
&.complete {
background-color: $success-color;
}
&.errors {
background-color: $alert-color;
margin-top: $line-height / 2;
}
}
.loading-bar.no-transition {
transition: none;
}
}

View File

@@ -44,8 +44,7 @@
// 03. Content
// ----------------------
.more-info-content,
.communities-show {
.more-info-content {
h3 {
color: $brand;

View File

@@ -8,6 +8,7 @@
// 06. Budget
// 07. Proposals successful
// 08. Polls
// 09. Polls results and stats
//
// 01. Votes and supports
@@ -256,7 +257,7 @@
.icon-debates,
.icon-proposals,
.icon-budget,
.icon-documents {
.icon-image {
font-size: rem-calc(50);
line-height: $line-height;
opacity: 0.5;
@@ -267,7 +268,7 @@
}
.icon-proposals,
.icon-documents {
.icon-image {
color: $proposals;
}
@@ -300,15 +301,27 @@
}
.proposal-form,
.document-form,
.topic-form,
.topic-new,
.document-form {
.topic-new {
.recommendations li::before {
color: $proposals;
}
}
.budget-investment-new,
.proposal-form,
.proposal-edit,
.polls-form,
.poll-question-form,
.legislation-process-new,
.legislation-process-edit,
.milestone-new,
.milestone-edit {
@include direct-uploads;
}
// 03. Show participation
// ----------------------
@@ -323,14 +336,23 @@
.draft-panels,
.debate-questions,
.communities-show,
.topic-show {
.topic-show,
.milestone-content {
p {
word-wrap: break-word;
}
.callout.proposal-retired {
font-size: $base-font-size;
.callout {
&.token-message {
background-color: #fff;
border-color: $info-border;
color: $color-info;
}
&.proposal-retired {
font-size: $base-font-size;
}
}
.social-share-full .social-share-button {
@@ -349,11 +371,6 @@
width: rem-calc(48);
}
.edit-debate,
.edit-proposal {
margin-bottom: 0;
}
.debate-info,
.proposal-info,
.investment-project-info,
@@ -465,6 +482,10 @@
.icon-video {
color: #cc181e;
}
p {
margin-bottom: 0;
}
}
.supports {
@@ -640,6 +661,42 @@
}
}
.budget-investments-list .budget-investment,
.proposals-list .proposal {
@include breakpoint(medium) {
.panel {
&.with-image {
padding: 0 $line-height / 2 0 0;
}
}
.column:first-child {
overflow: hidden;
}
.column:nth-child(2) {
float: left;
}
.column:last-child:not(:first-child) {
padding-top: $line-height / 2;
}
img {
max-width: 12rem;
}
.budget-investment-content {
ul {
margin-bottom: 0;
}
}
}
}
.debate,
.proposal,
.investment-project,
@@ -755,7 +812,7 @@
background: image-url('truncate.png');
background-repeat: repeat-x;
bottom: 0;
height: 24px;
height: rem-calc(24);
position: absolute;
width: 100%;
}
@@ -769,12 +826,6 @@
display: none;
}
.document-form {
max-width: 75rem;
margin-left: auto;
margin-right: auto;
}
.more-info {
clear: both;
color: $text-medium;
@@ -786,7 +837,9 @@
}
.debate,
.debate-show {
.debate-show,
.proposal-show,
.legislation-proposals {
.votes {
@include votes;
@@ -801,6 +854,7 @@
}
}
.proposal-show .votes,
.debate-show .votes {
border: 0;
padding: $line-height / 2 0;
@@ -859,6 +913,19 @@
}
}
.budget-investment-show {
figure {
margin: rem-calc(10) 0 0;
display: inline-block;
figcaption {
font-size: $small-font-size;
margin-top: rem-calc(10);
}
}
}
.investment-project-show .supports,
.budget-investment-show .supports {
border: 0;
@@ -1393,33 +1460,6 @@
}
}
.featured-proposals-ballot-banner,
.sucessfull-proposals-banner {
background: #2d3e50 image-url('ballot_tiny.gif') no-repeat;
background-position: 75% 0;
position: relative;
@include breakpoint(medium) {
margin-left: 0 !important;
margin-right: 0 !important;
}
@include breakpoint(large) {
background: #2d3e50 image-url('ballot.gif') no-repeat;
background-position: 90% 0;
}
h2,
a:hover h2 {
color: #ffd200 !important;
}
p {
color: #fff;
}
}
.sucessfull-proposals-banner,
.successful .panel {
.icon-successful {
@@ -1468,18 +1508,8 @@
// 08. Polls
// ----------------------
.dark-heading {
background: #2d3e50;
color: #fff;
.title {
color: #92ba48;
}
.button {
background: #fff;
color: $brand;
}
.polls-show-header {
background: #fafafa;
.callout {
@@ -1495,28 +1525,117 @@
color: $color-alert;
}
}
}
.info {
background: #314253;
padding: $line-height;
.poll-more-info,
.poll-more-info-answers {
border-top: 1px solid #eee;
}
@include breakpoint(medium) {
border-top: rem-calc(6) solid #92ba48;
.poll-more-info-answers {
background: #fafafa;
border-bottom: 1px solid #eee;
.column:nth-child(odd) {
border-right: 2px solid $text;
}
.answer-divider {
border-bottom: 2px solid $text;
border-right: 0 !important;
margin-bottom: $line-height;
padding-bottom: $line-height;
}
.answer-description {
height: 100%;
&.short {
height: rem-calc(300);
overflow: hidden;
}
}
}
a:not(.button) {
color: #fff;
text-decoration: underline;
.orbit-bullets button {
background-color: #ccc;
height: $line-height / 2;
width: $line-height / 2;
&.is-active {
background-color: $brand;
}
}
.back,
.icon-angle-left {
color: #fff;
.orbit-container {
height: 100% !important;
max-height: none !important;
li {
margin-bottom: 0 !important;
}
}
&.polls-show-header {
min-height: $line-height * 8;
.orbit-slide {
max-height: none !important;
img {
image-rendering: pixelated;
}
}
.orbit-caption {
background: #eee;
color: $text;
}
.orbit-next,
.orbit-previous {
background: rgba(34, 34, 34, 0.25);
}
.zoom-link {
background: #fff;
border-radius: rem-calc(48);
color: #000;
font-size: rem-calc(24);
font-weight: bold;
height: rem-calc(48);
line-height: rem-calc(48);
right: 12px;
padding-top: rem-calc(4);
position: absolute;
text-align: center;
top: 24px;
width: rem-calc(48);
z-index: 9;
&:hover {
background: $dark;
color: #fff;
text-decoration: none;
}
}
.image-container {
background: #fafafa;
overflow: hidden;
position: relative;
}
.poll {
&.with-image {
@include breakpoint(medium) {
padding: 0 $line-height / 2 0 0;
}
img {
height: 100%;
max-width: none;
position: absolute;
}
}
}
@@ -1614,9 +1733,13 @@
}
.section-title-divider {
border-bottom: 2px solid $brand;
color: $brand;
margin-bottom: $line-height;
border-bottom: 1px solid #eee;
color: #000;
margin: $line-height 0;
span {
border-bottom: 1px solid #000;
}
}
.poll-question {
@@ -1637,6 +1760,10 @@
margin-right: $line-height / 4;
min-width: rem-calc(168);
@include breakpoint(medium down) {
width: 100%;
}
&.answered {
background: #f4f8ec;
border: 2px solid #92ba48;
@@ -1658,3 +1785,59 @@
}
}
}
// 09. Polls results and stats
// ---------------------------
.polls-results-stats {
.sidebar {
border-bottom: 1px solid $border;
margin-bottom: $line-height;
@include breakpoint(medium) {
border-bottom: 0;
border-right: 1px solid $border;
}
.menu {
padding: 0;
li a {
color: $link;
line-height: $line-height;
}
}
}
table {
table-layout: fixed;
caption {
padding: $line-height / 2 0;
text-align: left;
}
th {
text-align: left;
&.win {
background: #009fde;
}
}
td {
&.win {
background: #ccedf8;
font-weight: bold;
}
}
}
.number {
font-size: rem-calc(60);
font-weight: bold;
line-height: rem-calc(60);
}
}

View File

@@ -12,7 +12,7 @@
#print_link { display: none !important; }
#responsive-menu { display: none !important; }
#responsive_menu { display: none !important; }
.admin-sidebar { display: none !important; }

View File

@@ -6,16 +6,10 @@ class Admin::AdministratorsController < Admin::BaseController
end
def search
@user = User.find_by(email: params[:email])
respond_to do |format|
if @user
@administrator = Administrator.find_or_initialize_by(user: @user)
format.js
else
format.js { render "user_not_found" }
end
end
@users = User.search(params[:name_or_email])
.includes(:administrator)
.page(params[:page])
.for_render
end
def create

View File

@@ -14,7 +14,8 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
@milestone = Budget::Investment::Milestone.new(milestone_params)
@milestone.investment = @investment
if @milestone.save
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.create.notice')
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment),
notice: t('admin.milestones.create.notice')
else
render :new
end
@@ -25,7 +26,8 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
def update
if @milestone.update(milestone_params)
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.update.notice')
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment),
notice: t('admin.milestones.update.notice')
else
render :edit
end
@@ -33,23 +35,25 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
def destroy
@milestone.destroy
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), notice: t('admin.milestones.delete.notice')
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment),
notice: t('admin.milestones.delete.notice')
end
private
def milestone_params
params.require(:budget_investment_milestone)
.permit(:title, :description, :budget_investment_id)
.permit(:title, :description, :publication_date, :budget_investment_id,
image_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy])
end
def load_budget_investment
@investment = Budget::Investment.find params[:budget_investment_id]
@investment = Budget::Investment.find(params[:budget_investment_id])
end
def load_budget_investment_milestone
@milestone = Budget::Investment::Milestone.find params[:id]
@milestone = Budget::Investment::Milestone.find(params[:id])
end
end

View File

@@ -1,4 +1,5 @@
class Admin::BudgetInvestmentsController < Admin::BaseController
include FeatureFlags
feature_flag :budgets
@@ -12,6 +13,13 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
before_action :load_investments, only: [:index, :toggle_selection]
def index
respond_to do |format|
format.html
format.csv do
send_data Budget::Investment.to_csv(@investments, {headers: true}),
filename: 'budget_investments.csv'
end
end
end
def show
@@ -46,12 +54,12 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
def load_investments
@investments = Budget::Investment.scoped_filter(params, @current_filter)
.order(cached_votes_up: :desc, created_at: :desc)
.page(params[:page])
@investments = @investments.page(params[:page]) unless request.format.csv?
end
def budget_investment_params
params.require(:budget_investment)
.permit(:title, :description, :external_url, :heading_id, :administrator_id, :valuation_tag_list, :incompatible,
.permit(:title, :description, :external_url, :heading_id, :administrator_id, :tag_list, :valuation_tag_list, :incompatible,
:selected, valuator_ids: [])
end

View File

@@ -27,7 +27,7 @@ class Admin::BudgetsController < Admin::BaseController
def update
if @budget.update(budget_params)
redirect_to admin_budget_path(@budget), notice: t('admin.budgets.update.notice')
redirect_to admin_budgets_path, notice: t('admin.budgets.update.notice')
else
render :edit
end
@@ -42,6 +42,15 @@ class Admin::BudgetsController < Admin::BaseController
end
end
def destroy
if @budget.investments.any?
redirect_to admin_budgets_path, alert: t('admin.budgets.destroy.unable_notice')
else
@budget.destroy
redirect_to admin_budgets_path, notice: t('admin.budgets.destroy.success_notice')
end
end
private
def budget_params

View File

@@ -19,8 +19,10 @@ class Admin::Legislation::ProcessesController < Admin::Legislation::BaseControll
def update
if @process.update(process_params)
set_tag_list
link = legislation_process_path(@process).html_safe
redirect_to edit_admin_legislation_process_path(@process), notice: t('admin.legislation.processes.update.notice', link: link)
redirect_to :back, notice: t('admin.legislation.processes.update.notice', link: link)
else
flash.now[:error] = t('admin.legislation.processes.update.error')
render :edit
@@ -47,12 +49,23 @@ class Admin::Legislation::ProcessesController < Admin::Legislation::BaseControll
:draft_publication_date,
:allegations_start_date,
:allegations_end_date,
:proposals_phase_start_date,
:proposals_phase_end_date,
:result_publication_date,
:debate_phase_enabled,
:allegations_phase_enabled,
:proposals_phase_enabled,
:draft_publication_enabled,
:result_publication_enabled,
:published
:published,
:proposals_description,
:custom_list,
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
)
end
def set_tag_list
@process.set_tag_list_on(:customs, process_params[:custom_list])
@process.save
end
end

View File

@@ -0,0 +1,7 @@
class Admin::Legislation::ProposalsController < Admin::Legislation::BaseController
load_and_authorize_resource :process, class: "Legislation::Process"
load_and_authorize_resource :proposal, class: "Legislation::Proposal", through: :process
def index
end
end

View File

@@ -6,16 +6,10 @@ class Admin::ManagersController < Admin::BaseController
end
def search
@user = User.find_by(email: params[:email])
respond_to do |format|
if @user
@manager = Manager.find_or_initialize_by(user: @user)
format.js
else
format.js { render "user_not_found" }
end
end
@users = User.search(params[:name_or_email])
.includes(:manager)
.page(params[:page])
.for_render
end
def create

View File

@@ -6,16 +6,10 @@ class Admin::ModeratorsController < Admin::BaseController
end
def search
@user = User.find_by(email: params[:email])
respond_to do |format|
if @user
@moderator = Moderator.find_or_initialize_by(user: @user)
format.js
else
format.js { render "user_not_found" }
end
end
@users = User.search(params[:name_or_email])
.includes(:moderator)
.page(params[:page])
.for_render
end
def create

View File

@@ -15,24 +15,32 @@ class Admin::Poll::BoothAssignmentsController < Admin::Poll::BaseController
end
def show
@booth_assignment = @poll.booth_assignments.includes(:total_results, :voters,
@booth_assignment = @poll.booth_assignments.includes(:recounts, :voters,
officer_assignments: [officer: [:user]]).find(params[:id])
@voters_by_date = @booth_assignment.voters.group_by {|v| v.created_at.to_date}
@partial_results = @booth_assignment.partial_results
@recounts = @booth_assignment.recounts
end
def create
@booth_assignment = ::Poll::BoothAssignment.new(poll_id: booth_assignment_params[:poll_id],
booth_id: booth_assignment_params[:booth_id])
@poll = Poll.find(booth_assignment_params[:poll_id])
@booth = Poll::Booth.find(booth_assignment_params[:booth_id])
@booth_assignment = ::Poll::BoothAssignment.new(poll: @poll,
booth: @booth)
if @booth_assignment.save
notice = t("admin.poll_booth_assignments.flash.create")
else
notice = t("admin.poll_booth_assignments.flash.error_create")
end
redirect_to admin_poll_booth_assignments_path(@booth_assignment.poll_id), notice: notice
respond_to do |format|
format.js { render layout: false }
end
end
def destroy
@poll = Poll.find(booth_assignment_params[:poll_id])
@booth = Poll::Booth.find(booth_assignment_params[:booth_id])
@booth_assignment = ::Poll::BoothAssignment.find(params[:id])
if @booth_assignment.destroy
@@ -40,7 +48,14 @@ class Admin::Poll::BoothAssignmentsController < Admin::Poll::BaseController
else
notice = t("admin.poll_booth_assignments.flash.error_destroy")
end
redirect_to admin_poll_booth_assignments_path(@booth_assignment.poll_id), notice: notice
respond_to do |format|
format.js { render layout: false }
end
end
def manage
@booths = ::Poll::Booth.all
@poll = Poll.find(params[:poll_id])
end
private

View File

@@ -18,14 +18,16 @@ class Admin::Poll::OfficerAssignmentsController < Admin::Poll::BaseController
@officer = ::Poll::Officer.includes(:user).find(officer_assignment_params[:officer_id])
@officer_assignments = ::Poll::OfficerAssignment.
joins(:booth_assignment).
includes(:total_results, booth_assignment: :booth).
includes(:recounts, booth_assignment: :booth).
where("officer_id = ? AND poll_booth_assignments.poll_id = ?", @officer.id, @poll.id).
order(:date)
end
def search_officers
load_search
@officers = User.joins(:poll_officer).search(@search).order(username: :asc)
poll_officers = User.where(id: @poll.officers.pluck(:user_id))
@officers = poll_officers.search(@search).order(username: :asc)
respond_to do |format|
format.js

View File

@@ -1,7 +1,7 @@
class Admin::Poll::PollsController < Admin::Poll::BaseController
load_and_authorize_resource
before_action :load_search, only: [:search_booths, :search_questions, :search_officers]
before_action :load_search, only: [:search_booths, :search_officers]
before_action :load_geozones, only: [:new, :create, :edit, :update]
def index
@@ -17,6 +17,7 @@ class Admin::Poll::PollsController < Admin::Poll::BaseController
end
def create
@poll = Poll.new(poll_params.merge(author: current_user))
if @poll.save
redirect_to [:admin, @poll], notice: t("flash.actions.create.poll")
else
@@ -47,23 +48,8 @@ class Admin::Poll::PollsController < Admin::Poll::BaseController
redirect_to admin_poll_path(@poll), notice: notice
end
def remove_question
question = ::Poll::Question.find(params[:question_id])
if @poll.questions.include? question
@poll.questions.delete(question)
notice = t("admin.polls.flash.question_removed")
else
notice = t("admin.polls.flash.error_on_question_removed")
end
redirect_to admin_poll_path(@poll), notice: notice
end
def search_questions
@questions = ::Poll::Question.where("poll_id IS ? OR poll_id != ?", nil, @poll.id).search(search: @search).order(title: :asc)
respond_to do |format|
format.js
end
def booth_assignments
@polls = Poll.current_or_incoming
end
private
@@ -73,7 +59,10 @@ class Admin::Poll::PollsController < Admin::Poll::BaseController
end
def poll_params
params.require(:poll).permit(:name, :starts_at, :ends_at, :geozone_restricted, geozone_ids: [])
params.require(:poll).permit(:name, :starts_at, :ends_at, :geozone_restricted,
:summary, :description, :results_enabled, :stats_enabled,
geozone_ids: [],
image_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy])
end
def search_params

View File

@@ -0,0 +1,33 @@
class Admin::Poll::Questions::Answers::ImagesController < Admin::Poll::BaseController
before_action :load_answer
def index
end
def new
@answer = ::Poll::Question::Answer.find(params[:answer_id])
end
def create
@answer = ::Poll::Question::Answer.find(params[:answer_id])
@answer.attributes = images_params
if @answer.save
redirect_to admin_answer_images_path(@answer),
notice: "Image uploaded successfully"
else
render :new
end
end
private
def images_params
params.require(:poll_question_answer).permit(:answer_id,
images_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy])
end
def load_answer
@answer = ::Poll::Question::Answer.find(params[:answer_id])
end
end

View File

@@ -0,0 +1,57 @@
class Admin::Poll::Questions::Answers::VideosController < Admin::Poll::BaseController
before_action :load_answer, only: [:index, :new, :create]
before_action :load_video, only: [:edit, :update, :destroy]
def index
end
def new
@video = ::Poll::Question::Answer::Video.new
end
def create
@video = ::Poll::Question::Answer::Video.new(video_params)
if @video.save
redirect_to admin_answer_videos_path(@answer),
notice: t("flash.actions.create.poll_question_answer_video")
else
render :new
end
end
def edit
end
def update
if @video.update(video_params)
redirect_to admin_answer_videos_path(@video.answer_id),
notice: t("flash.actions.save_changes.notice")
else
render :edit
end
end
def destroy
notice = if @video.destroy
t("flash.actions.destroy.poll_question_answer_video")
else
t("flash.actions.destroy.error")
end
redirect_to :back, notice: notice
end
private
def video_params
params.require(:poll_question_answer_video).permit(:title, :url, :answer_id)
end
def load_answer
@answer = ::Poll::Question::Answer.find(params[:answer_id])
end
def load_video
@video = ::Poll::Question::Answer::Video.find(params[:id])
end
end

View File

@@ -0,0 +1,57 @@
class Admin::Poll::Questions::AnswersController < Admin::Poll::BaseController
before_action :load_answer, only: [:show, :edit, :update, :documents]
load_and_authorize_resource :question, class: "::Poll::Question"
def new
@answer = ::Poll::Question::Answer.new
end
def create
@answer = ::Poll::Question::Answer.new(answer_params)
if @answer.save
redirect_to admin_question_path(@answer.question),
notice: t("flash.actions.create.poll_question_answer")
else
render :new
end
end
def show
end
def edit
end
def update
if @answer.update(answer_params)
redirect_to admin_question_path(@answer.question),
notice: t("flash.actions.save_changes.notice")
else
redirect_to :back
end
end
def documents
@documents = @answer.documents
render 'admin/poll/questions/answers/documents'
end
def order_answers
::Poll::Question::Answer.order_answers(params[:ordered_list])
render nothing: true
end
private
def answer_params
params.require(:poll_question_answer).permit(:title, :description, :question_id, documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy])
end
def load_answer
@answer = ::Poll::Question::Answer.find(params[:id] || params[:answer_id])
end
end

View File

@@ -15,14 +15,12 @@ class Admin::Poll::QuestionsController < Admin::Poll::BaseController
def new
@polls = Poll.all
@question.valid_answers = I18n.t('poll_questions.default_valid_answers')
proposal = Proposal.find(params[:proposal_id]) if params[:proposal_id].present?
@question.copy_attributes_from_proposal(proposal)
end
def create
@question.author = @question.proposal.try(:author) || current_user
recover_documents_from_cache(@question)
if @question.save
redirect_to admin_question_path(@question)
@@ -32,7 +30,6 @@ class Admin::Poll::QuestionsController < Admin::Poll::BaseController
end
def show
@document = Document.new(documentable: @question)
end
def edit
@@ -58,8 +55,7 @@ class Admin::Poll::QuestionsController < Admin::Poll::BaseController
private
def question_params
params.require(:poll_question).permit(:poll_id, :title, :question, :description, :proposal_id, :valid_answers, :video_url,
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id])
params.require(:poll_question).permit(:poll_id, :title, :question, :proposal_id, :video_url)
end
def search_params

View File

@@ -3,7 +3,7 @@ class Admin::Poll::RecountsController < Admin::Poll::BaseController
def index
@booth_assignments = @poll.booth_assignments.
includes(:booth, :total_results, :voters).
includes(:booth, :recounts, :voters).
order("poll_booths.name").
page(params[:page]).per(50)
end

View File

@@ -1,12 +1,13 @@
class Admin::Poll::ShiftsController < Admin::Poll::BaseController
before_action :load_booth
before_action :load_polls
before_action :load_officer
def new
load_shifts
@shift = ::Poll::Shift.new
@voting_polls = @booth.polls.current_or_incoming
@recount_polls = @booth.polls.current_or_recounting_or_incoming
end
def create
@@ -14,10 +15,10 @@ class Admin::Poll::ShiftsController < Admin::Poll::BaseController
@officer = @shift.officer
if @shift.save
notice = t("admin.poll_shifts.flash.create")
redirect_to new_admin_booth_shift_path(@shift.booth), notice: notice
redirect_to new_admin_booth_shift_path(@shift.booth), notice: t("admin.poll_shifts.flash.create")
else
load_shifts
flash[:error] = t("admin.poll_shifts.flash.date_missing")
render :new
end
end
@@ -30,7 +31,7 @@ class Admin::Poll::ShiftsController < Admin::Poll::BaseController
end
def search_officers
@officers = User.search(params[:search]).order(username: :asc)
@officers = User.search(params[:search]).order(username: :asc).select { |o| o.poll_officer? == true }
end
private
@@ -39,10 +40,6 @@ class Admin::Poll::ShiftsController < Admin::Poll::BaseController
@booth = ::Poll::Booth.find(params[:booth_id])
end
def load_polls
@polls = ::Poll.current_or_incoming
end
def load_shifts
@shifts = @booth.shifts
end
@@ -54,7 +51,7 @@ class Admin::Poll::ShiftsController < Admin::Poll::BaseController
end
def shift_params
params.require(:shift).permit(:booth_id, :officer_id, :date)
shift_params = params.require(:shift).permit(:booth_id, :officer_id, :task, date: [:vote_collection_date, :recount_scrutiny_date])
shift_params.merge(date: shift_params[:date]["#{shift_params[:task]}_date".to_sym])
end
end

View File

@@ -1,6 +1,10 @@
class Admin::ProposalsController < Admin::BaseController
include FeatureFlags
has_filters %w{without_confirmed_hide all with_confirmed_hide}, only: :index
feature_flag :proposals
before_action :load_proposal, only: [:confirm_hide, :restore]
def index
@@ -25,4 +29,4 @@ class Admin::ProposalsController < Admin::BaseController
@proposal = Proposal.with_hidden.find(params[:id])
end
end
end

View File

@@ -1,7 +1,7 @@
class Admin::SettingsController < Admin::BaseController
def index
all_settings = (Setting.all).group_by { |s| s.type }
all_settings = Setting.all.group_by { |s| s.type }
@settings = all_settings['common']
@feature_flags = all_settings['feature']
@banner_styles = all_settings['banner-style']
@@ -14,6 +14,13 @@ class Admin::SettingsController < Admin::BaseController
redirect_to admin_settings_path, notice: t("admin.settings.flash.updated")
end
def update_map
Setting["map_latitude"] = params[:latitude].to_f
Setting["map_longitude"] = params[:longitude].to_f
Setting["map_zoom"] = params[:zoom].to_i
redirect_to admin_settings_path, notice: t("admin.settings.index.map.flash.update")
end
private
def settings_params

View File

@@ -36,4 +36,9 @@ class Admin::StatsController < Admin::BaseController
@users_who_have_sent_message = DirectMessage.select(:sender_id).distinct.count
end
end
def polls
@polls = ::Poll.current
@participants = ::Poll::Voter.where(poll: @polls)
end
end

View File

@@ -6,16 +6,10 @@ class Admin::ValuatorsController < Admin::BaseController
end
def search
@user = User.find_by(email: params[:email])
respond_to do |format|
if @user
@valuator = Valuator.find_or_initialize_by(user: @user)
format.js
else
format.js { render "user_not_found" }
end
end
@users = User.search(params[:name_or_email])
.includes(:valuator)
.page(params[:page])
.for_render
end
def create
@@ -25,6 +19,11 @@ class Admin::ValuatorsController < Admin::BaseController
redirect_to admin_valuators_path
end
def destroy
@valuator.destroy
redirect_to admin_valuators_path
end
def summary
@valuators = Valuator.order(spending_proposals_count: :desc)
end
@@ -36,4 +35,4 @@ class Admin::ValuatorsController < Admin::BaseController
params.require(:valuator).permit(:user_id, :description)
end
end
end

View File

@@ -28,8 +28,8 @@ module Budgets
respond_to :html, :js
def index
@investments = @investments.apply_filters_and_search(@budget, params, @current_filter)
.send("sort_by_#{@current_order}").page(params[:page]).per(10).for_render
@investments = investments.page(params[:page]).per(10).for_render
@investment_ids = @investments.pluck(:id)
load_investment_votes(@investments)
@tag_cloud = tag_cloud
@@ -44,12 +44,10 @@ module Budgets
set_comment_flags(@comment_tree.comments)
load_investment_votes(@investment)
@investment_ids = [@investment.id]
@document = Document.new(documentable: @investment)
end
def create
@investment.author = current_user
recover_documents_from_cache(@investment)
if @investment.save
Mailer.budget_investment_created(@investment).deliver_later
@@ -96,18 +94,20 @@ module Budgets
def set_random_seed
if params[:order] == 'random' || params[:order].blank?
params[:random_seed] ||= rand(99) / 100.0
seed = Float(params[:random_seed]) rescue 0
Budget::Investment.connection.execute("select setseed(#{seed})")
seed = rand(-100..100) / 100.0
params[:random_seed] ||= Float(seed) rescue 0
else
params[:random_seed] = nil
end
end
def investment_params
params.require(:budget_investment).permit(:title, :description, :external_url, :heading_id, :tag_list,
:organization_name, :location, :terms_of_service,
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id])
params.require(:budget_investment)
.permit(:title, :description, :heading_id, :tag_list,
:organization_name, :location, :terms_of_service, :skip_map,
image_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
map_location_attributes: [:latitude, :longitude, :zoom])
end
def load_ballot
@@ -130,6 +130,16 @@ module Budgets
TagCloud.new(Budget::Investment, params[:search])
end
def investments
if @current_order == 'random'
@investments.apply_filters_and_search(@budget, params, @current_filter)
.send("sort_by_#{@current_order}", params[:random_seed])
else
@investments.apply_filters_and_search(@budget, params, @current_filter)
.send("sort_by_#{@current_order}")
end
end
end
end

View File

@@ -1,5 +1,6 @@
class BudgetsController < ApplicationController
include FeatureFlags
include BudgetsHelper
feature_flag :budgets
load_and_authorize_resource
@@ -9,6 +10,7 @@ class BudgetsController < ApplicationController
respond_to :html, :js
def show
raise ActionController::RoutingError, 'Not Found' unless budget_published?(@budget)
end
def index

View File

@@ -4,17 +4,22 @@ module CommentableActions
include Search
def index
@resources = @search_terms.present? ? resource_model.search(@search_terms) : resource_model.all
@resources = @advanced_search_terms.present? ? @resources.filter(@advanced_search_terms) : @resources
@resources = resource_model.all
@resources = @current_order == "recommendations" && current_user.present? ? @resources.recommendations(current_user) : @resources.for_render
@resources = @resources.search(@search_terms) if @search_terms.present?
@resources = @advanced_search_terms.present? ? @resources.filter(@advanced_search_terms) : @resources
@resources = @resources.tagged_with(@tag_filter) if @tag_filter
@resources = @resources.page(params[:page]).for_render.send("sort_by_#{@current_order}")
@resources = @resources.page(params[:page]).send("sort_by_#{@current_order}")
index_customization if index_customization.present?
@tag_cloud = tag_cloud
@banners = Banner.with_active
set_resource_votes(@resources)
set_resources_instance
end
@@ -57,10 +62,7 @@ module CommentableActions
end
def update
resource.assign_attributes(strong_params)
recover_documents_from_cache(resource)
if resource.save
if resource.update(strong_params)
redirect_to resource, notice: t("flash.actions.update.#{resource_name.underscore}")
else
load_categories
@@ -112,11 +114,4 @@ module CommentableActions
nil
end
def recover_documents_from_cache(resource)
return false unless resource.try(:documents)
resource.documents = resource.documents.each do |document|
document.set_attachment_from_cached_attachment if document.cached_attachment.present?
end
end
end

View File

@@ -10,7 +10,7 @@ class DebatesController < ApplicationController
invisible_captcha only: [:create, :update], honeypot: :subtitle
has_orders %w{hot_score confidence_score created_at relevance}, only: :index
has_orders ->(c) { Debate.debates_orders(c.current_user) }, only: :index
has_orders %w{most_voted newest oldest}, only: :show
load_and_authorize_resource
@@ -23,6 +23,7 @@ class DebatesController < ApplicationController
def show
super
@related_contents = Kaminari.paginate_array(@debate.relationed_contents).page(params[:page]).per(5)
redirect_to debate_path(@debate), status: :moved_permanently if request.path != debate_path(@debate)
end

View File

@@ -0,0 +1,48 @@
class DirectUploadsController < ApplicationController
include DirectUploadsHelper
include ActionView::Helpers::UrlHelper
before_action :authenticate_user!
load_and_authorize_resource except: :create
skip_authorization_check only: :create
helper_method :render_destroy_upload_link
def create
@direct_upload = DirectUpload.new(direct_upload_params.merge(user: current_user, attachment: params[:attachment]))
if @direct_upload.valid?
@direct_upload.save_attachment
@direct_upload.relation.set_cached_attachment_from_attachment
render json: { cached_attachment: @direct_upload.relation.cached_attachment,
filename: @direct_upload.relation.attachment.original_filename,
destroy_link: render_destroy_upload_link(@direct_upload).html_safe,
attachment_url: @direct_upload.relation.attachment.url}
else
@direct_upload.destroy_attachment
render json: { errors: @direct_upload.errors[:attachment].join(", ") },
status: 422
end
end
def destroy
@direct_upload = DirectUpload.new(direct_upload_params.merge(user: current_user))
@direct_upload.relation.set_attachment_from_cached_attachment
if @direct_upload.destroy_attachment
render json: :ok
else
render json: :error
end
end
private
def direct_upload_params
params.require(:direct_upload)
.permit(:resource, :resource_type, :resource_id, :resource_relation,
:attachment, :cached_attachment, attachment_attributes: [])
end
end

View File

@@ -1,29 +1,7 @@
class DocumentsController < ApplicationController
before_action :authenticate_user!
before_action :find_documentable, except: :destroy
before_action :prepare_new_document, only: [:new, :new_nested]
before_action :prepare_document_for_creation, only: :create
load_and_authorize_resource except: :upload
skip_authorization_check only: :upload
def new
end
def new_nested
end
def create
recover_attachments_from_cache
if @document.save
flash[:notice] = t "documents.actions.create.notice"
redirect_to params[:from]
else
flash[:alert] = t "documents.actions.create.alert"
render :new
end
end
load_and_authorize_resource
def destroy
respond_to do |format|
@@ -45,57 +23,4 @@ class DocumentsController < ApplicationController
end
end
def destroy_upload
@document = Document.new(cached_attachment: params[:path])
@document.set_attachment_from_cached_attachment
@document.cached_attachment = nil
@document.documentable = @documentable
if @document.attachment.destroy
flash.now[:notice] = t "documents.actions.destroy.notice"
else
flash.now[:alert] = t "documents.actions.destroy.alert"
end
render :destroy
end
def upload
@document = Document.new(document_params.merge(user: current_user))
@document.documentable = @documentable
if @document.valid?
@document.attachment.save
@document.set_cached_attachment_from_attachment(URI(request.url))
else
@document.attachment.destroy
end
end
private
def document_params
params.require(:document).permit(:title, :documentable_type, :documentable_id,
:attachment, :cached_attachment, :user_id)
end
def find_documentable
@documentable = params[:documentable_type].constantize.find_or_initialize_by(id: params[:documentable_id])
end
def prepare_new_document
@document = Document.new(documentable: @documentable, user_id: current_user.id)
end
def prepare_document_for_creation
@document = Document.new(document_params)
@document.documentable = @documentable
@document.user = current_user
end
def recover_attachments_from_cache
if @document.attachment.blank? && @document.cached_attachment.present?
@document.set_attachment_from_cached_attachment
end
end
end

View File

@@ -0,0 +1,26 @@
class ImagesController < ApplicationController
before_action :authenticate_user!
load_and_authorize_resource
def destroy
respond_to do |format|
format.html do
if @image.destroy
flash[:notice] = t "images.actions.destroy.notice"
else
flash[:alert] = t "images.actions.destroy.alert"
end
redirect_to params[:from]
end
format.js do
if @image.destroy
flash.now[:notice] = t "images.actions.destroy.notice"
else
flash.now[:alert] = t "images.actions.destroy.alert"
end
end
end
end
end

View File

@@ -0,0 +1,24 @@
class InstallationController < ApplicationController
skip_authorization_check
def details
respond_to do |format|
format.any { render json: consul_installation_details.to_json, content_type: 'application/json' }
end
end
private
def consul_installation_details
{
release: 'v0.12'
}.merge(features: settings_feature_flags)
end
def settings_feature_flags
Setting.where("key LIKE 'feature.%'").each_with_object({}) { |x, n| n[x.key.remove('feature.')] = x.value }
end
end

View File

@@ -30,7 +30,7 @@ class Legislation::AnnotationsController < ApplicationController
def create
if !@process.allegations_phase.open? || @draft_version.final_version?
render(json: {}, status: :not_found) && (return)
render(json: {}, status: :not_found) && return
end
existing_annotation = @draft_version.annotations.where(

View File

@@ -30,7 +30,7 @@ class Legislation::AnswersController < Legislation::BaseController
def answer_params
params.require(:legislation_answer).permit(
:legislation_question_option_id,
:legislation_question_option_id
)
end

View File

@@ -2,4 +2,8 @@ class Legislation::BaseController < ApplicationController
include FeatureFlags
feature_flag :legislation
def legislation_proposal_votes(proposals)
@legislation_proposal_votes = current_user ? current_user.legislation_proposal_votes(proposals) : {}
end
end

View File

@@ -14,6 +14,8 @@ class Legislation::ProcessesController < Legislation::BaseController
redirect_to legislation_process_draft_version_path(@process, draft_version)
elsif @process.debate_phase.enabled?
redirect_to debate_legislation_process_path(@process)
elsif @process.proposals_phase.enabled?
redirect_to proposals_legislation_process_path(@process)
else
redirect_to allegations_legislation_process_path(@process)
end
@@ -81,6 +83,18 @@ class Legislation::ProcessesController < Legislation::BaseController
end
end
def proposals
set_process
@phase = :proposals_phase
if @process.proposals_phase.started?
legislation_proposal_votes(@process.proposals)
render :proposals
else
render :phase_not_open
end
end
private
def member_method?

View File

@@ -0,0 +1,72 @@
class Legislation::ProposalsController < Legislation::BaseController
include CommentableActions
include FlagActions
load_and_authorize_resource :process, class: "Legislation::Process"
load_and_authorize_resource :proposal, class: "Legislation::Proposal", through: :process
before_action :parse_tag_filter, only: :index
before_action :load_categories, only: [:index, :new, :create, :edit, :map, :summary]
before_action :load_geozones, only: [:edit, :map, :summary]
before_action :authenticate_user!, except: [:index, :show, :map, :summary]
invisible_captcha only: [:create, :update], honeypot: :subtitle
has_orders %w{confidence_score created_at}, only: :index
has_orders %w{most_voted newest oldest}, only: :show
helper_method :resource_model, :resource_name
respond_to :html, :js
def show
super
legislation_proposal_votes(@process.proposals)
@document = Document.new(documentable: @proposal)
if request.path != legislation_process_proposal_path(params[:process_id], @proposal)
redirect_to legislation_process_proposal_path(params[:process_id], @proposal),
status: :moved_permanently
end
end
def create
@proposal = Legislation::Proposal.new(proposal_params.merge(author: current_user))
if @proposal.save
redirect_to legislation_process_proposal_path(params[:process_id], @proposal), notice: I18n.t('flash.actions.create.proposal')
else
render :new
end
end
def index_customization
load_successful_proposals
load_featured unless @proposal_successful_exists
end
def vote
@proposal.register_vote(current_user, params[:value])
legislation_proposal_votes(@proposal)
end
private
def proposal_params
params.require(:legislation_proposal).permit(:legislation_process_id, :title,
:question, :summary, :description, :video_url, :tag_list,
:terms_of_service, :geozone_id,
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id])
end
def resource_model
Legislation::Proposal
end
def resource_name
'proposal'
end
def load_successful_proposals
@proposal_successful_exists = Legislation::Proposal.successful.exists?
end
end

View File

@@ -4,7 +4,7 @@ class Management::DocumentVerificationsController < Management::BaseController
before_action :set_document, only: :check
def index
@document_verification = Verification::Management::Document.new()
@document_verification = Verification::Management::Document.new
end
def check

View File

@@ -14,6 +14,8 @@ class Management::ProposalsController < Management::BaseController
def show
super
@notifications = @proposal.notifications
@related_contents = Kaminari.paginate_array(@proposal.relationed_contents).page(params[:page]).per(5)
redirect_to management_proposal_path(@proposal), status: :moved_permanently if request.path != management_proposal_path(@proposal)
end

View File

@@ -1,9 +1,12 @@
class Moderation::ProposalsController < Moderation::BaseController
include ModerateActions
include FeatureFlags
has_filters %w{pending_flag_review all with_ignored_flag}, only: :index
has_orders %w{flags created_at}, only: :index
feature_flag :proposals
before_action :load_resources, only: [:index, :moderate]
load_and_authorize_resource

View File

@@ -11,7 +11,7 @@ class NotificationsController < ApplicationController
def show
@notification = current_user.notifications.find(params[:id])
redirect_to url_for(@notification.linkable_resource)
redirect_to linkable_resource_path(@notification)
end
def mark_all_as_read
@@ -25,4 +25,15 @@ class NotificationsController < ApplicationController
@notification.mark_as_read
end
def linkable_resource_path(notification)
case notification.linkable_resource.class.name
when "Budget::Investment"
budget_investment_path @notification.linkable_resource.budget, @notification.linkable_resource
when "Topic"
community_topic_path @notification.linkable_resource.community, @notification.linkable_resource
else
url_for @notification.linkable_resource
end
end
end

View File

@@ -7,6 +7,6 @@ class Officing::BaseController < ApplicationController
skip_authorization_check
def verify_officer
raise CanCan::AccessDenied unless current_user.try(:poll_officer?) || current_user.try(:administrator?)
raise CanCan::AccessDenied unless current_user.try(:poll_officer?)
end
end

View File

@@ -7,7 +7,9 @@ class Officing::PollsController < Officing::BaseController
def final
@polls = if current_user.poll_officer?
current_user.poll_officer.final_days_assigned_polls.select {|poll| poll.ends_at > 2.week.ago && poll.expired?}
current_user.poll_officer.final_days_assigned_polls.select do |poll|
poll.ends_at > 2.weeks.ago && poll.expired? || poll.ends_at.today?
end
else
[]
end

View File

@@ -5,7 +5,7 @@ class Officing::ResultsController < Officing::BaseController
before_action :load_partial_results, only: :new
before_action :load_officer_assignment, only: :create
before_action :check_booth_and_date, only: :create
before_action :check_officer_assignment, only: :create
before_action :build_results, only: :create
def new
@@ -26,21 +26,15 @@ class Officing::ResultsController < Officing::BaseController
@partial_results = ::Poll::PartialResult.includes(:question).
where(booth_assignment_id: index_params[:booth_assignment_id]).
where(date: index_params[:date])
@whites = ::Poll::WhiteResult.where(booth_assignment_id: @booth_assignment.id, date: index_params[:date]).sum(:amount)
@nulls = ::Poll::NullResult.where(booth_assignment_id: @booth_assignment.id, date: index_params[:date]).sum(:amount)
@total = ::Poll::TotalResult.where(booth_assignment_id: @booth_assignment.id, date: index_params[:date]).sum(:amount)
@recounts = ::Poll::Recount.where(booth_assignment_id: @booth_assignment.id, date: index_params[:date])
end
end
private
def check_booth_and_date
def check_officer_assignment
if @officer_assignment.blank?
go_back_to_new(t("officing.results.flash.error_wrong_booth"))
elsif results_params[:date].blank? ||
Date.parse(results_params[:date]) < @poll.starts_at.to_date ||
Date.parse(results_params[:date]) > @poll.ends_at.to_date
go_back_to_new(t("officing.results.flash.error_wrong_date"))
end
end
@@ -52,66 +46,41 @@ class Officing::ResultsController < Officing::BaseController
go_back_to_new if question.blank?
results.each_pair do |answer_index, count|
if count.present?
answer = question.valid_answers[answer_index.to_i]
go_back_to_new if question.blank?
next if count.blank?
answer = question.question_answers.where(given_order: answer_index.to_i + 1).first.title
go_back_to_new if question.blank?
partial_result = ::Poll::PartialResult.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: results_params[:date],
question_id: question_id,
answer: answer)
partial_result.officer_assignment_id = @officer_assignment.id
partial_result.amount = count.to_i
partial_result.author = current_user
partial_result.origin = 'booth'
@results << partial_result
end
partial_result = ::Poll::PartialResult.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: Date.current,
question_id: question_id,
answer: answer)
partial_result.officer_assignment_id = @officer_assignment.id
partial_result.amount = count.to_i
partial_result.author = current_user
partial_result.origin = 'booth'
@results << partial_result
end
end
build_white_results
build_null_results
build_total_results
build_recounts
end
def build_white_results
if results_params[:whites].present?
white_result = ::Poll::WhiteResult.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: results_params[:date])
white_result.officer_assignment_id = @officer_assignment.id
white_result.amount = results_params[:whites].to_i
white_result.author = current_user
white_result.origin = 'booth'
@results << white_result
end
end
def build_null_results
if results_params[:nulls].present?
null_result = ::Poll::NullResult.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: results_params[:date])
null_result.officer_assignment_id = @officer_assignment.id
null_result.amount = results_params[:nulls].to_i
null_result.author = current_user
null_result.origin = 'booth'
@results << null_result
end
end
def build_total_results
if results_params[:total].present?
total_result = ::Poll::TotalResult.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: results_params[:date])
total_result.officer_assignment_id = @officer_assignment.id
total_result.amount = results_params[:total].to_i
total_result.author = current_user
total_result.origin = 'booth'
@results << total_result
def build_recounts
recount = ::Poll::Recount.find_or_initialize_by(booth_assignment_id: @officer_assignment.booth_assignment_id,
date: Date.current)
recount.officer_assignment_id = @officer_assignment.id
recount.author = current_user
recount.origin = 'booth'
[:whites, :nulls, :total].each do |recount_type|
if results_params[recount_type].present?
recount["#{recount_type.to_s.singularize}_amount"] = results_params[recount_type].to_i
end
end
@results << recount
end
def go_back_to_new(alert = nil)
params[:d] = results_params[:date]
params[:d] = Date.current
params[:oa] = results_params[:officer_assignment_id]
flash.now[:alert] = (alert || t("officing.results.flash.error_create"))
load_officer_assignments
@@ -120,7 +89,7 @@ class Officing::ResultsController < Officing::BaseController
end
def load_poll
@poll = ::Poll.expired.includes(:questions).find(params[:poll_id])
@poll = ::Poll.includes(:questions).find(params[:poll_id])
end
def load_officer_assignment
@@ -135,7 +104,7 @@ class Officing::ResultsController < Officing::BaseController
final.
where(id: current_user.poll_officer.officer_assignment_ids).
where("poll_booth_assignments.poll_id = ?", @poll.id).
order(date: :asc)
where(date: Date.current)
end
def load_partial_results
@@ -146,7 +115,7 @@ class Officing::ResultsController < Officing::BaseController
end
def results_params
params.permit(:officer_assignment_id, :date, :questions, :whites, :nulls, :total)
params.permit(:officer_assignment_id, :questions, :whites, :nulls, :total)
end
def index_params

View File

@@ -3,7 +3,8 @@ class Officing::VotersController < Officing::BaseController
def new
@user = User.find(params[:id])
@polls = Poll.answerable_by(@user)
booths = current_user.poll_officer.shifts.current.vote_collection.pluck(:booth_id).uniq
@polls = Poll.answerable_by(@user).where(id: Poll::BoothAssignment.where(booth: booths).pluck(:poll_id).uniq)
end
def create
@@ -12,7 +13,9 @@ class Officing::VotersController < Officing::BaseController
@voter = Poll::Voter.new(document_type: @user.document_type,
document_number: @user.document_number,
user: @user,
poll: @poll)
poll: @poll,
origin: "booth",
officer: current_user.poll_officer)
@voter.save!
end

View File

@@ -5,25 +5,19 @@ class Polls::QuestionsController < ApplicationController
has_orders %w{most_voted newest oldest}, only: :show
def show
@commentable = @question.proposal.present? ? @question.proposal : @question
@comment_tree = CommentTree.new(@commentable, params[:page], @current_order)
set_comment_flags(@comment_tree.comments)
@document = Document.new(documentable: @question)
question_answer = @question.answers.where(author_id: current_user.try(:id)).first
@answers_by_question_id = {@question.id => question_answer.try(:answer)}
end
def answer
answer = @question.answers.find_or_initialize_by(author: current_user)
token = params[:token]
answer.answer = params[:answer]
answer.touch if answer.persisted?
answer.save!
answer.record_voter_participation
answer.record_voter_participation(token)
@question.question_answers.where(question_id: @question).each do |question_answer|
question_answer.set_most_voted
end
@answers_by_question_id = {@question.id => params[:answer]}
@answers_by_question_id = { @question.id => params[:answer] }
end
end

View File

@@ -1,8 +1,10 @@
class PollsController < ApplicationController
include PollsHelper
load_and_authorize_resource
has_filters %w{current expired incoming}
has_orders %w{most_voted newest oldest}, only: :show
::Poll::Answer # trigger autoload
@@ -12,12 +14,24 @@ class PollsController < ApplicationController
def show
@questions = @poll.questions.for_render.sort_for_list
@token = poll_voter_token(@poll, current_user)
@poll_questions_answers = Poll::Question::Answer.where(question: @poll.questions).where.not(description: "").order(:given_order)
@answers_by_question_id = {}
poll_answers = ::Poll::Answer.by_question(@poll.question_ids).by_author(current_user.try(:id))
poll_answers.each do |answer|
@answers_by_question_id[answer.question_id] = answer.answer
end
@commentable = @poll
@comment_tree = CommentTree.new(@commentable, params[:page], @current_order)
end
def stats
@stats = Poll::Stats.new(@poll).generate
end
def results
end
end

View File

@@ -1,4 +1,5 @@
class ProposalsController < ApplicationController
include FeatureFlags
include CommentableActions
include FlagActions
@@ -7,9 +8,11 @@ class ProposalsController < ApplicationController
before_action :load_geozones, only: [:edit, :map, :summary]
before_action :authenticate_user!, except: [:index, :show, :map, :summary]
feature_flag :proposals
invisible_captcha only: [:create, :update], honeypot: :subtitle
has_orders %w{hot_score confidence_score created_at relevance archival_date}, only: :index
has_orders ->(c) { Proposal.proposals_orders(c.current_user) }, only: :index
has_orders %w{most_voted newest oldest}, only: :show
load_and_authorize_resource
@@ -19,13 +22,13 @@ class ProposalsController < ApplicationController
def show
super
@notifications = @proposal.notifications
@document = Document.new(documentable: @proposal)
@related_contents = Kaminari.paginate_array(@proposal.relationed_contents).page(params[:page]).per(5)
redirect_to proposal_path(@proposal), status: :moved_permanently if request.path != proposal_path(@proposal)
end
def create
@proposal = Proposal.new(proposal_params.merge(author: current_user))
recover_documents_from_cache(@proposal)
if @proposal.save
redirect_to share_proposal_path(@proposal), notice: I18n.t('flash.actions.create.proposal')
@@ -77,8 +80,10 @@ class ProposalsController < ApplicationController
def proposal_params
params.require(:proposal).permit(:title, :question, :summary, :description, :external_url, :video_url,
:responsible_name, :tag_list, :terms_of_service, :geozone_id,
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id])
:responsible_name, :tag_list, :terms_of_service, :geozone_id, :skip_map,
image_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
documents_attributes: [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy],
map_location_attributes: [:latitude, :longitude, :zoom])
end
def retired_params
@@ -113,7 +118,7 @@ class ProposalsController < ApplicationController
end
def load_featured
return unless !@advanced_search_terms && @search_terms.blank? && @tag_filter.blank? && params[:retired].blank?
return unless !@advanced_search_terms && @search_terms.blank? && @tag_filter.blank? && params[:retired].blank? && @current_order != "recommendations"
@featured_proposals = Proposal.not_archived.sort_by_confidence_score.limit(3)
if @featured_proposals.present?
set_featured_proposal_votes(@featured_proposals)

View File

@@ -0,0 +1,55 @@
class RelatedContentsController < ApplicationController
skip_authorization_check
respond_to :html, :js
def create
if relationable_object && related_object
RelatedContent.create(parent_relationable: @relationable, child_relationable: @related, author: current_user)
flash[:success] = t('related_content.success')
else
flash[:error] = t('related_content.error', url: Setting['url'])
end
redirect_to @relationable
end
def score_positive
score(:positive)
end
def score_negative
score(:negative)
end
private
def score(action)
@related = RelatedContent.find_by(id: params[:id])
@related.send("score_#{action}", current_user)
render template: 'relationable/_refresh_score_actions'
end
def valid_url?
params[:url].start_with?(Setting['url'])
end
def relationable_object
@relationable = params[:relationable_klass].singularize.camelize.constantize.find_by(id: params[:relationable_id])
end
def related_object
if valid_url?
url = params[:url]
related_klass = url.match(/\/(#{RelatedContent::RELATIONABLE_MODELS.join("|")})\//)[0].delete("/")
related_id = url.match(/\/[0-9]+/)[0].delete("/")
@related = related_klass.singularize.camelize.constantize.find_by(id: related_id)
end
rescue
nil
end
end

View File

@@ -0,0 +1,11 @@
class TagsController < ApplicationController
load_and_authorize_resource class: ActsAsTaggableOn::Tag
respond_to :json
def suggest
@tags = ActsAsTaggableOn::Tag.search(params[:search]).map(&:name)
respond_with @tags
end
end

View File

@@ -1,12 +1,10 @@
class WelcomeController < ApplicationController
skip_authorization_check
before_action :set_user_recommendations, only: :index, if: :current_user
layout "devise", only: [:welcome, :verification]
def index
if current_user
redirect_to :proposals
end
end
def welcome
@@ -16,4 +14,11 @@ class WelcomeController < ApplicationController
redirect_to verification_path if signed_in?
end
private
def set_user_recommendations
@recommended_debates = Debate.recommendations(current_user).sort_by_recommendations.limit(3)
@recommended_proposals = Proposal.recommendations(current_user).sort_by_recommendations.limit(3)
end
end

View File

@@ -13,33 +13,33 @@ module AdminHelper
end
def menu_tags?
["tags"].include? controller_name
["tags"].include?(controller_name)
end
def menu_moderated_content?
["proposals", "debates", "comments", "hidden_users"].include? controller_name
["proposals", "debates", "comments", "hidden_users"].include?(controller_name) && controller.class.parent != Admin::Legislation
end
def menu_budget?
["spending_proposals"].include? controller_name
["spending_proposals"].include?(controller_name)
end
def menu_polls?
["polls", "questions", "officers", "booths", "officer_assignments", "booth_assignments", "recounts", "results", "shifts"].include? controller_name
%w[polls questions officers booths officer_assignments booth_assignments recounts results shifts questions answers].include?(controller_name)
end
def menu_profiles?
["administrators", "organizations", "officials", "moderators", "valuators", "managers", "users"].include? controller_name
%w[administrators organizations officials moderators valuators managers users activity].include?(controller_name)
end
def menu_banners?
["banners"].include? controller_name
["banners"].include?(controller_name)
end
def menu_customization?
["pages", "images", "content_blocks"].include? controller_name
["pages", "images", "content_blocks"].include?(controller_name)
end
def official_level_options
options = [["", 0]]
(1..5).each do |i|

View File

@@ -60,4 +60,8 @@ module ApplicationHelper
def format_price(number)
number_to_currency(number, precision: 0, locale: I18n.default_locale)
end
def kaminari_path(url)
"#{root_url.chomp("\/")}#{url}"
end
end

View File

@@ -1,5 +1,31 @@
module BudgetsHelper
def csv_params
csv_params = params.clone.merge(format: :csv).symbolize_keys
csv_params.delete(:page)
csv_params
end
def investment_selected_link(investment)
options = investment_selected_link_options(investment)
path = toggle_selection_admin_budget_budget_investment_path(@budget,
investment, filter: params[:filter], page: params[:page])
link_options = {method: :patch, remote: true, class: options[:link_class]}
link_to options[:text], path, link_options
end
def investment_selected_link_options(investment)
if investment.selected?
{link_class: "button small expanded",
text: t("admin.budget_investments.index.selected") }
elsif investment.feasible? && investment.valuation_finished?
{link_class: "button small hollow expanded",
text: t("admin.budget_investments.index.select")}
else
{}
end
end
def budget_phases_select_options
Budget::PHASES.map { |ph| [ t("budgets.phase.#{ph}"), ph ] }
end
@@ -42,4 +68,9 @@ module BudgetsHelper
def investment_tags_select_options
Budget::Investment.tags_on(:valuation).order(:name).select(:name).distinct
end
def budget_published?(budget)
!budget.drafting? || current_user&.administrator?
end
end

View File

@@ -32,4 +32,7 @@ module CommunitiesHelper
community.from_proposal? ? t("community.sidebar.description.proposal") : t("community.sidebar.description.investment")
end
def create_topic_link(community)
current_user.present? ? new_community_topic_path(community.id) : new_user_session_path
end
end

View File

@@ -4,4 +4,12 @@ module DebatesHelper
Debate.all.featured.count > 0
end
end
def empty_recommended_debates_message_text(user)
if user.interests.any?
t('debates.index.recommendations.without_results')
else
t('debates.index.recommendations.without_interests')
end
end
end

Some files were not shown because too many files have changed in this diff Show More