@electerm/electerm-react 1.37.60 → 1.37.68

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 (27) hide show
  1. package/client/common/{create-title.js → create-title.jsx} +19 -1
  2. package/client/common/promise-timeout.js +1 -1
  3. package/client/components/batch-op/batch-op.jsx +4 -2
  4. package/client/components/bookmark-form/color-picker.jsx +2 -2
  5. package/client/components/bookmark-form/index.jsx +2 -2
  6. package/client/components/bookmark-form/render-auth-ssh.jsx +1 -1
  7. package/client/components/bookmark-form/telnet-form-ui.jsx +1 -1
  8. package/client/components/context-menu/history.jsx +2 -2
  9. package/client/components/context-menu/sub-tab-menu.jsx +2 -2
  10. package/client/components/main/upgrade.jsx +21 -9
  11. package/client/components/main/upgrade.styl +3 -5
  12. package/client/components/setting-panel/bookmark-transport.jsx +4 -4
  13. package/client/components/setting-panel/list.jsx +4 -2
  14. package/client/components/setting-panel/setting-modal.jsx +4 -4
  15. package/client/components/setting-panel/setting-terminal.jsx +9 -5
  16. package/client/components/setting-panel/setting-wrap.jsx +4 -2
  17. package/client/components/setting-panel/setting.styl +3 -1
  18. package/client/components/setting-panel/start-session-select.jsx +4 -4
  19. package/client/components/setting-panel/tree-list.jsx +4 -3
  20. package/client/components/sidebar/bookmark-select.jsx +1 -1
  21. package/client/components/terminal/index.jsx +2 -134
  22. package/client/store/bookmark-group.js +4 -7
  23. package/client/store/bookmark.js +0 -3
  24. package/client/store/index.js +29 -66
  25. package/client/store/quick-command.js +0 -4
  26. package/client/store/setting.js +6 -14
  27. package/package.json +1 -1
