defmodule PhoenixKitProjects do @moduledoc """ Projects module for PhoenixKit. Provides a reusable task library, projects that pull tasks in as assignments (with team/department/person assignees), and task dependency chains within each project. """ use PhoenixKit.Module alias PhoenixKit.Dashboard.Tab alias PhoenixKit.Settings @impl PhoenixKit.Module def module_key, do: "projects" @impl PhoenixKit.Module def module_name, do: "Projects" @impl PhoenixKit.Module def enabled? do Settings.get_boolean_setting("projects_enabled", false) rescue _ -> false catch :exit, _ -> false end @impl PhoenixKit.Module def enable_system do Settings.update_boolean_setting_with_module("projects_enabled", true, module_key()) end @impl PhoenixKit.Module def disable_system do Settings.update_boolean_setting_with_module("projects_enabled", false, module_key()) end @impl PhoenixKit.Module def version, do: "0.8.0" @impl PhoenixKit.Module def permission_metadata do %{ key: module_key(), label: "Projects", icon: "hero-clipboard-document-list", description: "Manage projects, tasks, and assignments" } end @impl PhoenixKit.Module def css_sources, do: [:phoenix_kit_projects] @impl PhoenixKit.Module def admin_tabs do parent = [ %Tab{ id: :admin_projects, label: "Projects", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-clipboard-document-list", path: "projects", priority: 660, level: :admin, permission: module_key(), match: :prefix, group: :admin_modules, subtab_display: :when_active, highlight_with_subtabs: false, live_view: {PhoenixKitProjects.Web.OverviewLive, :index} } ] visible_subtabs = [ %Tab{ id: :admin_projects_overview, label: "Overview", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-home", path: "projects", priority: 661, level: :admin, permission: module_key(), match: :exact, parent: :admin_projects, live_view: {PhoenixKitProjects.Web.OverviewLive, :index} }, %Tab{ id: :admin_projects_templates, label: "Templates", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-document-duplicate", path: "projects/templates", priority: 662, level: :admin, permission: module_key(), match: :prefix, parent: :admin_projects, live_view: {PhoenixKitProjects.Web.TemplatesLive, :index} }, %Tab{ id: :admin_projects_tasks, label: "Tasks", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-rectangle-stack", path: "projects/tasks", priority: 663, level: :admin, permission: module_key(), match: :prefix, parent: :admin_projects, live_view: {PhoenixKitProjects.Web.TasksLive, :index} }, %Tab{ id: :admin_projects_list, label: "Projects", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-clipboard-document-list", path: "projects/list", priority: 664, level: :admin, permission: module_key(), match: :prefix, parent: :admin_projects, live_view: {PhoenixKitProjects.Web.ProjectsLive, :index} } ] hidden_subtabs = [ %Tab{ id: :admin_projects_task_new, label: "New Task", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/tasks/new", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.TaskFormLive, :new} }, %Tab{ id: :admin_projects_task_edit, label: "Edit Task", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/tasks/:id/edit", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.TaskFormLive, :edit} }, %Tab{ id: :admin_projects_project_new, label: "New Project", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/list/new", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.ProjectFormLive, :new} }, %Tab{ id: :admin_projects_project_edit, label: "Edit Project", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/list/:id/edit", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.ProjectFormLive, :edit} }, %Tab{ id: :admin_projects_project_show, label: "Project", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/list/:id", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.ProjectShowLive, :show} }, %Tab{ id: :admin_projects_template_new, label: "New Template", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/templates/new", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.TemplateFormLive, :new} }, %Tab{ id: :admin_projects_template_edit, label: "Edit Template", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/templates/:id/edit", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.TemplateFormLive, :edit} }, %Tab{ id: :admin_projects_template_show, label: "Template", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/templates/:id", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.ProjectShowLive, :show_template} }, %Tab{ id: :admin_projects_assignment_new, label: "Add Task", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/list/:project_id/assignments/new", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.AssignmentFormLive, :new} }, %Tab{ id: :admin_projects_assignment_edit, label: "Edit Assignment", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", path: "projects/list/:project_id/assignments/:id/edit", level: :admin, permission: module_key(), parent: :admin_projects, visible: false, live_view: {PhoenixKitProjects.Web.AssignmentFormLive, :edit} } ] parent ++ visible_subtabs ++ hidden_subtabs end @impl PhoenixKit.Module def settings_tabs do [ Tab.new!( id: :admin_settings_projects, label: "Projects", gettext_backend: PhoenixKitProjects.Gettext, gettext_domain: "default", icon: "hero-clipboard-document-list", path: "projects", priority: 930, level: :admin, parent: :admin_settings, permission: module_key(), live_view: {PhoenixKitProjects.Web.ProjectsSettingsLive, :settings} ) ] end end