Commit Graph

20028 Commits

Author SHA1 Message Date
Javi Martín
0b0cbcfe5a Fix typos in HTML target attributes
In some places, we were using `blank` instead of `_blank`. Most browsers
treat `blank` like `_blank`, though, so most people didn't experience
any difference.

In another place, we were incorrectly passing the `target` option inside
an `options:` hash, resulting in invalid HTML.
2023-10-23 18:19:47 +02:00
Javi Martín
cdc5e05d48 Open PDF files in the same tab/window
Quoting usability experts Jakob Nielsen and Anna Kaley [1]:

> [Opening PDF files in new tabs] is problematic, because it assumes
> users will always do the exact same things with certain file formats,
> which isn’t always the case.

There are many examples of this situation. For example, some people
(myself included) configure their browser so it downloads PDF files
instead of opening them in the browser. In this situation, a new tab is
opened, a blank page is displayed, the file is downloaded, and then
either the tab is closed or the blank page needs to be manually closed.
The end result is really annoying.

Other situations include people who use a mobile phone browser, where
navigating through tabs is generally much harder than doing so on a
desktop browser.

But IMHO the most important point is: every browser already provides a
way to open "regular" links in a new tab, so people can choose what to
do, but if we decide to open the link in a new tab, we take control away
from them, and people who'd like to open the link in the same tab might
feel frustrated.

In these cases, the links either say "download" or include the word
"PDF", so people know in advance that they're going to download/open a
PDF file, and so we're giving them information and, by removing the
`target` attribute, we're giving them control over their browser so they
can choose what's convenient for them.

[1] https://www.nngroup.com/articles/new-browser-windows-and-tabs
2023-10-23 18:16:14 +02:00
Javi Martín
7c6134fdee Unify the way we display document information
We were displaying documents in five places, and in five different ways.
Sometimes with the metadata in parenthesis after the title, sometimes
with the metadata below the title, sometimes without metadata, sometimes
with an icon in front of the document, and sometimes with a separate
link to download the file.

So we're now displaying the same thing everywhere. Not sure whether this
is the best solution, but at least it's consistent.

We aren't unifying the way we display a list of documents, though, since
different sections look pretty different and I'm not sure whether the
same style would look well everywhere.

Note that we're renaming the `document` HTML class in the documents
table to `document-row` so the styles for the `document` class don't
apply here.
2023-10-23 18:15:54 +02:00
Javi Martín
a2e4b056ee Move documents partials to components
This way it'll be easier to change them.

Note that there were two `.document-link` elements which aren't part of
a `.documents` element. We're renaming the HTML class of the link in
investments because it didn't contain links to download documents and
are slightly duplicating the CSS in the poll answer documents in order
to keep the `word-wrap` property.
2023-10-23 18:10:24 +02:00
Javi Martín
e0c5be10aa Extract mixins to style separators
This way they can be reused in other places.
2023-10-23 15:49:01 +02:00
Javi Martín
5f0a7f4bbc Group show document tests together
While in unit tests it's great to have different tests for different
expectations, system tests are slow, and so it's better to have just one
test for all the expectations related to the same actions.
2023-10-23 15:49:01 +02:00
Javi Martín
a8bd5eb192 Rename document/image fields HTML classes
Using the `document` or `documents` classes meant styles defined for the
public list of documents conflict with these ones.

So now we're using HTML classes that match the name of the Ruby
component classes, as we usually do.
2023-10-23 15:49:01 +02:00
Javi Martín
1e1d7996bb Simplify rendering document/image fields
We were adding <div> tags with the `images` or `documents` HTML class
prettly much every time we rendered a NestedComponent. We're now
including the HTML class inside the component, as we usually do.

We're also rendering the nested components directly, since it's been a
while since the partials were changed to simply render the components.
2023-10-23 15:49:01 +02:00
Javi Martín
00f063b291 Remove unused documents-related CSS
We don't have any elements matching the `.documents .icon-document`
selector.
2023-10-23 15:49:01 +02:00
Javi Martín
f9bb178cb0 Remove obsolete data attribute
This attribute isn't used since commit 88a7a29d2.
2023-10-23 15:49:01 +02:00
Javi Martín
2093083d29 Remove <hr> tags in document fields
We aren't using <hr> tags on any forms containing fields to add/edit
documents, so using this in the dashboard actions form and the
legislation process form was inconsistent.
2023-10-23 15:49:01 +02:00
Javi Martín
6d8f6445bc Remove unused parameter when rendering documents
This parameter isn't used in the `documents/_documents` partial.
2023-10-23 15:49:01 +02:00
Javi Martín
6d59a847eb Unify links to download documents in admin tables
We were using a "Download file" link in one place, while in another
place we had an additional column where the name of the document was a
link to download it.
2023-10-23 15:49:01 +02:00
Javi Martín
bdb92e4161 Remove redundant link to download document
There's a link next to it that does the exact same thing and includes
the word "download", which was confusing in some cases since people
might think that links with different texts lead to different pages.
2023-10-23 15:49:01 +02:00
Javi Martín
1826e3b691 Remove legacy Paperclip columns
We haven't used these columns since commit 7212657c0, and every Consul
Democracy installation has been using Active Storage since version
1.5.0.
2023-10-23 15:49:01 +02:00
taitus
87fc3c572b Add security secret "last_sign_in"
In order to comply with the security measure for the
ENS: "[op.acc.5.r5.2] The user shall be informed of
the last access made with his identity".

