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
9 changes: 9 additions & 0 deletions app/forms/sponsor_session_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ class SponsorSessionForm

delegate :persisted?, to: :sponsor_session

validate :validate_three_conference_selection, if: -> { conference_id == 15 }

concerning :ProposalItemsBuilder do
attr_accessor :proposal_items

Expand Down Expand Up @@ -58,6 +60,13 @@ def save
false
end

def validate_three_conference_selection
sponsor_session.valid?(:entry_form)
sponsor_session.errors.each do |error|
errors.add(error.attribute, error.message)
end
end

def process_existing_talk
params = build_talk_params
sponsor_session.update!(params)
Expand Down
7 changes: 7 additions & 0 deletions app/javascript/packs/speaker_form.js
Original file line number Diff line number Diff line change
Expand Up @@ -437,3 +437,10 @@ if (document.readyState === 'loading') {
initializeConferenceFieldToggle();
initializeInputCardStyles(); // 追加
}

// Turbo Frame 内でフォームが差し替えられた場合にも再初期化
document.addEventListener('turbo:frame-load', () => {
initializeCharCounters();
initializeConferenceFieldToggle();
initializeInputCardStyles();
});
168 changes: 162 additions & 6 deletions app/views/sponsor_dashboards/sponsor_sessions/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
<p class="field-description" style="font-size: 0.7em">(200文字程度)どんな人に向けた講演かこの講演によって受講者がどんな情報を得られるかを含めることをおすすめします - (About 400 letters) Include a session for what kind of person, what kind of information the attendee can get</p>
<%= f.text_area :abstract, {class: "form-control abstract"} %>
</div>
<div class="field pb-3">
<%= f.label :talk_category_id, "主なカテゴリ - Main Category(★★)" %>*
<p class="field-description" style="font-size: 0.7em">必ずしもCNCFのプロジェクトに関する内容でなくても問題ありません - It does not necessarily have to be content of the CNCF project</p>
<%= f.collection_select :talk_category_id, conference.talk_categories, :id, :name, {prompt: ""}, class: "form-control talk-categories", required: true %>
</div>
<% unless conference.id == 15 %>
<div class="field pb-3">
<%= f.label :talk_category_id, "主なカテゴリ - Main Category(★★)" %>*
<p class="field-description" style="font-size: 0.7em">必ずしもCNCFのプロジェクトに関する内容でなくても問題ありません - It does not necessarily have to be content of the CNCF project</p>
<%= f.collection_select :talk_category_id, conference.talk_categories, :id, :name, {prompt: ""}, class: "form-control talk-categories", required: true %>
</div>
<% end %>
<div class="field pb-3">
<%= f.label :talk_difficulty_id, "受講者レベル - Audience Experience Level(★★)" %>*
<%= f.collection_select :talk_difficulty_id, conference.talk_difficulties, :id, :name, {prompt: ""}, class: "form-control", required: true %>
Expand All @@ -45,6 +47,10 @@
<% conference.proposal_item_configs.map(&:item_number).uniq.each do |item_number| %>
<div class="field pb-3">
<% first_item = conference.proposal_item_configs.find_by(item_number: item_number) %>
<% next unless first_item %>

<% three_conf_labels = ['target_conferences', 'cnd_category', 'cnd_assumed_visitor', 'pek_category', 'pek_assumed_visitor', 'srek_category', 'srek_assumed_visitor'] %>
<% next if conference.id == 15 && three_conf_labels.include?(first_item.label) %>
<% if first_item.class.to_s == 'ProposalItemConfigCheckBox' %>
<%= render 'sponsor_dashboards/sponsor_sessions/proposal_item_config_check_box', f: f, first_item: first_item, item_number: item_number %>
<% elsif first_item.class.to_s == 'ProposalItemConfigRadioButton' %>
Expand All @@ -53,6 +59,156 @@
<% end %>
</div>
<% end %>

<% if conference.id == 15 %>
<% form_index = 'sponsor_session' %>
<% target_conf_configs = conference.proposal_item_configs.where(label: 'target_conferences') %>
<% first_item = target_conf_configs.first %>
<% existing_target_conferences = sponsor_session.proposal_items.find_by(label: 'target_conferences')&.params || [] %>

<div class="field pb-3">
<%= label_tag "sponsor_session_proposal_items_attributes_target_conferences", first_item.item_name, {class: 'form-check-label'} %>*
<p class="field-description" style="font-size: 0.7em"><%= first_item.description&.html_safe %></p>

