Compare commits

..

11 Commits

Author SHA1 Message Date
CI
169f23c2ca chore: release version v1.74.6
Some checks failed
Build / 🛠 Build (1.17, 18.x, 27) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/amd64) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/arm64) (push) Has been cancelled
Build / merge (push) Has been cancelled
Build / 🏷 Create Release (push) Has been cancelled
2025-07-09 14:33:43 +00:00
Dmitry Popov
81f70eafff chore: release version v1.74.5 2025-07-09 16:33:04 +02:00
CI
8b6f600989 chore: release version v1.74.5 2025-07-09 08:19:58 +00:00
Dmitry Popov
fe3617b39f Merge pull request #454 from wanderer-industries/gate-connections
fix(Map): Add background for Pochven's systems. Changed from Region n…
2025-07-09 12:19:32 +04:00
DanSylvest
7fb8d24d73 fix(Map): Add background for Pochven's systems. Changed from Region name to constellation name for pochven systems. Changed connection style for gates (display like common connection). Changed behaviour of connections. 2025-07-08 13:17:03 +03:00
CI
c317a8bff9 chore: release version v1.74.4
Some checks failed
Build / 🛠 Build (1.17, 18.x, 27) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/amd64) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/arm64) (push) Has been cancelled
Build / merge (push) Has been cancelled
Build / 🏷 Create Release (push) Has been cancelled
2025-07-07 13:59:56 +00:00
Dmitry Popov
618cca39a4 fix(Core): Fixed issue with update system positions 2025-07-07 15:59:23 +02:00
CI
4419c86164 chore: release version v1.74.3
Some checks failed
Build / 🛠 Build (1.17, 18.x, 27) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/amd64) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/arm64) (push) Has been cancelled
Build / merge (push) Has been cancelled
Build / 🏷 Create Release (push) Has been cancelled
2025-07-06 08:55:48 +00:00
Dmitry Popov
9848f49b49 fix(Core): Fixed issues with map subscription component 2025-07-06 10:55:21 +02:00
CI
4c23069a0a chore: release version v1.74.2
Some checks failed
Build / 🛠 Build (1.17, 18.x, 27) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/amd64) (push) Has been cancelled
Build / 🛠 Build Docker Images (linux/arm64) (push) Has been cancelled
Build / merge (push) Has been cancelled
Build / 🏷 Create Release (push) Has been cancelled
2025-06-30 16:37:22 +00:00
Dmitry Popov
4a1d7be44c fix(Core): Fixed map loading for not existing maps 2025-06-30 18:36:55 +02:00
25 changed files with 174 additions and 82 deletions

View File

@@ -2,6 +2,47 @@
<!-- changelog -->
## [v1.74.6](https://github.com/wanderer-industries/wanderer/compare/v1.74.5...v1.74.6) (2025-07-09)
## [v1.74.5](https://github.com/wanderer-industries/wanderer/compare/v1.74.4...v1.74.5) (2025-07-09)
### Bug Fixes:
* Map: Add background for Pochven's systems. Changed from Region name to constellation name for pochven systems. Changed connection style for gates (display like common connection). Changed behaviour of connections.
## [v1.74.4](https://github.com/wanderer-industries/wanderer/compare/v1.74.3...v1.74.4) (2025-07-07)
### Bug Fixes:
* Core: Fixed issue with update system positions
## [v1.74.3](https://github.com/wanderer-industries/wanderer/compare/v1.74.2...v1.74.3) (2025-07-06)
### Bug Fixes:
* Core: Fixed issues with map subscription component
## [v1.74.2](https://github.com/wanderer-industries/wanderer/compare/v1.74.1...v1.74.2) (2025-06-30)
### Bug Fixes:
* Core: Fixed map loading for not existing maps
## [v1.74.1](https://github.com/wanderer-industries/wanderer/compare/v1.74.0...v1.74.1) (2025-06-28)

View File

