Display menu items

pull/668/head
ioedeveloper 4 years ago
parent eb353fa596
commit 2c32becfc7
  1. 102
      apps/remix-ide/src/app/panels/file-panel.js
  2. 56
      apps/remix-ide/src/app/panels/styles/file-panel-styles.css
  3. 0
      libs/remix-ui/file-explorer/src/lib/css/file-explorer.css
  4. 109
      libs/remix-ui/file-explorer/src/lib/file-explorer.tsx
  5. 1
      libs/remix-ui/file-explorer/src/lib/types/index.ts

@ -3,14 +3,14 @@ import { ViewPlugin } from '@remixproject/engine-web'
import * as packageJson from '../../../../../package.json'
import React from 'react' // eslint-disable-line
import ReactDOM from 'react-dom'
import { FileExplorer } from '@remix-ui/file-explorer'
import { FileExplorer } from '@remix-ui/file-explorer' // eslint-disable-line
import './styles/file-panel-styles.css'
var yo = require('yo-yo')
var EventManager = require('../../lib/events')
// var FileExplorer = require('../files/file-explorer')
var { RemixdHandle } = require('../files/remixd-handle.js')
var { GitHandle } = require('../files/git-handle.js')
var globalRegistry = require('../../global/registry')
var css = require('./styles/file-panel-styles')
var canUpload = window.File || window.FileReader || window.FileList || window.Blob
@ -47,68 +47,72 @@ const profile = {
module.exports = class Filepanel extends ViewPlugin {
constructor (appManager) {
super(profile)
var self = this
self._components = {}
self._components.registry = globalRegistry
self._deps = {
fileProviders: self._components.registry.get('fileproviders').api,
fileManager: self._components.registry.get('filemanager').api,
config: self._components.registry.get('config').api
this._components = {}
this._components.registry = globalRegistry
this._deps = {
fileProviders: this._components.registry.get('fileproviders').api,
fileManager: this._components.registry.get('filemanager').api,
config: this._components.registry.get('config').api
}
function createProvider (key, menuItems) {
return <FileExplorer
localRegistry={self._components.registry}
files={self._deps.fileProviders[key]}
menuItems={menuItems}
plugin={self}
/>
}
var fileExplorer = createProvider('browser', ['createNewFile', 'publishToGist', canUpload ? 'uploadFile' : ''])
var fileSystemExplorer = createProvider('localhost')
// self.remixdHandle = new RemixdHandle(fileSystemExplorer, self._deps.fileProviders.localhost, appManager)
self.gitHandle = new GitHandle()
const explorers = yo`
<div>
<div class="pl-2 ${css.treeview}" data-id="filePanelFileExplorerTree">${fileExplorer.init()}</div>
<div class="pl-2 filesystemexplorer ${css.treeview}">${fileSystemExplorer.init()}</div>
this.el = yo`
<div id="fileExplorerView">
</div>
`
function template () {
return yo`
<div class=${css.container}>
<div class="${css.fileexplorer}">
<div class="${css.fileExplorerTree}">
${explorers}
</div>
</div>
</div>
`
}
this.remixdHandle = new RemixdHandle({}, this._deps.fileProviders.localhost, appManager)
var event = new EventManager()
self.event = event
var element = template()
fileExplorer.ensureRoot()
self._deps.fileProviders.localhost.event.register('connecting', (event) => {
this.event = new EventManager()
// fileExplorer.ensureRoot()
this._deps.fileProviders.localhost.event.register('connecting', (event) => {
})
self._deps.fileProviders.localhost.event.register('connected', (event) => {
this._deps.fileProviders.localhost.event.register('connected', (event) => {
fileSystemExplorer.show()
})
self._deps.fileProviders.localhost.event.register('errored', (event) => {
this._deps.fileProviders.localhost.event.register('errored', (event) => {
fileSystemExplorer.hide()
})
self._deps.fileProviders.localhost.event.register('closed', (event) => {
this._deps.fileProviders.localhost.event.register('closed', (event) => {
fileSystemExplorer.hide()
})
self.render = function render () { return element }
this.renderComponent()
}
render () {
return this.el
}
renderComponent () {
ReactDOM.render(
<div className='remixui_container'>
<div className='remixui_fileexplorer'>
<div className='remixui_fileExplorerTree'>
<div>
<div className='pl-2 remixui_treeview' data-id='filePanelFileExplorerTree'>
<FileExplorer
name='browser'
localRegistry={this._components.registry}
files={this._deps.fileProviders.browser}
menuItems={['createNewFile', 'publishToGist', canUpload ? 'uploadFile' : '']}
plugin={this}
/>
</div>
<div className='pl-2 filesystemexplorer remixui_treeview'>
<FileExplorer
name='localhost'
localRegistry={this._components.registry}
files={this._deps.fileProviders.localhost}
menuItems={[]}
plugin={this}
/>
</div>
</div>
</div>
</div>
</div>
, this.el)
}
}

@ -0,0 +1,56 @@
.remixui_container {
display : flex;
flex-direction : row;
width : 100%;
height : 100%;
box-sizing : border-box;
}
.remixui_fileexplorer {
display : flex;
flex-direction : column;
position : relative;
width : 100%;
padding-left : 6px;
padding-top : 6px;
}
.remixui_fileExplorerTree {
cursor : default;
}
.remixui_gist {
padding : 10px;
}
.remixui_gist i {
cursor : pointer;
}
.remixui_gist i:hover {
color : orange;
}
.remixui_connectToLocalhost {
padding : 10px;
}
.remixui_connectToLocalhost i {
cursor : pointer;
}
.remixui_connectToLocalhost i:hover {
color : var(--secondary)
}
.remixui_uploadFile {
padding : 10px;
}
.remixui_uploadFile label:hover {
color : var(--secondary)
}
.remixui_uploadFile label {
cursor : pointer;
}
.remixui_treeview {
overflow-y : auto;
}
.remixui_dialog {
display: flex;
flex-direction: column;
}
.remixui_dialogParagraph {
margin-bottom: 2em;
word-break: break-word;
}

@ -1,9 +1,9 @@
import React, { useReducer, useState } from 'react' // eslint-disable-line
import { TreeView, TreeViewItem } from '@remix-ui/tree-view'
import React, { useEffect, useState } from 'react' // eslint-disable-line
import { TreeView, TreeViewItem } from '@remix-ui/tree-view' // eslint-disable-line
import * as helper from '../../../../../apps/remix-ide/src/lib/helper'
import { FileExplorerProps } from './types'
import './file-explorer.css'
import './css/file-explorer.css'
function extractData (value, tree, key) {
const newValue = {}
@ -54,34 +54,100 @@ export const FileExplorer = (props: FileExplorerProps) => {
].filter(item => props.menuItems && props.menuItems.find((name) => { return name === item.action }))
})
useEffect(() => {
if (props.files) {
console.log('props.files.type: ', props.files.type)
props.files.event.register('fileAdded', fileAdded)
}
}, [props.files])
const formatSelf = (key, data, li) => {
const isRoot = data.path === state.files.type
const isFolder = !!data.children
return (
<div className='remixui_items'>
<span
title={data.path}
className={'remixui_label ' + !isRoot ? !isFolder ? 'remixui_leaf' : 'folder' : ''}
className={'remixui_label ' + (!isFolder ? 'remixui_leaf' : 'folder')}
data-path={data.path}
style={{ fontWeight: isRoot ? 'bold' : null }}
// onkeydown=${editModeOff}
// onblur=${editModeOff}
>
{key.split('/').pop()}
</span>
{isRoot ? renderMenuItems() : ''}
</div>
)
}
const remixdDialog = () => {
return <div>This file has been changed outside of Remix IDE.</div>
}
const fileRenamedError = (error) => {
console.log(error)
// modalDialogCustom.alert(error)
// self._components = {}
// self._components.registry = localRegistry || globalRegistry
// self._deps = {
// config: self._components.registry.get('config').api,
// editor: self._components.registry.get('editor').api,
// fileManager: self._components.registry.get('filemanager').api
// }
// self.events.register('focus', function (path) {
// self._deps.fileManager.open(path)
// })
// self._components.registry.put({ api: self, name: `fileexplorer/${self.files.type}` })
// warn if file changed outside of Remix
// function remixdDialog () {
// return yo`<div>This file has been changed outside of Remix IDE.</div>`
// }
// props.files.event.register('fileExternallyChanged', (path, file) => {
// if (self._deps.config.get('currentFile') === path && self._deps.editor.currentContent() && self._deps.editor.currentContent() !== file.content) {
// if (this.files.isReadOnly(path)) return self._deps.editor.setText(file.content)
// modalDialog(path + ' changed', remixdDialog(),
// {
// label: 'Replace by the new content',
// fn: () => {
// self._deps.editor.setText(file.content)
// }
// },
// {
// label: 'Keep the content displayed in Remix',
// fn: () => {}
// }
// )
// }
// })
// register to event of the file provider
// files.event.register('fileRemoved', fileRemoved)
// files.event.register('fileRenamed', fileRenamed)
// files.event.register('fileRenamedError', fileRenamedError)
// files.event.register('fileAdded', fileAdded)
// files.event.register('folderAdded', folderAdded)
// function fileRenamedError (error) {
// modalDialogCustom.alert(error)
// }
const fileAdded = (filepath) => {
const folderpath = filepath.split('/').slice(0, -1).join('/')
console.log('filePath: ', folderpath)
console.log('folderPath: ', folderpath)
// const currentTree = self.treeView.nodeAt(folderpath)
// if (!self.treeView.isExpanded(folderpath)) self.treeView.expand(folderpath)
// if (currentTree) {
// props.files.resolveDirectory(folderpath, (error, fileTree) => {
// if (error) console.error(error)
// if (!fileTree) return
// fileTree = normalize(folderpath, fileTree)
// self.treeView.updateNodeFromJSON(folderpath, fileTree, true)
// self.focusElement = self.treeView.labelAt(self.focusPath)
// // TODO: here we update the selected file (it applicable)
// // cause we are refreshing the interface of the whole directory when there's a new file.
// if (self.focusElement && !self.focusElement.classList.contains('bg-secondary')) {
// self.focusElement.classList.add('bg-secondary')
// }
// })
// }
}
const extractNameFromKey = (key) => {
@ -93,7 +159,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
const renderMenuItems = () => {
let items
if (state.menuItems) {
items = state.menuItems.map(({ action, title, icon }) => {
items = state.menuItems.map(({ action, title, icon }, index) => {
if (action === 'uploadFile') {
return (
<label
@ -101,6 +167,7 @@ export const FileExplorer = (props: FileExplorerProps) => {
data-id={'fileExplorerUploadFile' + action }
className={icon + ' mb-0 remixui_newFile'}
title={title}
key={index}
>
<input id="fileUpload" data-id="fileExplorerFileUpload" type="file" onChange={({ stopPropagation, target }) => {
stopPropagation()
@ -117,13 +184,19 @@ export const FileExplorer = (props: FileExplorerProps) => {
// onclick={({ stopPropagation }) => { stopPropagation(); this[action]() }}
className={'newFile ' + icon + ' remixui_newFile'}
title={title}
key={index}
>
</span>
)
}
})
}
return <span className="remixui_menu">{items}</span>
return (
<>
<span className='remixui_label' title={props.name} data-path={props.name} style={{ fontWeight: 'bold' }}>{ props.name }</span>
<span className="remixui_menu">{items}</span>
</>
)
}
const uploadFile = (target) => {
@ -168,7 +241,11 @@ export const FileExplorer = (props: FileExplorerProps) => {
return (
<div>
<TreeView id='treeView'>
<TreeViewItem id="treeViewItem" label={renderMenuItems()}>
</TreeViewItem>
</TreeView>
</div>
)
}

@ -1,5 +1,6 @@
/* eslint-disable-next-line */
export interface FileExplorerProps {
name: string,
localRegistry: any,
files: any,
menuItems?: string[],

Loading…
Cancel
Save