<% cnd_config = target_conf_configs.find { |c| c.params == 'Cloud Native' } %>
<% if cnd_config %>
<% cnd_checked = existing_target_conferences.include?(cnd_config.id.to_s) %>
<div class="cfp-conference-card mb-3 p-3 border rounded-3 <%= 'border-primary bg-primary bg-opacity-10' if cnd_checked %>">
<div class="form-check">
<%= check_box_tag "sponsor_session[proposal_items_attributes][target_conferences][]",
cnd_config.id,
cnd_checked,
{
id: "target_conference_cloud_native_#{form_index}",
class: 'form-check-input target-conference-checkbox',
data: { conference_type: 'cloud-native', form_index: form_index }
} %>
<%= label_tag "target_conference_cloud_native_#{form_index}", cnd_config.params, {class: 'form-check-label'} %>
</div>

<div class="cnd-fields mt-3 ps-4" data-form-index="<%= form_index %>" style="<%= 'display: none;' unless cnd_checked %>">
<% cnd_category_configs = conference.proposal_item_configs.where(label: 'cnd_category') %>
<% cnd_category_first = cnd_category_configs.first %>
<% cnd_existing_category = sponsor_session.proposal_items.find_by(label: 'cnd_category')&.params %>

<div class="mb-3">
<%= label_tag "sponsor_session_proposal_items_attributes_cnd_categories", cnd_category_first.item_name, {class: 'form-check-label'} %>*
<%= select_tag "sponsor_session[proposal_items_attributes][cnd_categories]",
options_for_select([['選択してください', '']] + cnd_category_configs.map { |item| [item.params, item.id] }, cnd_existing_category),
{ class: 'form-control cnd-category-select' } %>
</div>

<% cnd_visitor_configs = conference.proposal_item_configs.where(label: 'cnd_assumed_visitor') %>
<% cnd_visitor_first = cnd_visitor_configs.first %>
<% cnd_existing_visitors = sponsor_session.proposal_items.find_by(label: 'cnd_assumed_visitor')&.params || [] %>

<div class="mb-2">
<%= label_tag "sponsor_session_proposal_items_attributes_cnd_assumed_visitors", cnd_visitor_first.item_name, {class: 'form-check-label'} %>*
</div>
<div class="form-check">
<% cnd_visitor_configs.each do |item| %>
<% checked = cnd_existing_visitors.include?(item.id.to_s) %>
<%= check_box_tag "sponsor_session[proposal_items_attributes][cnd_assumed_visitors][]", item.id, checked, {class: 'form-check-input cnd-visitor-checkbox', id: "cnd_assumed_visitor_#{item.id}_#{form_index}"} %>
<%= label_tag "cnd_assumed_visitor_#{item.id}_#{form_index}", item.params, {class: 'form-check-label'} %><br>
<% end %>
</div>
</div>
</div>
<% end %>

<% pek_config = target_conf_configs.find { |c| c.params == 'Platform Engineering' } %>
<% if pek_config %>
<% pek_checked = existing_target_conferences.include?(pek_config.id.to_s) %>
<div class="cfp-conference-card mb-3 p-3 border rounded-3 <%= 'border-primary bg-primary bg-opacity-10' if pek_checked %>">
<div class="form-check">
<%= check_box_tag "sponsor_session[proposal_items_attributes][target_conferences][]",
pek_config.id,
pek_checked,
{
id: "target_conference_platform_engineering_#{form_index}",
class: 'form-check-input target-conference-checkbox',
data: { conference_type: 'platform-engineering', form_index: form_index }
} %>
<%= label_tag "target_conference_platform_engineering_#{form_index}", pek_config.params, {class: 'form-check-label'} %>
</div>

<div class="pek-fields mt-3 ps-4" data-form-index="<%= form_index %>" style="<%= 'display: none;' unless pek_checked %>">
<% pek_category_configs = conference.proposal_item_configs.where(label: 'pek_category') %>
<% pek_category_first = pek_category_configs.first %>
<% pek_existing_category = sponsor_session.proposal_items.find_by(label: 'pek_category')&.params %>

<div class="mb-3">
<%= label_tag "sponsor_session_proposal_items_attributes_pek_categories", pek_category_first.item_name, {class: 'form-check-label'} %>*
<%= select_tag "sponsor_session[proposal_items_attributes][pek_categories]",
options_for_select([['選択してください', '']] + pek_category_configs.map { |item| [item.params, item.id] }, pek_existing_category),
{ class: 'form-control pek-category-select' } %>
</div>

