flattentree
filip mertens 11 months ago
parent e6fb5d5fb4
commit c46792e04f
  1. 2
      apps/remix-ide/src/app/plugins/electron/fsPlugin.ts
  2. 11
      apps/remixdesktop/src/plugins/fsPlugin.ts
  3. 2
      libs/remix-ui/checkbox/src/lib/remix-ui-checkbox.tsx
  4. 2
      libs/remix-ui/clipboard/src/lib/copy-to-clipboard/copy-to-clipboard.tsx
  5. 4
      libs/remix-ui/file-decorators/src/lib/components/filedecorationicons/file-decoration-tooltip.tsx
  6. 30
      libs/remix-ui/helper/src/lib/components/custom-tooltip.tsx
  7. 2
      libs/remix-ui/helper/src/types/customtooltip.ts
  8. 2
      libs/remix-ui/workspace/src/lib/components/file-explorer-menu.tsx
  9. 25
      libs/remix-ui/workspace/src/lib/components/file-explorer.tsx
  10. 59
      libs/remix-ui/workspace/src/lib/components/file-recursive-item-input.tsx
  11. 66
      libs/remix-ui/workspace/src/lib/components/file-recursive-tree-item.tsx
  12. 74
      libs/remix-ui/workspace/src/lib/components/file-recursive-tree.tsx
  13. 2
      libs/remix-ui/workspace/src/lib/components/workspace-hamburger-item.tsx
  14. 1
      libs/remix-ui/workspace/src/lib/reducers/workspace.ts
  15. 2
      libs/remix-ui/workspace/src/lib/types/index.ts
  16. 2
      package.json
  17. 122
      yarn.lock

