Packages

phoenix_kit

1.7.66
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
phoenix_kit lib modules posts web groups.ex
Raw

lib/modules/posts/web/groups.ex

defmodule PhoenixKitWeb.Live.Modules.Posts.Groups do
@moduledoc """
LiveView for managing user's post groups (collections).
Groups are user-specific collections for organizing posts (Pinterest-style).
Each user can create groups with unique slugs within their own collection.
## Features
- **Group Management**: Create, view, edit, delete groups
- **Post Organization**: See post count for each group
- **Search & Filter**: Find groups by name or description
- **Privacy Control**: Public/private group settings
- **Slug Management**: URL-friendly unique identifiers
## Route
This LiveView is mounted at `{prefix}/admin/posts/groups` and requires
appropriate permissions.
Note: `{prefix}` is your configured PhoenixKit URL prefix (default: `/phoenix_kit`).
"""
use PhoenixKitWeb, :live_view
require Logger
alias PhoenixKit.Modules.Posts
alias PhoenixKit.Settings
alias PhoenixKit.Utils.Routes
@impl true
def mount(_params, _session, socket) do
# Get current user
current_user = socket.assigns[:phoenix_kit_current_user]
# Get project title
project_title = Settings.get_project_title()
# Check if groups are enabled
allow_groups = Settings.get_setting("posts_allow_groups", "true") == "true"
if allow_groups do
socket =
socket
|> assign(:page_title, "Post Groups")
|> assign(:project_title, project_title)
|> assign(:current_user, current_user)
|> assign(:groups, [])
|> assign(:search_query, "")
|> assign(:loading, true)
|> load_groups()
{:ok, socket}
else
{:ok,
socket
|> put_flash(:error, "Groups feature is not enabled")
|> push_navigate(to: Routes.path("/admin/posts"))}
end
end
@impl true
def handle_event("search", %{"search" => %{"query" => query}}, socket) do
{:noreply,
socket
|> assign(:search_query, query)
|> load_groups()}
end
@impl true
def handle_event("clear_search", _params, socket) do
{:noreply,
socket
|> assign(:search_query, "")
|> load_groups()}
end
@impl true
def handle_event("view_group", %{"id" => group_uuid}, socket) do
{:noreply, push_navigate(socket, to: Routes.path("/admin/posts/groups/#{group_uuid}"))}
end
@impl true
def handle_event("edit_group", %{"id" => group_uuid}, socket) do
{:noreply, push_navigate(socket, to: Routes.path("/admin/posts/groups/#{group_uuid}/edit"))}
end
@impl true
def handle_event("delete_group", %{"id" => group_uuid}, socket) do
case Posts.get_group(group_uuid) do
nil ->
{:noreply, socket |> put_flash(:error, "Group not found")}
group ->
# Verify user owns this group
if group.user_uuid == socket.assigns.current_user.uuid do
case Posts.delete_group(group) do
{:ok, _} ->
{:noreply,
socket
|> put_flash(:info, "Group deleted successfully")
|> load_groups()}
{:error, _} ->
{:noreply, socket |> put_flash(:error, "Failed to delete group")}
end
else
{:noreply,
socket |> put_flash(:error, "You don't have permission to delete this group")}
end
end
end
@impl true
def handle_event("refresh", _params, socket) do
{:noreply,
socket
|> assign(:loading, true)
|> load_groups()
|> put_flash(:info, "Groups refreshed")}
end
## --- Private Helper Functions ---
defp load_groups(socket) do
opts = [
user_uuid: socket.assigns.current_user.uuid,
preload: [:posts]
]
# Add search filter if query is present
opts =
if socket.assigns.search_query != "" do
Keyword.put(opts, :search, socket.assigns.search_query)
else
opts
end
groups = Posts.list_user_groups(socket.assigns.current_user.uuid, opts)
socket
|> assign(:groups, groups)
|> assign(:loading, false)
end
defp format_visibility("public"), do: "Public"
defp format_visibility("private"), do: "Private"
defp format_visibility(_), do: "Unknown"
defp visibility_badge_class("public"), do: "badge-success"
defp visibility_badge_class("private"), do: "badge-warning"
defp visibility_badge_class(_), do: "badge-ghost"
end