prepare export template to be used for tabular template
Co-authored-by: mfo <mfo@users.noreply.github.com>
This commit is contained in:
parent
16b8995191
commit
f383e1c502
11 changed files with 95 additions and 38 deletions
|
@ -47,6 +47,9 @@ class Column
|
|||
procedure.find_column(h_id: h_id)
|
||||
end
|
||||
|
||||
def dossier_column? = false
|
||||
def champ_column? = false
|
||||
|
||||
private
|
||||
|
||||
def column_id = "#{table}/#{column}"
|
||||
|
|
|
@ -45,6 +45,8 @@ class Columns::ChampColumn < Column
|
|||
end
|
||||
end
|
||||
|
||||
def champ_column? = true
|
||||
|
||||
private
|
||||
|
||||
def column_id = "type_de_champ/#{stable_id}"
|
||||
|
|
|
@ -15,4 +15,6 @@ class Columns::DossierColumn < Column
|
|||
dossier.followers_instructeurs.map(&:email).join(' ')
|
||||
end
|
||||
end
|
||||
|
||||
def dossier_column? = true
|
||||
end
|
||||
|
|
|
@ -9,7 +9,7 @@ class ExportTemplate < ApplicationRecord
|
|||
has_one :procedure, through: :groupe_instructeur
|
||||
has_many :exports, dependent: :nullify
|
||||
|
||||
enum kind: { zip: "zip" }, _prefix: :template
|
||||
enum kind: { zip: 'zip', csv: 'csv', xlsx: 'xlsx', ods: 'ods' }, _prefix: :template
|
||||
|
||||
attribute :dossier_folder, :export_item
|
||||
attribute :export_pdf, :export_item
|
||||
|
@ -30,6 +30,7 @@ class ExportTemplate < ApplicationRecord
|
|||
end
|
||||
|
||||
def self.default(name: nil, kind: 'zip', groupe_instructeur:)
|
||||
# TODO: remove default values for tabular export
|
||||
dossier_folder = ExportItem.default(prefix: 'dossier')
|
||||
export_pdf = ExportItem.default(prefix: 'export')
|
||||
pjs = groupe_instructeur.procedure.exportables_pieces_jointes.map { |tdc| ExportItem.default_pj(tdc) }
|
||||
|
@ -37,6 +38,10 @@ class ExportTemplate < ApplicationRecord
|
|||
new(name:, kind:, groupe_instructeur:, dossier_folder:, export_pdf:, pjs:)
|
||||
end
|
||||
|
||||
def tabular?
|
||||
kind != 'zip'
|
||||
end
|
||||
|
||||
def tags
|
||||
tags_categorized.slice(:individual, :etablissement, :dossier).values.flatten
|
||||
end
|
||||
|
@ -60,6 +65,19 @@ class ExportTemplate < ApplicationRecord
|
|||
File.join(dossier_folder.path(dossier), file_path) if file_path.present?
|
||||
end
|
||||
|
||||
def dossier_exported_columns = exported_columns.filter { _1.column.dossier_column? }
|
||||
|
||||
def columns_for_stable_id(stable_id)
|
||||
exported_columns
|
||||
.filter { _1.column.champ_column? }
|
||||
.filter { _1.column.stable_id == stable_id }
|
||||
end
|
||||
|
||||
def in_export?(exported_column)
|
||||
@template_exported_columns ||= exported_columns.map(&:column)
|
||||
@template_exported_columns.include?(exported_column.column)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def ensure_pjs_are_legit
|
||||
|
|
|
@ -29,7 +29,10 @@ class ExportItemType < ActiveRecord::Type::Value
|
|||
|
||||
# ruby -> db
|
||||
def serialize(value)
|
||||
if value.is_a?(ExportItem)
|
||||
case value
|
||||
in NilClass
|
||||
nil
|
||||
in ExportItem
|
||||
JSON.generate({
|
||||
template: value.template,
|
||||
enabled: value.enabled,
|
||||
|
|
|
@ -6,41 +6,59 @@
|
|||
[t('.title')]] }
|
||||
|
||||
.fr-container
|
||||
%h1= t('.title')
|
||||
= render Dsfr::CalloutComponent.new(title: nil) do |c|
|
||||
- c.with_body do
|
||||
%p= t('.export_description', expiration_time: Export::MAX_DUREE_CONSERVATION_EXPORT.in_hours.to_i)
|
||||
.fr-tabs.mb-3
|
||||
%ul.fr-tabs__list{ role: 'tablist' }
|
||||
%li{ role: 'presentation' }
|
||||
%button.fr-tabs__tab.fr-tabs__tab--icon-left{ id: "tabpanel-exports", tabindex: "0", role: "tab", "aria-selected": "true", "aria-controls": "tabpanel-exports-panel" } Liste des exports
|
||||
%li{ role: 'presentation' }
|
||||
%button.fr-tabs__tab.fr-tabs__tab--icon-left{ id: "tabpanel-export-templates", tabindex: "-1", role: "tab", "aria-selected": "false", "aria-controls": "tabpanel-export-templates-panel" } Modèles d'export
|
||||
|
||||
- if @exports.present?
|
||||
%div{ data: @exports.any?(&:pending?) ? { controller: "turbo-poll", turbo_poll_url_value: "", turbo_poll_interval_value: 10_000, turbo_poll_max_checks_value: 6 } : {} }
|
||||
= render Dossiers::ExportLinkComponent.new(procedure: @procedure, exports: @exports, statut: @statut, count: @dossiers_count, class_btn: 'fr-btn--tertiary', export_url: method(:download_export_instructeur_procedure_path))
|
||||
|
||||
- if @exports.any?{_1.format == Export.formats.fetch(:zip)}
|
||||
= render Dsfr::AlertComponent.new(title: t('.title_zip'), state: :info, extra_class_names: 'fr-mb-3w') do |c|
|
||||
.fr-tabs__panel.fr-tabs__panel--selected{ id: "tabpanel-exports-panel", role: "tabpanel", "aria-labelledby": "tabpanel-exports", tabindex: "0" }
|
||||
= render Dsfr::CalloutComponent.new(title: nil) do |c|
|
||||
- c.with_body do
|
||||
%p= t('.export_description_zip_html')
|
||||
%p= t('.export_description', expiration_time: Export::MAX_DUREE_CONSERVATION_EXPORT.in_hours.to_i)
|
||||
|
||||
- else
|
||||
= t('.no_export_html', expiration_time: Export::MAX_DUREE_CONSERVATION_EXPORT.in_hours.to_i )
|
||||
- if @exports.present?
|
||||
%div{ data: @exports.any?(&:pending?) ? { controller: "turbo-poll", turbo_poll_url_value: "", turbo_poll_interval_value: 10_000, turbo_poll_max_checks_value: 6 } : {} }
|
||||
= render Dossiers::ExportLinkComponent.new(procedure: @procedure, exports: @exports, statut: @statut, count: @dossiers_count, class_btn: 'fr-btn--tertiary', export_url: method(:download_export_instructeur_procedure_path))
|
||||
|
||||
- if @procedure.feature_enabled?(:export_template)
|
||||
%h2.fr-mb-1w.fr-mt-8w
|
||||
Liste des modèles d'export
|
||||
%p.fr-hint-text
|
||||
Un modèle d'export permet de personnaliser le nom des fichiers (pour un export au format Zip)
|
||||
- if @export_templates.any?
|
||||
.fr-table.fr-table--no-caption.fr-mt-5w
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
%th{ scope: 'col' } Nom du modèle
|
||||
%th{ scope: 'col' }= "Groupe instructeur" if @procedure.groupe_instructeurs.many?
|
||||
%tbody
|
||||
- @export_templates.each do |export_template|
|
||||
%tr
|
||||
%td= link_to export_template.name, [:edit, :instructeur, @procedure, export_template]
|
||||
%td= export_template.groupe_instructeur.label if @procedure.groupe_instructeurs.many?
|
||||
- if @exports.any?{_1.format == Export.formats.fetch(:zip)}
|
||||
= render Dsfr::AlertComponent.new(title: t('.title_zip'), state: :info, extra_class_names: 'fr-mb-3w') do |c|
|
||||
- c.with_body do
|
||||
%p= t('.export_description_zip_html')
|
||||
|
||||
%p
|
||||
= link_to [:new, :instructeur, @procedure, :export_template], class: 'fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-add-line' do
|
||||
Ajouter un modèle d'export
|
||||
- else
|
||||
= t('.no_export_html', expiration_time: Export::MAX_DUREE_CONSERVATION_EXPORT.in_hours.to_i )
|
||||
|
||||
.fr-tabs__panel.fr-tabs__panel{ id: "tabpanel-export-templates-panel", role: "tabpanel", "aria-labelledby": "tabpanel-export-templates", tabindex: "0" }
|
||||
= render Dsfr::AlertComponent.new(state: :info) do |c|
|
||||
- c.with_body do
|
||||
%p= t('.export_template_list_description_html')
|
||||
|
||||
|
||||
.fr-mt-5w
|
||||
= link_to t('.new_zip_export_template'), new_instructeur_procedure_export_template_path(@procedure), class: "fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-add-line fr-mr-1w"
|
||||
= link_to t('.new_tabular_export_template'), new_instructeur_procedure_export_template_path(@procedure, kind: 'tabular'), class: "fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-add-line"
|
||||
|
||||
.fr-table.fr-table--bordered.fr-table--no-caption.fr-mt-5w
|
||||
.fr-table__wrapper
|
||||
.fr-table__container
|
||||
.fr-table__content
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
= tag.th "Nom du modèle", scope: 'col'
|
||||
= tag.th "Format", scope: 'col'
|
||||
= tag.th "Date de création", scope: 'col'
|
||||
= tag.th "Partagé avec (groupe instructeurs)", scope: 'col' if @procedure.groupe_instructeurs.many?
|
||||
= tag.th "Actions", scope: 'col'
|
||||
%tbody
|
||||
- @export_templates.each do |export_template|
|
||||
%tr
|
||||
%td= link_to export_template.name, [:edit, :instructeur, @procedure, export_template]
|
||||
%td= pretty_kind(export_template.kind)
|
||||
%td= l(export_template.created_at)
|
||||
= tag.td export_template.groupe_instructeur.label if @procedure.groupe_instructeurs.many?
|
||||
%td
|
||||
= link_to "Modifier", [:edit, :instructeur, @procedure, export_template], class: "fr-btn fr-btn--icon-left fr-icon-edit-line fr-mr-1w"
|
||||
= link_to "Supprimer", [:instructeur, @procedure, export_template], method: :delete, data: { confirm: "Voulez-vous vraiment supprimer ce modèle ? Il sera supprimé pour tous les instructeurs du groupe"}, class: "fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-delete-line"
|
||||
|
|
|
@ -12,7 +12,7 @@ en:
|
|||
button_delay_expiration: "Keep for one more month"
|
||||
notification_management: notification management
|
||||
administrators_list: administrators list
|
||||
exports_list: exports list
|
||||
exports_list: exports and export templates
|
||||
exports_notification_label: A new export is ready to download
|
||||
statistics: statistics
|
||||
instructeurs: instructors
|
||||
|
|
|
@ -13,7 +13,7 @@ fr:
|
|||
button_delay_expiration: "Conserver un mois de plus"
|
||||
notification_management: Gestion des notifications
|
||||
administrators_list: Voir les administrateurs
|
||||
exports_list: Voir les exports
|
||||
exports_list: Voir les exports et modèles d'export
|
||||
exports_notification_label: Un nouvel export est prêt à être téléchargé
|
||||
statistics: Statistiques
|
||||
instructeurs: instructeurs
|
||||
|
|
|
@ -18,3 +18,9 @@ en:
|
|||
|
||||
|
||||
no_export_html: You have no export at the moment. <br> Can't find an export? It may have expired, exports are deleted after %{expiration_time} hours.
|
||||
|
||||
export_template_list_description_html: |
|
||||
Each instructor can <b>configure an export template</b> to customize exports (attachments name for a zip export, columns selection for a tabular export). It will be made <b>available to all instructors</b> assigned to the procedure.</br>
|
||||
<a href="https://doc.demarches-simplifiees.fr" target="_blank" rel="noopener noreferrer">Find out more about export template configuration</a>
|
||||
new_zip_export_template: Create zip export template
|
||||
new_tabular_export_template: Create tabular export template
|
||||
|
|
|
@ -17,3 +17,8 @@ fr:
|
|||
Vous n'arrivez pas à extraire un export au format .zip sur un réseau d'entreprise ? Essayer de renommer l'archive avec un nom plus court et ré-essayer de l'extraire.
|
||||
|
||||
no_export_html: Vous n'avez pas d'export pour le moment. <br> Vous ne trouvez pas un export ? Il a peut-être expiré, les exports sont supprimés au bout de %{expiration_time} heures.
|
||||
export_template_list_description_html: |
|
||||
Chaque instructeur a la possibilité de <b>configurer un modèle</b> d'export pour personnaliser les exports (nom des pièces jointes pour un export au format zip, sélection des colonnes pour un export tabulaire). Il sera <b>mis à disposition de l'ensemble des instructeurs</b> affectés à la démarche<br>
|
||||
<a href="https://doc.demarches-simplifiees.fr" target="_blank" rel="noopener noreferrer">En savoir plus sur la configuration des modèles d'export</a>
|
||||
new_zip_export_template: Créer un modèle d'export zip
|
||||
new_tabular_export_template: Créer un modèle d'export tabulaire
|
||||
|
|
|
@ -138,7 +138,7 @@ describe 'Instructing a dossier:', js: true do
|
|||
|
||||
expect(page).to have_text('Nous générons cet export.')
|
||||
|
||||
click_on "Voir les exports"
|
||||
click_on "Voir les exports et modèles d'export"
|
||||
expect(page).to have_text("Export .csv d’un dossier « à suivre » demandé il y a moins d'une minute")
|
||||
expect(page).to have_text("En préparation")
|
||||
|
||||
|
|
Loading…
Reference in a new issue