Commit Graph

18014 Commits

Author SHA1 Message Date
Javi Martín
d0f8560c33 Fix SVG icons on old browsers
We were using an `@extend` selector inside a `@supports` condition,
which didn't generate the `@supports` clause as we intended to, so
browsers with no support for mask images were still applying properties
which were meant for browsers with support for mask images.
2021-06-21 20:16:45 +02:00
Javi Martín
017035c659 Merge pull request #4551 from consul/responsive_font_size
Increase font size on extra large screens
2021-06-21 16:11:48 +02:00
Javi Martín
4e04adecf9 Increase font size on extra large screens
Nowadays there are many users with a screen of 1920px (or higher) width
but who don't change their font-size preferences and keep them at 16px,
which is the default in most browsers.

On pages which use the whole window width, that results in unreasonably
long lines which are very hard to read. That's the main reason why many
sites (including CONSUL) use rules like `max-width: 75rem` for the body
or other elements.

However, on extra large screens this causes the content to be in the
middle of the screen while most of the screen is empty, and the text
might also be too small for that resolution, making it harder to read.

There are a few approaches to solve this problem.

Using just viewport units like `font-size: calc(4vw + 4vh + 2vmin);` is
indeed responsive, but it's got an important flaw: it ignores user
preferences, and so the font size will be the same for users who prefer
a 16px size and for users who prefer a 32px size.

Using `calc(1em + 0.2vw)` or similar might make the text too big on
small screens.

Finally, using `max(1em, 1vw)` would work in a similar way to what we're
doing, but zooming in and out would only work when the viewport width is
less than 100em (at that moment, 1em == 1vw).

So we're taking an approach where zooming in and out always works at
least to a certain degree (due to the 0.25em part) and the font size is
increased gradually when we reach the point where the viewport width is
bigger than 100em. We're using 0.25em since it will be exactly 4px with
the default browser configuration, and so calculations are easier than
with (for example) 0.3em.

Disclaimer: I've tested this feature on several devices with different
screen sizes and resolutions, but I must admit there might be cases I'm
unaware of where there are side effects for certain combinations of
screen size/resolution/dpi. In general, though, the side effects should
be similar to what happens when users increase the font size in their
browser's preferences.

Note we're using `Max` instead of `max` because Sass can't handle the
CSS `max` function, as mentioned in commit cdfa23fc6.
2021-06-21 15:38:36 +02:00
Javi Martín
64a3761aee Merge pull request #4526 from consul/relative_font_size
Use relative units as base font size
2021-06-21 15:33:29 +02:00
Javi Martín
de79d8a0fd Merge pull request #4556 from consul/auth_divider
Fix margin in sign in / sign up forms divider
2021-06-21 15:25:35 +02:00
Javi Martín
79007fa2b5 Fix margin in sign in / sign up forms divider
When the "Or fill the following form" text was translated to another
language or customized by administrators, the text could span over two
lines. Since the element had a fixed height, it could overlap with the
text below it.

So now we're using an element with a relative position to achieve the
same effect (have the contents of the elements on top of its border).
2021-06-17 16:04:03 +02:00
Javi Martín
c6a459c115 Merge pull request #4558 from consul/featured_disabled
Respond with 403 when features are disabled
2021-06-17 15:39:12 +02:00
Javi Martín
59518846a8 Merge pull request #4554 from consul/flaky_hidden_spec
Fix flaky hidden budget investments spec
2021-06-17 15:34:22 +02:00
Javi Martín
5f747122c5 Don't assign IDs to user records in tests
This test will fail if the ID of the created record is the same as the
ID of the first user we create in the test. The chance is very low due
to the `rand(9999999)` which causes the test to fail just once every ten
million times. However, why assigning the ID in the first place? Without
it, the test will never fail due to conflicting IDs.
2021-06-17 01:46:48 +02:00
Javi Martín
433b465ec7 Don't assign IDs to assignment records in tests
The test "updates officer_assignment_id_log if amount changes" failed
when the ID we assigned when creating the records was the same as the ID
of the first officer assignment created during that test. It's recently
happened while running our test suite [1] with the following error:

```
1) Poll::Recount logging changes updates officer_assignment_id_log if
amount changes
  Failure/Error: poll_recount.officer_assignment =
                  create(:poll_officer_assignment, id: 101)

     ActiveRecord::RecordNotUnique:
       PG::UniqueViolation: ERROR:  duplicate key value violates unique
       constraint "poll_officer_assignments_pkey"
       DETAIL:  Key (id)=(101) already exists.
```

We're also removing the IDs in the "updates officer_assignment_id_log if
amount changes" test to avoid any possible issues, even if in this test
I think no other officer assignments are created and so there can't be
another record with the same ID.

[1] https://github.com/consul/consul/runs/2818889296
2021-06-17 01:46:48 +02:00
Javi Martín
1627d87890 Avoid adding compiled assets to version control
We've seen a few CONSUL repositories where compiled assets have
accidentally been added to version control. It's pretty easy if you use
something like `git add .` before creating a commit and you've compiled
the assets locally.

Having these assets in version control doesn't help and in certain
environments it might even have side effects. For instance, we might try
updating the source code of a Sass file and might wonder why these
changes are ignored in some test or development environments.
2021-06-17 01:44:24 +02:00
Javi Martín
1e80ab31ee Use relative units as base font size
Using pixels to define font sizes has an important problem: it ignores
user settings. No matter whether users set their font size to 16px (the
default font size in most browsers), to 18px (like I do) or to 32 px
(like users with huge screens or with a visual disability); the size
will not change.

Even if most browsers can zoom to somehow overcome this issue, it's
still annoying. And, in our case, we use relative units most of the time
but absolute units in some places. This leads to situations where some
of the text gets larger when users increase their font size while some
of the text remains the same. Sometimes this results in titles having a
smaller size than regular text below it.

The solution is using relative units everywhere. Quoting the Web
Accessibility Initiative guide for styles [1]:

> The user needs to be able to resize the text to 200% of its size
> anywhere on the page, without the text being cut off or overlapping
> other text. The font size should be defined in relative units, such as
> percentages, em or rem. It is not possible to zoom text set in pixels
> independently from the rest of the page in some browsers.

[1] https://www.w3.org/WAI/tutorials/page-structure/styling/
2021-06-17 01:41:40 +02:00
Javi Martín
125f0bc73a Fix font size on column selector label
It was duplicating the `$base-font-size` value, and it was using pixels
as a unit, which we only use in the `$base-font-size` variable.
2021-06-17 01:41:40 +02:00
Javi Martín
7bb7548d00 Respond with 403 when features are disabled
When administrators disabled features and users tried to access them
with the browser, we were responding with a 500 "Internal Server Error"
page, which in my humble opinion was incorrect. There was no error at
all; the server worked exactly as expected.

I think a 403 "Forbidden" code is better; since that feature is
disabled, we're refusing to let users access it.

We could also respond with a 404 "Not found", although I wonder whether
that'll be confusing when administrators temporarily or accidentally
disable a feature.

A similar thing might happen if we responded with a 410 "Gone" code.
Actually this case might be more confusing since users aren't that
familiar with this code.

In any case, all these options are better than the 500 error.
2021-06-16 20:45:15 +02:00
Javi Martín
7f38f61bc1 Merge pull request #4539 from consul/system_emails_preview
Fix custom system emails preview
2021-06-16 12:25:15 +02:00
decabeza
47925fbab1 Render custom mailer views if exists 2021-06-15 19:48:25 +02:00
Javi Martín
c0c7ab5c07 Merge pull request #4504 from consul/remove-supports
Allow users to remove their supports on budget investments
2021-06-14 15:50:58 +02:00
decabeza
a851048d56 Allow users to remove their support on investments
Note we don't cast negative votes when users remove their support. That
way we provide compatibility for institutions who have implemented real
negative votes (in case there are / will be any), and we also keep the
database meaningful: it's not that users downvoted something; they
simply removed their upvote.

