@electerm/electerm-react 2.3.126 → 2.3.151

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/client/common/constants.js +2 -1
  2. package/client/common/db.js +2 -1
  3. package/client/common/download.jsx +15 -0
  4. package/client/common/init-setting-item.js +5 -0
  5. package/client/components/ai/ai-cache.jsx +1 -1
  6. package/client/components/batch-op/batch-op.jsx +4 -9
  7. package/client/components/bookmark-form/common/bookmark-group-tree-format.js +4 -3
  8. package/client/components/bookmark-form/common/color-picker.jsx +16 -5
  9. package/client/components/bookmark-form/common/color-picker.styl +1 -2
  10. package/client/components/bookmark-form/common/connection-hopping.jsx +1 -0
  11. package/client/components/bookmark-form/common/ssh-host-selector.jsx +1 -1
  12. package/client/components/bookmark-form/common/ssh-tunnels.jsx +1 -0
  13. package/client/components/bookmark-form/config/common-fields.js +1 -0
  14. package/client/components/bookmark-form/tree-delete.jsx +18 -15
  15. package/client/components/common/drawer.jsx +62 -0
  16. package/client/components/common/drawer.styl +34 -0
  17. package/client/components/common/input-auto-focus.jsx +16 -3
  18. package/client/components/common/logo-elem.jsx +1 -1
  19. package/client/components/common/password.jsx +1 -1
  20. package/client/components/footer/footer.styl +1 -0
  21. package/client/components/main/main.jsx +4 -1
  22. package/client/components/profile/profile-form.jsx +1 -1
  23. package/client/components/quick-commands/qm.styl +21 -1
  24. package/client/components/quick-commands/quick-commands-box.jsx +28 -36
  25. package/client/components/quick-commands/quick-commands-form.jsx +1 -1
  26. package/client/components/quick-commands/quick-commands-list-form.jsx +1 -0
  27. package/client/components/quick-commands/quick-commands-select.jsx +1 -1
  28. package/client/components/session/session.jsx +1 -1
  29. package/client/components/setting-panel/deep-link-control.jsx +1 -0
  30. package/client/components/setting-panel/list.jsx +1 -1
  31. package/client/components/setting-panel/list.styl +1 -1
  32. package/client/components/setting-panel/setting-common.jsx +2 -1
  33. package/client/components/setting-panel/setting-modal.jsx +13 -0
  34. package/client/components/setting-panel/setting-terminal.jsx +1 -1
  35. package/client/components/setting-panel/setting-wrap.jsx +5 -11
  36. package/client/components/setting-panel/setting-wrap.styl +8 -6
  37. package/client/components/setting-panel/start-session-select.jsx +3 -3
  38. package/client/components/setting-panel/tab-widgets.jsx +35 -0
  39. package/client/components/sftp/address-bookmark-item.jsx +1 -1
  40. package/client/components/sftp/paged-list.jsx +2 -1
  41. package/client/components/sftp/permission-render.jsx +1 -1
  42. package/client/components/sftp/sftp-entry.jsx +1 -1
  43. package/client/components/sftp/sftp.styl +13 -0
  44. package/client/components/sidebar/index.jsx +12 -2
  45. package/client/components/sidebar/transfer-history-modal.jsx +1 -1
  46. package/client/components/theme/theme-list-item.jsx +4 -3
  47. package/client/components/tree-list/move-item-modal.jsx +171 -36
  48. package/client/components/tree-list/tree-list.jsx +3 -15
  49. package/client/components/tree-list/tree-list.styl +6 -1
  50. package/client/components/vnc/vnc-session.jsx +1 -1
  51. package/client/components/widgets/widget-control.jsx +64 -0
  52. package/client/components/widgets/widget-form.jsx +115 -0
  53. package/client/components/widgets/widget-instance.jsx +46 -0
  54. package/client/components/widgets/widget-instances.jsx +10 -0
  55. package/client/components/widgets/widgets-list.jsx +155 -0
  56. package/client/store/init-state.js +9 -1
  57. package/client/store/setting.js +1 -3
  58. package/client/store/store.js +2 -0
  59. package/client/store/widgets.js +59 -0
  60. package/package.json +1 -1
