Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions app/commands/decidim/stratified_sortitions/admin/import_sample.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ module Admin
class ImportSample < Decidim::Command
# Public: Initializes the command.
#
# file - The CSV file to import
# form - A SampleUploadForm with the file blob
# stratified_sortition - The stratified sortition to import samples to
# user - The user performing the import
def initialize(file, stratified_sortition, user)
def initialize(form, stratified_sortition, user)
super()
@file = file
@form = form
@stratified_sortition = stratified_sortition
@user = user
end
Expand All @@ -24,8 +24,14 @@ def initialize(file, stratified_sortition, user)
#
# Returns nothing.
def call
return broadcast(:invalid) unless @form.valid?

blob = @form.file
file_content = blob.download
filename = blob.filename.to_s

Decidim::StratifiedSortitions::Admin::ImportSampleJob
.perform_later(@file.read, @file.original_filename, @stratified_sortition, @user)
.perform_later(file_content, filename, @stratified_sortition, @user)
broadcast(:ok)
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ def download_template
def create
enforce_permission_to :upload_sample, :stratified_sortition

Decidim::StratifiedSortitions::Admin::ImportSample.call(params[:file], stratified_sortition, current_user) do
@form = form(SampleUploadForm).from_params(params)

Decidim::StratifiedSortitions::Admin::ImportSample.call(@form, stratified_sortition, current_user) do
on(:ok) do
flash[:notice] = I18n.t("sample_imports.create.success", scope: "decidim.stratified_sortitions.admin")
redirect_to upload_sample_stratified_sortition_path(stratified_sortition)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ def upload_sample
enforce_permission_to :upload_sample, :stratified_sortition
if stratified_sortition.strata_and_substrata_configured?
@stratified_sortition = stratified_sortition
@form = SampleUploadForm.new
@sample_participants_count = @stratified_sortition.sample_participants.count
@last_sample = SampleImport.where(stratified_sortition: @stratified_sortition).order(created_at: :desc).first
@samples = SampleImport.where(stratified_sortition: @stratified_sortition).order(created_at: :asc)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

module Decidim
module StratifiedSortitions
module Admin
class SampleUploadForm < Decidim::Form
include Decidim::HasUploadValidations

attribute :file, Decidim::Attributes::Blob

validates :file, presence: true
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class StratifiedSortition < ApplicationRecord
component_manifest_name "stratified_sortitions"

has_many :strata, class_name: "Decidim::StratifiedSortitions::Stratum", foreign_key: "decidim_stratified_sortition_id", dependent: :destroy
has_many :sample_imports, class_name: "Decidim::StratifiedSortitions::SampleImport", dependent: :destroy
has_many :sample_participants, class_name: "Decidim::StratifiedSortitions::SampleParticipant", foreign_key: "decidim_stratified_sortition_id", dependent: :destroy
has_one :panel_portfolio, class_name: "Decidim::StratifiedSortitions::PanelPortfolio", foreign_key: "decidim_stratified_sortitions_stratified_sortition_id",
dependent: :destroy
Expand Down
3 changes: 3 additions & 0 deletions app/models/decidim/stratified_sortitions/stratum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ class Stratum < ApplicationRecord

belongs_to :stratified_sortition, class_name: "Decidim::StratifiedSortitions::StratifiedSortition", foreign_key: "decidim_stratified_sortition_id"
has_many :substrata, class_name: "Decidim::StratifiedSortitions::Substratum", foreign_key: "decidim_stratified_sortitions_stratum_id", dependent: :destroy
has_many :sample_participant_strata, class_name: "Decidim::StratifiedSortitions::SampleParticipantStratum",
foreign_key: "decidim_stratified_sortitions_stratum_id",
dependent: :destroy

KINDS = %w(value numeric_range).freeze

Expand Down
3 changes: 3 additions & 0 deletions app/models/decidim/stratified_sortitions/substratum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ class Substratum < ApplicationRecord
include Decidim::TranslatableAttributes

belongs_to :stratum, class_name: "Decidim::StratifiedSortitions::Stratum", foreign_key: "decidim_stratified_sortitions_stratum_id"
has_many :sample_participant_strata, class_name: "Decidim::StratifiedSortitions::SampleParticipantStratum",
foreign_key: "decidim_stratified_sortitions_substratum_id",
dependent: :destroy

