Compare commits
82 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02d97a009c | ||
|
|
33940cdb9b | ||
|
|
7a63f9ee6b | ||
|
|
89b41fff59 | ||
|
|
7a15f71528 | ||
|
|
cdce2f8761 | ||
|
|
a2470bbe47 | ||
|
|
dbdf1ddce0 | ||
|
|
f767e42e6f | ||
|
|
3051eb6369 | ||
|
|
a41faddca3 | ||
|
|
469038730e | ||
|
|
b1fe5d2453 | ||
|
|
f43e717da0 | ||
|
|
95c8d4eef8 | ||
|
|
747ca0ee82 | ||
|
|
35a0184ec3 | ||
|
|
96e1e5328c | ||
|
|
7f98d6a0d8 | ||
|
|
0194e25696 | ||
|
|
189442e50f | ||
|
|
d9bed070ec | ||
|
|
a6193da8b5 | ||
|
|
50d35b207d | ||
|
|
19eb45bfa1 | ||
|
|
01e0b24d9d | ||
|
|
3c8024b16c | ||
|
|
4c0ad0dd66 | ||
|
|
501840086b | ||
|
|
240b180857 | ||
|
|
2bc5d0aaea | ||
|
|
df66aa79b8 | ||
|
|
6ea6a59ce3 | ||
|
|
f3afa4d9d2 | ||
|
|
e33d81eda1 | ||
|
|
0fc4863dc4 | ||
|
|
63471a5533 | ||
|
|
050e90cb7e | ||
|
|
b4643f2e45 | ||
|
|
2d740a76b7 | ||
|
|
0de9e3a02d | ||
|
|
bedaa37e08 | ||
|
|
ef9fa80b76 | ||
|
|
dc2ea625ec | ||
|
|
17df2c188a | ||
|
|
6e050bccdf | ||
|
|
8afbf3ce91 | ||
|
|
9f57bf46a1 | ||
|
|
4ce47da521 | ||
|
|
4dc6382402 | ||
|
|
cb8c1e32d9 | ||
|
|
bf534be128 | ||
|
|
a89c117612 | ||
|
|
501dbcd76b | ||
|
|
c0ceff1eec | ||
|
|
6039ac5d4f | ||
|
|
48e87f3c47 | ||
|
|
c7866a1270 | ||
|
|
4fadcd5964 | ||
|
|
6480154d1b | ||
|
|
9c064531b8 | ||
|
|
bee64c2570 | ||
|
|
5393321953 | ||
|
|
b44669da87 | ||
|
|
9d8bf1529a | ||
|
|
a514825eaf | ||
|
|
8abcacb517 | ||
|
|
a3fc55e63d | ||
|
|
a4c1d5bf98 | ||
|
|
b16bc615fa | ||
|
|
10ec8d6b97 | ||
|
|
b04f0c9183 | ||
|
|
45e9ebb0d4 | ||
|
|
ac3e68a49f | ||
|
|
b35ef1151a | ||
|
|
ebd01bebd4 | ||
|
|
7c7dd44805 | ||
|
|
152ee60576 | ||
|
|
9db568d726 | ||
|
|
a34805d3dd | ||
|
|
8105af7451 | ||
|
|
88fd0eb3dd |
15
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: WandererLtd
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
thanks_dev: # Replace with a single thanks.dev username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
7
.github/workflows/build.yml
vendored
@@ -112,8 +112,6 @@ jobs:
|
||||
git config --global user.name 'CI'
|
||||
git config --global user.email 'ci@users.noreply.github.com'
|
||||
mix git_ops.release --force-patch --yes
|
||||
yes | cp -rf CHANGELOG.md priv/changelog/CHANGELOG.md
|
||||
sed -i '1i%{title: "Change Log"}\n\n---\n' priv/changelog/CHANGELOG.md
|
||||
git push --follow-tags
|
||||
|
||||
docker:
|
||||
@@ -145,6 +143,11 @@ jobs:
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Prepare Changelog
|
||||
run: |
|
||||
yes | cp -rf CHANGELOG.md priv/changelog/CHANGELOG.md
|
||||
sed -i '1i%{title: "Change Log"}\n\n---\n' priv/changelog/CHANGELOG.md
|
||||
|
||||
- name: Get Release Tag
|
||||
id: get-latest-tag
|
||||
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||
|
||||
2
.gitignore
vendored
@@ -12,6 +12,8 @@
|
||||
|
||||
# Ignore assets that are produced by build tools.
|
||||
/priv/static/assets/
|
||||
/priv/static/icons/
|
||||
/priv/static/images/
|
||||
/priv/static/*.js
|
||||
/priv/static/*.css
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
erlang 27.0.1
|
||||
elixir 1.17-otp-27
|
||||
erlang 25.3
|
||||
elixir 1.16-otp-25
|
||||
nodejs 18.0.0
|
||||
|
||||
178
CHANGELOG.md
@@ -2,31 +2,187 @@
|
||||
|
||||
<!-- changelog -->
|
||||
|
||||
## [v1.0.5](https://github.com/wanderer-industries/wanderer/compare/v1.0.4...v1.0.5) (2024-09-18)
|
||||
## [v1.2.8](https://github.com/wanderer-industries/wanderer/compare/v1.2.7...v1.2.8) (2024-10-06)
|
||||
|
||||
|
||||
|
||||
|
||||
## [v1.0.4](https://github.com/wanderer-industries/wanderer/compare/v1.0.3...v1.0.4) (2024-09-18)
|
||||
## [v1.2.7](https://github.com/wanderer-industries/wanderer/compare/v1.2.6...v1.2.7) (2024-10-05)
|
||||
|
||||
|
||||
|
||||
|
||||
## [v1.2.6](https://github.com/wanderer-industries/wanderer/compare/v1.2.5...v1.2.6) (2024-10-05)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Core: Stability & performance improvements
|
||||
|
||||
## [v1.2.5](https://github.com/wanderer-industries/wanderer/compare/v1.2.4...v1.2.5) (2024-10-04)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Core: Add system "true security" correction
|
||||
|
||||
## [v1.2.4](https://github.com/wanderer-industries/wanderer/compare/v1.2.3...v1.2.4) (2024-10-03)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Map: Remove duplicate connections
|
||||
|
||||
## [v1.2.3](https://github.com/wanderer-industries/wanderer/compare/v1.2.2...v1.2.3) (2024-10-02)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Map: Fix map loading after select a different map.
|
||||
|
||||
## [v1.2.2](https://github.com/wanderer-industries/wanderer/compare/v1.2.1...v1.2.2) (2024-10-02)
|
||||
|
||||
|
||||
|
||||
|
||||
## [v1.2.1](https://github.com/wanderer-industries/wanderer/compare/v1.2.0...v1.2.1) (2024-10-02)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* ACL: Fix allowing to save map/access list with empty owner set
|
||||
|
||||
## [v1.2.0](https://github.com/wanderer-industries/wanderer/compare/v1.1.0...v1.2.0) (2024-09-29)
|
||||
|
||||
|
||||
|
||||
|
||||
### Features:
|
||||
|
||||
* Map: Add ability to open jump planner from routes
|
||||
|
||||
## [v1.1.0](https://github.com/wanderer-industries/wanderer/compare/v1.0.23...v1.1.0) (2024-09-29)
|
||||
|
||||
|
||||
|
||||
|
||||
### Features:
|
||||
|
||||
* Map: Add highlighting for imperial space systems depends on faction
|
||||
|
||||
## [v1.0.23](https://github.com/wanderer-industries/wanderer/compare/v1.0.22...v1.0.23) (2024-09-25)
|
||||
|
||||
|
||||
|
||||
|
||||
### Bug Fixes:
|
||||
|
||||
* Map: Main map doesn't load back after refreshing/switching pages
|
||||
|
||||
## [v1.0.22](https://github.com/wanderer-industries/wanderer/compare/v1.0.21...v1.0.22) (2024-09-25)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Map: Main map doesn't load back after refreshing/switching pages
|
||||
|
||||
## [v1.0.21](https://github.com/wanderer-industries/wanderer/compare/v1.0.20...v1.0.21) (2024-09-24)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Map: Main map doesn't load back after refreshing/switching pages
|
||||
|
||||
## [v1.0.20](https://github.com/wanderer-industries/wanderer/compare/v1.0.19...v1.0.20) (2024-09-23)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* core: Small fixes & improvements
|
||||
|
||||
## [v1.0.19](https://github.com/wanderer-industries/wanderer/compare/v1.0.18...v1.0.19) (2024-09-23)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* ACL: Fix adding empty members list
|
||||
|
||||
## [v1.0.18](https://github.com/wanderer-industries/wanderer/compare/v1.0.17...v1.0.18) (2024-09-22)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* ACL: Cant delete ACL list after map deletion #5
|
||||
|
||||
## [v1.0.16](https://github.com/wanderer-industries/wanderer/compare/v1.0.15...v1.0.16) (2024-09-21)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Map: commented console log
|
||||
|
||||
* Map: add console log for check sys loading
|
||||
|
||||
* Map: add key for cache changes detecting
|
||||
|
||||
## [v1.0.15](https://github.com/wanderer-industries/wanderer/compare/v1.0.14...v1.0.15) (2024-09-21)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* map: Show a proper user notification if map was deleted/archived
|
||||
|
||||
## [v1.0.14](https://github.com/wanderer-industries/wanderer/compare/v1.0.13...v1.0.14) (2024-09-21)
|
||||
|
||||
## [v1.0.13](https://github.com/wanderer-industries/wanderer/compare/v1.0.12...v1.0.13) (2024-09-21)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* tracking: Ensure user has at least one character tracked to work with map
|
||||
|
||||
## [v1.0.12](https://github.com/wanderer-industries/wanderer/compare/v1.0.11...v1.0.12) (2024-09-20)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* audit: Hide character for non-character map activities
|
||||
|
||||
## [v1.0.11](https://github.com/wanderer-industries/wanderer/compare/v1.0.10...v1.0.11) (2024-09-20)
|
||||
|
||||
## [v1.0.10](https://github.com/wanderer-industries/wanderer/compare/v1.0.9...v1.0.10) (2024-09-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* signatures: Fix update signatures error if no character tracked on map
|
||||
|
||||
## [v1.0.9](https://github.com/wanderer-industries/wanderer/compare/v1.0.8...v1.0.9) (2024-09-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* core: Fix system add error if it's already added on map
|
||||
|
||||
## [v1.0.8](https://github.com/wanderer-industries/wanderer/compare/v1.0.7...v1.0.8) (2024-09-19)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* docker: Fix DB connection in docker-compose internal network
|
||||
|
||||
## [v1.0.7](https://github.com/wanderer-industries/wanderer/compare/v1.0.6...v1.0.7) (2024-09-19)
|
||||
|
||||
## [v1.0.6](https://github.com/wanderer-industries/wanderer/compare/v1.0.5...v1.0.6) (2024-09-18)
|
||||
|
||||
## [v1.0.5](https://github.com/wanderer-industries/wanderer/compare/v1.0.4...v1.0.5) (2024-09-18)
|
||||
|
||||
## [v1.0.4](https://github.com/wanderer-industries/wanderer/compare/v1.0.3...v1.0.4) (2024-09-18)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* core: skip search results for failed character info request
|
||||
|
||||
## [v1.0.3](https://github.com/wanderer-industries/wanderer/compare/v1.0.2...v1.0.3) (2024-09-18)
|
||||
|
||||
|
||||
|
||||
|
||||
## [v1.0.2](https://github.com/wanderer-industries/wanderer/compare/v1.0.1...v1.0.2) (2024-09-18)
|
||||
|
||||
|
||||
|
||||
|
||||
## [v1.0.1](https://github.com/wanderer-industries/wanderer/compare/v1.0.0...v1.0.1) (2024-09-18)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,17 +8,21 @@ import { getSystemById } from '@/hooks/Mapper/helpers';
|
||||
import { useWaypointMenu } from '@/hooks/Mapper/components/contexts/hooks';
|
||||
import { WaypointSetContextHandler } from '@/hooks/Mapper/components/contexts/types.ts';
|
||||
import { FastSystemActions } from '@/hooks/Mapper/components/contexts/components';
|
||||
import { useJumpPlannerMenu } from '@/hooks/Mapper/components/contexts/hooks/useJumpPlannerMenu';
|
||||
import { Route } from '@/hooks/Mapper/types/routes.ts';
|
||||
|
||||
export interface ContextMenuSystemInfoProps {
|
||||
systemStatics: Map<number, SolarSystemStaticInfoRaw>;
|
||||
hubs: string[];
|
||||
contextMenuRef: RefObject<ContextMenu>;
|
||||
systemId: string | undefined;
|
||||
systemIdFrom?: string | undefined;
|
||||
systems: SolarSystemRawType[];
|
||||
onOpenSettings(): void;
|
||||
onHubToggle(): void;
|
||||
onAddSystem(): void;
|
||||
onWaypointSet: WaypointSetContextHandler;
|
||||
routes: Route[];
|
||||
}
|
||||
|
||||
export const ContextMenuSystemInfo: React.FC<ContextMenuSystemInfoProps> = ({
|
||||
@@ -30,9 +34,12 @@ export const ContextMenuSystemInfo: React.FC<ContextMenuSystemInfoProps> = ({
|
||||
onAddSystem,
|
||||
onWaypointSet,
|
||||
systemId,
|
||||
systemIdFrom,
|
||||
hubs,
|
||||
routes,
|
||||
}) => {
|
||||
const getWaypointMenu = useWaypointMenu(onWaypointSet);
|
||||
const getJumpPlannerMenu = useJumpPlannerMenu(systems, systemIdFrom);
|
||||
|
||||
const items: MenuItem[] = useMemo(() => {
|
||||
const system = systemId ? systemStatics.get(parseInt(systemId)) : undefined;
|
||||
@@ -55,7 +62,9 @@ export const ContextMenuSystemInfo: React.FC<ContextMenuSystemInfoProps> = ({
|
||||
);
|
||||
},
|
||||
},
|
||||
|
||||
{ separator: true },
|
||||
...getJumpPlannerMenu(system, routes),
|
||||
...getWaypointMenu(systemId, system.system_class),
|
||||
{
|
||||
label: !hubs.includes(systemId) ? 'Add in Routes' : 'Remove from Routes',
|
||||
@@ -72,7 +81,17 @@ export const ContextMenuSystemInfo: React.FC<ContextMenuSystemInfoProps> = ({
|
||||
]
|
||||
: []),
|
||||
];
|
||||
}, [systemId, systemStatics, systems, getWaypointMenu, hubs, onHubToggle, onAddSystem, onOpenSettings]);
|
||||
}, [
|
||||
systemId,
|
||||
systemStatics,
|
||||
systems,
|
||||
getJumpPlannerMenu,
|
||||
getWaypointMenu,
|
||||
hubs,
|
||||
onHubToggle,
|
||||
onAddSystem,
|
||||
onOpenSettings,
|
||||
]);
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -4,6 +4,7 @@ import { Commands, MapHandlers, OutCommand, OutCommandHandler } from '@/hooks/Ma
|
||||
import { WaypointSetContextHandler } from '@/hooks/Mapper/components/contexts/types.ts';
|
||||
import { ctxManager } from '@/hooks/Mapper/utils/contextManager.ts';
|
||||
import * as React from 'react';
|
||||
import { SolarSystemStaticInfoRaw } from '@/hooks/Mapper/types';
|
||||
|
||||
interface UseContextMenuSystemHandlersProps {
|
||||
hubs: string[];
|
||||
@@ -15,16 +16,21 @@ export const useContextMenuSystemInfoHandlers = ({ hubs, outCommand, mapRef }: U
|
||||
const contextMenuRef = useRef<ContextMenu | null>(null);
|
||||
|
||||
const [system, setSystem] = useState<string>();
|
||||
const routeRef = useRef<(SolarSystemStaticInfoRaw | undefined)[]>([]);
|
||||
|
||||
const ref = useRef({ hubs, system, outCommand, mapRef });
|
||||
ref.current = { hubs, system, outCommand, mapRef };
|
||||
|
||||
const open = useCallback((ev: React.SyntheticEvent, systemId: string) => {
|
||||
setSystem(systemId);
|
||||
ev.preventDefault();
|
||||
ctxManager.next('ctxSysInfo', contextMenuRef.current);
|
||||
contextMenuRef.current?.show(ev);
|
||||
}, []);
|
||||
const open = useCallback(
|
||||
(ev: React.SyntheticEvent, systemId: string, route: (SolarSystemStaticInfoRaw | undefined)[]) => {
|
||||
setSystem(systemId);
|
||||
routeRef.current = route;
|
||||
ev.preventDefault();
|
||||
ctxManager.next('ctxSysInfo', contextMenuRef.current);
|
||||
contextMenuRef.current?.show(ev);
|
||||
},
|
||||
[],
|
||||
);
|
||||
|
||||
const onHubToggle = useCallback(() => {
|
||||
const { hubs, system, outCommand } = ref.current;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export * from './useJumpPlannerMenu.tsx';
|
||||
@@ -0,0 +1,129 @@
|
||||
import { MenuItem } from 'primereact/menuitem';
|
||||
import { PrimeIcons } from 'primereact/api';
|
||||
import { useCallback } from 'react';
|
||||
import { isPossibleSpace } from '@/hooks/Mapper/components/map/helpers/isKnownSpace.ts';
|
||||
import { Route } from '@/hooks/Mapper/types/routes.ts';
|
||||
import { SolarSystemRawType, SolarSystemStaticInfoRaw } from '@/hooks/Mapper/types';
|
||||
import { getSystemById } from '@/hooks/Mapper/helpers';
|
||||
import { SOLAR_SYSTEM_CLASS_IDS } from '@/hooks/Mapper/components/map/constants.ts';
|
||||
|
||||
const imperialSpace = [SOLAR_SYSTEM_CLASS_IDS.hs, SOLAR_SYSTEM_CLASS_IDS.ls, SOLAR_SYSTEM_CLASS_IDS.ns];
|
||||
const criminalSpace = [SOLAR_SYSTEM_CLASS_IDS.ls, SOLAR_SYSTEM_CLASS_IDS.ns];
|
||||
|
||||
enum JUMP_SHIP_TYPE {
|
||||
BLACK_OPS = 'Marshal',
|
||||
JUMP_FREIGHTER = 'Anshar',
|
||||
RORQUAL = 'Rorqual',
|
||||
CAPITAL = 'Thanatos',
|
||||
SUPER_CAPITAL = 'Avatar',
|
||||
}
|
||||
|
||||
export const openJumpPlan = (jumpShipType: JUMP_SHIP_TYPE, from: string, to: string) => {
|
||||
return window.open(`https://evemaps.dotlan.net/jump/${jumpShipType},544/${from}:${to}`, '_blank');
|
||||
};
|
||||
|
||||
const BRACKET_ICONS = {
|
||||
npcsuperCarrier_32: '/icons/brackets/npcsuperCarrier_32.png',
|
||||
carrier_32: '/icons/brackets/carrier_32.png',
|
||||
battleship_32: '/icons/brackets/battleship_32.png',
|
||||
freighter_32: '/icons/brackets/freighter_32.png',
|
||||
};
|
||||
|
||||
const renderIcon = (icon: string) => {
|
||||
return (
|
||||
<div className="flex justify-center items-center mr-1.5 pt-px">
|
||||
<img src={icon} style={{ width: 20, height: 20 }} />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const useJumpPlannerMenu = (
|
||||
systems: SolarSystemRawType[],
|
||||
systemIdFrom?: string | undefined,
|
||||
): ((systemId: SolarSystemStaticInfoRaw, routes: Route[]) => MenuItem[]) => {
|
||||
return useCallback(
|
||||
(destination: SolarSystemStaticInfoRaw) => {
|
||||
if (!destination || !systemIdFrom) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const origin = getSystemById(systems, systemIdFrom)?.system_static_info;
|
||||
|
||||
if (!origin) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const isShowBOorJumpFreighter =
|
||||
isPossibleSpace(imperialSpace, origin.system_class) && isPossibleSpace(criminalSpace, destination.system_class);
|
||||
|
||||
const isShowCapital =
|
||||
isPossibleSpace(criminalSpace, origin.system_class) && isPossibleSpace(criminalSpace, destination.system_class);
|
||||
|
||||
if (!isShowBOorJumpFreighter && !isShowCapital) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
label: 'In Jump Planner',
|
||||
icon: PrimeIcons.SEND,
|
||||
items: [
|
||||
...(isShowBOorJumpFreighter
|
||||
? [
|
||||
{
|
||||
label: 'Black Ops',
|
||||
icon: renderIcon(BRACKET_ICONS.battleship_32),
|
||||
command: () => {
|
||||
openJumpPlan(JUMP_SHIP_TYPE.BLACK_OPS, origin.solar_system_name, destination.solar_system_name);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Jump Freighter',
|
||||
icon: renderIcon(BRACKET_ICONS.freighter_32),
|
||||
command: () => {
|
||||
openJumpPlan(
|
||||
JUMP_SHIP_TYPE.JUMP_FREIGHTER,
|
||||
origin.solar_system_name,
|
||||
destination.solar_system_name,
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Rorqual',
|
||||
icon: renderIcon(BRACKET_ICONS.freighter_32),
|
||||
command: () => {
|
||||
openJumpPlan(JUMP_SHIP_TYPE.RORQUAL, origin.solar_system_name, destination.solar_system_name);
|
||||
},
|
||||
},
|
||||
]
|
||||
: []),
|
||||
|
||||
...(isShowCapital
|
||||
? [
|
||||
{
|
||||
label: 'Capital',
|
||||
icon: renderIcon(BRACKET_ICONS.carrier_32),
|
||||
command: () => {
|
||||
openJumpPlan(JUMP_SHIP_TYPE.CAPITAL, origin.solar_system_name, destination.solar_system_name);
|
||||
},
|
||||
},
|
||||
{
|
||||
label: 'Super Capital',
|
||||
icon: renderIcon(BRACKET_ICONS.npcsuperCarrier_32),
|
||||
command: () => {
|
||||
openJumpPlan(
|
||||
JUMP_SHIP_TYPE.SUPER_CAPITAL,
|
||||
origin.solar_system_name,
|
||||
destination.solar_system_name,
|
||||
);
|
||||
},
|
||||
},
|
||||
]
|
||||
: []),
|
||||
],
|
||||
},
|
||||
];
|
||||
},
|
||||
[systems, systemIdFrom],
|
||||
);
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { ForwardedRef, forwardRef, MouseEvent, useCallback } from 'react';
|
||||
import { ForwardedRef, forwardRef, MouseEvent, useCallback, useEffect } from 'react';
|
||||
import ReactFlow, {
|
||||
Background,
|
||||
ConnectionMode,
|
||||
@@ -94,6 +94,7 @@ interface MapCompProps {
|
||||
minimapClasses?: string;
|
||||
isShowMinimap?: boolean;
|
||||
onSystemContextMenu: (event: MouseEvent<Element>, systemId: string) => void;
|
||||
showKSpaceBG?: boolean;
|
||||
}
|
||||
|
||||
const MapComp = ({
|
||||
@@ -105,6 +106,7 @@ const MapComp = ({
|
||||
onConnectionInfoClick,
|
||||
onSelectionContextMenu,
|
||||
isShowMinimap,
|
||||
showKSpaceBG,
|
||||
}: MapCompProps) => {
|
||||
const [nodes, , onNodesChange] = useNodesState<SolarSystemRawType>(initialNodes);
|
||||
const [edges, , onEdgesChange] = useEdgesState<Edge<SolarSystemConnection>[]>(initialEdges);
|
||||
@@ -169,6 +171,13 @@ const MapComp = ({
|
||||
localStorage.setItem(SESSION_KEY.viewPort, JSON.stringify(viewport));
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
update(x => ({
|
||||
...x,
|
||||
showKSpaceBG: showKSpaceBG,
|
||||
}));
|
||||
}, [showKSpaceBG, update]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className={classes.MapRoot}>
|
||||
|
||||
@@ -7,6 +7,7 @@ export type MapData = MapUnionTypes & {
|
||||
isConnecting: boolean;
|
||||
hoverNodeId: string | null;
|
||||
visibleNodes: Set<string>;
|
||||
showKSpaceBG: boolean;
|
||||
};
|
||||
|
||||
interface MapProviderProps {
|
||||
@@ -27,6 +28,7 @@ const INITIAL_DATA: MapData = {
|
||||
connections: [],
|
||||
hoverNodeId: null,
|
||||
visibleNodes: new Set(),
|
||||
showKSpaceBG: false,
|
||||
};
|
||||
|
||||
export interface MapContextProps {
|
||||
@@ -38,6 +40,7 @@ export interface MapContextProps {
|
||||
const MapContext = createContext<MapContextProps>({
|
||||
update: () => {},
|
||||
data: { ...INITIAL_DATA },
|
||||
// @ts-ignore
|
||||
outCommand: async () => void 0,
|
||||
});
|
||||
|
||||
|
||||
@@ -23,6 +23,62 @@ $tooltip-bg: #202020; // Темный фон для подсказок
|
||||
border-radius: 5px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
overflow: hidden;
|
||||
|
||||
|
||||
&.Mataria, &.Amarria, &.Gallente, &.Caldaria {
|
||||
&::Before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-size: cover;
|
||||
background-position: 50% 50%;
|
||||
z-index: -1;
|
||||
background-repeat: no-repeat;
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
&.Mataria {
|
||||
&::before {
|
||||
background-image: url("/images/mataria.png");
|
||||
opacity: 0.6;
|
||||
background-position-x: -28px;
|
||||
background-position-y: -3px;
|
||||
}
|
||||
}
|
||||
|
||||
&.Caldaria {
|
||||
&::before {
|
||||
background-image: url("/images/caldaria.png");
|
||||
opacity: 0.6;
|
||||
background-position-x: -16px;
|
||||
background-position-y: -17px;
|
||||
}
|
||||
}
|
||||
|
||||
&.Amarria {
|
||||
&::before {
|
||||
opacity: 0.45;
|
||||
background-image: url("/images/amarr.png");
|
||||
background-position-x: 0px;
|
||||
background-position-y: -1px;
|
||||
width: calc(100% + 10px)
|
||||
}
|
||||
}
|
||||
|
||||
&.Gallente {
|
||||
&::before {
|
||||
opacity: 0.6;
|
||||
background-image: url("/images/gallente.png");
|
||||
background-position-x: -1px;
|
||||
background-position-y: -10px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
&.selected {
|
||||
border-color: $pastel-pink;
|
||||
|
||||
@@ -19,6 +19,14 @@ import { PrimeIcons } from 'primereact/api';
|
||||
import { LabelsManager } from '@/hooks/Mapper/utils/labelsManager.ts';
|
||||
import { OutCommand } from '@/hooks/Mapper/types';
|
||||
import { useDoubleClick } from '@/hooks/Mapper/hooks/useDoubleClick.ts';
|
||||
import { REGIONS_MAP, Spaces } from '@/hooks/Mapper/constants';
|
||||
|
||||
const SpaceToClass: Record<string, string> = {
|
||||
[Spaces.Caldari]: classes.Caldaria,
|
||||
[Spaces.Matar]: classes.Mataria,
|
||||
[Spaces.Amarr]: classes.Amarria,
|
||||
[Spaces.Gallente]: classes.Gallente,
|
||||
};
|
||||
|
||||
const sortedLabels = (labels: string[]) => {
|
||||
if (labels === null) {
|
||||
@@ -50,6 +58,7 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps<MapSolarS
|
||||
statics,
|
||||
effect_name,
|
||||
region_name,
|
||||
region_id,
|
||||
is_shattered,
|
||||
solar_system_name,
|
||||
} = data.system_static_info;
|
||||
@@ -69,6 +78,7 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps<MapSolarS
|
||||
isConnecting,
|
||||
hoverNodeId,
|
||||
visibleNodes,
|
||||
showKSpaceBG,
|
||||
},
|
||||
outCommand,
|
||||
} = useMapState();
|
||||
@@ -114,6 +124,9 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps<MapSolarS
|
||||
|
||||
const showHandlers = isConnecting || hoverNodeId === id;
|
||||
|
||||
const space = showKSpaceBG ? REGIONS_MAP[region_id] : '';
|
||||
const regionClass = showKSpaceBG ? SpaceToClass[space] : null;
|
||||
|
||||
return (
|
||||
<>
|
||||
{visible && (
|
||||
@@ -147,7 +160,11 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps<MapSolarS
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={clsx(classes.RootCustomNode, classes[STATUS_CLASSES[status]], { [classes.selected]: selected })}>
|
||||
<div
|
||||
className={clsx(classes.RootCustomNode, regionClass, classes[STATUS_CLASSES[status]], {
|
||||
[classes.selected]: selected,
|
||||
})}
|
||||
>
|
||||
{visible && (
|
||||
<>
|
||||
<div className={classes.HeadRow}>
|
||||
@@ -183,7 +200,13 @@ export const SolarSystemNode = memo(({ data, selected }: WrapNodeProps<MapSolarS
|
||||
)}
|
||||
|
||||
{!isWormhole && !customName && (
|
||||
<div className="text-stone-400 whitespace-nowrap overflow-hidden text-ellipsis mr-0.5">
|
||||
<div
|
||||
className={clsx('text-stone-400 whitespace-nowrap overflow-hidden text-ellipsis mr-0.5', {
|
||||
['text-teal-100 font-bold']: space === Spaces.Caldari,
|
||||
['text-yellow-100 font-bold']: space === Spaces.Amarr || space === Spaces.Matar,
|
||||
['text-lime-200/80 font-bold']: space === Spaces.Gallente,
|
||||
})}
|
||||
>
|
||||
{region_name}
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -11,3 +11,7 @@ export const isKnownSpace = (wormholeClassID: number) => {
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
export const isPossibleSpace = (spaces: number[], wormholeClassID: number) => {
|
||||
return spaces.includes(wormholeClassID);
|
||||
};
|
||||
|
||||
@@ -38,7 +38,7 @@ export const RoutesWidgetContent = () => {
|
||||
|
||||
const { loading } = useLoadRoutes();
|
||||
|
||||
const { systems: systemStatics, loadSystems } = useLoadSystemStatic({ systems: hubs ?? [] });
|
||||
const { systems: systemStatics, loadSystems, lastUpdateKey } = useLoadSystemStatic({ systems: hubs ?? [] });
|
||||
const { open, ...systemCtxProps } = useContextMenuSystemInfoHandlers({
|
||||
outCommand,
|
||||
hubs,
|
||||
@@ -51,9 +51,10 @@ export const RoutesWidgetContent = () => {
|
||||
|
||||
return { ...systemStatics.get(parseInt(x))!, ...(sys && { customName: sys.name ?? '' }) };
|
||||
});
|
||||
}, [hubs, systems, systemStatics]);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [hubs, systems, systemStatics, lastUpdateKey]);
|
||||
|
||||
const preparedRoutes = useMemo(() => {
|
||||
const preparedRoutes: Route[] = useMemo(() => {
|
||||
return (
|
||||
routes?.routes
|
||||
.sort(sortByDist)
|
||||
@@ -70,15 +71,17 @@ export const RoutesWidgetContent = () => {
|
||||
);
|
||||
}, [routes?.routes, routes?.systems_static_data, systemId]);
|
||||
|
||||
const refData = useRef({ open, loadSystems });
|
||||
refData.current = { open, loadSystems };
|
||||
const refData = useRef({ open, loadSystems, preparedRoutes });
|
||||
refData.current = { open, loadSystems, preparedRoutes };
|
||||
|
||||
useEffect(() => {
|
||||
(async () => await refData.current.loadSystems(hubs))();
|
||||
}, [hubs]);
|
||||
|
||||
const handleClick = useCallback((e: MouseEvent, systemId: string) => {
|
||||
refData.current.open(e, systemId);
|
||||
const route = refData.current.preparedRoutes.find(x => x.destination.toString() === systemId);
|
||||
|
||||
refData.current.open(e, systemId, route?.mapped_systems ?? []);
|
||||
}, []);
|
||||
|
||||
const handleContextMenu = useCallback(
|
||||
@@ -114,6 +117,10 @@ export const RoutesWidgetContent = () => {
|
||||
{preparedRoutes.map(route => {
|
||||
const sys = preparedHubs.find(x => x.solar_system_id === route.destination)!;
|
||||
|
||||
// TODO do not delte this console log
|
||||
// eslint-disable-next-line no-console
|
||||
// console.log('JOipP', `Check sys [${route.destination}]:`, sys);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex gap-2 items-center">
|
||||
@@ -141,7 +148,14 @@ export const RoutesWidgetContent = () => {
|
||||
</div>
|
||||
)}
|
||||
|
||||
<ContextMenuSystemInfo hubs={hubs} systems={systems} systemStatics={systemStatics} {...systemCtxProps} />
|
||||
<ContextMenuSystemInfo
|
||||
hubs={hubs}
|
||||
routes={preparedRoutes}
|
||||
systems={systems}
|
||||
systemStatics={systemStatics}
|
||||
systemIdFrom={systemId}
|
||||
{...systemCtxProps}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -178,7 +178,7 @@ export const SystemSignaturesContent = ({ systemId, settings }: SystemSignatures
|
||||
resizableColumns
|
||||
rowHover
|
||||
selectAll
|
||||
showHeaders={false}
|
||||
sortField="eve_id"
|
||||
onRowMouseEnter={handleEnterRow}
|
||||
onRowMouseLeave={handleLeaveRow}
|
||||
rowClassName={row => {
|
||||
@@ -199,6 +199,7 @@ export const SystemSignaturesContent = ({ systemId, settings }: SystemSignatures
|
||||
field="group"
|
||||
body={renderIcon}
|
||||
style={{ maxWidth: 26, minWidth: 26, width: 26 }}
|
||||
headerStyle={{ fontSize: "14px", padding: "0.25rem" }}
|
||||
></Column>
|
||||
|
||||
<Column
|
||||
@@ -206,12 +207,16 @@ export const SystemSignaturesContent = ({ systemId, settings }: SystemSignatures
|
||||
header="Id"
|
||||
bodyClassName="text-ellipsis overflow-hidden whitespace-nowrap"
|
||||
style={{ maxWidth: 72, minWidth: 72, width: 72 }}
|
||||
headerStyle={{ fontSize: "14px", padding: "0.25rem" }}
|
||||
sortable
|
||||
></Column>
|
||||
<Column
|
||||
field="group"
|
||||
header="Group"
|
||||
bodyClassName="text-ellipsis overflow-hidden whitespace-nowrap"
|
||||
hidden={compact}
|
||||
headerStyle={{ fontSize: "14px", padding: "0.25rem" }}
|
||||
sortable
|
||||
></Column>
|
||||
<Column
|
||||
field="name"
|
||||
@@ -220,6 +225,8 @@ export const SystemSignaturesContent = ({ systemId, settings }: SystemSignatures
|
||||
body={renderName}
|
||||
style={{ maxWidth: nameColumnWidth }}
|
||||
hidden={compact || medium}
|
||||
headerStyle={{ fontSize: "14px", padding: "0.25rem" }}
|
||||
sortable
|
||||
></Column>
|
||||
<Column
|
||||
field="updated_at"
|
||||
@@ -227,6 +234,8 @@ export const SystemSignaturesContent = ({ systemId, settings }: SystemSignatures
|
||||
dataType="date"
|
||||
bodyClassName="w-[80px] text-ellipsis overflow-hidden whitespace-nowrap"
|
||||
body={renderTimeLeft}
|
||||
headerStyle={{ fontSize: "14px", padding: "0.25rem" }}
|
||||
sortable
|
||||
></Column>
|
||||
</DataTable>
|
||||
</>
|
||||
|
||||
@@ -13,6 +13,8 @@ interface RightBarProps {
|
||||
export const RightBar = ({ onShowOnTheMap }: RightBarProps) => {
|
||||
const { outCommand, interfaceSettings, setInterfaceSettings } = useMapRootState();
|
||||
|
||||
const isShowMinimap = interfaceSettings.isShowMinimap === undefined ? true : interfaceSettings.isShowMinimap;
|
||||
|
||||
const handleAddCharacter = useCallback(() => {
|
||||
outCommand({
|
||||
type: OutCommand.addCharacter,
|
||||
@@ -27,6 +29,13 @@ export const RightBar = ({ onShowOnTheMap }: RightBarProps) => {
|
||||
}));
|
||||
}, [setInterfaceSettings]);
|
||||
|
||||
const toggleKSpace = useCallback(() => {
|
||||
setInterfaceSettings(x => ({
|
||||
...x,
|
||||
isShowKSpace: !x.isShowKSpace,
|
||||
}));
|
||||
}, [setInterfaceSettings]);
|
||||
|
||||
const toggleMenu = useCallback(() => {
|
||||
setInterfaceSettings(x => ({
|
||||
...x,
|
||||
@@ -67,19 +76,31 @@ export const RightBar = ({ onShowOnTheMap }: RightBarProps) => {
|
||||
|
||||
<div className="flex flex-col items-center mb-2 gap-1">
|
||||
<WdTooltipWrapper
|
||||
content={interfaceSettings.isShowMinimap ? 'Hide minimap' : 'Show minimap'}
|
||||
content={
|
||||
interfaceSettings.isShowKSpace ? 'Hide highlighting Imperial Space' : 'Show highlighting Imperial Space'
|
||||
}
|
||||
position={TooltipPosition.left}
|
||||
>
|
||||
<button
|
||||
className="btn bg-transparent text-gray-400 hover:text-white border-transparent hover:bg-transparent py-2 h-auto min-h-auto"
|
||||
type="button"
|
||||
onClick={toggleKSpace}
|
||||
>
|
||||
{interfaceSettings.isShowKSpace ? (
|
||||
<i className="pi pi-star-fill text-lg"></i>
|
||||
) : (
|
||||
<i className="pi pi-star text-lg"></i>
|
||||
)}
|
||||
</button>
|
||||
</WdTooltipWrapper>
|
||||
|
||||
<WdTooltipWrapper content={isShowMinimap ? 'Hide minimap' : 'Show minimap'} position={TooltipPosition.left}>
|
||||
<button
|
||||
className="btn bg-transparent text-gray-400 hover:text-white border-transparent hover:bg-transparent py-2 h-auto min-h-auto"
|
||||
type="button"
|
||||
onClick={toggleMinimap}
|
||||
>
|
||||
{interfaceSettings.isShowMinimap ? (
|
||||
<i className="pi pi-eye text-lg"></i>
|
||||
) : (
|
||||
<i className="pi pi-eye-slash text-lg"></i>
|
||||
)}
|
||||
{isShowMinimap ? <i className="pi pi-eye text-lg"></i> : <i className="pi pi-eye-slash text-lg"></i>}
|
||||
</button>
|
||||
</WdTooltipWrapper>
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ export const MapWrapper = ({ refn }: MapWrapperProps) => {
|
||||
update,
|
||||
outCommand,
|
||||
data: { selectedConnections, selectedSystems, hubs, systems },
|
||||
interfaceSettings: { isShowMenu, isShowMinimap = STORED_INTERFACE_DEFAULT_VALUES.isShowMinimap },
|
||||
interfaceSettings: { isShowMenu, isShowMinimap = STORED_INTERFACE_DEFAULT_VALUES.isShowMinimap, isShowKSpace },
|
||||
} = useMapRootState();
|
||||
|
||||
const { open, ...systemContextProps } = useContextMenuSystemHandlers({ systems, hubs, outCommand });
|
||||
@@ -99,6 +99,7 @@ export const MapWrapper = ({ refn }: MapWrapperProps) => {
|
||||
onSelectionContextMenu={handleSystemMultipleContext}
|
||||
minimapClasses={!isShowMenu ? classes.MiniMap : undefined}
|
||||
isShowMinimap={isShowMinimap}
|
||||
showKSpaceBG={isShowKSpace}
|
||||
/>
|
||||
|
||||
{openSettings != null && (
|
||||
|
||||
@@ -5,3 +5,62 @@ export enum SESSION_KEY {
|
||||
}
|
||||
|
||||
export const GRADIENT_MENU_ACTIVE_CLASSES = 'bg-gradient-to-br from-transparent/10 to-fuchsia-300/10';
|
||||
|
||||
export enum Regions {
|
||||
Derelik = 10000001,
|
||||
TheForge = 10000002,
|
||||
Lonetrek = 10000016,
|
||||
SinqLaison = 10000032,
|
||||
Aridia = 10000054,
|
||||
BlackRise = 10000069,
|
||||
TheBleakLands = 10000038,
|
||||
TheCitadel = 10000033,
|
||||
Devoid = 10000036,
|
||||
Domain = 10000043,
|
||||
Essence = 10000064,
|
||||
Everyshore = 10000037,
|
||||
Genesis = 10000067,
|
||||
Heimatar = 10000030,
|
||||
Kador = 10000052,
|
||||
Khanid = 10000049,
|
||||
KorAzor = 10000065,
|
||||
Metropolis = 10000042,
|
||||
MoldenHeath = 10000028,
|
||||
Placid = 10000048,
|
||||
Solitude = 10000044,
|
||||
TashMurkon = 10000020,
|
||||
VergeVendor = 10000068,
|
||||
}
|
||||
|
||||
export enum Spaces {
|
||||
'Caldari' = 'Caldari',
|
||||
'Gallente' = 'Gallente',
|
||||
'Matar' = 'Matar',
|
||||
'Amarr' = 'Amarr',
|
||||
}
|
||||
|
||||
export const REGIONS_MAP: Record<number, Spaces> = {
|
||||
[Regions.Derelik]: Spaces.Amarr,
|
||||
[Regions.TheForge]: Spaces.Caldari,
|
||||
[Regions.Lonetrek]: Spaces.Caldari,
|
||||
[Regions.SinqLaison]: Spaces.Gallente,
|
||||
[Regions.Aridia]: Spaces.Amarr,
|
||||
[Regions.BlackRise]: Spaces.Caldari,
|
||||
[Regions.TheBleakLands]: Spaces.Amarr,
|
||||
[Regions.TheCitadel]: Spaces.Caldari,
|
||||
[Regions.Devoid]: Spaces.Amarr,
|
||||
[Regions.Domain]: Spaces.Amarr,
|
||||
[Regions.Essence]: Spaces.Gallente,
|
||||
[Regions.Everyshore]: Spaces.Gallente,
|
||||
[Regions.Genesis]: Spaces.Amarr,
|
||||
[Regions.Heimatar]: Spaces.Matar,
|
||||
[Regions.Kador]: Spaces.Amarr,
|
||||
[Regions.Khanid]: Spaces.Amarr,
|
||||
[Regions.KorAzor]: Spaces.Amarr,
|
||||
[Regions.Metropolis]: Spaces.Matar,
|
||||
[Regions.MoldenHeath]: Spaces.Matar,
|
||||
[Regions.Placid]: Spaces.Gallente,
|
||||
[Regions.Solitude]: Spaces.Gallente,
|
||||
[Regions.TashMurkon]: Spaces.Amarr,
|
||||
[Regions.VergeVendor]: Spaces.Gallente,
|
||||
};
|
||||
|
||||
@@ -23,7 +23,7 @@ export default {
|
||||
onError: handleError,
|
||||
});
|
||||
|
||||
this.pushEvent('loaded');
|
||||
this.pushEvent('ui_loaded');
|
||||
},
|
||||
|
||||
handleEventWrapper(event: string, handler: (payload: any) => void) {
|
||||
|
||||
@@ -30,11 +30,13 @@ const INITIAL_DATA: MapRootData = {
|
||||
type InterfaceStoredSettings = {
|
||||
isShowMenu: boolean;
|
||||
isShowMinimap: boolean;
|
||||
isShowKSpace: boolean;
|
||||
};
|
||||
|
||||
export const STORED_INTERFACE_DEFAULT_VALUES: InterfaceStoredSettings = {
|
||||
isShowMenu: false,
|
||||
isShowMinimap: true,
|
||||
isShowKSpace: false,
|
||||
};
|
||||
|
||||
export interface MapRootContextProps {
|
||||
@@ -50,6 +52,7 @@ const MapRootContext = createContext<MapRootContextProps>({
|
||||
update: () => {},
|
||||
data: { ...INITIAL_DATA },
|
||||
mapRef: { current: null },
|
||||
// @ts-ignore
|
||||
outCommand: async () => void 0,
|
||||
interfaceSettings: STORED_INTERFACE_DEFAULT_VALUES,
|
||||
setInterfaceSettings: () => null,
|
||||
|
||||
@@ -27,12 +27,14 @@ interface UseLoadSystemStaticProps {
|
||||
export const useLoadSystemStatic = ({ systems }: UseLoadSystemStaticProps) => {
|
||||
const { outCommand } = useMapRootState();
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [lastUpdateKey, setLastUpdateKey] = useState(0);
|
||||
|
||||
const ref = useRef({ outCommand });
|
||||
ref.current = { outCommand };
|
||||
|
||||
const addSystemStatic = useCallback((static_info: SolarSystemStaticInfoRaw) => {
|
||||
cache.set(static_info.solar_system_id, static_info);
|
||||
setLastUpdateKey(new Date().getTime());
|
||||
}, []);
|
||||
|
||||
const loadSystems = useCallback(async (systems: (number | string)[]) => {
|
||||
@@ -43,6 +45,7 @@ export const useLoadSystemStatic = ({ systems }: UseLoadSystemStaticProps) => {
|
||||
if (toLoad.length > 0) {
|
||||
const res = await loadSystemStaticInfo(ref.current.outCommand, toLoad);
|
||||
res.forEach(x => cache.set(x.solar_system_id, x));
|
||||
setLastUpdateKey(new Date().getTime());
|
||||
}
|
||||
setLoading(false);
|
||||
}, []);
|
||||
@@ -52,5 +55,5 @@ export const useLoadSystemStatic = ({ systems }: UseLoadSystemStaticProps) => {
|
||||
// eslint-disable-next-line
|
||||
}, [systems]);
|
||||
|
||||
return { addSystemStatic, systems: cache, loading, loadSystems };
|
||||
return { addSystemStatic, systems: cache, lastUpdateKey, loading, loadSystems };
|
||||
};
|
||||
|
||||
BIN
assets/static/icons/brackets/battleship_32.png
Normal file
|
After Width: | Height: | Size: 403 B |
BIN
assets/static/icons/brackets/carrier_32.png
Normal file
|
After Width: | Height: | Size: 340 B |
BIN
assets/static/icons/brackets/freighter_32.png
Normal file
|
After Width: | Height: | Size: 509 B |
BIN
assets/static/icons/brackets/npcsuperCarrier_32.png
Normal file
|
After Width: | Height: | Size: 603 B |
BIN
assets/static/images/amarr.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
BIN
assets/static/images/caldaria.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
assets/static/images/gallente.png
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
assets/static/images/mataria.png
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
assets/static/images/news/09-19-connection-info/connection.png
Normal file
|
After Width: | Height: | Size: 304 KiB |
BIN
assets/static/images/news/09-19-connection-info/cover.png
Normal file
|
After Width: | Height: | Size: 285 KiB |
BIN
assets/static/images/news/09-19-connection-info/info.png
Normal file
|
After Width: | Height: | Size: 189 KiB |
356
assets/yarn.lock
@@ -33,7 +33,7 @@
|
||||
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz"
|
||||
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
|
||||
|
||||
"@babel/core@^7.14.8", "@babel/core@^7.24.5":
|
||||
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.14.8", "@babel/core@^7.24.5":
|
||||
version "7.24.5"
|
||||
resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz"
|
||||
integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==
|
||||
@@ -187,7 +187,7 @@
|
||||
|
||||
"@babel/runtime@^7.12.5":
|
||||
version "7.25.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb"
|
||||
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz"
|
||||
integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.14.0"
|
||||
@@ -240,121 +240,11 @@
|
||||
"@babel/helper-validator-identifier" "^7.24.5"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@esbuild/aix-ppc64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
|
||||
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
|
||||
|
||||
"@esbuild/android-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
|
||||
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
|
||||
|
||||
"@esbuild/android-arm@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
|
||||
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
|
||||
|
||||
"@esbuild/android-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
|
||||
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
|
||||
|
||||
"@esbuild/darwin-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz"
|
||||
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
|
||||
|
||||
"@esbuild/darwin-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
|
||||
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
|
||||
|
||||
"@esbuild/freebsd-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
|
||||
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
|
||||
|
||||
"@esbuild/freebsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
|
||||
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
|
||||
|
||||
"@esbuild/linux-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
|
||||
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
|
||||
|
||||
"@esbuild/linux-arm@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
|
||||
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
|
||||
|
||||
"@esbuild/linux-ia32@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
|
||||
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
|
||||
|
||||
"@esbuild/linux-loong64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
|
||||
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
|
||||
|
||||
"@esbuild/linux-mips64el@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
|
||||
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
|
||||
|
||||
"@esbuild/linux-ppc64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
|
||||
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
|
||||
|
||||
"@esbuild/linux-riscv64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
|
||||
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
|
||||
|
||||
"@esbuild/linux-s390x@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
|
||||
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
|
||||
|
||||
"@esbuild/linux-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
|
||||
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
|
||||
|
||||
"@esbuild/netbsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
|
||||
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
|
||||
|
||||
"@esbuild/openbsd-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
|
||||
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
|
||||
|
||||
"@esbuild/sunos-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
|
||||
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
|
||||
|
||||
"@esbuild/win32-arm64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
|
||||
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
|
||||
|
||||
"@esbuild/win32-ia32@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
|
||||
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
|
||||
|
||||
"@esbuild/win32-x64@0.20.2":
|
||||
version "0.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
|
||||
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
|
||||
|
||||
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
|
||||
version "4.4.0"
|
||||
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
|
||||
@@ -451,7 +341,7 @@
|
||||
"@nodelib/fs.stat" "2.0.5"
|
||||
run-parallel "^1.1.9"
|
||||
|
||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
||||
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||
@@ -469,7 +359,7 @@
|
||||
resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz"
|
||||
integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
|
||||
|
||||
"@react-rxjs/core@^0.10.7":
|
||||
"@react-rxjs/core@^0.10.7", "@react-rxjs/core@>=0.1.0":
|
||||
version "0.10.7"
|
||||
resolved "https://registry.npmjs.org/@react-rxjs/core/-/core-0.10.7.tgz"
|
||||
integrity sha512-dornp8pUs9OcdqFKKRh9+I2FVe21gWufNun6RYU1ddts7kUy9i4Thvl0iqcPFbGY61cJQMAJF7dxixWMSD/A/A==
|
||||
@@ -484,7 +374,7 @@
|
||||
|
||||
"@reactflow/background@11.3.14":
|
||||
version "11.3.14"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/background/-/background-11.3.14.tgz#778ca30174f3de77fc321459ab3789e66e71a699"
|
||||
resolved "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz"
|
||||
integrity sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==
|
||||
dependencies:
|
||||
"@reactflow/core" "11.11.4"
|
||||
@@ -493,7 +383,7 @@
|
||||
|
||||
"@reactflow/controls@11.2.14":
|
||||
version "11.2.14"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/controls/-/controls-11.2.14.tgz#508ed2c40d23341b3b0919dd11e76fd49cf850c7"
|
||||
resolved "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz"
|
||||
integrity sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==
|
||||
dependencies:
|
||||
"@reactflow/core" "11.11.4"
|
||||
@@ -502,7 +392,7 @@
|
||||
|
||||
"@reactflow/core@11.11.4":
|
||||
version "11.11.4"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/core/-/core-11.11.4.tgz#89bd86d1862aa1416f3f49926cede7e8c2aab6a7"
|
||||
resolved "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz"
|
||||
integrity sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==
|
||||
dependencies:
|
||||
"@types/d3" "^7.4.0"
|
||||
@@ -517,7 +407,7 @@
|
||||
|
||||
"@reactflow/minimap@11.7.14":
|
||||
version "11.7.14"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/minimap/-/minimap-11.7.14.tgz#298d7a63cb1da06b2518c99744f716560c88ca73"
|
||||
resolved "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz"
|
||||
integrity sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==
|
||||
dependencies:
|
||||
"@reactflow/core" "11.11.4"
|
||||
@@ -530,7 +420,7 @@
|
||||
|
||||
"@reactflow/node-resizer@2.2.14":
|
||||
version "2.2.14"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz#1810c0ce51aeb936f179466a6660d1e02c7a77a8"
|
||||
resolved "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz"
|
||||
integrity sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==
|
||||
dependencies:
|
||||
"@reactflow/core" "11.11.4"
|
||||
@@ -541,7 +431,7 @@
|
||||
|
||||
"@reactflow/node-toolbar@1.3.14":
|
||||
version "1.3.14"
|
||||
resolved "https://registry.yarnpkg.com/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz#c6ffc76f82acacdce654f2160dc9852162d6e7c9"
|
||||
resolved "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz"
|
||||
integrity sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==
|
||||
dependencies:
|
||||
"@reactflow/core" "11.11.4"
|
||||
@@ -565,91 +455,11 @@
|
||||
estree-walker "^2.0.2"
|
||||
picomatch "^2.3.1"
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d"
|
||||
integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==
|
||||
|
||||
"@rollup/rollup-android-arm64@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b"
|
||||
integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==
|
||||
|
||||
"@rollup/rollup-darwin-arm64@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz"
|
||||
integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==
|
||||
|
||||
"@rollup/rollup-darwin-x64@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b"
|
||||
integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14"
|
||||
integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb"
|
||||
integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a"
|
||||
integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af"
|
||||
integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==
|
||||
|
||||
"@rollup/rollup-linux-powerpc64le-gnu@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571"
|
||||
integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f"
|
||||
integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354"
|
||||
integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811"
|
||||
integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.9.5":
|
||||
version "4.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz#85946ee4d068bd12197aeeec2c6f679c94978a49"
|
||||
integrity sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385"
|
||||
integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f"
|
||||
integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411"
|
||||
integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.17.2":
|
||||
version "4.17.2"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503"
|
||||
integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==
|
||||
|
||||
"@rx-state/core@0.1.4":
|
||||
version "0.1.4"
|
||||
resolved "https://registry.npmjs.org/@rx-state/core/-/core-0.1.4.tgz"
|
||||
@@ -930,7 +740,7 @@
|
||||
"@types/d3-transition" "*"
|
||||
"@types/d3-zoom" "*"
|
||||
|
||||
"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0":
|
||||
"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@1.0.5":
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz"
|
||||
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
|
||||
@@ -966,7 +776,7 @@
|
||||
|
||||
"@types/pako@^2.0.3":
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.3.tgz#b6993334f3af27c158f3fe0dfeeba987c578afb1"
|
||||
resolved "https://registry.npmjs.org/@types/pako/-/pako-2.0.3.tgz"
|
||||
integrity sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q==
|
||||
|
||||
"@types/prop-types@*":
|
||||
@@ -995,7 +805,7 @@
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@18.2.0":
|
||||
"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@>=16.8", "@types/react@18.2.0":
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmjs.org/@types/react/-/react-18.2.0.tgz"
|
||||
integrity sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==
|
||||
@@ -1036,7 +846,7 @@
|
||||
semver "^7.5.4"
|
||||
ts-api-utils "^1.0.1"
|
||||
|
||||
"@typescript-eslint/parser@^6.21.0":
|
||||
"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.21.0":
|
||||
version "6.21.0"
|
||||
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz"
|
||||
integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
|
||||
@@ -1137,7 +947,7 @@ acorn-jsx@^5.3.2:
|
||||
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
|
||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||
|
||||
acorn@^8.4.0, acorn@^8.9.0:
|
||||
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.0, acorn@^8.9.0:
|
||||
version "8.11.3"
|
||||
resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz"
|
||||
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
|
||||
@@ -1337,7 +1147,7 @@ braces@^3.0.2, braces@~3.0.2:
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
browserslist@^4.22.2, browserslist@^4.23.0:
|
||||
browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0":
|
||||
version "4.23.0"
|
||||
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz"
|
||||
integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
|
||||
@@ -1395,7 +1205,7 @@ child_process@^1.0.2:
|
||||
resolved "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz"
|
||||
integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==
|
||||
|
||||
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.0, chokidar@^3.5.3:
|
||||
chokidar@^3.3.0, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
|
||||
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
|
||||
@@ -1448,16 +1258,16 @@ color-convert@^2.0.1:
|
||||
dependencies:
|
||||
color-name "~1.1.4"
|
||||
|
||||
color-name@1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
|
||||
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
||||
|
||||
color-name@~1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
|
||||
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
||||
|
||||
color-name@1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
|
||||
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
|
||||
|
||||
commander@^4.0.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
|
||||
@@ -1515,7 +1325,7 @@ culori@^3:
|
||||
resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
|
||||
integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
|
||||
|
||||
"d3-drag@2 - 3", d3-drag@^3.0.0:
|
||||
d3-drag@^3.0.0, "d3-drag@2 - 3":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz"
|
||||
integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
|
||||
@@ -1535,7 +1345,7 @@ culori@^3:
|
||||
dependencies:
|
||||
d3-color "1 - 3"
|
||||
|
||||
"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0:
|
||||
d3-selection@^3.0.0, "d3-selection@2 - 3", d3-selection@3:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
|
||||
integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
|
||||
@@ -1853,7 +1663,7 @@ escape-string-regexp@^4.0.0:
|
||||
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
|
||||
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
||||
|
||||
eslint-config-prettier@^9.1.0:
|
||||
eslint-config-prettier@*, eslint-config-prettier@^9.1.0:
|
||||
version "9.1.0"
|
||||
resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz"
|
||||
integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
|
||||
@@ -1913,7 +1723,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
|
||||
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
|
||||
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
|
||||
|
||||
eslint@^8.57.0:
|
||||
"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.57.0, eslint@>=7, eslint@>=7.0.0, eslint@>=8.0.0:
|
||||
version "8.57.0"
|
||||
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz"
|
||||
integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
|
||||
@@ -1985,7 +1795,12 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
|
||||
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
|
||||
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
|
||||
|
||||
estree-walker@^2.0.1, estree-walker@^2.0.2:
|
||||
estree-walker@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
|
||||
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
||||
|
||||
estree-walker@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz"
|
||||
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
|
||||
@@ -2195,18 +2010,6 @@ glob-parent@^6.0.2:
|
||||
dependencies:
|
||||
is-glob "^4.0.3"
|
||||
|
||||
glob@7.1.6:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@^7.1.3:
|
||||
version "7.2.3"
|
||||
resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
|
||||
@@ -2219,6 +2022,18 @@ glob@^7.1.3:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
glob@7.1.6:
|
||||
version "7.1.6"
|
||||
resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
|
||||
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
|
||||
dependencies:
|
||||
fs.realpath "^1.0.0"
|
||||
inflight "^1.0.4"
|
||||
inherits "2"
|
||||
minimatch "^3.0.4"
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
globals@^11.1.0:
|
||||
version "11.12.0"
|
||||
resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
|
||||
@@ -2326,7 +2141,14 @@ hasown@^2.0.0:
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
hasown@^2.0.1, hasown@^2.0.2:
|
||||
hasown@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
|
||||
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
|
||||
dependencies:
|
||||
function-bind "^1.1.2"
|
||||
|
||||
hasown@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
|
||||
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
|
||||
@@ -2598,7 +2420,7 @@ iterator.prototype@^1.1.2:
|
||||
reflect.getprototypeof "^1.0.4"
|
||||
set-function-name "^2.0.1"
|
||||
|
||||
jiti@^1.19.1:
|
||||
jiti@^1.19.1, jiti@>=1.21.0:
|
||||
version "1.21.0"
|
||||
resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz"
|
||||
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
|
||||
@@ -2696,6 +2518,7 @@ lines-and-columns@^1.1.6:
|
||||
|
||||
"live_select@file:../deps/live_select":
|
||||
version "1.4.2"
|
||||
resolved "file:../deps/live_select"
|
||||
|
||||
locate-path@^6.0.0:
|
||||
version "6.0.0"
|
||||
@@ -2789,13 +2612,6 @@ mini-svg-data-uri@^1.2.3:
|
||||
resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz"
|
||||
integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==
|
||||
|
||||
minimatch@9.0.3:
|
||||
version "9.0.3"
|
||||
resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
|
||||
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
|
||||
@@ -2803,6 +2619,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
|
||||
dependencies:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
minimatch@9.0.3:
|
||||
version "9.0.3"
|
||||
resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
|
||||
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
|
||||
dependencies:
|
||||
brace-expansion "^2.0.1"
|
||||
|
||||
ms@2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
|
||||
@@ -2949,7 +2772,7 @@ p-locate@^5.0.0:
|
||||
|
||||
pako@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86"
|
||||
resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz"
|
||||
integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
|
||||
|
||||
parent-module@^1.0.0:
|
||||
@@ -2989,14 +2812,17 @@ path-type@^5.0.0:
|
||||
resolved "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz"
|
||||
integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==
|
||||
|
||||
"phoenix@file:../deps/phoenix":
|
||||
version "1.7.14"
|
||||
|
||||
"phoenix_html@file:../deps/phoenix_html":
|
||||
version "4.1.0"
|
||||
resolved "file:../deps/phoenix_html"
|
||||
|
||||
"phoenix_live_view@file:../deps/phoenix_live_view":
|
||||
version "0.20.17"
|
||||
resolved "file:../deps/phoenix_live_view"
|
||||
|
||||
"phoenix@file:../deps/phoenix":
|
||||
version "1.7.14"
|
||||
resolved "file:../deps/phoenix"
|
||||
|
||||
picocolors@^1, picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
@@ -3097,14 +2923,6 @@ postcss-reporter@^7.0.0:
|
||||
picocolors "^1.0.0"
|
||||
thenby "^1.3.4"
|
||||
|
||||
postcss-selector-parser@6.0.10:
|
||||
version "6.0.10"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
|
||||
integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-selector-parser@^6.0.11:
|
||||
version "6.0.13"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
|
||||
@@ -3113,12 +2931,20 @@ postcss-selector-parser@^6.0.11:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-selector-parser@6.0.10:
|
||||
version "6.0.10"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
|
||||
integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
|
||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||
|
||||
postcss@^8.4.23, postcss@^8.4.38:
|
||||
postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.38, postcss@>=8.0.9:
|
||||
version "8.4.38"
|
||||
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz"
|
||||
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
|
||||
@@ -3139,7 +2965,7 @@ prettier-linter-helpers@^1.0.0:
|
||||
dependencies:
|
||||
fast-diff "^1.1.2"
|
||||
|
||||
prettier@^3.2.5:
|
||||
prettier@^3.2.5, prettier@>=3.0.0:
|
||||
version "3.2.5"
|
||||
resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz"
|
||||
integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
|
||||
@@ -3167,7 +2993,7 @@ primereact@^10.6.5:
|
||||
"@types/react-transition-group" "^4.4.1"
|
||||
react-transition-group "^4.4.1"
|
||||
|
||||
prop-types@15.x, prop-types@^15.6.2, prop-types@^15.8.1:
|
||||
prop-types@^15.6.2, prop-types@^15.8.1, prop-types@15.x:
|
||||
version "15.8.1"
|
||||
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
|
||||
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
|
||||
@@ -3186,7 +3012,7 @@ queue-microtask@^1.2.2:
|
||||
resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
|
||||
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
|
||||
|
||||
react-dom@18.2.0:
|
||||
"react-dom@^17.0.0 || ^18.0.0", "react-dom@>= 16.3.0", react-dom@>=16.6.0, react-dom@>=17, react-dom@>=18, "react-dom@16 || 17 || 18", react-dom@18.2.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
|
||||
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
|
||||
@@ -3204,7 +3030,7 @@ react-draggable@^4.0.3, react-draggable@^4.4.5:
|
||||
|
||||
react-error-boundary@^4.0.13:
|
||||
version "4.0.13"
|
||||
resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.0.13.tgz#80386b7b27b1131c5fbb7368b8c0d983354c7947"
|
||||
resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.0.13.tgz"
|
||||
integrity sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.12.5"
|
||||
@@ -3273,7 +3099,7 @@ react-usestateref@^1.0.9:
|
||||
resolved "https://registry.npmjs.org/react-usestateref/-/react-usestateref-1.0.9.tgz"
|
||||
integrity sha512-t8KLsI7oje0HzfzGhxFXzuwbf1z9vhBM1ptHLUIHhYqZDKFuI5tzdhEVxSNzUkYxwF8XdpOErzHlKxvP7sTERw==
|
||||
|
||||
react@18.2.0:
|
||||
"react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.3", "react@>= 16.3.0", react@>=16.13.1, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=17, react@>=18, react@>16.0.0, "react@16 || 17 || 18", react@18.2.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
|
||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
||||
@@ -3282,7 +3108,7 @@ react@18.2.0:
|
||||
|
||||
reactflow@^11.10.4:
|
||||
version "11.11.4"
|
||||
resolved "https://registry.yarnpkg.com/reactflow/-/reactflow-11.11.4.tgz#e3593e313420542caed81aecbd73fb9bc6576653"
|
||||
resolved "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz"
|
||||
integrity sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==
|
||||
dependencies:
|
||||
"@reactflow/background" "11.3.14"
|
||||
@@ -3389,7 +3215,7 @@ rollup-plugin-external-globals@^0.10.0:
|
||||
is-reference "^3.0.2"
|
||||
magic-string "^0.30.5"
|
||||
|
||||
rollup@^4.13.0:
|
||||
rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, "rollup@^2.25.0 || ^3.3.0 || ^4.1.4", rollup@^4.13.0:
|
||||
version "4.17.2"
|
||||
resolved "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz"
|
||||
integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==
|
||||
@@ -3421,7 +3247,7 @@ run-parallel@^1.1.9:
|
||||
dependencies:
|
||||
queue-microtask "^1.2.2"
|
||||
|
||||
rxjs@^7.8.1:
|
||||
rxjs@^7.8.1, rxjs@>=6, rxjs@>=7:
|
||||
version "7.8.1"
|
||||
resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz"
|
||||
integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
|
||||
@@ -3454,7 +3280,7 @@ sass-loader@^14.2.1:
|
||||
dependencies:
|
||||
neo-async "^2.6.2"
|
||||
|
||||
sass@^1.77.2:
|
||||
sass@*, sass@^1.3.0, sass@^1.77.2:
|
||||
version "1.77.2"
|
||||
resolved "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz"
|
||||
integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==
|
||||
@@ -3536,7 +3362,7 @@ slash@^5.0.0, slash@^5.1.0:
|
||||
resolved "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz"
|
||||
integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
|
||||
|
||||
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0:
|
||||
source-map-js@^1.2.0, "source-map-js@>=0.6.2 <2.0.0":
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz"
|
||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
||||
@@ -3653,7 +3479,7 @@ synckit@^0.8.6:
|
||||
"@pkgr/core" "^0.1.0"
|
||||
tslib "^2.6.2"
|
||||
|
||||
tailwindcss@^3.3.6:
|
||||
tailwindcss@^3.3.6, "tailwindcss@>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1", "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", "tailwindcss@>=3.0.0 || insiders":
|
||||
version "3.3.6"
|
||||
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz"
|
||||
integrity sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==
|
||||
@@ -3793,7 +3619,7 @@ typed-array-length@^1.0.6:
|
||||
is-typed-array "^1.1.13"
|
||||
possible-typed-array-names "^1.0.0"
|
||||
|
||||
typescript@^5.2.2:
|
||||
typescript@^5.2.2, typescript@>=4.2.0:
|
||||
version "5.4.5"
|
||||
resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz"
|
||||
integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
|
||||
@@ -3838,7 +3664,7 @@ use-local-storage-state@^19.3.1:
|
||||
resolved "https://registry.npmjs.org/use-local-storage-state/-/use-local-storage-state-19.3.1.tgz"
|
||||
integrity sha512-y3Z1dODXvZXZB4qtLDNN8iuXbsYD6TAxz61K58GWB9/yKwrNG9ynI0GzCTHi/Je1rMiyOwMimz0oyFsZn+Kj7Q==
|
||||
|
||||
use-sync-external-store@1.2.0, use-sync-external-store@^1.0.0:
|
||||
use-sync-external-store@^1.0.0, use-sync-external-store@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz"
|
||||
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
|
||||
@@ -3866,7 +3692,7 @@ vite-plugin-externals@^0.6.2:
|
||||
fs-extra "^10.0.0"
|
||||
magic-string "^0.25.7"
|
||||
|
||||
vite@^5.0.5:
|
||||
"vite@^4.2.0 || ^5.0.0", vite@^5.0.5, vite@>=2.0.0:
|
||||
version "5.2.11"
|
||||
resolved "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz"
|
||||
integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==
|
||||
|
||||
@@ -1,22 +1,6 @@
|
||||
import Config
|
||||
import WandererApp.ConfigHelpers
|
||||
|
||||
# config/runtime.exs is executed for all environments, including
|
||||
# during releases. It is executed after compilation and before the
|
||||
# system starts, so it is typically used to load production configuration
|
||||
# and secrets from environment variables or elsewhere. Do not define
|
||||
# any compile-time configuration in here, as it won't be applied.
|
||||
# The block below contains prod specific runtime configuration.
|
||||
|
||||
# ## Using releases
|
||||
#
|
||||
# If you use `mix release`, you need to explicitly enable the server
|
||||
# by passing the PHX_SERVER=true when you start it:
|
||||
#
|
||||
# PHX_SERVER=true bin/wanderer_app start
|
||||
#
|
||||
# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
|
||||
# script that automatically sets the env var above.
|
||||
if System.get_env("PHX_SERVER") do
|
||||
config :wanderer_app, WandererAppWeb.Endpoint, server: true
|
||||
end
|
||||
@@ -69,6 +53,14 @@ map_subscriptions_enabled =
|
||||
|> get_var_from_path_or_env("WANDERER_MAP_SUBSCRIPTIONS_ENABLED", "false")
|
||||
|> String.to_existing_atom()
|
||||
|
||||
map_subscription_characters_limit =
|
||||
config_dir
|
||||
|> get_int_from_path_or_env("WANDERER_MAP_SUBSCRIPTION_CHARACTERS_LIMIT", 100)
|
||||
|
||||
map_subscription_hubs_limit =
|
||||
config_dir
|
||||
|> get_int_from_path_or_env("WANDERER_MAP_SUBSCRIPTION_HUBS_LIMIT", 10)
|
||||
|
||||
wallet_tracking_enabled =
|
||||
config_dir
|
||||
|> get_var_from_path_or_env("WANDERER_WALLET_TRACKING_ENABLED", "false")
|
||||
@@ -86,6 +78,8 @@ config :wanderer_app,
|
||||
git_sha: System.get_env("GIT_SHA", "111"),
|
||||
custom_route_base_url: System.get_env("CUSTOM_ROUTE_BASE_URL"),
|
||||
invites: System.get_env("WANDERER_INVITES", "false") == "true",
|
||||
admin_username: System.get_env("WANDERER_ADMIN_USERNAME", "admin"),
|
||||
admin_password: System.get_env("WANDERER_ADMIN_PASSWORD"),
|
||||
admins: admins,
|
||||
corp_id: System.get_env("WANDERER_CORP_ID", "-1") |> String.to_integer(),
|
||||
corp_wallet: System.get_env("WANDERER_CORP_WALLET", ""),
|
||||
@@ -93,7 +87,13 @@ config :wanderer_app,
|
||||
wallet_tracking_enabled: wallet_tracking_enabled,
|
||||
subscription_settings: %{
|
||||
plans: [
|
||||
%{id: "alpha", characters_limit: 100, hubs_limit: 10, base_price: 0, monthly_discount: 0},
|
||||
%{
|
||||
id: "alpha",
|
||||
characters_limit: map_subscription_characters_limit,
|
||||
hubs_limit: map_subscription_hubs_limit,
|
||||
base_price: 0,
|
||||
monthly_discount: 0
|
||||
},
|
||||
%{
|
||||
id: "omega",
|
||||
characters_limit: 300,
|
||||
@@ -178,10 +178,23 @@ if config_env() == :prod do
|
||||
For example: ecto://USER:PASS@HOST/DATABASE
|
||||
"""
|
||||
|
||||
maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: []
|
||||
maybe_ipv6 =
|
||||
config_dir
|
||||
|> get_var_from_path_or_env("ECTO_IPV6", "false")
|
||||
|> String.to_existing_atom()
|
||||
|> case do
|
||||
true -> [:inet6]
|
||||
_ -> []
|
||||
end
|
||||
|
||||
db_ssl_enabled =
|
||||
config_dir
|
||||
|> get_var_from_path_or_env("DATABASE_SSL_ENABLED", "false")
|
||||
|> String.to_existing_atom()
|
||||
|
||||
config :wanderer_app, WandererApp.Repo,
|
||||
url: database_url,
|
||||
ssl: db_ssl_enabled,
|
||||
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
|
||||
socket_options: maybe_ipv6
|
||||
|
||||
|
||||
61
flake.lock
generated
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1726560853,
|
||||
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1726871744,
|
||||
"narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -43,7 +43,6 @@ defmodule WandererApp.Api.AccessList do
|
||||
primary?(true)
|
||||
|
||||
argument :owner_id, :uuid, allow_nil?: false
|
||||
argument :owner_id_text_input, :string, allow_nil?: true
|
||||
|
||||
change manage_relationship(:owner_id, :owner, on_lookup: :relate, on_no_match: nil)
|
||||
end
|
||||
@@ -51,8 +50,6 @@ defmodule WandererApp.Api.AccessList do
|
||||
update :update do
|
||||
accept [:name, :description, :owner_id]
|
||||
primary?(true)
|
||||
|
||||
argument :owner_id_text_input, :string, allow_nil?: true
|
||||
end
|
||||
|
||||
update :assign_owner do
|
||||
|
||||
@@ -104,13 +104,21 @@ defmodule WandererApp.Api.AccessListMember do
|
||||
end
|
||||
end
|
||||
|
||||
postgres do
|
||||
references do
|
||||
reference :access_list, on_delete: :delete
|
||||
end
|
||||
end
|
||||
|
||||
identities do
|
||||
identity :uniq_acl_character_id, [:access_list_id, :eve_character_id] do
|
||||
pre_check?(true)
|
||||
end
|
||||
identity :uniq_acl_corporation_id, [:access_list_id, :eve_corporation_id] do
|
||||
|
||||
identity :uniq_acl_corporation_id, [:access_list_id, :eve_corporation_id] do
|
||||
pre_check?(true)
|
||||
end
|
||||
|
||||
identity :uniq_acl_alliance_id, [:access_list_id, :eve_alliance_id] do
|
||||
pre_check?(true)
|
||||
end
|
||||
|
||||
@@ -63,7 +63,6 @@ defmodule WandererApp.Api.Map do
|
||||
primary?(true)
|
||||
|
||||
argument :owner_id, :uuid, allow_nil?: false
|
||||
argument :owner_id_text_input, :string, allow_nil?: true
|
||||
argument :create_default_acl, :boolean, allow_nil?: true
|
||||
argument :acls, {:array, :uuid}, allow_nil?: true
|
||||
argument :acls_text_input, :string, allow_nil?: true
|
||||
|
||||
@@ -44,6 +44,13 @@ defmodule WandererApp.Api.MapAccessList do
|
||||
belongs_to :access_list, WandererApp.Api.AccessList, primary_key?: true, allow_nil?: false
|
||||
end
|
||||
|
||||
postgres do
|
||||
references do
|
||||
reference :map, on_delete: :delete
|
||||
reference :access_list, on_delete: :delete
|
||||
end
|
||||
end
|
||||
|
||||
identities do
|
||||
identity :unique_map_acl, [:map_id, :access_list_id] do
|
||||
pre_check?(false)
|
||||
|
||||
@@ -18,10 +18,7 @@ defmodule WandererApp.Api.MapConnection do
|
||||
action: :read
|
||||
)
|
||||
|
||||
define(:by_locations,
|
||||
get_by: [:map_id, :solar_system_source, :solar_system_target],
|
||||
action: :read
|
||||
)
|
||||
define(:by_locations, action: :read_by_locations)
|
||||
|
||||
define(:read_by_map, action: :read_by_map)
|
||||
define(:get_link_pairs_advanced, action: :get_link_pairs_advanced)
|
||||
@@ -47,6 +44,13 @@ defmodule WandererApp.Api.MapConnection do
|
||||
filter(expr(map_id == ^arg(:map_id)))
|
||||
end
|
||||
|
||||
read :read_by_locations do
|
||||
argument(:map_id, :string, allow_nil?: false)
|
||||
argument(:solar_system_source, :integer, allow_nil?: false)
|
||||
argument(:solar_system_target, :integer, allow_nil?: false)
|
||||
filter(expr(map_id == ^arg(:map_id) and solar_system_source == ^arg(:solar_system_source) and solar_system_target == ^arg(:solar_system_target)))
|
||||
end
|
||||
|
||||
read :get_link_pairs_advanced do
|
||||
argument(:map_id, :string, allow_nil?: false)
|
||||
argument(:include_mass_crit, :boolean, allow_nil?: false)
|
||||
|
||||
@@ -207,11 +207,11 @@ defmodule WandererApp.Character do
|
||||
|> Enum.map(fn task -> Task.await(task, 145_000) end)
|
||||
|> Enum.map(fn result ->
|
||||
case result do
|
||||
{:ok, result} -> map_function.(result)
|
||||
_ -> nil
|
||||
{:ok, result} -> map_function.(result)
|
||||
_ -> nil
|
||||
end
|
||||
end)
|
||||
|> Enum.filter(fn result -> not is_nil(result) end)}
|
||||
end)
|
||||
|> Enum.filter(fn result -> not is_nil(result) end)}
|
||||
|
||||
defp _map_alliance_info(info) do
|
||||
%{
|
||||
|
||||
@@ -68,13 +68,16 @@ defmodule WandererApp.Character.TrackerManager.Impl do
|
||||
state
|
||||
|
||||
false ->
|
||||
WandererApp.Character.update_character_state(character_id, %{opts: opts})
|
||||
:telemetry.execute([:wanderer_app, :character, :tracker, :started], %{count: 1})
|
||||
|
||||
Logger.debug(fn -> "Start character tracker: #{inspect(character_id)}" end)
|
||||
|
||||
tracked_characters = [character_id | state.characters] |> Enum.uniq()
|
||||
Task.start_link(fn ->
|
||||
WandererApp.Character.update_character_state(character_id, %{opts: opts})
|
||||
:telemetry.execute([:wanderer_app, :character, :tracker, :started], %{count: 1})
|
||||
|
||||
:ok
|
||||
end)
|
||||
|
||||
tracked_characters = [character_id | state.characters] |> Enum.uniq()
|
||||
WandererApp.Cache.insert("tracked_characters", tracked_characters)
|
||||
|
||||
%{state | characters: tracked_characters}
|
||||
|
||||
@@ -11,6 +11,8 @@ defmodule WandererApp.Env do
|
||||
def map_subscriptions_enabled?, do: get_key(:map_subscriptions_enabled, false)
|
||||
def wallet_tracking_enabled?, do: get_key(:wallet_tracking_enabled, false)
|
||||
def admins, do: get_key(:admins, [])
|
||||
def admin_username, do: get_key(:admin_username)
|
||||
def admin_password, do: get_key(:admin_password)
|
||||
def corp_wallet, do: get_key(:corp_wallet, "")
|
||||
def corp_eve_id, do: get_key(:corp_id, -1)
|
||||
def subscription_settings, do: get_key(:subscription_settings)
|
||||
|
||||
@@ -229,7 +229,7 @@ defmodule WandererApp.EveDataService do
|
||||
constellation_id = row["constellationID"] |> Integer.parse() |> elem(0)
|
||||
|
||||
{:ok, wormhole_class_id} =
|
||||
_get_wormhole_class_id(
|
||||
get_wormhole_class_id(
|
||||
map_location_wormhole_classes,
|
||||
region_id,
|
||||
constellation_id,
|
||||
@@ -237,16 +237,16 @@ defmodule WandererApp.EveDataService do
|
||||
)
|
||||
|
||||
{:ok, constellation_name} =
|
||||
_get_constellation_name(map_constellations, constellation_id)
|
||||
get_constellation_name(map_constellations, constellation_id)
|
||||
|
||||
{:ok, region_name} = _get_region_name(map_regions, region_id)
|
||||
{:ok, region_name} = get_region_name(map_regions, region_id)
|
||||
|
||||
{:ok, wormhole_class} = _get_wormhole_class(wormhole_classes, wormhole_class_id)
|
||||
{:ok, wormhole_class} = get_wormhole_class(wormhole_classes, wormhole_class_id)
|
||||
|
||||
{:ok, security} = _get_security(row["security"])
|
||||
{:ok, security} = get_security(row["security"])
|
||||
|
||||
{:ok, class_title} =
|
||||
_get_class_title(
|
||||
get_class_title(
|
||||
wormhole_classes_info,
|
||||
wormhole_class_id,
|
||||
security,
|
||||
@@ -270,7 +270,7 @@ defmodule WandererApp.EveDataService do
|
||||
solar_system_id: solar_system_id,
|
||||
solar_system_name: row["solarSystemName"],
|
||||
solar_system_name_lc: row["solarSystemName"] |> String.downcase(),
|
||||
sun_type_id: _get_sun_type_id(row["sunTypeID"]),
|
||||
sun_type_id: get_sun_type_id(row["sunTypeID"]),
|
||||
constellation_name: constellation_name,
|
||||
region_name: region_name,
|
||||
security: security,
|
||||
@@ -279,8 +279,8 @@ defmodule WandererApp.EveDataService do
|
||||
type_description: wormhole_class.title,
|
||||
is_shattered: is_shattered
|
||||
}
|
||||
|> _get_wormhole_data(wormhole_systems, solar_system_id, wormhole_class)
|
||||
|> _get_triglavian_data(triglavian_systems, solar_system_id)
|
||||
|> get_wormhole_data(wormhole_systems, solar_system_id, wormhole_class)
|
||||
|> get_triglavian_data(triglavian_systems, solar_system_id)
|
||||
end
|
||||
)
|
||||
end
|
||||
@@ -332,14 +332,14 @@ defmodule WandererApp.EveDataService do
|
||||
)
|
||||
end
|
||||
|
||||
defp _get_sun_type_id(sun_type_id) do
|
||||
defp get_sun_type_id(sun_type_id) do
|
||||
case sun_type_id do
|
||||
"None" -> 0
|
||||
_ -> sun_type_id |> Integer.parse() |> elem(0)
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_wormhole_data(default_data, wormhole_systems, solar_system_id, wormhole_class) do
|
||||
defp get_wormhole_data(default_data, wormhole_systems, solar_system_id, wormhole_class) do
|
||||
case Enum.find(wormhole_systems, fn system -> system.solar_system_id == solar_system_id end) do
|
||||
nil ->
|
||||
default_data
|
||||
@@ -355,7 +355,7 @@ defmodule WandererApp.EveDataService do
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_triglavian_data(default_data, triglavian_systems, solar_system_id) do
|
||||
defp get_triglavian_data(default_data, triglavian_systems, solar_system_id) do
|
||||
case Enum.find(triglavian_systems, fn system -> system.solar_system_id == solar_system_id end) do
|
||||
nil ->
|
||||
default_data
|
||||
@@ -370,14 +370,18 @@ defmodule WandererApp.EveDataService do
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_security(security) do
|
||||
defp get_security(security) do
|
||||
case security do
|
||||
nil -> {:ok, ""}
|
||||
_ -> {:ok, Decimal.parse(security) |> elem(0) |> Decimal.round(1) |> Decimal.to_string()}
|
||||
_ -> {:ok, String.to_float(security) |> get_true_security() |> Float.to_string(decimals: 1)}
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_class_title(wormhole_classes_info, wormhole_class_id, security, wormhole_class) do
|
||||
defp get_true_security(security) when is_float(security) and security > 0.0 and security < 0.05, do: security |> Float.ceil(1)
|
||||
|
||||
defp get_true_security(security) when is_float(security), do: security |> Float.floor(1)
|
||||
|
||||
defp get_class_title(wormhole_classes_info, wormhole_class_id, security, wormhole_class) do
|
||||
case wormhole_class_id in [
|
||||
wormhole_classes_info.names["hs"],
|
||||
wormhole_classes_info.names["ls"],
|
||||
@@ -391,7 +395,7 @@ defmodule WandererApp.EveDataService do
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_constellation_name(constellations, constellation_id) do
|
||||
defp get_constellation_name(constellations, constellation_id) do
|
||||
case Enum.find(constellations, fn constellation ->
|
||||
constellation.constellation_id == constellation_id
|
||||
end) do
|
||||
@@ -400,24 +404,24 @@ defmodule WandererApp.EveDataService do
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_region_name(regions, region_id) do
|
||||
defp get_region_name(regions, region_id) do
|
||||
case Enum.find(regions, fn region -> region.region_id == region_id end) do
|
||||
nil -> {:ok, ""}
|
||||
region -> {:ok, region.region_name}
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_wormhole_class(wormhole_classes, wormhole_class_id) do
|
||||
defp get_wormhole_class(wormhole_classes, wormhole_class_id) do
|
||||
{:ok,
|
||||
Enum.find(wormhole_classes, fn wormhole_class ->
|
||||
wormhole_class.wormhole_class_id == wormhole_class_id
|
||||
end)}
|
||||
end
|
||||
|
||||
defp _get_wormhole_class_id(_systems, _region_id, _constellation_id, 30_100_000),
|
||||
defp get_wormhole_class_id(_systems, _region_id, _constellation_id, 30_100_000),
|
||||
do: {:ok, 10_100}
|
||||
|
||||
defp _get_wormhole_class_id(systems, region_id, constellation_id, solar_system_id) do
|
||||
defp get_wormhole_class_id(systems, region_id, constellation_id, solar_system_id) do
|
||||
with region <-
|
||||
Enum.find(systems, fn system ->
|
||||
system.location_id |> Integer.parse() |> elem(0) == region_id
|
||||
@@ -430,23 +434,23 @@ defmodule WandererApp.EveDataService do
|
||||
Enum.find(systems, fn system ->
|
||||
system.location_id |> Integer.parse() |> elem(0) == solar_system_id
|
||||
end),
|
||||
wormhole_class_id <- _get_wormhole_class_id(region, constellation, solar_system) do
|
||||
wormhole_class_id <- get_wormhole_class_id(region, constellation, solar_system) do
|
||||
{:ok, wormhole_class_id}
|
||||
else
|
||||
_ -> {:ok, -1}
|
||||
end
|
||||
end
|
||||
|
||||
defp _get_wormhole_class_id(_region, _constellation, solar_system)
|
||||
defp get_wormhole_class_id(_region, _constellation, solar_system)
|
||||
when not is_nil(solar_system),
|
||||
do: solar_system.wormhole_class_id |> Integer.parse() |> elem(0)
|
||||
|
||||
defp _get_wormhole_class_id(_region, constellation, _solar_system)
|
||||
defp get_wormhole_class_id(_region, constellation, _solar_system)
|
||||
when not is_nil(constellation),
|
||||
do: constellation.wormhole_class_id |> Integer.parse() |> elem(0)
|
||||
|
||||
defp _get_wormhole_class_id(region, _constellation, _solar_system) when not is_nil(region),
|
||||
defp get_wormhole_class_id(region, _constellation, _solar_system) when not is_nil(region),
|
||||
do: region.wormhole_class_id |> Integer.parse() |> elem(0)
|
||||
|
||||
defp _get_wormhole_class_id(_region, _constellation, _solar_system), do: -1
|
||||
defp get_wormhole_class_id(_region, _constellation, _solar_system), do: -1
|
||||
end
|
||||
|
||||
@@ -10,8 +10,8 @@ defmodule WandererApp.Map.Manager do
|
||||
alias WandererApp.Map.Server
|
||||
alias WandererApp.Map.ServerSupervisor
|
||||
|
||||
@maps_start_per_second 100
|
||||
@maps_start_interval 1500
|
||||
@maps_start_per_second 5
|
||||
@maps_start_interval 1000
|
||||
@maps_queue :maps_queue
|
||||
@garbage_collection_interval :timer.hours(1)
|
||||
@check_maps_queue_interval :timer.seconds(1)
|
||||
|
||||
@@ -75,11 +75,11 @@ defmodule WandererApp.Map.Server do
|
||||
|> map_pid!
|
||||
|> GenServer.call({&Impl.get_characters/1, []}, :timer.minutes(1))
|
||||
|
||||
def add_character(map_id, character) when is_binary(map_id),
|
||||
def add_character(map_id, character, track_character \\ false) when is_binary(map_id),
|
||||
do:
|
||||
map_id
|
||||
|> map_pid!
|
||||
|> GenServer.cast({&Impl.add_character/2, [character]})
|
||||
|> GenServer.cast({&Impl.add_character/3, [character, track_character]})
|
||||
|
||||
def remove_character(map_id, character_id) when is_binary(map_id),
|
||||
do:
|
||||
|
||||
@@ -176,38 +176,46 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
def get_characters(%{map_id: map_id} = _state),
|
||||
do: {:ok, map_id |> WandererApp.Map.list_characters()}
|
||||
|
||||
def add_character(%{map_id: map_id} = state, %{id: character_id} = character) do
|
||||
with :ok <- map_id |> WandererApp.Map.add_character(character),
|
||||
{:ok, _} <-
|
||||
WandererApp.MapCharacterSettingsRepo.create(%{
|
||||
character_id: character_id,
|
||||
map_id: map_id,
|
||||
tracked: false
|
||||
}),
|
||||
{:ok, character} <- WandererApp.Character.get_character(character_id) do
|
||||
broadcast!(map_id, :character_added, character)
|
||||
def add_character(%{map_id: map_id} = state, %{id: character_id} = character, track_character) do
|
||||
Task.start_link(fn ->
|
||||
with :ok <- map_id |> WandererApp.Map.add_character(character),
|
||||
{:ok, _} <-
|
||||
WandererApp.MapCharacterSettingsRepo.create(%{
|
||||
character_id: character_id,
|
||||
map_id: map_id,
|
||||
tracked: track_character
|
||||
}),
|
||||
{:ok, character} <- WandererApp.Character.get_character(character_id) do
|
||||
broadcast!(map_id, :character_added, character)
|
||||
|
||||
:telemetry.execute([:wanderer_app, :map, :character, :added], %{count: 1})
|
||||
:telemetry.execute([:wanderer_app, :map, :character, :added], %{count: 1})
|
||||
|
||||
state
|
||||
else
|
||||
{:error, error} ->
|
||||
state
|
||||
end
|
||||
:ok
|
||||
else
|
||||
{:error, _error} ->
|
||||
:ok
|
||||
end
|
||||
end)
|
||||
|
||||
state
|
||||
end
|
||||
|
||||
def remove_character(%{map_id: map_id} = state, character_id) do
|
||||
with :ok <- WandererApp.Map.remove_character(map_id, character_id),
|
||||
{:ok, character} <- WandererApp.Character.get_character(character_id) do
|
||||
broadcast!(map_id, :character_removed, character)
|
||||
Task.start_link(fn ->
|
||||
with :ok <- WandererApp.Map.remove_character(map_id, character_id),
|
||||
{:ok, character} <- WandererApp.Character.get_character(character_id) do
|
||||
broadcast!(map_id, :character_removed, character)
|
||||
|
||||
:telemetry.execute([:wanderer_app, :map, :character, :removed], %{count: 1})
|
||||
:telemetry.execute([:wanderer_app, :map, :character, :removed], %{count: 1})
|
||||
|
||||
state
|
||||
else
|
||||
{:error, error} ->
|
||||
state
|
||||
end
|
||||
:ok
|
||||
else
|
||||
{:error, _error} ->
|
||||
:ok
|
||||
end
|
||||
end)
|
||||
|
||||
state
|
||||
end
|
||||
|
||||
def untrack_characters(%{map_id: map_id} = state, characters_ids) do
|
||||
@@ -357,17 +365,7 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
connections_to_remove
|
||||
|> Enum.each(fn connection ->
|
||||
@logger.debug(fn -> "Removing connection from map: #{inspect(connection)}" end)
|
||||
|
||||
connection
|
||||
|> WandererApp.MapConnectionRepo.destroy!()
|
||||
|> case do
|
||||
:ok ->
|
||||
:ok
|
||||
|
||||
{:error, error} ->
|
||||
@logger.error("Failed to remove connection from map: #{inspect(error, pretty: true)}")
|
||||
:ok
|
||||
end
|
||||
WandererApp.MapConnectionRepo.destroy(map_id, connection)
|
||||
end)
|
||||
|
||||
@ddrt.delete(removed_ids, rtree_name)
|
||||
@@ -797,7 +795,7 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
}
|
||||
end
|
||||
|
||||
def handle_event({ref, _result}, %{map_id: map_id} = state) do
|
||||
def handle_event({ref, _result}, %{map_id: _map_id} = state) do
|
||||
Process.demonitor(ref, [:flush])
|
||||
|
||||
state
|
||||
@@ -1567,8 +1565,7 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
old_location.solar_system_id
|
||||
) do
|
||||
{:ok, connection} ->
|
||||
connection
|
||||
|> WandererApp.MapConnectionRepo.destroy!()
|
||||
:ok = WandererApp.MapConnectionRepo.destroy(map_id, connection)
|
||||
|
||||
broadcast!(map_id, :remove_connections, [connection])
|
||||
map_id |> WandererApp.Map.remove_connection(connection)
|
||||
@@ -1657,32 +1654,36 @@ defmodule WandererApp.Map.Server.Impl do
|
||||
{:ok, solar_system_info} =
|
||||
WandererApp.Api.MapSolarSystem.by_solar_system_id(location.solar_system_id)
|
||||
|
||||
{:ok, new_system} =
|
||||
WandererApp.MapSystemRepo.create(%{
|
||||
map_id: map_id,
|
||||
solar_system_id: location.solar_system_id,
|
||||
name: solar_system_info.solar_system_name,
|
||||
position_x: position.x,
|
||||
position_y: position.y
|
||||
})
|
||||
WandererApp.MapSystemRepo.create(%{
|
||||
map_id: map_id,
|
||||
solar_system_id: location.solar_system_id,
|
||||
name: solar_system_info.solar_system_name,
|
||||
position_x: position.x,
|
||||
position_y: position.y
|
||||
})
|
||||
|> case do
|
||||
{:ok, new_system} ->
|
||||
@ddrt.insert(
|
||||
{new_system.solar_system_id,
|
||||
WandererApp.Map.PositionCalculator.get_system_bounding_rect(new_system)},
|
||||
rtree_name
|
||||
)
|
||||
|
||||
@ddrt.insert(
|
||||
{new_system.solar_system_id,
|
||||
WandererApp.Map.PositionCalculator.get_system_bounding_rect(new_system)},
|
||||
rtree_name
|
||||
)
|
||||
WandererApp.Cache.put(
|
||||
"map_#{map_id}:system_#{new_system.id}:last_activity",
|
||||
DateTime.utc_now(),
|
||||
ttl: @system_inactive_timeout
|
||||
)
|
||||
|
||||
WandererApp.Cache.put(
|
||||
"map_#{map_id}:system_#{new_system.id}:last_activity",
|
||||
DateTime.utc_now(),
|
||||
ttl: @system_inactive_timeout
|
||||
)
|
||||
broadcast!(map_id, :add_system, new_system)
|
||||
WandererApp.Map.add_system(map_id, new_system)
|
||||
|
||||
broadcast!(map_id, :add_system, new_system)
|
||||
WandererApp.Map.add_system(map_id, new_system)
|
||||
_ ->
|
||||
:ok
|
||||
end
|
||||
end
|
||||
|
||||
{:error, :already_exists} ->
|
||||
{:error, _} ->
|
||||
:ok
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,7 +17,16 @@ defmodule WandererApp.Permissions do
|
||||
@delete_map 4096
|
||||
|
||||
@viewer_role [@view_system, @view_character, @view_connection]
|
||||
@member_role @viewer_role ++ [@add_system, @add_connection, @update_system, @track_character, @delete_connection, @delete_system, @lock_system]
|
||||
@member_role @viewer_role ++
|
||||
[
|
||||
@add_system,
|
||||
@add_connection,
|
||||
@update_system,
|
||||
@track_character,
|
||||
@delete_connection,
|
||||
@delete_system,
|
||||
@lock_system
|
||||
]
|
||||
@manager_role @member_role
|
||||
@admin_role @manager_role ++ [@add_acl, @delete_acl, @delete_map]
|
||||
|
||||
|
||||
@@ -1,12 +1,60 @@
|
||||
defmodule WandererApp.MapConnectionRepo do
|
||||
use WandererApp, :repository
|
||||
|
||||
require Logger
|
||||
|
||||
@logger Application.compile_env(:wanderer_app, :logger)
|
||||
|
||||
def get_by_map(map_id),
|
||||
do: WandererApp.Api.MapConnection.read_by_map(%{map_id: map_id})
|
||||
|
||||
def get_by_locations(map_id, solar_system_source, solar_system_target) do
|
||||
WandererApp.Api.MapConnection.by_locations(%{map_id: map_id, solar_system_source: solar_system_source, solar_system_target: solar_system_target})
|
||||
|> case do
|
||||
{:ok, connections} ->
|
||||
{:ok, connections}
|
||||
|
||||
{:error, %Ash.Error.Query.NotFound{}} ->
|
||||
{:ok, []}
|
||||
|
||||
{:error, error} ->
|
||||
@logger.error("Failed to get connections: #{inspect(error, pretty: true)}")
|
||||
{:error, error}
|
||||
end
|
||||
end
|
||||
|
||||
def create!(connection), do: connection |> WandererApp.Api.MapConnection.create!()
|
||||
|
||||
def destroy!(connection), do: connection |> WandererApp.Api.MapConnection.destroy!()
|
||||
def destroy(map_id, connection) do
|
||||
{:ok, from_connections} = get_by_locations(map_id, connection.solar_system_source, connection.solar_system_target)
|
||||
{:ok, to_connections} = get_by_locations(map_id, connection.solar_system_target, connection.solar_system_source)
|
||||
|
||||
[from_connections ++ to_connections]
|
||||
|> List.flatten()
|
||||
|> bulk_destroy!()
|
||||
|> case do
|
||||
:ok ->
|
||||
:ok
|
||||
|
||||
error ->
|
||||
@logger.error("Failed to remove connections from map: #{inspect(error, pretty: true)}")
|
||||
:ok
|
||||
end
|
||||
end
|
||||
|
||||
def destroy!(connection), do:
|
||||
connection |> WandererApp.Api.MapConnection.destroy!()
|
||||
|
||||
def bulk_destroy!(connections) do
|
||||
connections
|
||||
|> WandererApp.Api.MapConnection.destroy!()
|
||||
|> case do
|
||||
%Ash.BulkResult{status: :success} ->
|
||||
:ok
|
||||
error ->
|
||||
error
|
||||
end
|
||||
end
|
||||
|
||||
def update_time_status(connection, update),
|
||||
do:
|
||||
|
||||
@@ -51,7 +51,7 @@ defmodule WandererAppWeb.Alerts do
|
||||
def delayed_fade_out_flash() do
|
||||
JS.hide(
|
||||
transition:
|
||||
{"transition-opacity ease-out delay-2000 duration-1000", "opacity-100", "opacity-0"},
|
||||
{"transition-opacity ease-out delay-5000 duration-6000", "opacity-100", "opacity-0"},
|
||||
time: 6000
|
||||
)
|
||||
|> JS.push("lv:clear-flash")
|
||||
|
||||
@@ -92,11 +92,11 @@ defmodule WandererAppWeb.CoreComponents do
|
||||
<div class="absolute right-4">
|
||||
<button
|
||||
phx-click={JS.exec("data-cancel", to: "##{@id}")}
|
||||
type="button"
|
||||
class="p-link opacity-70 hover:opacity-100"
|
||||
aria-label={gettext("close")}
|
||||
type="button"
|
||||
class="p-link opacity-70 hover:opacity-100"
|
||||
aria-label={gettext("close")}
|
||||
>
|
||||
<.icon name="hero-x-mark-solid" class="h-5 w-5" />
|
||||
<.icon name="hero-x-mark-solid" class="h-5 w-5" />
|
||||
</button>
|
||||
</div>
|
||||
</h3>
|
||||
@@ -602,11 +602,11 @@ defmodule WandererAppWeb.CoreComponents do
|
||||
<tr
|
||||
:for={row <- @rows}
|
||||
id={@row_id && @row_id.(row)}
|
||||
phx-click={@row_click && @row_click.(row)}
|
||||
class={"hover #{if @row_selected && @row_selected.(row), do: "!bg-slate-600", else: ""} #{if @row_click, do: "cursor-pointer", else: ""}"}
|
||||
>
|
||||
<td
|
||||
:for={{col, _index} <- Enum.with_index(@col)}
|
||||
phx-click={@row_click && @row_click.(row)}
|
||||
>
|
||||
<%= render_slot(col, @row_item.(row)) %>
|
||||
</td>
|
||||
|
||||
@@ -42,27 +42,28 @@
|
||||
integrity={integrity_hash("https://unpkg.com/react-dom@18/umd/react-dom.production.min.js")}
|
||||
>
|
||||
</script>
|
||||
|
||||
<script defer phx-track-static type="module" src={~p"/assets/app.js"} crossorigin="anonymous">
|
||||
</script>
|
||||
<!-- Appzi: Capture Insightful Feedback -->
|
||||
<script async src="https://w.appzi.io/w.js?token=yddv0">
|
||||
<script defer src="https://w.appzi.io/w.js?token=yddv0">
|
||||
</script>
|
||||
<!-- End Appzi -->
|
||||
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script
|
||||
async
|
||||
defer
|
||||
src="https://www.googletagmanager.com/gtag/js?id=G-61PHLLS0LD"
|
||||
crossorigin="anonymous"
|
||||
>
|
||||
</script>
|
||||
<script>
|
||||
<script defer>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-61PHLLS0LD');
|
||||
</script>
|
||||
<script defer phx-track-static type="module" src={~p"/assets/app.js"} crossorigin="anonymous">
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<%= @inner_content %>
|
||||
|
||||
@@ -46,7 +46,10 @@ defmodule WandererAppWeb.UserActivity do
|
||||
<.local_time id={@activity.id} at={@activity.inserted_at} />
|
||||
</span>
|
||||
</p>
|
||||
<p class="flex shrink-0 items-center space-x-1 min-w-[200px]">
|
||||
<p
|
||||
:if={not is_nil(@activity.character)}
|
||||
class="flex shrink-0 items-center space-x-1 min-w-[200px]"
|
||||
>
|
||||
<.character_item character={@activity.character} />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
13
lib/wanderer_app_web/controllers/basic_auth.ex
Executable file
@@ -0,0 +1,13 @@
|
||||
defmodule WandererAppWeb.BasicAuth do
|
||||
@moduledoc false
|
||||
|
||||
def admin_basic_auth(conn, _opts) do
|
||||
admin_password = WandererApp.Env.admin_password()
|
||||
if is_nil(admin_password) do
|
||||
conn
|
||||
else
|
||||
conn
|
||||
|> Plug.BasicAuth.basic_auth(username: WandererApp.Env.admin_username(), password: admin_password)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -20,11 +20,8 @@
|
||||
<div class="h-10"></div>
|
||||
<div>
|
||||
<div class="inline-flex w-full flex-col items-stretch justify-center gap-2 px-4 md:flex-row xl:justify-start xl:px-0">
|
||||
<a
|
||||
<.link
|
||||
href="https://discord.gg/cafERvDD2k"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
aria-label="Discord"
|
||||
class="btn md:btn-lg group shrink-0 rounded-full [@media(min-width:768px)]:px-10 bg-[oklch(64.74%_0.124_270.62)] border-[oklch(64.74%_0.124_270.62)] hover:bg-[oklch(60%_0.124_270.62)] hover:border-[oklch(60%_0.124_270.62)]"
|
||||
>
|
||||
<svg
|
||||
@@ -66,7 +63,7 @@
|
||||
>
|
||||
</path>
|
||||
</svg>
|
||||
</a>
|
||||
</.link>
|
||||
|
||||
<a
|
||||
href="https://t.me/wanderer_mapper"
|
||||
|
||||
@@ -11,24 +11,22 @@
|
||||
</div>
|
||||
<!--Right Col-->
|
||||
<div :if={@invite_token_valid} class="overflow-hidden">
|
||||
<%!-- <img class="mx-auto w-full md:w-4/5 transform -rotate-6 transition hover:scale-105 duration-700 ease-in-out hover:rotate-6" src="macbook.svg" /> --%>
|
||||
<.link navigate={~p"/auth/eve?invite=#{@invite_token}"}>
|
||||
<img src="https://web.ccpgamescdn.com/eveonlineassets/developers/eve-sso-login-black-large.png" />
|
||||
</.link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel carousel-center !bg-neutral rounded-box max-w-4xl space-x-6 p-4">
|
||||
<div class="carousel carousel-center bg-neutral rounded-box max-w-[80%] space-x-4 p-4">
|
||||
<%= for post <- @posts do %>
|
||||
<.link class="carousel-item relative" navigate={~p"/news/#{post.id}"}>
|
||||
<.link class="group carousel-item relative" navigate={~p"/news/#{post.id}"}>
|
||||
<div class="artboard-horizontal phone-1 relative hover:text-white mt-10">
|
||||
<img
|
||||
class="rounded-lg shadow-lg block !w-[400px] !h-[200px] opacity-75"
|
||||
src={post.cover_image_uri}
|
||||
/>
|
||||
<p class="absolute bottom-24 left-14 text-sm font-normal ccp-font">
|
||||
<%= post.date %> - BY <span class="uppercase"><%= post.author %></span>
|
||||
</p>
|
||||
<div class="absolute top-0 left-0 w-full h-full bg-gradient-to-b from-transparent to-black opacity-75 group-hover:opacity-25 transition-opacity duration-300">
|
||||
</div>
|
||||
<h3 class="absolute bottom-4 left-14 font-bold break-normal pt-6 pb-2 ccp-font text-white">
|
||||
<%= post.title %>
|
||||
</h3>
|
||||
@@ -36,10 +34,8 @@
|
||||
</.link>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="flex w-full justify-center gap-2 py-2">
|
||||
<%= for post <- @posts do %>
|
||||
<.link class="btn btn-xs" navigate={~p"/news/#{post.id}"}></.link>
|
||||
<% end %>
|
||||
</div>
|
||||
<%!-- <div class="carousel carousel-center !bg-neutral rounded-box max-w-4xl space-x-6 p-4">
|
||||
|
||||
</div> --%>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -99,40 +99,34 @@ defmodule WandererAppWeb.AccessListsLive do
|
||||
end
|
||||
|
||||
defp apply_action(socket, :add_members, %{"id" => acl_id} = _params) do
|
||||
{:ok, %{owner: %{id: _character_id}} = access_list} =
|
||||
socket.assigns.access_lists |> Enum.find(&(&1.id == acl_id)) |> Ash.load(:owner)
|
||||
with {:ok, %{owner: %{id: _character_id}} = access_list} <- socket.assigns.access_lists |> Enum.find(&(&1.id == acl_id)) |> Ash.load(:owner),
|
||||
user_character_ids <- socket.assigns.current_user.characters |> Enum.map(& &1.id) do
|
||||
user_character_ids
|
||||
|> Enum.each(fn user_character_id ->
|
||||
:ok = WandererApp.Character.TrackerManager.start_tracking(user_character_id)
|
||||
end)
|
||||
|
||||
user_character_ids = socket.assigns.current_user.characters |> Enum.map(& &1.id)
|
||||
|
||||
user_character_ids
|
||||
|> Enum.each(fn user_character_id ->
|
||||
:ok = WandererApp.Character.TrackerManager.start_tracking(user_character_id)
|
||||
end)
|
||||
|
||||
socket
|
||||
|> assign(:active_page, :access_lists)
|
||||
|> assign(:page_title, "Access Lists - Add Members")
|
||||
|> assign(:selected_acl_id, acl_id)
|
||||
|> assign(:user_character_ids, user_character_ids)
|
||||
|> assign(
|
||||
member_search_options: socket.assigns.characters |> Enum.map(&map_user_character_info/1)
|
||||
)
|
||||
|> assign(:access_list, access_list)
|
||||
|> assign(
|
||||
:members,
|
||||
WandererApp.Api.AccessListMember.read_by_access_list!(%{access_list_id: acl_id})
|
||||
)
|
||||
|> assign(
|
||||
:member_form,
|
||||
%{} |> to_form()
|
||||
)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event("set-default", %{"id" => id}, socket) do
|
||||
send_update(LiveSelect.Component, options: socket.assigns.characters, id: id)
|
||||
|
||||
{:noreply, socket}
|
||||
socket
|
||||
|> assign(:active_page, :access_lists)
|
||||
|> assign(:page_title, "Access Lists - Add Members")
|
||||
|> assign(:selected_acl_id, acl_id)
|
||||
|> assign(:user_character_ids, user_character_ids)
|
||||
|> assign(
|
||||
member_search_options: socket.assigns.characters |> Enum.map(&map_user_character_info/1)
|
||||
)
|
||||
|> assign(:access_list, access_list)
|
||||
|> assign(
|
||||
:members,
|
||||
WandererApp.Api.AccessListMember.read_by_access_list!(%{access_list_id: acl_id})
|
||||
)
|
||||
|> assign(
|
||||
:member_form,
|
||||
%{} |> to_form()
|
||||
)
|
||||
else
|
||||
_ ->
|
||||
socket
|
||||
end
|
||||
end
|
||||
|
||||
@impl true
|
||||
@@ -225,7 +219,8 @@ defmodule WandererAppWeb.AccessListsLive do
|
||||
"add_members",
|
||||
%{"member_id" => member_id} = _params,
|
||||
%{assigns: assigns} = socket
|
||||
) do
|
||||
)
|
||||
when is_binary(member_id) and member_id != "" do
|
||||
member_option =
|
||||
assigns.member_search_options
|
||||
|> Enum.find(&(&1.value == member_id))
|
||||
@@ -238,8 +233,8 @@ defmodule WandererAppWeb.AccessListsLive do
|
||||
def handle_event("delete-acl", %{"id" => acl_id} = _params, socket) do
|
||||
case socket.assigns.access_lists
|
||||
|> Enum.find(&(&1.id == acl_id))
|
||||
|> WandererApp.Api.AccessList.destroy() do
|
||||
{:ok, _acl} ->
|
||||
|> WandererApp.Api.AccessList.destroy!() do
|
||||
:ok ->
|
||||
Phoenix.PubSub.broadcast(
|
||||
WandererApp.PubSub,
|
||||
"acls:#{acl_id}",
|
||||
@@ -261,7 +256,7 @@ defmodule WandererAppWeb.AccessListsLive do
|
||||
)}
|
||||
end
|
||||
rescue
|
||||
_ ->
|
||||
_error ->
|
||||
{:noreply,
|
||||
socket
|
||||
|> put_flash(
|
||||
@@ -315,6 +310,12 @@ defmodule WandererAppWeb.AccessListsLive do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event(event, body, socket) do
|
||||
Logger.warning(fn -> "unhandled event: #{event} #{inspect(body)}" end)
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_info({:search, text}, socket) do
|
||||
first_character_id =
|
||||
|
||||
@@ -127,23 +127,13 @@
|
||||
<.form :let={f} for={@form} phx-change="validate" phx-submit={@live_action}>
|
||||
<.input type="text" field={f[:name]} placeholder="Name" />
|
||||
<.input type="textarea" field={f[:description]} placeholder="Public description" />
|
||||
<.live_select
|
||||
<.input
|
||||
type="select"
|
||||
field={f[:owner_id]}
|
||||
dropdown_extra_class="max-h-64"
|
||||
available_option_class="w-full"
|
||||
value_mapper={&map_character/1}
|
||||
update_min_len={0}
|
||||
phx-focus="set-default"
|
||||
options={@characters}
|
||||
placeholder="Owner"
|
||||
>
|
||||
<:option :let={option}>
|
||||
<div class="flex items-center">
|
||||
<.avatar url={member_icon_url(option.eve_id)} label={option.label} />
|
||||
<%= option.label %>
|
||||
</div>
|
||||
</:option>
|
||||
</.live_select>
|
||||
class="p-dropdown p-component p-inputwrapper mt-8"
|
||||
placeholder="Select a map owner"
|
||||
options={Enum.map(@characters, fn character -> {character.label, character.id} end)}
|
||||
/>
|
||||
<div class="modal-action">
|
||||
<.button class="mt-2" type="submit" phx-disable-with="Saving...">
|
||||
<%= (@live_action == :create && "Create") || "Save" %>
|
||||
|
||||
@@ -42,8 +42,10 @@ defmodule WandererAppWeb.CharactersTrackingLive do
|
||||
|
||||
{:ok, character_settings} =
|
||||
case WandererApp.Api.MapCharacterSettings.read_by_map(%{map_id: selected_map.id}) do
|
||||
{:ok, settings} -> {:ok, settings}
|
||||
_ -> {:ok, []}
|
||||
{:ok, settings} ->
|
||||
{:ok, settings}
|
||||
_ ->
|
||||
{:ok, []}
|
||||
end
|
||||
|
||||
user_id = socket.assigns.user_id
|
||||
|
||||
@@ -169,19 +169,4 @@ defmodule WandererAppWeb.MapAuditLive do
|
||||
_ -> socket
|
||||
end
|
||||
end
|
||||
|
||||
defp map_ui_character(character) do
|
||||
character
|
||||
|> Map.take([
|
||||
:id,
|
||||
:eve_id,
|
||||
:name,
|
||||
:corporation_id,
|
||||
:corporation_name,
|
||||
:corporation_ticker,
|
||||
:alliance_id,
|
||||
:alliance_name,
|
||||
:alliance_ticker
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
id="map-loader"
|
||||
data-loading={show_loader("map-loader")}
|
||||
data-loaded={hide_loader("map-loader")}
|
||||
class="!z-100 absolute w-screen h-screen bg-transparent hidden"
|
||||
class="!z-100 w-screen h-screen hidden relative"
|
||||
>
|
||||
<div class="flex w-full h-full items-center justify-center">
|
||||
<div class="hs-overlay-backdrop transition duration absolute inset-0 blur" />
|
||||
<div class="flex !z-[150] w-full h-full items-center justify-center">
|
||||
<div class="Loader" data-text="Wanderer">
|
||||
<span class="Loader__Circle"></span>
|
||||
<span class="Loader__Circle"></span>
|
||||
@@ -12,6 +13,8 @@
|
||||
<span class="Loader__Circle"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="w-full h-full" id="mapper" phx-hook="Mapper" phx-update="ignore"></div>
|
||||
|
||||
@@ -107,7 +107,7 @@ defmodule WandererAppWeb.MapsLive do
|
||||
subscription_form = %{
|
||||
"plan" => "omega",
|
||||
"period" => "1",
|
||||
"characters_limit" => "100",
|
||||
"characters_limit" => "300",
|
||||
"hubs_limit" => "10",
|
||||
"auto_renew?" => true
|
||||
}
|
||||
@@ -167,24 +167,6 @@ defmodule WandererAppWeb.MapsLive do
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event(
|
||||
"live_select_change",
|
||||
%{"id" => "form_owner_id_live_select_component" = id, "text" => text} = _change_event,
|
||||
socket
|
||||
) do
|
||||
options =
|
||||
if text == "" do
|
||||
socket.assigns.characters
|
||||
else
|
||||
socket.assigns.characters
|
||||
end
|
||||
|
||||
send_update(LiveSelect.Component, options: options, id: id)
|
||||
|
||||
{:noreply, socket}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_event(
|
||||
"live_select_change",
|
||||
|
||||
@@ -137,23 +137,17 @@
|
||||
<.input type="text" field={f[:name]} placeholder="Name" />
|
||||
<.input type="text" field={f[:slug]} prefix={@uri} placeholder="map-slug" />
|
||||
<.input type="textarea" field={f[:description]} placeholder="Public description" />
|
||||
<.live_select
|
||||
<.input
|
||||
type="select"
|
||||
field={f[:owner_id]}
|
||||
value_mapper={&map_character/1}
|
||||
options={@characters}
|
||||
class="p-dropdown p-component p-inputwrapper mt-8"
|
||||
placeholder="Select a map owner"
|
||||
>
|
||||
<:option :let={option}>
|
||||
<div class="flex items-center">
|
||||
<.avatar url={member_icon_url(option.eve_id)} label={option.label} />
|
||||
<%= option.label %>
|
||||
</div>
|
||||
</:option>
|
||||
</.live_select>
|
||||
options={Enum.map(@characters, fn character -> {character.label, character.id} end)}
|
||||
/>
|
||||
<.input
|
||||
type="select"
|
||||
field={f[:scope]}
|
||||
class="p-dropdown p-component p-inputwrapper"
|
||||
class="p-dropdown p-component p-inputwrapper mt-8"
|
||||
placeholder="Select a map scope"
|
||||
options={Enum.map(@scopes, fn scope -> {scope, scope} end)}
|
||||
/>
|
||||
|
||||
@@ -9,6 +9,10 @@ defmodule WandererAppWeb.Router do
|
||||
warn: false,
|
||||
only: [redirect_if_user_is_authenticated: 2]
|
||||
|
||||
import WandererAppWeb.BasicAuth,
|
||||
warn: false,
|
||||
only: [admin_basic_auth: 2]
|
||||
|
||||
@code_reloading Application.compile_env(
|
||||
:wanderer_app,
|
||||
[WandererAppWeb.Endpoint, :code_reloader],
|
||||
@@ -20,6 +24,10 @@ defmodule WandererAppWeb.Router do
|
||||
@font_src ~w('self' data: https://web.ccpgamescdn.com https://w.appzi.io)
|
||||
@script_src ~w('self' )
|
||||
|
||||
pipeline :admin_bauth do
|
||||
plug :admin_basic_auth
|
||||
end
|
||||
|
||||
pipeline :browser do
|
||||
plug(:accepts, ["html"])
|
||||
plug(:fetch_session)
|
||||
@@ -137,11 +145,9 @@ defmodule WandererAppWeb.Router do
|
||||
get "/:provider/callback", AuthController, :callback
|
||||
end
|
||||
|
||||
scope "/", WandererAppWeb do
|
||||
scope "/admin", WandererAppWeb do
|
||||
pipe_through(:browser)
|
||||
|
||||
get "/", RedirectController, :redirect_authenticated
|
||||
get("/last", MapsController, :last)
|
||||
pipe_through(:admin_bauth)
|
||||
|
||||
live_session :admin,
|
||||
on_mount: [
|
||||
@@ -149,9 +155,23 @@ defmodule WandererAppWeb.Router do
|
||||
{WandererAppWeb.UserAuth, :ensure_admin},
|
||||
WandererAppWeb.Nav
|
||||
] do
|
||||
live("/admin", AdminLive, :index)
|
||||
live("/", AdminLive, :index)
|
||||
end
|
||||
|
||||
error_tracker_dashboard("/errors",
|
||||
on_mount: [
|
||||
{WandererAppWeb.UserAuth, :ensure_authenticated},
|
||||
{WandererAppWeb.UserAuth, :ensure_admin}
|
||||
]
|
||||
)
|
||||
end
|
||||
|
||||
scope "/", WandererAppWeb do
|
||||
pipe_through(:browser)
|
||||
|
||||
get "/", RedirectController, :redirect_authenticated
|
||||
get("/last", MapsController, :last)
|
||||
|
||||
live_session :authenticated,
|
||||
on_mount: [
|
||||
{WandererAppWeb.UserAuth, :ensure_authenticated},
|
||||
@@ -180,16 +200,7 @@ defmodule WandererAppWeb.Router do
|
||||
end
|
||||
end
|
||||
|
||||
scope "/admin" do
|
||||
pipe_through(:browser)
|
||||
|
||||
error_tracker_dashboard("/errors",
|
||||
on_mount: [
|
||||
{WandererAppWeb.UserAuth, :ensure_authenticated},
|
||||
{WandererAppWeb.UserAuth, :ensure_admin}
|
||||
]
|
||||
)
|
||||
end
|
||||
|
||||
# Enable LiveDashboard and Swoosh mailbox preview in development
|
||||
if Application.compile_env(:wanderer_app, :dev_routes) do
|
||||
@@ -206,7 +217,6 @@ defmodule WandererAppWeb.Router do
|
||||
error_tracker_dashboard("/errors", as: :error_tracker_dev_dashboard)
|
||||
|
||||
live_dashboard("/dashboard", metrics: WandererAppWeb.Telemetry)
|
||||
# forward("/mailbox", Plug.Swoosh.MailboxPreview)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
7
mix.exs
@@ -2,7 +2,7 @@ defmodule WandererApp.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
@source_url "https://github.com/wanderer-industries/wanderer"
|
||||
@version "1.0.5"
|
||||
@version "1.2.8"
|
||||
|
||||
def project do
|
||||
[
|
||||
@@ -56,7 +56,7 @@ defmodule WandererApp.MixProject do
|
||||
{:phoenix, "~> 1.7.12"},
|
||||
{:phoenix_ecto, "~> 4.6"},
|
||||
{:ecto_sql, "~> 3.10"},
|
||||
{:postgrex, ">= 0.0.0"},
|
||||
{:postgrex, "~> 0.19.1"},
|
||||
{:phoenix_html, "~> 4.0"},
|
||||
{:phoenix_live_reload, "~> 1.5.3", only: :dev},
|
||||
{:phoenix_live_view, "~> 0.20.17"},
|
||||
@@ -111,8 +111,7 @@ defmodule WandererApp.MixProject do
|
||||
{:mox, "~> 1.1", only: [:test, :integration]},
|
||||
{:git_ops, "~> 2.6.1"},
|
||||
{:version_tasks, "~> 0.12.0"},
|
||||
{:error_tracker, "~> 0.2"},
|
||||
{:sourceror, "~> 1.3.0", override: true}
|
||||
{:error_tracker, "~> 0.2"}
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
2
mix.lock
@@ -105,7 +105,7 @@
|
||||
"sleeplocks": {:hex, :sleeplocks, "1.1.3", "96a86460cc33b435c7310dbd27ec82ca2c1f24ae38e34f8edde97f756503441a", [:rebar3], [], "hexpm", "d3b3958552e6eb16f463921e70ae7c767519ef8f5be46d7696cc1ed649421321"},
|
||||
"slugify": {:hex, :slugify, "1.3.1", "0d3b8b7e5c1eeaa960e44dce94382bee34a39b3ea239293e457a9c5b47cc6fd3", [:mix], [], "hexpm", "cb090bbeb056b312da3125e681d98933a360a70d327820e4b7f91645c4d8be76"},
|
||||
"sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"},
|
||||
"sourceror": {:hex, :sourceror, "1.3.0", "70ab9e8bf6df085a1effba4b49ad621b7153b065f69ef6cdb82e6088f2026029", [:mix], [], "hexpm", "1794c3ceeca4eb3f9437261721e4d9cbf846d7c64c7aee4f64062b18d5ce1eac"},
|
||||
"sourceror": {:hex, :sourceror, "1.6.0", "9907884e1449a4bd7dbaabe95088ed4d9a09c3c791fb0103964e6316bc9448a7", [:mix], [], "hexpm", "e90aef8c82dacf32c89c8ef83d1416fc343cd3e5556773eeffd2c1e3f991f699"},
|
||||
"spark": {:hex, :spark, "2.2.29", "a52733ff72b05a674e48d3ca7a4172fe7bec81e9116069da8b4db19030d581d9", [:mix], [{:igniter, ">= 0.3.36 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.2", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "111a0dadbb27537c7629bc03ac56fcab15056ab0b9ad985084b9adcdb48836c8"},
|
||||
"spitfire": {:hex, :spitfire, "0.1.3", "7ea0f544005dfbe48e615ed90250c9a271bfe126914012023fd5e4b6b82b7ec7", [:mix], [], "hexpm", "d53b5107bcff526a05c5bb54c95e77b36834550affd5830c9f58760e8c543657"},
|
||||
"splode": {:hex, :splode, "0.2.4", "71046334c39605095ca4bed5d008372e56454060997da14f9868534c17b84b53", [:mix], [], "hexpm", "ca3b95f0d8d4b482b5357954fec857abd0fa3ea509d623334c1328e7382044c2"},
|
||||
|
||||
65
priv/posts/2024/09-19-connection-info.md
Normal file
@@ -0,0 +1,65 @@
|
||||
%{
|
||||
title: "User Guide: Map Connection Info",
|
||||
author: "Wanderer Team",
|
||||
cover_image_uri: "/images/news/09-19-connection-info/cover.png",
|
||||
tags: ~w(interface guide map connection),
|
||||
description: "This guide provides instructions on how to access and interpret connection information on the map. The connection info feature helps users monitor traffic between systems and estimate the mass of ships that have passed through a connection."
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
## Step-by-Step Guide
|
||||
|
||||
### 1. Accessing Connection Information
|
||||
|
||||

|
||||
|
||||
- **Overview:** Users can view detailed information about system connections, such as wormholes or stargates, to track the ships that have passed through.
|
||||
- **How to Open Connection Info:**
|
||||
1. On the map, locate a connection line between two systems.
|
||||
2. Click on the connection to open the information panel.
|
||||
3. The panel will display key data about the connection, including ships passed, time and estimated mass.
|
||||
|
||||
### 2. Viewing Ships Passed
|
||||
|
||||

|
||||
|
||||
- **Tracked Characters Only:** The information provided about ships that passed through a connection is based on characters being tracked via the map's character tracking system.
|
||||
- **Details Provided:**
|
||||
1. Once the connection info is open, you will see a list of all ships that passed through the connection.
|
||||
2. The ships are displayed along with the names of the tracked characters that piloted them.
|
||||
3. This information allows you to track traffic patterns and analyze ship movements through the connection.
|
||||
|
||||
### 3. Viewing Estimated Ship Mass
|
||||
|
||||
- **Ship Mass Calculation:** The approximate sum of the mass of all ships that passed through the connection is also displayed.
|
||||
- **How the Mass is Calculated:**
|
||||
1. Ship mass is estimated based on the ship type only.
|
||||
2. The displayed mass may not be 100% precise, as factors like ship fittings or enabled propulsion modes can influence the actual mass.
|
||||
3. The total mass of all ships that passed through the connection is provided to help estimate how much mass the connection has handled, which is particularly important for wormhole stability.
|
||||
|
||||
### Important Notes
|
||||
|
||||
- **Accuracy of Values:** Please note that all values (such as ship mass and the number of ships) are approximations. Ship mass is calculated based on known ship types, but the actual mass may vary depending on fittings and propulsion mode settings.
|
||||
- **Tracked Characters Only:** The ships counted in the "Ships Passed" section are only those of characters being tracked by the map. Ships from non-tracked characters or unidentified sources will not be listed.
|
||||
|
||||
### Example Workflow
|
||||
|
||||
1. **Check Connection Info:**
|
||||
- Click on a connection between two systems (e.g., a wormhole connection).
|
||||
- Review the list of ships passed through the connection.
|
||||
|
||||
2. **Monitor Ship Mass:**
|
||||
- In the same panel, review the approximate total mass of the ships that have passed.
|
||||
- Use this information to assess the connection's usage or potential collapse (in the case of wormholes).
|
||||
|
||||
## Conclusion
|
||||
|
||||
The connection information feature is a valuable tool for tracking ship traffic and estimating mass through system connections. While the values are approximations, this feature provides useful insights for map users to monitor and manage connections more effectively. If you have any questions or need further assistance, please contact our support team.
|
||||
|
||||
Fly safe,
|
||||
WANDERER TEAM
|
||||
|
||||
---
|
||||
|
||||
_Note: Eve Online is a trademark of CCP hf. This application is not affiliated with or endorsed by CCP hf._
|
||||
@@ -1490,6 +1490,7 @@ groupID,categoryID,groupName,iconID,useBasePrice,anchored,anchorable,fittableNon
|
||||
4714,25,Non-Interactable Asteroids,None,0,1,0,0,0
|
||||
4716,17,Abyssal Battlefield Filament Materials,None,1,0,0,0,1
|
||||
4717,17,CD Filaments,None,0,0,0,0,1
|
||||
4719,2,Rift,None,0,1,0,0,0
|
||||
4725,2118,Sequence Binders,None,0,0,0,0,1
|
||||
4726,2118,Ship SKIN Design Element,None,0,0,0,0,1
|
||||
4729,2143,Colony Reagents,None,1,0,0,0,1
|
||||
@@ -1512,6 +1513,16 @@ groupID,categoryID,groupName,iconID,useBasePrice,anchored,anchorable,fittableNon
|
||||
4777,87,Structure Light Fighter,None,0,0,0,0,1
|
||||
4778,87,Structure Support Fighter,None,0,0,0,0,1
|
||||
4779,87,Structure Heavy Fighter,None,0,0,0,0,1
|
||||
4795,11,Asteroid Angel Cartel Officer Cruiser,None,0,0,0,0,0
|
||||
4796,11,Asteroid Angel Cartel Officer Frigate,None,0,0,0,0,0
|
||||
4797,11,Asteroid Blood Raiders Officer Cruiser,None,0,0,0,0,0
|
||||
4798,11,Asteroid Blood Raiders Officer Frigate,None,0,0,0,0,0
|
||||
4799,11,Asteroid Guristas Officer Cruiser,None,0,0,0,0,0
|
||||
4800,11,Asteroid Guristas Officer Frigate,None,0,0,0,0,0
|
||||
4801,11,Asteroid Sansha's Nation Officer Cruiser,None,0,0,0,0,0
|
||||
4802,11,Asteroid Sansha's Nation Officer Frigate,None,0,0,0,0,0
|
||||
4803,11,Asteroid Serpentis Officer Cruiser,None,0,0,0,0,0
|
||||
4804,11,Asteroid Serpentis Officer Frigate,None,0,0,0,0,0
|
||||
350858,350001,Infantry Weapons,None,1,0,0,0,0
|
||||
351064,350001,Infantry Dropsuits,None,1,0,0,0,0
|
||||
351121,350001,Infantry Modules,None,1,0,0,0,0
|
||||
|
||||
|
@@ -0,0 +1,54 @@
|
||||
defmodule WandererApp.Repo.Migrations.InstallAshFunctionsExtension420240922090427 do
|
||||
@moduledoc """
|
||||
Installs any extensions that are mentioned in the repo's `installed_extensions/0` callback
|
||||
|
||||
This file was autogenerated with `mix ash_postgres.generate_migrations`
|
||||
"""
|
||||
|
||||
use Ecto.Migration
|
||||
|
||||
def up do
|
||||
execute("""
|
||||
CREATE OR REPLACE FUNCTION uuid_generate_v7()
|
||||
RETURNS UUID
|
||||
AS $$
|
||||
DECLARE
|
||||
timestamp TIMESTAMPTZ;
|
||||
microseconds INT;
|
||||
BEGIN
|
||||
timestamp = clock_timestamp();
|
||||
microseconds = (cast(extract(microseconds FROM timestamp)::INT - (floor(extract(milliseconds FROM timestamp))::INT * 1000) AS DOUBLE PRECISION) * 4.096)::INT;
|
||||
|
||||
RETURN encode(
|
||||
set_byte(
|
||||
set_byte(
|
||||
overlay(uuid_send(gen_random_uuid()) placing substring(int8send(floor(extract(epoch FROM timestamp) * 1000)::BIGINT) FROM 3) FROM 1 FOR 6
|
||||
),
|
||||
6, (b'0111' || (microseconds >> 8)::bit(4))::bit(8)::int
|
||||
),
|
||||
7, microseconds::bit(8)::int
|
||||
),
|
||||
'hex')::UUID;
|
||||
END
|
||||
$$
|
||||
LANGUAGE PLPGSQL
|
||||
VOLATILE;
|
||||
""")
|
||||
|
||||
execute("""
|
||||
CREATE OR REPLACE FUNCTION timestamp_from_uuid_v7(_uuid uuid)
|
||||
RETURNS TIMESTAMP WITHOUT TIME ZONE
|
||||
AS $$
|
||||
SELECT to_timestamp(('x0000' || substr(_uuid::TEXT, 1, 8) || substr(_uuid::TEXT, 10, 4))::BIT(64)::BIGINT::NUMERIC / 1000);
|
||||
$$
|
||||
LANGUAGE SQL
|
||||
IMMUTABLE PARALLEL SAFE STRICT;
|
||||
""")
|
||||
end
|
||||
|
||||
def down do
|
||||
# Uncomment this if you actually want to uninstall the extensions
|
||||
# when this migration is rolled back:
|
||||
execute("DROP FUNCTION IF EXISTS uuid_generate_v7(), timestamp_from_uuid_v7(uuid)")
|
||||
end
|
||||
end
|
||||
100
priv/repo/migrations/20240922090430_add_map_acl_fk_check.exs
Normal file
@@ -0,0 +1,100 @@
|
||||
defmodule WandererApp.Repo.Migrations.AddMapAclFkCheck 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
|
||||
drop constraint(:map_access_lists_v1, "map_access_lists_v1_access_list_id_fkey")
|
||||
|
||||
drop constraint(:map_access_lists_v1, "map_access_lists_v1_map_id_fkey")
|
||||
|
||||
alter table(:map_access_lists_v1) do
|
||||
modify :map_id,
|
||||
references(:maps_v1,
|
||||
column: :id,
|
||||
name: "map_access_lists_v1_map_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public",
|
||||
on_delete: :delete_all
|
||||
)
|
||||
end
|
||||
|
||||
drop constraint(:access_list_members_v1, "access_list_members_v1_access_list_id_fkey")
|
||||
|
||||
alter table(:access_list_members_v1) do
|
||||
modify :access_list_id,
|
||||
references(:access_lists_v1,
|
||||
column: :id,
|
||||
name: "access_list_members_v1_access_list_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public",
|
||||
on_delete: :delete_all
|
||||
)
|
||||
end
|
||||
|
||||
execute(
|
||||
"ALTER TABLE access_list_members_v1 alter CONSTRAINT access_list_members_v1_access_list_id_fkey NOT DEFERRABLE"
|
||||
)
|
||||
|
||||
execute(
|
||||
"ALTER TABLE map_access_lists_v1 alter CONSTRAINT map_access_lists_v1_map_id_fkey NOT DEFERRABLE"
|
||||
)
|
||||
|
||||
alter table(:map_access_lists_v1) do
|
||||
modify :access_list_id,
|
||||
references(:access_lists_v1,
|
||||
column: :id,
|
||||
name: "map_access_lists_v1_access_list_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public",
|
||||
on_delete: :delete_all
|
||||
)
|
||||
end
|
||||
|
||||
execute(
|
||||
"ALTER TABLE map_access_lists_v1 alter CONSTRAINT map_access_lists_v1_access_list_id_fkey NOT DEFERRABLE"
|
||||
)
|
||||
end
|
||||
|
||||
def down do
|
||||
drop constraint(:map_access_lists_v1, "map_access_lists_v1_access_list_id_fkey")
|
||||
|
||||
alter table(:map_access_lists_v1) do
|
||||
modify :access_list_id,
|
||||
references(:access_lists_v1,
|
||||
column: :id,
|
||||
name: "map_access_lists_v1_access_list_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public"
|
||||
)
|
||||
end
|
||||
|
||||
drop constraint(:access_list_members_v1, "access_list_members_v1_access_list_id_fkey")
|
||||
|
||||
alter table(:access_list_members_v1) do
|
||||
modify :access_list_id,
|
||||
references(:access_lists_v1,
|
||||
column: :id,
|
||||
name: "access_list_members_v1_access_list_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public"
|
||||
)
|
||||
end
|
||||
|
||||
drop constraint(:map_access_lists_v1, "map_access_lists_v1_map_id_fkey")
|
||||
|
||||
alter table(:map_access_lists_v1) do
|
||||
modify :map_id,
|
||||
references(:maps_v1,
|
||||
column: :id,
|
||||
name: "map_access_lists_v1_map_id_fkey",
|
||||
type: :uuid,
|
||||
prefix: "public"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"attributes": [
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"gen_random_uuid()\")",
|
||||
"generated?": false,
|
||||
"primary_key?": true,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "id",
|
||||
"type": "uuid"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "name",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"allow_nil?": true,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "eve_character_id",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"allow_nil?": true,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "eve_corporation_id",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"allow_nil?": true,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "eve_alliance_id",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"allow_nil?": true,
|
||||
"default": "\"viewer\"",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "role",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "inserted_at",
|
||||
"type": "utc_datetime_usec"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "updated_at",
|
||||
"type": "utc_datetime_usec"
|
||||
},
|
||||
{
|
||||
"allow_nil?": true,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": {
|
||||
"deferrable": false,
|
||||
"destination_attribute": "id",
|
||||
"destination_attribute_default": null,
|
||||
"destination_attribute_generated": null,
|
||||
"index?": false,
|
||||
"match_type": null,
|
||||
"match_with": null,
|
||||
"multitenancy": {
|
||||
"attribute": null,
|
||||
"global": null,
|
||||
"strategy": null
|
||||
},
|
||||
"name": "access_list_members_v1_access_list_id_fkey",
|
||||
"on_delete": "delete",
|
||||
"on_update": null,
|
||||
"primary_key?": true,
|
||||
"schema": "public",
|
||||
"table": "access_lists_v1"
|
||||
},
|
||||
"size": null,
|
||||
"source": "access_list_id",
|
||||
"type": "uuid"
|
||||
}
|
||||
],
|
||||
"base_filter": null,
|
||||
"check_constraints": [],
|
||||
"custom_indexes": [],
|
||||
"custom_statements": [],
|
||||
"has_create_action": true,
|
||||
"hash": "C513B5FDD62707C1E7491D194C5A33DB6A8F060DC7FA0BD6AECA2A8BE9EAD65E",
|
||||
"identities": [
|
||||
{
|
||||
"all_tenants?": false,
|
||||
"base_filter": null,
|
||||
"index_name": "access_list_members_v1_uniq_acl_alliance_id_index",
|
||||
"keys": [
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "access_list_id"
|
||||
},
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "eve_alliance_id"
|
||||
}
|
||||
],
|
||||
"name": "uniq_acl_alliance_id",
|
||||
"nils_distinct?": true,
|
||||
"where": null
|
||||
},
|
||||
{
|
||||
"all_tenants?": false,
|
||||
"base_filter": null,
|
||||
"index_name": "access_list_members_v1_uniq_acl_character_id_index",
|
||||
"keys": [
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "access_list_id"
|
||||
},
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "eve_character_id"
|
||||
}
|
||||
],
|
||||
"name": "uniq_acl_character_id",
|
||||
"nils_distinct?": true,
|
||||
"where": null
|
||||
},
|
||||
{
|
||||
"all_tenants?": false,
|
||||
"base_filter": null,
|
||||
"index_name": "access_list_members_v1_uniq_acl_corporation_id_index",
|
||||
"keys": [
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "access_list_id"
|
||||
},
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "eve_corporation_id"
|
||||
}
|
||||
],
|
||||
"name": "uniq_acl_corporation_id",
|
||||
"nils_distinct?": true,
|
||||
"where": null
|
||||
}
|
||||
],
|
||||
"multitenancy": {
|
||||
"attribute": null,
|
||||
"global": null,
|
||||
"strategy": null
|
||||
},
|
||||
"repo": "Elixir.WandererApp.Repo",
|
||||
"schema": null,
|
||||
"table": "access_list_members_v1"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"ash_functions_version": 3,
|
||||
"ash_functions_version": 4,
|
||||
"installed": [
|
||||
"ash-functions"
|
||||
]
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
{
|
||||
"attributes": [
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"gen_random_uuid()\")",
|
||||
"generated?": false,
|
||||
"primary_key?": true,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "id",
|
||||
"type": "uuid"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "inserted_at",
|
||||
"type": "utc_datetime_usec"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "fragment(\"(now() AT TIME ZONE 'utc')\")",
|
||||
"generated?": false,
|
||||
"primary_key?": false,
|
||||
"references": null,
|
||||
"size": null,
|
||||
"source": "updated_at",
|
||||
"type": "utc_datetime_usec"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": true,
|
||||
"references": {
|
||||
"deferrable": false,
|
||||
"destination_attribute": "id",
|
||||
"destination_attribute_default": null,
|
||||
"destination_attribute_generated": null,
|
||||
"index?": false,
|
||||
"match_type": null,
|
||||
"match_with": null,
|
||||
"multitenancy": {
|
||||
"attribute": null,
|
||||
"global": null,
|
||||
"strategy": null
|
||||
},
|
||||
"name": "map_access_lists_v1_map_id_fkey",
|
||||
"on_delete": "delete",
|
||||
"on_update": null,
|
||||
"primary_key?": true,
|
||||
"schema": "public",
|
||||
"table": "maps_v1"
|
||||
},
|
||||
"size": null,
|
||||
"source": "map_id",
|
||||
"type": "uuid"
|
||||
},
|
||||
{
|
||||
"allow_nil?": false,
|
||||
"default": "nil",
|
||||
"generated?": false,
|
||||
"primary_key?": true,
|
||||
"references": {
|
||||
"deferrable": false,
|
||||
"destination_attribute": "id",
|
||||
"destination_attribute_default": null,
|
||||
"destination_attribute_generated": null,
|
||||
"index?": false,
|
||||
"match_type": null,
|
||||
"match_with": null,
|
||||
"multitenancy": {
|
||||
"attribute": null,
|
||||
"global": null,
|
||||
"strategy": null
|
||||
},
|
||||
"name": "map_access_lists_v1_access_list_id_fkey",
|
||||
"on_delete": "delete",
|
||||
"on_update": null,
|
||||
"primary_key?": true,
|
||||
"schema": "public",
|
||||
"table": "access_lists_v1"
|
||||
},
|
||||
"size": null,
|
||||
"source": "access_list_id",
|
||||
"type": "uuid"
|
||||
}
|
||||
],
|
||||
"base_filter": null,
|
||||
"check_constraints": [],
|
||||
"custom_indexes": [],
|
||||
"custom_statements": [],
|
||||
"has_create_action": true,
|
||||
"hash": "1790C0240D55A6A1F6346B22E98AED5387F62E11BB258541CC1F95679C955F42",
|
||||
"identities": [
|
||||
{
|
||||
"all_tenants?": false,
|
||||
"base_filter": null,
|
||||
"index_name": "map_access_lists_v1_unique_map_acl_index",
|
||||
"keys": [
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "map_id"
|
||||
},
|
||||
{
|
||||
"type": "atom",
|
||||
"value": "access_list_id"
|
||||
}
|
||||
],
|
||||
"name": "unique_map_acl",
|
||||
"nils_distinct?": true,
|
||||
"where": null
|
||||
}
|
||||
],
|
||||
"multitenancy": {
|
||||
"attribute": null,
|
||||
"global": null,
|
||||
"strategy": null
|
||||
},
|
||||
"repo": "Elixir.WandererApp.Repo",
|
||||
"schema": null,
|
||||
"table": "map_access_lists_v1"
|
||||
}
|
||||
BIN
priv/static/images/news/09-19-connection-info/connection.png
Normal file
|
After Width: | Height: | Size: 304 KiB |
BIN
priv/static/images/news/09-19-connection-info/cover.png
Normal file
|
After Width: | Height: | Size: 285 KiB |
BIN
priv/static/images/news/09-19-connection-info/info.png
Normal file
|
After Width: | Height: | Size: 189 KiB |
@@ -1,6 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
export ERL_AFLAGS="-proto_dist inet6_tcp"
|
||||
export ECTO_IPV6="true"
|
||||
export RELEASE_DISTRIBUTION="name"
|
||||
export RELEASE_NODE="${FLY_APP_NAME}-${FLY_IMAGE_REF##*-}@${FLY_PRIVATE_IP}"
|
||||
|
||||