We have added a new secret to display the last
access made to the user on the "My account" page.
2023-10-20 08:03:24 +02:00
Javi Martín
13e9b75d9a Merge pull request #5286 from consuldemocracy/dependabot/npm_and_yarn/jquery-3.7.1
Bump jquery from 3.6.0 to 3.7.1
2023-10-18 21:28:01 +02:00
dependabot[bot]
8e27953d78 Bump jquery from 3.6.0 to 3.7.1
Bumps [jquery](https://github.com/jquery/jquery) from 3.6.0 to 3.7.1.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.6.0...3.7.1)

---
updated-dependencies:
- dependency-name: jquery
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-18 20:35:41 +02:00
Javi Martín
e0435153ef Merge pull request #5287 from consuldemocracy/dependabot/npm_and_yarn/jquery-ui-1.13.2
Bump jquery-ui from 1.12.1 to 1.13.2
2023-10-18 18:54:15 +02:00
dependabot[bot]
874ed76e28 Bump jquery-ui from 1.12.1 to 1.13.2
Bumps [jquery-ui](https://github.com/jquery/jquery-ui) from 1.12.1 to 1.13.2.
- [Release notes](https://github.com/jquery/jquery-ui/releases)
- [Commits](https://github.com/jquery/jquery-ui/compare/1.12.1...1.13.2)

---
updated-dependencies:
- dependency-name: jquery-ui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-18 16:21:38 +00:00
Javi Martín
087a8b24d3 Merge pull request #5285 from consuldemocracy/dependabot/npm_and_yarn/jquery-ujs-1.2.3
Bump jquery-ujs from 1.2.2 to 1.2.3
2023-10-18 18:20:48 +02:00
Javi Martín
7070b0915b Allow liking/unliking when JavaScript is disabled
Even if pretty much nobody uses a browser with JavaScript disabled when
navigating our sites, there might be times where JavaScript isn't loaded
for reasons like a slow internet connections not getting the JavaScript
files or a technical issue.

So we're making it possible to still use the like/unlike buttons in
these cases.
2023-10-18 18:08:59 +02:00
Javi Martín
38e81f2858 Style "like" buttons to hint they can be unpressed
We added the feature to undo a vote and made it obvious for people using
screen readers using the `aria-pressed` attribute. However, for sighted
people, the only way to know a button can be unpressed is to try to
press it again and see what happens.

The most obvious way to indicate it would be to add a text indicating
that you can undo your vote. However, that'd require changing the design
quite a bit.

So, after trying a few techniques, we're using a classic approach
browsers have used by default for years: using an inset border for
pressed buttons and an outset border for unpressed ones. It might now be
enough, though; we haven't done usability tests to confirm this point.

Since icons to like/unlike comments don't have a border, I'm not sure
what to do in this case; the icons are small and that makes it hard to
style them in a distinct way. So for now we're not changing these icons.
2023-10-18 18:08:59 +02:00
Javi Martín
3482e6e058 Change styles of pressed buttons on hover
Since we were styling pressed buttons the same way as buttons on hover,
a person hovering on the button and then clicking it wouldn't notice
that the buttons had been pressed unless they noticed that the number
and percentages of votes had changes. They wouldn't notice the changes
when unpressing the buttons either, since, after clicking the button,
the cursor would still be over it, and so the hover styles would apply.

Furthermore, it was hard for mouse users to realize that a button could
be unpressed, since the style of pressed buttons didn't change on hover.

So we're now changing the icons on hover without changing the
background. This way all four states (unpressed, unpressed on hover,
pressed, pressed on hover) are styled in a different way.
2023-10-18 18:08:59 +02:00
Javi Martín
11a33c12e3 Increase contrast in like/unlike buttons
The colors we were using (gray for unpressed buttons and green or red
for pressed buttons) didn't contrast well against a white background, so
we're now using darker colors.

However, with darker colors, using solid icons for the unpressed buttons
makes it harder to differentiate when a button is pressed and when it
isn't, particularly for color-blind people.

So we're now using regular icons for the unpressed buttons and solid
icons for the pressed ones.
2023-10-18 18:08:59 +02:00
Javi Martín
1387356c86 Refactor like/unlike buttons SCSS
We were using the same selectors three times. Since we're going to
change that part of the code, we're simplifying it so we don't have to
do the same changes three times.
2023-10-18 18:08:59 +02:00
Javi Martín
0f45dbb896 Simplify border-related rules for like/unlike icons
We were keeping the same style and width when they were pressed, so we
can simply overwrite the color.
2023-10-18 18:08:59 +02:00
Javi Martín
bdcf074392 Use Debian Bullseye instead of Buster on Docker
Debian Bullseye was released in 2021 and Debian Buster only receives
security updates.

Note that the libindicator7 package is no longer available in this
distribution. However, we were only installing it in order to install
chromedriver, which we don't do since commit 59b625a5f, so we don't need
it anymore.
2023-10-18 18:08:31 +02:00
Javi Martín
d2b0acb6b4 Merge pull request #5301 from consuldemocracy/node_js_18.18.2
Update Node.js from 18.18.0 to 18.18.2
2023-10-18 17:59:17 +02:00
Javi Martín
ac5fe3e289 Update Node.js from 18.18.0 to 18.18.2 2023-10-18 17:33:58 +02:00
dependabot[bot]
9cbad7d5a6 Bump jquery-ujs from 1.2.2 to 1.2.3
Bumps [jquery-ujs](https://github.com/rails/jquery-ujs) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/rails/jquery-ujs/releases)
- [Changelog](https://github.com/rails/jquery-ujs/blob/master/RELEASE.md)
- [Commits](https://github.com/rails/jquery-ujs/compare/v1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: jquery-ujs
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-18 12:54:13 +00:00
Javi Martín
ed705525cf Merge pull request #5159 from consuldemocracy/npm_packages
Allow adding Node packages as dependencies
2023-10-18 14:53:48 +02:00
Javi Martín
55efcbc198 Merge pull request #5158 from consuldemocracy/node_version
Depend on a specific version of Node.js
2023-10-18 14:52:39 +02:00
Javi Martín
3b6fb85c51 Use node packages to install jQuery and jQuery UI
Other packages depend on jQuery, so that's why these are the first one
we move from the Gemfile to the package.json file.

This way we can also test whether dependabot correctly opens pull
requests to update Node packages.

I've tried several configuration options for the asset pipeline in order
to be able to include images referenced in jQuery UI CSS files. So far,
adding the `node_modules/jquery-ui/themes/base` folder to the assets
paths is the only way I've found to make it work. Hopefully we can find
a better solution in the future so we don't have to study the internals
of every Node package in order to integrate it with the assets pipeline.
2023-10-17 13:12:20 +02:00
Javi Martín
421cbe5441 Use dependabot to update NPM packages
Just like we do with gems.
2023-10-17 13:12:20 +02:00
Javi Martín
daf960add4 Run npm:install when deploying with Capistrano 2023-10-17 13:12:20 +02:00
Javi Martín
ad166fba4c Setup NPM with an empty package.json file
Note that, even if we're excluding the `node_modules/` folder from
version control, we aren't adding it to Capistrano's shared folders
because, when `node_modules` is a symbolic link, NPM removes it when
running `npm install`.
2023-10-17 13:12:20 +02:00
Javi Martín
ed4f8ad6d9 Simplify development environment setup
Rails provides a script that already did most of the steps.
2023-10-17 13:12:20 +02:00
Javi Martín
f209325b90 Wrap node commands with Capistrano
This code is based on what the rvm1-capistrano and capistrano-nvm gems
do, but simplified a bit to take advantage of the `fnm exec` command.

Since ExecJS will check for a JavaScript runtime every time the
application is started, we need to include commands like `bundle` (used
when running `bin/delayed_job`), `puma` and `rake`, so Node.js is found
when running these commands. I'm not sure whether `pumactl` is also
necessary, but I've added it for consistency.

We're also including the default commands gems like capistrano-nvm use
because we will add the `npm` command in the near future.

Note that, in order to setup FNM, we need to enter the actual release
folder (using `within release_path` isn't enough). So we have to run
this task after the actual release is created; otherwise many commands
would run in the previous release's folder.
2023-10-17 13:11:58 +02:00
Javi Martín
8ab66dd12f Install Node.js on deploy
We use FNM instead of NVM. Reason: the setup seems easier with just
`eval "$(fnm env)"`.

So now, we try to install Node.js; if the command fails, it could be
because FNM isn't installed (and we need to install it) or because the
version of Node.js cannot be installed with the current version of FNM
(and we need to update FNM). After installing/updating FNM, we try to
install Node.js again.

Note we're using `fnm env` in the middle of the `fnm_setup_command`.
That way, the command will raise a `SSHKit::Command::Failed` exception
if `fnm` isn't installed, and it will give us an indicator that we need
to actually install it.
2023-10-17 13:11:58 +02:00
Javi Martín
55ed40e182 Depend on a specific version of Node.js
We're choosing version 18 because if offers support for SSL 3, just
like Ruby 3.1 does.

Note we're symlinking a .nvmrc file as well, in order to make it
compatible with NVM. While the .nvmrc and .node-version files use
different formats, they both support the syntax we're using to
define the version.

The code to install Node.js in the Dockerfile is a simplification of the
code in the Rails Dockerfile template [1].

[1] https://github.com/rails/rails/blob/04c97aec8a/railties/lib/rails/generators/rails/app/templates/Dockerfile.tt#L25
2023-10-17 13:11:58 +02:00
jensconsul
b5c13d63d1 Add information about the project to admin index
This way it'll be easier for people to know how to contact the Consul
Democracy Foundation.

Co-Authored-By: Javi Martín <javim@elretirao.net>
2023-10-16 15:23:19 +02:00
Javi Martín
4435673ace Move admin index to a component
This way we make it easier to modify.

Note that, since the title of the page is "Administration" and it's in
the "Admin" section, we're adding an option to the `header` method in
order to avoid having a confusing title like "Administration - Admin".

Also note that, by removing the `title` HTML class, we avoid inheriting
styles from the `dashboard.scss` stylesheet, and now the heading is
displayed in the position it was meant to.

Finally, the concept of using a `main-class` for the current page comes
from a branch (currently in development) which will replace the <div>
tag with the `admin-content` class with a `main` tag.
2023-10-16 15:06:15 +02:00
Senén Rodero
0138e5d92c Merge pull request #5168 from consuldemocracy/bug_editing_image_name
Do not validate the attachment when updating the name
2023-10-13 15:00:27 +02:00
Javi Martín
5317f2fe28 Merge pull request #5257 from consuldemocracy/increase_contrast
Increase contrast in colors used in "My account"
2023-10-10 15:33:18 +02:00
Javi Martín
664b7c853b Merge pull request #5255 from consuldemocracy/focus_contrast
Increase links and buttons contrast on focus
2023-10-10 15:31:55 +02:00
Javi Martín
ae4b07de41 Make alt text readable when the logo doesn't load
We were displaying the alt text using the same color as the background
color, which made it impossible to read it when the logo didn't load
(for whatever reason).

Using the same color as the text, like done in the admin section, solves
the issue.
2023-10-10 15:03:35 +02:00
Javi Martín
19bb08f7b8 Increase contrast in initialjs avatars
Not all the colors initialjs uses by default provide enough contrast
against a white text. The default initialjs colors are:

["#1abc9c", "#16a085", "#f1c40f", "#f39c12", "#2ecc71", "#27ae60",
"#e67e22", "#d35400", "#3498db", "#2980b9", "#e74c3c", "#c0392b",
"#9b59b6", "#8e44ad", "#bdc3c7", "#34495e", "#2c3e50", "#95a5a6",
"#7f8c8d", "#ec87bf", "#d870ad", "#f69785", "#9ba37e", "#b49255",
"#b49255", "#a94136"]

We're replacing them with colors containing less luminosity when
necessary in order to get a 4,5:1 contrast (it could be argued that a
3:1 contrast is enough when the icons are big, but that isn't always the
case and more contrast doesn't hurt):

["#16836d", "#12826c", "#896f06", "#a06608", "#1e8549", "#1e8549",
"#b35e14", "#c75000", "#207ab6", "#2779b0", "#de2f1b", "#c0392b",
"#9b59b6", "#8e44ad", "#6c767f", "#34495e", "#2c3e50", "#66797a",
"#697677", "#d82286", "#c93b8e", "#db310f", "#727755", "#8a6f3d",
"#8a6f3d", "#a94136"]

Since initialjs doesn't provide a way to change these colors using
JavaScript, we're changing them in Ruby, following the same algorithm
used by initialjs.
2023-10-10 15:03:35 +02:00
Javi Martín
517f74a748 Extract component to render an initialjs avatar
This way it'll be easier to change it.
2023-10-10 15:03:35 +02:00
Javi Martín
959176b66d Use a darker "delete" color
The color we were using didn't have enough contrast against a white
background, which made it harder to read texts like "Remove map marker"
or "Erase my account".

Since the new color is almost identical to the color we were using on
hover and for the border, we're changing the color on hover as well,
while IMHO it's no longer necessary to use a different color for the
border.
2023-10-10 15:03:35 +02:00