1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# frozen_string_literal: true

require "phlex"

require_relative "../layout"
require_relative "../axis_tags"

module RankKing
  module Views
    module ListViews
      class New < Phlex::HTML
        def initialize(sources:, csrf:)
          @sources = sources
          @csrf = csrf
        end

        def view_template
          render Layout.new(title: "New list — Rank King") do
            render PageHeader.new(title: "New list", back: "/", back_label: "Lists")

            form(method: "post", action: "/lists") do
              input(type: "hidden", name: "_csrf", value: @csrf.call("/lists"))

              label(class: "field") do
                plain "Name"
                input(type: "text", name: "name", required: true, autofocus: true)
              end

              label(class: "field") do
                plain "Source"
                select(name: "source") do
                  @sources.each do |kind, title, _fields|
                    option(value: kind) { title }
                  end
                end
                small { "A list keeps its source." }
              end

              # Each source's own fields. Only the chosen source's are
              # enabled, so only they are checked and posted; app.js
              # switches them when the dropdown changes.
              @sources.each.with_index do |(kind, _title, fields), index|
                fieldset(data_source: kind, disabled: index > 0, hidden: index > 0) { render fields }
              end

              render AxisTags.new

              footer do
                button(type: "submit", data_variant: "primary") { "Create list" }
              end
            end
          end
        end
      end
    end
  end
end