@ -47,6 +47,7 @@ export class fsPlugin extends ElectronPlugin {
return await this.call('fs', 'rmdir', path)
},
readdir: async (path: string) => {
console.log('readdir', path)
path = fixPath(path)
const files = await this.call('fs', 'readdir', path)
return files
@ -60,6 +61,7 @@ export class fsPlugin extends ElectronPlugin {
return await this.call('fs', 'mkdir', path)
},
readFile: async (path: string, options) => {
console.log('readFile', path)
try {
path = fixPath(path)
const file = await this.call('fs', 'readFile', path, options)

@ -195,20 +195,23 @@ class FSPluginClient extends ElectronBasePluginClient {
async watch(): Promise<void> {
try {
this.off('filePanel' as any, 'expandPathChanged')
this.on('filePanel' as any, 'expandPathChanged', async (paths: string[]) => {
console.log('expandPathChanged', paths)
this.expandedPaths = ['.', ...paths] // add root
console.log(Object.keys(this.watchers))
paths = paths.map((path) => this.fixPath(path))
for (let path of paths) {
if (!this.watchers[path]) {
path = this.fixPath(path)
if (!Object.keys(this.watchers).includes(path)) {
this.watchers[path] = await this.watcherInit(path)
console.log('added watcher', path)
}
}
paths = paths.map((path) => this.fixPath(path))
for (const watcher in this.watchers) {
if (watcher === this.workingDir) continue
if (!paths.includes(watcher)) {
this.watchers[watcher].close()
await this.watchers[watcher].close()
delete this.watchers[watcher]
console.log('removed watcher', watcher)
}

@ -1,7 +1,7 @@
import {CustomTooltip} from '@remix-ui/helper'
import React, {CSSProperties} from 'react' //eslint-disable-line
import './remix-ui-checkbox.css'
import {Placement} from 'react-bootstrap/esm/types'
import {Placement} from 'react-bootstrap/esm/Overlay'
/* eslint-disable-next-line */
export interface RemixUiCheckboxProps {

@ -1,6 +1,6 @@
import React, {useState} from 'react'
import copy from 'copy-to-clipboard'
import {Placement} from 'react-bootstrap/esm/types'
import {Placement} from 'react-bootstrap/esm/Overlay'
import './copy-to-clipboard.css'
import {CustomTooltip} from '@remix-ui/helper'

@ -22,9 +22,9 @@ const FileDecorationTooltip = (props: {fileDecoration: fileDecoration; icon: JSX
placement="auto"
overlay={
<Popover id={`popover-positioned-auto}`}>
<Popover.Body id={`error-tooltip-${props.fileDecoration.path}`} style={{minWidth: 'fit-content'}} className={'text-wrap bg-secondary w-100 p-1 m-0'}>
<Popover.Content id={`error-tooltip-${props.fileDecoration.path}`} style={{minWidth: 'fit-content'}} className={'text-wrap bg-secondary w-100 p-1 m-0'}>
<pre>{getComments(props.fileDecoration)}</pre>
</Popover.Body>
</Popover.Content>
</Popover>
}
>

@ -1,7 +1,7 @@
import { use } from 'chai'
import React, { useEffect } from 'react'
import { Fragment } from 'react'
import { OverlayTrigger, Popover } from 'react-bootstrap'
import { OverlayTrigger, Popover, Tooltip } from 'react-bootstrap'
import { CustomTooltipType } from '../../types/customtooltip'
export function CustomTooltip({ children, placement, tooltipId, tooltipClasses, tooltipText, tooltipTextClasses, delay, hide }: CustomTooltipType) {
@ -15,22 +15,18 @@ export function CustomTooltip({ children, placement, tooltipId, tooltipClasses,
return (
(!hide ? (
<Fragment>
<OverlayTrigger
placement={placement}
overlay={<>
<Popover id={`popover-positioned-${placement}`}>
<Popover.Body
id={!tooltipId ? `${tooltipText}Tooltip` : tooltipId}
style={{ minWidth: 'fit-content' }}
className={'text-wrap p-1 px-2 bg-secondary w-100' + tooltipClasses}
>
<>{typeof tooltipText === 'string' ? <span className={'text-wrap p-1 px-2 bg-secondary ' + { tooltipTextClasses }}>{tooltipText}</span> : tooltipText}</>
</Popover.Body>
</Popover>
</>}
delay={delay}
>
<>{children}</>
<OverlayTrigger overlay={
<Popover id={`popover-positioned-${placement}`}>
<Popover.Content
id={!tooltipId ? `${tooltipText}Tooltip` : tooltipId}
style={{ minWidth: 'fit-content' }}
className={'text-wrap p-1 px-2 bg-secondary w-100' + tooltipClasses}>
{typeof tooltipText === 'string' ? <span className={'text-wrap p-1 px-2 bg-secondary ' + { tooltipTextClasses }}>{tooltipText}</span> : tooltipText}
</Popover.Content>
</Popover>
}>
{children}
</OverlayTrigger>
</Fragment>
) : (

@ -1,4 +1,4 @@
import { Placement } from 'react-bootstrap/esm/types'
import { Placement } from 'react-bootstrap/esm/Overlay'
import { OverlayDelay, OverlayTriggerRenderProps } from 'react-bootstrap/esm/OverlayTrigger'
export type CustomTooltipType = {

@ -1,7 +1,7 @@
import {CustomTooltip} from '@remix-ui/helper'
import React, {useState, useEffect, useContext} from 'react' //eslint-disable-line
import {FormattedMessage} from 'react-intl'
import {Placement} from 'react-bootstrap/esm/types'
import {Placement} from 'react-bootstrap/esm/Overlay'
import {FileExplorerMenuProps} from '../types'
import { FileSystemContext } from '../contexts'
const _paq = (window._paq = window._paq || [])

@ -1,4 +1,4 @@
import React, { useEffect, useState, useRef, SyntheticEvent } from 'react' // eslint-disable-line
import React, { useEffect, useState, useRef, SyntheticEvent, useTransition } from 'react' // eslint-disable-line
import { useIntl } from 'react-intl'
import { TreeView } from '@remix-ui/tree-view' // eslint-disable-line
import { FileExplorerMenu } from './file-explorer-menu' // eslint-disable-line
@ -8,12 +8,11 @@ import { FileExplorerProps, FileType, WorkSpaceState, WorkspaceElement } from '.
import '../css/file-explorer.css'
import { checkSpecialChars, extractNameFromKey, extractParentFromKey, getPathIcon, joinPath } from '@remix-ui/helper'
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { FileRender } from './file-render'
import { Drag, Draggable } from '@remix-ui/drag-n-drop'
import { ROOT_PATH } from '../utils/constants'
import { fileKeySort } from '../utils'
import { moveFileIsAllowed, moveFolderIsAllowed } from '../actions'
import { RecursiveTreeItem, RecursiveTree } from './file-recursive-tree'
import { RecursiveTree } from './file-recursive-tree'
export const FileExplorer = (props: FileExplorerProps) => {
const intl = useIntl()
@ -34,6 +33,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
fileState
} = props
const [state, setState] = useState<WorkSpaceState>(workspaceState)
const [isPending, startTransition] = useTransition();
const treeRef = useRef<HTMLDivElement>(null)
const [childrenKeys, setChildrenKeys] = useState<string[]>([])
@ -153,6 +153,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
}
const handleClickFile = (path: string, type: WorkspaceElement) => {
console.log('handleClickFile', path, type)
if (!state.ctrlKey) {
props.dispatchHandleClickFile(path, type)
} else {
@ -187,14 +188,14 @@ export const FileExplorer = (props: FileExplorerProps) => {
}
} else {
let expandPath = []
if (!props.expandPath.includes(path)) {
expandPath = [...new Set([...props.expandPath, path])]
props.dispatchFetchDirectory(path)
} else {
expandPath = [...new Set(props.expandPath.filter((key) => key && typeof key === 'string' && !key.startsWith(path)))]
}
console.log('handleClickFolder', path, type)
props.dispatchSetFocusElement([{ key: path, type }])
props.dispatchHandleExpandPath(expandPath)
}
@ -416,12 +417,18 @@ export const FileExplorer = (props: FileExplorerProps) => {
</li>
<div>
<div onClick={handleTreeClick}>
<RecursiveTree handleContextMenu={handleContextMenu} expandPath={props.expandPath} files={files} />
<RecursiveTree
focusEdit={state.focusEdit}
focusElement={props.focusElement}
focusContext={state.focusContext}
editModeOff={editModeOff}
handleContextMenu={handleContextMenu}
expandPath={props.expandPath}
files={files} />
</div>
</div>
<Draggable isDraggable={false} file={{ name: '/', path: '/', type: 'folder', isDirectory: true }} expandedPath={props.expandPath} handleClickFolder={null}>
<div className='d-block w-100 pb-4 mb-4'></div>
</Draggable>
<div className='d-block w-100 pb-4 mb-4'></div>
</TreeView>
</div>

@ -0,0 +1,59 @@
import React, { useState, useRef, useEffect } from "react"
import { FileType } from "../types"
interface RecursiveItemInputProps {
file: FileType
editModeOff: (content: string) => void
}
export const RecursiveItemInput = (props: RecursiveItemInputProps) => {
const { file, editModeOff } = props
const [value, setValue] = useState<string>(file.name)
const ref = useRef(null)
const handleKeyDown = (e: any) => {
if (e.which === 13) {
e.preventDefault()
editModeOff(value)
}
if (e.which === 27) {
e.preventDefault()
// don't change it
editModeOff(file.name)
}
}
const handleEditBlur = (event: React.SyntheticEvent) => {
event.stopPropagation()
// don't change it
editModeOff(file.name)
}
const handleFocus = (e: any) => {
// select the file name without the extension
const val = e.target.value
const dotIndex = val.lastIndexOf('.')
if (dotIndex > 0) {
e.target.setSelectionRange(0, dotIndex)
} else {
e.target.setSelectionRange(0, val.length)
}
}
useEffect(() => {
ref.current.focus()
},[])
return(<input
onBlur={handleEditBlur}
onKeyDown={handleKeyDown}
ref={ref}
style={{
height: '1.5em',
}}
className='form-control p-0 ml-2'
onFocus={handleFocus}
onChange={e => setValue(e.target.value)}
defaultValue={file.name}>
</input>)
}

@ -0,0 +1,66 @@
import { getPathIcon } from "@remix-ui/helper";
import React, { useEffect, useState } from "react";
import { FileType, WorkspaceElement } from "../types";
import { RecursiveItemInput } from "./file-recursive-item-input";
interface RecursiveTreeItemProps {
file: FileType
expandPath?: string[]
focusEdit: {element: string; type: string; isNew: boolean; lastEdit: string}
editModeOff: (content: string) => void
focusElement: {key: string; type: WorkspaceElement}[]
focusContext: {element: string; x: number; y: number; type: string}
}
export const RecursiveTreeItem = (props: RecursiveTreeItemProps) => {
const [hover, setHover] = useState<boolean>(false)
const { file, expandPath, focusEdit, editModeOff } = props
useEffect(() => {
console.log('item render')
},[])
const labelClass =
props.focusEdit.element === file.path
? 'bg-light'
: props.focusElement.findIndex((item) => item.key === file.path) !== -1
? 'bg-secondary'
: hover
? 'bg-light border-no-shift'
: props.focusContext.element === file.path && props.focusEdit.element !== file.path
? 'bg-light border-no-shift'
: ''
return (
<>
<li ref={null} key={`treeViewLi${file.path}`} data-type={file.isDirectory ? 'folder' : 'file'} data-path={`${file.path}`} data-id={`treeViewLi${file.path}`} className="li_tv">
<div
key={`treeViewDiv${file.path}`}
data-id={`treeViewDiv${file.path}`}
className={`d-flex flex-row align-items-center ${labelClass}`}
onMouseOver={() => setHover(true)}
onMouseOut={() => setHover(false)}
>
<div className={`pr-2 pl-2 ${file.isDirectory ? expandPath && expandPath.includes(file.path) ? 'fa fa-folder-open' : 'fa fa-folder' : getPathIcon(file.path)} caret caret_tv`}></div>
{focusEdit && file.path && focusEdit.element === file.path ?
<RecursiveItemInput editModeOff={editModeOff} file={file}/>:
<span draggable="true" className="ml-1 pl-2" data-label-type={file.isDirectory ? 'folder' : 'file'} data-label-path={`${file.path}`}>{file.name}</span>}
</div>
<ul className="ul_tv ml-0 pl-1" >
{
expandPath && expandPath.includes(file.path) &&
file.child && Object.keys(file.child).map((key, index) => {
//console.log('recursive tree', file.child[key])
return (<RecursiveTreeItem
editModeOff={editModeOff}
focusElement={props.focusElement}
focusContext={props.focusContext}
focusEdit={props.focusEdit}
expandPath={expandPath} key={index} file={file.child[key]} />)
})
}
</ul>
</li>
</>)
}

@ -1,15 +1,17 @@
import { CustomTooltip, getPathIcon } from '@remix-ui/helper'
import e from 'express'
import React, { SyntheticEvent, useEffect, useRef, useState } from 'react'
import { Overlay, OverlayTrigger, Popover, Tooltip } from 'react-bootstrap'
import { FileType } from '../types'
import { Popover } from 'react-bootstrap'
import { FileType, WorkspaceElement } from '../types'
import { ROOT_PATH } from '../utils/constants'
import { RecursiveTreeItem } from './file-recursive-tree-item'
interface RecursiveTreeProps {
files: { [x: string]: Record<string, FileType> },
expandPath: string[],
handleContextMenu: (pageX: number, pageY: number, path: string, content: string, type: string) => void
focusEdit: {element: string; type: string; isNew: boolean; lastEdit: string}
focusElement: {key: string; type: WorkspaceElement}[]
focusContext: {element: string; x: number; y: number; type: string}
editModeOff: (content: string) => void
}
let mouseTimer: any = {
@ -19,7 +21,7 @@ let mouseTimer: any = {
export const RecursiveTree = (props: RecursiveTreeProps) => {
const { files, expandPath } = props
const { files, expandPath, editModeOff } = props
const ref = useRef(null)
const [mouseOverTarget, setMouseOverTarget] = useState<{
path: string,
@ -33,11 +35,15 @@ export const RecursiveTree = (props: RecursiveTreeProps) => {
const [showMouseOverTarget, setShowMouseOverTarget] = useState<boolean>(false)
useEffect(() => {
console.log('EXPAND', expandPath)
console.log('focus edit', props.focusEdit)
},[props.focusEdit])
useEffect(() => {
console.log('STATE', props.focusContext, props.focusElement, props.focusEdit, expandPath)
//files[ROOT_PATH] && Object.keys(files[ROOT_PATH]).map((key, index) => {
// console.log('recursive tree', files[ROOT_PATH][key])
//})
}, [expandPath])
}, [props.focusContext, props.focusElement, props.focusEdit, expandPath])
const getEventTarget = async (e: any, useLabel: boolean = false) => {
let target = e.target as HTMLElement
@ -68,7 +74,6 @@ export const RecursiveTree = (props: RecursiveTreeProps) => {
const handleContextMenu = async (e: any) => {
e.preventDefault()
e.stopPropagation()
console.log('context menu', e)
const target = await getEventTarget(e)
if (target) {
props.handleContextMenu(e.pageX, e.pageY, target.path, target.content, target.type)
@ -135,9 +140,9 @@ export const RecursiveTree = (props: RecursiveTreeProps) => {
return (
<div onMouseLeave={onMouseLeave} onMouseMove={onMouseMove} onDrop={onDrop} onDragOver={onDragOver} onContextMenu={handleContextMenu}>
{showMouseOverTarget && mouseOverTarget &&
<Popover id='popover-basic'
className='text-wrap bg-secondary'
placement='top'
ref={ref}
style={
@ -147,17 +152,23 @@ export const RecursiveTree = (props: RecursiveTreeProps) => {
left: `${mouseOverTarget.position.left}px`,
minWidth: 'fit-content'
}
}>
<Popover.Body>
<Popover.Content
className='text-wrap p-1 px-2 bg-secondary w-100'
>
{mouseOverTarget && mouseOverTarget.path}
</Popover.Body>
</Popover.Content>
</Popover>
}
<ul className="ul_tv ml-0 pl-1" >{files[ROOT_PATH] &&
Object.keys(files[ROOT_PATH]).map((key, index) => {
//console.log('recursive tree', files[ROOT_PATH][key])
return (<RecursiveTreeItem
editModeOff={editModeOff}
focusEdit={props.focusEdit}
focusElement={props.focusElement}
focusContext={props.focusContext}
expandPath={expandPath}
key={index}
file={files[ROOT_PATH][key]}
@ -168,43 +179,8 @@ export const RecursiveTree = (props: RecursiveTreeProps) => {
)
}
interface RecursiveTreeItemProps {
file: FileType
expandPath?: string[]
}
export const RecursiveTreeItem = (props: RecursiveTreeItemProps) => {
const [hover, setHover] = useState<boolean>(false)
const { file, expandPath } = props
const labelClass =
hover
? 'bg-light border-no-shift'
: ''
return (
<>
<li ref={null} key={`treeViewLi${file.path}`} data-type={file.isDirectory ? 'folder' : 'file'} data-path={`${file.path}`} data-id={`treeViewLi${file.path}`} className="li_tv">
<div
key={`treeViewDiv${file.path}`}
data-id={`treeViewDiv${file.path}`}
className={`d-flex flex-row align-items-center ${labelClass}`}
onMouseOver={() => setHover(true)}
onMouseOut={() => setHover(false)}
>
<div className={`pr-2 pl-2 ${file.isDirectory ? expandPath && expandPath.includes(file.path) ? 'fa fa-folder-open' : 'fa fa-folder' : getPathIcon(file.path)} caret caret_tv`}></div>
<span draggable="true" className="ml-1 pl-2" data-label-type={file.isDirectory ? 'folder' : 'file'} data-label-path={`${file.path}`}>{file.name}</span>
</div>
<ul className="ul_tv ml-0 pl-1" >
{
expandPath && expandPath.includes(file.path) &&
file.child && Object.keys(file.child).map((key, index) => {
return (<RecursiveTreeItem
expandPath={expandPath} key={index} file={file.child[key]} />)
})
}
</ul>
</li>
</>)
}

@ -78,7 +78,7 @@ export interface HamburgerSubMenuItemProps {
export function HamburgerSubMenuItem(props: HamburgerSubMenuItemProps) {
return (
<>
<NavDropdown title={props.title} as={CustomMenu} key={props.id} id={props.id} drop={'end'}>
<NavDropdown title={props.title} as={CustomMenu} key={props.id} id={props.id} drop={'down'}>
{props.subMenus.map((item) => (
<NavHamburgerMenuItem platforms={props.platforms} kind={item.kind} fa={item.fa} hideOption={item.hideOption} actionOnClick={item.actionOnClick} />
))}

@ -122,6 +122,7 @@ export const browserInitialState: BrowserState = {
}
export const browserReducer = (state = browserInitialState, action: Actions) => {
console.log('browserReducer', action)
switch (action.type) {
case 'SET_CURRENT_WORKSPACE': {
const payload = action.payload

@ -5,7 +5,7 @@ import { fileDecoration } from '@remix-ui/file-decorators'
import { RemixAppManager } from 'libs/remix-ui/plugin-manager/src/types'
import { ViewPlugin } from '@remixproject/engine-web'
import { appPlatformTypes } from '@remix-ui/app'
import { Placement } from 'react-bootstrap/esm/types'
import { Placement } from 'react-bootstrap/esm/Overlay'
export type action = { name: string, type?: Array<WorkspaceElement>, path?: string[], extension?: string[], pattern?: string[], id: string, multiselect: boolean, label: string, sticky?: boolean, group: number, platform?: appPlatformTypes }
export interface JSONStandardInput {

@ -200,7 +200,7 @@
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-beautiful-dnd": "^13.1.0",
"react-bootstrap": "^2.9.0",
"react-bootstrap": "^1.6.4",
"react-dom": "^18.2.0",
"react-draggable": "^4.4.4",
"react-intl": "^6.0.4",

@ -1656,6 +1656,13 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.13.8":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d"
integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/runtime@^7.14.8":
version "7.19.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259"
@ -1677,13 +1684,6 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d"
integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/template@^7.15.4", "@babel/template@^7.20.7", "@babel/template@^7.3.3", "@babel/template@^7.4.0":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
@ -4964,13 +4964,6 @@
unbzip2-stream "1.4.3"
yargs "17.7.1"
"@react-aria/ssr@^3.5.0":
version "3.9.0"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.0.tgz#457310129e1447b09d2f4aa2fdd62ab0e668d88c"
integrity sha512-Bz6BqP6ZorCme9tSWHZVmmY+s7AU8l6Vl2NUYmBzezD//fVHHfFo4lFBn5tBuAaJEm3AuCLaJQ6H2qhxNSb7zg==
dependencies:
"@swc/helpers" "^0.5.0"
"@remix-run/router@1.14.0":
version "1.14.0"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.14.0.tgz#9bc39a5a3a71b81bdb310eba6def5bc3966695b7"
@ -5054,28 +5047,18 @@
"@remixproject/plugin-utils" "0.3.42"
events "3.2.0"
"@restart/hooks@^0.4.9":
"@restart/context@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02"
integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==
"@restart/hooks@^0.4.7":
version "0.4.15"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.15.tgz#70990085c9b79d1f3e140db824b29218bdc2b5bb"
integrity sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw==
dependencies:
dequal "^2.0.3"
"@restart/ui@^1.6.6":
version "1.6.6"
resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.6.6.tgz#3481e2eaf15d7cae55bb2f518624e10d19c75800"
integrity sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==
dependencies:
"@babel/runtime" "^7.21.0"
"@popperjs/core" "^2.11.6"
"@react-aria/ssr" "^3.5.0"
"@restart/hooks" "^0.4.9"
"@types/warning" "^3.0.0"
dequal "^2.0.3"
dom-helpers "^5.2.0"
uncontrollable "^8.0.1"
warning "^4.0.3"
"@ricarso/react-image-magnifiers@^1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@ricarso/react-image-magnifiers/-/react-image-magnifiers-1.9.0.tgz#c743620a05acc6c288797dac93e91f229ada9cb0"
@ -5597,13 +5580,6 @@
"@svgr/plugin-jsx" "^6.5.1"
"@svgr/plugin-svgo" "^6.5.1"
"@swc/helpers@^0.5.0":
version "0.5.3"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f"
integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==
dependencies:
tslib "^2.4.0"
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@ -5968,6 +5944,11 @@
dependencies:
"@types/node" "*"
"@types/invariant@^2.2.33":
version "2.2.37"
resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.37.tgz#1709741e534364d653c87dff22fc76fa94aa7bc0"
integrity sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==
"@types/isomorphic-git__lightning-fs@^4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@types/isomorphic-git__lightning-fs/-/isomorphic-git__lightning-fs-4.4.2.tgz#aead17cb1ab1a965b69a5247a7d4087336ad5df7"
@ -6136,6 +6117,11 @@
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
"@types/prop-types@^15.7.3":
version "15.7.11"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563"
integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==
"@types/qs@*":
version "6.9.7"
resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
@ -6206,14 +6192,14 @@
"@types/history" "*"
"@types/react" "*"
"@types/react-transition-group@^4.4.6":
"@types/react-transition-group@^4.4.1":
version "4.4.10"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.10.tgz#6ee71127bdab1f18f11ad8fb3322c6da27c327ac"
integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.9.11", "@types/react@^18.2.0":
"@types/react@*", "@types/react@16 || 17 || 18", "@types/react@>=16.14.8", "@types/react@>=16.9.11", "@types/react@^18.2.0":
version "18.2.45"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.45.tgz#253f4fac288e7e751ab3dc542000fb687422c15c"
integrity sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==
@ -9160,9 +9146,9 @@ boom@2.x.x:
hoek "2.x.x"
bootstrap@^5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.2.2.tgz#834e053eed584a65e244d8aa112a6959f56e27a0"
integrity sha512-dEtzMTV71n6Fhmbg4fYJzQsw1N29hJKO1js5ackCgIpDcGid2ETMGC6zwSYw09v05Y+oRdQ9loC54zB1La3hHQ==
version "5.3.2"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.2.tgz#97226583f27aae93b2b28ab23f4c114757ff16ae"
integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==
borc@^2.1.2:
version "2.1.2"
@ -10320,7 +10306,7 @@ classic-level@^1.2.0:
napi-macros "^2.2.2"
node-gyp-build "^4.3.0"
classnames@^2.3.2:
classnames@^2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
@ -23850,21 +23836,26 @@ react-beautiful-dnd@^13.1.0:
redux "^4.0.4"
use-memo-one "^1.1.1"
react-bootstrap@^2.9.0:
version "2.9.1"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.9.1.tgz#c1ab48ae2b2cfe6d5ac957c2042eb36fcafdb1d2"
integrity sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==
dependencies:
"@babel/runtime" "^7.22.5"
"@restart/hooks" "^0.4.9"
"@restart/ui" "^1.6.6"
"@types/react-transition-group" "^4.4.6"
classnames "^2.3.2"
react-bootstrap@^1.6.4:
version "1.6.7"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.6.7.tgz#7afea926cada8175d67df07b893dbad2998ae463"
integrity sha512-IzCYXuLSKDEjGFglbFWk0/iHmdhdcJzTmtS6lXxc0kaNFx2PFgrQf5jKnx5sarF2tiXh9Tgx3pSt3pdK7YwkMA==
dependencies:
"@babel/runtime" "^7.14.0"
"@restart/context" "^2.1.4"
"@restart/hooks" "^0.4.7"
"@types/invariant" "^2.2.33"
"@types/prop-types" "^15.7.3"
"@types/react" ">=16.14.8"
"@types/react-transition-group" "^4.4.1"
"@types/warning" "^3.0.0"
classnames "^2.3.1"
dom-helpers "^5.2.1"
invariant "^2.2.4"
prop-types "^15.8.1"
prop-types "^15.7.2"
prop-types-extra "^1.1.0"
react-transition-group "^4.4.5"
react-overlays "^5.1.2"
react-transition-group "^4.4.1"
uncontrollable "^7.2.1"
warning "^4.0.3"
@ -23968,6 +23959,20 @@ react-multi-carousel@^2.8.2:
resolved "https://registry.yarnpkg.com/react-multi-carousel/-/react-multi-carousel-2.8.2.tgz#4bbd7a9656d8e49e081745331593e5500eefdbe4"
integrity sha512-M9Y7DfAp8bA/r6yexttU6RLA7uyppje4c0ELRuCHZWswH+u7nr0uVP6qHNPjc4XGOEY1MYFOb5nBg7JvoKutuQ==
react-overlays@^5.1.2:
version "5.2.1"
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b"
integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==
dependencies:
"@babel/runtime" "^7.13.8"
"@popperjs/core" "^2.11.6"
"@restart/hooks" "^0.4.7"
"@types/warning" "^3.0.0"
dom-helpers "^5.2.0"
prop-types "^15.7.2"
uncontrollable "^7.2.1"
warning "^4.0.3"
react-property@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/react-property/-/react-property-2.0.0.tgz#2156ba9d85fa4741faf1918b38efc1eae3c6a136"
@ -24022,7 +24027,7 @@ react-textarea-autosize@^8.3.2:
use-composed-ref "^1.3.0"
use-latest "^1.2.1"
react-transition-group@^4.4.5:
react-transition-group@^4.4.1:
version "4.4.5"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
@ -27883,11 +27888,6 @@ uncontrollable@^7.2.1:
invariant "^2.2.4"
react-lifecycles-compat "^3.0.4"
uncontrollable@^8.0.1:
version "8.0.4"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6"
integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==
undeclared-identifiers@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f"

Loading…
Cancel
Save