Skip to content

Commit fcae2bc

Browse files
authored
Add workbook shared entry actions (#3197)
1 parent 0c02cc5 commit fcae2bc

File tree

27 files changed

+581
-140
lines changed

27 files changed

+581
-140
lines changed

src/shared/schema/us/actions/entries/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import type {
4444
GetRevisionsResponse,
4545
GetSharedEntryBindingsArgs,
4646
GetSharedEntryBindingsResponse,
47+
GetSharedEntryWorkbookRelationsArgs,
48+
GetSharedEntryWorkbookRelationsResponse,
4749
MoveEntryArgs,
4850
MoveEntryResponse,
4951
RenameEntryArgs,
@@ -303,4 +305,18 @@ export const entriesActions = {
303305
headers,
304306
}),
305307
}),
308+
getSharedEntryWorkbookRelations: createAction<
309+
GetSharedEntryWorkbookRelationsResponse,
310+
GetSharedEntryWorkbookRelationsArgs
311+
>({
312+
method: 'GET',
313+
path: ({entryId}) => `${PATH_PREFIX}/shared-entries/${entryId}/workbook-relations`,
314+
params: ({scope, workbookId}, headers) => ({
315+
query: {
316+
workbookId,
317+
scope,
318+
},
319+
headers,
320+
}),
321+
}),
306322
};

src/shared/schema/us/types/entries.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type {
2121
EntryNavigationFields,
2222
EntryRelationFields,
2323
SharedEntryPermissions,
24+
SharedEntryRelationFields,
2425
} from './fields';
2526

