diff --git a/CHANGELOG.md b/CHANGELOG.md index a45cb1a3..439ee5e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ +## [v1.34.0](https://github.com/wanderer-industries/wanderer/compare/v1.33.1...v1.34.0) (2025-01-07) + + + + +### Features: + +* Map: api to allow systematic access to visible systems and tracked characters (#89) + +* add limited api for system and tracked characters + ## [v1.33.1](https://github.com/wanderer-industries/wanderer/compare/v1.33.0...v1.33.1) (2025-01-07) diff --git a/assets/js/hooks/Mapper/components/contexts/ContextMenuSystem/useContextMenuSystemHandlers.ts b/assets/js/hooks/Mapper/components/contexts/ContextMenuSystem/useContextMenuSystemHandlers.ts index ba1538ea..3c7e21a7 100644 --- a/assets/js/hooks/Mapper/components/contexts/ContextMenuSystem/useContextMenuSystemHandlers.ts +++ b/assets/js/hooks/Mapper/components/contexts/ContextMenuSystem/useContextMenuSystemHandlers.ts @@ -88,6 +88,23 @@ export const useContextMenuSystemHandlers = ({ systems, hubs, outCommand }: UseC setSystem(undefined); }, []); + const onSystemTemporaryName = useCallback((temporaryName?: string) => { + const { system, outCommand } = ref.current; + if (!system) { + return; + } + + outCommand({ + type: OutCommand.updateSystemTemporaryName, + data: { + system_id: system, + value: temporaryName ?? '', + }, + }); + setSystem(undefined); + }, []); + + const onSystemStatus = useCallback((status: number) => { const { system, outCommand } = ref.current; if (!system) { @@ -161,6 +178,7 @@ export const useContextMenuSystemHandlers = ({ systems, hubs, outCommand }: UseC onLockToggle, onHubToggle, onSystemTag, + onSystemTemporaryName, onSystemStatus, onSystemLabels, onOpenSettings, diff --git a/assets/js/hooks/Mapper/components/map/components/SolarSystemNode/SolarSystemNode.tsx b/assets/js/hooks/Mapper/components/map/components/SolarSystemNode/SolarSystemNode.tsx index 3e641c83..9786348a 100644 --- a/assets/js/hooks/Mapper/components/map/components/SolarSystemNode/SolarSystemNode.tsx +++ b/assets/js/hooks/Mapper/components/map/components/SolarSystemNode/SolarSystemNode.tsx @@ -4,6 +4,8 @@ import { MapSolarSystemType } from '../../map.types'; import classes from './SolarSystemNode.module.scss'; import clsx from 'clsx'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { useMapGetOption } from '@/hooks/Mapper/mapRootProvider/hooks/api'; + import { EFFECT_BACKGROUND_STYLES, @@ -56,6 +58,8 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps { if (!isShowUnsplashedSignatures) { return [[], []]; @@ -205,7 +212,7 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps - {solar_system_name} + {systemName} {isWormhole && ( diff --git a/assets/js/hooks/Mapper/components/mapInterface/components/SystemSettingsDialog/SystemSettingsDialog.tsx b/assets/js/hooks/Mapper/components/mapInterface/components/SystemSettingsDialog/SystemSettingsDialog.tsx index 439f31f1..d8da0e45 100644 --- a/assets/js/hooks/Mapper/components/mapInterface/components/SystemSettingsDialog/SystemSettingsDialog.tsx +++ b/assets/js/hooks/Mapper/components/mapInterface/components/SystemSettingsDialog/SystemSettingsDialog.tsx @@ -3,6 +3,7 @@ import { InputTextarea } from 'primereact/inputtextarea'; import { Dialog } from 'primereact/dialog'; import { getSystemById } from '@/hooks/Mapper/helpers'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; +import { useMapGetOption } from '@/hooks/Mapper/mapRootProvider/hooks/api'; import { useCallback, useEffect, useRef, useState } from 'react'; import { Button } from 'primereact/button'; import { OutCommand } from '@/hooks/Mapper/types'; @@ -22,10 +23,15 @@ export const SystemSettingsDialog = ({ systemId, visible, setVisible }: SystemSe outCommand, } = useMapRootState(); + const isTempSystemNameEnabled = useMapGetOption('show_temp_system_name') === 'true'; + + const system = getSystemById(systems, systemId); + const [name, setName] = useState(''); const [label, setLabel] = useState(''); + const [temporaryName, setTemporaryName] = useState('') const [description, setDescription] = useState(''); const inputRef = useRef(); @@ -38,14 +44,15 @@ export const SystemSettingsDialog = ({ systemId, visible, setVisible }: SystemSe setName(system.name || ''); setLabel(labels.customLabel); + setTemporaryName(system.temporary_name || ''); setDescription(system.description || ''); }, [system]); - const ref = useRef({ name, description, label, outCommand, systemId, system }); - ref.current = { name, description, label, outCommand, systemId, system }; + const ref = useRef({ name, description, temporaryName, label, outCommand, systemId, system }); + ref.current = { name, description, label, temporaryName, outCommand, systemId, system }; const handleSave = useCallback(() => { - const { name, description, label, outCommand, systemId, system } = ref.current; + const { name, description, label, temporaryName, outCommand, systemId, system } = ref.current; const outLabel = new LabelsManager(system?.labels ?? ''); outLabel.updateCustomLabel(label); @@ -58,6 +65,14 @@ export const SystemSettingsDialog = ({ systemId, visible, setVisible }: SystemSe }, }); + outCommand({ + type: OutCommand.updateSystemTemporaryName, + data: { + system_id: systemId, + value: temporaryName, + }, + }); + outCommand({ type: OutCommand.updateSystemName, data: { @@ -167,6 +182,35 @@ export const SystemSettingsDialog = ({ systemId, visible, setVisible }: SystemSe + {isTempSystemNameEnabled && +
+ + + + {temporaryName !== '' && ( + setTemporaryName('')} + /> + )} + setTemporaryName(e.target.value)} + /> + +
+ } +
map_pid! |> GenServer.cast({&Impl.update_system_tag/2, [update]}) + def update_system_temporary_name(map_id, update) when is_binary(map_id), + do: + map_id + |> map_pid! + |> GenServer.cast({&Impl.update_system_temporary_name/2, [update]}) + def update_system_locked(map_id, update) when is_binary(map_id), do: map_id diff --git a/lib/wanderer_app/map/map_server_impl.ex b/lib/wanderer_app/map/map_server_impl.ex index b06edd85..558e5a23 100644 --- a/lib/wanderer_app/map/map_server_impl.ex +++ b/lib/wanderer_app/map/map_server_impl.ex @@ -150,6 +150,8 @@ defmodule WandererApp.Map.Server.Impl do defdelegate update_system_tag(state, update), to: SystemsImpl + defdelegate update_system_temporary_name(state, update), to: SystemsImpl + defdelegate update_system_locked(state, update), to: SystemsImpl defdelegate update_system_labels(state, update), to: SystemsImpl @@ -320,6 +322,8 @@ defmodule WandererApp.Map.Server.Impl do layout: options |> Map.get("layout", "left_to_right"), store_custom_labels: options |> Map.get("store_custom_labels", "false") |> String.to_existing_atom(), + show_temp_system_name: + options |> Map.get("show_temp_system_name", "false") |> String.to_existing_atom(), restrict_offline_showing: options |> Map.get("restrict_offline_showing", "false") |> String.to_existing_atom() ] @@ -427,7 +431,8 @@ defmodule WandererApp.Map.Server.Impl do "name" => name, "position" => %{"x" => x, "y" => y}, "status" => status, - "tag" => tag + "tag" => tag, + "temporary_name" => temporary_name, } = _system, acc -> acc @@ -446,6 +451,7 @@ defmodule WandererApp.Map.Server.Impl do }) |> update_system_status(%{solar_system_id: id |> String.to_integer(), status: status}) |> update_system_tag(%{solar_system_id: id |> String.to_integer(), tag: tag}) + |> update_system_temporary_name(%{solar_system_id: id |> String.to_integer(), temporary_name: temporary_name}) |> update_system_locked(%{solar_system_id: id |> String.to_integer(), locked: locked}) |> update_system_labels(%{solar_system_id: id |> String.to_integer(), labels: labels}) end) diff --git a/lib/wanderer_app/map/server/map_server_systems_impl.ex b/lib/wanderer_app/map/server/map_server_systems_impl.ex index 6886f27f..da0f45b0 100644 --- a/lib/wanderer_app/map/server/map_server_systems_impl.ex +++ b/lib/wanderer_app/map/server/map_server_systems_impl.ex @@ -122,6 +122,13 @@ defmodule WandererApp.Map.Server.SystemsImpl do ), do: state |> update_system(:update_tag, [:tag], update) + def update_system_temporary_name( + state, + update + ) do + state |> update_system(:update_temporary_name, [:temporary_name], update) + end + def update_system_locked( state, update @@ -286,6 +293,7 @@ defmodule WandererApp.Map.Server.SystemsImpl do |> WandererApp.MapSystemRepo.cleanup_labels!(map_opts) |> WandererApp.MapSystemRepo.update_visible!(%{visible: true}) |> WandererApp.MapSystemRepo.cleanup_tags() + |> WandererApp.MapSystemRepo.cleanup_temporary_name() @ddrt.insert( {existing_system.solar_system_id, @@ -404,6 +412,7 @@ defmodule WandererApp.Map.Server.SystemsImpl do |> WandererApp.MapSystemRepo.update_position!(%{position_x: x, position_y: y}) |> WandererApp.MapSystemRepo.cleanup_labels!(map_opts) |> WandererApp.MapSystemRepo.cleanup_tags!() + |> WandererApp.MapSystemRepo.cleanup_temporary_name!() |> WandererApp.MapSystemRepo.update_visible(%{visible: true}) end diff --git a/lib/wanderer_app/repositories/map_repo.ex b/lib/wanderer_app/repositories/map_repo.ex index 247f18a4..0bf84403 100644 --- a/lib/wanderer_app/repositories/map_repo.ex +++ b/lib/wanderer_app/repositories/map_repo.ex @@ -4,6 +4,7 @@ defmodule WandererApp.MapRepo do @default_map_options %{ "layout" => "left_to_right", "store_custom_labels" => "false", + "show_temp_system_name" => "false", "restrict_offline_showing" => "false" } diff --git a/lib/wanderer_app/repositories/map_system_repo.ex b/lib/wanderer_app/repositories/map_system_repo.ex index d382cfaf..e2626c97 100644 --- a/lib/wanderer_app/repositories/map_system_repo.ex +++ b/lib/wanderer_app/repositories/map_system_repo.ex @@ -61,6 +61,20 @@ defmodule WandererApp.MapSystemRepo do }) end + def cleanup_temporary_name(system) do + system + |> WandererApp.Api.MapSystem.update_temporary_name(%{ + temporary_name: nil + }) + end + + def cleanup_temporary_name!(system) do + system + |> WandererApp.Api.MapSystem.update_temporary_name!(%{ + temporary_name: nil + }) + end + def get_filtered_labels(labels, true) when is_binary(labels) do labels |> Jason.decode!() @@ -101,6 +115,11 @@ defmodule WandererApp.MapSystemRepo do system |> WandererApp.Api.MapSystem.update_tag(update) + def update_temporary_name(system, update) do + system + |> WandererApp.Api.MapSystem.update_temporary_name(update) + end + def update_labels(system, update), do: system diff --git a/lib/wanderer_app_web/controllers/api_controller.ex b/lib/wanderer_app_web/controllers/api_controller.ex index 586e834f..060f64f3 100644 --- a/lib/wanderer_app_web/controllers/api_controller.ex +++ b/lib/wanderer_app_web/controllers/api_controller.ex @@ -217,6 +217,7 @@ end solar_system_id: system.solar_system_id, name: system.name, custom_name: system.custom_name, + temporary_name: system.temporary_name, description: system.description, tag: system.tag, labels: system.labels, diff --git a/lib/wanderer_app_web/live/maps/event_handlers/map_systems_event_handler.ex b/lib/wanderer_app_web/live/maps/event_handlers/map_systems_event_handler.ex index 1be0a107..0b000b9e 100644 --- a/lib/wanderer_app_web/live/maps/event_handlers/map_systems_event_handler.ex +++ b/lib/wanderer_app_web/live/maps/event_handlers/map_systems_event_handler.ex @@ -231,6 +231,7 @@ defmodule WandererAppWeb.MapSystemsEventHandler do "labels" -> :update_system_labels "locked" -> :update_system_locked "tag" -> :update_system_tag + "temporary_name" -> :update_system_temporary_name "status" -> :update_system_status _ -> nil end @@ -242,6 +243,7 @@ defmodule WandererAppWeb.MapSystemsEventHandler do "labels" -> :labels "locked" -> :locked "tag" -> :tag + "temporary_name" -> :temporary_name "status" -> :status _ -> :none end diff --git a/lib/wanderer_app_web/live/maps/map_event_handler.ex b/lib/wanderer_app_web/live/maps/map_event_handler.ex index f56950f7..3db38c13 100644 --- a/lib/wanderer_app_web/live/maps/map_event_handler.ex +++ b/lib/wanderer_app_web/live/maps/map_event_handler.ex @@ -50,6 +50,7 @@ defmodule WandererAppWeb.MapEventHandler do "update_system_labels", "update_system_locked", "update_system_tag", + "update_system_temporary_name", "update_system_status" ] @@ -244,6 +245,7 @@ defmodule WandererAppWeb.MapEventHandler do locked: locked, tag: tag, labels: labels, + temporary_name: temporary_name, status: status, visible: visible } = _system, @@ -269,6 +271,7 @@ defmodule WandererAppWeb.MapEventHandler do locked: locked, status: status, tag: tag, + temporary_name: temporary_name, visible: visible } end diff --git a/lib/wanderer_app_web/live/maps/maps_live.ex b/lib/wanderer_app_web/live/maps/maps_live.ex index b51de0a8..4a08ce9d 100644 --- a/lib/wanderer_app_web/live/maps/maps_live.ex +++ b/lib/wanderer_app_web/live/maps/maps_live.ex @@ -682,7 +682,12 @@ defmodule WandererAppWeb.MapsLive do ) do options = options_form - |> Map.take(["layout", "store_custom_labels", "restrict_offline_showing"]) + |> Map.take([ + "layout", + "store_custom_labels", + "show_temp_system_name", + "restrict_offline_showing" + ]) {:ok, updated_map} = WandererApp.MapRepo.update_options(map, options) diff --git a/lib/wanderer_app_web/live/maps/maps_live.html.heex b/lib/wanderer_app_web/live/maps/maps_live.html.heex index 22821424..145cca16 100644 --- a/lib/wanderer_app_web/live/maps/maps_live.html.heex +++ b/lib/wanderer_app_web/live/maps/maps_live.html.heex @@ -371,6 +371,11 @@ field={f[:store_custom_labels]} label="Store system custom labels" /> + <.input + type="checkbox" + field={f[:show_temp_system_name]} + label="Allow Temporary System Names" + /> <.input type="checkbox" field={f[:restrict_offline_showing]} diff --git a/mix.exs b/mix.exs index cf2c5e99..23a01f73 100644 --- a/mix.exs +++ b/mix.exs @@ -2,7 +2,7 @@ defmodule WandererApp.MixProject do use Mix.Project @source_url "https://github.com/wanderer-industries/wanderer" - @version "1.33.1" + @version "1.34.0" def project do [ diff --git a/priv/repo/migrations/20250103005559_add_temporary_name.exs b/priv/repo/migrations/20250103005559_add_temporary_name.exs new file mode 100644 index 00000000..3ce25fed --- /dev/null +++ b/priv/repo/migrations/20250103005559_add_temporary_name.exs @@ -0,0 +1,21 @@ +defmodule WandererApp.Repo.Migrations.AddTemporaryName do + @moduledoc """ + Updates resources based on their most recent snapshots. + + This file was autogenerated with `mix ash_postgres.generate_migrations` + """ + + use Ecto.Migration + + def up do + alter table(:map_system_v1) do + add :temporary_name, :text + end + end + + def down do + alter table(:map_system_v1) do + remove :temporary_name + end + end +end