tybo 0.0.11 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f46063c0e17703d488e7eeb91c63da9dcb5e8142af6e7603d44b74beb86a1ee6
4
- data.tar.gz: b1c060c22d7a4e950fb5dbef739023951de7e29117963a3fce51d38ef8a0eabc
3
+ metadata.gz: 2159c6fe429376273f6ba05ab4009d6714a61c09a2fe9d9ad5395c23ad679f69
4
+ data.tar.gz: fedf0c5fc19e0d446fa3ce7ba4d32d8bf6aaf82b64b6138a1fef740cf8bc8c48
5
5
  SHA512:
6
- metadata.gz: 735e1f16476a04f48bf01614a8ed7eaa211bfc88867574260a37f6300ba001aad9cdf429d58a9dc9e1d15ae20c3dd3489eb75382a26e6c0814db00ddc324be62
7
- data.tar.gz: 8c079b5a1172b5454853ed0059d255bb2d73233be948f792840c1b9e99edaffa2116d2b6169cf55264dd163c12d31ce32eb9242c1f4a1f60141200aaaa5d89f0
6
+ metadata.gz: 02e9964ddfc462d39f6f4b112bf255036fe5a6fd76e6a40cf88cefa407f5ab7349a7c9b5e5707a38a5daa627fb676cef6789f7ca7367182846351e47b5202ada
7
+ data.tar.gz: d3d971269635d970e6b1d692b3c5ee489eb948b074eb1c93d01c092d8faba236d6e06fcee2d92f5220ea29514fa3d45097f84552d3e9753a1696cfbb793f4764
data/README.md CHANGED
@@ -34,6 +34,18 @@ $ bundle exec rails g tybo_install
34
34
 
