From d17337d817c875bd17746aa094405babcfc30b35 Mon Sep 17 00:00:00 2001 From: smanylov Date: Fri, 12 Dec 2025 13:09:54 +0700 Subject: [PATCH 1/3] add privacy page --- src/app/[locale]/terms-of-use/page.tsx | 413 +++++++++++++++++++- src/app/styles/privacy-and-terms-pages.scss | 41 +- 2 files changed, 450 insertions(+), 4 deletions(-) diff --git a/src/app/[locale]/terms-of-use/page.tsx b/src/app/[locale]/terms-of-use/page.tsx index 8a0ce5e..6eeceb7 100644 --- a/src/app/[locale]/terms-of-use/page.tsx +++ b/src/app/[locale]/terms-of-use/page.tsx @@ -1,7 +1,414 @@ export default function Page() { return ( -
- terms of use -
+
+
+
+

Политика конфиденциальности

+

+ Настоящая политика определяет, как мы собираем, используем и защищаем ваши персональные данные. Мы серьезно относимся к вашей конфиденциальности и обеспечиваем надежную защиту информации. +

+
+
+
+
+

1. Общие положения

+

Настоящая Политика конфиденциальности (далее — «Политика») определяет порядок обработки персональных данных пользователей сервиса No Copy, принадлежащего ООО «НО КОПИ» (далее — «Компания», «Оператор»).

+ +

Политика разработана в соответствии с:

+
    +
  • Федеральным законом «О персональных данных» № 152-ФЗ
  • +
  • Федеральным законом «Об информации, информационных технологиях и о защите информации» № 149-ФЗ
  • +
  • Общим регламентом по защите данных (GDPR) Европейского Союза
  • +
  • Иными применимыми нормативными правовыми актами
  • +
+ +
+

Используя наш сервис, вы соглашаетесь с условиями настоящей Политики конфиденциальности.

+
+
+ +
+

2. Основные понятия

+ +

2.1 Персональные данные:

+

Любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных).

+ +

2.2 Обработка персональных данных:

+

Любое действие (операция) или совокупность действий (операций), совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными.

+ +

2.3 Автоматизированная обработка:

+

Обработка персональных данных с помощью средств вычислительной техники.

+ +

2.4 Блокирование персональных данных:

+

Временное прекращение обработки персональных данных (за исключением случаев, если обработка необходима для уточнения персональных данных).

+
+ +
+

3. Какие данные мы собираем

+ +

Мы можем собирать следующие категории персональных данных:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Категория данныхПримерыИсточник получения
Идентификационные данныеФИО, email, телефонРегистрация, контактные формы
Данные об использованииIP-адрес, время посещения, страницыАвтоматический сбор
Технические данныеБраузер, операционная системаАвтоматический сбор
Платежные данныеДанные карты, чекиПлатежные системы
Контент пользователяЗагружаемые файлы, сообщенияПользовательский ввод
+ +

3.1 Автоматически собираемые данные:

+
    +
  • IP-адрес и данные о местоположении
  • +
  • Информация о браузере и операционной системе
  • +
  • Данные о посещенных страницах и времени на сайте
  • +
  • Реферер (источник перехода на сайт)
  • +
  • Файлы cookie и локальное хранилище
  • +
+
+ +
+

4. Цели обработки персональных данных

+ +

Мы обрабатываем ваши персональные данные для следующих целей:

+ +

4.1 Основные цели:

+
    +
  • Предоставление услуг защиты интеллектуальной собственности
  • +
  • Регистрация и ведение аккаунтов пользователей
  • +
  • Обработка платежей и выставление счетов
  • +
  • Техническая поддержка и обслуживание клиентов
  • +
  • Уведомления о статусе услуг и важных изменениях
  • +
+ +

4.2 Дополнительные цели:

+
    +
  • Аналитика использования сервиса для его улучшения
  • +
  • Предотвращение мошенничества и обеспечение безопасности
  • +
  • Маркетинговые коммуникации (с вашего согласия)
  • +
  • Соблюдение правовых обязательств
  • +
  • Разрешение споров и правоприменение
  • +
+ +
+

Мы не обрабатываем персональные данные в целях, несовместимых с указанными выше, без получения дополнительного согласия.

+
+
+ +
+

5. Правовые основания обработки

+ +

Обработка персональных данных осуществляется на основании:

+ +

5.1 Согласие субъекта персональных данных:

+
    +
  • Маркетинговые рассылки
  • +
  • Использование cookies для аналитики
  • +
  • Обработка специальных категорий данных
  • +
+ +

5.2 Исполнение договора:

+
    +
  • Предоставление заказанных услуг
  • +
  • Обработка платежей
  • +
  • Техническая поддержка
  • +
+ +

5.3 Правовые обязательства:

+
    +
  • Ведение налогового и бухгалтерского учета
  • +
  • Предоставление данных государственным органам
  • +
  • Соблюдение валютного законодательства
  • +
+ +

5.4 Законные интересы:

+
    +
  • Обеспечение безопасности системы
  • +
  • Предотвращение мошенничества
  • +
  • Улучшение качества услуг
  • +
+
+ +
+

6. Передача данных третьим лицам

+ +

Мы можем передавать ваши персональные данные следующим категориям получателей:

+ +

6.1 Поставщики услуг:

+
    +
  • Платежные системы (для обработки платежей)
  • +
  • Хостинг-провайдеры (для размещения данных)
  • +
  • Системы аналитики (Google Analytics, Яндекс.Метрика)
  • +
  • Службы доставки уведомлений
  • +
+ +

6.2 Государственные органы:

+
    +
  • По запросам правоохранительных органов
  • +
  • В рамках налогового контроля
  • +
  • При исполнении судебных решений
  • +
+ +

6.3 Партнеры:

+
    +
  • Юридические фирмы (для защиты прав)
  • +
  • Технические партнеры (интеграции)
  • +
+ +
+

Все третьи лица обязуются обеспечивать адекватный уровень защиты персональных данных и использовать их только в согласованных целях.

+
+
+ +
+

7. Трансграничная передача данных

+ +

Некоторые из наших поставщиков услуг могут обрабатывать данные за пределами Российской Федерации. В таких случаях мы обеспечиваем:

+ +
    +
  • Передачу данных только в страны с адекватным уровнем защиты
  • +
  • Заключение соответствующих договоров с гарантиями защиты
  • +
  • Применение стандартных договорных положений ЕС
  • +
  • Получение необходимых согласий субъектов данных
  • +
+ +

Актуальный список стран, в которые передаются данные, доступен по запросу.

+
+ +
+

8. Сроки хранения данных

+ +

Мы храним персональные данные не дольше, чем это необходимо для достижения целей обработки:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Тип данныхСрок храненияОснование
Данные аккаунтаДо удаления аккаунта + 1 годИсполнение договора
Платежные данные5 летНалоговое законодательство
Логи доступа1 годТребования безопасности
Маркетинговые данныеДо отзыва согласияСогласие
Данные поддержки3 годаОбслуживание клиентов
+ +

По истечении указанных сроков данные удаляются или обезличиваются.

+
+ +
+

9. Ваши права

+ +

В соответствии с применимым законодательством вы имеете следующие права:

+ +

9.1 Право на доступ:

+
    +
  • Получить подтверждение факта обработки ваших данных
  • +
  • Получить копию обрабатываемых данных
  • +
  • Узнать цели и правовые основания обработки
  • +
+ +

9.2 Право на исправление:

+
    +
  • Исправить неточные данные
  • +
  • Дополнить неполные данные
  • +
+ +

9.3 Право на удаление («право быть забытым»):

+
    +
  • Удалить данные при отзыве согласия
  • +
  • Удалить данные при незаконной обработке
  • +
  • Удалить данные, когда они больше не нужны
  • +
+ +

9.4 Право на ограничение обработки:

+
    +
  • Приостановить обработку на время проверки точности
  • +
  • Ограничить обработку при незаконности
  • +
+ +

9.5 Право на портируемость данных:

+
    +
  • Получить данные в структурированном формате
  • +
  • Передать данные другому оператору
  • +
+ +

9.6 Право на возражение:

+
    +
  • Возразить против обработки для прямого маркетинга
  • +
  • Возразить против обработки на основании законных интересов
  • +
+ +
+

Для реализации своих прав обращайтесь к нам по адресу privacy@no-copy.ru. Мы рассмотрим ваш запрос в течение 30 дней.

+
+
+ +
+

10. Меры безопасности

+ +

Мы применяем следующие технические и организационные меры для защиты ваших данных:

+ +

10.1 Технические меры:

+
    +
  • Шифрование данных при передаче (SSL/TLS)
  • +
  • Шифрование данных при хранении (AES-256)
  • +
  • Многофакторная аутентификация
  • +
  • Регулярные обновления безопасности
  • +
  • Мониторинг безопасности 24/7
  • +
  • Резервное копирование данных
  • +
+ +

10.2 Организационные меры:

+
    +
  • Ограничение доступа к данным по принципу необходимости
  • +
  • Обучение сотрудников основам защиты данных
  • +
  • Регулярные аудиты безопасности
  • +
  • Процедуры реагирования на инциденты
  • +
  • Соглашения о конфиденциальности с сотрудниками
  • +
+
+ +
+

11. Cookies и похожие технологии

+ +

Мы используем файлы cookie и похожие технологии для:

+ +

11.1 Необходимые cookies:

+
    +
  • Аутентификация пользователей
  • +
  • Настройки безопасности
  • +
  • Функционирование сервиса
  • +
+ +

11.2 Аналитические cookies:

+
    +
  • Google Analytics
  • +
  • Яндекс.Метрика
  • +
  • Внутренняя аналитика
  • +
+ +

11.3 Маркетинговые cookies:

+
    +
  • Ретаргетинг
  • +
  • Персонализация рекламы
  • +
  • Измерение эффективности
  • +
+ +

Вы можете управлять cookies через настройки браузера или наш центр управления конфиденциальностью.

+
+ +
+

12. Дети

+ +

Наш сервис не предназначен для лиц младше 18 лет. Мы намеренно не собираем персональные данные детей младше 18 лет.

+ +

Если вы являетесь родителем или опекуном и знаете, что ваш ребенок предоставил нам персональные данные, пожалуйста, свяжитесь с нами. Мы удалим такие данные из наших систем.

+
+ +
+

13. Изменения в политике

+ +

Мы можем периодически обновлять настоящую Политику конфиденциальности. При внесении существенных изменений мы уведомим вас:

+ +
    +
  • Размещением уведомления на главной странице сайта
  • +
  • Отправкой уведомления на ваш email
  • +
  • Через уведомления в личном кабинете
  • +
+ +

Рекомендуем периодически просматривать данную страницу для ознакомления с актуальной версией Политики.

+
+ +
+

14. Жалобы и контроль

+ +

Если вы считаете, что ваши права на защиту персональных данных были нарушены, вы имеете право:

+ +
    +
  • Обратиться к нам с жалобой
  • +
  • Подать жалобу в Роскомнадзор
  • +
  • Обратиться в суд
  • +
  • При обработке данных в ЕС — обратиться к соответствующему регулятору
  • +
+ +

Контактные данные для подачи жалоб указаны в разделе «Контактная информация».

+
+ +
+

Контактная информация

+

Контролер персональных данных:

+

ООО «НО КОПИ»

+

📧 Email: privacy@no-copy.ru

+

📧 Вопросы по защите данных: info@no-copy.ru

+

📞 Телефон: +7 (800) 100-43-98

+

🏢 Адрес: г. Москва, ул. Проспект Мира, д. 39

+

🌐 Веб-сайт: https://no-copy.ru

+ +

Надзорный орган:

+

Федеральная служба по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор)