translatable_fields :name
end
Expand Down
22 changes: 12 additions & 10 deletions app/packs/src/decidim/stratified_sortitions/upload_sample.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
document.addEventListener('DOMContentLoaded', () => {
const fileInput = document.getElementById('sample-file-input');
const submitButton = document.getElementById('sample-submit-button');
document.addEventListener("DOMContentLoaded", () => {
const form = document.getElementById("sample-upload-form");
if (!form) return;

if (!fileInput || !submitButton) return;
const modal = form.querySelector("[data-dialog]");
if (!modal) return;

const toggle = () => {
const hasFile = fileInput.files && fileInput.files.length > 0;
submitButton.disabled = !hasFile;
};
const saveButton = modal.querySelector("[data-dropzone-save]");
if (!saveButton) return;

toggle();
fileInput.addEventListener('change', toggle);
saveButton.addEventListener("click", () => {
// Allow Decidim's upload_field.js handler to run first (updateActiveUploads),
// then submit the form.
setTimeout(() => form.submit(), 100);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,8 @@ input[readonly] {
border-bottom: 2px solid rgba(21, 90, 191, 1);
}
}
}

.upload-census-btn {
margin: 0 !important;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<button type="button"
class="button button__sm button__secondary"
data-dialog-open="confirm-execute-modal"
disabled="<%= stratified_sortition.panel_portfolio&.sampled? %>">
<%= 'disabled' if stratified_sortition.panel_portfolio&.sampled? %>>
<%= t('.execute_stratified_sortition') %>
</button>
<% if stratified_sortition.panel_portfolio&.sampled? %>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@
</div>
<%= render 'navigation_menu' %>
<div class="card mt-12">
<div class="item_show__header">
<h1 class="item_show__header-title">
<div>
<%= t(".upload_file") %>
</div>
</h1>
</div>
<div class="mt-1">
<%= t(".description") %>
</div>
Expand All @@ -22,21 +15,14 @@
<%= link_to t('.download_template'), download_template_samples_path(id: @stratified_sortition.id), class: 'button button__sm button__secondary' %>
</div>
</div>
<div class="card-section mt-4">
<%= t(".help") %>
</div>
<div class="row mt-4">
<%= form_tag samples_path(id: @stratified_sortition.id), multipart: true, class: 'form' do %>
<div class="flex">
<%= file_field_tag :file, id: 'sample-file-input' %>

<% if @stratified_sortition.strata_and_substrata_configured? %>
<%= submit_tag t('.upload_file'), id: 'sample-submit-button', class: 'button button__sm button__secondary hollow tiny button--title', disabled: true %>
<% else %>
<p class="mr-2"><%= t('.configure_strata_first') %></p>
<%= submit_tag t('.upload_file'), class: 'button button__sm button__secondary hollow tiny button--title', disabled: true, title: t('.configure_strata_first') %>
<% end %>
</div>
<%= decidim_form_for(@form, url: samples_path(id: @stratified_sortition.id), method: :post, html: { id: "sample-upload-form", class: "form", multipart: true }) do |form| %>
<%= form.upload :file,
label: false,
required: true,
help: [t(".help_csv"), t(".help_format")],
button_label: t(".upload_file"),
button_class: "button button__sm button__secondary upload-census-btn" %>
<% end %>
</div>
</div>
Expand Down
14 changes: 8 additions & 6 deletions config/locales/ca.yml
Original file line number Diff line number Diff line change
Expand Up @@ -176,17 +176,19 @@ ca:
filename_data: "%{filename}, el dia %{date}, número de registres %{count}"
gender: Gènere
last_upload_date: La última càrrega va ser el dia %{date}
help: Les quatre primeres columnes són dades del candidat, per exemple correu electrònic, DNI, telèfon o adreça i les següents columnes són els estrats definits en el sorteig estratificat. Cada fila representa un candidat.
help: "La mostra ha de ser un fitxer CSV o Excel.<br> Cada fila respresenta un candidat/candidata."
no_data: Sense dades
place: Lloc de naixement
remove_uploaded_samples: Eliminar mostres carregades
strata_not_configured: Primer has de configurar els estrats i subestrats
remove_uploaded_samples: Eliminar tots els registres
confirm_remove_uploaded_samples: Estàs segur que vols eliminar totes les registres?
target: Objectiu
title: Gestionar cens
upload_file: Pujar un nou cens
uploaded_file: Dades del cens carregat
title: Importar nova mostra
upload_file: Afegir arxiu
uploaded_file: Dades de la mostra carregada
uploaded_files: "S'han agregat els següents fitxers:"
no_uploaded_files: "No hi ha fitxers carregats."
help_csv: Es suporten fitxers CSV
help_format: Fitxer .csv amb el cens
import_mailer:
subject: "Resultat de la importació de la mostra"
import:
Expand Down
10 changes: 6 additions & 4 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,17 @@ en:
help: The first four columns are candidate data, such as email, ID, phone, or address, and the following columns are the strata defined in the stratified sortition. Each row represents a candidate.
no_data: No data
place: Place of birth
remove_uploaded_samples: Remove uploaded samples
remove_uploaded_samples: Remove all records
confirm_remove_uploaded_samples: Are you sure you want to remove all uploaded samples?
strata_not_configured: You must configure strata and substrata first
target: Target
title: Manage census
upload_file: Upload a new census
uploaded_file: Census data
title: Import new sample
upload_file: Upload file
uploaded_file: Uploaded sample data
uploaded_files: "The following files have been added:"
no_uploaded_files: "No files uploaded."
help_csv: CSV files are supported
help_format: .csv file with census
import_mailer:
subject: "Sample import result"
import:
Expand Down
10 changes: 6 additions & 4 deletions config/locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,17 @@ es:
help: Las cuatro primeras columnas son datos del candidato, por ejemplo correo electrónico, DNI, teléfono o dirección y las siguientes columnas son los estratos definidos en el sorteo estratificado. Cada fila representa un candidato.
no_data: No hay datos
place: Lugar de nacimiento
remove_uploaded_samples: Eliminar muestras cargadas
remove_uploaded_samples: Eliminar todos los registros
confirm_remove_uploaded_samples: ¿Estás seguro de que quieres eliminar todas las muestras cargadas?
strata_not_configured: Primero debes configurar los estratos y subestratos
target: Objetivo
title: Gestionar censo
upload_file: Subir un nuevo censo
uploaded_file: Datos del censo
title: Importar nueva muestra
upload_file: Subir archivo
uploaded_file: Datos de la muestra cargada
uploaded_files: "Se han agregado los siguientes archivos:"
no_uploaded_files: "No hay archivos cargados."
help_csv: Se admiten archivos CSV
help_format: Archivo .csv con el censo
import_mailer:
subject: "Resultado de la importación de la muestra"
import:
Expand Down
Loading