35
35
  ```
36
36
 
37
+ ## Policy
38
+ add your policy logic in ApplicationController eg:
39
+ ```
40
+ rescue_from ActionPolicy::Unauthorized, with: :not_authorized
41
+
42
+
43
+ def not_authorized
44
+ flash[:alert] = I18n.t('bo.unauthorized')
45
+ redirect_to(request.referrer || root_path)
46
+ end
47
+ ```
48
+
37
49
  ## Customize
38
50
 
39
51
  **Update images**: change `logo_url` and `cover_url` in `config/initializer/tybo.rb`
@@ -1,3 +1,3 @@
1
- <svg class="mr-3 flex-shrink-0 h-6 w-6 text-white" xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
1
+ <svg class="mr-3 flex-shrink-0 h-6 w-6 text-tybo" xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
2
2
  <path strokeLinecap="round" strokeLinejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
3
3
  </svg>
@@ -1,8 +1,8 @@
1
1
  <div class="flex min-h-full">
2
2
  <div class="flex flex-1 flex-col justify-center py-12 px-4 sm:px-6 lg:flex-none lg:px-20 xl:px-24">
3
- <%= render 'devise/shared/devise_errors' %>
4
3
  <div class="mx-auto w-full max-w-sm lg:w-96">
5
4
  <div>
5
+ <%= render('layouts/flash') %>
6
6
  <%= image_tag Tybo.configuration.logo_url, class: 'h-12 w-auto'%>
7
7
  <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900">Créer un nouveau mot de passe</h2>
8
8
  </div>
@@ -1,8 +1,8 @@
1
1
  <div class="flex min-h-full">
2
2
  <div class="flex flex-1 flex-col justify-center py-12 px-4 sm:px-6 lg:flex-none lg:px-20 xl:px-24">
3
- <%= render 'devise/shared/devise_errors' %>
4
3
  <div class="mx-auto w-full max-w-sm lg:w-96">
5
4
  <div>
5
+ <%= render('layouts/flash') %>
6
6
  <%= image_tag Tybo.configuration.logo_url, class: 'h-12 w-auto'%>
7
7
  <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900">Forgot your password?</h2>
8
8
  </div>
@@ -20,7 +20,7 @@
20
20
 
21
21
  </div>
22
22
  <div class="mt-5">
23
- <%= f.button :submit, "Send me reset password instructions", class: "flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2" %>
23
+ <%= f.button :submit, I18n.t("devise.passwords.new.send_me_reset_password_instructions"), class: "flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2" %>
24
24
  </div>
25
25
  <% end %>
26
26
  </div>
@@ -1,10 +1,9 @@
1
1
  <div class="flex min-h-full">
2
2
  <div class="flex flex-1 flex-col justify-center py-12 px-4 sm:px-6 lg:flex-none lg:px-20 xl:px-24">
3
3
  <div class="mx-auto w-full max-w-sm lg:w-96">
4
- <%= render 'devise/shared/devise_errors' %>
5
- <div>
4
+ <%= render('layouts/flash') %>
6
5
  <%= image_tag Tybo.configuration.logo_url, class: 'h-12 w-auto'%>
7
- <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900">Sign in to your account</h2>
6
+ <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900"><%=I18n.t("bo.devise.sign_in_as.#{resource_name}")%></h2>
8
7
  </div>
9
8
  <div class="mt-8">
10
9
  <div class="mt-6">
@@ -28,16 +27,18 @@
28
27
  <div class="flex items-center justify-between">
29
28
  <div class="flex items-center">
30
29
  <input id="remember_me" name="remember_me" type="checkbox" class="h-4 w-4 rounded border-gray-300 text-tybo-600 focus:ring-tybo-500">
31
- <label for="remember_me" class="ml-2 block text-sm text-gray-900">Remember me</label>
30
+ <label for="remember_me" class="ml-2 block text-sm text-gray-900"><%=I18n.t("activerecord.attributes.user.remember_me")%></label>
32
31
  </div>
33
32
 
34
33
  <div class="text-sm">
35
- <a href="<%= new_password_path(Administrator)%>" class="font-medium text-tybo-600 hover:text-tybo-500">Forgot your password?</a>
34
+ <a href="<%= new_password_path(Administrator)%>" class="font-medium text-tybo-600 hover:text-tybo-500">
35
+ <%=I18n.t("devise.passwords.new.forgot_your_password")%>
36
+ </a>
36
37
  </div>
37
38
  </div>
38
39
 
39
40
  <div class="mt-5">
40
- <%= f.button :submit, "Sign in", class: "flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2" %>
41
+ <%= f.button :submit, I18n.t("devise.sessions.new.sign_in"), class: "flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2" %>
41
42
  </div>
42
43
  <% end %>
43
44
  </div>
@@ -1,6 +1,6 @@
1
1
  <div class="space-y-1 mt-1">
2
2
  <%- if controller_name != 'sessions' %>
3
- <%= link_to "Log in", new_session_path(resource_name), class: "inline-flex w-full justify-center rounded-md border border-gray-300 bg-white py-2 px-4 text-sm font-medium text-gray-500 shadow-sm hover:bg-gray-50" %><br />
3
+ <%= link_to I18n.t('devise.sessions.new.sign_in'), new_session_path(resource_name), class: "inline-flex w-full justify-center rounded-md border border-gray-300 bg-white py-2 px-4 text-sm font-medium text-gray-500 shadow-sm hover:bg-gray-50" %><br />
4
4
  <% end %>
5
5
 
6
6
  <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
@@ -1,24 +1,24 @@
1
1
  <% flash.each do |key, errors| %>
2
- <div class="<%= classes_for_flash(key) %> m-5 p-5 rounded-md" data-controller="flash">
3
- <div class="flex">
4
- <div class="flex-shrink-0">
5
- <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
6
- <path fill-rule="evenodd" d="M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
7
- </svg>
8
- </div>
9
- <div class="ml-3">
10
- <p class="text-sm font-medium bold"><%= errors %></p>
11
- </div>
12
- <div class="ml-auto pl-3">
13
- <div class="-mx-1.5 -my-1.5">
14
- <button type="button" data-action="flash#dismiss" class="inline-flex rounded-md p-1.5 focus:outline-none focus:ring-2 focus:ring-offset-2">
15
- <span class="sr-only">Dismiss</span>
16
- <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
17
- <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"/>
18
- </svg>
19
- </button>
20
- </div>
2
+ <div class="rounded-md <%= classes_for_flash(key) %> p-4" data-controller="flash">
3
+ <div class="flex">
4
+ <div class="flex-shrink-0">
5
+ <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
6
+ <path fill-rule="evenodd" d="M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
7
+ </svg>
8
+ </div>
9
+ <div class="ml-3">
10
+ <%= errors %>
11
+ </div>
12
+ <div class="ml-auto pl-3">
13
+ <div class="-mx-1.5 -my-1.5">
14
+ <button type="button" data-action="flash#dismiss" class="inline-flex rounded-md p-1.5 focus:outline-none focus:ring-2 focus:ring-offset-2">
15
+ <span class="sr-only"><%= I18n.t('bo.flash.close')%></span>
16
+ <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
17
+ <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"/>
18
+ </svg>
19
+ </button>
21
20
  </div>
22
21
  </div>
23
22
  </div>
23
+ </div>
24
24
  <% end %>
@@ -1,14 +1,12 @@
1
1
  <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Tybo</title>
5
- <%= csrf_meta_tags %>
6
- <%= csp_meta_tag %>
7
- <%= stylesheet_link_tag "tybo", "data-turbo-track": "reload" %>
8
- </head>
9
- <body>
10
-
11
- <%= yield %>
12
-
13
- </body>
2
+ <html>
3
+ <head>
4
+ <title>Tybo</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+ <%= stylesheet_link_tag "tybo", "data-turbo-track": "reload" %>
8
+ </head>
9
+ <body>
10
+ <%= yield %>
11
+ </body>
14
12
  </html>
@@ -3,17 +3,15 @@
3
3
  <div class="mx-auto w-full max-w-sm lg:w-96">
4
4
  <div>
5
5
  <%= image_tag Tybo.configuration.logo_url, class: 'h-12 w-auto' %>
6
- <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900">Sign in to your account</h2>
7
6
  </div>
8
7
  <div class="mt-4">
9
8
  <% @resources.each do |resource| %>
10
9
  <a href="<%=send("new_#{resource.to_s}_session_path")%>" class="mt-2 flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2">
11
- Sign in as <%= I18n.t("bo.#{resource.to_s}.one")%>
10
+ <%=I18n.t("bo.devise.sign_in_as.#{resource.to_s}")%>
12
11
  </a>
13
12
  <% end %>
14
13
  </div>
15
14
  </div>
16
15
  </div>
17
- <div class="relative hidden w-0 flex-1 lg:block">
18
- <img class="absolute inset-0 h-full w-full object-cover" src="https://tymate.com/_next/image?url=https%3A%2F%2Fwww.datocms-assets.com%2F33962%2F1667561118-natif-dribbble-2.png%3Fw%3D1600&w=1920&q=75" alt="">
19
- </div>
16
+ <%= render(CoverComponent.new) %>
17
+
@@ -1,5 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ class TurboFailureApp < Devise::FailureApp
4
+ def respond
5
+ if request_format == :turbo_stream
6
+ redirect
7
+ else
8
+ super
9
+ end
10
+ end
11
+
12
+ def skip_format?
13
+ %w(html turbo_stream */*).include? request_format.to_s
14
+ end
15
+ end
16
+
3
17
  # Assuming you have not yet modified this file, each configuration option below
4
18
  # is set to its default value. Note that some are commented out while others
5
19
  # are not: uncommented lines are intended to protect your configuration from
@@ -14,7 +28,7 @@ Devise.setup do |config|
14
28
  # confirmation, reset password and unlock tokens in the database.
15
29
  # Devise will use the `secret_key_base` as its `secret_key`
16
30
  # by default. You can change it below and use your own secret key.
17
- # config.secret_key = 'f2db45f41dff5f5dcad76fa6760490bf0cd1a23391c3cd5485f9d0ec4f4dcb538091b1c481a78a24dea2ebef4db12895ed53c5493d09435c2dbe3c2af4417004'
31
+ # config.secret_key = '4bd5e06b48093101d6f137ef226bd5cca582610e9feb2809347eae388976f5efa778178fd94b7567ea13fd3c504d185db881d5f4aa9425781cb988d784639fd4'
18
32
 
19
33
  # ==> Controller configuration
20
34
  # Configure the parent class to the devise controllers.
@@ -28,7 +42,9 @@ Devise.setup do |config|
28
42
 
29
43
  # Configure the class responsible to send e-mails.
30
44
  # config.mailer = 'Devise::Mailer'
31
-
45
+ config.mailer_sender = ENV['MAIL_FROM']
46
+ # Configure the class responsible to send e-mails.
47
+ config.mailer = 'BoDeviseMailer'
32
48
  # Configure the parent class responsible to send e-mails.
33
49
  # config.parent_mailer = 'ActionMailer::Base'
34
50
 
@@ -126,7 +142,7 @@ Devise.setup do |config|
126
142
  config.stretches = Rails.env.test? ? 1 : 12
127
143
 
128
144
  # Set up a pepper to generate the hashed password.
129
- # config.pepper = '6d099d571921492a580c14dd259ec5c074f1eac78938689e00690b3c8fea2cb8062076445b07edf08c4ac7f7e3760a687624702b2faf9ccf03e60f38402e82ed'
145
+ # config.pepper = '4551e02c32a843da4a330d94e9427b4239f886a6adb77cdc03711ec57741a0f922aa56a2faeddcc11acb633846be7f9717860c11bf428ba9db1b10f91bb9b1b0'
130
146
 
131
147
  # Send a notification to the original email when the user's email is changed.
132
148
  # config.send_email_changed_notification = false
@@ -264,6 +280,7 @@ Devise.setup do |config|
264
280
  #
265
281
  # The "*/*" below is required to match Internet Explorer requests.
266
282
  # config.navigational_formats = ['*/*', :html]
283
+ config.navigational_formats = ['*/*', :html, :turbo_stream]
267
284
 
268
285
  # The default HTTP method used to sign out a resource. Default is :delete.
269
286
  config.sign_out_via = :delete
@@ -281,6 +298,9 @@ Devise.setup do |config|
281
298
  # manager.intercept_401 = false
282
299
  # manager.default_strategies(scope: :user).unshift :some_external_strategy
283
300
  # end
301
+ config.warden do |manager|
302
+ manager.failure_app = TurboFailureApp
303
+ end
284
304
 
285
305
  # ==> Mountable engine configurations
286
306
  # When using Devise inside an engine, let's call it `MyEngine`, and this engine
@@ -0,0 +1,145 @@
1
+ fr:
2
+ activerecord:
3
+ attributes:
4
+ user:
5
+ confirmation_sent_at: Date d'envoi de la confirmation
6
+ confirmation_token: Clé de confirmation du mot de passe
7
+ confirmed_at: Date de confirmation
8
+ created_at: Date d'enregistrement
9
+ current_password: Mot de passe actuel
10
+ current_sign_in_at: Date de la connexion actuelle
11
+ current_sign_in_ip: IP de la connexion actuelle
12
+ email: Email
13
+ encrypted_password: Mot de passe chiffré
14
+ failed_attempts: Tentatives échouées
15
+ last_sign_in_at: Date de la dernière connexion
16
+ last_sign_in_ip: IP de la dernière connexion
17
+ locked_at: Verrouillé à
18
+ password: Mot de passe
19
+ password_confirmation: Confirmation du mot de passe
20
+ remember_created_at: Mémorisé à
21
+ remember_me: Se souvenir de moi ?
22
+ reset_password_sent_at: Clé de réinitialisation créée à
23
+ reset_password_token: Clé de réinitialisation du mot de passe
24
+ sign_in_count: Nombre des connexions
25
+ unconfirmed_email: Email non confirmé
26
+ unlock_token: Clé de déverrouillage
27
+ updated_at: Date de mise à jour
28
+ models:
29
+ user: Utilisateur
30
+ devise:
31
+ confirmations:
32
+ confirmed: Votre compte a bien été confirmé.
33
+ new:
34
+ resend_confirmation_instructions: Renvoyer les instructions de confirmation
35
+ send_instructions: Vous allez recevoir sous quelques minutes un email comportant des instructions pour confirmer votre compte.
36
+ send_paranoid_instructions: Si votre email existe sur notre base de données, vous recevrez sous quelques minutes un message avec des instructions pour confirmer votre compte.
37
+ failure:
38
+ already_authenticated: Vous êtes déjà connecté(e).
39
+ inactive: Votre compte n’est pas encore activé.
40
+ invalid: "%{authentication_keys} ou mot de passe incorrect."
41
+ last_attempt: Il vous reste une chance avant que votre compte soit bloqué.
42
+ locked: Votre compte est verrouillé.
43
+ not_found_in_database: "%{authentication_keys} ou mot de passe incorrect."
44
+ timeout: Votre session est expirée, veuillez vous reconnecter pour continuer.
45
+ unauthenticated: Vous devez vous connecter ou vous enregistrer pour continuer.
46
+ unconfirmed: Vous devez confirmer votre compte par email.
47
+ mailer:
48
+ confirmation_instructions:
49
+ action: Confirmer mon email
50
+ greeting: Bienvenue %{recipient} !
51
+ instruction: 'Vous pouvez confirmer votre email grâce au lien ci-dessous :'
52
+ subject: Instructions de confirmation
53
+ email_changed:
54
+ greeting: Bonjour %{recipient} !
55
+ message: Nous vous contactons pour vous informer que votre email a été changé en %{email}.
56
+ message_unconfirmed: Nous vous contactons pour vous informer que votre email est en train d'être changé par %{email}.
57
+ subject: Email modifié
58
+ password_change:
59
+ greeting: Bonjour %{recipient} !
60
+ message: Nous vous contactons pour vous notifier que votre mot de passe a été modifié.
61
+ subject: Mot de passe modifié
62
+ reset_password_instructions:
63
+ action: Changer mon mot de passe
64
+ greeting: Bonjour %{recipient} !
65
+ instruction: 'Quelqu''un a demandé un lien pour changer votre mot de passe, le voici :'
66
+ instruction_2: Si vous n'avez pas émis cette demande, merci d'ignorer cet email.
67
+ instruction_3: Votre mot de passe ne changera pas tant que vous n'aurez pas cliqué sur ce lien et renseigné un nouveau mot de passe.
68
+ subject: Instructions pour changer le mot de passe
69
+ unlock_instructions:
70
+ action: Débloquer mon compte
71
+ greeting: Bonjour %{recipient} !
72
+ instruction: 'Suivez ce lien pour débloquer votre compte :'
73
+ message: Votre compte a été bloqué suite à un nombre d'essais de connexions manquées trop important.
74
+ subject: Instructions pour déverrouiller le compte
75
+ omniauth_callbacks:
76
+ failure: 'Nous ne pouvons pas vous authentifier depuis %{kind} pour la raison suivante : ''%{reason}''.'
77
+ success: Autorisé par votre compte %{kind}.
78
+ passwords:
79
+ edit:
80
+ change_my_password: Changer mon mot de passe
81
+ change_your_password: Changer votre mot de passe
82
+ confirm_new_password: Confirmez votre nouveau mot de passe
83
+ new_password: Nouveau mot de passe
84
+ new:
85
+ forgot_your_password: Mot de passe oublié ?
86
+ send_me_reset_password_instructions: Réinitialiser mon mot de passe
87
+ no_token: Vous ne pouvez pas accéder à cette page si vous n’y accédez pas depuis un email de réinitialisation de mot de passe. Si vous venez en effet d’un tel email, vérifiez que vous avez copié l’adresse URL en entier.
88
+ send_instructions: Vous allez recevoir sous quelques minutes un email vous indiquant comment réinitialiser votre mot de passe.
89
+ send_paranoid_instructions: Si votre email existe dans notre base de données, vous recevrez un lien vous permettant de récupérer votre mot de passe.
90
+ updated: Votre mot de passe a bien été modifié. Vous êtes maintenant connecté(e).
91
+ updated_not_active: Votre mot de passe a bien été modifié.
92
+ registrations:
93
+ destroyed: Au revoir ! Votre compte a bien été supprimé. Nous espérons vous revoir bientôt.
94
+ edit:
95
+ are_you_sure: Êtes-vous sûr ?
96
+ cancel_my_account: Supprimer mon compte
97
+ currently_waiting_confirmation_for_email: 'Confirmation en attente pour: %{email}'
98
+ leave_blank_if_you_don_t_want_to_change_it: laissez ce champ vide pour le laisser inchangé
99
+ title: Éditer %{resource}
100
+ unhappy: Pas content ?
101
+ update: Modifier
102
+ we_need_your_current_password_to_confirm_your_changes: nous avons besoin de votre mot de passe actuel pour valider ces modifications
103
+ new:
104
+ sign_up: Inscription
105
+ signed_up: Bienvenue ! Vous vous êtes bien enregistré(e).
106
+ signed_up_but_inactive: Vous vous êtes bien enregistré(e). Cependant, nous n’avons pas pu vous connecter car votre compte n’a pas encore été activé.
107
+ signed_up_but_locked: Vous vous êtes bien enregistré(e). Cependant, nous n’avons pas pu vous connecter car votre compte est verrouillé.
108
+ signed_up_but_unconfirmed: Un message avec un lien de confirmation vous a été envoyé par mail. Veuillez suivre ce lien pour activer votre compte.
109
+ update_needs_confirmation: Vous avez bien modifié votre compte, mais nous devons vérifier votre nouvelle adresse email. Veuillez consulter vos emails et cliquer sur le lien de confirmation pour confirmer votre nouvelle adresse.
110
+ updated: Votre compte a bien été modifié.
111
+ updated_but_not_signed_in: Votre compte a été mis à jour avec succès. Vous devez vous reconnecter car votre mot de passe a été modifié.
112
+ sessions:
113
+ already_signed_out: Déconnecté(e).
114
+ new:
115
+ sign_in: Connexion
116
+ signed_in: Connecté(e).
117
+ signed_out: Déconnecté(e).
118
+ shared:
119
+ links:
120
+ back: Retour
121
+ didn_t_receive_confirmation_instructions: Vous n'avez pas reçu l'email de confirmation ?
122
+ didn_t_receive_unlock_instructions: Vous n'avez pas reçu l'email de déblocage ?
123
+ forgot_your_password: Mot de passe oublié ?
124
+ sign_in: Connexion
125
+ sign_in_with_provider: Connexion avec %{provider}
126
+ sign_up: Inscription
127
+ minimum_password_length:
128
+ one: "(%{count} caractère au moins)"
129
+ other: "(%{count} caractères au moins)"
130
+ unlocks:
131
+ new:
132
+ resend_unlock_instructions: Renvoyer les instructions de déblocage
133
+ send_instructions: Vous allez recevoir sous quelques minutes un email comportant des instructions pour déverrouiller votre compte.
134
+ send_paranoid_instructions: Si votre email existe sur notre base de données, vous recevrez sous quelques minutes un message avec des instructions pour déverrouiller votre compte.
135
+ unlocked: Votre compte a bien été déverrouillé. Veuillez vous connecter.
136
+ errors:
137
+ messages:
138
+ already_confirmed: a déjà été confirmé(e)
139
+ confirmation_period_expired: doit être confirmé(e) en %{period}, veuillez en demander un(e) autre
140
+ expired: est expiré, veuillez en demander un autre
141
+ not_found: n’a pas été trouvé(e)
142
+ not_locked: n’était pas verrouillé(e)
143
+ not_saved:
144
+ one: 'une erreur a empêché ce (cet ou cette) %{resource} d’être enregistré(e) :'
145
+ other: "%{count} erreurs ont empêché ce (cet ou cette) %{resource} d’être enregistré(e) :"
@@ -19,6 +19,10 @@ class BoGenerator < Rails::Generators::NamedBase
19
19
  template '_search_bar.html.erb', File.join("app/views/#{options[:namespace]}", "#{plural_name}/_search_bar.html.erb")
20
20
  template 'show.html.erb', File.join("app/views/#{options[:namespace]}", "#{plural_name}/show.html.erb")
21
21
  template 'controller.rb', File.join("app/controllers/#{options[:namespace]}", "#{plural_name}_controller.rb")
22
+ template 'policy.rb', File.join("app/policies/bo/#{options[:namespace]}", "#{file_name.underscore}_policy.rb")
23
+ unless File.exists?("app/policies/bo/#{options[:namespace]}.rb")
24
+ template 'namespace_policy.rb', "app/policies/bo/#{options[:namespace]}_policy.rb"
25
+ end
22
26
  create_translations
23
27
  end
24
28
 
@@ -65,7 +69,7 @@ class BoGenerator < Rails::Generators::NamedBase
65
69
 
66
70
  def permited_params
67
71
  params = {}
68
- action_text_columns= has_one_assoc&.select {|a| a.name == :rich_text_content}
72
+ action_text_columns= has_one_assoc&.select {|a| a.options[:class_name] == 'ActionText::RichText'}
69
73
  model_columns&.map do |col|
70
74
  params["#{col}".to_sym] = nil
71
75
  end
@@ -76,8 +80,10 @@ class BoGenerator < Rails::Generators::NamedBase
76
80
  params["#{association.name.to_s.singularize}_ids".to_sym] = []
77
81
  end
78
82
  has_one_assoc&.map do |association|
79
- attributes = association.klass.column_names.map(&:to_sym).delete_if {|attr| excluded_columns.include?(attr)}
80
- params["#{association.name.to_s.singularize}_attributes".to_sym] = attributes
83
+ next if association.options[:class_name] == 'ActionText::RichText'
84
+
85
+ attributes = association.klass.column_names.map(&:to_sym).delete_if {|attr| excluded_columns.include?(attr)}
86
+ params["#{association.name.to_s.singularize}_attributes".to_sym] = attributes
81
87
  end
82
88
  params
83
89
  end
@@ -11,7 +11,10 @@
11
11
  <!-- has_one Associations -->
12
12
  <%- has_one_assoc.each do |association| -%>
13
13
  <%- if association.options[:class_name] == "ActionText::RichText" -%>
14
- <%%= f.rich_text_area :<%= association.name.to_s.singularize.to_s.remove('rich_text_' )%> %>
14
+ <label class="block my-5 block text-sm font-medium text-gray-700 string optional text-sm font-medium text-gray-600">
15
+ <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%=- association.name.to_s.singularize.to_s.remove('rich_text_') -%>') %>
16
+ </label>
17
+ <%%= f.rich_text_area :<%= association.name.to_s.singularize.to_s.remove('rich_text_')%> %>
15
18
  <%- else -%>
16
19
  <%%= render(Forms::HasOneFormComponent.new(title: I18n.t('bo.<%= association.name %>.one') )) do %>
17
20
  <%%= f.simple_fields_for :<%= association.name.to_s %> do |<%= association.name.to_s %>_form| %>
@@ -5,11 +5,15 @@ module <%= options[:namespace].camelize %>
5
5
  before_action :set_<%= class_name.underscore %>, only: %i[show edit destroy update]
6
6
 
7
7
  def index
8
- @q = <%=class_name%>.ransack(params[:q])
8
+ @q = authorized_scope(
9
+ <%=class_name%>.all,
10
+ with: Bo::<%= options[:namespace].camelize %>::<%= class_name %>Policy
11
+ ).ransack(params[:q])
9
12
  @pagy, @<%= class_name.pluralize.underscore %> = pagy(@q.result(distinct: true))
10
13
  end
11
14
 
12
15
  def show
16
+ authorize! @<%= class_name.underscore %>, to: :show?, namespace:, strict_namespace: true
13
17
  <%- has_one_assoc.each do |association| -%>
14
18
  <%- next if association.options[:class_name] == "ActionText::RichText" -%>
15
19
  @<%= class_name.underscore %>.build_<%= association.name %> if @<%= class_name.underscore %>.<%= association.name %>.nil?
@@ -18,16 +22,20 @@ module <%= options[:namespace].camelize %>
18
22
 
19
23
  def new
20
24
  @<%= class_name.underscore %> = <%= class_name %>.new
25
+ authorize! @<%= class_name.underscore %>, to: :new?, namespace:, strict_namespace: true
21
26
  <%- has_one_assoc.each do |association| -%>
22
27
  <%- next if association.options[:class_name] == "ActionText::RichText" -%>
23
28
  @<%= class_name.underscore %>.build_<%= association.name %>
24
29
  <%- end -%>
25
30
  end
26
31
 
27
- def edit; end
32
+ def edit
33
+ authorize! @<%= class_name.underscore %>, to: :edit?, namespace:, strict_namespace: true
34
+ end
28
35
 
29
36
  def create
30
37
  @<%= class_name.underscore %> = <%= class_name %>.new(<%= class_name.underscore %>_params)
38
+ authorize! @<%= class_name.underscore %>, to: :create?, namespace:, strict_namespace: true
31
39
 
32
40
  if @<%= class_name.underscore %>.save
33
41
  flash[:success] = t('bo.record.created')
@@ -38,6 +46,8 @@ module <%= options[:namespace].camelize %>
38
46
  end
39
47
 
40
48
  def update
49
+ authorize! @<%= class_name.underscore %>, to: :update?, namespace:, strict_namespace: true
50
+
41
51
  if @<%= class_name.underscore %>.update(<%= class_name.underscore %>_params)
42
52
  flash[:success] = t('bo.record.updated')
43
53
  redirect_to <%="#{options[:namespace]}_#{class_name.underscore}_path"%>
@@ -47,6 +57,8 @@ module <%= options[:namespace].camelize %>
47
57
  end
48
58
 
49
59
  def destroy
60
+ authorize! @<%= class_name.underscore %>, to: :destroy?, namespace:, strict_namespace: true
61
+
50
62
  @<%= class_name.underscore %>.destroy
51
63
  flash[:success] = t('bo.record.destroyed')
52
64
 
@@ -70,5 +82,9 @@ module <%= options[:namespace].camelize %>
70
82
  <%- end -%>
71
83
  )
72
84
  end
85
+
86
+ def namespace
87
+ @namespace ||= Bo::<%= options[:namespace].camelize %>
88
+ end
73
89
  end
74
90
  end
@@ -0,0 +1,29 @@
1
+ module Bo
2
+ class <%= options[:namespace].camelize %>Policy < ActionPolicy::Base
3
+ def show?
4
+ true
5
+ end
6
+
7
+ def new?
8
+ true
9
+ end
10
+
11
+ def edit?
12
+ true
13
+ end
14
+
15
+ def create?
16
+ true
17
+ end
18
+
19
+ def update?
20
+ true
21
+ end
22
+
23
+ def destroy?
24
+ true
25
+ end
26
+
27
+ relation_scope(&:all)
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ module Bo
2
+ module <%= options[:namespace].camelize %>
3
+ class <%= class_name %>Policy < Bo::<%= options[:namespace].camelize %>Policy
4
+ end
5
+ end
6
+ end
@@ -9,7 +9,7 @@ class BoNamespaceGenerator < Rails::Generators::NamedBase
9
9
  template 'admin_controller.rb', File.join('app/controllers/', "#{singular_name}_controller.rb")
10
10
  template 'seeds.rb', File.join('db/seeds/', "#{plural_name}.rb")
11
11
  template 'side_bar.html.erb', File.join('app/views/', "#{plural_name}/layouts/_side_bar.html.erb")
12
- #remove_devise_registration
12
+ remove_devise_registration
13
13
  end
14
14
 
15
15
  def create_directories
@@ -4,4 +4,5 @@ class <%= class_name %>Controller < ApplicationController
4
4
  include Pagy::Backend
5
5
  layout '<%= class_name.underscore %>'
6
6
  before_action :authenticate_<%= class_name.underscore %>!
7
+ authorize :user, through: :current_<%= class_name.underscore %>
7
8
  end
@@ -0,0 +1,4 @@
1
+ module Bo
2
+ class <%= class_name %>Policy < ActionPolicy::Base
3
+ end
4
+ end
data/lib/tybo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tybo
2
- VERSION = '0.0.11'
2
+ VERSION = '0.0.13'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tybo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Delpierre
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-08 00:00:00.000000000 Z
12
+ date: 2023-02-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -209,7 +209,6 @@ files:
209
209
  - app/mailers/tybo/application_mailer.rb
210
210
  - app/models/tybo/application_record.rb
211
211
  - app/views/devise/confirmations/new.html.erb
212
- - app/views/devise/login/home.html.erb
213
212
  - app/views/devise/mailer/_reset_password_instructions.html.erb
214
213
  - app/views/devise/mailer/confirmation_instructions.html.erb
215
214
  - app/views/devise/mailer/email_changed.html.erb
@@ -220,8 +219,6 @@ files:
220
219
  - app/views/devise/registrations/edit.html.erb
221
220
  - app/views/devise/registrations/new.html.erb
222
221
  - app/views/devise/sessions/new.html.erb
223
- - app/views/devise/shared/_devise_errors.html.erb
224
- - app/views/devise/shared/_error_messages.html.erb
225
222
  - app/views/devise/shared/_links.html.erb
226
223
  - app/views/devise/unlocks/new.html.erb
227
224
  - app/views/layouts/_errors.html.erb
@@ -234,6 +231,7 @@ files:
234
231
  - config/initializers/pagy.rb
235
232
  - config/initializers/ransack.rb
236
233
  - config/locales/devise.en.yml
234
+ - config/locales/devise.fr.yml
237
235
  - config/routes.rb
238
236
  - lib/generators/bo/USAGE
239
237
  - lib/generators/bo/bo_generator.rb
@@ -243,7 +241,9 @@ files:
243
241
  - lib/generators/bo/templates/controller.rb
244
242
  - lib/generators/bo/templates/index.html.erb
245
243
  - lib/generators/bo/templates/item.html.erb
244
+ - lib/generators/bo/templates/namespace_policy.rb
246
245
  - lib/generators/bo/templates/new.html.erb
246
+ - lib/generators/bo/templates/policy.rb
247
247
  - lib/generators/bo/templates/show.html.erb
248
248
  - lib/generators/bo/utils/files/fr.json
249
249
  - lib/generators/bo/utils/translations.rb
@@ -251,6 +251,7 @@ files:
251
251
  - lib/generators/bo_namespace/bo_namespace_generator.rb
252
252
  - lib/generators/bo_namespace/templates/admin.html.erb
253
253
  - lib/generators/bo_namespace/templates/admin_controller.rb
254
+ - lib/generators/bo_namespace/templates/policy.rb
254
255
  - lib/generators/bo_namespace/templates/seeds.rb
255
256
  - lib/generators/bo_namespace/templates/side_bar.html.erb
256
257
  - lib/generators/tybo_install/templates/application.tailwind.css
@@ -258,7 +259,7 @@ files:
258
259
  - lib/generators/tybo_install/templates/tailwind.config.js
259
260
  - lib/generators/tybo_install/templates/tom-select.css
260
261
  - lib/generators/tybo_install/templates/tybo_config.rb
261
- - lib/generators/tybo_install/tybo_config.rb
262
+ - lib/generators/tybo_install/tybo_install_generator.rb
262
263
  - lib/tybo.rb
263
264
  - lib/tybo/configuration.rb
264
265
  - lib/tybo/engine.rb
@@ -1,18 +0,0 @@
1
-
2
-
3
- <div class="flex flex-1 flex-col justify-center py-12 px-4 sm:px-6 lg:flex-none lg:px-20 xl:px-24">
4
- <div class="mx-auto w-full max-w-sm lg:w-96">
5
- <div>
6
- <%= image_tag Tybo.configuration.logo_url, class: 'h-12 w-auto'%>
7
- <h2 class="mt-6 text-3xl font-bold tracking-tight text-gray-900">Sign in to your account</h2>
8
- </div>
9
- <div class="mt-4">
10
- <% @resources.each do |resource| %>
11
- <a href="<%=send("new_#{resource.to_s}_session_path")%>" class="mt-2 flex w-full justify-center rounded-md border border-transparent bg-tybo-600 py-2 px-4 text-sm font-medium text-white shadow-sm hover:bg-tybo-700 focus:outline-none focus:ring-2 focus:ring-tybo-500 focus:ring-offset-2">
12
- <%=I18n.t("bo.sign_in_as.#{resource.to_s}")%>
13
- </a>
14
- <% end %>
15
- </div>
16
- </div>
17
- </div>
18
- <%= render(CoverComponent.new) %>
@@ -1,26 +0,0 @@
1
-
2
- <% if notice || alert %>
3
- <div class="rounded-md bg-red-50 p-4 my-3" data-controller="flash">
4
- <div class="flex">
5
- <div class="flex-shrink-0">
6
- <svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
7
- <path fill-rule="evenodd" d="M8.485 3.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 3.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
8
- </svg>
9
- </div>
10
- <div class="ml-3">
11
- <p class="text-sm font-medium text-tybo-800"><%= notice %></p>
12
- <p class="text-sm font-medium text-red-800"><%= alert %></p>
13
- </div>
14
- <div class="ml-auto pl-3">
15
- <div class="-mx-1.5 -my-1.5">
16
- <button type="button" data-action="flash#dismiss" class="inline-flex bg-red-50 rounded-md p-1.5 text-red-500 hover:bg-red-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-red-50 focus:ring-red-600">
17
- <span class="sr-only">Dismiss</span>
18
- <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
19
- <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"/>
20
- </svg>
21
- </button>
22
- </div>
23
- </div>
24
- </div>
25
- </div>
26
- <% end %>
@@ -1,15 +0,0 @@
1
- <% if resource.errors.any? %>
2
- <div id="error_explanation">
3
- <h2>
4
- <%= I18n.t("errors.messages.not_saved",
5
- count: resource.errors.count,
6
- resource: resource.class.model_name.human.downcase)
7
- %>
8
- </h2>
9
- <ul>
10
- <% resource.errors.full_messages.each do |message| %>
11
- <li><%= message %></li>
12
- <% end %>
13
- </ul>
14
- </div>
15
- <% end %>