@electerm/electerm-react 2.3.126 → 2.3.136

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 (45) 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 +1 -1
  7. package/client/components/bookmark-form/common/bookmark-group-tree-format.js +4 -3
  8. package/client/components/bookmark-form/common/ssh-host-selector.jsx +1 -1
  9. package/client/components/bookmark-form/common/ssh-tunnels.jsx +1 -0
  10. package/client/components/bookmark-form/tree-delete.jsx +18 -15
  11. package/client/components/common/input-auto-focus.jsx +16 -3
  12. package/client/components/common/logo-elem.jsx +1 -1
  13. package/client/components/common/password.jsx +1 -1
  14. package/client/components/footer/footer.styl +1 -0
  15. package/client/components/main/main.jsx +4 -1
  16. package/client/components/quick-commands/qm.styl +19 -0
  17. package/client/components/quick-commands/quick-commands-box.jsx +28 -36
  18. package/client/components/quick-commands/quick-commands-list-form.jsx +1 -0
  19. package/client/components/quick-commands/quick-commands-select.jsx +1 -1
  20. package/client/components/session/session.jsx +1 -1
  21. package/client/components/setting-panel/deep-link-control.jsx +1 -0
  22. package/client/components/setting-panel/list.styl +1 -1
  23. package/client/components/setting-panel/setting-common.jsx +1 -0
  24. package/client/components/setting-panel/setting-modal.jsx +13 -0
  25. package/client/components/setting-panel/setting-wrap.jsx +1 -1
  26. package/client/components/setting-panel/start-session-select.jsx +3 -3
  27. package/client/components/setting-panel/tab-widgets.jsx +35 -0
  28. package/client/components/sftp/address-bookmark-item.jsx +1 -1
  29. package/client/components/sftp/permission-render.jsx +1 -1
  30. package/client/components/sidebar/index.jsx +12 -2
  31. package/client/components/sidebar/transfer-history-modal.jsx +1 -1
  32. package/client/components/theme/theme-list-item.jsx +4 -3
  33. package/client/components/tree-list/move-item-modal.jsx +60 -9
  34. package/client/components/tree-list/tree-list.jsx +2 -14
  35. package/client/components/vnc/vnc-session.jsx +1 -1
  36. package/client/components/widgets/widget-control.jsx +64 -0
  37. package/client/components/widgets/widget-form.jsx +115 -0
  38. package/client/components/widgets/widget-instance.jsx +46 -0
  39. package/client/components/widgets/widget-instances.jsx +10 -0
  40. package/client/components/widgets/widgets-list.jsx +155 -0
  41. package/client/store/init-state.js +9 -1
  42. package/client/store/setting.js +1 -3
  43. package/client/store/store.js +2 -0
  44. package/client/store/widgets.js +59 -0
  45. package/package.json +1 -1
@@ -1,28 +1,73 @@
1
1
  // render bookmark select, use antd tree select
2
- import { useState } from 'react'
2
+ import { useState, useEffect } from 'react'
3
+ import {
4
+ MergeOutlined
5
+ } from '@ant-design/icons'
3
6
  import buildGroupData from '../bookmark-form/common/bookmark-group-tree-format'
4
7
  import { TreeSelect, Modal, Button } from 'antd'
8
+ import { auto } from 'manate/react'
5
9
  const e = window.translate
6
10
 
