|
| 1 | +defmodule ManyWeb.InputHelpers do |
| 2 | + use Phoenix.HTML |
| 3 | + |
| 4 | + def array_input(form, field, attr \\ []) do |
| 5 | + default_attr = [ |
| 6 | + count: 1 |
| 7 | + ] |
| 8 | + |
| 9 | + merged_attr = attr ++ default_attr |
| 10 | + count = merged_attr[:count] |
| 11 | + values = [Phoenix.HTML.Form.input_value(form, field)] || [] |
| 12 | + |
| 13 | + values = |
| 14 | + if Enum.count(values) >= count, |
| 15 | + do: values, |
| 16 | + else: List.duplicate("", count - Enum.count(values)) ++ values |
| 17 | + |
| 18 | + id = Phoenix.HTML.Form.input_id(form, field) |
| 19 | + |
| 20 | + content_tag :ol, |
| 21 | + id: container_id(id), |
| 22 | + class: "input_container", |
| 23 | + data: [index: Enum.count(values)] do |
| 24 | + values |
| 25 | + |> Enum.with_index() |
| 26 | + |> Enum.map(fn {value, index} -> |
| 27 | + form_elements(form, field, value, index) |
| 28 | + end) |
| 29 | + end |
| 30 | + end |
| 31 | + |
| 32 | + def array_add_button(form, field) do |
| 33 | + id = Phoenix.HTML.Form.input_id(form, field) |
| 34 | + # {:safe, content} |
| 35 | + content = |
| 36 | + form_elements(form, field, "", "__name__") |
| 37 | + |> safe_to_string |
| 38 | + |
| 39 | + # |> html_escape |
| 40 | + data = [ |
| 41 | + prototype: content, |
| 42 | + container: container_id(id) |
| 43 | + ] |
| 44 | + |
| 45 | + link("Add", to: "#", data: data, class: "add-form-field") |
| 46 | + end |
| 47 | + |
| 48 | + defp form_elements(form, field, value, index) do |
| 49 | + type = Phoenix.HTML.Form.input_type(form, field) |
| 50 | + id = Phoenix.HTML.Form.input_id(form, field) |
| 51 | + new_id = id <> "_#{index}" |
| 52 | + |
| 53 | + input_opts = [ |
| 54 | + name: new_field_name(form, field, index), |
| 55 | + value: value, |
| 56 | + id: new_id, |
| 57 | + class: "form-control" |
| 58 | + ] |
| 59 | + |
| 60 | + content_tag :li do |
| 61 | + [ |
| 62 | + apply(Phoenix.HTML.Form, type, [form, field, input_opts]), |
| 63 | + link("Remove", to: "#", data: [id: new_id], title: "Remove", class: "remove-form-field") |
| 64 | + ] |
| 65 | + end |
| 66 | + end |
| 67 | + |
| 68 | + defp container_id(id), do: id <> "_container" |
| 69 | + |
| 70 | + defp new_field_name(form, field, index) do |
| 71 | + name = form.name |> String.slice(0..-4) |
| 72 | + "#{name}[#{index}][#{field}]" |
| 73 | + |
| 74 | + # Phoenix.HTML.Form.input_name(form, field) <> "[]" |
| 75 | + end |
| 76 | +end |
0 commit comments