Commit Graph

20144 Commits

Author SHA1 Message Date
Javi Martín
b04ac817f6 Use a list of links for admin stats events
Using <h3> headings for the links had two disadvantages.

First, it was the wrong heading level to use, since there was no <h2>
tag before it.

Second, headings are supposed to be followed by content associated to
that heading; here, we had no content following the headings.

So we're using a list of links and giving it a heading. We're adding
styles so the page still looks like it used to, although these styles
are certainly asking for improvements.
2024-05-09 14:28:31 +02:00
Javi Martín
4e9ed4dfa6 Extract component to render links to event stats 2024-05-09 14:28:31 +02:00
Javi Martín
646dccca0a Rename event_types variable to event_names
This is consistent with the `name` column in `ahoy_events`.
2024-05-09 14:28:31 +02:00
Javi Martín
772be11525 Fix budget investments chart in admin stats
The JavaScript required to display the chart wasn't loaded on the admin
stats page.

We're not adding a test because we're going to move the budgets graph to
a different page on the pull request containing this commit.

Note we're changing the "Go back" link, since using a turbolinks refresh
broke this link when using the Chromium browser. Besides, there was an
inconsistency where some of the "Go back" links in admin stats pointed
to the admin stats page but other links pointed to `:back`.
2024-05-09 14:28:31 +02:00
Javi Martín
1d11fa93d1 Remove unnecessary paddings in admin stats links
These elements were not aligned with the rest of the page due to their
paddings, caused by the `column` class.
2024-05-09 14:28:31 +02:00
Javi Martín
1ee30c0bb7 Remove the create action from CommentableActions
We were only using it in one place: the debates controller. All the
other controllers including CommentableActions were overwriting this
action, except the ones in the admin area, where creating proposals,
debates or investments isn't possible.

Note this means that, most of the times, we weren't tracking events
creating a resource.

Also note that since, as mentioned in commit 3752fef6b, there are no
geozones in the debates form, we don't have to load them when creating a
debate fails due to validation rules.
2024-05-09 14:24:53 +02:00
Javi Martín
e0c88565e2 Merge pull request #5508 from consuldemocracy/fix_rubocop_exclude_filename
Update initializer reference in rubocop config file
2024-05-06 14:57:44 +02:00
Javi Martín
6502852743 Update initializer reference in rubocop config file
We renamed the initializer in commit 528e59ce2.
2024-04-26 03:26:10 +02:00
Javi Martín
b8f8ccef23 Merge pull request #5474 from consuldemocracy/dependabot/bundler/faker-3.3.1
Bump faker from 3.2.3 to 3.3.1
2024-04-26 03:10:52 +02:00
dependabot[bot]
0a86dd1eed Bump faker from 3.2.3 to 3.3.1
Bumps [faker](https://github.com/faker-ruby/faker) from 3.2.3 to 3.3.1.
- [Release notes](https://github.com/faker-ruby/faker/releases)
- [Changelog](https://github.com/faker-ruby/faker/blob/main/CHANGELOG.md)
- [Commits](https://github.com/faker-ruby/faker/compare/v3.2.3...v3.3.1)

---
updated-dependencies:
- dependency-name: faker
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-26 00:42:28 +00:00
Javi Martín
08fc6e81cf Merge pull request #5502 from consuldemocracy/duplicated_budget_spec
Remove duplicated spec
2024-04-24 16:38:39 +02:00
Javi Martín
d3c92b9502 Merge pull request #5460 from consuldemocracy/admin_menu_expanded
Use buttons to open/close admin navigation submenus
2024-04-24 14:40:44 +02:00
Alberto
a2d37a8405 Remove duplicated spec 2024-04-23 23:56:17 +02:00
Javi Martín
db25dc13e1 Use buttons to open/close admin navigation submenus
We were using Foundation's accordion menu to open/close nested lists of
links. Unfortunately, Foundation's accordion makes it impossible to
access links in nested links using the keyboard [1] (note the issue is
closed, but in the latest version of Foundation, 6.8.1, it's still
present, and Foundation's development is mostly discontinued).
Furtheremore, it adds the `menuitem` role to links, but ARIA menus are
not ment for navigation but for application behavior and, since it
doesn't add the `menubar` or `menu` roles to the parent elements, it
results in accessibility issues for people using screen readers (also
reported by the Axe accessibility testing engine).

So we need to implement our own solution. We're using the most commonly
used pattern: a buttton with the `aria-expanded` attribute. And, for
people using browsers where JavaScript hasn't loaded, we're keeping the
submenus open at all times (just like we were doing until now), and
we're disabling the buttons (since they do nothing without JavaScript).
This might not be an ideal solution, but it's probably good enough, and
way better than what we had until now.

We've also considered using the <details> and <summary> elements instead
of using buttons to open/close items on the list. However, these
elements still present some accessibility issues [2], and the transition
between open and closed can't be animated unless we overwrite the
`click` event with JavaScript. The pattern of using these elements to
open/close a nested list of links isn't common either, and some people
using screen readers might get confused when entering/leaving the nested
list.

We tried other approaches to get the animation effect, all of them based
on adding `[aria-expanded="false"]:not([disabled]) + * { display: none;
}` to the CSS file.

Unfortunately, animation using CSS isn't feasible right now because
browsers can't animate a change form `height: 0` to `height: auto`.
There are some hacks like animating the `max-height` or the `flex-grow`
property, but the resulting animation is inconsistent. A perfect
animation can be done using the `grid-template-rows` property [3], but
it requires adding a grid container and only works in Firefox and recent
versions of Chrome and similar browsers.

Getting to a solution with JavaScript was also tricky. With the
following approach, `slideToggle()` opened the menu the first time, even
if it was already open (not sure why):

```
toggle_buttons.on("click", function() {
  $(this).attr("aria-expanded", !JSON.parse($(this).attr("aria-expanded")));
  $(this).next().slideToggle();
});
```

This made the arrow turn after the menu had slided instead of doing it
at the same time:

```
toggle_buttons.on("click", function() {
  var button = $(this);

  button.next().slideToggle(function() {
    button.attr("aria-expanded",
    !JSON.parse(button.attr("aria-expanded")));
  });
}
```

With this, everything disappeared quickly:

```
toggle_buttons.on("click", function() {
  var expanded = JSON.parse($(this).attr("aria-expanded"));

  if (expanded) {
    $(this).next().slideUp();
  } else {
    $(this).next().slideDown();
  }

  $(this).attr("aria-expanded", !expanded);
}
```

So, in the end, we're hiding the nested link lists with JavaScript
instead of CSS.

[1] Issue 12046 in https://github.com/foundation/foundation-sites
[2] https://www.scottohara.me/blog/2022/09/12/details-summary.html
[3] https://css-tricks.com/css-grid-can-do-auto-height-transitions
2024-04-18 16:10:58 +02:00
Javi Martín
333f672001 Extract methods to render a section in admin menu 2024-04-18 16:08:35 +02:00
Javi Martín
6da2d98b78 Extract methods to render management menu links
So this is similar to what we're doing in the `Admin::MenuComponent`
class.
2024-04-18 15:48:21 +02:00
Javi Martín
37bc39e1c6 Extract methods to render user links in management menu
So this is similar to what we're doing in the `Admin::MenuComponent`
class.
2024-04-18 15:48:21 +02:00
Javi Martín
445b01c280 Move management menu partial to a component
So it's consistent with the `Admin::MenuComponent`.
2024-04-18 15:48:21 +02:00
Javi Martín
5f590cb59b Remove obsolete CSS rule for accordion titles
The `accordion-title` HTML class isn't used since commit 156997d93.
2024-04-18 15:48:21 +02:00
Javi Martín
a64a8ec44e Merge pull request #5497 from consuldemocracy/active_storage_messages
Keep rendering pre-Rails7 ActiveStorage images
2024-04-18 15:47:50 +02:00
Javi Martín
4d758925b1 Merge pull request #5459 from consuldemocracy/admin_actions_buttons
Use buttons for non-GET actions in the admin section
2024-04-18 15:36:06 +02:00
Javi Martín
528e59ce20 Keep rendering pre-Rails7 ActiveStorage images
In commit b3f570512, we changed the key generator hash digest class, and
we wrote:

> Since we haven't seen any Consul Democracy applications using
> encrypted messages and these messages become invalid with this change
> (...)

We didn't realize that ActiveStorage also used the old hash digest class
to generated the signed URLs used to access an image. This doesn't
affect us when we generate images using `image.variant`, because that
generates a new URL on the fly using the new hash digest class. However,
URLs referencing the images generated using the old hash digest class,
like the ones in the HTML content generated with CKEditor, would result
in 404 errors.

So we're rotating the signed IDs generated by earlier versions of
ActiveStorage. This way both new and old images will be correctly
displayed.

Note that, unlike cookies, which will keep working once rotated even if
we delete the code to rotate them, old ActiveStorage URLs will always
need the code rotating them in order to keep working.
2024-04-18 05:13:13 +02:00
Javi Martín
251a5fb6e9 Default to delete method for the destroy action
This is consistent with what Rails does.
2024-04-17 23:38:41 +02:00
Javi Martín
54977116e7 Use a button to delete site customization images
Note that we used to have the link to delete images inside the same
<form> tag as the button to update the image. However, using a button
means we're adding a new <form> tag for the action to delete the image.
This isn't valid HTML and, in some browsers, might result in the button
sending the request to the wrong URL.

As explained in commit 5311daadf, to avoid this, we'd need to replace
`button_to` with `button_tag` in the action in order to generate a
button without a form.  Then, we could add either a `form` or a
`formaction` attribute to the button.

However, I thik it's easier to move the delete button outside the update
button <form> tag. On the minus side, since the buttons no longer share
a parent, they're harder to style. So we're using a mix of nested flex
layouts with one of the nested elements using a container unit as width.
Since we're at it, we're also improving the styles on small and medium
screens by making sure the "Update" button wraps before the "Delete"
button does (using a container query), by giving enough width to the
column containing this actions on small screens as well (removing
`small-12` and giving it two-thirds of the width on all screen sizes)
and by having a gap between elements.

Note that, at the time of writing, container queries are only supported
by about 91%-93% of the browsers, meaning that some administrators will
see all from controls displayed vertically, one on top of the other, on
all screen sizes. We think this is acceptable, and the page remains
fully functional in this case.
2024-04-17 23:38:41 +02:00
Javi Martín
b33eec101e Extract components to render custom image table actions
This way it'll be easier to refactor them. We're also giving a proper
title to the images index page.
2024-04-17 23:06:52 +02:00
Javi Martín
e884bc28e1 Use a button to moderate proposal notifications
As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, PUT) requests to the
server has a few issues.
2024-04-17 17:31:34 +02:00
Javi Martín
df17bd1354 Ask confirmation to delete pages from the edit page
We were already doing that when deleting pages from the index page, and
we also ask for confirmation in almost every page in the admin section.
2024-04-17 17:31:34 +02:00
Javi Martín
ccf5c81ea9 Use a button to destroy pages from the edit page
We were already using buttons to destroy pages from the pages index.

As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, DELETE) requests to
the server has a few issues.
2024-04-17 17:31:34 +02:00
Javi Martín
fc4940ccb6 Move edit page and new page views to components
This way we can simplify setting the title and styling the link in the
header. We're also fixing the unnecessary padding introduced by the
`column` classes, which caused the header not to be aligned with the
rest of the elements surrounding it. We're still keeping it the margin
used in the `row` classes so it's aligned with the rest of the form;
ideally, we would remove the `row` classes in the rest of the form and
in the whole admin section, but this isn't something we can tackle right
now.

Note that, in the CSS, the `margin-left: auto` property needs to be
included after `@include regular-button` because that mixin overwrites
the `margin-left` property. Since we're modifying this code, we're
making it compatible with RTL text, using `$global-left` instead of
`left`.
2024-04-17 17:29:36 +02:00
Javi Martín
62aad851bf Use icons as links to edit content blocks
Just like we do with the rest of the tables in the admin section.
2024-04-17 16:59:14 +02:00
Javi Martín
6a2ee921de Ask confirmation to delete content blocks from the edit page
We were already doing that when deleting content blocks from the index
page, and we also ask for confirmation in almost every page in the admin
section.
2024-04-17 16:44:10 +02:00
Javi Martín
5a7021396e Use a button to destroy content blocks from the edit page
We were already using button to destroy content blocks from the content
blocks index.

As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, DELETE) requests to
the server has a few issues.
2024-04-17 16:44:10 +02:00
Javi Martín
d050c04bb0 Use a button to destroy poll question answer images
As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, DELETE) requests to
the server has a few issues.

Note that the AJAX response stopped working after replacing the link
with a button. Not sure about the reason, but, since this is one of the
very few places where we use AJAX calls to delete content, the easiest
solution is to stop using AJAX and be consistent with what we do in the
rest of the admin section.
2024-04-17 16:44:10 +02:00
Javi Martín
53d85d6431 Use a button to destroy officials
As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, DELETE) requests to
the server has a few issues.
2024-04-17 16:44:10 +02:00
Javi Martín
5876738369 Ask confirmation to delete drafts and questions
This is similar to what we do in almost every other page of the admin
section.
2024-04-17 16:44:10 +02:00
Javi Martín
ecad046a99 Use buttons to destroy drafts and questions
As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST (or, in this case, DELETE) requests to
the server has a few issues.
2024-04-17 16:44:09 +02:00
Javi Martín
20d3725709 Add missing test to delete a draft version
We weren't testing this action anywhere.
2024-04-17 16:44:09 +02:00
Javi Martín
cb3bea8eec Simplify code to ask for send newsletter confirmation
Using the standard `confirm` parameter, we can remove all the custom
code we added to do the same thing.