+

🌐 https://rkn.gov.ru

+
+ +
+

Политика конфиденциальности вступает в силу с 01 января 2025 года

+

Последнее обновление: 25 сентября 2025 года

+
+
+
+
+
) } \ No newline at end of file diff --git a/src/app/styles/privacy-and-terms-pages.scss b/src/app/styles/privacy-and-terms-pages.scss index c9bbbba..dba4f93 100644 --- a/src/app/styles/privacy-and-terms-pages.scss +++ b/src/app/styles/privacy-and-terms-pages.scss @@ -53,13 +53,23 @@ ul { margin-bottom: 16px; - padding-left: 24px; } li { margin-bottom: 8px; line-height: 1.7; color: #1e293b; + + &::before { + content: ' '; + display: inline-block; + width: 5px; + height: 5px; + border-radius: 2.5px; + background-color: #000; + margin-right: 10px; + margin-bottom: 4px; + } } } @@ -97,4 +107,33 @@ padding-top: 32px; border-top: 1px solid #94a3b833; } + + .data-table { + width: 100%; + border-collapse: collapse; + margin: 20px 0; + background: white; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + + th { + background: #f8fafc; + font-weight: 600; + color: #1e293b; + } + + td { + padding: 12px 16px; + text-align: left; + border-bottom: 1px solid #94a3b833; + } + + th, + td { + padding: 12px 16px; + text-align: left; + border-bottom: 1px solid #94a3b833; + } + } } \ No newline at end of file -- 2.54.0 From fcf9114319fcbfee89d23eacbfba8e77d1833323 Mon Sep 17 00:00:00 2001 From: smanylov Date: Fri, 12 Dec 2025 13:31:17 +0700 Subject: [PATCH 2/3] add version page --- src/app/[locale]/v/page.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/app/[locale]/v/page.tsx diff --git a/src/app/[locale]/v/page.tsx b/src/app/[locale]/v/page.tsx new file mode 100644 index 0000000..e970b6b --- /dev/null +++ b/src/app/[locale]/v/page.tsx @@ -0,0 +1,9 @@ +import packageJson from '../../../../package.json'; + +export default function Page() { + return ( +
+ {packageJson.version} +
+ ) +} \ No newline at end of file -- 2.54.0 From 54c63a6a400e5ea0f9d35f0766291dfb185ba314 Mon Sep 17 00:00:00 2001 From: smanylov Date: Fri, 12 Dec 2025 14:22:00 +0700 Subject: [PATCH 3/3] ad tanstak test-table --- package-lock.json | 57 +++++ package.json | 2 + src/app/components/tanstakTable.tsx | 302 +++++++++++++++++++++++++++ src/app/ui/dashboard/files-table.tsx | 3 +- 4 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 src/app/components/tanstakTable.tsx diff --git a/package-lock.json b/package-lock.json index d5d876c..fac1abe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "0.1.0", "dependencies": { "@tailwindcss/postcss": "^4.1.17", + "@tanstack/match-sorter-utils": "^8.19.4", "@tanstack/react-query": "^5.90.11", + "@tanstack/react-table": "^8.21.3", "clsx": "^2.1.1", "jose": "^6.1.2", "next": "^16.0.7", @@ -2176,6 +2178,22 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tanstack/query-core": { "version": "5.90.11", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", @@ -2202,6 +2220,39 @@ "react": "^18 || ^19" } }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -6665,6 +6716,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, "node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", diff --git a/package.json b/package.json index 26f4079..aefcc87 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,9 @@ }, "dependencies": { "@tailwindcss/postcss": "^4.1.17", + "@tanstack/match-sorter-utils": "^8.19.4", "@tanstack/react-query": "^5.90.11", + "@tanstack/react-table": "^8.21.3", "clsx": "^2.1.1", "jose": "^6.1.2", "next": "^16.0.7", diff --git a/src/app/components/tanstakTable.tsx b/src/app/components/tanstakTable.tsx new file mode 100644 index 0000000..70f265a --- /dev/null +++ b/src/app/components/tanstakTable.tsx @@ -0,0 +1,302 @@ +'use client'; + +import { useState, useMemo } from 'react'; +import { + useReactTable, + getCoreRowModel, + getSortedRowModel, + getPaginationRowModel, + getFilteredRowModel, + ColumnDef, + SortingState, + ColumnFiltersState, + FilterFn, +} from '@tanstack/react-table'; +import { rankItem } from '@tanstack/match-sorter-utils'; + +// Типы данных +type Person = { + id: number; + name: string; + age: number; + email: string; + department: string; + salary: number; +}; + +// Кастомная функция фильтрации +const fuzzyFilter: FilterFn = (row, columnId, value, addMeta) => { + const itemRank = rankItem(row.getValue(columnId), value); + addMeta({ itemRank }); + return itemRank.passed; +}; + +// Определяем тип для фильтров +declare module '@tanstack/react-table' { + interface FilterFns { + fuzzy: FilterFn; + } +} + +export default function DataTable() { + // Данные + const [data] = useState([ + { id: 1, name: 'Иван Петров', age: 28, email: 'ivan@example.com', department: 'IT', salary: 80000 }, + { id: 2, name: 'Анна Сидорова', age: 32, email: 'anna@example.com', department: 'HR', salary: 65000 }, + { id: 3, name: 'Сергей Иванов', age: 45, email: 'sergey@example.com', department: 'Финансы', salary: 95000 }, + { id: 4, name: 'Мария Кузнецова', age: 26, email: 'maria@example.com', department: 'Маркетинг', salary: 60000 }, + { id: 5, name: 'Алексей Смирнов', age: 38, email: 'alex@example.com', department: 'IT', salary: 85000 }, + { id: 6, name: 'Ольга Васнецова', age: 29, email: 'olga@example.com', department: 'HR', salary: 62000 }, + { id: 7, name: 'Дмитрий Орлов', age: 41, email: 'dmitry@example.com', department: 'Финансы', salary: 92000 }, + { id: 8, name: 'Екатерина Новикова', age: 35, email: 'ekaterina@example.com', department: 'Маркетинг', salary: 70000 }, + ]); + + // Состояния + const [sorting, setSorting] = useState([]); + const [columnFilters, setColumnFilters] = useState([]); + const [globalFilter, setGlobalFilter] = useState(''); + const [rowSelection, setRowSelection] = useState({}); + + // Определение колонок + const columns = useMemo[]>( + () => [ + { + id: 'select', + header: ({ table }) => ( + + ), + cell: ({ row }) => ( + + ), + enableSorting: false, + enableColumnFilter: false, + }, + { + accessorKey: 'id', + header: 'ID', + cell: (info) => info.getValue(), + }, + { + accessorKey: 'name', + header: 'Имя', + cell: (info) => info.getValue(), + filterFn: fuzzyFilter, + }, + { + accessorKey: 'age', + header: 'Возраст', + cell: (info) => info.getValue(), + }, + { + accessorKey: 'email', + header: 'Email', + cell: (info) => info.getValue(), + }, + { + accessorKey: 'department', + header: 'Отдел', + cell: (info) => info.getValue(), + }, + { + accessorKey: 'salary', + header: 'Зарплата', + cell: (info) => `$${Number(info.getValue()).toLocaleString()}`, + }, + ], + [] + ); + + // Создание таблицы + const table = useReactTable({ + data, + columns, + filterFns: { + fuzzy: fuzzyFilter, + }, + state: { + sorting, + columnFilters, + globalFilter, + rowSelection, + }, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + onGlobalFilterChange: setGlobalFilter, + onRowSelectionChange: setRowSelection, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getPaginationRowModel: getPaginationRowModel(), + getFilteredRowModel: getFilteredRowModel(), + globalFilterFn: fuzzyFilter, // Используем саму функцию, а не строку + }); + + return ( +
+

Таблица сотрудников

+ + {/* Глобальный поиск */} +
+ setGlobalFilter(e.target.value)} + className="px-4 py-2 border rounded-md w-full max-w-md" + /> +
+ + {/* Фильтры по колонкам */} +
+ {table.getAllColumns() + .filter(column => column.getCanFilter() && column.id !== 'select') + .map(column => ( +
+ + {column.id === 'department' ? ( + + ) : column.id === 'age' ? ( + column.setFilterValue(e.target.value ? parseInt(e.target.value) : undefined)} + className="px-3 py-1 border rounded w-32" + /> + ) : ( + column.setFilterValue(e.target.value)} + className="px-3 py-1 border rounded" + /> + )} +
+ ))} +
+ + {/* Таблица */} +
+ + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map(header => ( + + ))} + + ))} + + + {table.getRowModel().rows.map(row => ( + + {row.getVisibleCells().map(cell => ( + + ))} + + ))} + +
+
+ {header.isPlaceholder + ? null + : typeof header.column.columnDef.header === 'string' + ? header.column.columnDef.header + : header.column.id} + {{ + asc: ' 🔼', + desc: ' 🔽', + }[header.column.getIsSorted() as string] ?? null} +
+
+ {typeof cell.column.columnDef.cell === 'function' + ? cell.column.columnDef.cell(cell.getContext()) + : cell.getValue() as string} +
+
+ + {/* Пагинация */} +
+
+ + + + +
+ +
+ + Страница{' '} + + {table.getState().pagination.pageIndex + 1} из {table.getPageCount()} + + + + + Всего строк: {data.length} | Отфильтровано: {table.getFilteredRowModel().rows.length} + +
+
+
+ ); +} \ No newline at end of file diff --git a/src/app/ui/dashboard/files-table.tsx b/src/app/ui/dashboard/files-table.tsx index de6ba47..6c96b70 100644 --- a/src/app/ui/dashboard/files-table.tsx +++ b/src/app/ui/dashboard/files-table.tsx @@ -1,7 +1,8 @@ +import DataTable from '@/app/components/tanstakTable'; export default function FilesTable() { return (
- table +
) } \ No newline at end of file -- 2.54.0