diff --git a/backend/migrations/20250804175803-add-cascade-delete-parent-folder.js b/backend/migrations/20250804175803-add-cascade-delete-parent-folder.js new file mode 100644 index 0000000..608372d --- /dev/null +++ b/backend/migrations/20250804175803-add-cascade-delete-parent-folder.js @@ -0,0 +1,22 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.addConstraint('folders', { + fields: ['parentFolderId'], + type: 'foreign key', + name: 'fk_folders_parentFolderId', + references: { + table: 'folders', + field: 'id', + }, + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }); + }, + + async down(queryInterface) { + await queryInterface.removeConstraint('folders', 'fk_folders_parentFolderId'); + }, +}; diff --git a/backend/models/folders.js b/backend/models/folders.js index a0b3880..9cdd238 100644 --- a/backend/models/folders.js +++ b/backend/models/folders.js @@ -11,6 +11,11 @@ function defineFolder(sequelize, DataTypes) { parentFolderId: { type: DataTypes.INTEGER, allowNull: true, + references: { + model: 'folder', + key: 'id', + }, + onDelete: 'CASCADE', }, projectId: { type: DataTypes.INTEGER, @@ -25,6 +30,7 @@ function defineFolder(sequelize, DataTypes) { Folder.associate = (models) => { Folder.belongsTo(models.Project, { foreignKey: 'projectId', onDelete: 'CASCADE' }); + Folder.belongsTo(models.folder, { foreignKey: 'parentFolderId', onDelete: 'CASCADE' }); Folder.hasMany(models.Case, { foreignKey: 'folderId' }); }; diff --git a/frontend/components/TreeItem.tsx b/frontend/components/TreeItem.tsx new file mode 100644 index 0000000..2adc46c --- /dev/null +++ b/frontend/components/TreeItem.tsx @@ -0,0 +1,46 @@ +import { cn } from '@heroui/react'; +import { ReactNode } from 'react'; + +interface TreeItemProps { + style: React.CSSProperties; + isSelected: boolean | null; + onClick: () => void; + toggleButton?: ReactNode; + icon: ReactNode; + label: string; + actions?: ReactNode; + className?: string; +} + +export default function TreeItem({ + style, + isSelected, + onClick, + toggleButton, + icon, + label, + actions, + className, +}: TreeItemProps) { + const baseClass = ''; + const selectedClass = `${baseClass} bg-neutral-200 dark:bg-neutral-700 dark:hover:bg-neutral-600 hover:bg-neutral-300`; + + return ( +