Compare commits

..

No commits in common. "64400b512c2a809a41c5437c59106cb7f30de2e9" and "c995a064342fa11b9951f6aec4e61a288b11b7d8" have entirely different histories.

685 changed files with 2732 additions and 12988 deletions

View file

@ -1,42 +0,0 @@
name: Rails Schema Check
on:
push:
branches: [main]
paths:
- 'db/migrate/**'
- 'db/schema.rb'
pull_request:
branches: [main]
paths:
- 'db/migrate/**'
- 'db/schema.rb'
jobs:
check-migration-and-schema:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 2 # Fetch the last 2 commits to be able to compare with the base branch
- name: Check for migration and schema.rb changes
run: |
#!/bin/bash
set -e
latest_migration_file=$(ls -v db/migrate/*.rb | tail -n 1)
latest_migration_version=$(basename $latest_migration_file | grep -oE '^[0-9]+')
# Get the schema version, without underscores
schema_version=$(grep -oE 'define.version: [0-9_]+' db/schema.rb | cut -d ' ' -f 2 | tr -d _)
if [ "$latest_migration_version" != "$schema_version" ]; then
echo "schema.rb version does not match the latest migration version. Have you forgotten to update the schema.rb?"
echo " SCHEMA VERSION = $schema_version (config/schema.rb)"
echo " LATEST MIGRATION VERSION = $latest_migration_version ($latest_migration_file)"
exit 1
fi

View file

@ -4,6 +4,7 @@ gem 'rails', '~> 7.0.5' # allows update to security fixes at any time
gem 'aasm'
gem 'acsv'
gem 'active_link_to' # Automatically set a class on active links
gem 'active_model_serializers'
gem 'activestorage-openstack'
gem 'active_storage_validations'
@ -11,7 +12,6 @@ gem 'addressable'
gem 'administrate'
gem 'administrate-field-enum' # Allow using Field::Enum in administrate
gem 'after_party'
gem 'ancestry'
gem 'anchored'
gem 'bcrypt'
gem 'bootsnap', '>= 1.4.4', require: false # Reduces boot times through caching; required in config/boot.rb
@ -58,7 +58,6 @@ gem 'listen' # Required by ActiveSupport::EventedFileUpdateChecker
gem 'lograge'
gem 'logstash-event'
gem 'mailjet', require: false
gem 'maintenance_tasks'
gem 'matrix' # needed by prawn and not default in ruby 3.1
gem 'mini_magick'
gem 'net-imap', require: false # See https://github.com/mikel/mail/pull/1439
@ -84,9 +83,7 @@ gem 'sassc-rails' # Use SCSS for stylesheets
gem 'sentry-delayed_job'
gem 'sentry-rails'
gem 'sentry-ruby'
gem 'sentry-sidekiq'
gem 'sib-api-v3-sdk'
gem 'sidekiq'
gem 'skylight'
gem 'spreadsheet_architect'
gem 'strong_migrations' # lint database migrations

View file

@ -49,6 +49,9 @@ GEM
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_link_to (1.0.5)
actionpack
addressable
active_model_serializers (0.10.13)
actionpack (>= 4.1, < 7.1)
activemodel (>= 4.1, < 7.1)
@ -97,8 +100,6 @@ GEM
administrate (~> 0.12)
aes_key_wrap (1.1.0)
after_party (1.11.2)
ancestry (4.3.3)
activerecord (>= 5.2.6)
anchored (1.1.0)
ast (2.4.2)
attr_required (1.0.1)
@ -116,7 +117,7 @@ GEM
axlsx_styler (1.1.0)
activesupport (>= 3.1)
caxlsx (>= 2.0.2)
bcrypt (3.1.19)
bcrypt (3.1.18)
benchmark-ips (2.12.0)
better_html (1.0.16)
actionview (>= 4.0)
@ -158,7 +159,7 @@ GEM
nokogiri (~> 1.10, >= 1.10.4)
rubyzip (>= 1.3.0, < 3)
charlock_holmes (0.7.7)
chartkick (5.0.4)
chartkick (4.1.3)
choice (0.2.0)
chunky_png (1.4.0)
clamav-client (3.2.0)
@ -191,7 +192,7 @@ GEM
sinatra (>= 1.4.4)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
devise (4.9.3)
devise (4.9.2)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
@ -237,7 +238,7 @@ GEM
excon (0.102.0)
factory_bot (6.1.0)
activesupport (>= 5.0.0)
ffi (1.16.3)
ffi (1.16.2)
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
rake
@ -269,7 +270,7 @@ GEM
et-orbi (~> 1.1, >= 1.1.8)
raabro (~> 1.4)
geo_coord (0.2.0)
geocoder (1.8.2)
geocoder (1.6.5)
globalid (1.2.1)
activesupport (>= 6.1)
gon (6.4.0)
@ -277,7 +278,7 @@ GEM
i18n (>= 0.7)
multi_json
request_store (>= 1.0)
graphql (2.0.24)
graphql (2.0.15)
graphql-batch (0.5.1)
graphql (>= 1.10, < 3)
promise.rb (~> 0.7.2)
@ -290,8 +291,8 @@ GEM
bundler (>= 1.14)
graphql (>= 1.10, < 3.0)
thor (>= 0.19, < 2.0)
groupdate (6.4.0)
activesupport (>= 6.1)
groupdate (5.2.2)
activesupport (>= 5)
haml (6.0.5)
temple (>= 0.8.2)
thor
@ -347,8 +348,6 @@ GEM
ruby-vips (>= 2.0.17, < 3)
invisible_captcha (2.0.0)
rails (>= 5.0)
job-iteration (1.4.1)
activejob (>= 5.2)
jquery-rails (4.5.1)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
@ -397,7 +396,7 @@ GEM
railties (>= 4)
request_store (~> 1.0)
logstash-event (1.2.02)
loofah (2.22.0)
loofah (2.21.3)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@ -409,12 +408,6 @@ GEM
activesupport (>= 3.1.0)
rack (>= 1.4.0)
rest-client (>= 2.0.0)
maintenance_tasks (2.3.2)
actionpack (>= 6.0)
activejob (>= 6.0)
activerecord (>= 6.0)
job-iteration (>= 1.3.6)
railties (>= 6.0)
marcel (1.0.2)
matrix (0.4.2)
memory_profiler (1.0.0)
@ -427,7 +420,7 @@ GEM
rake
mini_magick (4.11.0)
mini_mime (1.1.5)
mini_portile2 (2.8.5)
mini_portile2 (2.8.4)
minitest (5.20.0)
msgpack (1.4.2)
multi_json (1.15.0)
@ -444,7 +437,7 @@ GEM
net-protocol
netrc (0.11.0)
nio4r (2.5.9)
nokogiri (1.15.5)
nokogiri (1.15.4)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
open4 (1.3.4)
@ -497,7 +490,7 @@ GEM
pundit (2.2.0)
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.7.3)
racc (1.7.1)
rack (2.2.8)
rack-attack (6.5.0)
rack (>= 1.0, < 3)
@ -559,7 +552,7 @@ GEM
thor (~> 1.0)
zeitwerk (~> 2.5)
rainbow (3.1.1)
rake (13.1.0)
rake (13.0.6)
rake-progressbar (0.0.5)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
@ -567,12 +560,12 @@ GEM
redcarpet (3.6.0)
redis (5.0.6)
redis-client (>= 0.9.0)
redis-client (0.18.0)
redis-client (0.14.1)
connection_pool
regexp_parser (2.8.1)
request_store (1.5.0)
rack (>= 1.4)
responders (3.1.1)
responders (3.1.0)
actionpack (>= 5.2)
railties (>= 5.2)
rest-client (2.1.0)
@ -682,19 +675,11 @@ GEM
sentry-ruby (~> 5.9.0)
sentry-ruby (5.9.0)
concurrent-ruby (~> 1.0, >= 1.0.2)
sentry-sidekiq (5.9.0)
sentry-ruby (~> 5.9.0)
sidekiq (>= 3.0)
shoulda-matchers (4.5.1)
activesupport (>= 4.2.0)
sib-api-v3-sdk (7.4.0)
json (~> 2.1, >= 2.1.0)
typhoeus (~> 1.0, >= 1.0.1)
sidekiq (7.2.0)
concurrent-ruby (< 2)
connection_pool (>= 2.3.0)
rack (>= 2.2.4)
redis-client (>= 0.14.0)
simple_xlsx_reader (1.0.4)
nokogiri
rubyzip
@ -731,7 +716,7 @@ GEM
temple (0.8.2)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
thor (1.3.0)
thor (1.2.2)
thread_safe (0.3.6)
tilt (2.0.11)
timecop (0.9.4)
@ -800,7 +785,7 @@ GEM
nokogiri (~> 1.11)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.6.12)
zeitwerk (2.6.11)
zip_tricks (5.6.0)
zipline (1.4.1)
actionpack (>= 6.0, < 8.0)
@ -814,6 +799,7 @@ PLATFORMS
DEPENDENCIES
aasm
acsv
active_link_to
active_model_serializers
active_storage_validations
activestorage-openstack
@ -821,7 +807,6 @@ DEPENDENCIES
administrate
administrate-field-enum
after_party
ancestry
anchored
axe-core-rspec
bcrypt
@ -879,7 +864,6 @@ DEPENDENCIES
lograge
logstash-event
mailjet
maintenance_tasks
matrix
memory_profiler
mina
@ -924,10 +908,8 @@ DEPENDENCIES
sentry-delayed_job
sentry-rails
sentry-ruby
sentry-sidekiq
shoulda-matchers
sib-api-v3-sdk
sidekiq
simple_xlsx_reader
skylight
spreadsheet_architect

View file

@ -19,11 +19,6 @@ Vous souhaitez y apporter des changements ou des améliorations ? Lisez notre [
- postgresql
- imagemagick et gsfonts pour générer les filigranes sur les titres d'identité.
nous sommes en cours de migration de delayed_job vers sidekiq pour le traitement des jobs asynchrones.
pour faire tourner sidekiq, vous aurez besoin de
- redis
#### Développement
- rbenv : voir https://github.com/rbenv/rbenv-installer#rbenv-installer--doctor-scripts

View file

@ -4,5 +4,3 @@
//= link administrate/application.css
//= link administrate/application.js
//= link manager.css
//= link attestation.css
//= link_tree ../../../node_modules/@gouvfr/dsfr/dist/artwork

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.5 KiB

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-prefix="fas" data-icon="arrows-alt-v" class="svg-inline--fa fa-arrows-alt-v fa-w-8 fa-lg" width="32" height="32"><path d="M19.04 20.763h-1.656v-9.526h1.656c.768 0 2.494.242.61-1.6l-3.094-3.362a.815.815 0 0 0-1.22 0l-3.093 3.361c-1.643 1.831-.159 1.6.61 1.6h1.655v9.527h-1.655c-.769 0-2.235-.244-.61 1.6l3.093 3.362a.815.815 0 0 0 1.22 0l3.094-3.361c1.884-1.795.158-1.6-.61-1.6z" fill="currentColor"/><rect width="9" height="2" y="11" ry=".402"/><rect ry=".402" y="19" height="2" width="9"/><rect width="9" height="2" y="15" ry=".402"/><rect ry=".402" y="11" x="23" height="2" width="9"/><rect width="9" height="2" x="23" y="19" ry=".402"/><rect ry=".402" y="15" x="23" height="2" width="9"/></svg>

After

Width:  |  Height:  |  Size: 761 B

View file

@ -1,71 +0,0 @@
<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 252 90'>
<defs>
<symbol id='a' viewBox='0 0 11 15.5'>
<path d='M10.4 5.3C11.9 1.5 10.1 0 7.9 0 4.2 0 0 6.5 0 11.7c0 2.5 1.2 3.8 3 3.8 2.1 0 4.3-2 6.2-5.5h-1c-1.2 1.5-2.6 2.6-3.9 2.6-1.3 0-2-.8-2-2.6a10.7 10.7 0 01.3-2.2zm-4-3.1c1.1 0 2 .8 1.5 2.6L3.1 6.1c.8-2.2 2.2-4 3.4-4z' />
</symbol>
<symbol id='b' viewBox='0 0 12.4 21.8'>
<use width='11' height='15.5' y='6.4' href='#a' />
<path d='M7.9 4.7L12.4.6V0h-3L6.7 4.7H8z' />
</symbol>
<symbol id='c' viewBox='0 0 11.5 19'>
<path d='M1.7 5.7h2.6L.1 17.1a1.3 1.3 0 001.2 2c3 0 6.4-2.6 7.8-6.2h-.7a9.4 9.4 0 01-5.1 3.5L7 5.7H11l.5-1.6H7.7L9 0H7.6L4.9 4.1l-3.2.4v1.2z' />
</symbol>
<symbol id='d' viewBox='0 0 9.8 21.9'>
<path d='M7.6 8c.3-1-.4-1.6-1-1.6-2.2 0-5 2.1-6 5h.7A5.6 5.6 0 014.4 9L.1 20.3a1.1 1.1 0 001 1.6c2.2 0 4.7-2 5.8-5H6A5.6 5.6 0 013 19.5zM8 3.7a1.8 1.8 0 001.8-1.8A1.8 1.8 0 008 0a1.8 1.8 0 00-1.8 1.8A1.8 1.8 0 008 3.6' />
</symbol>
<symbol id='e' viewBox='0 0 14.8 15.5'>
<path d='M3.3 3.1c.7 0 1 1 0 3.4l-3 6.8c-.7 1.3 0 2.2 1.2 2.2a1.3 1.3 0 001.5-1l3-8C7.4 4.8 10 3 11 3s.8.6.3 1.6l-4.6 9a1.3 1.3 0 001.1 1.9c2.3 0 5-2 6-5h-.6A5.6 5.6 0 0110 13l4-8a6.1 6.1 0 00.8-2.8A2 2 0 0012.6 0c-2 0-3.6 2.2-6 5V2.8C6.6 1.4 6.1 0 4.8 0 3.2 0 1.8 2.5.7 4.9h.7c.7-1.1 1.3-1.8 2-1.8' />
</symbol>
<symbol id='f' viewBox='0 0 12 15.5'>
<path d='M11.8 3.5c.5-1.9.2-3.5-1.2-3.5-1.8 0-2.3 1.2-4 5V2.8C6.5 1.3 6 0 4.6 0 3.1 0 1.7 2.5.5 5h.8C2 3.7 2.8 3 3.3 3c.7 0 1 1 0 3.4l-3 6.8c-.7 1.3 0 2.1 1.2 2.1a1.3 1.3 0 001.5-1l3-8a50.3 50.3 0 012.6-3h3.2z' />
</symbol>
<symbol id='g' viewBox='0 0 14.7 16.2'>
<path d='M10.5 13.1c-.6 0-1-1 0-3.4L14.6.1 13.4 0l-1.3 1.3h-.3C6.1 1.3 0 8.6 0 14.2a2 2 0 002.1 2.1c1.7 0 3.3-2.4 5.2-5l-.1 1c-.3 2.6.6 4 2 4 1.5 0 3-2.4 4-4.9h-.7c-.7 1.1-1.5 1.8-2 1.8zM7.9 9.8c-1.3 1.6-3.4 3.5-4.3 3.5-.5 0-.9-.5-.9-1.6 0-3.5 4-8.2 6-8.2a4.2 4.2 0 011.4.2z' />
</symbol>
<symbol id='h' viewBox='0 0 21.9 19.8'>
<path d='M11.2 19.8l.3-.9c-3.8-.7-4.3-.7-2.7-4.8l1.4-3.9h3c1.9 0 1.9.9 1.6 3h1l2.6-6.9h-1c-1 1.6-1.8 2.9-3.8 2.9h-3l2-5.6c.8-2 1.1-2.4 3.7-2.4h.7c2.6 0 3 .7 3 3.5h1l.9-4.7H7.3L7 .9c3 .6 3.3.9 2 4.8L5.7 14c-1.5 3.9-2 4.2-5.5 4.8l-.3.9z' />
</symbol>
<symbol id='i' viewBox='0 0 10.1 21.9'>
<path d='M2.9 19.4L10.1.3 9.8 0l-5 .6v.6l1 .7c.9.7.6 1.3-.2 3.4L.2 19.9a1.3 1.3 0 001.1 2c2.3 0 4.7-2.1 5.8-5h-.7a6.5 6.5 0 01-3.5 2.5' />
</symbol>
<symbol id='j' viewBox='0 0 18 22'>
<path d='M18 .6h-4.3a3.8 3.8 0 00-2.1-.6A6.6 6.6 0 005 6.5a3.3 3.3 0 003 3.6c-1.9.8-3 1.8-3 2.9a1.7 1.7 0 00.9 1.5c-4.3 1.3-6 2.8-6 4.7 0 2 2.6 2.8 5.6 2.8 5.3 0 9.6-2.7 9.6-5.1 0-1.8-1.6-2.5-4.3-3.3-2.2-.7-3.2-.8-3.2-1.6A2.4 2.4 0 019 10.2a6.6 6.6 0 006.1-6.5 4.5 4.5 0 00-.2-1.5h2.5zM9.8 16.2c2.1.7 3 1 3 1.6 0 1.4-2 2.5-5.6 2.5-2.7 0-4-.6-4-2 0-1.5 1.4-2.5 3.5-3.3a21.5 21.5 0 003 1.2zM9 9c-1 0-1.3-.8-1.3-1.7 0-2.8 1.4-6.2 3.5-6.2 1 0 1.3.8 1.3 1.6 0 2.9-1.4 6.3-3.5 6.3z' />
</symbol>
<symbol id='k' viewBox='0 0 23 25.1'>
<path d='M14.3 15.6c1.9 0 2 .8 1.6 2.8H17l2.5-6.8h-1c-1 1.6-1.7 2.9-3.8 2.9h-4.1l2-5.6c.7-2 1-2.4 3.7-2.4H18c2.6 0 3 .7 3 3.5h1l.9-4.7H7.3l-.3.9c3 .6 3.3.9 2 4.8l-3.2 8.4c-1.5 3.9-2 4.2-5.6 4.8l-.2 1h17.4l3.2-5h-1.2c-2 2-4 3.8-8 3.8-4.7 0-4.3-.3-2.7-4.6l1.4-3.8h4.2zm2.3-11.8L21 .6V0h-3l-2.6 3.9h1.2v-.1z' />
</symbol>
<symbol id='l' viewBox='0 0 13.6 21.8'>
<path d='M11.4 6.4c-2 0-4 2.2-5.8 4.8L9.6.3 9.4 0l-5 .6V1l1 .8c.9.7.6 1.3-.2 3.4L.8 16.8A13.9 13.9 0 000 19c0 1.4 1.8 2.7 3.5 2.7 3.8 0 10-6.9 10-12.2 0-2.3-.5-3.2-2.1-3.2zM4.8 19.5c-.8 0-1.9-.7-1.9-1.3a15.5 15.5 0 01.8-2.2L5 12.7C6.3 11 8.4 9.3 9.6 9.3c.7 0 1.2.4 1.2 1.5 0 3.1-2.9 8.7-6 8.7z' />
</symbol>
<symbol id='m' viewBox='0 0 19.2 19.9'>
<path d='M17.6 0H7.3L7 .9c3 .6 3.3.9 2 4.8l-3.2 8.5c-1.5 3.9-2 4.2-5.5 4.8L0 20h15.7l3.5-6H18c-2 2-4.2 4.8-7.7 4.8-2.7 0-3-.5-1.6-4.5l3.1-8.5c1.4-3.9 2-4.2 5.5-4.8z' />
</symbol>
<symbol id='n' viewBox='0 0 126 90'>
<use width='12.4' height='21.8' x='112.7' y='66.1' xlink:href='#b' />
<use width='11.5' height='19' x='102.2' y='69' xlink:href='#c' />
<use width='9.8' height='21.9' x='93.6' y='66.1' xlink:href='#d' />
<use width='14.8' height='15.5' x='77.2' y='72.5' xlink:href='#e' />
<use width='12' height='15.5' x='65.7' y='72.5' xlink:href='#f' />
<use width='11' height='15.5' x='54.3' y='72.5' xlink:href='#a' />
<use width='11.5' height='19' x='43.7' y='69' xlink:href='#c' />
<use width='14.7' height='16.2' x='28.9' y='71.8' xlink:href='#g' />
<use width='12' height='15.5' x='19.6' y='72.5' xlink:href='#f' />
<use width='21.9' height='19.8' y='67.6' xlink:href='#h' />
<use width='12.4' height='21.8' x='77.3' y='33.1' xlink:href='#b' />
<use width='11.5' height='19' x='66.8' y='36' xlink:href='#c' />
<use width='9.8' height='21.9' x='58.2' y='33' xlink:href='#d' />
<use width='10.1' height='21.9' x='49.4' y='33.1' xlink:href='#i' />
<use width='14.7' height='16.2' x='34.9' y='38.8' xlink:href='#g' />
<use width='18' height='22' x='18.6' y='39.4' xlink:href='#j' />
<use width='23' height='25.1' y='29.3' xlink:href='#k' />
<use width='12.4' height='21.8' x='76.8' y='.1' xlink:href='#b' />
<use width='11.5' height='19' x='66.2' y='2.9' xlink:href='#c' />
<use width='12' height='15.5' x='54.8' y='6.5' xlink:href='#f' />
<use width='11' height='15.5' x='43.4' y='6.4' xlink:href='#a' />
<use width='13.6' height='21.8' x='29.4' y='.1' xlink:href='#l' />
<use width='9.8' height='21.9' x='20.6' xlink:href='#d' />
<use width='19.2' height='19.9' y='1.4' xlink:href='#m' />
</symbol>
</defs>
<use fill='#161616' width='126' height='90' x='0' y='0' href='#n' />
</svg>

Before

Width:  |  Height:  |  Size: 5.8 KiB

View file

@ -1,112 +0,0 @@
@font-face {
font-family: "Marianne";
src: url("marianne-regular.ttf");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "Marianne";
src: url("marianne-bold.ttf");
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: "Marianne";
src: url("marianne-thin.ttf");
font-weight: 100; // weasy print n"accepte pas lighter
font-style: normal;
}
@page {
size: A4;
margin: 17mm 17mm 34mm; // add margin at the bottom to add address
@bottom-center {
font-size: 8pt;
content: counter(page) " / " counter(pages);
margin-top: 17mm;
}
@bottom-left {
content: element(footer);
}
}
#attestation {
@media screen {
max-width: 21cm;
padding: 17mm;
margin: 0 auto;
}
font-family: Marianne;
.header {
display: flex;
justify-content: space-between;
}
.right {
text-align: right;
}
.bloc-marque {
margin-bottom: 14mm;
}
.marianne {
height: 4.25mm;
margin-bottom: 1mm;
}
.intitule {
font-size: 12pt;
font-weight: bold;
margin: 0 0 1mm;
}
.devise {
height: 8.5mm;
margin: 0;
}
.issuer {
font-size: 10pt;
margin: 0 0 14mm; // pas sur, pour mettre une marge si issuer plus bas que date
}
.direction {
font-size: 12pt;
font-weight: bold;
margin: 0 0 23.3mm;
}
.date {
font-size: 8pt;
margin: 0 0 14mm;
}
.title {
font-size: 12pt;
font-weight: bold;
text-align: center;
margin: 0 0 12.6mm;
}
.main {
font-size: 10pt;
}
.notice {
font-size: 10pt;
font-style: italic;
}
.footer {
position: running(footer);
font-size: 7pt;
font-weight: 100;
}
}

View file

@ -1,16 +0,0 @@
#attestation-edit {
.mention {
border: 1px solid var(--text-default-grey);
padding: 8px;
}
.selected {
border: 1px solid #000000;
}
.tiptap {
padding: 8px;
min-height: 300px;
}
}

View file

@ -7,6 +7,7 @@
}
.autosave-explanation {
color: $dark-grey;
margin-left: 4px;
}

View file

@ -174,27 +174,6 @@
}
}
[data-fr-theme="dark"] .dropdown-content {
border: none;
background: var(--background-action-low-blue-france);
}
[data-fr-theme="dark"] .dropdown-items {
li {
&:not(.inactive) {
&:hover,
&.selected {
background: var(--background-action-low-blue-france-hover);
}
}
&.form-inside {
background-color: var(--background-action-low-blue-france);
}
}
}
.dropdown-content {
border: 1px solid $border-grey;
background: #FFFFFF;
@ -247,6 +226,7 @@ ul.dropdown-items {
li {
display: flex;
padding: $default-padding;
color: $dark-grey;
border-bottom: 1px solid $border-grey;
font-size: 12px;
min-width: 300px;
@ -313,6 +293,7 @@ ul.dropdown-items {
h4 {
font-size: 14px;
color: $black;
margin-bottom: $default-spacer;
}

View file

@ -1,12 +1,6 @@
@import "colors";
@import "constants";
[data-fr-theme="dark"] .card {
background: none;
border: 1px solid var(--background-action-low-blue-france);
}
.card {
padding: ($default-spacer * 3) ($default-spacer * 2);
border: 1px solid $border-grey;
@ -14,6 +8,7 @@
background: #FFFFFF;
.card-title {
color: $black;
font-weight: bold;
font-size: 20px;
line-height: 1.5rem;

View file

@ -3,11 +3,6 @@
$dossier-actions-bar-border-width: 1px;
[data-fr-theme="dark"] .dossier-edit .dossier-edit-sticky-footer {
background-color: var(--background-action-low-blue-france);
border: none;
}
.dossier-header {
.fr-container {
padding-bottom: $default-padding;

View file

@ -4,18 +4,21 @@
.dossier-container {
.sub-header {
h1 {
color: $black;
font-size: 22px;
margin-bottom: 0;
}
h2 {
color: $dark-grey;
font-weight: bold;
}
.header-actions {
margin-bottom: $default-spacer;
display: flex;
justify-content: flex-end;
column-gap: $default-spacer * 2;
}
}
@ -51,26 +54,3 @@
}
}
}
@media (min-width: 48em) {
.dossier-container {
.header-actions {
flex-direction: row;
justify-content: flex-end;
gap: 0 $default-spacer * 2;
}
}
}
@media (max-width: 48em) {
.dossier-container .header-actions {
flex-direction: column;
justify-content: stretch;
gap: $default-spacer * 2 0;
.dropdown-button {
min-width: 100%;
white-space: normal;
}
}
}

View file

@ -10,6 +10,15 @@ ol.fr-ol-content--override {
}
}
// override default transparent background on inputs & font-size to 16px by default
input,
textarea,
select,
// FIXME when DSFR is DONE
.form-ds-fr-white .fr-input {
background: $white;
font-size: 1em;
}
// with Marianne font, weight of font is less bolder, so bold it up
.button.primary {
@ -20,33 +29,6 @@ trix-editor.fr-input {
max-height: none;
}
.fr-label + .fr-ds-combobox { // same as .fr-label + .fr-input
margin-top: 0.5rem;
}
.fr-ds-combobox {
.fr-menu {
width: 100%;
.fr-menu__list {
width: 100%;
}
}
}
@media (max-width: 62em) {
.fr-ds-combobox .fr-menu .fr-menu__list {
z-index: calc(var(--ground) + 1000);
background-color: var(--background-default-grey);
--idle: transparent;
--hover: var(--background-overlap-grey-hover);
--active: var(--background-overlap-grey-active);
filter: drop-shadow(var(--overlap-shadow));
box-shadow: inset 0 1px 0 0 var(--border-open-blue-france);
}
}
// Fix firefox < 80, Safari < 15.4, Chrome < 83 not supporting "appearance: auto" on inputs
// This rule was set by DSFR for DSFR design, but broke our legacy forms.
// scss-lint:disable DuplicateProperty
@ -138,25 +120,3 @@ button.fr-tag-bug {
align-items: flex-end;
}
}
// improve readability in Windows High Contrast Mode
@media screen and (forced-colors: active) {
.fr-input,
.fr-select,
.fr-btn {
border: 2px solid var(--border-action-high-grey);
}
.fr-radio-group input[type="radio"] {
opacity: 1;
}
.fr-tabs__tab[aria-selected=true]:not(:disabled) {
border: 5px solid var(--border-action-high-grey);
}
.fr-tabs__tab {
border: 2px solid var(--border-action-high-grey);
}
}

View file

@ -252,7 +252,7 @@
}
}
input[type=text]:not(.fr-input):not(.fr-select) {
input[type=text]:not([data-address='true']) {
border: solid 1px $border-grey;
padding: $default-padding;
@ -293,7 +293,7 @@
input[type=number],
input[type=datetime-local],
textarea,
input[type=tel] {
input[type=tel], {
@media (max-width: $two-columns-breakpoint) {
width: 100%;
}
@ -386,6 +386,7 @@
[data-reach-combobox-token] button {
border: solid 1px $border-grey;
color: $black;
border-radius: 4px;
padding: $default-spacer;
margin-right: $default-spacer;
@ -448,6 +449,22 @@
margin-bottom: $default-padding;
}
.explication-libelle {
font-weight: bold;
font-size: 20px;
margin-bottom: $default-padding;
}
.explication {
margin-bottom: $default-fields-spacer;
padding: $default-spacer;
background-color: $light-grey;
p:not(:last-child) {
margin-bottom: $default-padding;
}
}
.send-wrapper {
display: flex;
width: 100%;
@ -521,17 +538,6 @@
}
}
.type-de-champ-expression-reguliere {
display: flex;
align-items: center;
&:before,
&:after {
font-weight: bold;
content: "/";
}
}
[data-react-component-value^="ComboMultiple"] {
margin-bottom: $default-fields-spacer;
@ -606,15 +612,6 @@
outline-color: $light-blue;
}
[data-fr-theme="dark"] [data-reach-combobox-popover] {
border: none;
background: var(--background-action-low-blue-france);
}
[data-fr-theme="dark"] [data-reach-combobox-option]:hover {
background: var(--background-action-low-blue-france-hover);
}
[data-reach-combobox-popover] {
z-index: 20;
}
@ -631,32 +628,14 @@ textarea::placeholder {
color: $dark-grey;
}
@media (max-width: 62em) {
.padded-fixed-footer {
padding-top: 120px;
}
}
@media (min-width: 62em) {
.padded-fixed-footer {
padding-top: 60px;
}
}
[data-fr-theme="dark"] .fixed-footer {
border-top: 2px solid var(--background-action-low-blue-france-hover);
background-color: var(--background-action-low-blue-france);
}
.fixed-footer {
.sticky-action-footer {
border-top: 2px solid $blue-france-500;
position: fixed;
position: sticky;
// scss-lint:disable VendorPrefix
position: -webkit-sticky; // This is needed on Safari (tested on 12.1)
// scss-lint:enable VendorPrefix
bottom: 0;
left: 0;
right: 0;
padding-top: $default-padding;
padding: $default-padding 0;
background-color: $white;
z-index: 2;
}

View file

@ -8,7 +8,7 @@
}
.help-dropdown-title {
font-weight: bold;
color: $blue-france-500;
}
.dropdown-items li.help-dropdown-service {

View file

@ -170,6 +170,10 @@
background-image: image-url("icons/trash.svg");
}
&.move-handle {
background-image: image-url("icons/move-handle.svg");
}
&.mandatory {
width: 10px;
}

View file

@ -3,6 +3,10 @@
@import "mixins";
@import "placeholders";
.landing-panel {
@include vertical-padding(60px);
}
$landing-breakpoint: 1040px;
.hero-wrapper {
@ -23,6 +27,16 @@ $landing-breakpoint: 1040px;
}
}
.hero-tagline {
margin-bottom: 0px;
}
.hero-tagline-em {
color: $blue-france-500;
font-style: normal;
font-weight: bold;
}
.hero-illustration {
max-width: 500px;
@ -60,6 +74,7 @@ $landing-breakpoint: 1040px;
}
.feature-text {
color: #FFFFFF;
font-size: 20px;
text-align: center;
}
@ -124,7 +139,17 @@ $landing-breakpoint: 1040px;
font-weight: bold;
}
.usagers-panel,
.numbers-panel,
.cta-panel-2 {
background-color: var(--background-alt-blue-france);
}
.landing {
.more-info {
background-color: #FFFFFF;
}
.numbers {
@extend %horizontal-list;
@ -204,6 +229,15 @@ $users-breakpoint: 950px;
height: 180px;
}
.cta-panel {
background-color: $blue-france-500;
color: #FFFFFF;
.fr-btn {
box-shadow: inset 0 0 0 1px var(--text-inverted-blue-france);
}
}
.role-panel-wrapper {
width: 100%;
display: flex;
@ -240,6 +274,25 @@ $users-breakpoint: 950px;
}
}
.cta-panel-title {
font-size: 24px;
font-weight: bold;
margin-top: 13px;
color: #FFFFFF;
&.grey {
color: $g700;
}
}
.cta-panel-explanation {
font-size: 22px;
margin-bottom: 10px;
&.grey {
color: $g700;
}
}
.role-administrations-image {
text-align: right;

View file

@ -3,9 +3,10 @@
@import "placeholders";
.two-columns {
background-color: $white;
@media (min-width: $two-columns-breakpoint) {
background: linear-gradient(to right, transparent 0%, transparent 50%, var(--background-alt-blue-france) 50%, var(--background-alt-blue-france) 100%);
background: linear-gradient(to right, #FFFFFF 0%, #FFFFFF 50%, $light-grey 50%, $light-grey 100%);
}
.columns-container { // TODO: https://github.com/betagouv/demarches-simplifiees.fr/issues/7882, once implemented, we won't need container anymore

View file

@ -23,6 +23,7 @@
.form [data-reach-combobox-token] button {
border: solid 1px #CCCCCC;
background-color: transparent;
color: #333333;
border-radius: 4px;
padding: 8px;
margin-right: 8px;

View file

@ -1,64 +0,0 @@
@import "colors";
$dep-nothing: #E3E3FD; // blue-france-925
$dep-small: #CACAFB; // blue-france-850
$dep-medium: #8585F6; // blue-france-625
$dep-large: #313178; // blue-france-200
$dep-xlarge: #272747; // blue-france-125
#map-svg {
max-width: 100%;
height: auto;
}
#map-infos {
min-width: 328px;
}
.departement.nothing {
fill: $dep-nothing;
}
.departement.small {
fill: $dep-small;
}
.departement.medium {
fill: $dep-medium;
}
.departement.large {
fill: $dep-large;
}
.departement.xlarge {
fill: $dep-xlarge;
}
.legends {
.legend {
width: 60px;
height: 10px;
display: inline-block;
}
.nothing {
background-color: $dep-nothing;
}
.small {
background-color: $dep-small;
}
.medium {
background-color: $dep-medium;
}
.large {
background-color: $dep-large;
}
.xlarge {
background-color: $dep-xlarge;
}
}

View file

@ -1,6 +1,7 @@
@import "colors";
.menu-component-header {
color: $dark-grey;
font-size: 12px;
a {

View file

@ -1,21 +1,12 @@
@import "colors";
@import "constants";
[data-fr-theme="dark"] .message {
background: var(--background-action-low-blue-france);
&.inverted-background {
background: var(--background-action-low-blue-france);
}
}
.message {
display: flex;
align-items: flex-start;
margin-bottom: $default-padding;
padding: $default-padding;
background: $light-grey;
background: #FFFFFF;
border-radius: 3px;
&.inverted-background {

View file

@ -5,6 +5,7 @@
max-height: 350px;
overflow-y: scroll;
border: 1px solid $border-grey;
background: $light-grey;
padding: 2 * $default-spacer;
margin-bottom: $default-spacer;
border-radius: 4px;

View file

@ -7,20 +7,3 @@ span.notifications {
border-radius: 4px;
background-color: $orange;
}
.fr-tabs__list span.notifications {
z-index: 2;
top: 5px;
right: 8px;
}
.fr-nav {
&__notifiable {
position: relative;
}
.notifications {
top: 1rem;
right: 0.25rem;
}
}

View file

@ -19,6 +19,7 @@
[data-reach-combobox-token] button {
border: solid 1px $border-grey;
color: $black;
margin-top: 0.5 * $default-padding;
margin-bottom: 0.5 * $default-padding;
margin-right: 0.5 * $default-padding;

View file

@ -4,6 +4,7 @@
.types-de-champ-editor {
> .types-de-champ-block {
padding-bottom: 50px;
padding-left: 0;
.types-de-champ-errors {
@ -25,9 +26,15 @@
box-shadow: 0px 2px 4px -4px;
}
.handle {
.handle.icon {
width: 32px;
height: 32px;
background-size: 32px;
margin-left: 7px;
margin-right: 16px;
align-self: center;
cursor: grab;
opacity: 0.8;
&:hover {
opacity: 0.4;
@ -69,6 +76,10 @@
display: none;
}
&.last .type-de-champ-add-button.root {
display: none;
}
.head {
select {
margin-bottom: 0px;
@ -114,6 +125,13 @@
}
}
.bottom-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
.buttons {
display: flex;
justify-content: space-between;

View file

@ -22,6 +22,7 @@
.procedure-form__column--form {
flex: 10;
padding: 0 $default-padding;
background-color: $light-grey;
input[type=file] {
background-color: transparent; // Remove white bg set by DSFR
@ -66,11 +67,6 @@
}
}
[data-fr-theme="dark"] .procedure-form__actions {
background: var(--background-action-low-blue-france);
border-top: 1px solid var(--background-action-low-blue-france-hover);
}
.procedure-form__actions {
display: flex;
padding: $default-spacer $default-padding;

View file

@ -49,6 +49,7 @@
.stats-legend {
font-size: 12px;
color: $dark-grey;
}
}

View file

@ -56,6 +56,7 @@
[data-reach-combobox-token] button {
border: solid 1px $border-grey;
color: $black;
margin: 0.25 * $default-padding;
border-radius: 2px;
padding: 0.25 * $default-padding;

View file

@ -0,0 +1,26 @@
@import "constants";
#sources-particulier-form {
h2 {
margin-bottom: 0;
}
h3 {
margin-top: 2 * $default-padding;
}
.explication {
padding: $default-padding;
ul {
list-style-type: circle;
list-style-position: inside;
padding-left: $default-padding;
margin-bottom: $default-padding;
}
}
.form input[type="checkbox"] {
margin-bottom: 0;
}
}

View file

@ -146,11 +146,10 @@ $big-number-card-padding: 2 * $segmented-control-item-border-radius;
.big-number-card-number {
display: block;
text-align: center;
font-size: 80px;
line-height: 1em;
font-size: 90px;
line-height: 90px;
font-weight: bold;
color: $blue-france-500;
white-space: nowrap;
}
.big-number-card-detail {

View file

@ -56,17 +56,6 @@
width: calc(100vw);
}
[data-fr-theme="dark"] .fr-table--bordered {
.table {
&.hoverable {
tbody tr:hover {
background-color: var(--background-action-low-blue-france);
}
}
}
}
.fr-table--bordered {
.table {
&.hoverable {

View file

@ -0,0 +1,57 @@
@import "colors";
@import "mixins";
.tabs {
ul {
margin-bottom: 0;
padding: 0;
}
li {
display: inline-block;
line-height: 36px;
position: relative;
text-align: center;
font-size: 14px;
border-radius: 3px 3px 0 0;
border: 1px solid transparent;
a {
display: block;
padding-left: 20px;
padding-right: 20px;
color: $black;
background-image: none;
}
&.active {
background-color: #FFFFFF;
border-top: 2px solid $blue-france-500;
border-left: 1px solid $border-grey;
border-right: 1px solid $border-grey;
a {
color: $blue-france-500;
}
.badge {
color: $blue-france-500;
}
}
&:hover {
a {
color: $blue-france-500;
}
.badge {
color: $blue-france-500;
}
}
.notifications {
top: 3px;
right: 3px;
}
}
}

View file

@ -2,8 +2,6 @@ class ApplicationComponent < ViewComponent::Base
include ViewComponent::Translatable
include FlipperHelper
delegate :rich_text_area_tag, to: :helpers
def current_user
controller.current_user
end

View file

@ -7,7 +7,7 @@
%li{ id: dom_id(attachment) }
= render Attachment::EditComponent.new(champ:, attached_file:, attachment:, index:, as_multiple: true, view_as:, user_can_destroy:, user_can_replace:, form_object_name:)
%div{ id: empty_component_id, class: class_names("hidden": !can_attach_next?), data: { turbo_force: :server } }
%div{ id: empty_component_id, class: class_names("hidden": !can_attach_next?) }
= render Attachment::EditComponent.new(champ:, attached_file:, attachment: nil, index: attachments_count, user_can_destroy:, user_can_replace:, form_object_name:)
// single poll and refresh message for all attachments

View file

@ -1,44 +0,0 @@
class Conditions::ChampsConditionsComponent < Conditions::ConditionsComponent
def initialize(tdc:, upper_tdcs:, procedure_id:)
@tdc, @condition, @source_tdcs = tdc, tdc.condition, upper_tdcs
@procedure_id = procedure_id
end
private
def logic_conditionnel_button
html_class = 'fr-btn fr-btn--tertiary fr-btn--sm'
if @condition.nil?
submit_tag(
t('.enable_conditionnel'),
formaction: add_condition_path,
class: html_class
)
else
submit_tag(
t('.disable_conditionnel'),
formmethod: 'delete',
formnovalidate: true,
data: { confirm: t('.disable_conditionnel_alert') },
class: html_class
)
end
end
def add_condition_path
add_row_admin_procedure_condition_path(@procedure_id, @tdc.stable_id)
end
def delete_condition_path(row_index)
delete_row_admin_procedure_condition_path(@procedure_id, @tdc.stable_id, row_index: row_index)
end
def input_id_for(name, row_index)
"#{@tdc.stable_id}-#{name}-#{row_index}"
end
def input_prefix
'type_de_champ[condition_form]'
end
end

View file

@ -1,28 +0,0 @@
class Conditions::RoutingRulesComponent < Conditions::ConditionsComponent
include Logic
def initialize(groupe_instructeur:)
@groupe_instructeur = groupe_instructeur
@condition = groupe_instructeur.routing_rule || empty_operator(empty, empty)
@procedure_id = groupe_instructeur.procedure_id
@source_tdcs = groupe_instructeur.procedure.active_revision.types_de_champ_public
end
private
def add_condition_path
add_row_admin_procedure_routing_rule_path(@procedure_id, @groupe_instructeur.id)
end
def delete_condition_path(row_index)
delete_row_admin_procedure_routing_rule_path(@procedure_id, @groupe_instructeur.id, row_index: row_index)
end
def input_id_for(name, row_index)
"#{@groupe_instructeur.id}-#{name}-#{row_index}"
end
def input_prefix
'groupe_instructeur[condition_form]'
end
end

View file

@ -1,6 +0,0 @@
---
fr:
display_if: Router si
select: Sélectionner
add_condition: Ajouter une règle de routage
remove_a_row: Supprimer la ligne

View file

@ -1,31 +0,0 @@
.flex.justify-start.section{ id: dom_id(@groupe_instructeur, :routing_rule) }
= form_tag admin_procedure_routing_rule_path(@procedure_id, @groupe_instructeur.id),
method: :patch,
data: { turbo: true, controller: 'autosave' },
class: 'form width-100' do
.conditionnel.mt-2.width-100
.flex
- if @groupe_instructeur.invalid_rule?
%p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm règle invalide
- elsif @groupe_instructeur.non_unique_rule?
%p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm règle déjà attribuée à #{@groupe_instructeur.groups_with_same_rule}
= render Conditions::ConditionsErrorsComponent.new(conditions: condition_per_row, source_tdcs: @source_tdcs)
%table.condition-table.mt-2
%thead
%tr
%th.far-left
%th.target Champ Cible
%th.operator Opérateur
%th.value Valeur
%th.delete-column
%tbody
- rows.each.with_index do |(targeted_champ, operator_name, value), row_index|
%tr
%td.far-left= far_left_tag(row_index)
%td.target= left_operand_tag(targeted_champ, row_index)
%td.operator= operator_tag(operator_name, targeted_champ, row_index)
%td.value= right_operand_tag(targeted_champ, value, row_index)
%td.delete-column= delete_condition_tag(row_index)
.flex.justify-end.mt-2= add_condition_tag

View file

@ -48,8 +48,6 @@
= render partial: "shared/champs/regions/show", locals: { champ: champ }
- when TypeDeChamp.type_champs.fetch(:rna)
= render partial: "shared/champs/rna/show", locals: { champ: champ, profile: @profile }
- when TypeDeChamp.type_champs.fetch(:rnf)
= render partial: "shared/champs/rnf/show", locals: { champ: champ, profile: @profile }
- when TypeDeChamp.type_champs.fetch(:epci)
= render partial: "shared/champs/epci/show", locals: { champ: champ }
- when TypeDeChamp.type_champs.fetch(:cojo)
@ -62,3 +60,4 @@
%p= helpers.number_with_html_delimiter(champ.to_s)
- else
= helpers.format_text_value(champ.to_s.strip) # format already wrap in p

View file

@ -12,18 +12,12 @@ class Dossiers::ErrorsFullMessagesComponent < ApplicationComponent
formated_errors = @errors.to_enum # ActiveModel::Errors.to_a is an alias to full_messages, we don't want that
.to_a # but enum.to_a gives back an array
.uniq { |error| [error.inner_error.base] } # dedup cumulated errors from dossier.champs, dossier.champs_public, dossier.champs_private which run the validator one time per association
.map { |error| to_error_descriptor(error) }
.map { |error| to_error_descriptor(error.message, error.inner_error.base) }
yield(Array(formated_errors[0..2]), Array(formated_errors[3..]))
end
def to_error_descriptor(error)
model = error.inner_error.base
if model.respond_to?(:libelle) # a Champ or something acting as a Champ
ErrorDescriptor.new("##{model.labelledby_id}", model.libelle.truncate(200), error.message)
else
ErrorDescriptor.new("##{model.model_name.singular}_#{error.attribute}", model.class.human_attribute_name(error.attribute), error.message)
end
def to_error_descriptor(str_error, model)
ErrorDescriptor.new("##{model.labelledby_id}", model.libelle.truncate(200), str_error)
end
def render?

View file

@ -17,7 +17,7 @@
- elsif commentaire.sent_by_system?
= sanitize(commentaire.body, scrubber: Sanitizers::MailScrubber.new)
- else
= render SimpleFormatComponent.new(commentaire.body, allow_a: false, allow_autolink: commentaire.sent_by_instructeur?)
= render SimpleFormatComponent.new(commentaire.body, allow_a: false)
.message-extras.flex.justify-start

View file

@ -1,28 +0,0 @@
# frozen_string_literal: true
class Dossiers::PendingCorrectionCheckboxComponent < ApplicationComponent
attr_reader :dossier
# Pass the editing fork origin, ie. dossier en construction holding the correction
def initialize(dossier:)
@dossier = dossier
end
def render?
return false unless dossier.procedure.sva_svr_enabled?
dossier.pending_correction?
end
def error? = dossier.errors.include?(:pending_correction)
def error_message
dossier.errors.generate_message(:pending_correction, :blank)
end
def check_box_aria_attributes
return unless error?
{ describedby: :dossier_pending_correction_error_messages }
end
end

View file

@ -1,3 +0,0 @@
---
en:
confirm_label: I certify that I have made all corrections requested by the administration.

View file

@ -1,3 +0,0 @@
---
fr:
confirm_label: Je certifie avoir effectué toutes les corrections demandées par ladministration.

View file

@ -1,10 +0,0 @@
.fr-checkbox-group.fr-my-3w{ class: class_names("fr-checkbox-group--error" => error?) }
= check_box_tag field_name(:dossier, :pending_correction), "1", false, form: "form-submit-en-construction", required: true, aria: check_box_aria_attributes
%label.fr-label{ for: :dossier_pending_correction }
= t('.confirm_label')
= render EditableChamp::AsteriskMandatoryComponent.new
- if error?
#dossier_pending_correction_error_messages.fr-messages-group{ aria: { live: "assertlive" } }
%p.fr-message.fr-message--error= error_message

View file

@ -1,2 +1,2 @@
= render Dsfr::ComboboxComponent.new form: @form, name: :value, url: data_sources_data_source_adresse_path, selected: @champ.value, id: @champ.input_id, class: 'fr-select', describedby: @champ.describedby_id, allows_custom_value: true do
= render Dsfr::ComboboxComponent.new form: @form, name: :value, url: data_sources_data_source_adresse_path, selected: @champ.value, id: @champ.input_id, class: 'fr-select', describedby: @champ.describedby_id do
= @form.hidden_field :external_id, data: { value_slot: 'value' }

View file

@ -1,3 +1,21 @@
class EditableChamp::CommunesComponent < EditableChamp::EditableChampBaseComponent
include ApplicationHelper
def dsfr_champ_container
:fieldset
end
private
def commune_options
@champ.communes.map { ["#{_1[:name]} (#{_1[:postal_code]})", _1[:code]] }
end
def code_postal_input_id
"#{@champ.input_id}-code_postal"
end
def commune_select_options
{ selected: @champ.selected }.merge(@champ.mandatory? ? { prompt: '' } : { include_blank: '' })
end
end

View file

@ -0,0 +1,5 @@
---
en:
postal_code: "Enter <strong>the postal code</strong>"
commune: "Select <strong>the municipality</strong> from the list"
not_found: No municipality found for postal code %{postal_code}. Please check that you haven't made any mistakes.

View file

@ -0,0 +1,5 @@
---
fr:
postal_code: "Renseignez le <strong>code postal</strong>"
commune: "Sélectionnez la commune dans la liste"
not_found: Aucune commune trouvée pour le code postal %{postal_code}. Verifiez que vous n'avez pas fait derreur.

View file

@ -1,2 +1,23 @@
= render Dsfr::ComboboxComponent.new form: @form, name: :external_id, url: data_sources_data_source_commune_path, selected: [@champ.to_s, @champ.selected], id: @champ.input_id, class: 'fr-select', describedby: @champ.describedby_id do
= @form.hidden_field :code_postal, data: { value_slot: 'data:string' }
.fr-fieldset__element.fr-mb-0
.fr-input-group
= @form.label :code_postal, t('.postal_code').html_safe, class: 'fr-label', for: code_postal_input_id
= @form.text_field :code_postal, required: @champ.required?, id: code_postal_input_id, class: "width-33-desktop width-100-mobile small-margin fr-input"
- if @champ.code_postal?
- if commune_options.empty?
.fr-error-text.mb-4= t('.not_found', postal_code: @champ.code_postal)
.fr-fieldset__element.fr-mb-0
- if commune_options.empty?
-# noop
- elsif commune_options.size <= 3
%fieldset.fr-fieldset
.fr-fieldset__legend--regular.fr-fieldset__legend= t('.commune').html_safe
- commune_options.each.with_index do |(option, value), index|
.fr-fieldset__element
.fr-radio-group
= @form.radio_button :value, value, checked: @champ.selected == value, id: "#{code_postal_input_id}-#{value.parameterize}"
= @form.label :value, option, for: "#{code_postal_input_id}-#{value.parameterize}", class: 'fr-label'
- else
= @form.label :value, t('.commune').html_safe, for: @champ.input_id, class: 'fr-label'
= @form.select :value, commune_options, commune_select_options, required: @champ.required?, id: @champ.input_id, aria: { describedby: @champ.describedby_id }, class: "width-33-desktop width-100-mobile fr-select"

View file

@ -1 +1 @@
= @form.text_field(:value, input_opts(id: @champ.input_id, aria: { describedby: @champ.describedby_id }, required: @champ.required?, pattern: "-?[0-9]+([\.,][0-9]{1,3})?", inputmode: :decimal, data: { controller: 'format', format: :decimal }))
= @form.text_field(:value, input_opts(id: @champ.input_id, aria: { describedby: @champ.describedby_id }, required: @champ.required?, pattern: "-?[0-9]+([\.,][0-9]{1,3})?", inputmode: :decimal, data: { controller: 'format decimal-number-input', format: :decimal }))

View file

@ -1,8 +1,4 @@
class EditableChamp::DropDownListComponent < EditableChamp::EditableChampBaseComponent
def render?
@champ.options?
end
def select_class_names
class_names('width-100': contains_long_option?, 'fr-select': true)
end
@ -15,12 +11,8 @@ class EditableChamp::DropDownListComponent < EditableChamp::EditableChampBaseCom
@champ.render_as_radios? ? :fieldset : :div
end
def other_element_class_names
class_names("fr-fieldset__element" => dsfr_champ_container == :fieldset)
end
def contains_long_option?
max_length = 100
@champ.enabled_non_empty_options.any? { _1.size > max_length }
@champ.options.any? { _1.size > max_length }
end
end

View file

@ -1,33 +1,33 @@
- if @champ.render_as_radios?
.fr-fieldset__content
- @champ.enabled_non_empty_options.each_with_index do |option, index|
.fr-radio-group
= @form.radio_button :value, option, id: "#{@champ.id}_radio_option_#{index}"
%label.fr-label{ for: "#{@champ.id}_radio_option_#{index}" }
= option
- if @champ.options?
- if @champ.render_as_radios?
.fr-fieldset__content
- @champ.enabled_non_empty_options.each_with_index do |option, index|
.fr-radio-group
= @form.radio_button :value, option, id: "#{@champ.id}_radio_option_#{index}"
%label.fr-label{ for: "#{@champ.id}_radio_option_#{index}" }
= option
- if !@champ.mandatory?
.fr-radio-group
= @form.radio_button :value, '', checked: @champ.value.blank? && !@champ.other?, id: "#{@champ.id}_radio_option_blank"
%label.fr-label{ for: "#{@champ.id}_radio_option_blank" }
Non renseigné
- if !@champ.mandatory?
.fr-radio-group
= @form.radio_button :value, '', checked: @champ.value.blank? && !@champ.other?, id: "#{@champ.id}_radio_option_blank"
%label.fr-label{ for: "#{@champ.id}_radio_option_blank" }
Non renseigné
- if @champ.drop_down_other?
.fr-radio-group
= @form.radio_button :value, Champs::DropDownListChamp::OTHER, checked: @champ.other?, id: "#{@champ.id}_radio_option_other"
%label.fr-label{ for: "#{@champ.id}_radio_option_other" }
= t('shared.champs.drop_down_list.other')
- elsif @champ.render_as_combobox?
= render Dsfr::ComboboxComponent.new form: @form, name: :value, options: @champ.enabled_non_empty_options(other: true), selected: @champ.selected, id: @champ.input_id, class: select_class_names, describedby: @champ.describedby_id
- else
= @form.select :value,
@champ.enabled_non_empty_options(other: true),
{ selected: @champ.selected, include_blank: true },
required: @champ.required?,
id: @champ.input_id,
class: select_class_names,
aria: { describedby: @champ.describedby_id }
- if @champ.drop_down_other?
.fr-radio-group
= @form.radio_button :value, Champs::DropDownListChamp::OTHER, checked: @champ.other?, id: "#{@champ.id}_radio_option_other"
%label.fr-label{ for: "#{@champ.id}_radio_option_other" }
Autre
- elsif @champ.render_as_combobox?
= render Dsfr::ComboboxComponent.new form: @form, name: :value, options: @champ.enabled_non_empty_options, selected: @champ.selected, id: @champ.input_id, class: select_class_names, describedby: @champ.describedby_id
- else
= @form.select :value,
@champ.options.compact_blank,
{ selected: @champ.selected, include_blank: true },
required: @champ.required?,
id: @champ.input_id,
class: select_class_names,
aria: { describedby: @champ.describedby_id }
- if @champ.drop_down_other?
%div{ class: other_element_class_names }
- if @champ.drop_down_other?
= render EditableChamp::DropDownOtherInputComponent.new(form: @form, champ: @champ)

View file

@ -1,2 +0,0 @@
class EditableChamp::EngagementJuridiqueComponent < EditableChamp::EditableChampBaseComponent
end

View file

@ -1 +0,0 @@
= @form.text_field(:value, input_opts(id: @champ.input_id, required: @champ.required?, aria: { describedby: @champ.describedby_id }))

View file

@ -8,7 +8,7 @@ class EditableChamp::EpciComponent < EditableChamp::EditableChampBaseComponent
private
def departement_options
APIGeoService.departements.filter(&method(:departement_with_epci?)).map { ["#{_1[:code]} #{_1[:name]}", _1[:code]] }
APIGeoService.departements.filter { _1[:code] != '99' }.map { ["#{_1[:code]} #{_1[:name]}", _1[:code]] }
end
def epci_options
@ -26,9 +26,4 @@ class EditableChamp::EpciComponent < EditableChamp::EditableChampBaseComponent
def epci_select_options
{ selected: @champ.code }.merge(@champ.mandatory? ? { prompt: '' } : { include_blank: '' })
end
def departement_with_epci?(departement)
code = departement[:code]
!code.start_with?('98') && !code.in?(['99', '975', '977', '978'])
end
end

View file

@ -1,5 +0,0 @@
class EditableChamp::ExpressionReguliereComponent < EditableChamp::EditableChampBaseComponent
def dsfr_input_classname
'fr-input'
end
end

View file

@ -1 +0,0 @@
= @form.text_field(:value, input_opts(id: @champ.input_id, placeholder: @champ.expression_reguliere_exemple_text, required: @champ.required?, aria: { describedby: @champ.describedby_id }))

View file

@ -1,5 +1,5 @@
%fieldset
%legend.fr-h5{ legend_params }= @champ.libelle
%legend.header-subsection{ legend_params }= @champ.libelle
- if @champ.description.present?
.notice{ notice_params }= render SimpleFormatComponent.new(@champ.description, allow_a: true)

View file

@ -1,2 +0,0 @@
class EditableChamp::RNFComponent < EditableChamp::EditableChampBaseComponent
end

View file

@ -1,5 +0,0 @@
---
en:
rnf_info_error: No foundation found
rnf_info_pending: RNF verification pending
rnf_info_success: "This RNF matches %{title}"

View file

@ -1,5 +0,0 @@
---
fr:
rnf_info_error: Aucune fondation trouvée
rnf_info_pending: Vérification du RNF en cours
rnf_info_success: "Ce RNF correspond à %{title}"

View file

@ -1,9 +0,0 @@
= @form.text_field :external_id, required: @champ.required?, class: "width-33-desktop fr-input small-margin", id: @champ.input_id
.rnf-info{ id: dom_id(@champ, :rnf_info) }
- if @champ.fetch_external_data_error?
%p.fr-error-text= t('.rnf_info_error')
- elsif @champ.fetch_external_data_pending?
%p.fr-info-text= t('.rnf_info_pending')
- elsif @champ.data?
%p.fr-info-text= t('.rnf_info_success', title: @champ.title)

View file

@ -1,5 +0,0 @@
class GroupeGestionnaire::Card::ChildrenComponent < ApplicationComponent
def initialize(groupe_gestionnaire:)
@groupe_gestionnaire = groupe_gestionnaire
end
end

View file

@ -1,5 +0,0 @@
---
fr:
title:
one: Groupe enfants
other: Groupes enfants

View file

@ -1,10 +0,0 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to gestionnaire_groupe_gestionnaire_children_path(@groupe_gestionnaire), id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div
.line-count.fr-my-1w
%p.fr-tag= @groupe_gestionnaire.children.size
%h3.fr-h6
= t('.title', count: @groupe_gestionnaire.children.size)
%p.fr-btn.fr-btn--tertiary= t('views.shared.actions.edit')

View file

@ -1,10 +1,13 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to gestionnaire_groupe_gestionnaire_gestionnaires_path(@groupe_gestionnaire), id: 'gestionnaires', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
%div
.line-count.fr-my-1w
%p.fr-tag= @groupe_gestionnaire.gestionnaires.size
%h3.fr-h6
= t('.title', count: @groupe_gestionnaire.gestionnaires.size)
%p.fr-tile-subtitle Gestion de la démarche
%p.fr-btn.fr-btn--tertiary= t('views.shared.actions.edit')

View file

@ -1,16 +0,0 @@
class GroupeGestionnaire::GroupeGestionnaireChildren::ChildComponent < ApplicationComponent
include ApplicationHelper
def initialize(groupe_gestionnaire:, child:)
@groupe_gestionnaire = groupe_gestionnaire
@child = child
end
def name
@child.name
end
def created_at
try_format_datetime(@child.created_at)
end
end

View file

@ -1,4 +0,0 @@
%tr{ id: dom_id(@child) }
%td
= link_to name, gestionnaire_groupe_gestionnaire_path(@child)
%td= created_at

View file

@ -1,24 +0,0 @@
# frozen_string_literal: true
class MainNavigation::AnnouncesLinkComponent < ApplicationComponent
def render?
# also see app/controllers/release_notes_controller.rb#ensure_access_allowed!
return false if !helpers.instructeur_signed_in? && !helpers.administrateur_signed_in? && !helpers.expert_signed_in?
@most_recent_released_on = load_most_recent_released_on
@most_recent_released_on.present?
end
def something_new?
return true if current_user.announces_seen_at.nil?
@most_recent_released_on.after? current_user.announces_seen_at
end
def load_most_recent_released_on
categories = helpers.infer_default_announce_categories
ReleaseNote.most_recent_announce_date_for_categories(categories)
end
end

View file

@ -1,4 +0,0 @@
---
en:
news: News
something_new: New informations about the website may be of interest to you.

View file

@ -1,4 +0,0 @@
---
fr:
news: Nouveautés
something_new: De nouvelles informations à propos du site pourraient vous intéresser.

View file

@ -1,4 +0,0 @@
%li.fr-nav__item.fr-nav__notifiable
= link_to t('.news'), release_notes_path, class: "fr-nav__link",'aria-current': current_page?(release_notes_path) ? 'page' : nil
- if something_new?
%span.notifications{ 'aria-label': t('.something_new') }

View file

@ -1,26 +0,0 @@
# frozen_string_literal: true
class MainNavigation::InstructeurExpertNavigationComponent < ApplicationComponent
def instructeur?
helpers.instructeur_signed_in?
end
def expert?
helpers.expert_signed_in?
end
def aria_current_for(page)
{ current: page == current_page ? :page : nil }
end
private
def current_page
case controller_name
when 'avis'
:avis
when 'procedures', 'dossiers'
:procedure
end
end
end

View file

@ -1,14 +0,0 @@
%nav#header-navigation.fr-nav{ role: :navigation, "aria-label" => t('main_menu', scope: [:layouts, :header]) }
%ul.fr-nav__list
- if instructeur?
%li.fr-nav__item
= link_to Procedure.model_name.human(count: 10), instructeur_procedures_path, class: 'fr-nav__link', aria: aria_current_for(:procedure)
- if expert?
%li.fr-nav__item
= link_to expert_all_avis_path, class: 'fr-nav__link', aria: aria_current_for(:avis) do
= Avis.model_name.human(count: 10)
- if helpers.current_expert.avis_summary[:unanswered] > 0
%span.badge.warning= helpers.current_expert.avis_summary[:unanswered]
= render MainNavigation::AnnouncesLinkComponent.new

View file

@ -1,7 +1,9 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to admin_procedure_administrateurs_path(@procedure), id: 'administrateurs', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
%div
.line-count.fr-my-1w
%p.fr-tag= @procedure.administrateurs.size

View file

@ -6,9 +6,13 @@
%span.icon.refuse
%p.fr-tile-status-error À modifier
- elsif @count == 0
%p.fr-badge.fr-badge--info À configurer
%div
%span.icon.clock
%p.fr-tile-status-todo À configurer
- else
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
%div
.line-count.fr-my-1w
%p.fr-tag= @count

View file

@ -2,9 +2,13 @@
= link_to jeton_admin_procedure_path(@procedure), class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
- if @procedure.api_entreprise_token.present?
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
- else
%p.fr-badge.fr-badge--info À configurer
%div
%span.icon.clock
%p.fr-tile-status-todo À configurer
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Configurer le jeton API entreprise

View file

@ -2,9 +2,13 @@
= link_to admin_procedure_api_particulier_path(@procedure), class: 'fr-tile fr-enlarge-link', id: 'api-particulier' do
.fr-tile__body.flex.column.align-center.justify-between
- if @procedure.api_particulier_token.present?
%p.fr-badge.fr-badge--success= t('.ready')
%div
%span.icon.accept
%p.fr-tile-status-accept= t('.ready')
- else
%p.fr-badge.fr-badge--info= t('.needs_configuration')
%div
%span.icon.clock
%p.fr-tile-status-todo= t('.needs_configuration')
%div
%h3.fr-h6.fr-mt-10v= Procedure.human_attribute_name(:api_particulier_token)
%p.fr-tile-subtitle= t('.configure_api_particulier_token')

View file

@ -4,11 +4,15 @@
- if @procedure.attestation_template&.activated?
%div
- if error_messages.present?
%p.fr-badge.fr-badge--warning À modifier
%span.icon.refuse
%p.fr-tile-status-error À modifier
- else
%p.fr-badge.fr-badge--success Activée
%span.icon.accept
%p.fr-tile-status-accept Activée
- else
%p.fr-badge Désactivée
%div
%span.icon.clock
%p.fr-tile-status-todo Désactivée
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Délivrance automatique pour les dossiers acceptés

View file

@ -6,9 +6,13 @@
%span.icon.refuse
%p.fr-tile-status-error À modifier
- elsif @count == 0
%p.fr-badge.fr-badge--warning À faire
%div
%span.icon.clock
%p.fr-tile-status-todo À faire
- else
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
%div
.line-count.fr-my-1w
%p.fr-tag= @count

View file

@ -1,13 +0,0 @@
class Procedure::Card::ChorusComponent < ApplicationComponent
def initialize(procedure:)
@procedure = procedure
end
def render?
@procedure.chorusable?
end
def complete?
@procedure.chorus_configuration.complete?
end
end

View file

@ -1,12 +0,0 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3.chorus-component
= link_to edit_admin_procedure_chorus_path(@procedure), class: 'fr-tile fr-enlarge-link', title: 'Configurer le cadre budgetaire Chorus' do
.fr-tile__body.flex.column.align-center.justify-between
- if !@procedure.chorus_configuration.complete?
%p.fr-badge.fr-badge--warning À compléter
- else
%p.fr-badge.fr-badge--success Configuré
%div
%h3.fr-h6.fr-mt-10v
Connecteur Chorus
%p.fr-tile-subtitle Vous traitez des données de subvention d'état ?
%p.fr-btn.fr-btn--tertiary Configurer

View file

@ -2,9 +2,13 @@
= link_to edit_admin_procedure_dossier_submitted_message_path(@procedure), class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
- if @procedure.active_dossier_submitted_message.present?
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
- else
%p.fr-badge.fr-badge--info À configurer
%div
%span.icon.clock
%p.fr-tile-status-todo À configurer
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Orienter l'usager suite à l'envoi de son dossier

View file

@ -1,5 +1,5 @@
class Procedure::Card::EmailsComponent < ApplicationComponent
CUSTOMIZABLE_COUNT = 6
CUSTOMIZABLE_COUNT = 5
def initialize(procedure:)
@procedure = procedure
@ -31,8 +31,7 @@ class Procedure::Card::EmailsComponent < ApplicationComponent
@procedure.received_mail,
@procedure.closed_mail,
@procedure.refused_mail,
@procedure.without_continuation_mail,
@procedure.re_instructed_mail
@procedure.without_continuation_mail
].map { |mail| mail&.updated_at }.compact.size
end
end

View file

@ -3,11 +3,14 @@
.fr-tile__body.flex.column.align-center.justify-between
%div
- if error_messages.present?
%p.fr-badge.fr-badge--warning À modifier
%span.icon.refuse
%p.fr-tile-status-error À modifier
- elsif fully_customized?
%p.fr-badge.fr-badge--success Validé
%span.icon.accept
%p.fr-tile-status-todo Validé
- else
%p.fr-badge.fr-badge--info À configurer
%span.icon.clock
%p.fr-tile-status-todo À configurer
%div
.line-count.fr-my-1w
%p.fr-tag= customized_progress

View file

@ -1,7 +1,9 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to admin_procedure_experts_path(@procedure), class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--info À configurer
%div
%span.icon.preview
%p.fr-tile-status-todo À configurer
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Gérer les avis des experts invités

View file

@ -2,9 +2,13 @@
= link_to admin_procedure_groupe_instructeurs_path(@procedure), id: 'groupe-instructeurs', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
- if @procedure.routing_enabled? || @procedure.instructeurs.present?
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
- else
%p.fr-badge.fr-badge--warning À faire
%div
%span.icon.clock
%p.fr-tile-status-todo À faire
%div
.line-count.fr-my-1w
- if @procedure.routing_enabled?

View file

@ -1,11 +1,12 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to modifications_admin_procedure_path(@procedure), id: 'modifications', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Activée
%div
.line-count.fr-my-1w
%span.icon.accept
%p.fr-tile-status-accept Activée
%div
%h3.fr-h6.fr-mt-10v
%p.fr-tag= @procedure.revisions_count
%h3.fr-h6
= t('.title', count: @procedure.revisions_count)
%p.fr-tile-subtitle Historique des modifications du formulaire

View file

@ -2,9 +2,13 @@
= link_to monavis_admin_procedure_path(@procedure), class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
- if @procedure.monavis_embed.present?
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
- else
%p.fr-badge.fr-badge--info À configurer
%div
%span.icon.clock
%p.fr-tile-status-todo À configurer
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Avis des usagers sur votre démarche

View file

@ -1,7 +1,9 @@
.fr-col-6.fr-col-md-4.fr-col-lg-3
= link_to edit_admin_procedure_path(@procedure), id: 'presentation', class: 'fr-tile fr-enlarge-link' do
.fr-tile__body.flex.column.align-center.justify-between
%p.fr-badge.fr-badge--success Validé
%div
%span.icon.accept
%p.fr-tile-status-accept Validé
%div
%h3.fr-h6.fr-mt-10v= t('.title')
%p.fr-tile-subtitle Logo, nom, description

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