mirror of
https://github.com/wanderer-industries/wanderer
synced 2025-12-13 11:15:51 +00:00
feat(Signatures): Added "Lazy delete" option & got rid of update popup
This commit is contained in:
@@ -1,5 +1,11 @@
|
|||||||
import { Widget } from '@/hooks/Mapper/components/mapInterface/components';
|
import { Widget } from '@/hooks/Mapper/components/mapInterface/components';
|
||||||
import { InfoDrawer, LayoutEventBlocker, TooltipPosition, WdImgButton } from '@/hooks/Mapper/components/ui-kit';
|
import {
|
||||||
|
InfoDrawer,
|
||||||
|
LayoutEventBlocker,
|
||||||
|
TooltipPosition,
|
||||||
|
WdImgButton,
|
||||||
|
WdCheckbox,
|
||||||
|
} from '@/hooks/Mapper/components/ui-kit';
|
||||||
import { SystemSignaturesContent } from './SystemSignaturesContent';
|
import { SystemSignaturesContent } from './SystemSignaturesContent';
|
||||||
import {
|
import {
|
||||||
Setting,
|
Setting,
|
||||||
@@ -14,19 +20,22 @@ import {
|
|||||||
} from './SystemSignatureSettingsDialog';
|
} from './SystemSignatureSettingsDialog';
|
||||||
import { SignatureGroup } from '@/hooks/Mapper/types';
|
import { SignatureGroup } from '@/hooks/Mapper/types';
|
||||||
|
|
||||||
import React, { useCallback, useEffect, useState } from 'react';
|
import React, { useCallback, useEffect, useState, useMemo } from 'react';
|
||||||
|
|
||||||
import { PrimeIcons } from 'primereact/api';
|
import { PrimeIcons } from 'primereact/api';
|
||||||
|
|
||||||
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
|
import { useMapRootState } from '@/hooks/Mapper/mapRootProvider';
|
||||||
|
import { CheckboxChangeEvent } from 'primereact/checkbox';
|
||||||
|
|
||||||
const SIGNATURE_SETTINGS_KEY = 'wanderer_system_signature_settings_v4_1';
|
const SIGNATURE_SETTINGS_KEY = 'wanderer_system_signature_settings_v5';
|
||||||
export const SHOW_DESCRIPTION_COLUMN_SETTING = 'show_description_column_setting';
|
export const SHOW_DESCRIPTION_COLUMN_SETTING = 'show_description_column_setting';
|
||||||
export const SHOW_UPDATED_COLUMN_SETTING = 'SHOW_UPDATED_COLUMN_SETTING';
|
export const SHOW_UPDATED_COLUMN_SETTING = 'SHOW_UPDATED_COLUMN_SETTING';
|
||||||
|
export const LAZY_DELETE_SIGNATURES_SETTING = 'LAZY_DELETE_SIGNATURES_SETTING';
|
||||||
|
|
||||||
const settings: Setting[] = [
|
const settings: Setting[] = [
|
||||||
{ key: SHOW_UPDATED_COLUMN_SETTING, name: 'Show Updated Column', value: false, isFilter: false },
|
{ key: SHOW_UPDATED_COLUMN_SETTING, name: 'Show Updated Column', value: false, isFilter: false },
|
||||||
{ key: SHOW_DESCRIPTION_COLUMN_SETTING, name: 'Show Description Column', value: false, isFilter: false },
|
{ key: SHOW_DESCRIPTION_COLUMN_SETTING, name: 'Show Description Column', value: false, isFilter: false },
|
||||||
|
{ key: LAZY_DELETE_SIGNATURES_SETTING, name: 'Lazy Delete Signatures', value: false, isFilter: false },
|
||||||
{ key: COSMIC_ANOMALY, name: 'Show Anomalies', value: true, isFilter: true },
|
{ key: COSMIC_ANOMALY, name: 'Show Anomalies', value: true, isFilter: true },
|
||||||
{ key: COSMIC_SIGNATURE, name: 'Show Cosmic Signatures', value: true, isFilter: true },
|
{ key: COSMIC_SIGNATURE, name: 'Show Cosmic Signatures', value: true, isFilter: true },
|
||||||
{ key: DEPLOYABLE, name: 'Show Deployables', value: true, isFilter: true },
|
{ key: DEPLOYABLE, name: 'Show Deployables', value: true, isFilter: true },
|
||||||
@@ -58,12 +67,25 @@ export const SystemSignatures = () => {
|
|||||||
|
|
||||||
const isNotSelectedSystem = selectedSystems.length !== 1;
|
const isNotSelectedSystem = selectedSystems.length !== 1;
|
||||||
|
|
||||||
|
const lazyDeleteValue = useMemo(() => {
|
||||||
|
return settings.find(setting => setting.key === LAZY_DELETE_SIGNATURES_SETTING)!.value;
|
||||||
|
}, [settings]);
|
||||||
|
|
||||||
const handleSettingsChange = useCallback((settings: Setting[]) => {
|
const handleSettingsChange = useCallback((settings: Setting[]) => {
|
||||||
setSettings(settings);
|
setSettings(settings);
|
||||||
localStorage.setItem(SIGNATURE_SETTINGS_KEY, JSON.stringify(settings));
|
localStorage.setItem(SIGNATURE_SETTINGS_KEY, JSON.stringify(settings));
|
||||||
setVisible(false);
|
setVisible(false);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const handleLazyDeleteChange = useCallback((event: CheckboxChangeEvent) => {
|
||||||
|
setSettings(settings => {
|
||||||
|
const lazyDelete = settings.find(setting => setting.key === LAZY_DELETE_SIGNATURES_SETTING)!;
|
||||||
|
lazyDelete.value = !!event.checked;
|
||||||
|
localStorage.setItem(SIGNATURE_SETTINGS_KEY, JSON.stringify(settings));
|
||||||
|
return [...settings];
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const restoredSettings = localStorage.getItem(SIGNATURE_SETTINGS_KEY);
|
const restoredSettings = localStorage.getItem(SIGNATURE_SETTINGS_KEY);
|
||||||
|
|
||||||
@@ -79,6 +101,15 @@ export const SystemSignatures = () => {
|
|||||||
<div className="flex gap-1">System Signatures</div>
|
<div className="flex gap-1">System Signatures</div>
|
||||||
|
|
||||||
<LayoutEventBlocker className="flex gap-2.5">
|
<LayoutEventBlocker className="flex gap-2.5">
|
||||||
|
<WdCheckbox
|
||||||
|
size="xs"
|
||||||
|
labelSide="left"
|
||||||
|
label={'Lazy delete'}
|
||||||
|
value={lazyDeleteValue}
|
||||||
|
classNameLabel="text-stone-400 hover:text-stone-200 transition duration-300"
|
||||||
|
onChange={handleLazyDeleteChange}
|
||||||
|
/>
|
||||||
|
|
||||||
<WdImgButton
|
<WdImgButton
|
||||||
className={PrimeIcons.QUESTION_CIRCLE}
|
className={PrimeIcons.QUESTION_CIRCLE}
|
||||||
tooltip={{
|
tooltip={{
|
||||||
@@ -102,7 +133,7 @@ export const SystemSignatures = () => {
|
|||||||
</InfoDrawer>
|
</InfoDrawer>
|
||||||
<InfoDrawer title={<b className="text-slate-50">How to delete?</b>}>
|
<InfoDrawer title={<b className="text-slate-50">How to delete?</b>}>
|
||||||
For delete any signature first of all you need select before
|
For delete any signature first of all you need select before
|
||||||
<br /> and then use <b className="text-sky-500">Backspace</b>
|
<br /> and then use <b className="text-sky-500">Del</b>
|
||||||
</InfoDrawer>
|
</InfoDrawer>
|
||||||
</div>
|
</div>
|
||||||
) as React.ReactNode,
|
) as React.ReactNode,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import { COSMIC_SIGNATURE } from '@/hooks/Mapper/components/mapInterface/widgets
|
|||||||
import {
|
import {
|
||||||
SHOW_DESCRIPTION_COLUMN_SETTING,
|
SHOW_DESCRIPTION_COLUMN_SETTING,
|
||||||
SHOW_UPDATED_COLUMN_SETTING,
|
SHOW_UPDATED_COLUMN_SETTING,
|
||||||
|
LAZY_DELETE_SIGNATURES_SETTING,
|
||||||
} from '@/hooks/Mapper/components/mapInterface/widgets/SystemSignatures';
|
} from '@/hooks/Mapper/components/mapInterface/widgets/SystemSignatures';
|
||||||
type SystemSignaturesSortSettings = {
|
type SystemSignaturesSortSettings = {
|
||||||
sortField: string;
|
sortField: string;
|
||||||
@@ -66,8 +67,6 @@ export const SystemSignaturesContent = ({
|
|||||||
const [signatures, setSignatures, signaturesRef] = useRefState<SystemSignature[]>([]);
|
const [signatures, setSignatures, signaturesRef] = useRefState<SystemSignature[]>([]);
|
||||||
const [selectedSignatures, setSelectedSignatures] = useState<SystemSignature[]>([]);
|
const [selectedSignatures, setSelectedSignatures] = useState<SystemSignature[]>([]);
|
||||||
const [nameColumnWidth, setNameColumnWidth] = useState('auto');
|
const [nameColumnWidth, setNameColumnWidth] = useState('auto');
|
||||||
const [parsedSignatures, setParsedSignatures] = useState<SystemSignature[]>([]);
|
|
||||||
const [askUser, setAskUser] = useState(false);
|
|
||||||
const [selectedSignature, setSelectedSignature] = useState<SystemSignature | null>(null);
|
const [selectedSignature, setSelectedSignature] = useState<SystemSignature | null>(null);
|
||||||
|
|
||||||
const [hoveredSig, setHoveredSig] = useState<SystemSignature | null>(null);
|
const [hoveredSig, setHoveredSig] = useState<SystemSignature | null>(null);
|
||||||
@@ -84,6 +83,10 @@ export const SystemSignaturesContent = ({
|
|||||||
|
|
||||||
const tooltipRef = useRef<WdTooltipHandlers>(null);
|
const tooltipRef = useRef<WdTooltipHandlers>(null);
|
||||||
|
|
||||||
|
const lazyDeleteValue = useMemo(() => {
|
||||||
|
return settings.find(setting => setting.key === LAZY_DELETE_SIGNATURES_SETTING)!.value;
|
||||||
|
}, [settings]);
|
||||||
|
|
||||||
const handleResize = useCallback(() => {
|
const handleResize = useCallback(() => {
|
||||||
if (tableRef.current) {
|
if (tableRef.current) {
|
||||||
const tableWidth = tableRef.current.offsetWidth;
|
const tableWidth = tableRef.current.offsetWidth;
|
||||||
@@ -132,13 +135,17 @@ export const SystemSignaturesContent = ({
|
|||||||
data: { system_id: systemId },
|
data: { system_id: systemId },
|
||||||
});
|
});
|
||||||
|
|
||||||
setAskUser(false);
|
|
||||||
setSignatures(signatures);
|
setSignatures(signatures);
|
||||||
}, [outCommand, systemId]);
|
}, [outCommand, systemId]);
|
||||||
|
|
||||||
const handleUpdateSignatures = useCallback(
|
const handleUpdateSignatures = useCallback(
|
||||||
async (newSignatures: SystemSignature[], updateOnly: boolean) => {
|
async (newSignatures: SystemSignature[], updateOnly: boolean, skipUpdateUntouched?: boolean) => {
|
||||||
const { added, updated, removed } = getActualSigs(signaturesRef.current, newSignatures, updateOnly);
|
const { added, updated, removed } = getActualSigs(
|
||||||
|
signaturesRef.current,
|
||||||
|
newSignatures,
|
||||||
|
updateOnly,
|
||||||
|
skipUpdateUntouched,
|
||||||
|
);
|
||||||
|
|
||||||
const { signatures: updatedSignatures } = await outCommand({
|
const { signatures: updatedSignatures } = await outCommand({
|
||||||
type: OutCommand.updateSignatures,
|
type: OutCommand.updateSignatures,
|
||||||
@@ -172,6 +179,7 @@ export const SystemSignaturesContent = ({
|
|||||||
await handleUpdateSignatures(
|
await handleUpdateSignatures(
|
||||||
signatures.filter(x => !selectedSignaturesEveIds.includes(x.eve_id)),
|
signatures.filter(x => !selectedSignaturesEveIds.includes(x.eve_id)),
|
||||||
false,
|
false,
|
||||||
|
true,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
[handleUpdateSignatures, selectable, signatures, selectedSignatures],
|
[handleUpdateSignatures, selectable, signatures, selectedSignatures],
|
||||||
@@ -181,16 +189,6 @@ export const SystemSignaturesContent = ({
|
|||||||
setSelectedSignatures(signatures);
|
setSelectedSignatures(signatures);
|
||||||
}, [signatures]);
|
}, [signatures]);
|
||||||
|
|
||||||
const handleReplaceAll = useCallback(() => {
|
|
||||||
handleUpdateSignatures(parsedSignatures, false);
|
|
||||||
setAskUser(false);
|
|
||||||
}, [parsedSignatures, handleUpdateSignatures]);
|
|
||||||
|
|
||||||
const handleUpdateOnly = useCallback(() => {
|
|
||||||
handleUpdateSignatures(parsedSignatures, true);
|
|
||||||
setAskUser(false);
|
|
||||||
}, [parsedSignatures, handleUpdateSignatures]);
|
|
||||||
|
|
||||||
const handleSelectSignatures = useCallback(
|
const handleSelectSignatures = useCallback(
|
||||||
// TODO still will be good to define types if we use typescript
|
// TODO still will be good to define types if we use typescript
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@@ -219,14 +217,7 @@ export const SystemSignaturesContent = ({
|
|||||||
settings.map(x => x.key),
|
settings.map(x => x.key),
|
||||||
);
|
);
|
||||||
|
|
||||||
const { removed } = getActualSigs(signaturesRef.current, newSignatures, false);
|
handleUpdateSignatures(newSignatures, !lazyDeleteValue);
|
||||||
|
|
||||||
if (!signaturesRef.current || !signaturesRef.current.length || !removed.length) {
|
|
||||||
handleUpdateSignatures(newSignatures, false);
|
|
||||||
} else {
|
|
||||||
setParsedSignatures(newSignatures);
|
|
||||||
setAskUser(true);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
useHotkey(true, ['a'], handleSelectAll);
|
useHotkey(true, ['a'], handleSelectAll);
|
||||||
@@ -237,7 +228,6 @@ export const SystemSignaturesContent = ({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!systemId) {
|
if (!systemId) {
|
||||||
setSignatures([]);
|
setSignatures([]);
|
||||||
setAskUser(false);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,27 +420,6 @@ export const SystemSignaturesContent = ({
|
|||||||
signatureData={selectedSignature}
|
signatureData={selectedSignature}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{askUser && (
|
|
||||||
<div className="absolute left-[1px] top-[29px] h-[calc(100%-30px)] w-[calc(100%-3px)] bg-stone-900/10 backdrop-blur-sm">
|
|
||||||
<div className="absolute top-0 left-0 w-full h-full flex flex-col items-center justify-center">
|
|
||||||
<div className="text-stone-400/80 text-sm">
|
|
||||||
<div className="flex flex-col text-center gap-2">
|
|
||||||
<button className="p-button p-component p-button-outlined p-button-sm btn-wide">
|
|
||||||
<span className="p-button-label p-c" onClick={handleUpdateOnly}>
|
|
||||||
Update
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
<button className="p-button p-component p-button-outlined p-button-sm btn-wide">
|
|
||||||
<span className="p-button-label p-c" onClick={handleReplaceAll}>
|
|
||||||
Update & Delete missing
|
|
||||||
</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ export const getActualSigs = (
|
|||||||
oldSignatures: SystemSignature[],
|
oldSignatures: SystemSignature[],
|
||||||
newSignatures: SystemSignature[],
|
newSignatures: SystemSignature[],
|
||||||
updateOnly: boolean,
|
updateOnly: boolean,
|
||||||
|
skipUpdateUntouched?: boolean,
|
||||||
): { added: SystemSignature[]; updated: SystemSignature[]; removed: SystemSignature[] } => {
|
): { added: SystemSignature[]; updated: SystemSignature[]; removed: SystemSignature[] } => {
|
||||||
const updated: SystemSignature[] = [];
|
const updated: SystemSignature[] = [];
|
||||||
const removed: SystemSignature[] = [];
|
const removed: SystemSignature[] = [];
|
||||||
@@ -19,7 +20,7 @@ export const getActualSigs = (
|
|||||||
const isNeedUpgrade = getState(GROUPS_LIST, newSig) > getState(GROUPS_LIST, oldSig);
|
const isNeedUpgrade = getState(GROUPS_LIST, newSig) > getState(GROUPS_LIST, oldSig);
|
||||||
if (isNeedUpgrade) {
|
if (isNeedUpgrade) {
|
||||||
updated.push({ ...oldSig, group: newSig.group, name: newSig.name });
|
updated.push({ ...oldSig, group: newSig.group, name: newSig.name });
|
||||||
} else {
|
} else if (!skipUpdateUntouched) {
|
||||||
updated.push({ ...oldSig });
|
updated.push({ ...oldSig });
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user