Packages
phoenix_kit
1.7.49
1.7.210
1.7.209
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps β SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/phoenix_kit.gen.dashboard_tab.ex
defmodule Mix.Tasks.PhoenixKit.Gen.DashboardTab do
@moduledoc """
Igniter task that adds a tab to the user dashboard configuration.
## Usage
mix phoenix_kit.gen.dashboard_tab "Category Name" "Tab Title" --url="/dashboard/path"
## Arguments
- `category` - The category name (e.g., "Farm Management")
- `tab_title` - The display title for the tab
## Options
- `--url` - The URL path for the tab (required)
- `--icon` - Heroicon name for the tab (optional, defaults to "hero-document-text")
- `--description` - Brief description for the tab (optional)
- `--category-icon` - Heroicon name for the category (optional, defaults to "hero-folder"). Only used when creating a new category.
## Examples
# Add a History tab to Farm Management category
mix phoenix_kit.gen.dashboard_tab "Farm Management" "History" \\
--url="/dashboard/history" \\
--icon="hero-chart-bar" \\
--category-icon="hero-cube"
# Add a Settings tab to Account category
mix phoenix_kit.gen.dashboard_tab "Account" "Settings" \\
--url="/dashboard/settings" \\
--icon="hero-cog-6-tooth" \\
--description="Manage your account settings"
"""
@shortdoc "Adds a tab to the user dashboard configuration"
use Igniter.Mix.Task
alias PhoenixKit.Install.IgniterConfig
@impl Igniter.Mix.Task
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :phoenix_kit,
example:
"mix phoenix_kit.gen.dashboard_tab \"Farm Management\" \"History\" --url=\"/dashboard/history\" --icon=\"hero-chart-bar\"",
schema: [
url: :string,
icon: :string,
description: :string,
category_icon: :string
],
aliases: [u: :url, i: :icon, d: :description, ci: :category_icon]
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
# Get options and arguments from igniter context
opts = igniter.args.options
argv = igniter.args.argv
case parse_args(argv, opts) do
{:ok, {category, tab_title}} ->
igniter
|> add_dashboard_tab(category, tab_title, opts)
{:error, message} ->
Igniter.add_notice(igniter, """
β Error: #{message}
Usage: mix phoenix_kit.gen.dashboard_tab <category> <tab_title> --url=<url>
Example: mix phoenix_kit.gen.dashboard_tab "Farm Management" "History" --url="/dashboard/history"
""")
end
end
@impl Mix.Task
def run(argv) do
# Handle --help flag manually
if "--help" in argv or "-h" in argv do
Mix.shell().info("""
Adds a tab to the user dashboard configuration.
Usage:
mix phoenix_kit.gen.dashboard_tab "Category Name" "Tab Title" --url="/dashboard/path"
Arguments:
category - The category name (e.g., "Farm Management")
tab_title - The display title for the tab
Options:
--url - The URL path for the tab (required)
--icon - Heroicon name for the tab (optional, defaults to "hero-document-text")
--description - Brief description for the tab (optional)
--category-icon - Heroicon name for the category (optional, defaults to "hero-folder")
Examples:
# Add a History tab to Farm Management category
mix phoenix_kit.gen.dashboard_tab "Farm Management" "History" \\
--url="/dashboard/history" \\
--icon="hero-chart-bar" \\
--category-icon="hero-cube"
# Add a Settings tab to Account category
mix phoenix_kit.gen.dashboard_tab "Account" "Settings" \\
--url="/dashboard/settings" \\
--icon="hero-cog-6-tooth" \\
--description="Manage your account settings"
Notes:
- If the category doesn't exist, it will be created automatically
- Tabs are added to config/config.exs under :user_dashboard_categories
- The dashboard will automatically pick up the new tab after server restart
""")
:ok
else
# Delegate to Igniter.Mix.Task for standard execution
super(argv)
end
end
defp parse_args(argv, opts) do
# Filter out option arguments (starting with --) from argv
positional_args = Enum.reject(argv, &String.starts_with?(&1, "--"))
case positional_args do
[category, tab_title] ->
url = Keyword.get(opts, :url)
if url do
{:ok, {category, tab_title}}
else
{:error, "--url option is required"}
end
args when length(args) < 2 ->
{:error, "not enough arguments. Expected: <category> <tab_title>"}
_ ->
{:error, "invalid arguments"}
end
end
defp add_dashboard_tab(igniter, category, tab_title, opts) do
url = Keyword.get(opts, :url)
icon = Keyword.get(opts, :icon, "hero-document-text")
description = Keyword.get(opts, :description)
# Validate inputs
cond do
!url ->
Igniter.add_issue(igniter, {:fatal, "--url option is required", []})
!String.starts_with?(url, "/") ->
Igniter.add_issue(igniter, {:fatal, "URL must start with '/'", []})
byte_size(tab_title) > 100 ->
Igniter.add_issue(igniter, {:fatal, "Tab title must be less than 100 characters", []})
description && byte_size(description) > 200 ->
Igniter.add_issue(igniter, {:fatal, "Description must be less than 200 characters", []})
true ->
igniter
|> update_dashboard_categories_config(category, tab_title, url, icon, description, opts)
|> print_success_message(category, tab_title, url)
end
end
defp update_dashboard_categories_config(
igniter,
category,
tab_title,
url,
icon,
description,
opts
) do
new_tab = %{
title: tab_title,
url: url,
icon: icon,
description: description
}
# Get category icon from options or use default
category_icon = Keyword.get(opts, :category_icon, "hero-folder")
# Use IgniterConfig to add the tab to the category (creates category if needed)
IgniterConfig.add_to_user_dashboard_category(
igniter,
category,
new_tab,
icon: category_icon
)
end
defp print_success_message(igniter, category, tab_title, url) do
Igniter.add_notice(igniter, """
β
Dashboard tab added successfully!
Tab: #{tab_title}
Category: #{category}
URL: #{url}
What was done:
1. β Added tab to user dashboard configuration in config/config.exs
π Next Steps:
1. Create the LiveView for this tab (if not already created):
defmodule YourAppWeb.DashboardLive.#{camelize(tab_title)} do
use YourAppWeb, :live_view
def mount(_params, _session, socket) do
{:ok, socket}
end
def render(assigns) do
~H\"\"\"
<div>
<h1>#{tab_title}</h1>
<!-- Your content here -->
</div>
\"\"\"
end
end
2. Add the route to your router (inside a dashboard live_session):
live "#{url}", YourAppWeb.DashboardLive.#{camelize(tab_title)}, :index
3. Restart your server to see the new tab in the dashboard sidebar.
The tab will appear under the "#{category}" category in the user dashboard.
""")
end
defp camelize(string) do
string
|> String.replace(~r/[^a-zA-Z0-9]+/, "_")
|> Macro.camelize()
end
end