2627
export interface GetEntryResponse extends EntryFields {
@@ -313,3 +314,13 @@ export type SharedEntryBindingsItem = {
313314
export type GetSharedEntryBindingsResponse = {
314315
items: SharedEntryBindingsItem[];
315316
};
317+
318+
export type GetSharedEntryWorkbookRelationsArgs = {
319+
entryId: string;
320+
workbookId: string;
321+
scope?: `${EntryScope}`;
322+
};
323+
324+
export type GetSharedEntryWorkbookRelationsResponse = {
325+
relations: SharedEntryRelationFields[];
326+
};

src/shared/schema/us/types/fields.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ export interface EntryRelationFields {
132132
isLocked: boolean;
133133
}
134134

135+
export type SharedEntryRelationFields = Omit<EntryRelationFields, 'isLocked'> & {
136+
collectionId: string;
137+
createdAt: string;
138+
};
139+
135140
export interface TenantSettings {
136141
defaultColorPaletteId?: string;
137142
}

src/ui/components/DialogSharedEntryBindings/DialogSharedEntryBindings.scss

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@
4747
}
4848

4949
&__footer {
50-
margin-left: -32px;
51-
margin-right: -32px;
5250
border-top: 1px solid var(--g-color-line-generic);
5351
&_empty-list {
5452
border: none;

src/ui/components/DialogSharedEntryBindings/DialogSharedEntryBindings.tsx

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,11 @@ export const DialogSharedEntryBindings: React.FC<DialogSharedEntryBindingsProps>
5353
onDirectionChange,
5454
currentDirection,
5555
fetchEntityBindings,
56+
isLoadingDelete,
57+
onDelete,
5658
} = useSharedEntryBindings({
5759
entry,
60+
onDeleteSuccess,
5861
});
5962
const showDirectionControl = entry.scope === 'dataset';
6063

@@ -71,11 +74,12 @@ export const DialogSharedEntryBindings: React.FC<DialogSharedEntryBindingsProps>
7174
title={getSharedEntryMockText('label-current-entry')}
7275
className={b('current-row')}
7376
/>
74-
{isLoading && !isSearchLoading ? (
77+
{(isLoading || isLoadingDelete) && !isSearchLoading ? (
7578
<SmartLoader showAfter={0} />
7679
) : (
7780
<>
7881
<DeleteAlert
82+
isSearchActive={searchValue !== ''}
7983
isDeleteDialog={isDeleteDialog}
8084
entry={entry}
8185
entities={entities}
@@ -105,17 +109,16 @@ export const DialogSharedEntryBindings: React.FC<DialogSharedEntryBindingsProps>
105109
/>
106110
</>
107111
)}
108-
{isDeleteDialog && (
109-
<SharedBindingsFooter
110-
onClose={onClose}
111-
entry={entry}
112-
onRefresh={() => fetchEntityBindings(searchValue)}
113-
isLoading={isLoading || isSearchLoading}
114-
emptyList={entities.length === 0}
115-
onDeleteSuccess={onDeleteSuccess}
116-
/>
117-
)}
118112
</Dialog.Body>
113+
{isDeleteDialog && (
114+
<SharedBindingsFooter
115+
onClose={onClose}
116+
onRefresh={() => fetchEntityBindings(searchValue)}
117+
isLoading={isLoading || isSearchLoading || isLoadingDelete}
118+
emptyList={entities.length === 0}
119+
onDelete={onDelete}
120+
/>
121+
)}
119122
</Dialog>
120123
);
121124
};

src/ui/components/DialogSharedEntryBindings/components/DeleteAlert.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ type DeleteAlertProps = {
1515
entities: SharedEntryBindingsItem[];
1616
isDeleteDialog: boolean;
1717
isError: boolean;
18+
isSearchActive: boolean;
1819
};
1920

2021
const b = block(DialogClassName);
2122

22-
export const DeleteAlert = ({entities, entry, isDeleteDialog, isError}: DeleteAlertProps) => {
23-
if (!isDeleteDialog || isError) {
23+
export const DeleteAlert = ({
24+
entities,
25+
entry,
26+
isDeleteDialog,
27+
isError,
28+
isSearchActive,
29+
}: DeleteAlertProps) => {
30+
if (!isDeleteDialog || isError || (isSearchActive && entities.length === 0)) {
2431
return null;
2532
}
2633

src/ui/components/DialogSharedEntryBindings/components/Relations.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ export const Relations = ({
174174
);
175175
}
176176

177-
if (isDeleteDialog && entities.length === 0) {
177+
if (isDeleteDialog && entities.length === 0 && searchValue === '') {
178178
return null;
179179
}
180180

src/ui/components/DialogSharedEntryBindings/components/SharedBindingsFooter.tsx

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,9 @@ import React from 'react';
22

33
import {Button, Dialog, Icon} from '@gravity-ui/uikit';
44
import block from 'bem-cn-lite';
5-
import {useDispatch} from 'react-redux';
6-
import {getSdk} from 'ui/libs/schematic-sdk';
7-
import type {AppDispatch} from 'ui/store';
8-
import {showToast} from 'ui/store/actions/toaster';
95
import {getSharedEntryMockText} from 'ui/units/collections/components/helpers';
106

117
import {DialogClassName} from '../constants';
12-
import type {SharedEntry} from '../types';
138

149
import ArrowsRotateRightIcon from '@gravity-ui/icons/svgs/arrows-rotate-right.svg';
1510

@@ -18,43 +13,18 @@ type SharedBindingsFooterProps = {
1813
onRefresh: () => void;
1914
onClose: () => void;
2015
emptyList: boolean;
21-
entry: SharedEntry;
22-
onDeleteSuccess?: () => void;
16+
onDelete: () => void;
2317
};
2418

2519
const b = block(DialogClassName);
2620

2721
export const SharedBindingsFooter = ({
28-
entry,
2922
isLoading,
3023
onRefresh,
3124
emptyList,
3225
onClose,
33-
onDeleteSuccess,
26+
onDelete,
3427
}: SharedBindingsFooterProps) => {
35-
const dispatch: AppDispatch = useDispatch();
36-
const [isLoadingDelete, setIsLoadingDelete] = React.useState(false);
37-
38-
const onDelete = React.useCallback(async () => {
39-
setIsLoadingDelete(true);
40-
try {
41-
await getSdk().sdk.mix.deleteEntry({
42-
entryId: entry.entryId,
43-
scope: entry.scope,
44-
});
45-
setIsLoadingDelete(false);
46-
onDeleteSuccess?.();
47-
} catch (error) {
48-
setIsLoadingDelete(false);
49-
dispatch(
50-
showToast({
51-
title: error.message,
52-
error,
53-
}),
54-
);
55-
}
56-
}, [onDeleteSuccess, entry, dispatch]);
57-
5828
return (
5929
<Dialog.Footer
6030
textButtonApply={getSharedEntryMockText('apply-bindings-dialog-delete')}
@@ -65,17 +35,12 @@ export const SharedBindingsFooter = ({
6535
view: 'flat',
6636
}}
6737
className={b('footer', {'empty-list': emptyList})}
68-
loading={isLoading || isLoadingDelete}
38+
loading={isLoading}
6939
textButtonCancel={getSharedEntryMockText('cancel-bindings-dialog-delete')}
7040
onClickButtonApply={onDelete}
7141
onClickButtonCancel={onClose}
7242
>
73-
<Button
74-
loading={isLoading || isLoadingDelete}
75-
view="outlined"
76-
size="l"
77-
onClick={onRefresh}
78-
>
43+
<Button loading={isLoading} view="outlined" size="l" onClick={onRefresh}>
7944
<Icon data={ArrowsRotateRightIcon} />
8045
{getSharedEntryMockText('bindings-dialog-delete-refresh-btn')}
8146
</Button>

src/ui/components/DialogSharedEntryBindings/hooks/useSharedEntryBindings.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
import React from 'react';
22

33
import debounce from 'lodash/debounce';
4+
import {useDispatch} from 'react-redux';
45
import type {SharedEntryBindingsItem} from 'shared/schema';
56
import {getSdk} from 'ui/libs/schematic-sdk';
7+
import type {AppDispatch} from 'ui/store';
8+
import {showToast} from 'ui/store/actions/toaster';
69

710
import type {AttachmentValue} from '../constants';
811
import {Attachment, SEARCH_DELAY} from '../constants';
912
import type {SharedEntry} from '../types';
1013
import {sortEntities} from '../utils';
14+
1115
type UseSharedEntryBindingsProps = {
1216
entry: SharedEntry;
17+
onDeleteSuccess?: () => void;
1318
};
1419

1520
const CONCURRENT_ID = 'shared-entry-bindings';
1621
const cancelConcurrentRequest = () => getSdk().cancelRequest(CONCURRENT_ID);
1722

18-
export const useSharedEntryBindings = ({entry}: UseSharedEntryBindingsProps) => {
23+
export const useSharedEntryBindings = ({entry, onDeleteSuccess}: UseSharedEntryBindingsProps) => {
24+
const dispatch: AppDispatch = useDispatch();
1925
const [entities, setEntities] = React.useState<SharedEntryBindingsItem[]>([]);
2026

2127
const [currentDirection, setCurrentDirection] = React.useState<AttachmentValue>(
@@ -25,6 +31,27 @@ export const useSharedEntryBindings = ({entry}: UseSharedEntryBindingsProps) =>
2531
const [isLoading, setIsLoading] = React.useState(true);
2632
const [isSearchLoading, setIsSearchLoading] = React.useState(false);
2733
const [isError, setIsError] = React.useState(false);
34+
const [isLoadingDelete, setIsLoadingDelete] = React.useState(false);
35+
36+
const onDelete = React.useCallback(async () => {
37+
setIsLoadingDelete(true);
38+
try {
39+
await getSdk().sdk.mix.deleteEntry({
40+
entryId: entry.entryId,
41+
scope: entry.scope,
42+
});
43+
setIsLoadingDelete(false);
44+
onDeleteSuccess?.();
45+
} catch (error) {
46+
setIsLoadingDelete(false);
47+
dispatch(
48+
showToast({
49+
title: error.message,
50+
error,
51+
}),
52+
);
53+
}
54+
}, [onDeleteSuccess, entry, dispatch]);
2855

2956
const fetchEntityBindings = React.useCallback(
3057
(filter = '') => {
@@ -91,6 +118,8 @@ export const useSharedEntryBindings = ({entry}: UseSharedEntryBindingsProps) =>
91118
return {
92119
isError,
93120
isLoading,
121+
isLoadingDelete,
122+
onDelete,
94123
isSearchLoading,
95124
onSearch,
96125
searchValue: searchFilter,

src/ui/store/actions/openDialogTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {OpenDialogColumnSettingsArgs} from '../../units/wizard/components/D
2424
import type {OpenDialogFieldEditorArgs} from '../../components/DialogFieldEditor/DialogFieldEditor';
2525
import type {OpenDialogRenameEntryInNewWorkbookArgs} from '../../units/workbooks/components/RenameEntryDialog/RenameEntryDialog';
2626
import type {OpenDialogDeleteEntryInNewWorkbookArgs} from '../../units/workbooks/components/DeleteEntryDialog/DeleteEntryDialog';
27+
import type {OpenDialogDeleteSharedEntryInWorkbookArgs} from '../../units/workbooks/components/DeleteSharedEntryDialog/DeleteSharedEntryDialog';
2728
import type {OpenDialogDuplicateEntryInWorkbookArgs} from '../../units/workbooks/components/DuplicateEntryDialog/DuplicateEntryDialog';
2829
import type {OpenDialogConnS3Sources} from '../../units/connections/components/dialogs';
2930
import type {OpenDialogConnWithInputArgs} from '../../units/connections/components/custom-forms/components/DialogWithInput';
@@ -129,4 +130,5 @@ export type OpenDialogArgs<T = unknown> =
129130
| OpenDialogSharedEntryUnbindArgs
130131
| OpenDialogSharedEntryPermissionsArgs
131132
| OpenDialogSelectSharedEntryArgs
133+
| OpenDialogDeleteSharedEntryInWorkbookArgs
132134
| OpenDialogEntryDescriptionArgs;

0 commit comments

Comments
 (0)