Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vue completer didn't work #8

Closed
Karmenzind opened this issue Oct 16, 2019 · 10 comments
Closed

Vue completer didn't work #8

Karmenzind opened this issue Oct 16, 2019 · 10 comments

Comments

@Karmenzind
Copy link

Karmenzind commented Oct 16, 2019

env

vls version: 0.0.62 (installed with npm install -g --production)
neovim: NVIM v0.4.0-1809-ge3e0574cb

problem

Neither completer or goto command worked.

detail

Running vls --stdio from the directory where I started vim just blocked.

And these are logs after setting let g:ycm_keep_logfiles = 1 let g:ycm_log_level = 'debug':

vuecompleter_xxx.log: empty
ycm_xxx.log:

2019-10-16 15:28:29,511 - ERROR - HTTPConnectionPool(host='127.0.0.1', port=41791): Max retries exceeded with url: /ready (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f968d89b9e8>: Failed to establish a new connection: [Errno 111] Connection refused',))

ycmd_xxx_stdout_xxx.log:

serving on http://localhost.localdomain:41791

ycmd_xxx_stderr_xxx.log:

2019-10-16 15:28:29,551 - DEBUG - Global extra conf not loaded or no function YcmCorePreload
2019-10-16 15:28:29,613 - INFO - Received ready request
2019-10-16 15:28:29,632 - INFO - Received event notification
2019-10-16 15:28:29,632 - DEBUG - Event name: BufferVisit
2019-10-16 15:28:29,633 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:29,635 - INFO - Received event notification
2019-10-16 15:28:29,635 - DEBUG - Event name: FileReadyToParse
2019-10-16 15:28:29,635 - INFO - Adding buffer identifiers for file: /home/qk/Workspace/stability/vue/branch/v0.0.1/1
2019-10-16 15:28:29,636 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:29,746 - INFO - Received filetype completion available request
2019-10-16 15:28:29,746 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:33,225 - INFO - Received event notification
2019-10-16 15:28:33,225 - DEBUG - Event name: BufferUnload
2019-10-16 15:28:33,226 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:33,626 - INFO - Received event notification
2019-10-16 15:28:33,628 - DEBUG - Event name: BufferVisit
2019-10-16 15:28:33,810 - INFO - Received event notification
2019-10-16 15:28:33,811 - DEBUG - Event name: FileReadyToParse
2019-10-16 15:28:33,811 - INFO - Adding buffer identifiers for file: /home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue
2019-10-16 15:28:33,858 - DEBUG - No Settings function defined in /home/qk/.vim/.ycm_extra_conf.py
2019-10-16 15:28:33,858 - INFO - Starting vueCompleter: ['/usr/local/bin/vls']
2019-10-16 15:28:33,863 - INFO - vueCompleter started
2019-10-16 15:28:33,863 - DEBUG - TX: Sending message: b'Content-Length: 379\r\n\r\n{"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"completion":{"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}}}},"initializationOptions":{},"processId":15100,"rootPath":"/home/qk/Workspace/stability/vue/branch/v0.0.1","rootUri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1"}}'
2019-10-16 15:28:33,949 - INFO - Received filetype completion available request
2019-10-16 15:28:34,856 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Loaded bundled typescript@3.6.4."}}'
2019-10-16 15:28:34,887 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Vetur initialized"}}'
2019-10-16 15:28:34,887 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"textDocumentSync":1,"completionProvider":{"resolveProvider":true,"triggerCharacters":[".",":","<","\\"","\'","/","@","*"]},"signatureHelpProvider":{"triggerCharacters":["("]},"documentFormattingProvider":false,"hoverProvider":true,"documentHighlightProvider":true,"documentLinkProvider":{"resolveProvider":false},"documentSymbolProvider":true,"definitionProvider":true,"referencesProvider":true,"codeActionProvider":true,"colorProvider":true}}}'
2019-10-16 15:28:34,887 - INFO - Language server requires sync type of Full
2019-10-16 15:28:34,887 - DEBUG - vue: Server declares trigger characters: ['.', ':', '<', '"', "'", '/', '@', '*']
2019-10-16 15:28:34,887 - INFO - vue: Using trigger characters for semantic triggers: .,:,<,",',/,@,*
2019-10-16 15:28:34,888 - DEBUG - TX: Sending notification: b'Content-Length: 52\r\n\r\n{"jsonrpc":"2.0","method":"initialized","params":{}}'
2019-10-16 15:28:34,888 - DEBUG - TX: Sending notification: b'Content-Length: 86\r\n\r\n{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{}}}'
2019-10-16 15:28:34,888 - DEBUG - Refreshing file /home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue: State is Open/action Open
2019-10-16 15:28:34,889 - DEBUG - TX: Sending notification: b'Content-Length: 103782\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"vue","text":"<template>\\n  <span class=\\"productMonitor\\" :style=\\"{padding:0,margin:0,marginLeft:type==\'text\' ? \'0px\':0}\\">\\n    <el-button v-if=\\"type==\'text\'\\" type=\\"text\\" :disabled=\\"testObjSelDataList.length <= 0\\" @click.native=\\"getConfigMonitor(productData)\\">\\n      <font-awesome-icon title=\\"\\u76d1\\u63a7\\u914d\\u7f6e\\" :icon=\\"[\'fas\', \'cog\']\\"/> \\n     \\u76d1\\u63a7\\u914d\\u7f6e\\n    </el-button>\\n    <el-button v-else-if=\\"type==\'normal\'\\" :disabled=\\"testObjSelDataList.length <= 0\\" @click.native=\\"getConfigMonitor(productData)\\">\\n      <font-awesome-icon title=\\"\\u76d1\\u63a7\\u914d\\u7f6e\\" :icon=\\"[\'fas\', \'cog\']\\"/>\\n      \\u76d1\\u63a7\\u914d\\u7f6e \\n    </el-button>\\n    <div v-else @click=\\"getConfigMonitor(productData)\\">\\n        \\u76d1\\u63a7\\u914d\\u7f6e \\n    </div>\\n    <el-dialog \\n      :title=\\"monitorTitle\\"\\n      :show-close=\\"false\\"\\n      :close-on-click-modal=\\"false\\"\\n      :close-on-press-escape=\\"false\\"\\n      :append-to-body=\\"true\\"\\n      width=\\"60%\\"\\n      :visible.sync=\\"monitorSetModel\\">\\n      <div class=\\"productMonitor-dialog\\">\\n      <el-row\\n        v-show=\\"!isViewKeyDialogShow\\">\\n        <el-form size=\\"small\\" class=\\"demo-form-inline\\">\\n          <el-form-item label=\\"\\u662f\\u5426\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff1a\\">\\n            <el-switch\\n              @change=\\"handelSyncConfigSwitch\\"\\n              v-model=\\"syncConfigSwitch\\">\\n            </el-switch>\\n            <el-tooltip \\n              class=\\"item\\" \\n              effect=\\"dark\\" \\n              content=\\"\\u5f53\\u9009\\u62e9\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u4fe1\\u606f\\u7684\\u65f6\\u5019\\uff0c\\u8bf7\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u9009\\u62e9\\u540e\\u4e0b\\u9762\\u5c55\\u793a\\u7684\\u662f\\u8981\\u540c\\u6b65\\u7684\\u8bbe\\u5907\\u7684\\u914d\\u7f6e\\uff1b\\u5982\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u5219\\u6309\\u7167\\u4e0b\\u9762\\u7684\\u914d\\u7f6e\\u8fdb\\u884c\\u8bbe\\u7f6e\\uff01\\" \\n              placement=\\"right\\">\\n              <i class=\\"el-icon-question\\" style=\'color:#e6a23c;margin-left:5px;\'></i>  \\n            </el-tooltip>\\n            <el-select \\n              v-model=\\"syncBindValue\\" \\n              v-show=\\"syncConfigSwitch\\" \\n              filterable\\n              clearable\\n              :loading=\\"configLoading\\"\\n              :loading-text=\\"configLoadingText\\"\\n              placeholder=\\"\\u8bf7\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u652f\\u6301\\u6309\\u7167\\u8bbe\\u5907\\u540d\\u79f0\\u8fdb\\u884c\\u641c\\u7d22\\"\\n              @change=\\"getDeviceMonitorConfig\\"\\n              @visible-change=\\"getSyncNeedData\\"\\n              style=\\"margin-left:25px; width:400px\\">\\n                <el-option\\n                  v-for=\\"item in syncNeedData\\"\\n                  :key=\\"item.tlabObjectId\\"\\n                  :label=\\"item.name\\"\\n                  :value=\\"item\\"\\n                  >\\n                  <span style=\\"float: left\\">\\u540d\\u79f0: {{ item.name }}</span>\\n                  <span style=\\"float: right; color: #8492a6; font-size: 13px\\">IP: {{ item.ip }}</span>\\n              </el-option>\\n            </el-select>\\n          </el-form-item>\\n        </el-form>\\n        <el-form size=\\"small\\" class=\\"demo-form-inline\\">\\n          <el-form-item label=\\"\\u90ae\\u4ef6\\u901a\\u77e5\\uff1a\\">\\n            <span style=\\"font-size:10px;color:#e6a23c;\\">\\uff08\\u7ea2\\u8272 <span style=\\"color:red\\">*</span> \\u53f7\\u4e3a\\u8be5\\u8fed\\u4ee3\\u4efb\\u52a1\\u7684\\u6210\\u5458\\uff09</span>\\n            <user-select-form \\n              @changeSelected=\\"getManager\\"\\n              :shareData=\\"email_list\\" \\n              :shareDataLabel=\\"email_list_map\\"\\n              :sourceType=\\"sourceType\\">\\n            </user-select-form>\\n          </el-form-item>\\n        </el-form>\\n        <el-checkbox-group v-model=\\"checkList\\" style=\\"margin-bottom:15px;\\" @change=\\"getTypes\\">\\n          <el-checkbox label=\\"\\u57fa\\u672c\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u98ce\\u6247\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7535\\u6e90\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7f51\\u7edc\\u72b6\\u6001\\"></el-checkbox>\\n          <el-checkbox label=\\"GPU\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"></el-checkbox>\\n          <el-checkbox label=\\"core\\u6587\\u4ef6\\"></el-checkbox>\\n        </el-checkbox-group>\\n        <el-tabs  v-model=\\"monitorActiveName\\"  @tab-click=\\"tagClick\\">\\n          <el-tab-pane label=\\"\\u57fa\\u672c\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u57fa\\u672c\\u76d1\\u63a7\') != -1\\" name=\\"basicMonitor\\">\\n            <el-table \\n              class=\\"monitorTable\\"\\n              :data=\\"monitorData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"350\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100px\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch \\n                    :title=\\"scope.row.category_display == \'\\u65ad\\u7f51\\u76d1\\u63a7\'?\'\\u7981\\u6b62\\u5173\\u95ed\\u65ad\\u7f51\\u76d1\\u63a7\':\'\'\\"\\n                    :disabled=\\"scope.row.category_display == \'\\u65ad\\u7f51\\u76d1\\u63a7\'\\"\\n                    v-model=\\"scope.row.is_open\\"\\n                    @change=\\"handelBasicOpenMonitor($event,scope.row)\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u9608\\u503c\\">\\n                <template slot-scope=\\"scope\\">\\n                  <span v-if=\\"scope.row.category != \'deviceReboot\' && scope.row.category != \'disconnect_net\'\\">\\n                    \\u4f7f\\u7528\\u7387 > \\n                    <el-input-number\\n                    v-model=\\"scope.row.threshold.max_value\\"\\n                    :disabled=\\"!scope.row.is_open\\"\\n                    title=\\"\\u8bf7\\u5148\\u5f00\\u542f\\u76d1\\u63a7\\"\\n                    size=\\"small\\" \\n                    style=\\"width:80px\\" \\n                    :controls=\\"false\\"\\n                    :min=\\"1\\"\\n                    :max=\\"100\\">\\n                    </el-input-number> % \\u6216\\n                    \\u4f7f\\u7528\\u7387 &lt;\\n                    <el-input-number\\n                    v-model=\\"scope.row.threshold.min_value\\"\\n                    :disabled=\\"!scope.row.is_open\\"\\n                    title=\\"\\u8bf7\\u5148\\u5f00\\u542f\\u76d1\\u63a7\\"\\n                    size=\\"small\\" \\n                    style=\\"width:80px\\" \\n                    :controls=\\"false\\"\\n                    :min=\\"0\\"\\n                    :max=\\"100\\">\\n                    </el-input-number> %\\n                  </span>\\n                  <el-select \\n                    v-model=\\"scope.row.threshold.keyword\\" \\n                    size=\\"mini\\"\\n                    style=\\"width:80%\\"\\n                    v-if=\\"scope.row.is_open && scope.row.category == \'log\'\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                  <el-tooltip \\n                    class=\\"item\\" effect=\\"dark\\" \\n                    content=\\"\\u5982\\u9700\\u540c\\u65f6\\u8bbe\\u7f6e\\u5f00\\u542f\\u547d\\u4ee4\\u548c\\u5173\\u95ed\\u547d\\u4ee4\\uff0c\\u8bf7\\u5148\\u8f93\\u5165\\u65e5\\u5fd7\\u5173\\u95ed\\u7684\\u547d\\u4ee4\\uff0c\\u518d\\u8f93\\u5165\\u65e5\\u5fd7\\u5f00\\u542f\\u7684\\u547d\\u4ee4\\" \\n                    placement=\\"top\\">\\n                    <span>\\n                    <el-select \\n                      v-model=\\"scope.row.threshold.cmd\\" \\n                      size=\\"mini\\"\\n                      style=\\"width:80%;margin-top:5px;\\"\\n                      v-if=\\"scope.row.is_open && scope.row.category == \'log\'\\"\\n                      remote default-first-option multiple filterable allow-create\\n                      placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u547d\\u4ee4\\">\\n                    </el-select>\\n                    </span>\\n                  </el-tooltip>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setBasicMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u5b9e\\u65f6\\u76d1\\u63a7\') != -1\\" name=\\"timeMonitor\\">\\n            <el-table \\n              class=\\"timeMonitorTable\\"\\n              :data=\\"timeMonitorData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"170\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100%\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch\\n                    v-model=\\"scope.row.is_open\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u64cd\\u4f5c\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"downMonitorLog(scope.row.category)\\">\\n                    <font-awesome-icon title=\\"\\u4e0b\\u8f7d\\" :icon=\\"[\'fas\', \'download\']\\"/> \\u4e0b\\u8f7d\\n                  </el-button>\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"dumpLink(\'monitor\')\\">\\n                    <font-awesome-icon title=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\u67e5\\u770b\\" :icon=\\"[\'fas\', \'chart-area\']\\"/> \\u5b9e\\u65f6\\u76d1\\u63a7\\u67e5\\u770b\\n                  </el-button>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <el-alert type=\\"warning\\" title=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\u4e3a\\u5b9a\\u5236\\u9700\\u8981\\uff0c\\u4f7f\\u7528\\u8be5\\u529f\\u80fd\\u524d\\u8bf7\\u6ce8\\u610f\\u4ee5\\u4e0b\\u51e0\\u70b9:\\" :closable=\\"false\\" style=\\"width:100%;white-space:normal;\\" show-icon simple>\\n              <span style=\\"color:#c29d0b\\">\\n                1. \\u76d1\\u63a7\\u6570\\u636e\\u9700\\u8981\\u5173\\u95ed\\u76d1\\u63a7\\u540e\\u624d\\u80fd\\u4e0b\\u8f7d\\uff1b <br>\\n                2. \\u5b9e\\u65f6\\u76d1\\u63a7CPU\\u76d1\\u63a7\\u95f4\\u9694\\u4e3a1\\u79d2\\u4e00\\u6b21\\uff0c\\u5185\\u5b58\\u4e3a3\\u79d2\\u4e00\\u6b21\\uff1b <br>\\n                3. \\u5b9e\\u65f6\\u76d1\\u63a7\\u8bbe\\u7f6e\\u4e86\\u76d1\\u63a7\\u6301\\u7eed\\u65f6\\u95f4\\uff0c\\u76ee\\u524d\\u4e3a20\\u5206\\u949f\\uff0c20\\u5206\\u949f\\u540e\\u76d1\\u63a7\\u4f1a\\u81ea\\u52a8\\u5173\\u95ed\\uff1b            \\n              </span>\\n            </el-alert>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setTimeMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u5185\\u5b58\\u6cc4\\u9732\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\') != -1\\" name=\\"outOfMem\\">\\n            <el-table \\n              class=\\"outOfMemTable\\"\\n              :data=\\"outOfMemData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"350\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100px\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch\\n                    v-model=\\"scope.row.is_open\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u95f4\\u9694\\" width=\\"185px\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-input-number \\n                    style=\\"width:130px;\\"\\n                    v-model=\\"scope.row.interval\\"\\n                    :min=\\"1\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694\\">\\n                  </el-input-number> \\u79d2\\n                </template>\\n              </el-table-column >\\n              <el-table-column label=\\"\\u8bbe\\u5907\\u578b\\u53f7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-select v-model=\\"scope.row.device_model\\" placeholder=\\"\\u8bf7\\u9009\\u62e9\\">\\n                    <el-option\\n                      v-for=\\"item in deviceOptions\\"\\n                      :key=\\"item\\"\\n                      :label=\\"item\\"\\n                      :value=\\"item\\">\\n                    </el-option>\\n                  </el-select>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u64cd\\u4f5c\\">\\n                <template>\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"dumpLink(\'outOfMem\')\\">\\n                    <font-awesome-icon title=\\"\\u76d1\\u63a7\\u67e5\\u770b\\" :icon=\\"[\'fas\', \'chart-area\']\\"/> \\u76d1\\u63a7\\u67e5\\u770b\\n                  </el-button>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setOutOfMemMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u8fdb\\u7a0b\\u76d1\\u63a7\') != -1\\" name=\\"processMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"processref\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelProcessSwitch\\"\\n                  v-model=\\"processSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"processSwitch\\" label=\\"\\u8fdb\\u7a0b\\u540d\\u79f0\\uff1a\\">\\n                <el-col :span=\\"20\\" >\\n                  <el-select \\n                    style=\\"width: 80%;\\"\\n                    v-model=\\"processNames\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8f93\\u5165\\u8fdb\\u7a0b\\u540d\\u79f0\\">\\n                  </el-select>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"deleteProcess\\">\\n                    \\u6e05\\u7a7a\\u8fdb\\u7a0b\\n                  </el-button>\\n                </el-col>\\n              </el-form-item>\\n              <el-form-item v-if=\\"processSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"processInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setProcessMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u98ce\\u6247\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u98ce\\u6247\\u76d1\\u63a7\') != -1\\" name=\\"fanMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"fanRef\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelFanSwitch\\"\\n                  v-model=\\"fanSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"fanSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"fanInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setFanMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u6e29\\u5ea6\\u76d1\\u63a7\') != -1\\" name=\\"temperatureMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"temperatureRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelTemperatureSwitch\\"\\n                  v-model=\\"temperatureSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"temperatureSwitch\\" label=\\"\\u9608\\u503c\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"temperatureValue\\"\\n                    :min=\\"1\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u9608\\u503c\\">\\n                  </el-input-number> \\u6444\\u6c0f\\u5ea6\\n                </el-col>\\n              </el-form-item>\\n              <el-form-item v-if=\\"temperatureSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"temperatureInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setTemperatureMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u7535\\u6e90\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u7535\\u6e90\\u76d1\\u63a7\') != -1\\" name=\\"powerMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"powerRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelPowerSwitch\\"\\n                  v-model=\\"powerSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"powerSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"powerInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setPowerMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u7f51\\u7edc\\u72b6\\u6001\\" v-if=\\"checkList.indexOf(\'\\u7f51\\u7edc\\u72b6\\u6001\') != -1\\" name=\\"disNetworkMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"disNetworkRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelDisNetworkSwitch\\"\\n                  v-model=\\"disNetworkSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"disNetworkSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"disNetworkInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setDisNetworkMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"GPU\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'GPU\\u76d1\\u63a7\') != -1\\" name=\\"gpuMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"gpuRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelGpuSwitch\\"\\n                  v-model=\\"gpuSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"gpuSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"gpuInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setGpuMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\" v-if=\\"checkList.indexOf(\'\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\') != -1\\" name=\\"systemNetworkMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"systemNetworkRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelSystemNetworkSwitch\\"\\n                  v-model=\\"systemNetworkSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"systemNetworkSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"systemNetworkInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setSystemNetworkMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1\\" name=\\"logMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"logref\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u8bb0\\u5f55\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelSwitch\\"\\n                  v-model=\\"logSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"logSwitch\\" label=\\"\\u5b9e\\u65f6\\u90ae\\u4ef6\\uff1a\\">\\n                <el-switch\\n                  \\n                  v-model=\\"notifyImmediately\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"logSwitch\\" label=\\"\\u76d1\\u63a7\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-col :span=\\"20\\" >\\n                  <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"keyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                  <el-tooltip class=\\"item\\" effect=\\"dark\\" content=\\"\\u5f53\\u6240\\u8bbe\\u7f6e\\u7684\\u5173\\u952e\\u5b57\\u5728\\u8bbe\\u5907\\u4e32\\u53e3\\u65e5\\u5fd7\\u4e2d\\u51fa\\u73b0\\u540e\\uff0c\\u7cfb\\u7edf\\u4f1a\\u81ea\\u52a8\\u63a8\\u9001\\u544a\\u8b66\\u90ae\\u4ef6\\u7ed9\\u7528\\u6237\\" placement=\\"top-start\\">\\n                    <i class=\\"el-icon-question\\" style=\'color:#e6a23c;margin-left:5px;\'></i>  \\n                  </el-tooltip>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"viewKeys\\">\\n                    \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                  </el-button>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"deleteLogKeys\\">\\n                    \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                  </el-button>\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div  v-if=\\"logSwitch\\">\\n              <el-table\\n                height=\\"48\\"\\n                style=\\"width: 100%;\\">\\n                <el-table-column width=\\"150\\" label=\\"\\u5173\\u952e\\u5b57\\" :render-header=\\"renderHeader\\"></el-table-column>\\n                <el-table-column width=\\"328\\" label=\\"\\u6267\\u884c\\u547d\\u4ee4\\" :render-header=\\"renderHeaderCmd\\"></el-table-column>\\n                <el-table-column label=\\"\\u6267\\u884c\\u6b21\\u6570\\"></el-table-column>\\n                <el-table-column label=\\"\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\\"></el-table-column>\\n                <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"50\\"></el-table-column >\\n              </el-table>\\n              <el-table\\n                :show-header=\\"false\\"\\n                :data=\\"cmdsItem\\"\\n                :span-method=\\"objectSpanMethod\\"\\n                style=\\"width: 100%\\">\\n                <el-table-column width=\\"150\\" prop=\\"keyword\\"  label=\\"\\u5173\\u952e\\u5b57\\">\\n                  <template slot-scope=\\"scope\\"  >\\n                    <el-select  clearable v-model=\\"scope.row.keyword\\" placeholder=\\"\\u8bf7\\u9009\\u62e9\\">\\n                      <el-option :key=\\"i\\" :label=\\"item\\" :value=\\"item\\" v-for=\\"(item,i) in keyword\\"></el-option>\\n                    </el-select>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column width=\\"328\\" prop=\\"cmd\\"  label=\\"\\u6267\\u884c\\u547d\\u4ee4\\">\\n                  <template slot-scope=\\"scope\\">\\n                    <div  class=\\"cmd-select\\">\\n                    <el-select\\n                        v-model=\\"scope.row.cmd\\" \\n                        size=\\"mini\\"\\n                        remote default-first-option multiple filterable allow-create\\n                        placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u547d\\u4ee4\\">\\n                    </el-select>\\n                    </div>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column   prop=\\"count\\"  label=\\"\\u6267\\u884c\\u6b21\\u6570\\">\\n                  <template slot-scope=\\"scope\\" >\\n                    <el-input-number  :min=\\"1\\"  :controls=\\"false\\"\\n                        v-model=\\"scope.row.count\\" placeholder=\\"\\u6267\\u884c\\u6b21\\u6570(>0)\\">\\n                    </el-input-number>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column  prop=\\"interval\\" label=\\"\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\\">\\n                  <template slot-scope=\\"scope\\" >\\n                    <el-input-number  :min=\\"1\\"  :controls=\\"false\\"\\n                        v-model=\\"scope.row.interval\\" placeholder=\\"\\u89e6\\u53d1\\u65f6\\u95f4(>0)\\">\\n                    </el-input-number>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"70\\">\\n                <template slot-scope=\\"scope\\" >\\n                  <a-icon type=\\"plus-circle\\"\\n                      theme=\\"twoTone\\"\\n                      twoToneColor=\\"#3598dc\\"\\n                      style=\\"font-size: 20px;cursor: pointer;\\"\\n                      @click=\\"addCmdData(scope)\\"\\n                    />\\n                   <a-icon type=\\"minus-circle\\" v-if=\\"cmdsItem.length>1\\"\\n                    theme=\\"twoTone\\"\\n                    twoToneColor=\\"#f56c6c\\"\\n                    style=\\"font-size: 20px;cursor: pointer;\\"\\n                    @click=\\"deleteCmdData(scope.$index)\\"\\n                   />\\n                </template>\\n                </el-table-column >\\n              </el-table>\\n              <div style=\\"text-align: center;margin-top: 5px;\\">\\n              <a-icon type=\\"plus-circle\\"\\n                      theme=\\"twoTone\\"\\n                      twoToneColor=\\"#3598dc\\"\\n                      style=\\"font-size: 30px;cursor: pointer;\\"\\n                      @click=\\"addCmdDataNew\\"\\n                    />\\n              </div>\\n            </div>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveChanelLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"  v-if=\\"checkList.indexOf(\'\\u8fdc\\u7a0b\\u65e5\\u5fd7\') != -1\\" name=\\"remoteMonitor\\">\\n            <el-form   label-position=\\"right\\" label-width=\\"118px\\" ref=\\"remoteMonitor\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"sysLogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n               <el-form-item v-if=\\"sysLogSwitch\\" label=\\"\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"sysLogKeyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                </el-select>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"viewKeys\\">\\n                  \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                </el-button>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"deleteRemoteKeys\\">\\n                  \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                </el-button>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveRemotesLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"  v-if=\\"checkList.indexOf(\'\\u7cfb\\u7edf\\u65e5\\u5fd7\') != -1\\" name=\\"sysLogMonitor\\">\\n            <el-form   label-position=\\"right\\" label-width=\\"118px\\" ref=\\"sysMonitor\\"   size=\\"mini\\" >\\n             <el-form-item label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"mtlogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"mtlogSwitch\\" label=\\"\\u65e5\\u5fd7\\u76ee\\u5f55\\uff1a\\">\\n                <el-input v-model=\\"mtlogPath\\" size=\\"small\\" style=\\"width: 70%;\\"></el-input>\\n              </el-form-item>\\n              <el-form-item v-if=\\"mtlogSwitch\\" label=\\"\\u65e5\\u5fd7\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"mtkeyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"viewKeys\\">\\n                  \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                </el-button>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"deleteSystemKeys\\">\\n                  \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                </el-button>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveSystemLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"core\\u6587\\u4ef6\\"  v-if=\\"checkList.indexOf(\'core\\u6587\\u4ef6\') != -1\\" name=\\"coreMonitor\\">\\n            <el-form   :model=\\"coreForm\\" label-position=\\"right\\" label-width=\\"118px\\" ref=\\"coreMonitor\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"core\\u6587\\u4ef6\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"coreForm.coreLogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"coreForm.coreLogSwitch\\" label=\\"core\\u6587\\u4ef6\\u8def\\u5f84\\uff1a\\">\\n                <el-input v-model=\\"coreForm.corelogPath\\" size=\\"small\\" style=\\"width: 70%;\\"></el-input>\\n              </el-form-item>\\n              <el-form-item v-if=\\"coreForm.coreLogSwitch\\" label=\\"\\u76f8\\u5173\\u8054\\u6587\\u4ef6\\uff1a\\">\\n                  <div  v-if=\\"coreForm.coreLogSwitch\\">\\n                    <el-table\\n                      height=\\"48\\"\\n                      style=\\"width: 100%;\\">\\n                      <el-table-column label=\\"\\u5f02\\u5e38\\u6587\\u4ef6\\u76ee\\u5f55\\"></el-table-column>\\n                      <el-table-column label=\\"\\u5339\\u914d\\u6587\\u4ef6\\u540d\\"></el-table-column>\\n                      <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"80\\"></el-table-column >\\n                    </el-table>\\n                    <el-table\\n                      :show-header=\\"false\\"\\n                      :data=\\"coreForm.coreItems\\"\\n                      style=\\"width: 100%\\">\\n                      <el-table-column  prop=\\"path\\"  label=\\"\\u5f02\\u5e38\\u6587\\u4ef6\\u76ee\\u5f55\\">\\n                        <template slot-scope=\\"scope\\"  >\\n                          <el-input v-model=\\"scope.row.path\\" size=\\"small\\" style=\\"width: 90%;\\"></el-input>\\n                        </template>\\n                      </el-table-column>\\n                      <el-table-column  prop=\\"keywords\\"  label=\\"\\u5339\\u914d\\u6587\\u4ef6\\u540d\\">\\n                        <template slot-scope=\\"scope\\"  >\\n                          <el-select \\n                              style=\\"width: 90%;\\"\\n                              v-model=\\"scope.row.keywords\\" \\n                              size=\\"small\\"\\n                              remote default-first-option multiple filterable allow-create\\n                              placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u76f8\\u5173\\u5339\\u914d\\u6587\\u4ef6\\u540d\\">\\n                          </el-select>\\n                        </template>\\n                      </el-table-column>\\n                      <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"80\\">\\n                        <template slot-scope=\\"scope\\" >\\n                          <a-icon type=\\"plus-circle\\"\\n                            theme=\\"twoTone\\"\\n                            twoToneColor=\\"#3598dc\\"\\n                            style=\\"font-size: 20px;cursor: pointer;\\"\\n                            @click=\\"addCoreItem\\"\\n                          />\\n                          <a-icon type=\\"minus-circle\\" v-if=\\"coreForm.coreItems.length>1\\"\\n                            theme=\\"twoTone\\"\\n                            twoToneColor=\\"#f56c6c\\"\\n                            style=\\"font-size: 20px;cursor: pointer;\\"\\n                            @click=\\"deleteCoreItem(scope.$index)\\"\\n                          />\\n                        </template>\\n                      </el-table-column >\\n                    </el-table>\\n                  </div>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveCoreLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n        </el-tabs>\\n      </el-row>\\n      <el-row \\n        v-show=\\"isViewKeyDialogShow\\">\\n        <view-keywords\\n        :viewKeywordsList=\\"viewKeywordsList\\"\\n        :alreadyKeyword=\\"keyword\\"\\n        :isViewKeyDialogShow=\\"isViewKeyDialogShow\\"\\n        @listenToChildEvent=\\"setKeywordsFromSelect\\">\\n        </view-keywords>\\n      </el-row>\\n      <div v-if=\\"isViewKeyDialogShow\\" slot=\\"footer\\" class=\\"dialog-footer\\">\\n        <el-divider></el-divider>\\n        <el-button @click=\\"closeViewKeywordsDialog\\">\\u8fd4 \\u56de</el-button>\\n        <el-button type=\\"danger\\" @click=\\"setKeywords\\">\\u786e \\u5b9a</el-button>\\n        <el-button type=\\"danger\\" @click=\\"addKeyword\\">\\u6dfb\\u52a0\\u5173\\u952e\\u5b57</el-button>\\n        <execute-list-dialog ref=\\"executeList\\" :activeName=\\"activeName\\"></execute-list-dialog>\\n      </div>\\n      <div v-else slot=\\"footer\\" class=\\"dialog-footer\\">\\n        <el-divider></el-divider>\\n        <el-button @click=\\"closeMonitorDialog\\" class=\\"monitor-close\\">\\u5173 \\u95ed</el-button>\\n      </div>\\n      </div>\\n    </el-dialog>\\n    \\n  </span>\\n</template>\\n<script>\\nimport api from \'@/api\';\\nimport { mapGetters  } from \'vuex\'\\nimport UserSelectForm from \'@/components/common/userSelectForm\'\\nimport axios from \'axios\'\\nimport util from \'@/util\';\\nimport log from \'../../util/util.log\';\\nimport viewKeywords from \\"@/components/dialog/viewKeywords\\";\\nimport executeListDialog from \'@/components/dialog/executeListDialog\';\\n\\nexport default {\\n  name: \'ProductMonitor\',\\n  props:[\'type\',\'productData\', \'sourceType\'],\\n  computed: {\\n    ...mapGetters([\'userInfo\',\'testObjSelDataList\'])\\n  },\\n  components: {\\n    UserSelectForm,\\n    viewKeywords,\\n    executeListDialog\\n  },\\n  data(){\\n  \\treturn{\\n      checkList: [],\\n      allCheckList: [\\"\\u57fa\\u672c\\u76d1\\u63a7\\", \\"\\u5b9e\\u65f6\\u76d1\\u63a7\\", \\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\", \\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\", \\"\\u98ce\\u6247\\u76d1\\u63a7\\",\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\",\\"\\u7535\\u6e90\\u76d1\\u63a7\\",\\"\\u7f51\\u7edc\\u72b6\\u6001\\",\\"GPU\\u76d1\\u63a7\\",\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\",\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\",\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\",\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\",\\"core\\u6587\\u4ef6\\"],\\n      email_list:[],\\n      email_list_map:{},\\n      deviceOptions:[\'C20N\',\'B21\'],\\n      monitorActiveName:\'basicMonitor\',\\n      monitorSetModel:false,\\n      KeyWorldsBox:false,\\n      logData:{\\n        keyword:[],\\n        cmd:[]\\n      },\\n      monitorData:[],\\n      timeMonitorData:[],\\n      outOfMemData:[],\\n      loading:false,\\n      peojectId:this.$route.params.id,\\n      peojectUrl:process.env.KR_LINK,\\n      logSwitch:false,\\n      processSwitch: false,\\n      processNames: [],\\n      processInterval: 600,\\n      fanSwitch: false,\\n      fanInterval: 600,\\n      temperatureSwitch: false,\\n      temperatureValue: 90,\\n      temperatureInterval: 600,\\n      powerSwitch: false,\\n      powerInterval: 600,\\n      disNetworkSwitch: false,\\n      disNetworkInterval: 600,\\n      gpuSwitch: false,\\n      gpuInterval: 600,\\n      systemNetworkSwitch: false,\\n      systemNetworkInterval: 600,\\n      syncConfigSwitch: false,\\n      syncNeedData: [],\\n      syncBindValue: \'\',\\n      configLoading: false,\\n      configLoadingText: \\"\\u6b63\\u5728\\u83b7\\u53d6\\u60a8\\u7ba1\\u7406\\u548c\\u53c2\\u4e0e\\u7684\\u6b63\\u5728\\u8fdb\\u884c\\u4e2d\\u7684\\u9879\\u76ee\\u4e2d\\u7684\\u6240\\u6709\\u8bbe\\u5907\\uff0c\\u8bf7\\u7a0d\\u540e\\uff01\\",\\n      isViewKeyDialogShow: false,\\n      viewKeywordsList: [],\\n      isSentOffApi:null,\\n      keyword: [],\\n      selectKeyword: [],\\n      labelPosition:\'left\',\\n      monitorTitle: \\"\\u6279\\u91cf\\u76d1\\u63a7\\u914d\\u7f6e\\",\\n      batchFlag: true,\\n      showKeyRow: false,\\n      tableHerder:[\'\\u5173\\u952e\\u5b57\',\'\\u547d\\u4ee4\',\'\\u6267\\u884c\\u6b21\\u6570\',\'\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\'],\\n      cmdsItem:[\\n            {\\n              keyword:\'\',\\n              cmd:[],\\n              count:\'\',\\n              interval:\'\',\\n            }\\n      ],\\n      spanArr:[],\\n      contentSpanArr:[],\\n      pos:0,\\n      position:0,\\n      activeName:\\"second\\",\\n      mtlogSwitch:false,\\n      mtkeyword:[],\\n      mtlogPath:\'\',\\n      labelPosition:\'right\',\\n      sysLogSwitch:false,\\n      sysLogKeyword:[],\\n      coreForm:{\\n        coreLogSwitch:false,\\n        corelogPath:\'\',\\n        coreItems:[{\\n          keywords:\'\',\\n          path:\'\',\\n        }],\\n      },\\n      notifyImmediately:false\\n  \\t}\\n  },\\n  methods:{\\n    objectSpanMethod({ row, column, rowIndex, columnIndex }) {\\n      if(this.contentSpanArr.length==0){\\n        return\\n      }\\n      if (columnIndex === 0) {\\n        const _row = this.contentSpanArr[rowIndex];\\n        const _col = _row > 0 ? 1 : 0;\\n        return {\\n          rowspan: _row,\\n          colspan: _col\\n        };\\n      }\\n    },\\n\\n    addCmdData(scope){\\n      let cmdsItem = [...this.cmdsItem]\\n      let ix = scope.$index\\n      let keyword = scope.row.keyword\\n      cmdsItem.splice(ix+1,0,{\\n          keyword:keyword,\\n          cmd:\'\',\\n          count:\'\',\\n          interval:\'60\',\\n      })\\n      for(let i = ix;i >= 0; i--){\\n        if(this.contentSpanArr[i]>0){\\n          this.position = i\\n          break\\n        }\\n      }\\n      if(this.contentSpanArr[this.position]){\\n        this.contentSpanArr[this.position] += 1;\\n        this.contentSpanArr.splice(ix+1,0,0)\\n      }else{\\n        // \\u7b2c0\\u884c\\n        this.contentSpanArr[this.position] = 1\\n        this.contentSpanArr[this.position] += 1;\\n        this.contentSpanArr.splice(ix+1,0,0)\\n\\n      }\\n      this.cmdsItem = [...cmdsItem]\\n      \\n\\n    },\\n\\n    addCmdDataNew(){\\n      let cmdsItem = [...this.cmdsItem]\\n      cmdsItem.push({\\n          keyword:\'\',\\n          cmd:\'\',\\n          count:\'\',\\n          interval:\'60\',\\n      })\\n      this.position = this.cmdsItem.length\\n      this.contentSpanArr[this.position] = 1\\n      this.cmdsItem = [...cmdsItem]\\n    },\\n\\n    viewKeys(){\\n      this.viewKeywordsList = []\\n      let creator = this.userInfo.loginName\\n      api.logApi.getKeyword(creator).then(res=>{\\n        if(res.success){\\n          this.isViewKeyDialogShow = true\\n          // this.monitorSetModel = false\\n          for (let i in res.data){\\n            this.viewKeywordsList.push({\\n              _id: res.data[i]._id,\\n              name: res.data[i].name,\\n              describtion: res.data[i].describtion,\\n              product_line: res.data[i].product_line\\n            })\\n          }\\n        }else{\\n          this.$message.error(\\"\\u67e5\\u770b\\u5173\\u952e\\u5b57\\u5931\\u8d25: \\", res.msg)\\n        }\\n      })\\n    },\\n\\n    deleteLogKeys(){\\n      this.keyword = []\\n    },\\n\\n    deleteRemoteKeys(){\\n      this.sysLogKeyword = []\\n    },\\n\\n    deleteSystemKeys(){\\n      this.mtkeyword = []\\n    },\\n\\n    handelProcessSwitch(){\\n\\n    },\\n\\n    handelFanSwitch(){\\n\\n    },\\n    handelTemperatureSwitch(){\\n\\n    },\\n    handelPowerSwitch(){\\n\\n    },\\n    handelDisNetworkSwitch(){\\n\\n    },\\n    handelGpuSwitch(){\\n\\n    },\\n    handelSystemNetworkSwitch(){\\n\\n    },\\n    deleteProcess(){\\n      this.processNames = []\\n    },\\n\\n    closeViewKeywordsDialog(){\\n      this.selectKeyword = []\\n      this.isViewKeyDialogShow = false\\n    },\\n\\n    setKeywords(){\\n      this.isViewKeyDialogShow = false\\n\\n      for (let i in this.selectKeyword){\\n        if (!this.keyword.includes(this.selectKeyword[i])){\\n          if (this.monitorActiveName == \'logMonitor\'){\\n            this.keyword.push(this.selectKeyword[i])\\n          } else if (this.monitorActiveName == \'sysLogMonitor\'){\\n            this.mtkeyword.push(this.selectKeyword[i]) \\n          } else {\\n            this.sysLogKeyword.push(this.selectKeyword[i])  \\n          }\\n        }\\n      }\\n\\n      // this.keyword.push.apply(this.keyword, this.selectKeyword)\\n      this.selectKeyword = []\\n    },\\n\\n    showKeywordsDialog(){\\n      this.isViewKeyDialogShow = true\\n    },\\n\\n    setKeywordsFromSelect(data){\\n      for (let i in data){\\n        this.selectKeyword.push(data[i].name)\\n      }\\n    },\\n\\n    deleteCmdData(index){\\n      let cmdsItem = [...this.cmdsItem]\\n      let contentSpanArr = [...this.contentSpanArr]\\n      cmdsItem.splice(index, 1);\\n      if(contentSpanArr[index]==1){\\n        contentSpanArr.splice(index, 1)\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n      }\\n      if(contentSpanArr[index]==0){\\n        for(let i = index;i >= 0; i--){\\n          if(contentSpanArr[i]>0){\\n            // \\u5408\\u5e76\\u884c\\u6570\\u51cf\\u6389\\u540e\\u518d\\u5220\\u9664\\u6807\\u8bb0\\n            contentSpanArr[i] -= 1;\\n            contentSpanArr.splice(index, 1)\\n            break\\n          }\\n        }\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n\\n      }\\n      if(contentSpanArr[index]>1){\\n        contentSpanArr[index] = contentSpanArr[index]-1\\n        contentSpanArr[index+1] = contentSpanArr[index]\\n        contentSpanArr.splice(index, 1)\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n      }\\n\\n    },\\n\\n    handelTypeChange(e){\\n    },\\n\\n    handelSwitch(e){\\n    },\\n\\n    handelSyncConfigSwitch(e){\\n      this.syncConfigSwitch = e\\n    },\\n\\n    getDeviceMonitorConfig(){\\n      this.getConfigMonitor(this.syncBindValue, true)\\n    },\\n\\n    dealDatas(data){\\n      let testObjectDatas = [];\\n      if (data && data.length) {\\n        for (const d of data) {\\n          let rtbv = {};\\n          const { value } = d;\\n          Object.assign(rtbv, d);\\n          if (value && value.length && util.isJSON(value)){\\n            const row = JSON.parse(value);\\n            for (const tbv of row) {\\n              if (tbv.key !== \'name\') {\\n                rtbv[tbv.key] = tbv.value;\\n              }\\n            }\\n          }\\n          testObjectDatas.push(rtbv);\\n        }\\n      }\\n      this.syncNeedData = testObjectDatas\\n    },\\n\\n    getSyncNeedData(isVisible){\\n      if (isVisible){\\n        this.configLoading = true\\n        this.syncNeedData = []\\n        api.stDevice.getDeviceInfoList(this.userInfo.name).then(data=>{\\n          this.dealDatas(data)\\n        })\\n        this.configLoading = false\\n      }\\n    },\\n\\n    handleTabClick(e, isSyncFlag){\\n      let stId = \\"\\"\\n      let tlabId = \\"\\"\\n      if (!isSyncFlag) {\\n        if (this.testObjSelDataList.length > 1){\\n          return\\n        }\\n        stId = this.productData.id\\n        tlabId = this.productData.tlabTestObjectId\\n      } else {\\n        stId = this.syncBindValue.id\\n        tlabId = this.syncBindValue.tlabTestObjectId\\n      }\\n\\n      if(e[\'name\']==\\"logMonitor\\"){\\n        api.labApi.getLogCfg(stId, tlabId).then(res=>{\\n          if(res.success){\\n            let data = res.data\\n            if(data.state==\'on\'){\\n              this.isSentOffApi = true\\n              this.logSwitch = true\\n            }else{\\n              this.isSentOffApi = false\\n              this.logSwitch = false\\n              return         \\n            }\\n            if(data.hasOwnProperty(\'notifyImmediately\')){\\n              this.notifyImmediately = data.notifyImmediately\\n            }\\n            this.keyword = data.keyword\\n            let cmdsItem = data.project_info.cmdsItem\\n            let contentSpanArr = data.project_info.contentSpanArr\\n            if(contentSpanArr&&cmdsItem){\\n              if(contentSpanArr[0]==null||contentSpanArr.length!=cmdsItem.length){\\n                contentSpanArr = []\\n                for(let i in cmdsItem){\\n                  contentSpanArr.push(1)\\n                }\\n              }\\n              this.$nextTick(()=>{\\n                this.contentSpanArr = contentSpanArr\\n              })\\n            }\\n            // \\u5904\\u7406\\u4e4b\\u524d\\u6ca1\\u6709\\u5408\\u5e76\\u7684\\u65e7\\u4efb\\u52a1\\n            if(!contentSpanArr&&cmdsItem){\\n              contentSpanArr = []\\n              for(let i in cmdsItem){\\n                contentSpanArr.push(1)\\n              }\\n              this.$nextTick(()=>{\\n                this.contentSpanArr = contentSpanArr\\n              })\\n            }\\n\\n            if(cmdsItem){\\n              this.$nextTick(()=>{\\n                this.cmdsItem = [...cmdsItem]\\n              })\\n            }\\n\\n          }\\n        })\\n      }\\n    },\\n\\n    runAllApi(apiData,bdata,logData){\\n      axios.all(apiData).then(axios.spread((res1,res2,res3)=>{\\n        this.monitorSetModel = false\\n        if(res1.success&&res2.success&&res3.success){\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        }\\n        if(!res1.success||!res2.success||!res3.success){\\n          if(!res1.success){\\n            this.$message.error(res1.msg)\\n          }\\n          if(!res2.success){\\n            this.$message.error(res2.msg)\\n          }\\n          if(!res3.success){\\n            this.$message.error(res3.msg)\\n          }\\n        }\\n        if(!res1.success&&!res2.success&&!res3.success){\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')\\n        }\\n      })).catch(err=>{\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')   \\n      })\\n    },\\n\\n    runTwoApi(apiData,bdata,logData){\\n      axios.all(apiData).then(axios.spread((res1,res2)=>{\\n        this.monitorSetModel = false\\n        if(res1.success&&res2.success){\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        }\\n        if(!res1.success||!res2.success){\\n          if(!res1.success){\\n            this.$message.error(res1.msg)\\n          }\\n          if(!res2.success){\\n            this.$message.error(res2.msg)\\n          }\\n        }\\n        if(!res1.success&&!res2.success){\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')\\n        }\\n      })).catch(err=>{\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')        \\n      })\\n    },\\n\\n    // \\u914d\\u7f6e\\u5355\\u4e2a\\u65e5\\u5fd7\\n    async setLogMonitor(){\\n      let logMonitorApi;\\n      let postData;\\n      let isOpen = this.logSwitch;\\n      let selectedItem = this.productData;\\n\\n      if(this.logSwitch){\\n        postData = this.initLogData(this.productData);\\n      } else {\\n        if(this.isSentOffApi) {\\n          postData = this.getTurnOffLogConfigItem(selectedItem);\\n        }else{\\n          logMonitorApi = Promise.resolve({\\n            data: {},\\n            msg: \\"\\u8bf7\\u6c42\\u6210\\u529f\\",\\n            success: true\\n          })\\n        }\\n      }\\n      if (typeof(logMonitorApi) == \'undefined\') {\\n        logMonitorApi = await this.insertLogTaskAndTriggerActuator(\\n          [postData],\\n          isOpen,\\n        );\\n      }\\n      return {logMonitorApi, postData}\\n    },\\n\\n    /**\\n     * \\u7ec4\\u88c5\\u7528\\u4e8e\\u5173\\u95ed\\u65e5\\u5fd7\\u7684\\u6570\\u636e\\n     * \\n     * @param {object} selectedItem \\u5f53\\u524d\\u9009\\u4e2d\\u5bf9\\u8c61\\n     * @return {object} \\u914d\\u7f6e\\u5bf9\\u8c61\\uff0c\\u7528\\u4e8e\\u53d1\\u7ed9Actuator\\n     */\\n    getTurnOffLogConfigItem(selectedItem) {\\n      return {\\n        requestor:\'st\',\\n        id: selectedItem.id,  // \\u8bbe\\u5907ID\\n        tlab_id: selectedItem.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        op: \'off\',\\n        device_name: selectedItem.name,\\n        ip: selectedItem.ip,\\n      }\\n    },\\n\\n    /**\\n     * \\u6279\\u91cflog\\u8bbe\\u7f6e\\uff0c\\u7ed3\\u679c\\u901a\\u8fc7Actuator\\u56de\\u8c03\\u63d2\\u5165\\u4efb\\u52a1\\u4e2d\\u5fc3\\n     */\\n    async setBatchLogMonitor(){\\n      let configItem;\\n      let isOpen = this.logSwitch;\\n      let actuatorBody = []\\n      let deviceData = {}\\n\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n      \\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          if (isOpen) { // \\u5f00\\u542f\\n            configItem = this.initLogData(deviceData[key][i]);\\n          } else{ // \\u5173\\u95ed\\n            configItem = this.getTurnOffLogConfigItem(deviceData[key][i]);\\n          }\\n          logItems.push(configItem)\\n        }\\n\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems\\n        })\\n      }\\n\\n      let logMonitorApi;\\n      await api.labApi.updateBatchLogAndUpdateTask(isOpen, actuatorBody)\\n        .then(res => {\\n          logMonitorApi = res;\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n      \\n      return logMonitorApi;\\n    },\\n\\n    /**\\n     * \\u7528\\u7ec4\\u88c5\\u597d\\u7684\\u65e5\\u5fd7\\u4efb\\u52a1\\u914d\\u7f6e\\u6570\\u636e\\u8c03\\u7528Actuator\\n     *\\n     * @param {array} items \\u914d\\u7f6e\\u9879\\uff0c\\u4f20\\u7ed9Actuator\\n     * @isOpen {bool} \\u5f00\\u542f/\\u5173\\u95ed\\n     */\\n    async insertLogTaskAndTriggerActuator(configItems, isOpen) {\\n      let logMonitorApi;\\n\\n      let actuatorBody = []\\n      if (this.sourceType == \\"deviceList\\"){\\n        actuatorBody.push({\\n          \\"cycle_id\\": this.testObjSelDataList[0].cycle.id,\\n          \\"kr_device_ids\\": [this.testObjSelDataList[0].id],\\n          \\"action\\": isOpen? \\"on\\" : \\"off\\",\\n          \\"username_cn\\": this.userInfo.name,\\n          \\"log_items\\": configItems\\n        })\\n      }else{\\n        actuatorBody.push({\\n          \\"cycle_id\\": parseInt(this.$route.params.id),\\n          \\"kr_device_ids\\": [this.testObjSelDataList[0].id],\\n          \\"action\\": isOpen? \\"on\\" : \\"off\\",\\n          \\"username_cn\\": this.userInfo.name,\\n          \\"log_items\\": configItems\\n        })\\n      }\\n\\n      await api.labApi.updateBatchLogAndUpdateTask(isOpen, actuatorBody)\\n        .then(res => {\\n          logMonitorApi = res;\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n      return logMonitorApi;\\n    },\\n\\n    // \\u751f\\u6210\\u7528\\u4e8e\\u5f00\\u542f\\u65e5\\u5fd7\\u7684\\u6570\\u636e\\n    initLogData(productData) {\\n      let postData = {\\n        requestor:\'st\',\\n        notifyImmediately:this.notifyImmediately,\\n        operator: this.userInfo.loginName,\\n        tlab_id: productData.tlabTestObjectId,\\n        id: productData.id,\\n        keyword: this.keyword,\\n        device_name: productData.name,\\n        project_info: {\\n          id: productData.cycleId,\\n          email_list: this.email_list,\\n          url: this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId\\n        },\\n        op: \\"on\\"\\n      };\\n      let cmd = [];\\n      let cmd2interval = [];\\n      let keyword2cmd = [];\\n      let keyListObj = {}\\n      for (let item of this.cmdsItem) {\\n        if(item.cmd.length>0){\\n          let key = item.keyword\\n          let keyListItem = keyListObj[key]||[]\\n          keyListItem.push({\\n            interval:item.interval,\\n            count:item.count,\\n            command:item.cmd.join(\'\\\\n\'),\\n          })\\n          Object.assign(keyListObj,{[key]:keyListItem})\\n        }\\n      \\n      }\\n      for(let k2 in keyListObj){\\n        let k2Item = {\\n          key_word:k2,\\n          cmds:keyListObj[k2]\\n        }\\n        keyword2cmd.push(k2Item)\\n      }\\n      Object.assign(postData, {keyword2cmd });\\n      Object.assign(postData.project_info, {cmdsItem:this.cmdsItem,contentSpanArr:this.contentSpanArr});\\n      return postData;\\n    },\\n\\n    getManager(value,userMap){\\n      this.email_list = [];\\n      this.email_list_map = {};\\n      if(value.length >0){\\n        for (var i = 0; i < value.length; i++) { \\n          this.email_list.push(userMap[value[i]])\\n          this.email_list_map[userMap[value[i]]] =value[i]\\n        }\\n      }\\n    },\\n    downMonitorLog(category){\\n      let data = {\\n        category,\\n        asset_id:this.productData.tlabTestObjectId\\n      }\\n      api.labApi\\n      .getDownloadUrl(data)\\n      .then(data => {\\n        var iframe =document.createElement(\\"iframe\\")\\n        iframe.style.display =\\"none\\";\\n        iframe.src = data;\\n        document.body.appendChild(iframe);\\n      })\\n    },\\n    dumpLink(type){\\n      let idArray = this.productData.tlabTestObjectId.split(\'-\');\\n      let moniUrl = \'\'\\n      if(type==\'monitor\'){\\n        moniUrl = `${\\n          api.labApi.labUrl\\n        }/resource/managed/#/monitor/${idArray[0]}/${idArray[1]}/${idArray[2]}?is_ontime=on`;\\n      }else{\\n        moniUrl = `${\\n          api.labApi.labUrl\\n        }/resource/managed/#/outOfMem/${idArray[0]}/${idArray[1]}/${idArray[2]}`;\\n      }\\n      window.open(moniUrl);\\n    },\\n    handelBasicOpenMonitor(ev, row) {\\n      row.is_send_email = ev;\\n    },\\n    // setKeyWorlds(){\\n    //   let monitorCopy = this.monitorData;\\n    //   for (let i = 0; i < monitorCopy.length; i++) {\\n    //     if(monitorCopy[i].category == \\"log\\"){\\n    //       monitorCopy[i].threshold = this.logData\\n    //     }\\n    //   }\\n    //   this.monitorData = [...monitorCopy];\\n    // },\\n\\n    async setBatchMonitor(){\\n      // \\u7ec4\\u88c5monitor\\u6570\\u636e\\n      let basicData = {}\\n      let timeData = {}\\n      let outOfMemData = {}\\n      if (this.checkList.indexOf(\'\\u57fa\\u672c\\u76d1\\u63a7\') != -1){\\n        basicData = {\\n                monitor_type: \'basic\',\\n                monitor_data: this.monitorData\\n              }\\n      }\\n      // if (this.checkList.indexOf(\'\\u5b9e\\u65f6\\u76d1\\u63a7\') != -1){\\n      //   timeData = {\\n      //     monitor_type: \'real_time\',\\n      //     monitor_data: this.timeMonitorData\\n      //   }\\n      // }\\n      // if (this.checkList.indexOf(\'\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\') != -1){\\n      //   outOfMemData = {\\n      //     monitor_type: \'out_of_mem\',\\n      //     monitor_data: this.outOfMemData\\n      //   }\\n      // }\\n      \\n      let config = []\\n      if(basicData.hasOwnProperty(\'monitor_data\')){\\n        config.push(basicData)\\n      };\\n      \\n      if(timeData.hasOwnProperty(\'monitor_data\')){\\n        config.push(timeData)\\n      }\\n      if(outOfMemData.hasOwnProperty(\'monitor_data\')){\\n        config.push(outOfMemData)\\n      }\\n\\n      let monitorData = {}\\n      if (config.length > 0){\\n        let asset = []\\n        if (this.sourceType == \\"deviceList\\"){\\n          // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n          let deviceData = this.dealDeviceData()\\n          for (let key in deviceData){\\n            let cycle_info = {\\n              id: key\\n            }\\n\\n            let asset_info = []\\n            for (let i in deviceData[key]){\\n              asset_info.push({\\n                id: deviceData[key][i].tlabTestObjectId,\\n                st_id: deviceData[key][i].id,\\n                name: deviceData[key][i].name,\\n                ip: deviceData[key][i].ip\\n              })\\n            }\\n            asset.push({\\n              cycle_info,\\n              asset_info\\n            })\\n          }\\n\\n        }else{\\n          let asset_info = []\\n          for (let i in this.testObjSelDataList){\\n            asset_info.push({\\n              id: this.testObjSelDataList[i].tlabTestObjectId,\\n              st_id: this.testObjSelDataList[i].id,\\n              name: this.testObjSelDataList[i].name,\\n              ip: this.testObjSelDataList[i].ip\\n            })\\n          }\\n          let cycle_info = {\\n            id: parseInt(this.$route.params.id)\\n          }\\n          asset = [{\\n            cycle_info,\\n            asset_info\\n          }]\\n        }\\n        \\n        monitorData = {\\n          requestor:\'st\',\\n          operator: this.userInfo.loginName,\\n          creator_name: this.userInfo.name,\\n          asset,\\n          monitor: config\\n        };\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let asset_id = []\\n      for (let i in this.testObjSelDataList){\\n        asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n      }\\n\\n      let email_data = {\\n        \\"asset_id\\": asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      if (config.length > 0 && this.checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1){\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n        let logMonitorApi = await this.setBatchLogMonitor();\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runAllApi([emailApi, bMonitorApi, logMonitorApi],false,false)\\n        return\\n      };\\n\\n      if (config.length > 0) {\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runTwoApi([emailApi,bMonitorApi],false,false)\\n        return\\n      };\\n\\n      if (this.checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1){\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let logMonitorApi = await this.setBatchLogMonitor();\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runTwoApi([emailApi, logMonitorApi],false,false)\\n        return\\n      }\\n    },\\n\\n    async saveChanelLog(){\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let asset_id = []\\n      for (let i in this.testObjSelDataList){\\n        asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n      }\\n\\n      let email_data = {\\n        \\"asset_id\\": asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let logMonitorApi = await this.setBatchLogMonitor();\\n      this.runTwoApi([emailApi, logMonitorApi],false,false)\\n    },\\n\\n    packageAssetInfoForMonitor(){\\n      let asset_id = []\\n      let asset = []\\n      if (this.sourceType == \\"deviceList\\"){\\n        // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n        let deviceData = this.dealDeviceData()\\n        for (let key in deviceData){\\n          let cycle_info = {\\n            id: key\\n          }\\n\\n          let asset_info = []\\n          for (let i in deviceData[key]){\\n            asset_id.push(deviceData[key][i].tlabTestObjectId)\\n            asset_info.push({\\n              id: deviceData[key][i].tlabTestObjectId,\\n              st_id: deviceData[key][i].id,\\n              name: deviceData[key][i].name,\\n              ip: deviceData[key][i].ip,\\n              product_line: deviceData[key][i].product_line,\\n            })\\n          }\\n          asset.push({\\n            cycle_info,\\n            asset_info\\n          })\\n        }\\n\\n      }else{\\n        let asset_info = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n          asset_info.push({\\n            id: this.testObjSelDataList[i].tlabTestObjectId,\\n            st_id: this.testObjSelDataList[i].id,\\n            name: this.testObjSelDataList[i].name,\\n            ip: this.testObjSelDataList[i].ip,\\n            product_line: this.testObjSelDataList[i].product_line,\\n          })\\n        }\\n        let cycle_info = {\\n          id: parseInt(this.$route.params.id)\\n        }\\n        asset = [{\\n          cycle_info,\\n          asset_info\\n        }]\\n      } \\n      \\n      let assetInfo = {\\n        asset,\\n        asset_id\\n      }\\n\\n      return assetInfo\\n    },\\n\\n    async setFanMonitor(){\\n      let fanDatas = [{\\n        target: \\"product\\",\\n        category: \\"fan\\",\\n        is_open: this.fanSwitch,\\n        is_send_email: this.fanSwitch,\\n        interval: this.fanInterval,\\n      }]\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"fan\\",\\n          monitor_data: fanDatas\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setTemperatureMonitor(){\\n      let temperatureDatas = [{\\n        type: \\"temperature\\",\\n        category: \\"temperature\\",\\n        is_open: this.temperatureSwitch,\\n        period: this.temperatureInterval,\\n        threshold: {\\n          value: this.temperatureValue\\n        }\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: temperatureDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setPowerMonitor(){\\n      let powerDatas = [{\\n        type: \\"power\\",\\n        category: \\"power\\",\\n        is_open: this.powerSwitch,\\n        period: this.powerInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: powerDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setDisNetworkMonitor(){\\n      let disNetworkDatas = [{\\n        type: \\"dis_network\\",\\n        category: \\"dis_network\\",\\n        is_open: this.disNetworkSwitch,\\n        period: this.disNetworkInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: disNetworkDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setGpuMonitor(){\\n      let gpuDatas = [{\\n        type: \\"gpu\\",\\n        category: \\"gpu\\",\\n        is_open: this.gpuSwitch,\\n        period: this.gpuInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: gpuDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setSystemNetworkMonitor(){\\n      let systemNetworkDatas = [{\\n        type: \\"system_network\\",\\n        category: \\"system_network\\",\\n        is_open: this.systemNetworkSwitch,\\n        period: this.systemNetworkInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: systemNetworkDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setProcessMonitor(){\\n      let processDatas = [{\\n        target: \\"product\\",\\n        category: \\"product_process\\",\\n        is_open: this.processSwitch,\\n        is_send_email: this.processSwitch,\\n        interval: this.processInterval,\\n        process_names: this.processNames\\n      }]\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"product_process\\",\\n          monitor_data: processDatas\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setOutOfMemMonitor(){\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"out_of_mem\\",\\n          monitor_data: this.outOfMemData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setTimeMonitor(){\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"real_time\\",\\n          monitor_data: this.timeMonitorData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setAllMonitor() {\\n      let basicData = {\\n        monitor_type: \'basic\',\\n        monitor_data: this.monitorData\\n      };\\n      let monitor = [basicData];\\n\\n      let asset = []\\n      let cycle_info = {}\\n      if (this.sourceType == \\"deviceList\\"){\\n        // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u8fc7\\u6765\\u7684\\u6570\\u636e\\n        cycle_info = {\\n          id: this.productData.cycle.id\\n        }\\n      }else{\\n        cycle_info = {\\n          id: parseInt(this.$route.params.id)\\n        }\\n      }\\n\\n      asset.push({\\n        cycle_info,\\n        asset_info: [{\\n            id: this.productData.tlabTestObjectId,\\n            st_id: this.productData.id,\\n            name: this.productData.name,\\n            ip: this.productData.ip\\n          }]\\n      })\\n\\n      let data = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset,\\n        monitor\\n      };\\n\\n      let email_data = {\\n        \\"asset_id\\": [this.productData.tlabTestObjectId],\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n\\n      // \\u65b0\\u7684\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(data)\\n      let logData = await this.setLogMonitor()\\n      this.runAllApi([emailApi, bMonitorApi, logData.logMonitorApi], data, logData.postData)\\n    },\\n\\n    // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n    dealDeviceData(){\\n      const deviceData = {}\\n      this.testObjSelDataList.map(item => {\\n        const id = item.cycle.id;\\n        if ( Object.keys(deviceData).indexOf(id.toString()) == -1) {\\n          deviceData[id] = Array.from({length:1}).fill(item);\\n        } else {\\n          deviceData[id].push(item)\\n        }\\n      })\\n\\n      return deviceData\\n    },\\n\\n    closeMonitorDialog(){\\n      this.syncConfigSwitch = false\\n      this.monitorSetModel = false\\n      this.isViewKeyDialogShow = false\\n      this.syncBindValue = \'\'\\n      this.keyword = [];\\n      this.processSwitch = false;\\n      this.processNames = [];\\n      this.processInterval = 600;\\n      this.fanSwitch = false;\\n      this.fanInterval = 600;\\n      this.temperatureSwitch = false;\\n      this.temperatureValue = 90;\\n      this.temperatureInterval = 600;\\n      this.powerSwitch = false;\\n      this.powerInterval = 600;\\n      this.disNetworkSwitch = false;\\n      this.disNetworkInterval = 600;\\n      this.gpuSwitch = false;\\n      this.gpuInterval = 600;\\n      this.systemNetworkSwitch = false;\\n      this.systemNetworkInterval = 600;\\n    },\\n\\n    setProductMonitor(){\\n      if (this.batchFlag){\\n        this.setBatchMonitor()\\n        this.monitorSetModel = false    // \\u6279\\u91cf\\u76d1\\u63a7\\n      }else{\\n        this.setAllMonitor()   // \\u5355\\u4e2a\\u76d1\\u63a7\\n      }\\n      this.isViewKeyDialogShow = false\\n      this.syncConfigSwitch = false\\n    },\\n\\n    // setConfigMonitor(){\\n    //   if (this.syncConfigSwitch && this.syncBindValue == \'\'){\\n    //     console.log(\\"\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\")\\n    //     this.$confirm(\\"\\u60a8\\u52fe\\u9009\\u4e86\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff0c\\u4f46\\u662f\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u5c06\\u4e0d\\u80fd\\u4ece\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff0c\\u662f\\u5426\\u7ee7\\u7eed\\u914d\\u7f6e\\uff08\\u4f7f\\u7528\\u73b0\\u6709\\u9875\\u9762\\u5c55\\u793a\\u7684\\u914d\\u7f6e\\uff09\\", \'\\u63d0\\u793a\', {\\n    //       confirmButtonText: \'\\u7ee7\\u7eed\',\\n    //       cancelButtonText: \'\\u53d6\\u6d88\',\\n    //       type: \'warning\'\\n    //     }).then(() => {\\n    //       this.setProductMonitor()\\n    //     }).catch(() => {\\n    //       this.$message({\\n    //         type: \'info\',\\n    //         message: \'\\u5df2\\u53d6\\u6d88\\u914d\\u7f6e\'\\n    //       });          \\n    //     });\\n    //   }else{\\n    //     this.setProductMonitor()\\n    //   }\\n    // },\\n\\n\\n    setBasicMonitor(){\\n      let basicData = this.monitorData\\n\\n      let checkArry = [\'cpu_percent\', \'memory_percent\', \'db_memory_percent\']\\n      for (let i in basicData){\\n        if (checkArry.indexOf(basicData[i].category) != -1){\\n          if (basicData[i].threshold.max_value <= basicData[i].threshold.min_value && basicData[i].is_open){\\n            this.$message.error(\\"\\u76d1\\u63a7\\u9879 <\\" + basicData[i].category_display + \\"> \'\\u4f7f\\u7528\\u7387\\u6700\\u5927\\u503c\' \\u5c0f\\u4e8e\\u7b49\\u4e8e \'\\u4f7f\\u7528\\u7387\\u6700\\u5c0f\\u503c\'\\uff0c\\u8bf7\\u4fee\\u6539\\uff01\\")\\n            return\\n          }\\n        }\\n      }\\n\\n      let rebootInfo = basicData.pop()\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      let basicMonitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"basic\\",\\n          monitor_data: basicData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n\\n      let rebootData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: {\\n          is_open: rebootInfo.is_open\\n        }\\n      }\\n      api.disApi.setRebootMonitor(rebootData)\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(basicMonitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    getDmsConfig(ais_id){\\n      let dmsConfig = [\\"temperature\\", \\"power\\", \\"dis_network\\", \\"gpu\\", \\"system_network\\"]\\n      for (let i in dmsConfig){\\n        let dmsParams = {\\n          asset_id: ais_id,\\n          category: dmsConfig[i]\\n        }\\n        api.disApi.getDmsMonitor(dmsParams).then(res=>{\\n          if (res.success) {\\n            switch(res.data.category){\\n              case \'temperature\':\\n                this.temperatureValue = res.data.threshold.value\\n                this.temperatureSwitch = res.data.switch\\n                this.temperatureInterval = res.data.period\\n                break;\\n              case \'power\':\\n                this.powerSwitch = res.data.switch\\n                this.powerInterval = res.data.period\\n                break;\\n              case \'dis_network\':\\n                this.disNetworkSwitch = res.data.switch\\n                this.disNetworkInterval = res.data.period\\n                break;\\n              case \'gpu\':\\n                this.gpuSwitch = res.data.switch\\n                this.gpuInterval = res.data.period\\n                break;\\n              case \'system_network\':\\n                this.systemNetworkSwitch = res.data.switch\\n                this.systemNetworkInterval = res.data.period\\n                break;\\n              default:\\n                break;\\n            }\\n          }\\n      })\\n      .catch(err => {\\n        this.$message.error(\'\\u4ece\\u8bbe\\u5907\\u76d1\\u63a7\\u670d\\u52a1\\u83b7\\u53d6\\u8bbe\\u5907\\u76d1\\u63a7\\u914d\\u7f6e\\u5931\\u8d25\\uff1a\', err);\\n      });\\n      }\\n    },\\n\\n    getConfigMonitor(data, isSyncConfig) {\\n      var isSyncFlag = arguments[1]?arguments[1]:false\\n      if (!isSyncConfig){\\n        this.checkList = []\\n        if (this.testObjSelDataList.length > 1){\\n          this.batchFlag = true   // \\u83b7\\u53d6\\u9ed8\\u8ba4\\u914d\\u7f6e\\uff0c\\u6279\\u91cf\\u914d\\u7f6e\\u76d1\\u63a7\\n          this.logSwitch = false\\n          this.monitorTitle = \\"\\u6279\\u91cf\\u76d1\\u63a7\\u914d\\u7f6e\\"\\n          this.email_list = []\\n          this.email_list_map = {}\\n        }else{\\n          this.monitorTitle = \'\\u8bbe\\u5907\\u540d\\u79f0: \'+ data.name\\n          this.checkList = this.allCheckList\\n          this.batchFlag = false   // \\u83b7\\u53d6\\u5355\\u4e2a\\u914d\\u7f6e\\uff0c\\u5355\\u4e2a\\u914d\\u7f6e\\u76d1\\u63a7\\n          api.labApi\\n          .getEmailConfig(data.tlabTestObjectId)\\n          .then(res => {\\n            if (res.success) {\\n              this.email_list = res.data.email_list;\\n              this.email_list_map = res.data.email_list_map\\n            }\\n          })\\n        }\\n      }\\n\\n      this.handleTabClick({name:\'logMonitor\'}, isSyncFlag)\\n\\n      let tlabId = \\"\\"\\n      if (isSyncConfig){\\n        tlabId = this.syncBindValue.tlabTestObjectId\\n      } else {\\n        tlabId = data.tlabTestObjectId\\n      }\\n\\n      if (!this.batchFlag){\\n        this.getDmsConfig(tlabId)\\n      }\\n      \\n      // \\u4ecetlab\\u83b7\\u53d6\\n      api.labApi\\n      .getProductMonitors(this.userInfo.loginName, tlabId, this.batchFlag)\\n      .then(res => {\\n        if (res.success) {\\n          const { config } = res.data;\\n          if (config && config.length > 0) {\\n            for (let item of config) {\\n              switch(item.monitor_type){\\n                case \'basic\':\\n                  this.monitorData = [...item.monitor_data];\\n                  this.getDeviceRebootMonitor(tlabId)\\n                  this.handleLogData();\\n                  break;\\n                case \'real_time\':\\n                  this.timeMonitorData = [...item.monitor_data];\\n                  break;\\n                case \'out_of_mem\':\\n                  this.outOfMemData = [...item.monitor_data];\\n                  break;\\n                case \'product_process\':\\n                  let processMonitorData = [...item.monitor_data];\\n                  if (processMonitorData.length == 1){\\n                    this.processSwitch = processMonitorData[0].is_open;\\n                    this.processNames = processMonitorData[0].process_names;\\n                    this.processInterval = processMonitorData[0].interval\\n                  } else {\\n                    console.log(\\"\\u8fdb\\u7a0b\\u6570\\u636e\\u540e\\u53f0\\u8fd4\\u56de\\u6709\\u95ee\\u9898: \\", processMonitorData);\\n                  }\\n                  break;\\n                case \'fan\':\\n                  let fanMonitorData = [...item.monitor_data]; \\n                  this.fanSwitch = fanMonitorData[0].is_open;\\n                  this.fanInterval = fanMonitorData[0].interval;\\n                  break;\\n                default:\\n                  break;\\n              }\\n            }\\n          }\\n          this.monitorSetModel = true;\\n        } else {\\n          this.$message.error(`${res.msg}`);\\n        }\\n      })\\n      .catch(err => {\\n        console.log(err);\\n        this.$message.error(\'\\u83b7\\u53d6\\u76d1\\u63a7\\u914d\\u7f6e\\u9519\\u8bef\');\\n      });\\n    },\\n\\n    handleLogData(){\\n      let monitorData = this.monitorData;\\n      this.logData = {\\n        keyword:[],\\n        cmd:[]\\n      }\\n      for (let i = 0; i < monitorData.length; i++) {\\n        if(monitorData[i].category == \'log\'){\\n          if(monitorData[i].threshold){\\n            monitorData[i].threshold = {\\n              ...monitorData[i].threshold,\\n              project_info:{\\n                id:this.cycleId,\\n                url:this.peojectUrl+\'cycleDetails/\'+this.cycleId\\n              }\\n            }\\n            // let thresholdData = JSON.parse(monitorData[i].threshold)\\n            // this.logData = {...this.logData,...thresholdData}\\n          }\\n          break;\\n        }\\n      }\\n      this.monitorData = [...monitorData];\\n    },\\n\\n    getTypes(batchType){\\n      this.checkList = batchType\\n      let currentTab = batchType[batchType.length-1]\\n      if (currentTab == \\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"logMonitor\\"\\n      } else if (currentTab == \\"\\u5b9e\\u65f6\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"timeMonitor\\"\\n      } else if (currentTab == \\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"outOfMem\\"\\n      } else if (currentTab == \\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"processMonitor\\"\\n      }else if (currentTab == \\"\\u98ce\\u6247\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"fanMonitor\\"\\n      }else if (currentTab == \\"\\u6e29\\u5ea6\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"temperatureMonitor\\"\\n      }else if (currentTab == \\"\\u7535\\u6e90\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"powerMonitor\\"\\n      }else if (currentTab == \\"\\u7f51\\u7edc\\u72b6\\u6001\\"){\\n        this.monitorActiveName = \\"disNetworkMonitor\\"\\n      }else if (currentTab == \\"GPU\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"gpuMonitor\\"\\n      }else if (currentTab == \\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\"){\\n        this.monitorActiveName = \\"systemNetworkMonitor\\"\\n      }\\n      else if (currentTab == \\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"){\\n        this.monitorActiveName = \\"remoteMonitor\\"\\n      }\\n      else if (currentTab == \\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"){\\n        this.monitorActiveName = \\"sysLogMonitor\\"\\n      }\\n      else if (currentTab == \\"core\\u6587\\u4ef6\\"){\\n        this.monitorActiveName = \\"coreMonitor\\"\\n      }\\n      else{\\n        this.monitorActiveName = \\"basicMonitor\\"\\n      }\\n    },\\n\\n    renderHeader (h,{column}) {\\n      let prompt = \'\\u5173\\u952e\\u5b57\\u4e0d\\u4e3a\\u7a7a\\uff0c\\u8868\\u793a\\u8f93\\u5165\\u7684\\u547d\\u4ee4\\u53ea\\u6709\\u5728\\u8be5\\u5173\\u952e\\u5b57\\u51fa\\u73b0\\u624d\\u4f1a\\u6267\\u884c\\uff1b\\u5173\\u952e\\u5b57\\u4e3a\\u7a7a\\uff0c\\u8868\\u793a\\u547d\\u4ee4\\u7684\\u6267\\u884c\\u548c\\u5173\\u952e\\u5b57\\u65e0\\u5173\\uff0c\\u6309\\u8bbe\\u7f6e\\u81ea\\u52a8\\u89e6\\u53d1\\u6267\\u884c \'\\n      return h(\\n          \'div\',[ \\n              h(\'span\', column.label),\\n              h(\'el-tooltip\',{\\n  \\u3000\\u3000\\u3000\\u3000      props:{\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000effect:\'dark\',\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000content:prompt,\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000placement:\'top\'\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000  },\\u3000\\u3000\\u3000 \\n      \\u3000\\u3000\\u3000\\u3000 },[\\n                      h(\'i\', {\\n                          class:\'el-icon-question\',\\n                          style:\'color:#e6a23c;margin-left:5px;\'\\n                      })\\n                  ],{\\n                      content:prompt,\\n                  })\\n          ] \\n      );\\n    },\\n\\n    renderHeaderCmd (h,{column}) {\\n      let prompt = \'\\u6267\\u884c\\u547d\\u4ee4\\u4e3a\\u7a7a\\u5219\\u4e0d\\u4f1a\\u4fdd\\u5b58\\u8be5\\u6761\\u6267\\u884c\\u914d\\u7f6e\\u4fe1\\u606f\\u3002\'\\n      return h(\\n          \'div\',[ \\n              h(\'span\', column.label),\\n              h(\'el-tooltip\',{\\n  \\u3000\\u3000\\u3000\\u3000      props:{\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000effect:\'dark\',\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000content:prompt,\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000placement:\'top\'\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000  },\\u3000\\u3000\\u3000 \\n      \\u3000\\u3000\\u3000\\u3000 },[\\n                      h(\'i\', {\\n                          class:\'el-icon-question\',\\n                          style:\'color:#e6a23c;margin-left:5px;\'\\n                      })\\n                  ],{\\n                      content:prompt,\\n                  })\\n          ] \\n      );\\n    },\\n\\n    addKeyword(){\\n      this.$refs.executeList.getExecuteListNew()\\n      this.$refs.executeList.getKeywordInfo()\\n    },\\n    \\n    deleteCoreItem(i){\\n      this.coreForm.coreItems.splice(i,1)\\n\\n    },\\n\\n    addCoreItem(){\\n      this.coreForm.coreItems.push({\\n        keywords:\'\',\\n        path:\'\'\\n      })\\n    },\\n\\n    async saveRemotesLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.sysLogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n      \\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initRemoteLogData(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n      }\\n\\n      api.logApi.updateRemoteLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n      })\\n      .catch(err => {\\n        this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n      });\\n\\n      let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n        \\n    },\\n\\n    initRemoteLogData(productData){\\n      // id device_name \\u540e\\u53f0\\u901a\\u7528\\u63a5\\u53e3\\u9700\\u8981\\n      let status = this.sysLogSwitch?\'open\':\'close\'\\n      let emails = this.email_list.map(item=>{\\n        return item+\'@hikvision.com.cn\'\\n      })\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        operator: this.userInfo.loginName,\\n        deviceId: productData.id,\\n        deviceIp: productData.ip,\\n        status: status,\\n        key_word: this.sysLogKeyword,\\n        deviceName: productData.name,\\n        email:emails,\\n        product_url: this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId\\n      };\\n\\n      return postData\\n    },\\n\\n    saveSystemLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.mtlogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n\\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initSysLogData(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n\\n        api.logApi.updateSysLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n\\n        let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n\\n      }\\n\\n    },\\n\\n    initSysLogData(productData){\\n      let status = this.sysLogSwitch?\'open\':\'close\'\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        tlab_id: productData.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        keywords: this.mtkeyword,\\n        mtLog_path: this.mtlogPath,\\n        config_info:{\\n          id:productData.cycleId,\\n          url:this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId,\\n          email_list:this.email_list\\n        }\\n      };\\n\\n      return postData\\n\\n    },\\n\\n    getSysLogChanId(){\\n       let productData = this.testObjSelDataList[0]\\n      let params = {\\n        id:productData.id,\\n        tlab_id:productData.tlabTestObjectId,\\n        requestor:\'st\',\\n      }\\n      api.logApi.getMtlogInfo(params).then(res=>{\\n        if(res.success){\\n          this.mtlogSwitch = res.data.state==\'on\'?true:false\\n          this.mtkeyword = res.data.keywords\\n          this.mtlogPath = res.data.mtLog_path\\n        }\\n      })\\n    },\\n\\n    getCoreLogChanId(){\\n      let productData = this.testObjSelDataList[0]\\n      let params = {\\n        id:productData.id,\\n        tlab_id:productData.tlabTestObjectId,\\n        requestor:\'st\',\\n      }\\n      api.logApi.getCorelogInfo(params).then(res=>{\\n        if(res.success){\\n          this.coreForm.coreLogSwitch = res.data.state==\'on\'?true:false\\n          this.coreForm.corelogPath = res.data.core_path\\n          if(res.data.file_config&&res.data.file_config.length>0){\\n            this.coreForm.coreItems = res.data.file_config\\n          }\\n        }\\n      })\\n    },\\n\\n    getDeviceRebootMonitor(tlabId){\\n      api.disApi.getRebootMonitor(tlabId).then(res=>{\\n        if (res.success){\\n          this.monitorData.push({\\n            \\"target\\": \\"product\\",\\n            \\"category\\": \\"deviceReboot\\",\\n            \\"category_display\\": \\"\\u8bbe\\u5907\\u91cd\\u542f\\",\\n            \\"is_open\\": res.data.is_open,\\n            \\"is_send_email\\": res.data.is_open,\\n            \\"threshold\\": \\"0\\"\\n          })\\n        } else {\\n          this.monitorData.push({\\n            \\"target\\": \\"product\\",\\n            \\"category\\": \\"deviceReboot\\",\\n            \\"category_display\\": \\"\\u8bbe\\u5907\\u91cd\\u542f\\",\\n            \\"is_open\\": false,\\n            \\"is_send_email\\": false,\\n            \\"threshold\\": \\"0\\"\\n          })          \\n        }\\n      })\\n    },\\n\\n    tagClick(){\\n      if(this.monitorActiveName==\'remoteMonitor\'){\\n        \\n      }\\n      if(this.monitorActiveName==\'sysLogMonitor\'){\\n        if(this.testObjSelDataList.length==1){\\n          this.getSysLogChanId()\\n        }\\n      };\\n      if(this.monitorActiveName==\'coreMonitor\'){\\n         if(this.testObjSelDataList.length==1){\\n          this.getCoreLogChanId()\\n        }\\n      };\\n    },\\n\\n    saveCoreLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.coreForm.coreLogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n\\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initCoreLog(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n\\n        api.logApi.updateCoreLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n        \\n        let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n\\n      }\\n\\n    },\\n\\n    initCoreLog(productData){\\n\\n      let status = this.coreForm.coreLogSwitch?\'open\':\'close\'\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        tlab_id: productData.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        config_info:{\\n          id:productData.cycleId,\\n          url:this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId,\\n          email_list:this.email_list\\n        },\\n        core_path:this.coreForm.corelogPath,\\n        file_config:this.coreForm.coreItems\\n       \\n      }\\n\\n      return postData\\n\\n    }\\n\\n   \\n\\n  }\\n}\\n</script>\\n<style scoped>\\n.save-container{\\n  position: relative;\\n  text-align: center;\\n  margin-top: 28px;\\n}\\n.monitor-close{\\n  position: absolute;\\n  right: 18px;\\n  bottom: 10px;\\n}\\n</style>\\n<style>\\n.keyBtn{\\n  display: inline-block;\\n  margin-left:10px;\\n  cursor: pointer;\\n  padding:0;\\n}\\n.monitorTable .el-select__tags-text{\\n  white-space:  initial;;\\n}\\n.monitorTable .el-tag--mini{\\n  height :auto;\\n  line-height: auto;\\n}\\n.cmd-select .el-select--mini{\\n  width: 100%;\\n}\\n.productMonitor .el-button.is-disabled,\\n.productMonitor .el-button.is-disabled:focus, \\n.productMonitor .el-button.is-disabled:hover{\\n  color: #C0C4CC;\\n  cursor: not-allowed;\\n  background-image: none;\\n  background-color: #FFF;\\n  border-color: #EBEEF5;\\n}\\n/* .productMonitor-dialog .el-dialog__body{\\n  padding: 30px 20px 0px 20px;\\n} */\\n/* .productMonitor-dialog.el-dialog__footer{\\n  padding: 0px 20px 20px 20px ;\\n} */\\n</style>\\n","uri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue","version":1}}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) UnhandledPromiseRejectionWarning: TypeError: Cannot read property \'validation\' of undefined\\n    at VLS.configure (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:145:53)\\n    at VLS.<anonymous> (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:77:18)\\n    at Generator.next (<anonymous>)\\n    at /usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:8:71\\n    at new Promise (<anonymous>)\\n    at __awaiter (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:4:12)\\n    at lspConnection.onDidChangeConfiguration (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:76:71)\\n    at handleNotification (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:500:43)\\n    at processMessageQueue (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:271:17)\\n    at Immediate.setImmediate [as _onImmediate] (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:258:13)"}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)"}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code."}}'
2019-10-16 15:28:34,962 - DEBUG - Server reported: Loaded bundled typescript@3.6.4.
2019-10-16 15:28:34,962 - DEBUG - Server reported: Vetur initialized
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'validation' of undefined
    at VLS.configure (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:145:53)
    at VLS.<anonymous> (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:77:18)
    at Generator.next (<anonymous>)
    at /usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:4:12)
    at lspConnection.onDidChangeConfiguration (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:76:71)
    at handleNotification (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:500:43)
    at processMessageQueue (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:271:17)
    at Immediate.setImmediate [as _onImmediate] (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:258:13)
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
2019-10-16 15:28:37,123 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue","diagnostics":[]}}'
2019-10-16 15:28:41,944 - INFO - Received debug info request
2019-10-16 15:29:01,338 - INFO - Received debug info request
2019-10-16 15:31:30,655 - INFO - Received debug info request
@bstaletic
Copy link
Contributor

Thanks for the report, but this is once again a VLS bug. Please report it at https://github.com/vuejs/vetur/issues/

@bstaletic
Copy link
Contributor

So the server does initialize, but it then blows up as soon as ycmd sends a didOpen notification.

@Karmenzind
Copy link
Author

Thanks a lot.

@bstaletic
Copy link
Contributor

As a workaround, take a look at this: https://github.com/vuejs/vetur/pull/745/files

You can use .ycm_extra_conf.py and return something that will satisfy the entire VLSConfig:

def Settings(**kwargs):
  return { 'ls': { <place config here> } }

Yes, this is a major PITA, but it's definitely not ycmd's fault.

@Karmenzind
Copy link
Author

Karmenzind commented Oct 29, 2019

Thanks and sorry for the late.
I installed the newest vls (0.0.65) and put these lines into .ycm_extra_conf.py.

def Settings(**kwargs):
    return {
        "ls": {
            "vetur": {
                "validation": {
                    "template": True,
                    "style": True,
                    "script": True
                },
                "completion": {
                    "autoImport": False,
                    "useScaffoldSnippets": False
                },
                "format": {
                    "defaultFormatter": {
                        "js": "prettier",
                        "ts": "prettier"
                    },
                    "defaultFormatterOptions": {},
                    "scriptInitialIndent": False,
                    "styleInitialIndent": False
                }
            },
            "css": {},
            "html": {
                "suggest": {}
            },
            "javascript": {
                "format": {}
            },
            "typescript": {
                "format": {}
            },
            "emmet": {},
            "stylusSupremacy": {}
        }
    }

And ycmd stopped complaining about undefined property.
The completer and goto both work, though the completion is a bit slow (I think it's caused by vls).

@bstaletic
Copy link
Contributor

With that extra conf, completions don't work at all for me. I'm hitting vuejs/vetur#1478. You'll have to check the ycmd log, with let g:ycm_log_level='debug', hopefully the timestamps will tell you who to blame for the sluggishness.

@Karmenzind
Copy link
Author

Karmenzind commented Oct 29, 2019

Thanks. What's the version of your vue-language-server?
Without that extra conf, completions still work here. But there will be lines like cannot read property 'tabSize' of undefined in ycmd's stderr log.


Here is the log.
There are still warnings about undefined tabSize, I think giving a value of tabSize in Settings may fix it.

click to unfold

2019-10-29 17:16:16,136 - DEBUG - Global extra conf not loaded or no function YcmCorePreload
2019-10-29 17:16:16,191 - INFO - Received ready request
2019-10-29 17:16:16,477 - INFO - Received event notification
2019-10-29 17:16:16,478 - DEBUG - Event name: BufferVisit
2019-10-29 17:16:16,614 - INFO - Received event notification
2019-10-29 17:16:16,614 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:16:16,614 - INFO - Adding buffer identifiers for file: /tmp/x.vue
2019-10-29 17:16:16,621 - INFO - Starting vueCompleter: ['/usr/local/bin/vls']
2019-10-29 17:16:16,624 - INFO - vueCompleter started
2019-10-29 17:16:16,624 - DEBUG - TX: Sending message: b'Content-Length: 689\r\n\r\n{"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"completion":{"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}}}},"initializationOptions":{"css":{},"emmet":{},"html":{"suggest":{}},"javascript":{"format":{}},"stylusSupremacy":{},"typescript":{"format":{}},"vetur":{"completion":{"autoImport":false,"useScaffoldSnippets":false},"format":{"defaultFormatter":{"js":"prettier","ts":"prettier"},"defaultFormatterOptions":{},"scriptInitialIndent":false,"styleInitialIndent":false},"validation":{"script":true,"style":true,"template":true}}},"processId":29110,"rootPath":"/tmp","rootUri":"file:///tmp"}}'
2019-10-29 17:16:16,717 - INFO - Received filetype completion available request
2019-10-29 17:16:17,110 - INFO - Received completion request
2019-10-29 17:16:17,110 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,302 - INFO - Received completion request
2019-10-29 17:16:17,302 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,518 - INFO - Received completion request
2019-10-29 17:16:17,518 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,520 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Loaded bundled typescript@3.6.4."}}'
2019-10-29 17:16:17,657 - INFO - Received completion request
2019-10-29 17:16:17,657 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,749 - INFO - Received completion request
2019-10-29 17:16:17,749 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,855 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Vetur initialized"}}'
2019-10-29 17:16:17,855 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"textDocumentSync":1,"completionProvider":{"resolveProvider":true,"triggerCharacters":[".",":","<","\\"","\'","/","@","*"]},"signatureHelpProvider":{"triggerCharacters":["("]},"documentFormattingProvider":false,"hoverProvider":true,"documentHighlightProvider":true,"documentLinkProvider":{"resolveProvider":false},"documentSymbolProvider":true,"definitionProvider":true,"referencesProvider":true,"codeActionProvider":true,"colorProvider":true}}}'
2019-10-29 17:16:17,855 - INFO - Language server requires sync type of Full
2019-10-29 17:16:17,855 - DEBUG - vue: Server declares trigger characters: ['.', ':', '<', '"', "'", '/', '@', '*']
2019-10-29 17:16:17,855 - INFO - vue: Using trigger characters for semantic triggers: .,:,<,",',/,@,*
2019-10-29 17:16:17,856 - DEBUG - TX: Sending notification: b'Content-Length: 52\r\n\r\n{"jsonrpc":"2.0","method":"initialized","params":{}}'
2019-10-29 17:16:17,856 - DEBUG - TX: Sending notification: b'Content-Length: 480\r\n\r\n{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{"css":{},"emmet":{},"html":{"suggest":{}},"javascript":{"format":{}},"stylusSupremacy":{},"typescript":{"format":{}},"vetur":{"completion":{"autoImport":false,"useScaffoldSnippets":false},"format":{"defaultFormatter":{"js":"prettier","ts":"prettier"},"defaultFormatterOptions":{},"scriptInitialIndent":false,"styleInitialIndent":false},"validation":{"script":true,"style":true,"template":true}}}}}'
2019-10-29 17:16:17,857 - INFO - Received completion request
2019-10-29 17:16:17,857 - DEBUG - Refreshing file /tmp/x.vue: State is Open/action Open
2019-10-29 17:16:17,857 - DEBUG - TX: Sending notification: b'Content-Length: 146\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"vue","text":"\\n","uri":"file:///tmp/x.vue","version":1}}}'
2019-10-29 17:16:17,857 - DEBUG - Using filetype completion: False
2019-10-29 17:16:17,864 - DEBUG - Server reported: Loaded bundled typescript@3.6.4.
2019-10-29 17:16:17,864 - DEBUG - Server reported: Vetur initialized
2019-10-29 17:16:18,061 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vue","diagnostics":[]}}'
2019-10-29 17:16:19,523 - INFO - Received event notification
2019-10-29 17:16:19,524 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:16:19,524 - INFO - Adding buffer identifiers for file: /tmp/x.vue
2019-10-29 17:16:19,524 - DEBUG - Refreshing file /tmp/x.vue: State is Open/action Change
2019-10-29 17:16:19,524 - DEBUG - TX: Sending notification: b'Content-Length: 191\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"<script charset=\\"utf-8\\">\\n  \\n</script>\\n"}],"textDocument":{"uri":"file:///tmp/x.vue","version":2}}}'
2019-10-29 17:16:19,530 - INFO - Received event notification
2019-10-29 17:16:19,530 - DEBUG - Event name: InsertLeave
2019-10-29 17:16:20,418 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vue","diagnostics":[]}}'
2019-10-29 17:16:20,501 - INFO - Received completion request
2019-10-29 17:16:20,501 - DEBUG - Using filetype completion: False
2019-10-29 17:16:20,613 - INFO - Received completion request
2019-10-29 17:16:20,614 - DEBUG - Using filetype completion: False
2019-10-29 17:16:21,090 - INFO - Received completion request
2019-10-29 17:16:21,090 - DEBUG - Using filetype completion: False
2019-10-29 17:16:21,302 - INFO - Received event notification
2019-10-29 17:16:21,302 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:16:21,303 - INFO - Adding ONE buffer identifier for file: /tmp/x.vue
2019-10-29 17:16:21,308 - INFO - Received completion request
2019-10-29 17:16:21,308 - DEBUG - Using filetype completion: False
2019-10-29 17:16:21,522 - INFO - Received completion request
2019-10-29 17:16:21,522 - DEBUG - Using filetype completion: False
2019-10-29 17:16:21,782 - INFO - Received event notification
2019-10-29 17:16:21,782 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:16:21,796 - INFO - Received completion request
2019-10-29 17:16:21,797 - DEBUG - Using filetype completion: False
2019-10-29 17:16:21,996 - INFO - Received completion request
2019-10-29 17:16:21,998 - DEBUG - Using filetype completion: False
2019-10-29 17:16:22,099 - INFO - Received completion request
2019-10-29 17:16:22,099 - DEBUG - Using filetype completion: False
2019-10-29 17:16:22,279 - INFO - Received completion request
2019-10-29 17:16:22,280 - DEBUG - Using filetype completion: False
2019-10-29 17:16:23,234 - INFO - Received completion request
2019-10-29 17:16:23,235 - DEBUG - Using filetype completion: False
2019-10-29 17:16:23,442 - INFO - Received event notification
2019-10-29 17:16:23,442 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:16:23,734 - INFO - Received completion request
2019-10-29 17:16:23,735 - DEBUG - Using filetype completion: False
2019-10-29 17:16:24,638 - INFO - Received event notification
2019-10-29 17:16:24,638 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:16:24,651 - INFO - Received completion request
2019-10-29 17:16:24,651 - DEBUG - Using filetype completion: True
2019-10-29 17:16:24,652 - DEBUG - Refreshing file /tmp/x.vue: State is Open/action Change
2019-10-29 17:16:24,652 - DEBUG - TX: Sending notification: b'Content-Length: 205\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"<script charset=\\"utf-8\\">\\n  let a = 1;\\na.\\n</script>\\n"}],"textDocument":{"uri":"file:///tmp/x.vue","version":3}}}'
2019-10-29 17:16:24,654 - DEBUG - TX: Sending message: b'Content-Length: 149\r\n\r\n{"id":2,"jsonrpc":"2.0","method":"textDocument/completion","params":{"position":{"character":2,"line":2},"textDocument":{"uri":"file:///tmp/x.vue"}}}'
2019-10-29 17:16:24,706 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":2,"result":{"isIncomplete":false,"items":[{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"toString","sortText":"00","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"toFixed","sortText":"01","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"toExponential","sortText":"02","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"toPrecision","sortText":"03","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"valueOf","sortText":"04","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"toLocaleString","sortText":"05","kind":3,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}},{"uri":"file:///tmp/x.vue","position":{"character":2,"line":2},"label":"a","sortText":"46","kind":17,"data":{"languageId":"javascript","uri":"file:///tmp/x.vue","offset":40}}]}}'
2019-10-29 17:16:24,706 - DEBUG - TX: Sending message: b'Content-Length: 242\r\n\r\n{"id":3,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":17,"label":"a","position":{"character":2,"line":2},"sortText":"46","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,708 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":3,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,709 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,709 - DEBUG - TX: Sending message: b'Content-Length: 253\r\n\r\n{"id":4,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"toExponential","position":{"character":2,"line":2},"sortText":"02","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,711 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":4,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,711 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,711 - DEBUG - TX: Sending message: b'Content-Length: 247\r\n\r\n{"id":5,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"toFixed","position":{"character":2,"line":2},"sortText":"01","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,713 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":5,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,713 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,713 - DEBUG - TX: Sending message: b'Content-Length: 254\r\n\r\n{"id":6,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"toLocaleString","position":{"character":2,"line":2},"sortText":"05","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,714 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":6,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,714 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,715 - DEBUG - TX: Sending message: b'Content-Length: 251\r\n\r\n{"id":7,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"toPrecision","position":{"character":2,"line":2},"sortText":"03","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,716 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":7,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,716 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,716 - DEBUG - TX: Sending message: b'Content-Length: 248\r\n\r\n{"id":8,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"toString","position":{"character":2,"line":2},"sortText":"00","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,718 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":8,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,720 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,720 - DEBUG - TX: Sending message: b'Content-Length: 247\r\n\r\n{"id":9,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":{"languageId":"javascript","offset":40,"uri":"file:///tmp/x.vue"},"kind":3,"label":"valueOf","position":{"character":2,"line":2},"sortText":"04","uri":"file:///tmp/x.vue"}}'
2019-10-29 17:16:24,722 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":9,"error":{"code":-32603,"message":"Request completionItem/resolve failed with message: Cannot read property \'tabSize\' of undefined"}}'
2019-10-29 17:16:24,722 - ERROR - A completion item could not be resolved. Using basic data
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 963, in _ResolveCompletionItem
    REQUEST_TIMEOUT_COMPLETION )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 393, in GetResponse
    return response.AwaitResponse( timeout )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 201, in AwaitResponse
    error.get( 'message' ) or 'No message' ) )