<% pek_visitor_configs = conference.proposal_item_configs.where(label: 'pek_assumed_visitor') %>
<% pek_visitor_first = pek_visitor_configs.first %>
<% pek_existing_visitors = sponsor_session.proposal_items.find_by(label: 'pek_assumed_visitor')&.params || [] %>

<div class="mb-2">
<%= label_tag "sponsor_session_proposal_items_attributes_pek_assumed_visitors", pek_visitor_first.item_name, {class: 'form-check-label'} %>*
</div>
<div class="form-check">
<% pek_visitor_configs.each do |item| %>
<% checked = pek_existing_visitors.include?(item.id.to_s) %>
<%= check_box_tag "sponsor_session[proposal_items_attributes][pek_assumed_visitors][]", item.id, checked, {class: 'form-check-input pek-visitor-checkbox', id: "pek_assumed_visitor_#{item.id}_#{form_index}"} %>
<%= label_tag "pek_assumed_visitor_#{item.id}_#{form_index}", item.params, {class: 'form-check-label'} %><br>
<% end %>
</div>
</div>
</div>
<% end %>

<% srek_config = target_conf_configs.find { |c| c.params == 'SRE' } %>
<% if srek_config %>
<% srek_checked = existing_target_conferences.include?(srek_config.id.to_s) %>
<div class="cfp-conference-card mb-3 p-3 border rounded-3 <%= 'border-primary bg-primary bg-opacity-10' if srek_checked %>">
<div class="form-check">
<%= check_box_tag "sponsor_session[proposal_items_attributes][target_conferences][]",
srek_config.id,
srek_checked,
{
id: "target_conference_sre_#{form_index}",
class: 'form-check-input target-conference-checkbox',
data: { conference_type: 'sre', form_index: form_index }
} %>
<%= label_tag "target_conference_sre_#{form_index}", srek_config.params, {class: 'form-check-label'} %>
</div>

<div class="srek-fields mt-3 ps-4" data-form-index="<%= form_index %>" style="<%= 'display: none;' unless srek_checked %>">
<% srek_category_configs = conference.proposal_item_configs.where(label: 'srek_category') %>
<% srek_category_first = srek_category_configs.first %>
<% srek_existing_category = sponsor_session.proposal_items.find_by(label: 'srek_category')&.params %>

<div class="mb-3">
<%= label_tag "sponsor_session_proposal_items_attributes_srek_categories", srek_category_first.item_name, {class: 'form-check-label'} %>*
<%= select_tag "sponsor_session[proposal_items_attributes][srek_categories]",
options_for_select([['選択してください', '']] + srek_category_configs.map { |item| [item.params, item.id] }, srek_existing_category),
{ class: 'form-control srek-category-select' } %>
</div>

<% srek_visitor_configs = conference.proposal_item_configs.where(label: 'srek_assumed_visitor') %>
<% srek_visitor_first = srek_visitor_configs.first %>
<% srek_existing_visitors = sponsor_session.proposal_items.find_by(label: 'srek_assumed_visitor')&.params || [] %>

<div class="mb-2">
<%= label_tag "sponsor_session_proposal_items_attributes_srek_assumed_visitors", srek_visitor_first.item_name, {class: 'form-check-label'} %>*
</div>
<div class="form-check">
<% srek_visitor_configs.each do |item| %>
<% checked = srek_existing_visitors.include?(item.id.to_s) %>
<%= check_box_tag "sponsor_session[proposal_items_attributes][srek_assumed_visitors][]", item.id, checked, {class: 'form-check-input srek-visitor-checkbox', id: "srek_assumed_visitor_#{item.id}_#{form_index}"} %>
<%= label_tag "srek_assumed_visitor_#{item.id}_#{form_index}", item.params, {class: 'form-check-label'} %><br>
<% end %>
</div>
</div>
</div>
<% end %>
</div>
<% end %>
<%= f.hidden_field :sponsor_id, value: sponsor.id %>
<%= f.hidden_field :conference_id, value: conference.id %>
</div>
Expand All @@ -63,4 +219,4 @@
<%= f.submit "スポンサーセッションを更新する" %>
<% end %>
</div>
<% end %>
<% end %>
Loading