7
- export default function MoveItemModal (props) {
11
+ const rootId = '__root__'
12
+
13
+ export default auto(function MoveItemModal (props) {
8
14
  const [groupId, setGroupId] = useState(undefined)
9
15
  const {
10
16
  openMoveModal,
11
17
  moveItem,
12
18
  moveItemIsGroup,
13
19
  bookmarkGroups
14
- } = props
20
+ } = props.store
21
+
22
+ function onCancelMoveItem () {
23
+ window.store.storeAssign({
24
+ openMoveModal: false,
25
+ moveItem: null,
26
+ moveItemIsGroup: false
27
+ })
28
+ }
29
+
30
+ // Reset groupId when modal opens
31
+ useEffect(() => {
32
+ if (openMoveModal) {
33
+ setGroupId(undefined)
34
+ }
35
+ }, [openMoveModal])
36
+
15
37
  if (!openMoveModal) {
16
38
  return null
17
39
  }
18
- const data = buildGroupData(bookmarkGroups, moveItem.id)
40
+
41
+ // Find current parent folder
42
+ const currentParent = bookmarkGroups.find(bg => {
43
+ if (moveItemIsGroup) {
44
+ return (bg.bookmarkGroupIds || []).includes(moveItem.id)
45
+ }
46
+ return (bg.bookmarkIds || []).includes(moveItem.id)
47
+ })
48
+ const currentParentId = currentParent?.id
49
+
50
+ // Build tree data with disabled folder for self and current parent
51
+ const data = buildGroupData(bookmarkGroups, moveItemIsGroup ? moveItem.id : null, false, currentParentId)
52
+
53
+ // if it is a group and can move to root, add root option
54
+ if (moveItemIsGroup && currentParentId) {
55
+ const title = <span><MergeOutlined /> {e('ROOT')}</span>
56
+ data.unshift({
57
+ title,
58
+ value: rootId,
59
+ key: rootId,
60
+ disabled: false
61
+ })
62
+ }
19
63
  function onSelect () {
20
64
  const {
21
65
  bookmarkGroups
22
66
  } = window.store
67
+
23
68
  const groupMap = new Map(bookmarkGroups.map(d => [d.id, d]))
24
69
  const group = groupMap.get(groupId)
25
- if (!group) {
70
+ if (!group && groupId !== rootId) {
26
71
  return
27
72
  }
28
73
  // Find and update the original parent group
@@ -45,7 +90,13 @@ export default function MoveItemModal (props) {
45
90
  )
46
91
  }
47
92
  }
93
+ if (groupId === rootId) {
94
+ delete moveItem.level
95
+ return onCancelMoveItem()
96
+ }
97
+
48
98
  if (moveItemIsGroup) {
99
+ moveItem.level = (group.level || 1) + 1
49
100
  group.bookmarkGroupIds = [
50
101
  moveItem.id,
51
102
  ...(group.bookmarkGroupIds || [])
@@ -56,13 +107,13 @@ export default function MoveItemModal (props) {
56
107
  ...(group.bookmarkIds || [])
57
108
  ]
58
109
  }
59
- props.onCancelMoveItem()
110
+ onCancelMoveItem()
60
111
  }
61
112
  const modalProps = {
62
113
  open: openMoveModal,
63
114
  title: e('moveTo'),
64
115
  footer: null,
65
- onCancel: props.onCancelMoveItem
116
+ onCancel: onCancelMoveItem
66
117
  }
67
118
  const treeProps = {
68
119
  treeData: data,
@@ -90,7 +141,7 @@ export default function MoveItemModal (props) {
90
141
  {e('ok')}
91
142
  </Button>
92
143
  <Button
93
- onClick={props.onCancelMoveItem}
144
+ onClick={onCancelMoveItem}
94
145
  className='mg1l'
95
146
  >
96
147
  {e('cancel')}
@@ -98,4 +149,4 @@ export default function MoveItemModal (props) {
98
149
  </div>
99
150
  </Modal>
100
151
  )
101
- }
152
+ })
@@ -27,7 +27,6 @@ import './tree-list.styl'
27
27
  import TreeExpander from './tree-expander'
28
28
  import TreeListItem from './tree-list-item'
29
29
  import TreeSearch from './tree-search'
30
- import MoveItemModal from './move-item-modal'
31
30
  import { CategoryColorPicker } from './category-color-picker.jsx'
32
31
  import { getRandomDefaultColor } from '../../common/rand-hex-color.js'
33
32
 
@@ -39,9 +38,6 @@ export default class ItemListTree extends Component {
39
38
  keyword: '',
40
39
  parentId: '',
41
40
  showNewBookmarkGroupForm: false,
42
- openMoveModal: false,
43
- moveItem: null,
44
- moveItemIsGroup: false,
45
41
  bookmarkGroupTitle: '',
46
42
  bookmarkGroupColor: '',
47
43
  categoryTitle: '',
@@ -174,7 +170,7 @@ export default class ItemListTree extends Component {
174
170
 
175
171
  openMoveModal = (e, item, isGroup) => {
176
172
  e.stopPropagation()
177
- this.setState({
173
+ window.store.storeAssign({
178
174
  openMoveModal: true,
179
175
  moveItem: item,
180
176
  moveItemIsGroup: isGroup
@@ -832,7 +828,7 @@ export default class ItemListTree extends Component {
832
828
  }
833
829
 
834
830
  render () {
835
- const { ready, openMoveModal, moveItem, moveItemIsGroup } = this.state
831
+ const { ready } = this.state
836
832
  if (!ready) {
837
833
  return (
838
834
  <div className='pd3 aligncenter'>
@@ -846,13 +842,6 @@ export default class ItemListTree extends Component {
846
842
  staticList,
847
843
  listStyle = {}
848
844
  } = this.props
849
- const moveProps = {
850
- openMoveModal,
851
- moveItem,
852
- moveItemIsGroup,
853
- bookmarkGroups,
854
- onCancelMoveItem: this.onCancelMoveItem
855
- }
856
845
  const level1Bookgroups = ready
857
846
  ? bookmarkGroups.filter(
858
847
  d => !d.level || d.level < 2
@@ -860,7 +849,6 @@ export default class ItemListTree extends Component {
860
849
  : []
861
850
  return (
862
851
  <div className={`tree-list item-type-${type}`}>
863
- <MoveItemModal {...moveProps} />
864
852
  {
865
853
  staticList
866
854
  ? null
@@ -235,7 +235,7 @@ export default class VncSession extends RdpSession {
235
235
 
236
236
  renderHelp = () => {
237
237
  return (
238
- <Tag color='red' className='mg1l'>Beta</Tag>
238
+ <Tag color='red' className='mg1l' variant='solid'>Beta</Tag>
239
239
  )
240
240
  }
241
241
 
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Widget control component - shows form for a selected widget
3
+ */
4
+ import React, { useState } from 'react'
5
+ import WidgetForm from './widget-form'
6
+ import {
7
+ message
8
+ } from 'antd'
9
+
10
+ export default function WidgetControl ({ formData }) {
11
+ const [loading, setLoading] = useState(false)
12
+ const widget = formData
13
+ if (!widget.id) {
14
+ return (
15
+ <div className='widget-control-empty aligncenter pd3'>
16
+ <p>Select a widget to configure</p>
17
+ </div>
18
+ )
19
+ }
20
+
21
+ const handleFormSubmit = async (config) => {
22
+ setLoading(true)
23
+ try {
24
+ const result = await window.store.runWidget(widget.id, config)
25
+ const {
26
+ instanceId,
27
+ success,
28
+ error,
29
+ msg
30
+ } = result
31
+ if (!instanceId) {
32
+ if (success === false) {
33
+ message.error('Failed to run widget', error || '')
34
+ } else {
35
+ message.success(msg || 'Widget run successfully')
36
+ }
37
+ return
38
+ }
39
+ // Add instance to the store
40
+ const instance = {
41
+ id: result.instanceId,
42
+ title: `${widget.info.name} (${result.instanceId})`,
43
+ widgetId: result.widgetId,
44
+ serverInfo: result.serverInfo,
45
+ config
46
+ }
47
+ window.store.widgetInstances.push(instance)
48
+ } catch (err) {
49
+ console.error('Failed to run widget:', err)
50
+ } finally {
51
+ setLoading(false)
52
+ }
53
+ }
54
+
55
+ return (
56
+ <div className='widget-control'>
57
+ <WidgetForm
58
+ widget={widget}
59
+ onSubmit={handleFormSubmit}
60
+ loading={loading}
61
+ />
62
+ </div>
63
+ )
64
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Widget form component
3
+ */
4
+ import React from 'react'
5
+ import { Form, Input, InputNumber, Switch, Select, Button, message } from 'antd'
6
+ import { formItemLayout, tailFormItemLayout } from '../../common/form-layout'
7
+
8
+ export default function WidgetForm ({ widget, onSubmit, loading }) {
9
+ const [form] = Form.useForm()
10
+
11
+ if (!widget) {
12
+ return null
13
+ }
14
+
15
+ const { info } = widget
16
+ const { configs, type } = info
17
+ const isInstanceWidget = type === 'instance'
18
+ const txt = isInstanceWidget ? 'Start widget' : 'Run widget'
19
+
20
+ const handleSubmit = async (values) => {
21
+ try {
22
+ await onSubmit(values)
23
+ message.success('Widget started successfully')
24
+ } catch (error) {
25
+ message.error('Failed to start widget: ' + error.message)
26
+ }
27
+ }
28
+
29
+ const renderFormItem = (config) => {
30
+ const { name, type, description, choices } = config
31
+ let control = null
32
+
33
+ switch (type) {
34
+ case 'string':
35
+ control = <Input placeholder={description} />
36
+ break
37
+ case 'number':
38
+ control = <InputNumber style={{ width: '100%' }} placeholder={description} />
39
+ break
40
+ case 'boolean':
41
+ return (
42
+ <Form.Item
43
+ key={name}
44
+ {...formItemLayout}
45
+ label={name}
46
+ name={name}
47
+ valuePropName='checked'
48
+ tooltip={description}
49
+ >
50
+ <Switch />
51
+ </Form.Item>
52
+ )
53
+ default:
54
+ control = <Input placeholder={description} />
55
+ }
56
+
57
+ if (choices && choices.length > 0) {
58
+ control = (
59
+ <Select placeholder={description}>
60
+ {choices.map(choice => (
61
+ <Select.Option key={choice} value={choice}>
62
+ {choice}
63
+ </Select.Option>
64
+ ))}
65
+ </Select>
66
+ )
67
+ }
68
+
69
+ return (
70
+ <Form.Item
71
+ key={name}
72
+ {...formItemLayout}
73
+ label={name}
74
+ name={name}
75
+ tooltip={description}
76
+ >
77
+ {control}
78
+ </Form.Item>
79
+ )
80
+ }
81
+
82
+ const initialValues = configs.reduce((acc, config) => {
83
+ acc[config.name] = config.default
84
+ return acc
85
+ }, {})
86
+
87
+ return (
88
+ <div className='widget-form'>
89
+ <div className='pd1b'>
90
+ <h4>{info.name}</h4>
91
+ <p>{info.description}</p>
92
+ </div>
93
+ <Form
94
+ form={form}
95
+ onFinish={handleSubmit}
96
+ initialValues={initialValues}
97
+ layout='horizontal'
98
+ >
99
+ {configs.map(renderFormItem)}
100
+ <Form.Item
101
+ {...tailFormItemLayout}
102
+ >
103
+ <Button
104
+ type='primary'
105
+ htmlType='submit'
106
+ loading={loading}
107
+ disabled={loading}
108
+ >
109
+ {txt}
110
+ </Button>
111
+ </Form.Item>
112
+ </Form>
113
+ </div>
114
+ )
115
+ }
@@ -0,0 +1,46 @@
1
+ import { Popconfirm } from 'antd'
2
+ import { CloseOutlined } from '@ant-design/icons'
3
+
4
+ const e = window.translate
5
+
6
+ export default function WidgetInstance ({ item }) {
7
+ const { id, title } = item
8
+ const cls = 'item-list-unit'
9
+ const delProps = {
10
+ title: e('del'),
11
+ className: 'pointer list-item-remove'
12
+ }
13
+ const icon = (
14
+ <CloseOutlined
15
+ {...delProps}
16
+ />
17
+ )
18
+ function onConfirm () {
19
+ window.store.stopWidget(id)
20
+ }
21
+ const popProps = {
22
+ title: e('del') + '?',
23
+ onConfirm,
24
+ okText: e('del'),
25
+ cancelText: e('cancel'),
26
+ placement: 'top'
27
+ }
28
+ return (
29
+ <div
30
+ key={id}
31
+ className={cls}
32
+ >
33
+ <div
34
+ title={title}
35
+ className='elli pd1y pd2x list-item-title'
36
+ >
37
+ {title}
38
+ </div>
39
+ <Popconfirm
40
+ {...popProps}
41
+ >
42
+ {icon}
43
+ </Popconfirm>
44
+ </div>
45
+ )
46
+ }
@@ -0,0 +1,10 @@
1
+ import WidgetInstance from './widget-instance'
2
+
3
+ export default function WidgetInstances ({ widgetInstances }) {
4
+ return widgetInstances.map(item => (
5
+ <WidgetInstance
6
+ key={item.id}
7
+ item={item}
8
+ />
9
+ ))
10
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * widgets list
3
+ */
4
+ import React, { useState, useEffect } from 'react'
5
+ import {
6
+ Input,
7
+ Tabs
8
+ } from 'antd'
9
+ import WidgetInstances from './widget-instances'
10
+ import classnames from 'classnames'
11
+ import highlight from '../common/highlight'
12
+ import {
13
+ auto
14
+ } from 'manate/react'
15
+
16
+ const e = window.translate
17
+
18
+ export default auto(function WidgetsList ({ activeItemId, store }) {
19
+ const { widgetInstances } = store
20
+ const [tab, setTab] = useState('widgets') // or instances
21
+ const [widgets, setWidgets] = useState([])
22
+ const [keyword, setKeyword] = useState('')
23
+ const [ready, setReady] = useState(false)
24
+
25
+ useEffect(() => {
26
+ const timer = setTimeout(() => {
27
+ setReady(true)
28
+ }, 200)
29
+ loadWidgets()
30
+ return () => {
31
+ clearTimeout(timer)
32
+ }
33
+ }, [])
34
+
35
+ const loadWidgets = async () => {
36
+ try {
37
+ const widgets = await window.store.listWidgets()
38
+ setWidgets(widgets)
39
+ } catch (error) {
40
+ console.error('Failed to load widgets:', error)
41
+ }
42
+ }
43
+
44
+ const handleSearch = (e) => {
45
+ setKeyword(e.target.value)
46
+ }
47
+
48
+ const handleTabChange = (key) => {
49
+ setTab(key)
50
+ }
51
+
52
+ const onClickWidget = (widget) => {
53
+ window.store.setSettingItem(widget)
54
+ }
55
+
56
+ const renderWidgetItem = (widget, i) => {
57
+ const title = widget.info.name
58
+ const tag = ''
59
+ const cls = classnames(
60
+ 'item-list-unit',
61
+ {
62
+ active: activeItemId === widget.id
63
+ }
64
+ )
65
+ const titleHighlight = highlight(
66
+ title,
67
+ keyword
68
+ )
69
+ return (
70
+ <div
71
+ key={widget.id}
72
+ className={cls}
73
+ onClick={() => onClickWidget(widget)}
74
+ >
75
+ <div
76
+ title={title}
77
+ className='elli pd1y pd2x list-item-title'
78
+ >
79
+ {tag}{titleHighlight || e('new')}
80
+ </div>
81
+ </div>
82
+ )
83
+ }
84
+
85
+ const renderWidgetsList = () => {
86
+ const filteredWidgets = keyword
87
+ ? widgets.filter(widget => widget.info.name.toLowerCase().includes(keyword.toLowerCase()))
88
+ : widgets
89
+
90
+ return (
91
+ <div className='item-list item-type-widgets'>
92
+ <div className='pd1y'>
93
+ <Input.Search
94
+ type='text'
95
+ placeholder='Search widgets...'
96
+ value={keyword}
97
+ onChange={handleSearch}
98
+ className='form-control'
99
+ />
100
+ </div>
101
+ <div className='item-list-wrap pd1y'>
102
+ {filteredWidgets.map(renderWidgetItem)}
103
+ </div>
104
+ </div>
105
+ )
106
+ }
107
+
108
+ const renderTabs = () => {
109
+ const instancesTag = e('runningInstances') + ` (${widgetInstances.length})`
110
+ const items = [
111
+ {
112
+ key: 'widgets',
113
+ label: e('widgets'),
114
+ children: null
115
+ },
116
+ {
117
+ key: 'instances',
118
+ label: instancesTag,
119
+ children: null
120
+ }
121
+ ]
122
+ return (
123
+ <Tabs
124
+ activeKey={tab}
125
+ onChange={handleTabChange}
126
+ items={items}
127
+ />
128
+ )
129
+ }
130
+
131
+ const renderInstancesSection = () => {
132
+ return (
133
+ <WidgetInstances
134
+ widgetInstances={widgetInstances}
135
+ />
136
+ )
137
+ }
138
+
139
+ if (!ready) {
140
+ return null
141
+ }
142
+
143
+ return (
144
+ <div>
145
+ {renderTabs()}
146
+ <div className='pd2x pd1y'>
147
+ {
148
+ tab === 'widgets'
149
+ ? renderWidgetsList()
150
+ : renderInstancesSection()
151
+ }
152
+ </div>
153
+ </div>
154
+ )
155
+ })
@@ -190,6 +190,14 @@ export default () => {
190
190
  hasNodePty: window.pre.runSync('nodePtyCheck'),
191
191
  terminalFullScreen: false,
192
192
  hideDelKeyTip: ls.getItem(dismissDelKeyTipLsKey) === 'y',
193
- tabsHeight: 36
193
+ tabsHeight: 36,
194
+
195
+ // widgets
196
+ widgets: [],
197
+ widgetInstances: [],
198
+ // move item
199
+ openMoveModal: false,
200
+ moveItem: null,
201
+ moveItemIsGroup: false
194
202
  }
195
203
  }
@@ -91,9 +91,7 @@ export default Store => {
91
91
  ) {
92
92
  return store.hideSettingModal()
93
93
  }
94
- store.storeAssign({
95
- settingTab: settingMap.setting
96
- })
94
+ store.settingTab = settingMap.setting
97
95
  store.setSettingItem(getInitItem([], settingMap.setting))
98
96
  store.openSettingModal()
99
97
  }
@@ -24,6 +24,7 @@ import transferHistoryExtend from './transfer-history'
24
24
  import batchInputHistory from './batch-input-history'
25
25
  import transferExtend from './transfer-list'
26
26
  import addressBookmarkExtend from './address-bookmark'
27
+ import widgetsExtend from './widgets'
27
28
  import isColorDark from '../common/is-color-dark'
28
29
  import { getReverseColor } from '../common/reverse-color'
29
30
  import { uniq } from 'lodash-es'
@@ -295,5 +296,6 @@ transferHistoryExtend(Store)
295
296
  batchInputHistory(Store)
296
297
  transferExtend(Store)
297
298
  addressBookmarkExtend(Store)
299
+ widgetsExtend(Store)
298
300
 
299
301
  export const StateStore = Store
@@ -0,0 +1,59 @@
1
+ /**
2
+ * widgets related functions
3
+ */
4
+
5
+ import {
6
+ message
7
+ } from 'antd'
8
+ import {
9
+ settingMap
10
+ } from '../common/constants'
11
+ import getInitItem from '../common/init-setting-item'
12
+
13
+ export default Store => {
14
+ Store.prototype.listWidgets = async () => {
15
+ return window.pre.runGlobalAsync('listWidgets')
16
+ }
17
+
18
+ Store.prototype.runWidget = async (widgetId, config) => {
19
+ return window.pre.runGlobalAsync('runWidget', widgetId, config)
20
+ }
21
+
22
+ Store.prototype.deleteWidgetInstance = (instanceId) => {
23
+ const {
24
+ widgetInstances
25
+ } = window.store
26
+ const index = widgetInstances.findIndex(w => w.id === instanceId)
27
+ if (index > -1) {
28
+ widgetInstances.splice(index, 1)
29
+ }
30
+ }
31
+
32
+ Store.prototype.stopWidget = async (instanceId) => {
33
+ const {
34
+ store
35
+ } = window
36
+ const r = await window.pre.runGlobalAsync('stopWidget', instanceId)
37
+ .catch(err => {
38
+ console.error('stopWidget error', err)
39
+ message.error(window.translate('stopWidgetFailed') + ': ' + err.message)
40
+ return false
41
+ })
42
+ if (r) {
43
+ store.deleteWidgetInstance(instanceId)
44
+ }
45
+ }
46
+
47
+ Store.prototype.runWidgetFunc = async (instanceId, funcName, ...args) => {
48
+ return window.pre.runGlobalAsync('runWidgetFunc', instanceId, funcName, ...args)
49
+ }
50
+
51
+ Store.prototype.openWidgetsModal = () => {
52
+ const {
53
+ store
54
+ } = window
55
+ store.setSettingItem(getInitItem([], settingMap.widgets))
56
+ store.settingTab = settingMap.widgets
57
+ store.openSettingModal()
58
+ }
59
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electerm/electerm-react",
3
- "version": "2.3.126",
3
+ "version": "2.3.136",
4
4
  "description": "react components src for electerm",
5
5
  "main": "./client/components/main/main.jsx",
6
6
  "license": "MIT",