ycmd.completers.language_server.language_server_completer.ResponseFailedException: Request failed: -32603: Request completionItem/resolve failed with message: Cannot read property 'tabSize' of undefined
2019-10-29 17:16:24,862 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vue","diagnostics":[{"range":{"start":{"line":2,"character":2},"end":{"line":2,"character":2}},"severity":1,"message":"Identifier expected.","tags":[],"code":1003,"source":"Vetur"}]}}'
2019-10-29 17:16:30,587 - INFO - Received event notification
2019-10-29 17:16:30,587 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:16:30,587 - INFO - Adding buffer identifiers for file: /tmp/x.vue
2019-10-29 17:16:30,587 - DEBUG - Refreshing file /tmp/x.vue: State is Open/action Change
2019-10-29 17:16:30,587 - DEBUG - TX: Sending notification: b'Content-Length: 206\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"<script charset=\\"utf-8\\">\\n  let a = 1;\\na.a\\n</script>\\n"}],"textDocument":{"uri":"file:///tmp/x.vue","version":4}}}'
2019-10-29 17:16:30,590 - INFO - Received event notification
2019-10-29 17:16:30,590 - DEBUG - Event name: InsertLeave
2019-10-29 17:16:30,590 - INFO - Adding ONE buffer identifier for file: /tmp/x.vue
2019-10-29 17:16:30,793 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vue","diagnostics":[]}}'
2019-10-29 17:16:33,132 - INFO - Received debug info request
2019-10-29 17:16:34,962 - INFO - Received debug info request