Since the code is similar, we're doing the same when asking for
confirmation to send notifications.
2024-04-17 16:44:09 +02:00
Javi Martín
52ec55970b Use buttons to send notifications and newsletters
As mentioned in commits 5311daadf and bb958daf0, using links combined
with JavaScript to generate POST requests to the server has a few
issues.
2024-04-17 16:44:09 +02:00
Javi Martín
09321f41a7 Merge pull request #5492 from consuldemocracy/move_tenant_service_to_load_path
Move custom ActiveStorage service to $LOAD_PATH
2024-04-17 16:29:20 +02:00
Javi Martín
118c2bf5e0 Move custom ActiveStorage service to $LOAD_PATH
We moved this file to `app/lib/` in commit cb477149c so it would be in
the autoload_paths. However, this class is loaded by ActiveStorage, with
the following method:

```
def resolve(class_name)
  require "active_storage/service/#{class_name.to_s.underscore}_service"
  ActiveStorage::Service.const_get(:"#{class_name.camelize}Service")
rescue LoadError
  raise "Missing service adapter for #{class_name.inspect}"
end
``

So this file needs to be in the $LOAD_PATH, or else ActiveStorage won't
be able to load it when we disable the `add_autoload_paths_to_load_path`
option, which is the default in Rails 7.1 [1].

Moving it to the `lib` folder solves the issue; as mentioned in the
guide to upgrade to Rails 7.1 [2]:

> The lib directory is not affected by this flag, it is added to
> $LOAD_PATH always.

However, we were also referencing this class in the `Tenant` model,
meaning we needed to autoload it as well somehow. So, instead of
directly referencing this class, we're using `respond_to?` in the Tenant
model.

We're changing the test so it fails when the code calls
`is_a?(ActiveStorage::Service::TenantDiskService)`. We need to change
the active storage configurations in the test because, otherwise, the
moment `ActiveStorage::Blob` is loaded, the `TenantDiskService` class is
also loaded, meaning the test will pass when using `is_a?`.

Note that, since this class isn't in the autoload paths anymore, we need
to add a `require` in the tests. We could add an initializer to require
it; we're not doing it in order to be consistent with what ActiveStorage
does: it only loads the service that's going to be used in the current
Rails environment. If somebody changed their production environment in
order to use (for example), S3, and we added an initializer to require
the TenantDiskService, we would still load the TenantDiskService even if
it isn't going to be used.

[1] https://guides.rubyonrails.org/v7.1/configuring.html#config-add-autoload-paths-to-load-path
[2] https://guides.rubyonrails.org/v7.1/upgrading_ruby_on_rails.html#autoloaded-paths-are-no-longer-in-$load-path
2024-04-17 15:18:41 +02:00
Javi Martín
e6ff76d1a4 Merge pull request #5408 from consuldemocracy/dependabot/bundler/pg-1.5.6
Bump pg from 1.4.3 to 1.5.6
2024-04-17 00:50:49 +02:00
dependabot[bot]
128f42c1f5 Bump pg from 1.4.3 to 1.5.6
Dependabot couldn't find the original pull request head commit, b1903b83e07773d28deac423d987df47eada3af1.
2024-04-16 22:07:18 +00:00
Javi Martín
ce7acbbff7 Extract method to get the tenant root storage
This way we simplify the code a little bit and we create a method unique
to the `TenantDiskService` class, which can be used to check whether
we're using this class without using `is_a?` or similar.
2024-04-16 20:52:37 +02:00
Javi Martín
faf765b5c6 Merge pull request #5465 from consuldemocracy/rails7.0
Upgrade to Rails 7.0
2024-04-16 19:43:56 +02:00
Javi Martín
492b2281b0 Use Rails 7.0 defaults and overwrite them
We're keeping the old `apply_stylesheet_media_default` option behavior
because removing `media="screen"` from our stylesheets would completely
break our `print` stylesheet, which would now load the default the
styles defined in `application.css`.

We're also keeping the old `:mini_magick` option to process images so
existing installations don't have to install libvips on their server. We
might change it in the future.
2024-04-15 15:39:28 +02:00
Javi Martín
726d8a8935 Disable Rails' deprecated to_s override
This option was deprecated in Rails 7.0 and removed in Rails 7.1 [1]. It
doesn't really affect us because we weren't using `to_s` with a
parameter anywhere in the application.

The Rubocop rule Rails/ToSWithArgument can be used to detect these cases
but, since we've never used them, and adding them now would cause the
application to crash and so it'll be obvious we've done something wrong,
I don't think it's necessary to add the rule.

[1] https://github.com/rails/rails/commit/e420c3380
2024-04-15 15:39:28 +02:00
Javi Martín
a8047a96c8 Include a hidden field in multiple file inputs
This doesn't really affect us because we don'thave any multiple file
inputs in the application, but we're enabling it because it's the new
default configuration option.
2024-04-15 15:39:28 +02:00
Javi Martín
77977bd8fe Return Content-Type header without modification
Setting it to `true` was deprecated in Rails 7.0 and the option was was
removed in Rails 7.1, so in Rails 7.1 applications it isn't possible to
set it to `true` [1]. So we're setting it to `false` now.

[1] https://github.com/rails/rails/commit/689b27773
2024-04-15 15:39:28 +02:00
Javi Martín
077faa2ad0 Move cookies serializer option to Rails 7.0 file
We're moving it here so it's easier to remove it when we start using the
default Rails 7.0 options and will no longer need to specify it.
2024-04-15 15:39:28 +02:00