mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
R: Invalidate OSS on RSForm change. Minor UI fixes
Some checks are pending
Frontend CI / build (22.x) (push) Waiting to run
Some checks are pending
Frontend CI / build (22.x) (push) Waiting to run
This commit is contained in:
parent
35883458f3
commit
88c9b646eb
|
@ -11,7 +11,7 @@ function ApplicationLayout() {
|
|||
const { viewportHeight, mainHeight, showScroll } = useConceptOptions();
|
||||
return (
|
||||
<NavigationState>
|
||||
<div className='min-w-[20rem] clr-app antialiased'>
|
||||
<div className='min-w-[20rem] clr-app antialiased h-full'>
|
||||
<ConceptToaster
|
||||
className='mt-[4rem] text-sm' // prettier: split lines
|
||||
autoClose={3000}
|
||||
|
@ -29,7 +29,7 @@ function ApplicationLayout() {
|
|||
}}
|
||||
>
|
||||
<main
|
||||
className='w-full cc-scroll-y'
|
||||
className='w-full h-full cc-scroll-y'
|
||||
style={{ overflowY: showScroll ? 'scroll' : 'auto', minHeight: mainHeight }}
|
||||
>
|
||||
<Outlet />
|
||||
|
|
|
@ -6,6 +6,7 @@ import { pdfjs } from 'react-pdf';
|
|||
|
||||
import { AuthState } from '@/context/AuthContext';
|
||||
import { OptionsState } from '@/context/ConceptOptionsContext';
|
||||
import { GlobalOssState } from '@/context/GlobalOssContext';
|
||||
import { LibraryState } from '@/context/LibraryContext';
|
||||
import { UsersState } from '@/context/UsersContext';
|
||||
|
||||
|
@ -37,9 +38,11 @@ function GlobalProviders({ children }: { children: React.ReactNode }) {
|
|||
<UsersState>
|
||||
<AuthState>
|
||||
<LibraryState>
|
||||
<GlobalOssState>
|
||||
|
||||
{children}
|
||||
|
||||
</GlobalOssState>
|
||||
</LibraryState>
|
||||
</AuthState>
|
||||
</UsersState>
|
||||
|
|
|
@ -62,7 +62,7 @@ function TooltipOperation({ node, anchor }: TooltipOperationProps) {
|
|||
);
|
||||
|
||||
return (
|
||||
<Tooltip layer='z-modalTooltip' anchorSelect={anchor} className='max-w-[35rem] max-h-[40rem] dense my-3'>
|
||||
<Tooltip layer='z-modalTooltip' anchorSelect={anchor} className='max-w-[35rem] max-h-[40rem] dense'>
|
||||
<h2>{node.data.operation.alias}</h2>
|
||||
<p>
|
||||
<b>Тип:</b> {labelOperationType(node.data.operation.operation_type)}
|
||||
|
|
111
rsconcept/frontend/src/context/GlobalOssContext.tsx
Normal file
111
rsconcept/frontend/src/context/GlobalOssContext.tsx
Normal file
|
@ -0,0 +1,111 @@
|
|||
'use client';
|
||||
|
||||
import { createContext, useCallback, useContext, useState } from 'react';
|
||||
|
||||
import { ErrorData } from '@/components/info/InfoError';
|
||||
import useOssDetails from '@/hooks/useOssDetails';
|
||||
import { LibraryItemID } from '@/models/library';
|
||||
import { IOperationSchema, IOperationSchemaData } from '@/models/oss';
|
||||
import { contextOutsideScope } from '@/utils/labels';
|
||||
|
||||
import { useLibrary } from './LibraryContext';
|
||||
|
||||
interface IGlobalOssContext {
|
||||
schema: IOperationSchema | undefined;
|
||||
setID: (id: string | undefined) => void;
|
||||
setData: (data: IOperationSchemaData) => void;
|
||||
loading: boolean;
|
||||
loadingError: ErrorData;
|
||||
isValid: boolean;
|
||||
|
||||
invalidate: () => void;
|
||||
invalidateItem: (target: LibraryItemID) => void;
|
||||
reload: (callback?: () => void) => void;
|
||||
}
|
||||
|
||||
const GlobalOssContext = createContext<IGlobalOssContext | null>(null);
|
||||
export const useGlobalOss = (): IGlobalOssContext => {
|
||||
const context = useContext(GlobalOssContext);
|
||||
if (context === null) {
|
||||
throw new Error(contextOutsideScope('useGlobalOss', 'GlobalOssState'));
|
||||
}
|
||||
return context;
|
||||
};
|
||||
|
||||
interface GlobalOssStateProps {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export const GlobalOssState = ({ children }: GlobalOssStateProps) => {
|
||||
const library = useLibrary();
|
||||
const [isValid, setIsValid] = useState(false);
|
||||
const [ossID, setIdInternal] = useState<string | undefined>(undefined);
|
||||
const {
|
||||
schema: schema, // prettier: split lines
|
||||
error: loadingError,
|
||||
setSchema: setDataInternal,
|
||||
loading: loading,
|
||||
reload: reloadInternal
|
||||
} = useOssDetails({ target: ossID, items: library.items });
|
||||
|
||||
const reload = useCallback(
|
||||
(callback?: () => void) => {
|
||||
reloadInternal(undefined, () => {
|
||||
setIsValid(true);
|
||||
if (callback) callback();
|
||||
});
|
||||
},
|
||||
[reloadInternal]
|
||||
);
|
||||
|
||||
const setData = useCallback(
|
||||
(data: IOperationSchemaData) => {
|
||||
setDataInternal(data);
|
||||
setIsValid(true);
|
||||
},
|
||||
[setDataInternal]
|
||||
);
|
||||
|
||||
const setID = useCallback(
|
||||
(id: string | undefined) => {
|
||||
setIdInternal(prev => {
|
||||
if (prev === id && !isValid) {
|
||||
reload();
|
||||
}
|
||||
return id;
|
||||
});
|
||||
},
|
||||
[setIdInternal, isValid, reload]
|
||||
);
|
||||
|
||||
const invalidate = useCallback(() => {
|
||||
setIsValid(false);
|
||||
}, []);
|
||||
|
||||
const invalidateItem = useCallback(
|
||||
(target: LibraryItemID) => {
|
||||
if (schema?.schemas.includes(target)) {
|
||||
setIsValid(false);
|
||||
}
|
||||
},
|
||||
[schema]
|
||||
);
|
||||
|
||||
return (
|
||||
<GlobalOssContext.Provider
|
||||
value={{
|
||||
schema,
|
||||
setID,
|
||||
setData,
|
||||
loading,
|
||||
loadingError,
|
||||
reload,
|
||||
isValid,
|
||||
invalidateItem,
|
||||
invalidate
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</GlobalOssContext.Provider>
|
||||
);
|
||||
};
|
|
@ -13,13 +13,11 @@ import {
|
|||
} from '@/backend/library';
|
||||
import { getRSFormDetails, postRSFormFromFile } from '@/backend/rsforms';
|
||||
import { ErrorData } from '@/components/info/InfoError';
|
||||
import useOssDetails from '@/hooks/useOssDetails';
|
||||
import { FolderTree } from '@/models/FolderTree';
|
||||
import { ILibraryItem, LibraryItemID, LocationHead } from '@/models/library';
|
||||
import { ILibraryCreateData } from '@/models/library';
|
||||
import { matchLibraryItem, matchLibraryItemLocation } from '@/models/libraryAPI';
|
||||
import { ILibraryFilter } from '@/models/miscellaneous';
|
||||
import { IOperationSchema, IOperationSchemaData } from '@/models/oss';
|
||||
import { IRSForm, IRSFormCloneData, IRSFormData } from '@/models/rsform';
|
||||
import { RSFormLoader } from '@/models/RSFormLoader';
|
||||
import { contextOutsideScope } from '@/utils/labels';
|
||||
|
@ -36,17 +34,10 @@ interface ILibraryContext {
|
|||
loadingError: ErrorData;
|
||||
setLoadingError: (error: ErrorData) => void;
|
||||
|
||||
globalOSS: IOperationSchema | undefined;
|
||||
setGlobalID: (id: string | undefined) => void;
|
||||
setGlobalOSS: (data: IOperationSchemaData) => void;
|
||||
ossLoading: boolean;
|
||||
ossError: ErrorData;
|
||||
|
||||
processing: boolean;
|
||||
processingError: ErrorData;
|
||||
setProcessingError: (error: ErrorData) => void;
|
||||
|
||||
reloadOSS: (callback?: () => void) => void;
|
||||
reloadItems: (callback?: () => void) => void;
|
||||
|
||||
applyFilter: (params: ILibraryFilter) => ILibraryItem[];
|
||||
|
@ -84,22 +75,6 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
const [processingError, setProcessingError] = useState<ErrorData>(undefined);
|
||||
const [cachedTemplates, setCachedTemplates] = useState<IRSForm[]>([]);
|
||||
|
||||
const [ossID, setGlobalID] = useState<string | undefined>(undefined);
|
||||
const {
|
||||
schema: globalOSS, // prettier: split lines
|
||||
error: ossError,
|
||||
setSchema: setGlobalOSS,
|
||||
loading: ossLoading,
|
||||
reload: reloadOssInternal
|
||||
} = useOssDetails({ target: ossID, items: items });
|
||||
|
||||
const reloadOSS = useCallback(
|
||||
(callback?: () => void) => {
|
||||
reloadOssInternal(setProcessing, callback);
|
||||
},
|
||||
[reloadOssInternal]
|
||||
);
|
||||
|
||||
const folders = useMemo(() => {
|
||||
const result = new FolderTree();
|
||||
result.addPath(LocationHead.USER, 0);
|
||||
|
@ -280,17 +255,11 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
1
|
||||
);
|
||||
}
|
||||
if (globalOSS?.schemas.includes(target)) {
|
||||
reloadOSS(() => {
|
||||
if (callback) callback();
|
||||
});
|
||||
} else {
|
||||
if (callback) callback();
|
||||
}
|
||||
if (callback) callback();
|
||||
})
|
||||
});
|
||||
},
|
||||
[reloadItems, reloadOSS, user, globalOSS]
|
||||
[reloadItems, user]
|
||||
);
|
||||
|
||||
const cloneItem = useCallback(
|
||||
|
@ -326,20 +295,12 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
loading,
|
||||
loadingError,
|
||||
setLoadingError,
|
||||
reloadItems,
|
||||
|
||||
processing,
|
||||
processingError,
|
||||
setProcessingError,
|
||||
|
||||
globalOSS,
|
||||
setGlobalID,
|
||||
setGlobalOSS,
|
||||
ossLoading,
|
||||
ossError,
|
||||
reloadOSS,
|
||||
|
||||
reloadItems,
|
||||
|
||||
applyFilter,
|
||||
createItem,
|
||||
cloneItem,
|
||||
|
|
|
@ -39,6 +39,7 @@ import { UserID } from '@/models/user';
|
|||
import { contextOutsideScope } from '@/utils/labels';
|
||||
|
||||
import { useAuth } from './AuthContext';
|
||||
import { useGlobalOss } from './GlobalOssContext';
|
||||
import { useLibrary } from './LibraryContext';
|
||||
|
||||
interface IOssContext {
|
||||
|
@ -46,7 +47,7 @@ interface IOssContext {
|
|||
itemID: string;
|
||||
|
||||
loading: boolean;
|
||||
errorLoading: ErrorData;
|
||||
loadingError: ErrorData;
|
||||
processing: boolean;
|
||||
processingError: ErrorData;
|
||||
|
||||
|
@ -87,7 +88,8 @@ interface OssStateProps {
|
|||
|
||||
export const OssState = ({ itemID, children }: OssStateProps) => {
|
||||
const library = useLibrary();
|
||||
const schema = library.globalOSS;
|
||||
const oss = useGlobalOss();
|
||||
const model = oss.schema;
|
||||
const { user } = useAuth();
|
||||
const [processing, setProcessing] = useState(false);
|
||||
const [processingError, setProcessingError] = useState<ErrorData>(undefined);
|
||||
|
@ -95,25 +97,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
const [toggleTracking, setToggleTracking] = useState(false);
|
||||
|
||||
const isOwned = useMemo(() => {
|
||||
return user?.id === schema?.owner || false;
|
||||
}, [user, schema?.owner]);
|
||||
return user?.id === model?.owner || false;
|
||||
}, [user, model?.owner]);
|
||||
|
||||
const isSubscribed = useMemo(() => {
|
||||
if (!user || !schema || !user.id) {
|
||||
if (!user || !model || !user.id) {
|
||||
return false;
|
||||
}
|
||||
return schema.subscribers.includes(user.id);
|
||||
}, [user, schema, toggleTracking]);
|
||||
return model.subscribers.includes(user.id);
|
||||
}, [user, model, toggleTracking]);
|
||||
|
||||
useEffect(() => {
|
||||
if (schema?.id !== Number(itemID)) {
|
||||
library.setGlobalID(itemID);
|
||||
}
|
||||
}, [itemID, schema, library]);
|
||||
oss.setID(itemID);
|
||||
}, [itemID, oss.setID]);
|
||||
|
||||
const update = useCallback(
|
||||
(data: ILibraryUpdateData, callback?: DataCallback<ILibraryItem>) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -123,19 +123,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
const fullData: IOperationSchemaData = Object.assign(schema, newData);
|
||||
library.setGlobalOSS(fullData);
|
||||
const fullData: IOperationSchemaData = Object.assign(model, newData);
|
||||
oss.setData(fullData);
|
||||
library.localUpdateItem(newData);
|
||||
if (callback) callback(newData);
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.localUpdateItem, oss.setData]
|
||||
);
|
||||
|
||||
const subscribe = useCallback(
|
||||
(callback?: () => void) => {
|
||||
if (!schema || !user) {
|
||||
if (!model || !user) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -144,23 +144,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
if (user.id && !schema.subscribers.includes(user.id)) {
|
||||
schema.subscribers.push(user.id);
|
||||
if (user.id && !model.subscribers.includes(user.id)) {
|
||||
model.subscribers.push(user.id);
|
||||
}
|
||||
if (!user.subscriptions.includes(schema.id)) {
|
||||
user.subscriptions.push(schema.id);
|
||||
if (!user.subscriptions.includes(model.id)) {
|
||||
user.subscriptions.push(model.id);
|
||||
}
|
||||
setToggleTracking(prev => !prev);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, user, schema]
|
||||
[itemID, user, model]
|
||||
);
|
||||
|
||||
const unsubscribe = useCallback(
|
||||
(callback?: () => void) => {
|
||||
if (!schema || !user) {
|
||||
if (!model || !user) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -169,23 +169,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
if (user.id && schema.subscribers.includes(user.id)) {
|
||||
schema.subscribers.splice(schema.subscribers.indexOf(user.id), 1);
|
||||
if (user.id && model.subscribers.includes(user.id)) {
|
||||
model.subscribers.splice(model.subscribers.indexOf(user.id), 1);
|
||||
}
|
||||
if (user.subscriptions.includes(schema.id)) {
|
||||
user.subscriptions.splice(user.subscriptions.indexOf(schema.id), 1);
|
||||
if (user.subscriptions.includes(model.id)) {
|
||||
user.subscriptions.splice(user.subscriptions.indexOf(model.id), 1);
|
||||
}
|
||||
setToggleTracking(prev => !prev);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, user]
|
||||
[itemID, model, user]
|
||||
);
|
||||
|
||||
const setOwner = useCallback(
|
||||
(newOwner: UserID, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -197,18 +197,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
schema.owner = newOwner;
|
||||
library.localUpdateItem(schema);
|
||||
model.owner = newOwner;
|
||||
library.localUpdateItem(model);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const setAccessPolicy = useCallback(
|
||||
(newPolicy: AccessPolicy, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -220,18 +220,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
schema.access_policy = newPolicy;
|
||||
library.localUpdateItem(schema);
|
||||
model.access_policy = newPolicy;
|
||||
library.localUpdateItem(model);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const setLocation = useCallback(
|
||||
(newLocation: string, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -243,18 +243,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
schema.location = newLocation;
|
||||
library.localUpdateItem(schema);
|
||||
model.location = newLocation;
|
||||
library.localUpdateItem(model);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const setEditors = useCallback(
|
||||
(newEditors: UserID[], callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -266,12 +266,12 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: () => {
|
||||
schema.editors = newEditors;
|
||||
model.editors = newEditors;
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema]
|
||||
[itemID, model]
|
||||
);
|
||||
|
||||
const savePositions = useCallback(
|
||||
|
@ -288,7 +288,7 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, library]
|
||||
[itemID, library.localUpdateTimestamp]
|
||||
);
|
||||
|
||||
const createOperation = useCallback(
|
||||
|
@ -300,13 +300,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData.oss);
|
||||
oss.setData(newData.oss);
|
||||
library.localUpdateTimestamp(newData.oss.id);
|
||||
if (callback) callback(newData.new_operation);
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, library]
|
||||
[itemID, library.localUpdateTimestamp, oss.setData]
|
||||
);
|
||||
|
||||
const deleteOperation = useCallback(
|
||||
|
@ -318,13 +318,13 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData);
|
||||
oss.setData(newData);
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, library]
|
||||
[itemID, library.localUpdateTimestamp, oss.setData]
|
||||
);
|
||||
|
||||
const createInput = useCallback(
|
||||
|
@ -336,19 +336,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData.oss);
|
||||
oss.setData(newData.oss);
|
||||
library.reloadItems(() => {
|
||||
if (callback) callback(newData.new_schema);
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, library]
|
||||
[itemID, library.reloadItems, oss.setData]
|
||||
);
|
||||
|
||||
const setInput = useCallback(
|
||||
(data: IOperationSetInputData, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -358,18 +358,18 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData);
|
||||
oss.setData(newData);
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.localUpdateTimestamp, oss.setData]
|
||||
);
|
||||
|
||||
const updateOperation = useCallback(
|
||||
(data: IOperationUpdateData, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -379,19 +379,19 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData);
|
||||
oss.setData(newData);
|
||||
library.reloadItems(() => {
|
||||
if (callback) callback();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.reloadItems, oss.setData]
|
||||
);
|
||||
|
||||
const executeOperation = useCallback(
|
||||
(data: ITargetOperation, callback?: () => void) => {
|
||||
if (!schema) {
|
||||
if (!model) {
|
||||
return;
|
||||
}
|
||||
setProcessingError(undefined);
|
||||
|
@ -401,23 +401,23 @@ export const OssState = ({ itemID, children }: OssStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
library.setGlobalOSS(newData);
|
||||
oss.setData(newData);
|
||||
library.reloadItems(() => {
|
||||
if (callback) callback();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, model, library.reloadItems, oss.setData]
|
||||
);
|
||||
|
||||
return (
|
||||
<OssContext.Provider
|
||||
value={{
|
||||
schema,
|
||||
schema: model,
|
||||
itemID,
|
||||
loading: library.ossLoading,
|
||||
errorLoading: library.ossError,
|
||||
loading: oss.loading,
|
||||
loadingError: oss.loadingError,
|
||||
processing,
|
||||
processingError,
|
||||
isOwned,
|
||||
|
|
|
@ -53,6 +53,7 @@ import { UserID } from '@/models/user';
|
|||
import { contextOutsideScope } from '@/utils/labels';
|
||||
|
||||
import { useAuth } from './AuthContext';
|
||||
import { useGlobalOss } from './GlobalOssContext';
|
||||
import { useLibrary } from './LibraryContext';
|
||||
|
||||
interface IRSFormContext {
|
||||
|
@ -116,6 +117,7 @@ interface RSFormStateProps {
|
|||
|
||||
export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) => {
|
||||
const library = useLibrary();
|
||||
const oss = useGlobalOss();
|
||||
const { user } = useAuth();
|
||||
const {
|
||||
schema, // prettier: split lines
|
||||
|
@ -159,15 +161,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(Object.assign(schema, newData));
|
||||
library.localUpdateItem(newData);
|
||||
if (library.globalOSS?.schemas.includes(newData.id)) {
|
||||
library.reloadOSS(() => {
|
||||
if (callback) callback(newData);
|
||||
});
|
||||
} else if (callback) callback(newData);
|
||||
oss.invalidateItem(newData.id);
|
||||
if (callback) callback(newData);
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, setSchema, schema, library]
|
||||
[itemID, setSchema, schema, library.localUpdateItem, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const upload = useCallback(
|
||||
|
@ -188,7 +187,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, setSchema, schema, library]
|
||||
[itemID, setSchema, schema, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const subscribe = useCallback(
|
||||
|
@ -261,7 +260,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, schema, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const setAccessPolicy = useCallback(
|
||||
|
@ -284,7 +283,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, schema, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const setLocation = useCallback(
|
||||
|
@ -306,7 +305,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library]
|
||||
[itemID, schema, library.reloadItems]
|
||||
);
|
||||
|
||||
const setEditors = useCallback(
|
||||
|
@ -344,13 +343,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData);
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
oss.invalidateItem(newData.id);
|
||||
if (callback) callback();
|
||||
|
||||
// TODO: deal with OSS cache invalidation
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library, user, setSchema]
|
||||
[itemID, schema, user, setSchema, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const restoreOrder = useCallback(
|
||||
|
@ -370,7 +368,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, schema, library, user, setSchema]
|
||||
[itemID, schema, user, setSchema, library.localUpdateTimestamp]
|
||||
);
|
||||
|
||||
const produceStructure = useCallback(
|
||||
|
@ -384,11 +382,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData.schema);
|
||||
library.localUpdateTimestamp(newData.schema.id);
|
||||
oss.invalidateItem(newData.schema.id);
|
||||
if (callback) callback(newData.cst_list);
|
||||
}
|
||||
});
|
||||
},
|
||||
[setSchema, library, itemID]
|
||||
[setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const download = useCallback(
|
||||
|
@ -415,13 +414,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData.schema);
|
||||
library.localUpdateTimestamp(newData.schema.id);
|
||||
oss.invalidateItem(newData.schema.id);
|
||||
if (callback) callback(newData.new_cst);
|
||||
|
||||
// TODO: deal with OSS cache invalidation
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, library, setSchema]
|
||||
[itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const cstDelete = useCallback(
|
||||
|
@ -435,13 +433,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData);
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
oss.invalidateItem(newData.id);
|
||||
if (callback) callback();
|
||||
|
||||
// TODO: deal with OSS cache invalidation
|
||||
}
|
||||
});
|
||||
},
|
||||
[itemID, library, setSchema]
|
||||
[itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const cstUpdate = useCallback(
|
||||
|
@ -455,13 +452,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData =>
|
||||
reload(setProcessing, () => {
|
||||
library.localUpdateTimestamp(Number(itemID));
|
||||
oss.invalidateItem(Number(itemID));
|
||||
if (callback) callback(newData);
|
||||
|
||||
// TODO: deal with OSS cache invalidation
|
||||
})
|
||||
});
|
||||
},
|
||||
[itemID, library, reload]
|
||||
[itemID, reload, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const cstRename = useCallback(
|
||||
|
@ -475,15 +471,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData.schema);
|
||||
library.localUpdateTimestamp(newData.schema.id);
|
||||
if (library.globalOSS?.schemas.includes(newData.schema.id)) {
|
||||
library.reloadOSS(() => {
|
||||
if (callback) callback(newData.new_cst);
|
||||
});
|
||||
} else if (callback) callback(newData.new_cst);
|
||||
oss.invalidateItem(newData.schema.id);
|
||||
if (callback) callback(newData.new_cst);
|
||||
}
|
||||
});
|
||||
},
|
||||
[setSchema, library, itemID]
|
||||
[setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const cstSubstitute = useCallback(
|
||||
|
@ -497,15 +490,12 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onSuccess: newData => {
|
||||
setSchema(newData);
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
if (library.globalOSS?.schemas.includes(newData.id)) {
|
||||
library.reloadOSS(() => {
|
||||
if (callback) callback();
|
||||
});
|
||||
} else if (callback) callback();
|
||||
oss.invalidateItem(newData.id);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
},
|
||||
[setSchema, library, itemID]
|
||||
[setSchema, itemID, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
const cstMoveTo = useCallback(
|
||||
|
@ -523,7 +513,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, library, setSchema]
|
||||
[itemID, setSchema, library.localUpdateTimestamp]
|
||||
);
|
||||
|
||||
const versionCreate = useCallback(
|
||||
|
@ -541,7 +531,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[itemID, library, setSchema]
|
||||
[itemID, setSchema, library.localUpdateTimestamp]
|
||||
);
|
||||
|
||||
const findPredecessor = useCallback((data: ITargetCst, callback: (reference: IConstituentaReference) => void) => {
|
||||
|
@ -612,7 +602,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
}
|
||||
});
|
||||
},
|
||||
[setSchema, library]
|
||||
[setSchema, library.localUpdateItem]
|
||||
);
|
||||
|
||||
const inlineSynthesis = useCallback(
|
||||
|
@ -625,14 +615,13 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) =
|
|||
onError: setProcessingError,
|
||||
onSuccess: newData => {
|
||||
setSchema(newData);
|
||||
library.localUpdateTimestamp(Number(itemID));
|
||||
library.localUpdateTimestamp(newData.id);
|
||||
oss.invalidateItem(newData.id);
|
||||
if (callback) callback(newData);
|
||||
|
||||
// TODO: deal with OSS cache invalidation
|
||||
}
|
||||
});
|
||||
},
|
||||
[library, itemID, setSchema]
|
||||
[itemID, setSchema, library.localUpdateTimestamp, oss.invalidateItem]
|
||||
);
|
||||
|
||||
return (
|
||||
|
|
|
@ -36,7 +36,7 @@ function OssTabs() {
|
|||
const activeTab = query.get('tab') ? (Number(query.get('tab')) as OssTabID) : OssTabID.GRAPH;
|
||||
|
||||
const { calculateHeight, setNoFooter } = useConceptOptions();
|
||||
const { schema, loading, errorLoading } = useOSS();
|
||||
const { schema, loading, loadingError: errorLoading } = useOSS();
|
||||
const { destroyItem } = useLibrary();
|
||||
|
||||
const [isModified, setIsModified] = useState(false);
|
||||
|
@ -100,7 +100,7 @@ function OssTabs() {
|
|||
});
|
||||
}, [schema, destroyItem, router]);
|
||||
|
||||
const panelHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]);
|
||||
const panelHeight = useMemo(() => calculateHeight('1.625rem + 2px'), [calculateHeight]);
|
||||
|
||||
const cardPanel = useMemo(
|
||||
() => (
|
||||
|
|
|
@ -14,6 +14,7 @@ import TabLabel from '@/components/ui/TabLabel';
|
|||
import TextURL from '@/components/ui/TextURL';
|
||||
import AnimateFade from '@/components/wrap/AnimateFade';
|
||||
import { useConceptOptions } from '@/context/ConceptOptionsContext';
|
||||
import { useGlobalOss } from '@/context/GlobalOssContext';
|
||||
import { useLibrary } from '@/context/LibraryContext';
|
||||
import { useBlockNavigation, useConceptNavigation } from '@/context/NavigationContext';
|
||||
import { useRSForm } from '@/context/RSFormContext';
|
||||
|
@ -47,6 +48,7 @@ function RSTabs() {
|
|||
const { setNoFooter, calculateHeight } = useConceptOptions();
|
||||
const { schema, loading, errorLoading, isArchive, itemID } = useRSForm();
|
||||
const library = useLibrary();
|
||||
const oss = useGlobalOss();
|
||||
|
||||
const [isModified, setIsModified] = useState(false);
|
||||
useBlockNavigation(isModified);
|
||||
|
@ -177,18 +179,19 @@ function RSTabs() {
|
|||
if (!schema || !window.confirm(prompts.deleteLibraryItem)) {
|
||||
return;
|
||||
}
|
||||
const backToOSS = library.globalOSS?.schemas.includes(schema.id);
|
||||
const backToOSS = oss.schema?.schemas.includes(schema.id);
|
||||
library.destroyItem(schema.id, () => {
|
||||
toast.success(information.itemDestroyed);
|
||||
if (backToOSS) {
|
||||
router.push(urls.oss(library.globalOSS!.id, OssTabID.GRAPH));
|
||||
oss.invalidate();
|
||||
router.push(urls.oss(oss.schema!.id, OssTabID.GRAPH));
|
||||
} else {
|
||||
router.push(urls.library);
|
||||
}
|
||||
});
|
||||
}, [schema, library, router]);
|
||||
}, [schema, library, oss, router]);
|
||||
|
||||
const panelHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]);
|
||||
const panelHeight = useMemo(() => calculateHeight('1.625rem + 2px'), [calculateHeight]);
|
||||
|
||||
const cardPanel = useMemo(
|
||||
() => (
|
||||
|
|
Loading…
Reference in New Issue
Block a user