Allow point-and-click Insert to suggest nested files (#7130)
* fix: saving off code * fix: saving off progress * chore: implemented kcl sample assembly unique sub dir creation * fix: removing testing console logs * fix: cleaning up old comment * fix: add to file always does subdir/main.kcl now for single files * fix: auto fmt * fix: delete project and folder from ttc * fix: fixed deleting projects and subdirs * fix: if statement logic fixed for deleting project or subdir * fix: TTC isProjectNew makes main.kcl not a subdir. * fix: fixing e2e test * fix: this should pass now * pierremtb/make-insert-take-over-the-import-world * Add test that doesn't work locally yet :( * Fix test 🤦 * Change splice for push * Fix up windows path --------- Co-authored-by: Kevin Nadro <kevin@zoo.dev> Co-authored-by: Kevin Nadro <nadr0@users.noreply.github.com>
This commit is contained in:
		@ -70,22 +70,28 @@ test.describe('Point-and-click assemblies tests', () => {
 | 
			
		||||
      await test.step('Setup parts and expect empty assembly scene', async () => {
 | 
			
		||||
        const projectName = 'assembly'
 | 
			
		||||
        await context.folderSetupFn(async (dir) => {
 | 
			
		||||
          const bracketDir = path.join(dir, projectName)
 | 
			
		||||
          await fsp.mkdir(bracketDir, { recursive: true })
 | 
			
		||||
          const projDir = path.join(dir, projectName)
 | 
			
		||||
          const nestedProjDir = path.join(dir, projectName, 'nested', 'twice')
 | 
			
		||||
          await fsp.mkdir(projDir, { recursive: true })
 | 
			
		||||
          await fsp.mkdir(nestedProjDir, { recursive: true })
 | 
			
		||||
          await Promise.all([
 | 
			
		||||
            fsp.copyFile(
 | 
			
		||||
              executorInputPath('cylinder.kcl'),
 | 
			
		||||
              path.join(bracketDir, 'cylinder.kcl')
 | 
			
		||||
              path.join(projDir, 'cylinder.kcl')
 | 
			
		||||
            ),
 | 
			
		||||
            fsp.copyFile(
 | 
			
		||||
              executorInputPath('cylinder.kcl'),
 | 
			
		||||
              path.join(nestedProjDir, 'main.kcl')
 | 
			
		||||
            ),
 | 
			
		||||
            fsp.copyFile(
 | 
			
		||||
              executorInputPath('e2e-can-sketch-on-chamfer.kcl'),
 | 
			
		||||
              path.join(bracketDir, 'bracket.kcl')
 | 
			
		||||
              path.join(projDir, 'bracket.kcl')
 | 
			
		||||
            ),
 | 
			
		||||
            fsp.copyFile(
 | 
			
		||||
              testsInputPath('cube.step'),
 | 
			
		||||
              path.join(bracketDir, 'cube.step')
 | 
			
		||||
              path.join(projDir, 'cube.step')
 | 
			
		||||
            ),
 | 
			
		||||
            fsp.writeFile(path.join(bracketDir, 'main.kcl'), ''),
 | 
			
		||||
            fsp.writeFile(path.join(projDir, 'main.kcl'), ''),
 | 
			
		||||
          ])
 | 
			
		||||
        })
 | 
			
		||||
        await page.setBodyDimensions({ width: 1000, height: 500 })
 | 
			
		||||
@ -167,6 +173,25 @@ test.describe('Point-and-click assemblies tests', () => {
 | 
			
		||||
        await expect(
 | 
			
		||||
          page.getByText('This file is already imported')
 | 
			
		||||
        ).toBeVisible()
 | 
			
		||||
        await cmdBar.closeCmdBar()
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      await test.step('Insert a nested kcl part', async () => {
 | 
			
		||||
        await insertPartIntoAssembly(
 | 
			
		||||
          'nested/twice/main.kcl',
 | 
			
		||||
          'main',
 | 
			
		||||
          toolbar,
 | 
			
		||||
          cmdBar,
 | 
			
		||||
          page
 | 
			
		||||
        )
 | 
			
		||||
        await toolbar.openPane('code')
 | 
			
		||||
        await page.waitForTimeout(10000)
 | 
			
		||||
        await editor.expectEditor.toContain(
 | 
			
		||||
          `
 | 
			
		||||
          import "nested/twice/main.kcl" as main 
 | 
			
		||||
          `,
 | 
			
		||||
          { shouldNormalise: true }
 | 
			
		||||
        )
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
@ -441,39 +441,46 @@ export const FileMachineProvider = ({
 | 
			
		||||
  )
 | 
			
		||||
  useMenuListener(cb)
 | 
			
		||||
 | 
			
		||||
  const kclCommandMemo = useMemo(
 | 
			
		||||
    () =>
 | 
			
		||||
      kclCommands({
 | 
			
		||||
        authToken: token ?? '',
 | 
			
		||||
        projectData,
 | 
			
		||||
        settings: {
 | 
			
		||||
          defaultUnit:
 | 
			
		||||
            settings.modeling.defaultUnit.current ??
 | 
			
		||||
            DEFAULT_DEFAULT_LENGTH_UNIT,
 | 
			
		||||
        },
 | 
			
		||||
        specialPropsForInsertCommand: {
 | 
			
		||||
          providedOptions: (isDesktop() && project?.children
 | 
			
		||||
            ? project.children
 | 
			
		||||
            : []
 | 
			
		||||
          ).flatMap((v) => {
 | 
			
		||||
            // TODO: add support for full tree traversal when KCL support subdir imports
 | 
			
		||||
            const relativeFilePath = v.path.replace(
 | 
			
		||||
              project?.path + window.electron.sep,
 | 
			
		||||
              ''
 | 
			
		||||
            )
 | 
			
		||||
            const isDirectory = v.children
 | 
			
		||||
            const isCurrentFile = v.path === file?.path
 | 
			
		||||
            return isDirectory || isCurrentFile
 | 
			
		||||
              ? []
 | 
			
		||||
              : {
 | 
			
		||||
                  name: relativeFilePath,
 | 
			
		||||
                  value: relativeFilePath,
 | 
			
		||||
                }
 | 
			
		||||
          }),
 | 
			
		||||
        },
 | 
			
		||||
      }),
 | 
			
		||||
    [codeManager, kclManager, send, project, file]
 | 
			
		||||
  )
 | 
			
		||||
  const kclCommandMemo = useMemo(() => {
 | 
			
		||||
    const providedOptions = []
 | 
			
		||||
    if (isDesktop() && project?.children && file?.path) {
 | 
			
		||||
      const projectPath = project.path
 | 
			
		||||
      const filePath = file.path
 | 
			
		||||
      let children = project.children
 | 
			
		||||
      while (children.length > 0) {
 | 
			
		||||
        const v = children.pop()
 | 
			
		||||
        if (!v) {
 | 
			
		||||
          continue
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (v.children) {
 | 
			
		||||
          children.push(...v.children)
 | 
			
		||||
          continue
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const relativeFilePath = v.path.replace(
 | 
			
		||||
          projectPath + window.electron.sep,
 | 
			
		||||
          ''
 | 
			
		||||
        )
 | 
			
		||||
        const isCurrentFile = v.path === filePath
 | 
			
		||||
        if (!isCurrentFile) {
 | 
			
		||||
          providedOptions.push({
 | 
			
		||||
            name: relativeFilePath.replaceAll(window.electron.sep, '/'),
 | 
			
		||||
            value: relativeFilePath.replaceAll(window.electron.sep, '/'),
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return kclCommands({
 | 
			
		||||
      authToken: token ?? '',
 | 
			
		||||
      projectData,
 | 
			
		||||
      settings: {
 | 
			
		||||
        defaultUnit:
 | 
			
		||||
          settings.modeling.defaultUnit.current ?? DEFAULT_DEFAULT_LENGTH_UNIT,
 | 
			
		||||
      },
 | 
			
		||||
      specialPropsForInsertCommand: { providedOptions },
 | 
			
		||||
    })
 | 
			
		||||
  }, [codeManager, kclManager, send, project, file])
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    commandBarActor.send({
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user