@@ -101,7 +101,8 @@ export const settingMap = buildConst([
101
101
  'bookmarkGroups',
102
102
  'quickCommands',
103
103
  'addressBookmarks',
104
- 'profiles'
104
+ 'profiles',
105
+ 'widgets'
105
106
  ])
106
107
 
107
108
  export const staticNewItemTabs = new Set([
@@ -25,7 +25,8 @@ const dbAction = (...args) => {
25
25
  */
26
26
  export const dbNames = without(
27
27
  Object.keys(settingMap),
28
- settingMap.setting
28
+ settingMap.setting,
29
+ settingMap.widgets
29
30
  )
30
31
 
31
32
  export const dbNamesForWatch = without(
@@ -5,7 +5,22 @@ import { notification } from 'antd'
5
5
  import ShowItem from '../components/common/show-item'
6
6
  import { chooseSaveDirectory } from './choose-save-folder'
7
7
 
8
+ function downloadForBrowser (filename, text) {
9
+ const blob = new Blob([text], { type: 'text/plain;charset=utf-8' })
10
+ const url = URL.createObjectURL(blob)
11
+ const a = document.createElement('a')
12
+ a.href = url
13
+ a.download = filename
14
+ document.body.appendChild(a)
15
+ a.click()
16
+ document.body.removeChild(a)
17
+ URL.revokeObjectURL(url)
18
+ }
19
+
8
20
  export default async function download (filename, text) {
21
+ if (window.et.isWebApp) {
22
+ return downloadForBrowser(filename, text)
23
+ }
9
24
  const savePath = await chooseSaveDirectory()
10
25
  if (!savePath) {
11
26
  return
@@ -31,5 +31,10 @@ export default (arr, tab) => {
31
31
  id: '',
32
32
  name: e(settingMap.profiles)
33
33
  }
34
+ } else if (tab === settingMap.widgets) {
35
+ return {
36
+ id: '',
37
+ name: e(settingMap.widgets)
38
+ }
34
39
  }
35
40
  }
@@ -31,6 +31,6 @@ export default function AiCache () {
31
31
  </>
32
32
  )
33
33
  return (
34
- <Alert message={msg} type='info' className='mg2y' />
34
+ <Alert title={msg} type='info' className='mg2y' />
35
35
  )
36
36
  }
@@ -11,9 +11,9 @@ import {
11
11
  Input,
12
12
  Button,
13
13
  Table,
14
- Drawer,
15
14
  Tabs
16
15
  } from 'antd'
16
+ import Drawer from '../common/drawer'
17
17
  import {
18
18
  sidebarWidth,
19
19
  statusMap,
@@ -672,15 +672,10 @@ export default class BatchOp extends PureComponent {
672
672
  const pops = {
673
673
  open: showBatchOp,
674
674
  onClose: this.handleCancel,
675
- className: 'setting-wrap',
676
- width: innerWidth - sidebarWidth,
675
+ className: 'setting-wrap batch-op-wrap',
676
+ size: innerWidth - sidebarWidth,
677
677
  zIndex: 888,
678
- placement: 'left',
679
- styles: {
680
- header: {
681
- display: 'none'
682
- }
683
- }
678
+ placement: 'left'
684
679
  }
685
680
  return (
686
681
  <Drawer
@@ -2,7 +2,7 @@
2
2
  * create bookmark group tree data
3
3
  */
4
4
 
5
- export default (bookmarkGroups = [], disabledId = '', returnMap = false) => {
5
+ export default (bookmarkGroups = [], disabledId = '', returnMap = false, currentParentId = '') => {
6
6
  const btree = new Map(bookmarkGroups.map(d => [d.id, d]))
7
7
  function buildSubCats (id) {
8
8
  const x = btree.get(id)
@@ -12,7 +12,8 @@ export default (bookmarkGroups = [], disabledId = '', returnMap = false) => {
12
12
  const y = {
13
13
  key: x.id,
14
14
  value: x.id,
15
- title: x.title
15
+ title: x.title,
16
+ disabled: x.id === disabledId || x.id === currentParentId
16
17
  }
17
18
  y.children = (x.bookmarkGroupIds || []).map(buildSubCats).filter(d => d)
18
19
  if (!y.children.length) {
@@ -26,7 +27,7 @@ export default (bookmarkGroups = [], disabledId = '', returnMap = false) => {
26
27
  title: d.title,
27
28
  value: d.id,
28
29
  key: d.id,
29
- disabled: d.id === disabledId,
30
+ disabled: d.id === disabledId || d.id === currentParentId,
30
31
  children: (d.bookmarkGroupIds || []).map(buildSubCats).filter(d => d)
31
32
  }
32
33
  return r
@@ -1,6 +1,5 @@
1
1
  import React, { useState } from 'react'
2
- import { Popover } from 'antd'
3
- import { HexColorPicker, RgbaColorPicker } from 'react-colorful'
2
+ import { Popover, ColorPicker as AntColorPicker } from 'antd'
4
3
  import { defaultColors, getRandomHexColor } from '../../../common/rand-hex-color.js'
5
4
  import { HexInput } from './hex-input.jsx'
6
5
  import './color-picker.styl'
@@ -18,8 +17,11 @@ export const ColorPicker = React.forwardRef((props, ref) => {
18
17
  setVisible(vis)
19
18
  }
20
19
 
20
+ function onColorChange (color) {
21
+ handleChange(props.isRgba ? color.toRgbString() : color.toHexString())
22
+ }
23
+
21
24
  function renderContent () {
22
- const Picker = props.isRgba ? RgbaColorPicker : HexColorPicker
23
25
  return (
24
26
  <div className='color-picker-box'>
25
27
  <div className='fix'>
@@ -40,7 +42,10 @@ export const ColorPicker = React.forwardRef((props, ref) => {
40
42
  }
41
43
  </div>
42
44
  <div className='fright'>
43
- <Picker color={value} onChange={handleChange} />
45
+ <AntColorPicker
46
+ value={value}
47
+ onChange={onColorChange}
48
+ />
44
49
  </div>
45
50
  </div>
46
51
  <div className='pd1y'>
@@ -57,7 +62,13 @@ export const ColorPicker = React.forwardRef((props, ref) => {
57
62
  if (props.disabled) return inner
58
63
 
59
64
  return (
60
- <Popover content={renderContent()} trigger='click' open={visible} placement='bottomLeft' onOpenChange={handleVisibleChange}>
65
+ <Popover
66
+ content={renderContent()}
67
+ trigger='click'
68
+ open={visible}
69
+ placement='bottomLeft'
70
+ onOpenChange={handleVisibleChange}
71
+ >
61
72
  {inner}
62
73
  </Popover>
63
74
  )
@@ -10,8 +10,7 @@
10
10
  width 92px
11
11
  .color-picker-box
12
12
  width 420px
13
- .react-colorful
14
- height 200px
13
+
15
14
  .color-picker-defaults
16
15
  width 200px
17
16
  .color-picker-choose
@@ -180,6 +180,7 @@ export default function renderConnectionHopping (props) {
180
180
  form={formChild}
181
181
  onFinish={handleFinish}
182
182
  initialValues={initialValues}
183
+ component='div'
183
184
  >
184
185
  {renderList()}
185
186
  {renderWarn()}
@@ -52,7 +52,7 @@ export default function SshHostSelector ({ ips = [], useIp, form, onBlur, onPast
52
52
  <InputAutoFocus
53
53
  name='host'
54
54
  onBlur={props.onBlur}
55
- onPaste={e => props.onPaste(e, form)}
55
+ onPaste={e => onPaste(e, form)}
56
56
  addonBefore={<ColorPickerItem />}
57
57
  />
58
58
  </FormItem>
@@ -209,6 +209,7 @@ export default function renderSshTunnels (props) {
209
209
  form={formChild}
210
210
  onFinish={handleFinish}
211
211
  initialValues={initialValues}
212
+ component='div'
212
213
  >
213
214
  {renderList()}
214
215
  <FormItem
@@ -219,6 +219,7 @@ export const commonFields = {
219
219
  export const terminalSettings = [
220
220
  commonFields.envLang,
221
221
  commonFields.terminalType,
222
+ commonFields.proxy,
222
223
  commonFields.displayRaw,
223
224
  commonFields.fontFamily,
224
225
  commonFields.fontSize,
@@ -1,7 +1,8 @@
1
1
  import StartSessionSelect from '../setting-panel/start-session-select'
2
2
  import {
3
3
  Tree,
4
- Button
4
+ Button,
5
+ Space
5
6
  } from 'antd'
6
7
  import { defaultBookmarkGroupId, settingMap } from '../../common/constants'
7
8
  import deepCopy from 'json-deep-copy'
@@ -48,21 +49,23 @@ export default class BookmarkTreeDelete extends StartSessionSelect {
48
49
  const len = checkedKeys.length
49
50
  return (
50
51
  <div>
51
- <div className='pd1'>
52
- <Button
53
- type='primary'
54
- disabled={!len}
55
- onClick={this.handleDel}
56
- >
57
- {e('delSelected')} ({len})
58
- </Button>
59
- <Button
60
- onClick={this.handleCancel}
61
- >
62
- {e('cancel')}
63
- </Button>
52
+ <div className='pd2'>
53
+ <Space.Compact>
54
+ <Button
55
+ type='primary'
56
+ disabled={!len}
57
+ onClick={this.handleDel}
58
+ >
59
+ {e('delSelected')} ({len})
60
+ </Button>
61
+ <Button
62
+ onClick={this.handleCancel}
63
+ >
64
+ {e('cancel')}
65
+ </Button>
66
+ </Space.Compact>
67
+ <Tree {...rProps} />
64
68
  </div>
65
- <Tree {...rProps} />
66
69
  </div>
67
70
  )
68
71
  }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Simple drawer component without animation
3
+ * Replaces antd Drawer for better performance
4
+ */
5
+
6
+ import classnames from 'classnames'
7
+ import './drawer.styl'
8
+
9
+ export default function Drawer (props) {
10
+ const {
11
+ open,
12
+ placement = 'left',
13
+ size,
14
+ zIndex = 1000,
15
+ className,
16
+ children,
17
+ styles = {},
18
+ onClose
19
+ } = props
20
+
21
+ function handleMaskClick (e) {
22
+ if (e.target === e.currentTarget && onClose) {
23
+ onClose()
24
+ }
25
+ }
26
+
27
+ if (!open) {
28
+ return null
29
+ }
30
+
31
+ const drawerStyle = {
32
+ zIndex
33
+ }
34
+
35
+ const contentStyle = {
36
+ width: typeof size === 'number' ? `${size}px` : size,
37
+ ...styles.content
38
+ }
39
+
40
+ const cls = classnames(
41
+ 'custom-drawer',
42
+ `custom-drawer-${placement}`,
43
+ className
44
+ )
45
+
46
+ return (
47
+ <div className={cls} style={drawerStyle}>
48
+ <div
49
+ className='custom-drawer-mask'
50
+ onClick={handleMaskClick}
51
+ />
52
+ <div
53
+ className='custom-drawer-content-wrapper'
54
+ style={contentStyle}
55
+ >
56
+ <div className='custom-drawer-content'>
57
+ {children}
58
+ </div>
59
+ </div>
60
+ </div>
61
+ )
62
+ }
@@ -0,0 +1,34 @@
1
+ .custom-drawer
2
+ position fixed
3
+ top 0
4
+ left 43px
5
+ right 0
6
+ bottom 0
7
+
8
+ .custom-drawer-mask
9
+ position absolute
10
+ top 0
11
+ left 0
12
+ right 0
13
+ bottom 0
14
+ background rgba(0, 0, 0, 0.45)
15
+
16
+ .custom-drawer-content-wrapper
17
+ position absolute
18
+ top 0
19
+ bottom 0
20
+ background var(--main)
21
+ box-shadow 2px 0 8px rgba(0, 0, 0, 0.15)
22
+ overflow auto
23
+ color var(--text)
24
+
25
+ .custom-drawer-left .custom-drawer-content-wrapper
26
+ left 0
27
+
28
+ .custom-drawer-right .custom-drawer-content-wrapper
29
+ right 0
30
+
31
+ .custom-drawer-content
32
+ position relative
33
+ height 100%
34
+ width 100%
@@ -5,7 +5,7 @@ import {
5
5
  import Password from './password'
6
6
 
7
7
  export default function InputAutoFocus (props) {
8
- const { type, selectall = false, ...rest } = props
8
+ const { type, selectall = false, ref, ...rest } = props
9
9
  const inputRef = useRef(null)
10
10
  const isFirstRender = useRef(true)
11
11
 
@@ -14,7 +14,11 @@ export default function InputAutoFocus (props) {
14
14
  const { value } = props
15
15
  if (value && selectall && isFirstRender.current) {
16
16
  inputRef.current.focus()
17
- inputRef.current.setSelectionRange(0, value.length)
17
+ if (inputRef.current.setSelectionRange) {
18
+ inputRef.current.setSelectionRange(0, value.length)
19
+ } else if (inputRef.current.select) {
20
+ inputRef.current.select()
21
+ }
18
22
  isFirstRender.current = false
19
23
  } else {
20
24
  inputRef.current.focus()
@@ -31,9 +35,18 @@ export default function InputAutoFocus (props) {
31
35
  InputComponent = Input
32
36
  }
33
37
 
38
+ const handleRef = (node) => {
39
+ inputRef.current = node
40
+ if (typeof ref === 'function') {
41
+ ref(node)
42
+ } else if (ref) {
43
+ ref.current = node
44
+ }
45
+ }
46
+
34
47
  return (
35
48
  <InputComponent
36
- ref={inputRef}
49
+ ref={handleRef}
37
50
  {...rest}
38
51
  />
39
52
  )
@@ -17,7 +17,7 @@ export default function LogoElem () {
17
17
  <sup>
18
18
  <img src={logoPath1} className='iblock mwm-100 mg1r logo-img-small' />
19
19
  </sup>
20
- <Tag color='#08c'>{packInfo.version}</Tag>
20
+ <Tag color='#08c' variant='solid'>{packInfo.version}</Tag>
21
21
  </h1>
22
22
  )
23
23
  }
@@ -56,7 +56,7 @@ export default forwardRef(function Password (props, ref) {
56
56
  let capsPrefix = null
57
57
  if (isCapsLockOn) {
58
58
  capsPrefix = (
59
- <Tag color='orange' style={{ marginRight: 4 }}>CAPS</Tag>
59
+ <Tag color='orange' className='mg1r' variant='solid'>CAPS</Tag>
60
60
  )
61
61
  }
62
62
 
@@ -35,6 +35,7 @@
35
35
  .bi-full
36
36
  display none
37
37
  &.bi-show
38
+ line-height 20px
38
39
  .bi-full
39
40
  display inline
40
41
  .bi-compact
@@ -29,6 +29,7 @@ import SshConfigLoadNotify from '../ssh-config/ssh-config-load-notify'
29
29
  import LoadSshConfigs from '../ssh-config/load-ssh-configs'
30
30
  import AIChat from '../ai/ai-chat'
31
31
  import Opacity from '../common/opacity'
32
+ import MoveItemModal from '../tree-list/move-item-modal'
32
33
  import InputContextMenu from '../common/input-context-menu'
33
34
  import { pick } from 'lodash-es'
34
35
  import deepCopy from 'json-deep-copy'
@@ -169,7 +170,8 @@ export default auto(function Index (props) {
169
170
  'isSyncingSetting',
170
171
  'leftSidebarWidth',
171
172
  'transferTab',
172
- 'sidebarPanelTab'
173
+ 'sidebarPanelTab',
174
+ 'openWidgetsModal'
173
175
  ]),
174
176
  fileTransfers: copiedTransfer,
175
177
  transferHistory: copiedHistory,
@@ -273,6 +275,7 @@ export default auto(function Index (props) {
273
275
  <FileInfoModal />
274
276
  <SettingModal store={store} />
275
277
  <BatchOp {...batchOpProps} />
278
+ <MoveItemModal store={store} />
276
279
  <div
277
280
  id='outside-context'
278
281
  >
@@ -12,7 +12,7 @@ export default class ProfleFormIndex extends PureComponent {
12
12
  this.setState({
13
13
  ready: true
14
14
  })
15
- }, 200)
15
+ }, 0)
16
16
  }
17
17
 
18
18
  componentWillUnmount () {
@@ -1,6 +1,7 @@
1
1
  .qm-list-wrap
2
2
  max-height calc(100vh - 100px)
3
3
  overflow-y scroll
4
+ padding 20px 0 10px 0
4
5
  .qm-wrap-tooltip
5
6
  background var(--main)
6
7
  position absolute
@@ -19,14 +20,33 @@
19
20
  .fil-keyword
20
21
  .fil-label
21
22
  .qm-item
22
- color var(--text-light)
23
+ color var(--text-disabled)
23
24
  .qm-item
24
25
  &.name-match
25
26
  &.label-match
26
27
  font-weight bold
28
+ color var(--text)
29
+
30
+ .qm-search-input
31
+ max-width 200px
27
32
  @media (max-width: 500px)
28
33
  .qm-search-input
29
34
  width 100px
30
35
 
31
36
  .item-list-unit.dragover
32
37
  border: 1px dashed var(--primary)
38
+ .qm-label-select
39
+ min-width 120px
40
+
41
+ .qm-flex
42
+ gap 8px
43
+
44
+ @media (max-width: 768px)
45
+ .qm-flex
46
+ flex-direction column
47
+ align-items flex-start
48
+ .qm-search-input
49
+ max-width none
50
+ width 100%
51
+ .qm-label-select
52
+ width 100%
@@ -5,7 +5,7 @@
5
5
  import { useState, useRef } from 'react'
6
6
  import { quickCommandLabelsLsKey } from '../../common/constants'
7
7
  import { sortBy } from 'lodash-es'
8
- import { Button, Input, Select, Space } from 'antd'
8
+ import { Button, Input, Select, Space, Flex } from 'antd'
9
9
  import * as ls from '../../common/safe-local-storage'
10
10
  import CmdItem from './quick-command-item'
11
11
  import {
@@ -169,14 +169,11 @@ export default function QuickCommandsFooterBox (props) {
169
169
  mode: 'multiple',
170
170
  onChange: handleChangeLabels,
171
171
  placeholder: e('labels'),
172
- className: 'iblock',
173
- style: {
174
- minWidth: '100px'
175
- }
172
+ className: 'qm-label-select'
176
173
  }
177
174
  const tp = pinnedQuickCommandBar
178
175
  ? 'primary'
179
- : 'ghost'
176
+ : 'text'
180
177
  const cls = classNames(
181
178
  'qm-list-wrap',
182
179
  { 'fil-label': !!labels.length },
@@ -197,16 +194,14 @@ export default function QuickCommandsFooterBox (props) {
197
194
  {...qmProps}
198
195
  >
199
196
  <div className='pd2'>
200
- <div className='pd2b fix'>
201
- <span className='fleft'>
202
- <Input.Search
203
- value={keyword}
204
- onChange={handleChange}
205
- placeholder=''
206
- className='iblock qm-search-input'
207
- />
208
- </span>
209
- <span className='fleft mg1l'>
197
+ <Flex justify='space-between' className='qm-flex'>
198
+ <Input.Search
199
+ value={keyword}
200
+ onChange={handleChange}
201
+ placeholder=''
202
+ className='qm-search-input'
203
+ />
204
+ <Flex gap='small'>
210
205
  <Select
211
206
  {...sprops}
212
207
  >
@@ -215,31 +210,28 @@ export default function QuickCommandsFooterBox (props) {
215
210
  )}
216
211
  </Select>
217
212
  <Button
218
- className='mg1l iblock'
219
213
  type={type}
220
214
  onClick={window.store.handleSortByFrequency}
221
215
  >
222
216
  {e('sortByFrequency')}
223
217
  </Button>
224
- </span>
225
- <span className='fright'>
226
- <Space.Compact>
227
- <Button
228
- onClick={handleTogglePinned}
229
- icon={<PushpinOutlined />}
230
- type={tp}
231
- />
232
- <Button
233
- onClick={window.store.handleOpenQuickCommandsSetting}
234
- icon={<EditOutlined />}
235
- />
236
- <Button
237
- onClick={handleClose}
238
- icon={<CloseCircleOutlined />}
239
- />
240
- </Space.Compact>
241
- </span>
242
- </div>
218
+ </Flex>
219
+ <Space.Compact className='mg2l'>
220
+ <Button
221
+ onClick={handleTogglePinned}
222
+ icon={<PushpinOutlined />}
223
+ type={tp}
224
+ />
225
+ <Button
226
+ onClick={window.store.handleOpenQuickCommandsSetting}
227
+ icon={<EditOutlined />}
228
+ />
229
+ <Button
230
+ onClick={handleClose}
231
+ icon={<CloseCircleOutlined />}
232
+ />
233
+ </Space.Compact>
234
+ </Flex>
243
235
  <div className={cls}>
244
236
  {filtered.map(renderItem)}
245
237
  </div>
@@ -12,7 +12,7 @@ export default class QuickCommandFormIndex extends PureComponent {
12
12
  this.setState({
13
13
  ready: true
14
14
  })
15
- }, 200)
15
+ }, 0)
16
16
  }
17
17
 
18
18
  componentWillUnmount () {
@@ -88,6 +88,7 @@ export default function renderQm () {
88
88
  return (
89
89
  <Tag
90
90
  title={c.desc}
91
+ variant='solid'
91
92
  key={c.cmd}
92
93
  onClick={() => {
93
94
  copy(c.cmd)
@@ -35,7 +35,7 @@ export default class QuickCommandsFooter extends PureComponent {
35
35
  >
36
36
  <Button
37
37
  size='small'
38
- type='ghost'
38
+ type='text'
39
39
  >
40
40
  <span className='w500'>{e('quickCommands')}</span>
41
41
  <span className='l500'>Q</span>
@@ -736,7 +736,7 @@ export default class SessionWrapper extends Component {
736
736
  const layout = direction === 'leftRight' ? 'horizontal' : 'vertical'
737
737
  const [size1, size2] = this.state.splitSize
738
738
  const splitterProps = {
739
- layout,
739
+ orientation: layout,
740
740
  onResize: this.onSplitResize,
741
741
  onResizeEnd: this.onSplitResize,
742
742
  className: notSplitVew ? 'not-split-view' : '',
@@ -84,6 +84,7 @@ export default function DeepLinkControl () {
84
84
  return (
85
85
  <Tag
86
86
  key={protocol}
87
+ variant='solid'
87
88
  icon={isRegistered ? <CheckCircleOutlined /> : <CloseCircleOutlined />}
88
89
  color={isRegistered ? 'success' : 'default'}
89
90
  >