Files
eminuxCRM/app/views/opportunities/_form.html.erb
T
eminuxandCursor a33a281a96
CI / scan_ruby (push) Failing after 11m35s
CI / scan_js (push) Successful in 11m13s
CI / lint (push) Failing after 11m53s
Migliora pipeline e form per l'uso da cellulare.
Rende la pipeline verticale su mobile e semplifica i form lunghi con sezioni, tap target più grandi e azioni più facili da usare in movimento.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 11:38:48 +02:00

98 lines
5.1 KiB
ERB

<div class="mx-auto max-w-2xl space-y-4">
<h1 class="text-xl font-semibold md:text-2xl"><%= @opportunity.new_record? ? "Nuova opportunità" : "Modifica opportunità" %></h1>
<%= form_with model: @opportunity, class: "#{card_class} p-4 md:p-6 space-y-6" do |f| %>
<%= render "shared/errors", object: @opportunity %>
<section class="space-y-4">
<h2 class="text-sm font-semibold uppercase tracking-wide text-zinc-500">Base</h2>
<div class="grid gap-4 md:grid-cols-2">
<div class="space-y-1">
<label class="block text-sm font-medium">Organizzazione</label>
<%= f.collection_select :organization_id, @organizations, :id, :name, {}, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Progetto</label>
<%= f.collection_select :project_id, @projects, :id, :name, {}, class: input_class %>
</div>
<div class="space-y-1 md:col-span-2">
<label class="block text-sm font-medium">Nome opportunità</label>
<%= f.text_field :name, placeholder: "Nome opportunità", required: true, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Stage</label>
<%= f.select :pipeline_stage, Catalog::PIPELINE_STAGES.map { |k,v| [v,k] }, {}, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Owner</label>
<%= f.collection_select :assigned_user_id, @users, :id, :full_name, { include_blank: true }, class: input_class %>
</div>
</div>
</section>
<section class="space-y-4 border-t border-zinc-100 pt-4 dark:border-zinc-800">
<h2 class="text-sm font-semibold uppercase tracking-wide text-zinc-500">Commerciale</h2>
<div class="grid gap-4 md:grid-cols-2">
<div class="space-y-1">
<label class="block text-sm font-medium">Valore stimato</label>
<%= f.number_field :estimated_value, placeholder: "Valore stimato", step: 0.01, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Probabilità %</label>
<%= f.number_field :probability, placeholder: "Probabilità %", min: 0, max: 100, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Chiusura prevista</label>
<%= f.date_field :expected_close_date, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Prodotto</label>
<%= f.select :product, (@products.map(&:name) + %w[Light Full Partnership Evento Altro]).uniq, { include_blank: true }, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Motivo perdita</label>
<%= f.select :lost_reason, Catalog::LOST_REASONS.map { |k,v| [v,k] }, { include_blank: true }, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Esito</label>
<%= f.text_field :outcome, placeholder: "Esito", class: input_class %>
</div>
</div>
</section>
<section class="space-y-4 border-t border-zinc-100 pt-4 dark:border-zinc-800">
<h2 class="text-sm font-semibold uppercase tracking-wide text-zinc-500">Campagna</h2>
<div class="grid gap-4 md:grid-cols-2">
<div class="space-y-1">
<label class="block text-sm font-medium">Test A/B</label>
<%= f.select :ab_variant, Catalog::AB_VARIANTS.map { |k,v| [v,k] }, { include_blank: true }, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Stato invio</label>
<%= f.select :send_status, Catalog::SEND_STATUSES.map { |k,v| [v,k] }, { include_blank: true }, class: input_class %>
</div>
<div class="space-y-1">
<label class="block text-sm font-medium">Data invio</label>
<%= f.date_field :sent_on, class: input_class %>
</div>
</div>
<label class="flex min-h-11 items-center gap-3 rounded-lg border border-zinc-200 px-3 py-2 text-sm dark:border-zinc-700">
<%= f.check_box :demo_trial, class: "size-5" %>
Demo / Trial
</label>
<label class="flex min-h-11 items-center gap-3 rounded-lg border border-zinc-200 px-3 py-2 text-sm dark:border-zinc-700">
<%= f.check_box :converted, class: "size-5" %>
Conversione
</label>
</section>
<section class="space-y-2 border-t border-zinc-100 pt-4 dark:border-zinc-800">
<label class="block text-sm font-medium">Note</label>
<%= f.text_area :notes, rows: 4, class: input_class %>
</section>
<div class="flex flex-col gap-2 border-t border-zinc-100 pt-4 sm:flex-row dark:border-zinc-800">
<%= f.submit class: "#{btn_primary} w-full sm:w-auto" %>
<%= link_to "Annulla", @opportunity.persisted? ? @opportunity.organization : opportunities_path, class: "#{btn_secondary} w-full sm:w-auto" %>
</div>
<% end %>
</div>