mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-05-03 12:42:01 +00:00
## Summary - Add `typescript/no-explicit-any` rule to `.oxlintrc.json` to enforce no explicit `any` types - Fix all 40 instances of explicit `any` throughout the codebase - Improve type safety with proper TypeScript types ## Changes Made ### Configuration - Added `typescript/no-explicit-any` rule to `.oxlintrc.json` ### Type Fixes - Replaced `any` with `unknown` for truly unknown types - Updated generic type parameters to use `unknown` defaults instead of `any` - Fixed method `this` parameters to avoid variance issues - Updated component props to match new generic types - Fixed test mocks to use proper type assertions ### Key Files Modified - `src/types/treeExplorerTypes.ts`: Updated TreeExplorerNode interface generics - `src/platform/settings/types.ts`: Fixed SettingParams generic default - `src/lib/litegraph/src/LGraph.ts`: Fixed ParamsArray type constraint - `src/extensions/core/electronAdapter.ts`: Fixed onChange callbacks - `src/views/GraphView.vue`: Added proper type imports - Multiple test files: Fixed type assertions and mocks ## Test Plan - [x] All lint checks pass (`pnpm lint`) - [x] TypeScript compilation succeeds (`pnpm typecheck`) - [x] Pre-commit hooks pass - [x] No regression in functionality ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8601-feat-add-typescript-no-explicit-any-rule-and-fix-all-instances-2fd6d73d365081fd9beef75d5a6daf5b) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action <action@github.com> Co-authored-by: Alexander Brown <drjkl@comfy.org>
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
import type { MenuItem } from 'primevue/menuitem'
|
|
import { shallowRef } from 'vue'
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
import type { RenderedTreeExplorerNode } from '@/types/treeExplorerTypes'
|
|
|
|
/**
|
|
* Use this to handle folder operations in a tree.
|
|
* @param expandNode - The function to expand a node.
|
|
*/
|
|
export function useTreeFolderOperations<T>(
|
|
expandNode: (node: RenderedTreeExplorerNode<T>) => void
|
|
) {
|
|
const { t } = useI18n()
|
|
const newFolderNode = shallowRef<RenderedTreeExplorerNode<T> | null>(null)
|
|
const addFolderTargetNode = shallowRef<RenderedTreeExplorerNode<T> | null>(
|
|
null
|
|
)
|
|
|
|
// Generate a unique temporary key for the new folder
|
|
const generateTempKey = (parentKey: string) => {
|
|
return `${parentKey}/new_folder_${Date.now()}`
|
|
}
|
|
|
|
// Handle folder creation after name is confirmed
|
|
const handleFolderCreation = async (newName: string) => {
|
|
if (!newFolderNode.value || !addFolderTargetNode.value) return
|
|
|
|
try {
|
|
// Call the handleAddFolder method with the new folder name
|
|
await addFolderTargetNode.value?.handleAddFolder?.(newName)
|
|
} finally {
|
|
newFolderNode.value = null
|
|
addFolderTargetNode.value = null
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The command to add a folder to a node via the context menu
|
|
* @param targetNode - The node where the folder will be added under
|
|
*/
|
|
const addFolderCommand = (targetNode: RenderedTreeExplorerNode<T>) => {
|
|
expandNode(targetNode)
|
|
newFolderNode.value = {
|
|
key: generateTempKey(targetNode.key),
|
|
label: '',
|
|
leaf: false,
|
|
children: [],
|
|
icon: 'pi pi-folder',
|
|
type: 'folder',
|
|
totalLeaves: 0,
|
|
badgeText: '',
|
|
isEditingLabel: true
|
|
} as RenderedTreeExplorerNode<T>
|
|
addFolderTargetNode.value = targetNode
|
|
}
|
|
|
|
// Generate the "Add Folder" menu item
|
|
const getAddFolderMenuItem = (
|
|
targetNode: RenderedTreeExplorerNode<T> | null
|
|
): MenuItem => {
|
|
return {
|
|
label: t('g.newFolder'),
|
|
icon: 'pi pi-folder-plus',
|
|
command: () => {
|
|
if (targetNode) addFolderCommand(targetNode)
|
|
},
|
|
visible: !!targetNode && !targetNode.leaf && !!targetNode.handleAddFolder,
|
|
isAsync: false
|
|
}
|
|
}
|
|
|
|
return {
|
|
newFolderNode,
|
|
addFolderCommand,
|
|
getAddFolderMenuItem,
|
|
handleFolderCreation
|
|
}
|
|
}
|