mirror of
https://github.com/woodchen-ink/clash-and-dashboard.git
synced 2025-07-18 14:01:56 +08:00
fix(container): remove sortlist
This commit is contained in:
parent
ca0e41e824
commit
f4653a40ec
@ -63,10 +63,10 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
externals: {
|
// externals: {
|
||||||
react: 'React',
|
// react: 'React',
|
||||||
'react-dom': 'ReactDOM',
|
// 'react-dom': 'ReactDOM',
|
||||||
},
|
// },
|
||||||
performance: {
|
performance: {
|
||||||
hints: false,
|
hints: false,
|
||||||
},
|
},
|
||||||
|
5048
package-lock.json
generated
5048
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -19,7 +19,8 @@ interface SelectProps extends BaseComponentProps {
|
|||||||
|
|
||||||
interface SelectState {
|
interface SelectState {
|
||||||
dropdownListStyles: React.CSSProperties
|
dropdownListStyles: React.CSSProperties
|
||||||
showDropDownList: boolean
|
showDropDownList: boolean,
|
||||||
|
hasCreateDropList: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Select extends React.Component<SelectProps, SelectState> {
|
export class Select extends React.Component<SelectProps, SelectState> {
|
||||||
@ -35,21 +36,25 @@ export class Select extends React.Component<SelectProps, SelectState> {
|
|||||||
|
|
||||||
state = {
|
state = {
|
||||||
dropdownListStyles: {},
|
dropdownListStyles: {},
|
||||||
showDropDownList: false
|
showDropDownList: false,
|
||||||
|
hasCreateDropList: false
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
console.log('update')
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount () {
|
||||||
// create container element
|
// create container element
|
||||||
const container = document.createElement('div')
|
const container = document.createElement('div')
|
||||||
document.body.appendChild(container)
|
document.body.appendChild(container)
|
||||||
this.$container = container
|
this.$container = container
|
||||||
|
|
||||||
document.addEventListener('click', this.handleGlobalClick, true)
|
document.addEventListener('click', this.handleGlobalClick, true)
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount () {
|
|
||||||
this.setState({ dropdownListStyles: this.calculateAttachmentPosition() })
|
this.setState({ dropdownListStyles: this.calculateAttachmentPosition() })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +62,23 @@ export class Select extends React.Component<SelectProps, SelectState> {
|
|||||||
document.body.removeChild(this.$container)
|
document.body.removeChild(this.$container)
|
||||||
document.removeEventListener('click', this.handleGlobalClick, true)
|
document.removeEventListener('click', this.handleGlobalClick, true)
|
||||||
}
|
}
|
||||||
|
shouldComponentUpdate(nextProps, nextState) {
|
||||||
|
if (nextProps.value === this.props.value && nextState.showDropDownList === this.state.showDropDownList) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
handleShowDropList = () => {
|
||||||
|
if (!this.state.hasCreateDropList) {
|
||||||
|
this.setState({
|
||||||
|
hasCreateDropList: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.setState({
|
||||||
|
showDropDownList: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
private handleGlobalClick = (e) => {
|
private handleGlobalClick = (e) => {
|
||||||
const el = this.$attachment.current
|
const el = this.$attachment.current
|
||||||
@ -118,7 +140,7 @@ export class Select extends React.Component<SelectProps, SelectState> {
|
|||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { value, onSelect, children, className: cn, style } = this.props
|
const { value, onSelect, children, className: cn, style } = this.props
|
||||||
const { dropdownListStyles, showDropDownList } = this.state
|
const { dropdownListStyles, showDropDownList, hasCreateDropList } = this.state
|
||||||
const matchChild = this.getSelectedOption(value, children)
|
const matchChild = this.getSelectedOption(value, children)
|
||||||
const dropDownList = (
|
const dropDownList = (
|
||||||
<div
|
<div
|
||||||
@ -137,12 +159,12 @@ export class Select extends React.Component<SelectProps, SelectState> {
|
|||||||
className={classnames('select', cn)}
|
className={classnames('select', cn)}
|
||||||
style={style}
|
style={style}
|
||||||
ref={this.$target}
|
ref={this.$target}
|
||||||
onClick={() => this.setState({ showDropDownList: !showDropDownList })}
|
onClick={this.handleShowDropList}
|
||||||
>
|
>
|
||||||
{matchChild.props.children}
|
{matchChild.props.children}
|
||||||
<Icon type="triangle-down" />
|
<Icon type="triangle-down" />
|
||||||
</div>
|
</div>
|
||||||
{createPortal(dropDownList, this.$container)}
|
{hasCreateDropList && createPortal(dropDownList, this.$container)}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.select-list {
|
.select-list {
|
||||||
position: fixed;
|
position: absolute;
|
||||||
max-width: 170px;
|
max-width: 170px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -33,7 +33,7 @@ export default class App extends React.Component<AppProps, {}> {
|
|||||||
<div className="page-container">
|
<div className="page-container">
|
||||||
{
|
{
|
||||||
routes.map(
|
routes.map(
|
||||||
route => <Route exact={!!route.exact} path={route.path} component={route.component}/>
|
route => <Route exact={!!route.exact} path={route.path} key={route.path} component={route.component}/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@ -25,7 +25,48 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'google.com.hk', proxy: 'HK' },
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'google.com.hk', proxy: 'HK' },
|
||||||
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
{ type: RuleType['FINAL'], payload: '', proxy: 'DIRECT' }
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
|
||||||
|
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
|
||||||
],
|
],
|
||||||
proxies: {
|
proxies: {
|
||||||
DIRECT: { type: 'Direct' },
|
DIRECT: { type: 'Direct' },
|
||||||
@ -115,7 +156,6 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
const { modifiedIndex, proxies } = this.state
|
const { modifiedIndex, proxies } = this.state
|
||||||
const isFinal = rule.type === 'FINAL'
|
const isFinal = rule.type === 'FINAL'
|
||||||
const DragHandle = SortableHandle(() => <Icon type="drag" size={16} />)
|
const DragHandle = SortableHandle(() => <Icon type="drag" size={16} />)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className="rule-item" key={index}>
|
<li className="rule-item" key={index}>
|
||||||
<Row className="rule-item-row" gutter={24} align="middle">
|
<Row className="rule-item-row" gutter={24} align="middle">
|
||||||
@ -127,7 +167,7 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
isFinal
|
isFinal
|
||||||
? rule.type
|
? rule.type
|
||||||
: (
|
: (
|
||||||
<Select value={rule.type} onSelect={type => this.handleModifyType(index, type)}>
|
<Select key={index} value={rule.type} onSelect={type => this.handleModifyType(index, type)}>
|
||||||
{
|
{
|
||||||
Object.keys(RuleType)
|
Object.keys(RuleType)
|
||||||
.filter(type => type !== 'FINAL')
|
.filter(type => type !== 'FINAL')
|
||||||
@ -162,7 +202,7 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
}
|
}
|
||||||
</Col>
|
</Col>
|
||||||
<Col className="rule-proxy" span={5}>
|
<Col className="rule-proxy" span={5}>
|
||||||
<Select className="rule-proxy-option" value={rule.proxy} onSelect={proxy => this.handleModifyProxy(index, proxy)}>
|
<Select className="rule-proxy-option" key={index} value={rule.proxy} onSelect={proxy => this.handleModifyProxy(index, proxy)}>
|
||||||
{
|
{
|
||||||
Object.keys(proxies).map(proxyName => {
|
Object.keys(proxies).map(proxyName => {
|
||||||
const proxy = proxies[proxyName]
|
const proxy = proxies[proxyName]
|
||||||
@ -188,7 +228,6 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
const { t } = this.props
|
const { t } = this.props
|
||||||
const { rules } = this.state
|
const { rules } = this.state
|
||||||
const SortableList = SortableContainer<{ rules: Rule[] }>(this.renderRules)
|
const SortableList = SortableContainer<{ rules: Rule[] }>(this.renderRules)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="page">
|
<div className="page">
|
||||||
<Header title={t('title')} >
|
<Header title={t('title')} >
|
||||||
@ -197,7 +236,10 @@ class Rules extends React.Component<I18nProps, RulesState> {
|
|||||||
|
|
||||||
<Card className="rules-card">
|
<Card className="rules-card">
|
||||||
<div className="rules">
|
<div className="rules">
|
||||||
<SortableList rules={rules} onSortEnd={this.onSortEnd} useDragHandle={true} />
|
{
|
||||||
|
rules.map((rule: Rule, index )=> this.renderRuleItem(rule, index))
|
||||||
|
}
|
||||||
|
{/* <SortableList rules={rules} onSortEnd={this.onSortEnd} useDragHandle={true} /> */}
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,7 +24,7 @@ class Sidebar extends React.Component<SidebarProps, {}> {
|
|||||||
{
|
{
|
||||||
routes.map(
|
routes.map(
|
||||||
({ path, name, exact }) => (
|
({ path, name, exact }) => (
|
||||||
<li className="item">
|
<li className="item" key={name}>
|
||||||
<NavLink to={path} activeClassName="active" exact={!!exact}>{ t(name) }</NavLink>
|
<NavLink to={path} activeClassName="active" exact={!!exact}>{ t(name) }</NavLink>
|
||||||
</li>
|
</li>
|
||||||
)
|
)
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
|
|
||||||
<!-- Dependencies -->
|
<!-- Dependencies -->
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js" integrity="sha256-2EQx5J1ux3sjgPLtDevlo449XNXfvEplcRYWIF6ui8w=" crossorigin="anonymous"></script>
|
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js" integrity="sha256-2EQx5J1ux3sjgPLtDevlo449XNXfvEplcRYWIF6ui8w=" crossorigin="anonymous"></script> -->
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.2/umd/react-dom.production.min.js" integrity="sha256-3NNU/yoE0R7VxxapKiw/hkgQzcSMztyclb5RpeVlV7Y=" crossorigin="anonymous"></script>
|
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.2/umd/react-dom.production.min.js" integrity="sha256-3NNU/yoE0R7VxxapKiw/hkgQzcSMztyclb5RpeVlV7Y=" crossorigin="anonymous"></script> -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user