@@ -9,7 +9,7 @@ import {
9
9
  const { prefix } = window
10
10
  const p = prefix('sftp')
11
11
 
12
- export default (res) => {
12
+ export default function createTitle (res) {
13
13
  if (!res) {
14
14
  return ''
15
15
  }
@@ -30,3 +30,21 @@ export default (res) => {
30
30
  }
31
31
  return f || p(terminalLocalType)
32
32
  }
33
+
34
+ export function createTitleTag (obj) {
35
+ const { color } = obj
36
+ const styleTag = color
37
+ ? { color }
38
+ : {}
39
+ return (
40
+ <span style={styleTag}>♦</span>
41
+ )
42
+ }
43
+
44
+ export function createTitleWithTag (obj) {
45
+ return (
46
+ <span className='tab-title'>
47
+ {createTitleTag(obj)} {createTitle(obj)}
48
+ </span>
49
+ )
50
+ }
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  export class NewPromise extends Promise {
6
- constructor (executor, timeout = 30000) {
6
+ constructor (executor, timeout = 120000) {
7
7
  let timeoutId
8
8
 
9
9
  super((resolve, reject) => {
@@ -632,8 +632,10 @@ export default class BatchOp extends Component {
632
632
  width: innerWidth - sidebarWidth,
633
633
  zIndex: 888,
634
634
  placement: 'left',
635
- headerStyle: {
636
- display: 'none'
635
+ styles: {
636
+ header: {
637
+ display: 'none'
638
+ }
637
639
  }
638
640
  }
639
641
  return (
@@ -75,9 +75,9 @@ export const ColorPicker = React.forwardRef((props, ref) => {
75
75
  <Popover
76
76
  content={renderContent()}
77
77
  trigger='click'
78
- visible={visible}
78
+ open={visible}
79
79
  placement='bottomLeft'
80
- onVisibleChange={handleVisibleChange}
80
+ onOpenChange={handleVisibleChange}
81
81
  >
82
82
  <div
83
83
  ref={ref}
@@ -17,7 +17,7 @@ import SshForm from './ssh-form'
17
17
  import SerialForm from './serial-form'
18
18
  import LocalForm from './local-form'
19
19
  import TelnetForm from './telnet-form'
20
- import createTitle from '../../common/create-title'
20
+ import { createTitleWithTag } from '../../common/create-title'
21
21
  import {
22
22
  LoadingOutlined,
23
23
  BookOutlined
@@ -104,7 +104,7 @@ export default class BookmarkIndex extends Component {
104
104
  }
105
105
  return (
106
106
  <b className='mg1x'>
107
- {createTitle(formData)}
107
+ {createTitleWithTag(formData)}
108
108
  </b>
109
109
  )
110
110
  }
@@ -26,7 +26,7 @@ export default function renderAuth (props) {
26
26
  if (authType === 'password') {
27
27
  const opts = {
28
28
  options: uniqBy(
29
- store.getBookmarks()
29
+ store.bookmarks
30
30
  .filter(d => d.password),
31
31
  (d) => d.password
32
32
  )
@@ -71,7 +71,7 @@ export default function TelnetFormUI (props) {
71
71
  function renderAuth () {
72
72
  const opts = {
73
73
  options: uniqBy(
74
- props.store.getBookmarks()
74
+ props.store.bookmarks
75
75
  .filter(d => d.password),
76
76
  (d) => d.password
77
77
  )
@@ -1,5 +1,5 @@
1
1
  import { Component } from '../common/react-subx'
2
- import createTitle from '../../common/create-title'
2
+ import { createTitleWithTag } from '../../common/create-title'
3
3
 
4
4
  export default class HistorySubMenu extends Component {
5
5
  render () {
@@ -8,7 +8,7 @@ export default class HistorySubMenu extends Component {
8
8
  <div className='sub-context-menu'>
9
9
  {
10
10
  store.history.map(item => {
11
- const title = createTitle(item)
11
+ const title = createTitleWithTag(item)
12
12
  return (
13
13
  <div
14
14
  className='sub-context-menu-item'
@@ -1,5 +1,5 @@
1
1
  import { PureComponent } from 'react'
2
- import createTitle from '../../common/create-title'
2
+ import { createTitleWithTag } from '../../common/create-title'
3
3
 
4
4
  export default class TabsSubMenuChild extends PureComponent {
5
5
  handleClick = () => {
@@ -8,7 +8,7 @@ export default class TabsSubMenuChild extends PureComponent {
8
8
 
9
9
  render () {
10
10
  const { item } = this.props
11
- const title = createTitle(item)
11
+ const title = createTitleWithTag(item)
12
12
  return (
13
13
  <div
14
14
  className='sub-context-menu-item'
@@ -202,9 +202,13 @@ export default class Upgrade extends PureComponent {
202
202
  renderError = (err) => {
203
203
  return (
204
204
  <div className='upgrade-panel'>
205
- <div className='upgrade-panel-title'>
206
- <CloseOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleClose} />
207
- {e('fail')}: {err}
205
+ <div className='upgrade-panel-title fix'>
206
+ <span className='fleft'>
207
+ {e('fail')}: {err}
208
+ </span>
209
+ <span className='fright'>
210
+ <CloseOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleClose} />
211
+ </span>
208
212
  </div>
209
213
  <div className='upgrade-panel-body'>
210
214
  You can visit
@@ -225,9 +229,13 @@ export default class Upgrade extends PureComponent {
225
229
  const cls = `animate upgrade-panel${showUpgradeModal ? '' : ' upgrade-panel-hide'}`
226
230
  return (
227
231
  <div className={cls}>
228
- <div className='upgrade-panel-title'>
229
- <CloseOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleClose} />
230
- {e('noNeed')}
232
+ <div className='upgrade-panel-title fix'>
233
+ <span className='fleft'>
234
+ {e('noNeed')}
235
+ </span>
236
+ <span className='fright'>
237
+ <CloseOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleClose} />
238
+ </span>
231
239
  </div>
232
240
  <div className='upgrade-panel-body'>
233
241
  {e('noNeedDesc')}
@@ -316,9 +324,13 @@ export default class Upgrade extends PureComponent {
316
324
  const skip = srcsSkipUpgradeCheck.includes(installSrc)
317
325
  return (
318
326
  <div className={cls}>
319
- <div className='upgrade-panel-title'>
320
- <MinusSquareOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleMinimize} />
321
- {e('newVersion')} <b>{remoteVersion} [{releaseInfo.date}]</b>
327
+ <div className='upgrade-panel-title fix'>
328
+ <span className='fleft'>
329
+ {e('newVersion')} <b>{remoteVersion} [{releaseInfo.date}]</b>
330
+ </span>
331
+ <span className='fright'>
332
+ <MinusSquareOutlined className='pointer font16 close-upgrade-panel' onClick={this.handleMinimize} />
333
+ </span>
322
334
  </div>
323
335
  <div className='upgrade-panel-body'>
324
336
  {
@@ -6,7 +6,8 @@
6
6
  z-index 9999
7
7
  background main
8
8
  color text
9
- box-shadow 0px 0px 5px 5px alpha(main, .25)
9
+ border-radius 5px
10
+ border 1px solid darken(main, 30%)
10
11
  padding 0
11
12
  width 440px
12
13
  .upgrade-panel-hide
@@ -15,13 +16,10 @@
15
16
  right auto
16
17
  bottom auto
17
18
  .close-upgrade-panel
18
- position absolute
19
- right 5px
20
- top 8px
21
19
  &:hover
22
20
  color success
23
21
  .upgrade-panel-title
24
22
  .upgrade-panel-body
25
23
  padding 10px 15px
26
24
  .upgrade-panel-title
27
- border-bottom 1px solid main-dark
25
+ border-bottom 1px solid darken(main, 30%)
@@ -30,8 +30,8 @@ export default class BookmarkTransport extends Component {
30
30
  bookmarkGroups: bookmarkGroups1,
31
31
  bookmarks: bookmarks1
32
32
  } = content
33
- const bookmarkGroups = copy(store.getBookmarkGroups())
34
- const bookmarks = copy(store.getBookmarks())
33
+ const bookmarkGroups = copy(store.bookmarkGroups)
34
+ const bookmarks = copy(store.bookmarks)
35
35
  const bmTree = bookmarks.reduce((p, v) => {
36
36
  return {
37
37
  ...p,
@@ -99,8 +99,8 @@ export default class BookmarkTransport extends Component {
99
99
 
100
100
  handleDownload = () => {
101
101
  const { store } = this.props
102
- const bookmarkGroups = store.getBookmarkGroups()
103
- const bookmarks = store.getBookmarks()
102
+ const bookmarkGroups = store.bookmarkGroups
103
+ const bookmarks = store.bookmarks
104
104
  const txt = JSON.stringify({
105
105
  bookmarkGroups: copy(bookmarkGroups),
106
106
  bookmarks: copy(bookmarks)
@@ -5,7 +5,7 @@ import React from 'react'
5
5
  import { CloseOutlined, EditOutlined, LoadingOutlined } from '@ant-design/icons'
6
6
  import { Popconfirm } from 'antd'
7
7
  import Search from '../common/search'
8
- import createName from '../../common/create-title'
8
+ import createName, { createTitleTag } from '../../common/create-title'
9
9
  import classnames from 'classnames'
10
10
  import { noop } from 'lodash-es'
11
11
  import highlight from '../common/highlight'
@@ -102,6 +102,7 @@ export default class ItemList extends React.PureComponent {
102
102
  const { onClickItem, type, activeItemId } = this.props
103
103
  const { id } = item
104
104
  const title = createName(item)
105
+ const tag = createTitleTag(item)
105
106
  const cls = classnames(
106
107
  'item-list-unit',
107
108
  {
@@ -122,7 +123,8 @@ export default class ItemList extends React.PureComponent {
122
123
  <div
123
124
  title={title}
124
125
  className='elli pd1y pd2x list-item-title'
125
- >{titleHighlight || s('new')}
126
+ >
127
+ {tag}{titleHighlight || s('new')}
126
128
  </div>
127
129
  {this.renderDelBtn(item)}
128
130
  {this.renderEditBtn(item, isGroup)}
@@ -51,16 +51,16 @@ export default class SettingModalWrap extends Component {
51
51
  'currentBookmarkGroupId',
52
52
  'config'
53
53
  ]),
54
- bookmarkGroups: store.getBookmarkGroups(),
55
- bookmarks: store.getBookmarks(),
54
+ bookmarkGroups: store.bookmarkGroups,
55
+ bookmarks: store.bookmarks,
56
56
  serials: store.serials,
57
57
  loaddingSerials: store.loaddingSerials
58
58
  }
59
59
  const treeProps = {
60
60
  ...props0,
61
61
  bookmarkSelectMode,
62
- bookmarkGroups: store.getBookmarkGroups(),
63
- bookmarks: store.getBookmarks(),
62
+ bookmarkGroups: store.bookmarkGroups,
63
+ bookmarks: store.bookmarks,
64
64
  ...pick(store, [
65
65
  'currentBookmarkGroupId',
66
66
  'autofocustrigger',
@@ -361,8 +361,9 @@ export default class SettingTerminal extends Component {
361
361
  const { fontFamily } = this.props.config
362
362
  const props = {
363
363
  mode: 'multiple',
364
+ className: 'font-sel',
364
365
  onChange: this.handleChangeFont,
365
- value: fontFamily.split(/, */g)
366
+ value: fontFamily.split(/, */g).filter(d => d.trim())
366
367
  }
367
368
  return (
368
369
  <Select
@@ -373,10 +374,13 @@ export default class SettingTerminal extends Component {
373
374
  fonts.map(f => {
374
375
  return (
375
376
  <Option value={f} key={f}>
376
- <span style={{
377
- fontFamily: f
378
- }}
379
- >{f}
377
+ <span
378
+ className='font-option'
379
+ style={{
380
+ fontFamily: f
381
+ }}
382
+ >
383
+ {f}
380
384
  </span>
381
385
  </Option>
382
386
  )
@@ -18,8 +18,10 @@ export default class SettingWrap extends Component {
18
18
  zIndex: 888,
19
19
  placement: 'left',
20
20
  destroyOnClose: true,
21
- headerStyle: {
22
- display: 'none'
21
+ styles: {
22
+ header: {
23
+ display: 'none'
24
+ }
23
25
  }
24
26
  }
25
27
  return (
@@ -1,4 +1,6 @@
1
1
  .pd2b.bg-img-setting
2
2
  display inline-block
3
3
  padding 0
4
- margin 5px 5px 0 0
4
+ margin 5px 5px 0 0
5
+ .font-sel
6
+ min-width 200px
@@ -1,7 +1,7 @@
1
1
  import { TreeSelect } from 'antd'
2
2
  import { Component } from '../common/react-subx'
3
3
  import copy from 'json-deep-copy'
4
- import createTitle from '../../common/create-title'
4
+ import { createTitleWithTag } from '../../common/create-title'
5
5
 
6
6
  const { prefix } = window
7
7
  const e = prefix('setting')
@@ -9,8 +9,8 @@ const { SHOW_CHILD } = TreeSelect
9
9
 
10
10
  export default class StartSessionSelect extends Component {
11
11
  buildData = () => {
12
- const cats = this.props.store.getBookmarkGroups()
13
- const tree = this.props.store.getBookmarks()
12
+ const cats = this.props.store.bookmarkGroups
13
+ const tree = this.props.store.bookmarks
14
14
  .reduce((p, k) => {
15
15
  return {
16
16
  ...p,
@@ -50,7 +50,7 @@ export default class StartSessionSelect extends Component {
50
50
  return {
51
51
  value: x.id,
52
52
  key: x.id,
53
- title: createTitle(x)
53
+ title: createTitleWithTag(x)
54
54
  }
55
55
  }
56
56
  const level1 = cats.filter(d => d.level !== 2)
@@ -27,7 +27,7 @@ import {
27
27
  Tooltip,
28
28
  Space
29
29
  } from 'antd'
30
- import createName from '../../common/create-title'
30
+ import createName, { createTitleTag } from '../../common/create-title'
31
31
  import classnames from 'classnames'
32
32
  import InputAutoFocus from '../common/input-auto-focus'
33
33
  import { find, uniq, findIndex, isEqual, filter } from 'lodash-es'
@@ -319,7 +319,7 @@ export default class ItemListTree extends Component {
319
319
  })
320
320
  } else {
321
321
  this.props.store.storeAssign({
322
- currentBookmarkGroupId: findBookmarkGroupId(this.props.store.getBookmarkGroups(), id)
322
+ currentBookmarkGroupId: findBookmarkGroupId(this.props.store.bookmarkGroups, id)
323
323
  })
324
324
  }
325
325
  const bookmarks = copy(this.props.bookmarks)
@@ -712,6 +712,7 @@ export default class ItemListTree extends Component {
712
712
  level2: item.level === 2
713
713
  }
714
714
  )
715
+ const tag = isGroup ? '' : createTitleTag(item)
715
716
  const title = isGroup
716
717
  ? item.title
717
718
  : createName(item)
@@ -732,7 +733,7 @@ export default class ItemListTree extends Component {
732
733
  <div
733
734
  className='tree-item-title elli'
734
735
  >
735
- {titleHighlight}
736
+ {tag}{titleHighlight}
736
737
  </div>
737
738
  {
738
739
  isGroup
@@ -24,7 +24,7 @@ export default class BookmarkSelect extends Component {
24
24
  }
25
25
  const base = {
26
26
  store,
27
- bookmarks: store.getBookmarks() || [],
27
+ bookmarks: store.bookmarks || [],
28
28
  type: 'bookmarks',
29
29
  onClickItem,
30
30
  listStyle,
@@ -7,17 +7,13 @@ import postMessage from '../../common/post-msg'
7
7
  import clone from '../../common/to-simple-obj'
8
8
  import runIdle from '../../common/run-idle'
9
9
  import {
10
- CheckCircleOutlined,
11
10
  ReloadOutlined
12
11
  } from '@ant-design/icons'
13
12
  import {
14
13
  notification,
15
14
  Spin,
16
- Modal,
17
- Button,
18
- Checkbox
15
+ Button
19
16
  } from 'antd'
20
- import Input from '../common/input-auto-focus'
21
17
  import classnames from 'classnames'
22
18
  import './terminal.styl'
23
19
  import {
@@ -57,10 +53,6 @@ import { KeywordHighlighterAddon } from './highlight-addon.js'
57
53
  const { prefix } = window
58
54
  const e = prefix('ssh')
59
55
  const m = prefix('menu')
60
- const f = prefix('form')
61
- const c = prefix('common')
62
- const authFailMsg = 'All configured authentication methods failed'
63
- const privateKeyMsg = 'no passphrase'
64
56
 
65
57
  const computePos = (e) => {
66
58
  return {
@@ -76,11 +68,8 @@ class Term extends Component {
76
68
  pid: '',
77
69
  id: props.id || 'id' + generate(),
78
70
  loading: false,
79
- promoteModalVisible: false,
80
- savePassword: false,
81
71
  saveTerminalLogToFile: !!this.props.config.saveTerminalLogToFile,
82
72
  addTimeStampToTermLog: !!this.props.config.addTimeStampToTermLog,
83
- tempPassword: '',
84
73
  passType: 'password',
85
74
  zmodemTransfer: null,
86
75
  lines: []
@@ -1002,15 +991,7 @@ class Term extends Component {
1002
991
  let pid = await createTerm(opts)
1003
992
  .catch(err => {
1004
993
  const text = err.message
1005
- if (text.includes(authFailMsg)) {
1006
- this.setState(() => ({ passType: 'password' }))
1007
- return 'fail'
1008
- } else if (text.includes(privateKeyMsg)) {
1009
- this.setState(() => ({ passType: 'passphrase' }))
1010
- return 'fail-private'
1011
- } else {
1012
- handleErr({ message: text })
1013
- }
994
+ handleErr({ message: text })
1014
995
  })
1015
996
  pid = pid || ''
1016
997
  if (pid.includes('fail')) {
@@ -1159,75 +1140,11 @@ class Term extends Component {
1159
1140
  resizeTerm(this.pid, this.props.sessionId, cols, rows)
1160
1141
  }
1161
1142
 
1162
- promote = () => {
1163
- this.setState({
1164
- promoteModalVisible: true,
1165
- tempPassword: ''
1166
- })
1167
- }
1168
-
1169
1143
  handleCancel = () => {
1170
1144
  const { id } = this.props.tab
1171
1145
  this.props.delTab(id)
1172
1146
  }
1173
1147
 
1174
- handleToggleSavePass = () => {
1175
- this.setState({
1176
- savePassword: !this.state.savePassword
1177
- })
1178
- }
1179
-
1180
- renderPasswordForm = () => {
1181
- const { tempPassword, savePassword, promoteModalVisible } = this.state
1182
- const { type } = this.props.tab
1183
- return (
1184
- <div>
1185
- <Input
1186
- value={tempPassword}
1187
- type='password'
1188
- autofocustrigger={promoteModalVisible ? 1 : 2}
1189
- selectall='yes'
1190
- onChange={this.handleChangePass}
1191
- onPressEnter={this.handleClickConfirmPass}
1192
- />
1193
- {
1194
- type !== terminalSshConfigType
1195
- ? (
1196
- <div className='pd1t'>
1197
- <Checkbox
1198
- checked={savePassword}
1199
- onChange={this.handleToggleSavePass}
1200
- >{f('save')}
1201
- </Checkbox>
1202
- </div>
1203
- )
1204
- : null
1205
- }
1206
- </div>
1207
- )
1208
- }
1209
-
1210
- handleChangePass = e => {
1211
- this.setState({
1212
- tempPassword: e.target.value
1213
- })
1214
- }
1215
-
1216
- handleClickConfirmPass = () => {
1217
- const {
1218
- tempPassword,
1219
- passType
1220
- } = this.state
1221
- this.props.setSessionState(old => {
1222
- const sessionOptions = deepCopy(old.sessionOptions) || {}
1223
- sessionOptions[passType] = tempPassword
1224
- return { sessionOptions }
1225
- })
1226
- this.setState({
1227
- promoteModalVisible: false
1228
- }, this.remoteInit)
1229
- }
1230
-
1231
1148
  handleShowInfo = () => {
1232
1149
  const { id, sessionId, logName } = this.props
1233
1150
  const { pid } = this.state
@@ -1256,54 +1173,6 @@ class Term extends Component {
1256
1173
  // return result ? result[0].trim() : ''
1257
1174
  // }
1258
1175
 
1259
- renderPromoteModal = () => {
1260
- if (!this.isActiveTerminal()) {
1261
- return null
1262
- }
1263
- const {
1264
- passType = 'password'
1265
- } = this.state
1266
- const props = {
1267
- title: f(passType) + '?',
1268
- content: this.renderPasswordForm(),
1269
- onCancel: this.handleCancel,
1270
- show: this.state.promoteModalVisible,
1271
- footer: this.renderModalFooter(),
1272
- cancelText: c('cancel')
1273
- }
1274
- return (
1275
- <Modal
1276
- {...props}
1277
- >
1278
- {this.renderPasswordForm()}
1279
- </Modal>
1280
- )
1281
- }
1282
-
1283
- renderModalFooter = () => {
1284
- const disabled = !this.state.tempPassword
1285
- return (
1286
- <div className='alignright pd1'>
1287
- <Button
1288
- type='primary'
1289
- icon={<CheckCircleOutlined />}
1290
- disabled={disabled}
1291
- onClick={this.handleClickConfirmPass}
1292
- className='mg1r'
1293
- >
1294
- {c('ok')}
1295
- </Button>
1296
- <Button
1297
- type='dashed'
1298
- className='mg1r'
1299
- onClick={this.handleCancel}
1300
- >
1301
- {c('cancel')}
1302
- </Button>
1303
- </div>
1304
- )
1305
- }
1306
-
1307
1176
  switchEncoding = encode => {
1308
1177
  this.decode = new TextDecoder(encode)
1309
1178
  this.attachAddon.decoder = this.decode
@@ -1357,7 +1226,6 @@ class Term extends Component {
1357
1226
  <div
1358
1227
  {...prps1}
1359
1228
  >
1360
- {this.renderPromoteModal()}
1361
1229
  <div
1362
1230
  {...prps2}
1363
1231
  >
@@ -10,21 +10,18 @@ import {
10
10
  } from '../common/constants'
11
11
 
12
12
  export default Store => {
13
- Store.prototype.getBookmarkGroups = function () {
14
- return window.store.getItems(settingMap.bookmarkGroups)
15
- }
16
13
  Store.prototype.getBookmarkGroupsTotal = function () {
17
14
  const { store } = window
18
15
  return store.sshConfigItems.length && !store.config.hideSshConfig
19
16
  ? [
20
- ...store.getBookmarkGroups(),
17
+ ...store.bookmarkGroups,
21
18
  {
22
19
  title: terminalSshConfigType,
23
20
  id: terminalSshConfigType,
24
21
  bookmarkIds: store.sshConfigItems.map(d => d.id)
25
22
  }
26
23
  ]
27
- : store.getBookmarkGroups()
24
+ : store.bookmarkGroups
28
25
  }
29
26
 
30
27
  Store.prototype.setBookmarkGroups = function (items) {
@@ -43,7 +40,7 @@ export default Store => {
43
40
  const { store } = window
44
41
  let ids = item.bookmarkIds
45
42
  const gids = item.bookmarkGroupIds || []
46
- const bookmarkGroups = store.getBookmarkGroups()
43
+ const bookmarkGroups = store.bookmarkGroups
47
44
  for (const gid of gids) {
48
45
  const g = find(bookmarkGroups, g => g.id === gid)
49
46
  if (g && g.bookmarkIds && g.bookmarkIds.length) {
@@ -63,7 +60,7 @@ export default Store => {
63
60
  if (id === defaultBookmarkGroupId) {
64
61
  return
65
62
  }
66
- let bookmarkGroups = store.getBookmarkGroups()
63
+ let bookmarkGroups = store.bookmarkGroups
67
64
  const tobeDel = find(bookmarkGroups, bg => bg.id === id)
68
65
  if (!tobeDel) {
69
66
  return
@@ -13,9 +13,6 @@ export default Store => {
13
13
  }
14
14
  store.loaddingSerials = false
15
15
  }
16
- Store.prototype.getBookmarks = function () {
17
- return window.store.getItems('bookmarks')
18
- }
19
16
  Store.prototype.setBookmarks = function (items) {
20
17
  return window.store.setItems('bookmarks', items)
21
18
  }
@@ -99,7 +99,7 @@ class Store {
99
99
 
100
100
  get currentQuickCommands () {
101
101
  const { currentTab } = this
102
- const quickCommands = window.store.getQuickCommands()
102
+ const { quickCommands } = window.store
103
103
  const currentTabQuickCommands = (
104
104
  currentTab.quickCommands || []
105
105
  ).map((d, i) => {
@@ -138,7 +138,7 @@ class Store {
138
138
  }
139
139
 
140
140
  get quickCommandTags () {
141
- const quickCommands = window.store.getQuickCommands()
141
+ const { quickCommands } = window.store
142
142
  return uniq(
143
143
  quickCommands.reduce((p, q) => {
144
144
  return [
@@ -149,26 +149,10 @@ class Store {
149
149
  )
150
150
  }
151
151
 
152
- get expandedKeys () {
153
- return JSON.parse(window.store._expandedKeys || '[]')
154
- }
155
-
156
- get checkedKeys () {
157
- return JSON.parse(window.store._checkedKeys || '[]')
158
- }
159
-
160
152
  get isTransporting () {
161
153
  return window.store.getTabs().some(t => t.isTransporting)
162
154
  }
163
155
 
164
- get addressBookmarks () {
165
- return JSON.parse(window.store._addressBookmarks || '[]')
166
- }
167
-
168
- get addressBookmarksLocal () {
169
- return JSON.parse(window.store._addressBookmarksLocal || '[]')
170
- }
171
-
172
156
  get settingSidebarList () {
173
157
  const {
174
158
  settingTab
@@ -203,50 +187,6 @@ class Store {
203
187
  return window.store.getTabs().map(d => d.title).join('#')
204
188
  }
205
189
 
206
- get sshConfigItems () {
207
- return JSON.parse(window.store._sshConfigItems || '[]')
208
- }
209
-
210
- get itermThemes () {
211
- return JSON.parse(window.store._itermThemes || '[]')
212
- }
213
-
214
- get history () {
215
- return JSON.parse(window.store._history || '[]')
216
- }
217
-
218
- get bookmarks () {
219
- return JSON.parse(window.store._bookmarks || '[]')
220
- }
221
-
222
- get bookmarkGroups () {
223
- return JSON.parse(window.store._bookmarkGroups || '[]')
224
- }
225
-
226
- get tabs () {
227
- return JSON.parse(window.store._tabs || '[]')
228
- }
229
-
230
- get fileTransfers () {
231
- return JSON.parse(window.store._fileTransfers || '[]')
232
- }
233
-
234
- get transferHistory () {
235
- return JSON.parse(window.store._transferHistory || '[]')
236
- }
237
-
238
- get quickCommands () {
239
- return JSON.parse(window.store._quickCommands || '[]')
240
- }
241
-
242
- get terminalThemes () {
243
- return JSON.parse(window.store._terminalThemes || '[]')
244
- }
245
-
246
- get serials () {
247
- return JSON.parse(window.store._serials || '[]')
248
- }
249
-
250
190
  get setting () {
251
191
  return [
252
192
  {
@@ -272,10 +212,6 @@ class Store {
272
212
  return JSON.parse(window.store._sftpSortSetting)
273
213
  }
274
214
 
275
- get fonts () {
276
- return JSON.parse(window.store._fonts || '[]')
277
- }
278
-
279
215
  get onOperation () {
280
216
  const {
281
217
  store
@@ -327,6 +263,33 @@ class Store {
327
263
  }
328
264
  }
329
265
 
266
+ const getterProps = [
267
+ 'expandedKeys',
268
+ 'checkedKeys',
269
+ 'addressBookmarks',
270
+ 'addressBookmarksLocal',
271
+ 'sshConfigItems',
272
+ 'itermThemes',
273
+ 'history',
274
+ 'bookmarks',
275
+ 'bookmarkGroups',
276
+ 'tabs',
277
+ 'fileTransfers',
278
+ 'transferHistory',
279
+ 'quickCommands',
280
+ 'terminalThemes',
281
+ 'serials',
282
+ 'fonts'
283
+ ]
284
+
285
+ for (const prop of getterProps) {
286
+ Object.defineProperty(Store.prototype, prop, {
287
+ get: function () {
288
+ return JSON.parse(window.store[`_${prop}`] || '[]').filter(d => d)
289
+ }
290
+ })
291
+ }
292
+
330
293
  loadDataExtend(Store)
331
294
  eventExtend(Store)
332
295
  dbUpgradeExtend(Store)
@@ -9,10 +9,6 @@ import {
9
9
  import postMessage from '../common/post-msg'
10
10
 
11
11
  export default Store => {
12
- Store.prototype.getQuickCommands = function () {
13
- return window.store.getItems(settingMap.quickCommands)
14
- }
15
-
16
12
  Store.prototype.setQuickCommands = function (list) {
17
13
  return window.store.setItems(settingMap.quickCommands, list)
18
14
  }
@@ -2,7 +2,7 @@
2
2
  * setting modal
3
3
  */
4
4
 
5
- import { find, isEqual, pick, without } from 'lodash-es'
5
+ import { find } from 'lodash-es'
6
6
  import {
7
7
  message
8
8
  } from 'antd'
@@ -43,7 +43,7 @@ export default Store => {
43
43
  }
44
44
  Store.prototype.handleEditHistory = function () {
45
45
  const { store } = window
46
- const all = store.getItems('history')
46
+ const all = store.history
47
47
  store.storeAssign({
48
48
  settingTab: settingMap.history,
49
49
  autofocustrigger: Date.now()
@@ -74,7 +74,7 @@ export default Store => {
74
74
 
75
75
  Store.prototype.onSelectHistory = function (id) {
76
76
  const { store } = window
77
- const history = store.getItems('history')
77
+ const history = store.history
78
78
  const item = find(history, it => it.id === id)
79
79
  store.addTab({
80
80
  ...copy(item),
@@ -86,8 +86,8 @@ export default Store => {
86
86
 
87
87
  Store.prototype.onSelectBookmark = function (id) {
88
88
  const { store } = window
89
- const history = store.getItems('history')
90
- const bookmarks = store.getBookmarks()
89
+ const history = store.history
90
+ const bookmarks = store.bookmarks
91
91
  const item = copy(
92
92
  find(bookmarks, it => it.id === id) ||
93
93
  find(store.sshConfigItems, it => it.id === id)
@@ -105,15 +105,7 @@ export default Store => {
105
105
  if (store.config.disableSshHistory) {
106
106
  return
107
107
  }
108
- const existItem = find(history, j => {
109
- const keysj = Object.keys(j)
110
- const keysi = Object.keys(item)
111
- return isEqual(
112
- pick(item, without(keysi, 'id')),
113
- pick(j, without(keysj, 'id'))
114
- )
115
- })
116
- history.unshift(existItem)
108
+ history.unshift(item)
117
109
  store.setItems('history', history)
118
110
  }
119
111
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electerm/electerm-react",
3
- "version": "1.37.60",
3
+ "version": "1.37.68",
4
4
  "description": "react components src for electerm",
5
5
  "main": "./client/components/main/main.jsx",
6
6
  "license": "MIT",