Co-Authored-By: Javi Martín <javim@elretirao.net>
Co-Authored-By: Julian Nicolas Herrero <microweb10@gmail.com>
2021-06-14 14:46:54 +02:00
Javi Martín
368023986a Group investment support translation keys together
This way it's easier to find the keys: keys related to the
`Budgets::Investments::VotesComponent` class are in the
`budgets.investments.votes` namespace.

We're making a couple of exceptions; we're not modifying the `supports`
nor the `support_title` keys because they're used in other places.
2021-06-14 14:46:48 +02:00
Javi Martín
758cdaf8d7 Extract controllers to support investments
Since we're going to add an action to remove supports, having a separate
controller makes things easier.

Note there was a strange piece of code which assumed users were not
verified if they couldn't vote investments. Now the code is also
strange, since it assumes users are not verified if they can't create
votes. We might need to revisit these conditions if our logic changes in
the future.
2021-06-14 14:42:03 +02:00
Javi Martín
071da81be6 Add notice when supporting an investment
It was hard to notice what was going on when supporting one investment
which was at the bottom of the investment index page.

I wonder whether we should add the title of the investment to this text;
I'm not doing so because we don't do that anywhere else.
2021-06-14 14:42:03 +02:00
Javi Martín
0214184b2d Remove investment supports query optimizations
In the previous commit I mentioned:

> If I'm right, the `investment_votes` instance variable only exists to
> avoid several database queries to get whether the current user has
> supported each of the investments.
>
> However, that doesn't make much sense when only one investment is
> shown.

Now let's discuss the case when there are several investments, like in
the investments index:

* There are 10 investments per page by default
* Each query takes less than a millisecond
* We still make a query per investment to check whether the current user
  voted in a different group
* AFAIK, there have been no performance tests showing these
  optimizations make the request to the investments index significantly
  faster
* These optimizations make the code way more complex than it is without
  them

Considering all these points, I'm removing the optimizations. I'm fine
with adding `includes` calls to preload records and avoid N+1 queries
even if there are no performance tests showing they make the application
faster because the effect on the code complexity is negligible. But
that's not the case here.

Note we're using `defined?` instead of the `||=` operator because the
`||=` operator will not serve its purpose when the result of the
operation returns `false`.
2021-06-14 14:41:57 +02:00
Javi Martín
5fab843184 Simplify managing investment votes
If I'm right, the `investment_votes` instance variable only exists to
avoid several database queries to get whether the current user has
supported each of the investments.

However, that doesn't make much sense when only one investment is shown.
In this case, the number of queries stays the same, and so we can
simplify the code by rendering the component with an optional parameter.
2021-06-14 14:41:51 +02:00
Javi Martín
d5f4313f59 Simplify getting URL to support an investment
We're also changing the method name to `vote_path` in order to be
consistent with the way Rails uses `_path` for relative URLs.
2021-06-14 14:38:34 +02:00
Javi Martín
a0c23ec65c Merge pull request #4508 from consul/budgets-info-section
Add info section to budgets in the selecting phase
2021-06-14 14:10:12 +02:00
decabeza
e8b847d797 Add budgets support image 2021-06-14 13:48:45 +02:00
decabeza
b23fe300f5 Add supports info section on budgets index page 2021-06-14 13:48:44 +02:00
Javi Martín
3ebf74c231 Merge pull request #4549 from consul/investment_votes
Improve accessibility in support investment button
2021-06-14 13:45:31 +02:00
Javi Martín
bb958daf05 Replace support investment link with a button
Using links combined with JavaScript to generate POST requests to the
browser has a few issues.

