defmodule MoonWeb.Schema.Link do @moduledoc "Some menu links listing to be used inside the site" defstruct name: nil, key: nil, icon: nil # TODO: add Old Components pages if needed. Add Homepage. def pages() do [ [MoonWeb.Pages.VisionPage, icon: "generic_loyalty"], [MoonWeb.Pages.GettingStartedPage, icon: "other_rocket"], [MoonWeb.Pages.HowToContributePage, icon: "other_lifebuoy"], [MoonWeb.Pages.ColoursPage, icon: "software_settings"], [MoonWeb.Pages.TokensPage, icon: "software_puzzle"], [MoonWeb.Pages.TypographyPage, icon: "text_size"], [MoonWeb.Pages.ComponentsPage, icon: "software_plate"], [MoonWeb.Pages.ManifestPage, icon: "generic_trophy"], MoonWeb.Pages.Design.AccordionPage, MoonWeb.Pages.Design.AlertPage, MoonWeb.Pages.Design.AvatarPage, MoonWeb.Pages.Design.BottomSheetPage, MoonWeb.Pages.Design.BreadcrumbPage, MoonWeb.Pages.Design.Button.ButtonPage, MoonWeb.Pages.Design.Button.IconButtonPage, MoonWeb.Pages.Design.CarouselPage, MoonWeb.Pages.Design.ChipPage, MoonWeb.Pages.Design.DrawerPage, MoonWeb.Pages.Design.DropdownPage, MoonWeb.Pages.Components.IconsPage, MoonWeb.Pages.Design.LoaderPage, MoonWeb.Pages.Design.MenuItemPage, MoonWeb.Pages.Design.ModalPage, MoonWeb.Pages.Design.PaginationPage, MoonWeb.Pages.Design.PopoverPage, MoonWeb.Pages.Design.Progress.LinearProgressPage, MoonWeb.Pages.Design.Progress.CircularProgressPage, MoonWeb.Pages.Design.SearchPage, MoonWeb.Pages.Design.SnackbarPage, MoonWeb.Pages.Design.SwitchPage, MoonWeb.Pages.Design.TablePage, MoonWeb.Pages.Design.TabsPage, MoonWeb.Pages.Design.TagPage, MoonWeb.Pages.Design.TooltipPage, MoonWeb.Pages.Design.Form.AuthCodePage, MoonWeb.Pages.Design.Form.CheckboxPage, MoonWeb.Pages.Design.Form.ComboboxPage, MoonWeb.Pages.Design.Form.GroupPage, MoonWeb.Pages.Design.Form.InputPage, MoonWeb.Pages.Design.Form.InsetInputPage, MoonWeb.Pages.Design.Form.RadioPage, MoonWeb.Pages.Design.Form.SelectPage, MoonWeb.Pages.Design.Form.TextAreaPage ] end @doc "returns flat list of pages - for search purposes" def titles() do pages() |> Enum.map(fn [page | rest] -> [{:page, page}, {:key, page_to_title(page)} | rest] page -> [page: page, key: page_to_title(page)] end) end @doc "returns structured list of pages - for menu" def menu() do items = titles() items_with_icon = Enum.filter(items, fn item -> item[:icon] != nil end) items_without_icon = Enum.filter(items, fn item -> item[:icon] == nil end) sorted_items_without_icon = items_without_icon |> Enum.reduce(%{}, fn item, acc -> group = get_group(item[:page]) acc |> Map.update(group, [item], &(&1 ++ [item])) end) |> Enum.map(fn {key, value} -> if length(value) == 1 do List.first(value) else [key: group_to_title(key), children: value] end end) |> Enum.sort_by(& &1[:key]) sorted_items_without_icon ++ items_with_icon end defp get_group(page) do page |> to_string() |> String.split(".") |> Enum.slice(0..4) |> Enum.join(".") end defp page_to_title(page) do page |> to_string() |> String.replace(~r/.*\.([a-zA-Z]*)Page/, "\\1") |> String.replace(~r/([a-z])([A-Z])/, "\\1 \\2") end defp group_to_title(group) do group |> to_string() |> String.split(".") |> List.last() end end