@@ -1,7 +1,7 @@
import { useMemo } from 'react';
import { useKillsCounter } from '../../hooks/useKillsCounter';
import { useKillsCounter } from '../../hooks/useKillsCounter.ts';
import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper';
import { WithChildren, WithClassName } from '@/hooks/Mapper/types/common';
import { WithChildren, WithClassName } from '@/hooks/Mapper/types/common.ts';
import {
KILLS_ROW_HEIGHT,
SystemKillsList,

View File

@@ -0,0 +1 @@
export * from './KillsCounter.tsx';

View File

@@ -3,11 +3,11 @@ import clsx from 'clsx';
import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper';
import { TooltipPosition } from '@/hooks/Mapper/components/ui-kit/WdTooltip';
import { CharItemProps, LocalCharactersList } from '../../../mapInterface/widgets/LocalCharacters/components';
import { useLocalCharactersItemTemplate } from '../../../mapInterface/widgets/LocalCharacters/hooks/useLocalCharacters';
import { useLocalCharacterWidgetSettings } from '../../../mapInterface/widgets/LocalCharacters/hooks/useLocalWidgetSettings';
import classes from './SolarSystemLocalCounter.module.scss';
import { useLocalCharactersItemTemplate } from '../../../mapInterface/widgets/LocalCharacters/hooks/useLocalCharacters.tsx';
import { useLocalCharacterWidgetSettings } from '../../../mapInterface/widgets/LocalCharacters/hooks/useLocalWidgetSettings.ts';
import { useTheme } from '@/hooks/Mapper/hooks/useTheme.ts';
import { AvailableThemes } from '@/hooks/Mapper/mapRootProvider/types.ts';
import classes from './LocalCounter.module.scss';
interface LocalCounterProps {
localCounterCharacters: Array<CharItemProps>;

View File

@@ -0,0 +1 @@
export * from './LocalCounter';

View File

@@ -1,7 +1,7 @@
import { useCallback, useMemo, useState } from 'react';
import classes from './SolarSystemEdge.module.scss';
import { EdgeLabelRenderer, EdgeProps, getBezierPath, getSmoothStepPath, Position, useStore } from 'reactflow';
import { EdgeLabelRenderer, EdgeProps, getBezierPath, Position, useStore } from 'reactflow';
import { getEdgeParams } from '@/hooks/Mapper/components/map/utils.ts';
import clsx from 'clsx';
import { ConnectionType, MassState, ShipSizeStatus, SolarSystemConnection, TimeStatus } from '@/hooks/Mapper/types';
@@ -51,11 +51,11 @@ export const SolarSystemEdge = ({ id, source, target, markerEnd, style, data }:
const [hovered, setHovered] = useState(false);
const [path, labelX, labelY, sx, sy, tx, ty, sourcePos, targetPos] = useMemo(() => {
const { sx, sy, tx, ty, sourcePos, targetPos } = getEdgeParams(sourceNode, targetNode);
const { sx, sy, tx, ty, sourcePos, targetPos } = getEdgeParams(sourceNode!, targetNode!);
const offset = isThickConnections ? MAP_OFFSETS_TICK[targetPos] : MAP_OFFSETS[targetPos];
const method = isWormhole ? getBezierPath : getSmoothStepPath;
const method = isWormhole ? getBezierPath : getBezierPath;
const [edgePath, labelX, labelY] = method({
sourceX: sx - offset.x,

View File

@@ -40,6 +40,7 @@ $neon-color-3: rgba(27, 132, 236, 0.40);
z-index: 3;
overflow: hidden;
&.Pochven,
&.Mataria,
&.Amarria,
&.Gallente,
@@ -95,6 +96,15 @@ $neon-color-3: rgba(27, 132, 236, 0.40);
}
}
&.Pochven {
&::after {
opacity: 0.8;
background-image: url('/images/pochven.webp');
background-position-x: 0;
background-position-y: -13px;
}
}
&.selected {
border-color: $pastel-pink;
box-shadow: 0 0 10px #9a1af1c2;

View File

@@ -12,11 +12,11 @@ import {
} from '@/hooks/Mapper/components/map/constants';
import { WormholeClassComp } from '@/hooks/Mapper/components/map/components/WormholeClassComp';
import { UnsplashedSignature } from '@/hooks/Mapper/components/map/components/UnsplashedSignature';
import { LocalCounter } from './SolarSystemLocalCounter';
import { KillsCounter } from './SolarSystemKillsCounter';
import { TooltipSize } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper/utils.ts';
import { TooltipPosition, WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit';
import { Tag } from 'primereact/tag';
import { LocalCounter } from '@/hooks/Mapper/components/map/components/LocalCounter';
import { KillsCounter } from '@/hooks/Mapper/components/map/components/KillsCounter';
// let render = 0;
export const SolarSystemNodeDefault = memo((props: NodeProps<MapSolarSystemType>) => {

View File

@@ -12,10 +12,10 @@ import {
} from '@/hooks/Mapper/components/map/constants';
import { WormholeClassComp } from '@/hooks/Mapper/components/map/components/WormholeClassComp';
import { UnsplashedSignature } from '@/hooks/Mapper/components/map/components/UnsplashedSignature';
import { LocalCounter } from './SolarSystemLocalCounter';
import { KillsCounter } from './SolarSystemKillsCounter';
import { TooltipPosition, WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit';
import { TooltipSize } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper/utils.ts';
import { LocalCounter } from '@/hooks/Mapper/components/map/components/LocalCounter';
import { KillsCounter } from '@/hooks/Mapper/components/map/components/KillsCounter';
// let render = 0;
export const SolarSystemNodeTheme = memo((props: NodeProps<MapSolarSystemType>) => {

View File

@@ -5,7 +5,7 @@ import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
import { useMapGetOption } from '@/hooks/Mapper/mapRootProvider/hooks/api';
import { useMapState } from '@/hooks/Mapper/components/map/MapProvider';
import { useDoubleClick } from '@/hooks/Mapper/hooks/useDoubleClick';
import { REGIONS_MAP, Spaces } from '@/hooks/Mapper/constants';
import { Regions, REGIONS_MAP, Spaces } from '@/hooks/Mapper/constants';
import { isWormholeSpace } from '@/hooks/Mapper/components/map/helpers/isWormholeSpace';
import { getSystemClassStyles } from '@/hooks/Mapper/components/map/helpers';
import { sortWHClasses } from '@/hooks/Mapper/helpers';
@@ -65,6 +65,7 @@ const SpaceToClass: Record<string, string> = {
[Spaces.Matar]: 'Mataria',
[Spaces.Amarr]: 'Amarria',
[Spaces.Gallente]: 'Gallente',
[Spaces.Pochven]: 'Pochven',
};
export function useLocalCounter(nodeVars: SolarSystemNodeVars) {
@@ -112,6 +113,7 @@ export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarS
region_id,
is_shattered,
solar_system_name,
constellation_name,
} = systemStaticInfo;
const { isShowUnsplashedSignatures } = interfaceSettings;
@@ -195,10 +197,18 @@ export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarS
const hubsAsStrings = useMemo(() => hubs.map(item => item.toString()), [hubs]);
const isRally = useMemo(
() => pings.find(x => x.solar_system_id === solar_system_id && x.type === PingType.Rally),
() => !!pings.find(x => x.solar_system_id === solar_system_id && x.type === PingType.Rally),
[pings, solar_system_id],
);
const regionName = useMemo(() => {
if (region_id === Regions.Pochven) {
return constellation_name;
}
return region_name;
}, [constellation_name, region_id, region_name]);
const nodeVars: SolarSystemNodeVars = {
id,
selected,
@@ -233,7 +243,7 @@ export const useSolarSystemNode = (props: NodeProps<MapSolarSystemType>): SolarS
isThickConnections,
classTitle: class_title,
temporaryName: computedTemporaryName,
regionName: region_name,
regionName,
solarSystemName: solar_system_name,
isRally,
};

View File

@@ -1,37 +1,48 @@
import { Position, internalsSymbol } from 'reactflow';
import { Position, internalsSymbol, Node } from 'reactflow';
// returns the position (top,right,bottom or right) passed node compared to
function getParams(nodeA, nodeB) {
type Coords = [number, number];
type CoordsWithPosition = [number, number, Position];
function segmentsIntersect(a1: number, a2: number, b1: number, b2: number): boolean {
const [minA, maxA] = a1 < a2 ? [a1, a2] : [a2, a1];
const [minB, maxB] = b1 < b2 ? [b1, b2] : [b2, b1];
return maxA >= minB && maxB >= minA;
}
function getParams(nodeA: Node, nodeB: Node): CoordsWithPosition {
const centerA = getNodeCenter(nodeA);
const centerB = getNodeCenter(nodeB);
const horizontalDiff = Math.abs(centerA.x - centerB.x);
const verticalDiff = Math.abs(centerA.y - centerB.y);
let position: Position;
// when the horizontal difference between the nodes is bigger, we use Position.Left or Position.Right for the handle
if (horizontalDiff > verticalDiff) {
position = centerA.x > centerB.x ? Position.Left : Position.Right;
} else {
// here the vertical difference between the nodes is bigger, so we use Position.Top or Position.Bottom for the handle
if (
segmentsIntersect(
nodeA.positionAbsolute!.x - 10,
nodeA.positionAbsolute!.x - 10 + nodeA.width! + 20,
nodeB.positionAbsolute!.x,
nodeB.positionAbsolute!.x + nodeB.width!,
)
) {
position = centerA.y > centerB.y ? Position.Top : Position.Bottom;
} else {
position = centerA.x > centerB.x ? Position.Left : Position.Right;
}
const [x, y] = getHandleCoordsByPosition(nodeA, position);
return [x, y, position];
}
function getHandleCoordsByPosition(node, handlePosition) {
// all handles are from type source, that's why we use handleBounds.source here
const handle = node[internalsSymbol].handleBounds.source.find(h => h.position === handlePosition);
function getHandleCoordsByPosition(node: Node, handlePosition: Position): Coords {
const handle = node[internalsSymbol]!.handleBounds!.source!.find(h => h.position === handlePosition);
if (!handle) {
throw new Error(`Handle with position ${handlePosition} not found on node ${node.id}`);
}
let offsetX = handle.width / 2;
let offsetY = handle.height / 2;
// this is a tiny detail to make the markerEnd of an edge visible.
// The handle position that gets calculated has the origin top-left, so depending which side we are using, we add a little offset
// when the handlePosition is Position.Right for example, we need to add an offset as big as the handle itself in order to get the correct position
switch (handlePosition) {
case Position.Left:
offsetX = 0;
@@ -47,21 +58,20 @@ function getHandleCoordsByPosition(node, handlePosition) {
break;
}
const x = node.positionAbsolute.x + handle.x + offsetX;
const y = node.positionAbsolute.y + handle.y + offsetY;
const x = node.positionAbsolute!.x + handle.x + offsetX;
const y = node.positionAbsolute!.y + handle.y + offsetY;
return [x, y];
}
function getNodeCenter(node) {
function getNodeCenter(node: Node): { x: number; y: number } {
return {
x: node.positionAbsolute.x + node.width / 2,
y: node.positionAbsolute.y + node.height / 2,
x: node.positionAbsolute!.x + node.width! / 2,
y: node.positionAbsolute!.y + node.height! / 2,
};
}
// returns the parameters (sx, sy, tx, ty, sourcePos, targetPos) you need to create an edge
export function getEdgeParams(source, target) {
export function getEdgeParams(source: Node, target: Node) {
const [sx, sy, sourcePos] = getParams(source, target);
const [tx, ty, targetPos] = getParams(target, source);

View File

@@ -33,6 +33,7 @@ export enum Regions {
Solitude = 10000044,
TashMurkon = 10000020,
VergeVendor = 10000068,
Pochven = 10000070,
}
export enum Spaces {
@@ -40,6 +41,7 @@ export enum Spaces {
'Gallente' = 'Gallente',
'Matar' = 'Matar',
'Amarr' = 'Amarr',
'Pochven' = 'Pochven',
}
export const REGIONS_MAP: Record<number, Spaces> = {
@@ -66,6 +68,7 @@ export const REGIONS_MAP: Record<number, Spaces> = {
[Regions.Solitude]: Spaces.Gallente,
[Regions.TashMurkon]: Spaces.Amarr,
[Regions.VergeVendor]: Spaces.Gallente,
[Regions.Pochven]: Spaces.Pochven,
};
export type K162Type = {

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

View File

@@ -84,9 +84,9 @@ map_subscription_base_price =
config_dir
|> get_int_from_path_or_env("WANDERER_MAP_SUBSCRIPTION_BASE_PRICE", 100_000_000)
map_subscription_extra_characters_100_price =
map_subscription_extra_characters_50_price =
config_dir
|> get_int_from_path_or_env("WANDERER_MAP_SUBSCRIPTION_EXTRA_CHARACTERS_100_PRICE", 50_000_000)
|> get_int_from_path_or_env("WANDERER_MAP_SUBSCRIPTION_EXTRA_CHARACTERS_50_PRICE", 50_000_000)
map_subscription_extra_hubs_10_price =
config_dir
@@ -167,7 +167,7 @@ config :wanderer_app,
month_12_discount: 0.5
}
],
extra_characters_100: map_subscription_extra_characters_100_price,
extra_characters_50: map_subscription_extra_characters_50_price,
extra_hubs_10: map_subscription_extra_hubs_10_price
}

View File

@@ -97,7 +97,7 @@ defmodule WandererApp.Map.SubscriptionManager do
) do
%{
plans: plans,
extra_characters_100: extra_characters_100,
extra_characters_50: extra_characters_50,
extra_hubs_10: extra_hubs_10
} = WandererApp.Env.subscription_settings()
@@ -113,7 +113,7 @@ defmodule WandererApp.Map.SubscriptionManager do
case characters_limit > plan_characters_limit do
true ->
estimated_price +
(characters_limit - plan_characters_limit) / 100 * extra_characters_100
(characters_limit - plan_characters_limit) / 50 * extra_characters_50
_ ->
estimated_price
@@ -153,7 +153,7 @@ defmodule WandererApp.Map.SubscriptionManager do
) do
%{
plans: plans,
extra_characters_100: extra_characters_100,
extra_characters_50: extra_characters_50,
extra_hubs_10: extra_hubs_10
} = WandererApp.Env.subscription_settings()
@@ -170,7 +170,7 @@ defmodule WandererApp.Map.SubscriptionManager do
case characters_limit > sub_characters_limit do
true ->
additional_price +
(characters_limit - sub_characters_limit) / 100 * extra_characters_100
(characters_limit - sub_characters_limit) / 50 * extra_characters_50
_ ->
additional_price

View File

@@ -88,8 +88,6 @@ defmodule WandererAppWeb.MapCharacters do
@impl true
def handle_event("undo", %{"event-data" => _event_data} = _params, socket) do
# notify_to(socket.assigns.notify_to, socket.assigns.event_name, map_slug)
{:noreply, socket}
end

View File

@@ -10,6 +10,8 @@ defmodule WandererAppWeb.MapSubscription do
socket =
socket
|> assign(title: "")
|> assign(status: :alpha)
|> assign(balance: 0)
{:ok, socket}
end
@@ -24,19 +26,20 @@ defmodule WandererAppWeb.MapSubscription do
) do
socket = handle_info_or_assign(socket, assigns)
{:ok, %{id: map_id} = map} =
WandererApp.MapRepo.get_by_slug_with_permissions(map_slug, current_user)
{:ok, %{plan: plan} = subscription} =
WandererApp.Map.SubscriptionManager.get_active_map_subscription(map_id)
{:ok, map_balance} = WandererApp.Map.SubscriptionManager.get_balance(map)
{:ok,
socket
|> assign(status: plan)
|> assign(title: get_title(subscription))
|> assign(balance: map_balance)}
with {:ok, %{id: map_id} = map} <-
WandererApp.MapRepo.get_by_slug_with_permissions(map_slug, current_user),
{:ok, %{plan: plan} = subscription} <-
WandererApp.Map.SubscriptionManager.get_active_map_subscription(map_id),
{:ok, map_balance} <- WandererApp.Map.SubscriptionManager.get_balance(map) do
{:ok,
socket
|> assign(status: plan)
|> assign(title: get_title(subscription))
|> assign(balance: map_balance)}
else
_error ->
{:ok, socket}
end
end
@impl true

View File

@@ -126,6 +126,14 @@ defmodule WandererAppWeb.MapCoreEventHandler do
|> assign(show_topup: true)
end
@impl true
def handle_server_event(
{_event, {:flash, type, message}},
socket
) do
socket |> put_flash(type, message)
end
def handle_server_event(event, socket) do
Logger.warning(fn -> "unhandled map core event: #{inspect(event)}" end)
socket

View File

@@ -7,8 +7,12 @@ defmodule WandererAppWeb.MapSystemsEventHandler do
def handle_server_event(%{event: :add_system, payload: system}, socket) do
# Schedule kill update for the new system after a short delay to allow subscription
Process.send_after(self(), %{event: :update_system_kills, payload: system.solar_system_id}, 2000)
Process.send_after(
self(),
%{event: :update_system_kills, payload: system.solar_system_id},
2000
)
socket
|> MapEventHandler.push_map_event("add_systems", [
MapEventHandler.map_ui_system(system)
@@ -319,7 +323,8 @@ defmodule WandererAppWeb.MapSystemsEventHandler do
defp update_system_position(map_id, %{
"position" => %{"x" => x, "y" => y},
"solar_system_id" => solar_system_id
}),
})
when not is_nil(x) and not is_nil(y) and not is_nil(solar_system_id),
do:
map_id
|> WandererApp.Map.Server.update_system_position(%{
@@ -327,4 +332,6 @@ defmodule WandererAppWeb.MapSystemsEventHandler do
position_x: x,
position_y: y
})
defp update_system_position(_map_id, _position), do: :ok
end

View File

@@ -31,8 +31,8 @@ defmodule WandererAppWeb.Maps.MapSubscriptionsComponent do
subscription_form = %{
"plan" => "omega",
"period" => "1",
"characters_limit" => "100",
"hubs_limit" => "10",
"characters_limit" => "50",
"hubs_limit" => "20",
"auto_renew?" => true
}
@@ -522,9 +522,9 @@ defmodule WandererAppWeb.Maps.MapSubscriptionsComponent do
label="Characters limit"
show_value={true}
type="range"
min="100"
min="50"
max="5000"
step="100"
step="50"
class="range range-xs"
/>
<.input

View File

@@ -515,19 +515,19 @@ defmodule WandererAppWeb.MapsLive do
{:ok, tmp_file_path}
end)
Task.async(fn ->
{:ok, data} =
WandererApp.Utils.JSONUtil.read_json(uploaded_file_path)
# Task.async(fn ->
# {:ok, data} =
# WandererApp.Utils.JSONUtil.read_json(uploaded_file_path)
WandererApp.Map.Manager.start_map(map_id)
# WandererApp.Map.Manager.start_map(map_id)
:timer.sleep(1000)
# :timer.sleep(1000)
map_id
|> WandererApp.Map.Server.import_settings(data, current_user.id)
# map_id
# |> WandererApp.Map.Server.import_settings(data, current_user.id)
:imported
end)
# :imported
# end)
{:noreply,
socket
@@ -543,7 +543,7 @@ defmodule WandererAppWeb.MapsLive do
selected_subscription
) do
%{
extra_characters_100: extra_characters_100,
extra_characters_50: extra_characters_50,
extra_hubs_10: extra_hubs_10
} = WandererApp.Env.subscription_settings()
@@ -558,7 +558,7 @@ defmodule WandererAppWeb.MapsLive do
case characters_limit > sub_characters_limit do
true ->
additional_price +
(characters_limit - sub_characters_limit) / 100 * extra_characters_100
(characters_limit - sub_characters_limit) / 50 * extra_characters_50
_ ->
additional_price

View File

@@ -432,9 +432,9 @@
for={@import_form}
phx-change="import"
>
<div phx-drop-target="{@uploads.settings.ref}">
<%!-- <div phx-drop-target="{@uploads.settings.ref}">
<.live_file_input upload={@uploads.settings} />
</div>
</div> --%>
</.form>
<progress :if={@importing} class="progress w-56"></progress>
<.button

View File

@@ -3,7 +3,7 @@ defmodule WandererApp.MixProject do
@source_url "https://github.com/wanderer-industries/wanderer"
@version "1.74.1"
@version "1.74.6"
def project do
[