parent
b625db3ef7
commit
c9dd9fb9ab
@ -0,0 +1,34 @@ |
|||||||
|
import { ViewPlugin } from '@remixproject/engine-web' |
||||||
|
import * as packageJson from '../../../../../package.json' |
||||||
|
import React from 'react' // eslint-disable-line
|
||||||
|
import { PluginViewWrapper } from '@remix-ui/helper' |
||||||
|
import { SearchTab } from '@remix-ui/search' |
||||||
|
const profile = { |
||||||
|
name: 'search', |
||||||
|
displayName: 'Search', |
||||||
|
methods: [''], |
||||||
|
events: [], |
||||||
|
icon: 'assets/img/Search_Icon.svg', |
||||||
|
description: '', |
||||||
|
kind: '', |
||||||
|
location: 'sidePanel', |
||||||
|
documentation: '', |
||||||
|
version: packageJson.version |
||||||
|
} |
||||||
|
|
||||||
|
export class SearchPlugin extends ViewPlugin { |
||||||
|
dispatch: React.Dispatch<any> = () => {} |
||||||
|
constructor () { |
||||||
|
super(profile) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return ( |
||||||
|
<div id='searchTab'> |
||||||
|
<SearchTab plugin={this}></SearchTab> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
} |
After Width: | Height: | Size: 2.6 KiB |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
"presets": ["@nrwl/react/babel"], |
||||||
|
"plugins": [] |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"env": { |
||||||
|
"browser": true, |
||||||
|
"es6": true |
||||||
|
}, |
||||||
|
"ignorePatterns": ["!**/*"], |
||||||
|
"extends": "../../../.eslintrc.json", |
||||||
|
"globals": { |
||||||
|
"Atomics": "readonly", |
||||||
|
"SharedArrayBuffer": "readonly" |
||||||
|
}, |
||||||
|
"parserOptions": { |
||||||
|
"ecmaVersion": 11, |
||||||
|
"sourceType": "module" |
||||||
|
}, |
||||||
|
"rules": { |
||||||
|
"standard/no-callback-literal": "off" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
{ |
||||||
|
"tabWidth": 2, |
||||||
|
"singleQuote": true, |
||||||
|
"semi": false |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
# remix-ui-vertical-icons-panel |
||||||
|
|
||||||
|
React library for RemixIde vertical icons Panel |
||||||
|
|
||||||
|
## Running unit tests |
||||||
|
|
||||||
|
Run `nx test remix-ui-vertical-icons-panel` to execute the unit tests via [Jest](https://jestjs.io). |
@ -0,0 +1 @@ |
|||||||
|
export { SearchTab } from './lib/components/Search'; |
@ -0,0 +1,17 @@ |
|||||||
|
import React, { useContext, useReducer } from "react" |
||||||
|
import { SearchContext } from "../context/context" |
||||||
|
import { SearchingInitialState, SearchReducer } from "../reducers/Reducer" |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const Find = props => { |
||||||
|
|
||||||
|
const { setFind } = useContext(SearchContext) |
||||||
|
const change = (e) => { |
||||||
|
setFind(e.target.value) |
||||||
|
} |
||||||
|
|
||||||
|
return(<> |
||||||
|
<input placeholder="Search" className="form-control" onChange={change}></input> |
||||||
|
</>) |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
import React, { useContext, useEffect } from 'react' |
||||||
|
import { SearchContext } from '../context/context' |
||||||
|
|
||||||
|
export const Replace = props => { |
||||||
|
const { state, setReplace } = useContext(SearchContext) |
||||||
|
|
||||||
|
const change = e => { |
||||||
|
setReplace(e.target.value) |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<input placeholder='Replace' className="form-control" onChange={change}></input> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
import React, { useContext, useEffect, useReducer } from 'react' |
||||||
|
import { SearchContext, SearchProvider } from '../context/context' |
||||||
|
import { SearchingInitialState, SearchReducer } from '../reducers/Reducer' |
||||||
|
import { Find } from './Find' |
||||||
|
import { Replace } from './Replace' |
||||||
|
import { Results } from './results/Results' |
||||||
|
|
||||||
|
export const SearchTab = props => { |
||||||
|
|
||||||
|
const plugin = props.plugin |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
console.log (plugin) |
||||||
|
},[]) |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<SearchProvider> |
||||||
|
<Find></Find> |
||||||
|
<Replace></Replace> |
||||||
|
<Results plugin={plugin}></Results> |
||||||
|
</SearchProvider> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
import { ViewPlugin } from "@remixproject/engine-web" |
||||||
|
import React, { useContext, useEffect } from "react" |
||||||
|
import { SearchContext } from "../../context/context" |
||||||
|
import { SearchResult } from "../../reducers/Reducer" |
||||||
|
|
||||||
|
interface ResultsProps { |
||||||
|
plugin: ViewPlugin |
||||||
|
} |
||||||
|
|
||||||
|
export const Results = (props: ResultsProps) => { |
||||||
|
|
||||||
|
const { state, setSearchResults } = useContext(SearchContext) |
||||||
|
|
||||||
|
const { plugin } = props |
||||||
|
|
||||||
|
const getDirectory = async (dir) => { |
||||||
|
let result = [] |
||||||
|
const files = await plugin.call('fileManager', 'readdir', dir) |
||||||
|
const fileArray = normalize(files) |
||||||
|
for (const fi of fileArray) { |
||||||
|
if (fi) { |
||||||
|
const type = fi.data.isDirectory |
||||||
|
if (type === true) { |
||||||
|
result = [ |
||||||
|
...result, |
||||||
|
...(await getDirectory( |
||||||
|
`${fi.filename}` |
||||||
|
)) |
||||||
|
] |
||||||
|
} else { |
||||||
|
result = [...result, fi.filename] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return result |
||||||
|
} |
||||||
|
|
||||||
|
const normalize = (filesList) => { |
||||||
|
const folders = [] |
||||||
|
const files = [] |
||||||
|
Object.keys(filesList || {}).forEach(key => { |
||||||
|
if (filesList[key].isDirectory) { |
||||||
|
folders.push({ |
||||||
|
filename: key, |
||||||
|
data: filesList[key] |
||||||
|
}) |
||||||
|
} else { |
||||||
|
files.push({ |
||||||
|
filename: key, |
||||||
|
data: filesList[key] |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
return [...folders, ...files] |
||||||
|
} |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
if (state.find) { |
||||||
|
getDirectory('/').then(res => { |
||||||
|
const ob = res.map(file => {
|
||||||
|
const r:SearchResult = { |
||||||
|
filename: file, |
||||||
|
lines: [], |
||||||
|
path: file, |
||||||
|
searchComplete: false |
||||||
|
} |
||||||
|
return r |
||||||
|
}) |
||||||
|
console.log(ob) |
||||||
|
setSearchResults(ob) |
||||||
|
}) |
||||||
|
} |
||||||
|
},[state.find]) |
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
console.log(state.searchResults) |
||||||
|
},[state.searchResults]) |
||||||
|
|
||||||
|
return(<></>) |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
import React from 'react' |
||||||
|
import { createContext, useReducer } from 'react' |
||||||
|
import { |
||||||
|
SearchingInitialState, |
||||||
|
SearchReducer, |
||||||
|
SearchResult, |
||||||
|
SearchState |
||||||
|
} from '../reducers/Reducer' |
||||||
|
|
||||||
|
export interface SearchingStateInterface { |
||||||
|
state: SearchState |
||||||
|
setFind: (value: string) => void |
||||||
|
setReplace: (value: string) => void |
||||||
|
setInclude: (value: string) => void, |
||||||
|
setExclude: (value: string) => void, |
||||||
|
setCaseSensitive: (value: boolean) => void, |
||||||
|
setRegex: (value: boolean) => void, |
||||||
|
setWholeWord: (value: boolean) => void, |
||||||
|
setSearchResults: (value: SearchResult[]) => void, |
||||||
|
} |
||||||
|
|
||||||
|
export const SearchContext = createContext<SearchingStateInterface>(null) |
||||||
|
|
||||||
|
export const SearchProvider = ({ |
||||||
|
children = [], |
||||||
|
reducer = SearchReducer, |
||||||
|
initialState = SearchingInitialState |
||||||
|
} = {}) => { |
||||||
|
const [state, dispatch] = useReducer(reducer, initialState) |
||||||
|
|
||||||
|
const value = { |
||||||
|
state, |
||||||
|
setFind: (value: string) => { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_FIND', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setReplace: (value: string) => { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_REPLACE', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setInclude: (value: string) => { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_INCLUDE', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setExclude(value: string) { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_EXCLUDE', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setCaseSensitive(value: boolean) { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_CASE_SENSITIVE', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setWholeWord(value: boolean) { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_WHOLE_WORD', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setRegex(value: boolean) { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_REGEX', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}, |
||||||
|
setSearchResults(value: SearchResult[]) { |
||||||
|
dispatch({ |
||||||
|
type: 'SET_SEARCH_RESULTS', |
||||||
|
payload: value |
||||||
|
}) |
||||||
|
}
|
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<SearchContext.Provider value={value}>{children}</SearchContext.Provider> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
|
||||||
|
interface Action { |
||||||
|
type: string |
||||||
|
payload: any |
||||||
|
} |
||||||
|
|
||||||
|
export interface SearchResultLine { |
||||||
|
lineNumber: number |
||||||
|
text: string |
||||||
|
} |
||||||
|
|
||||||
|
export interface SearchResult { |
||||||
|
filename: string, |
||||||
|
path: string, |
||||||
|
lines: SearchResultLine[], |
||||||
|
searchComplete: boolean |
||||||
|
}
|
||||||
|
|
||||||
|
export interface SearchState { |
||||||
|
find: string, |
||||||
|
searchResults: SearchResult[], |
||||||
|
replace: string, |
||||||
|
include: string, |
||||||
|
exclude: string, |
||||||
|
} |
||||||
|
|
||||||
|
export const SearchingInitialState: SearchState = { |
||||||
|
find: '', |
||||||
|
replace: '', |
||||||
|
include: '', |
||||||
|
exclude: '', |
||||||
|
searchResults: [] |
||||||
|
} |
||||||
|
|
||||||
|
export const SearchReducer = (state: SearchState = SearchingInitialState, action: Action) => { |
||||||
|
console.log(state) |
||||||
|
switch (action.type) { |
||||||
|
case 'SET_FIND': |
||||||
|
return { |
||||||
|
...state, |
||||||
|
find: action.payload, |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'SET_REPLACE': |
||||||
|
return { |
||||||
|
...state, |
||||||
|
replace: action.payload, |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'SET_INCLUDE': |
||||||
|
return { |
||||||
|
...state, |
||||||
|
include: action.payload, |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'SET_EXCLUDE': |
||||||
|
return { |
||||||
|
...state, |
||||||
|
exclude: action.payload, |
||||||
|
} |
||||||
|
break; |
||||||
|
case 'SET_SEARCH_RESULTS': |
||||||
|
return { |
||||||
|
...state, |
||||||
|
searchResults: action.payload, |
||||||
|
} |
||||||
|
break; |
||||||
|
default: |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"extends": "../../../tsconfig.base.json", |
||||||
|
"compilerOptions": { |
||||||
|
"jsx": "react", |
||||||
|
"allowJs": true, |
||||||
|
"esModuleInterop": true, |
||||||
|
"allowSyntheticDefaultImports": true |
||||||
|
}, |
||||||
|
"files": [], |
||||||
|
"include": [], |
||||||
|
"references": [ |
||||||
|
{ |
||||||
|
"path": "./tsconfig.lib.json" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"path": "./tsconfig.spec.json" |
||||||
|
} |
||||||
|
] |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
{ |
||||||
|
"extends": "./tsconfig.json", |
||||||
|
"compilerOptions": { |
||||||
|
"outDir": "../../../dist/out-tsc", |
||||||
|
"types": ["node"] |
||||||
|
}, |
||||||
|
"files": [ |
||||||
|
"../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", |
||||||
|
"../../../node_modules/@nrwl/react/typings/image.d.ts" |
||||||
|
], |
||||||
|
"exclude": ["**/*.spec.ts", "**/*.spec.tsx"], |
||||||
|
"include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] |
||||||
|
} |
Loading…
Reference in new issue