From d419c1c2cb17054e9c074c8b9e7fb449c1bd540f Mon Sep 17 00:00:00 2001 From: smanylov Date: Tue, 5 May 2026 13:07:52 +0700 Subject: [PATCH] add permission change button --- package.json | 2 +- src/app/actions/trackingActions.ts | 40 ++++++ .../components/tanstak-table/TanstakTable.tsx | 125 +++++++++++++----- src/app/styles/pages-styles.scss | 61 +++++++++ src/app/styles/watch-doc.scss | 2 +- 5 files changed, 193 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 850495f..3c9e02f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "no-copy-frontend", - "version": "0.106.0", + "version": "0.107.0", "private": true, "scripts": { "dev": "next dev -p 2999", diff --git a/src/app/actions/trackingActions.ts b/src/app/actions/trackingActions.ts index 920ad33..ecbd7c3 100644 --- a/src/app/actions/trackingActions.ts +++ b/src/app/actions/trackingActions.ts @@ -118,6 +118,46 @@ export async function fetchDocumentInfo(fileId: string) { return null; } + } else { + throw new Error(`${response.status}`); + } + } catch (error) { + return null; + } +} + +export async function filePermisionChange(fileId: string, permissions: boolean) { + const token = await getSessionData('token'); + + try { + const response = await fetch(`${API_BASE_URL}/api/v1/data`, { + method: 'POST', + body: JSON.stringify({ + version: 1, + msg_id: 20005, + message_body: { + file_id: fileId, + token: token, + action: 'change_permission', + permissions: { + DOWNLOAD: permissions + } + } + }), + headers: { + 'Content-Type': 'application/json' + } + }); + + if (response.ok) { + const parsed = await response.json(); + + if (parsed.message_code === 0) { + return true; + } else { + return false; + } + } else { throw new Error(`${response.status}`); } diff --git a/src/app/components/tanstak-table/TanstakTable.tsx b/src/app/components/tanstak-table/TanstakTable.tsx index 72bec21..34ae429 100644 --- a/src/app/components/tanstak-table/TanstakTable.tsx +++ b/src/app/components/tanstak-table/TanstakTable.tsx @@ -32,6 +32,7 @@ import { useDebouncedCallback } from 'use-debounce'; import Link from 'next/link'; import { SelectedFilesAction } from '@/app/components/tanstak-table/SelectedFilesActions'; import Image from 'next/image'; +import { filePermisionChange } from '@/app/actions/trackingActions'; export type FileItem = { id: string; @@ -45,7 +46,10 @@ export type FileItem = { protectStatus: string; _original?: ApiFile; supportId: number; - thumbnailFileUrl: string + thumbnailFileUrl: string; + permissions: { + DOWNLOAD: boolean; + } }; type ApiFile = { @@ -61,6 +65,9 @@ type ApiFile = { supportId: number; fileName: string; thumbnailFileUrl: string; + permissions: { + DOWNLOAD: boolean; + } }; type ApiResponse = { @@ -190,7 +197,10 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType protectStatus: item.protectStatus, supportId: item.supportId, _original: item, - thumbnailFileUrl: item.thumbnailFileUrl + thumbnailFileUrl: item.thumbnailFileUrl, + permissions: { + DOWNLOAD: item.permissions.DOWNLOAD, + } })); return { @@ -553,6 +563,33 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType ) }, }, + { + accessorKey: 'downloadPermision', + header: ({ column }) => ( +
+ + Можно скачать по ссылке + +
+ ), + cell: ({ row }) => { + return ( +
+ +
+ ) + }, + }, { id: 'actions', header: () => { @@ -564,15 +601,8 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType }, cell: ({ row }) => (
-
- - - - {(showFileLink && row.original.fileType === 'document') && ( + {(showFileLink && row.original.fileType === 'document') ? ( +
- )} -
-
- {row.original.protectStatus === 'PROTECTED' && ( - - )} - -
- +
+ ) : ( + <> +
+ + + +
+
+ {row.original.protectStatus === 'PROTECTED' && ( + + )} + +
+ + )}
), enableSorting: false, @@ -659,6 +700,16 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType } } + const changeDownloadPermition = async (fileId: string, permission: boolean) => { + const response = await filePermisionChange(fileId, !permission); + if (response) { + queryClient.invalidateQueries({ queryKey: ['userFilesData'] }); + toast.success('Разрешение на скачивание изменено.'); + } else { + toast.warning('Не удалось изменить разрешение на скачивание.'); + } + } + // Фильтрация по типу файла и дате const filteredData = useMemo(() => { let result = tableData; @@ -735,6 +786,10 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType state: { sorting, pagination, + columnVisibility: { + monitoring: showFileLink ? false : true, + downloadPermision: showFileLink ? true : false, + } }, pageCount: totalPages, manualPagination: true, diff --git a/src/app/styles/pages-styles.scss b/src/app/styles/pages-styles.scss index a0b65b4..fe3a91e 100644 --- a/src/app/styles/pages-styles.scss +++ b/src/app/styles/pages-styles.scss @@ -1027,6 +1027,67 @@ background-color: #155dfc; } } + + .toggle-switch { + position: relative; + display: inline-flex; + align-items: center; + justify-content: space-between; + width: 60px; + height: 28px; + padding: 0 6px; + border: none; + border-radius: 8px; + cursor: pointer; + transition: all 0.3s ease; + font-size: 12px; + font-weight: 500; + background-color: #615fff; + padding: 0; + } + + .toggle-switch.active { + justify-content: flex-end; + } + + .toggle-switch.inactive { + justify-content: flex-start; + } + + .toggle-switch .toggle-slider { + position: absolute; + width: 30px; + height: 28px; + background-color: white; + border: 1px solid #615fff; + border-radius: 8px; + transition: transform 0.3s ease; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + } + + .toggle-switch.active .toggle-slider { + transform: translateX(0); + } + + .toggle-switch.inactive .toggle-slider { + transform: translateX(0); + } + + .toggle-switch .toggle-label { + z-index: 1; + color: v.$text-p; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); + width: 30px; + height: 26px; + display: flex; + justify-content: center; + align-items: center; + } + + .toggle-switch:disabled { + opacity: 0.5; + cursor: not-allowed; + } } .table-item-checkbox { diff --git a/src/app/styles/watch-doc.scss b/src/app/styles/watch-doc.scss index f9cd133..d121e0a 100644 --- a/src/app/styles/watch-doc.scss +++ b/src/app/styles/watch-doc.scss @@ -251,9 +251,9 @@ background: var(--card); border: 1px solid var(--border); border-radius: 14px; - /* margin-bottom: 14px; */ overflow: hidden; box-shadow: var(--shadow); + height: 100%; .card-head { padding: 14px 20px;