An obvious one is that it doesn't work for users without JavaScript
enabled (which lately I've noticed are more common than I thought, even
though I've been one of them for years). These users will reach a 404
page.

Since CONSUL isn't currently designed to work without JavaScript
enabled, let's ignore this one for now.

A not so obvious issue is screen reader users might expect the link to
take them somewhere instead of performing an action (in this case,
sending a form to the server).

There might be more issues I'm unaware of. Quoting DHH [1]:

"Turning ahrefs into POSTs is a bit of an anti-pattern, especially for
a11y reasons. Better to use button_to with a styling."

So we're using a button instead. This way we can also simplify the code
and make the button disabled for unidentified users, which automatically
makes it impossible to focus it using the keyboard.

A possible disadvantage of using `button_to` is it will create a form
tag which will be announced to screen readers as a form landmark. I've
tested it with my screen reader and everything worked fine for me, but
some screen reader users might interact with these forms in a different
way and find it confusing, particularly in the case where the button is
disabled.

With this change, we're only changing links for buttons in one place.
There are other places where we should do similar changes.

[1] See issue 33 in https://github.com/hotwired/turbo-rails/
2021-06-14 12:51:41 +02:00
Javi Martín
0b287e4a78 Fix test checking same group investment support
We meant to check that the link to support a different investment didn't
have an alert dialog. However, we were testing by trying to support the
same investment twice, and here there was no link at all, so the
assertion "there's no link with a dialog" always passed even when the
application didn't behave properly.

Now we check there's a link there, and that link doesn't have an
associated alert dialog.
2021-06-14 12:51:41 +02:00
Javi Martín
de436e33a4 Use a component test to check a link title
In regular system tests, we prefer testing against the text of the link
because it's easier to recognize which link we're talking about.

I was wondering whether we should remove the `title` attribute
completely and use just the `aria-label` attribute. Quoting The Paciello
Group blog [1]:

"If you want to hide content from mobile and tablet users as well as
assistive tech users and keyboard only users, use the title attribute."

However, there's a case where mouse users might find the title attribute
useful. When visiting an investment page, the connection between the
"Support" link and the investment is not as clear as it is in the
investments index page, so it might not be clear what you're supporting.

As mentioned, though, this information will only be relevant for mouse
users, who nowadays represent less than half of our users.

[1] https://www.tpgi.com/using-the-html-title-attribute-updated/
2021-06-14 12:51:41 +02:00
Javi Martín
42ffc62d12 Add investment name in vote link aria-label
This way blind screen reader users will know which project they're
supporting. In a list of investments, context might not be clear when a
link saying "Support" or "Support this project" is announced, but a link
saying "Support Renovate sidewalks in Main Street" is less ambiguous.
2021-06-14 12:51:41 +02:00
Javi Martín
da11c0d7ba Fix empty support link for screen readers users
When identified users accessed the investments page, we were using the
`aria-hidden` attribute to hide this link from screen readers since
unidentified users can't support investments.

However, the link was still focusable using keyboard navigation. This
resulted in screen reader users reaching the link and being able to
click it, but getting no feedback at all about where they were or what
they were clicking on.

This is why the fourth ARIA rule says: "Do not use role="presentation" or
aria-hidden="true" on a focusable element" [1].

So we're replacing the link with a non-interactive element instead, like
we do in other places like proposals.

The accessibility of this part of the page for unidentified users still
has some issues; here we're only improving it up to a certain point.

[1] https://www.w3.org/TR/using-aria/#4thrule
2021-06-14 12:51:41 +02:00
Javi Martín
5663608cd7 Simplify code in link to support investment
The code was harder to read with the (unnecessary) block.
2021-06-14 12:51:41 +02:00
Javi Martín
791e8b61ec Extract method to get support confirmation message 2021-06-14 12:51:41 +02:00
Javi Martín
cd8fa606c7 Use methods instead of variables in votes view
Now the view is more readable and it's possible to customize these
methods writing a custom class, without changing or copying the view.
2021-06-14 12:51:41 +02:00
Javi Martín
ad6dd54da2 Simplify rule to display support alert 2021-06-14 12:51:41 +02:00
Javi Martín
57628a78d9 Move investment votes partial to a component
This way changing it will be easier.
2021-06-14 12:51:41 +02:00
Javi Martín
e4ad70fd82 Revert "Adds .js-class for specs"
The `js-` prefix (which I admit I'm not fond of) is usually used to
indicate the class is used by JavaScript files, not for using it in test
files. And in all the other similar tests, we're using the `in-favor`
class instead of the `js-in-favor` class.

This reverts commit 83fe74d53.
2021-06-14 12:51:41 +02:00
Javi Martín
f437ca988d Merge pull request #4550 from consul/management_support_investment
Fix investment support in management section
2021-06-14 12:51:07 +02:00
Javi Martín
d18a6f863b Merge pull request #4547 from consul/phases_image_alt
Fix accessibility issues in budgets index
2021-06-14 12:48:55 +02:00
Javi Martín
568a8db5cc Merge pull request #4553 from consul/budgets_typo
Fix typo in "currently showing" translation
2021-06-14 12:47:04 +02:00
Javi Martín
d983443ecc Fix investment support in management section
When supporting an investment in the management section through the
investment view, we were accessing an action in the public investments
controller. This meant the manager was the one supporting the investment
(as they'd be the `current_user` in this controller) and not the managed
user.

In the case of groups with many headings, voting the first time requires
a confirmation and then a regular (non-AJAX) request takes place. In
this case, users were redirected to the public area instead of remaining
in the management area.

Using the proper URL to vote solves the problem.

Note there was a comment about one of these tests failing in Travis.
Most probably the test failed because there was no expectation after
clicking the link with the investment title, so the "Support" button
(which is also present in the index page) was clicked before the
investment view was loaded.
2021-06-14 12:37:40 +02:00
Javi Martín
6841fe1491 Merge pull request #4548 from consul/investment_list_i18n
Fix duplicate support_title I18n key
2021-06-14 12:13:32 +02:00
Javi Martín
8b8b1b7a43 Fix flaky hidden budget investments spec
The test was failing sometimes because the conditions we were checking
were the same before and after clicking the "Pending" link. So there was
a race condition between the request generated by clicking the "Pending"
link and the order to click the "Confirm moderation" link. This
sometimes resulted in the "Confirm moderation" link not being correctly
clicked.
2021-06-14 01:57:26 +02:00
Javi Martín
da2d6b8202 Fix typo in "currently showing" translation
The Spanish text didn't have a period at the end; since the next
sentence started with a capital letter, the result was weird.
2021-06-14 01:39:45 +02:00
Javi Martín
8b1e48b4ea Fix duplicate support_title I18n key
The key was declared twice and so the first one ("Support this project")
was overwritten.

We're grouping all keys related to the investment list together in order
to reduce the chances of this issue happening again (or, at least, in
this part of the code).
2021-06-12 13:20:39 +02:00
Javi Martín
f3a3bf35f8 Fix contrast in investment list
The color we used offered a contrast of 3.94 against the background. The
minimum requirement for AA level is a contrast of 4.5, and we usually
aim for a contrast of 5 at least.

So we're making the text slightly darker so it's easier to read.
2021-06-12 01:23:26 +02:00
Javi Martín
edaa2d2de8 Fix missing alt attribute in phases images
An image without an alt text is invalid HTML and is confusing for screen
reader users.

This is just a quick patch which partially solves this problem. The
image doesn't necessarily need to be a decorative one, so administrators
should have the option to provide an alternative text for the images.
2021-06-12 01:23:14 +02:00
Javi Martín
59ee3d1215 Merge pull request #4507 from consul/preview-investments-list
Preview list of investments
2021-06-11 19:45:35 +02:00