@Karmenzind
Copy link
Author

Karmenzind commented Oct 29, 2019

I searched https://vuejs.github.io/vetur/formatting.html#settings
and updated the Settings and fixed the undefined tabSize

def Settings(**kwargs):
    return {
        "ls": {
            "vetur": {
                # ...
                "format": {
                    # ...
                    "options": {
                        "tabSize": 4,
                    }
                }
            },
            # ...
        }
    }

As for the sluggishness.
In a vue file with 3000 lines, I typed this. and the completions came after more than 15 seconds. With tail -f xxx.log, I could see that many RX: Received message .... showed up slowly.

image

@bstaletic
Copy link
Contributor

Thanks. What's the version of your vue-language-server?

I'm currently on 0.0.62

I searched https://vuejs.github.io/vetur/formatting.html#settings
and updated the Settings and fixed the undefined tabSize

Great. I love this about vls...

As for the sluggishness.
In a vue file with 3000 lines, I typed this. and the completions came after more than 15 seconds. With tail -f xxx.log, I could see that many RX: Received message .... showed up slowly.

I've seen that kind of sluggishness with solargraph
The screenshot of the log shows that each response was well under 500ms. You can check a few things:

  • In the completion response, what's the value of isIncomplete property?
  • How many completion results are there?
  • Is visual studio code behaving better?

@puremourning
Copy link
Member

No response. Closing for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants