columns.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. import PasswordFetcher from '@Compute/sections/PasswordFetcher'
  2. import { SERVER_TYPE } from '@Compute/constants'
  3. import {
  4. getProjectTableColumn,
  5. getRegionTableColumn,
  6. getStatusTableColumn,
  7. getBrandTableColumn,
  8. getCopyWithContentTableColumn,
  9. getIpsTableColumn,
  10. getNameDescriptionTableColumn,
  11. getTagTableColumn,
  12. getBillingTableColumn,
  13. getTimeTableColumn,
  14. getOsArch,
  15. getAccountTableColumn,
  16. } from '@/utils/common/tableColumn'
  17. import SystemIcon from '@/sections/SystemIcon'
  18. import { sizestr, bytesPerSecondStr } from '@/utils/utils'
  19. import { findPlatform, typeClouds } from '@/utils/common/hypervisor'
  20. import i18nLocale from '@/locales'
  21. import { HYPERVISORS_MAP } from '@/constants'
  22. export default {
  23. data () {
  24. return {
  25. columns: [],
  26. }
  27. },
  28. created () {
  29. this.serverManager = new this.$Manager('servers')
  30. const doCreateOrSwitchBackup = (obj) => {
  31. this.execLoading = true
  32. this.serverManager.performAction({
  33. id: obj.id,
  34. action: 'reconcile-backup',
  35. data: {},
  36. }).then((res) => {
  37. this.execLoading = false
  38. this.$message.success(this.$t('message.exec_success'))
  39. }).catch((err) => {
  40. this.execLoading = false
  41. this.$message.success(this.$t('message.exec_fail'))
  42. throw err
  43. })
  44. }
  45. const getToolTip = (row) => {
  46. const num = row.metadata.create_backup_count || row.metadata.switch_backup_count
  47. let time = row.metadata.create_backup || row.metadata.switch_backup
  48. if (time) {
  49. const aLink = <a-button type="link" class="oc-pointer" disabled={this.execLoading} style="padding: 0;" onClick={() => doCreateOrSwitchBackup(row)}>{this.$t('compute.text_1341')}</a-button>
  50. const aIcon = <a-icon type="exclamation-circle" class="ml-1 error-color oc-pointer" />
  51. try {
  52. time = this.$moment(JSON.parse(time)).format()
  53. } catch (error) {
  54. throw new Error('Failed to parse date', error)
  55. }
  56. if (row.metadata.create_backup) {
  57. return <a-tooltip placement="right">
  58. <template slot="title">
  59. <i18n path="compute.text_1342">
  60. <template slot="num">{num}</template>
  61. <template slot="time">{time}</template>
  62. <template slot="link">{aLink}</template>
  63. </i18n>
  64. </template>
  65. {aIcon}
  66. </a-tooltip>
  67. } else if (row.metadata.switch_backup) {
  68. return <a-tooltip placement="right">
  69. <template slot="title">
  70. <i18n path="compute.text_1343">
  71. <template slot="num">{num}</template>
  72. <template slot="time">{time}</template>
  73. <template slot="link">{aLink}</template>
  74. </i18n>
  75. </template>
  76. {aIcon}
  77. </a-tooltip>
  78. }
  79. }
  80. return null
  81. }
  82. const columns = [
  83. getNameDescriptionTableColumn({
  84. onManager: this.onManager,
  85. hideField: true,
  86. addLock: true,
  87. addEncrypt: true,
  88. addBackup: true,
  89. formRules: [
  90. { required: true, message: i18nLocale.t('compute.text_210') },
  91. // { validator: this.$validate('resourceCreateName') },
  92. ],
  93. statusModule: 'server',
  94. slotCallback: row => {
  95. return (
  96. <side-page-trigger onTrigger={() => this.handleOpenSidepage(row)}>{row.name}</side-page-trigger>
  97. )
  98. },
  99. hidden: () => {
  100. return this.$isScopedPolicyMenuHidden('server_hidden_columns.name')
  101. },
  102. }),
  103. getStatusTableColumn({
  104. minWidth: 180,
  105. statusModule: 'server',
  106. slotCallback: row => {
  107. const log = <side-page-trigger class="ml-1" onTrigger={() => this.handleOpenSidepage(row, 'event-drawer')}>{this.$t('common.view_logs')}</side-page-trigger>
  108. const cancel = <a class="ml-1"
  109. onClick={() => this.createDialog('VmLiveMigrateCancelDialog', {
  110. data: [row],
  111. columns: this.columns,
  112. onManager: this.onManager,
  113. })}>{this.$t('common.cancel')}</a>
  114. const shutdown = <span class="text-color-help">({this.$t('compute.server.shutdown_mode.stop_charging')})</span>
  115. const rescue_mode = <span class="text-color-help">({this.$t('compute.rescue')})</span>
  116. const health = <span style="background:rgb(241, 229, 172);padding:2px 5px;font-size:12px;">{this.$t('compute.health_status.initializing')}</span>
  117. return [
  118. <div class='d-flex align-items-center text-truncate'>
  119. <status status={row.status} statusModule='server' process={row.progress} showStatusProgress={true}>
  120. {(row.status === 'running' || row.status === 'starting') && row.health_status === 'initializing' ? health : null}
  121. </status>
  122. {row.metadata && getToolTip(row)}
  123. {row.status?.includes('fail') ? log : null}
  124. {row.status === 'live_migrating' ? cancel : null}
  125. {row.status === 'ready' && row.shutdown_mode === 'stop_charging' ? shutdown : null}
  126. {row.rescue_mode === true ? rescue_mode : null}
  127. </div>,
  128. ]
  129. },
  130. hidden: () => {
  131. return this.$isScopedPolicyMenuHidden('server_hidden_columns.status')
  132. },
  133. }),
  134. getStatusTableColumn({
  135. field: 'power_states',
  136. title: this.$t('compute.power_states'),
  137. statusModule: 'server',
  138. hidden: () => {
  139. return this.$isScopedPolicyMenuHidden('server_hidden_columns.power_states')
  140. },
  141. }),
  142. {
  143. field: 'is_gpu',
  144. title: i18nLocale.t('table.title.type'),
  145. width: 50,
  146. slots: {
  147. default: ({ row }) => {
  148. let tooltip = i18nLocale.t('compute.text_291', [i18nLocale.t('dictionary.server')])
  149. let icontype = 'cpu'
  150. if (row.is_gpu) {
  151. tooltip = `${this.$t('compute.text_113')}${this.$t('dictionary.server')}`
  152. icontype = 'gpu'
  153. }
  154. if (row.backup_host_id) {
  155. tooltip = this.$t('compute.backup')
  156. icontype = 'gaokeyong'
  157. }
  158. return [<icon type={icontype} style={{ fontSize: '16px' }} title={tooltip} />]
  159. },
  160. },
  161. formatter: ({ row }) => {
  162. let tooltip = i18nLocale.t('compute.text_291', [i18nLocale.t('dictionary.server')])
  163. if (row.is_gpu) {
  164. tooltip = `GPU${this.$t('dictionary.server')}`
  165. }
  166. if (row.backup_host_id) {
  167. tooltip = this.$t('compute.backup')
  168. }
  169. return tooltip
  170. },
  171. hidden: () => {
  172. return this.$isScopedPolicyMenuHidden('server_hidden_columns.is_gpu')
  173. },
  174. },
  175. getTagTableColumn({
  176. onManager: this.onManager,
  177. resource: 'server',
  178. columns: () => this.columns,
  179. tipName: this.$t('dictionary.server'),
  180. editCheck: (row) => row.hypervisor !== typeClouds.hypervisorMap.bingocloud.key,
  181. hidden: () => {
  182. return this.$isScopedPolicyMenuHidden('server_hidden_columns.metadata')
  183. },
  184. }),
  185. getIpsTableColumn({
  186. field: 'ips',
  187. title: 'IP',
  188. vm: this,
  189. sortable: true,
  190. hidden: () => {
  191. return this.$isScopedPolicyMenuHidden('server_hidden_columns.ips')
  192. },
  193. }),
  194. {
  195. field: 'macs',
  196. title: 'MAC',
  197. slots: {
  198. default: ({ row }) => {
  199. if (this.isPreLoad && !row.macs) return [<data-loading />]
  200. if (row.macs) {
  201. return row.macs.split(',').map(mac => {
  202. return <list-body-cell-wrap copy row={{ mac }} hide-field field="mac">{mac}</list-body-cell-wrap>
  203. })
  204. }
  205. return []
  206. },
  207. },
  208. hidden: () => {
  209. return this.$isScopedPolicyMenuHidden('server_hidden_columns.macs')
  210. },
  211. },
  212. getOsArch({
  213. hidden: () => {
  214. return this.$isScopedPolicyMenuHidden('server_hidden_columns.os_arch')
  215. },
  216. }),
  217. {
  218. field: 'instance_type',
  219. title: i18nLocale.t('table.title.flavor'),
  220. showOverflow: 'ellipsis',
  221. minWidth: 120,
  222. sortable: true,
  223. slots: {
  224. default: ({ row }) => {
  225. const ret = []
  226. if (row.instance_type) {
  227. ret.push(<div class='text-truncate' style={{ color: '#0A1F44' }}>{row.instance_type}</div>)
  228. }
  229. const config = row.vcpu_count + 'C' + (row.vmem_size / 1024) + 'G' + (row.disk ? sizestr(row.disk, 'M', 1024) : '')
  230. return ret.concat(<div class='text-truncate' style={{ color: '#53627C' }}>{config}</div>)
  231. },
  232. },
  233. formatter: ({ row }) => {
  234. const ret = []
  235. if (row.instance_type) {
  236. ret.push(row.instance_type)
  237. }
  238. const config = row.vcpu_count + 'C' + (row.vmem_size / 1024) + 'G' + (row.disk ? sizestr(row.disk, 'M', 1024) : '')
  239. return ret.concat(config).join(', ')
  240. },
  241. hidden: () => {
  242. return this.$isScopedPolicyMenuHidden('server_hidden_columns.instance_type')
  243. },
  244. },
  245. {
  246. field: 'os_dist',
  247. title: i18nLocale.t('table.title.os'),
  248. width: 100,
  249. sortable: true,
  250. slots: {
  251. default: ({ row }) => {
  252. if (!row.metadata) return
  253. const dist = row.metadata.os_distribution || row.metadata.distro
  254. const version = row.metadata.os_version || row.metadata.version
  255. let name = ''
  256. let tooltip = ''
  257. if (dist) {
  258. tooltip = version ? (version.includes(dist) ? version : `${decodeURI(dist)} ${version}`) : dist
  259. } else if (row.metadata.os_type) {
  260. tooltip = row.metadata.os_type
  261. } else if (row.os_type) {
  262. tooltip = row.os_type
  263. } else {
  264. tooltip = i18nLocale.t('compute.text_339')
  265. }
  266. name = dist || row.metadata.os_type || row.os_type || ''
  267. if (name.includes('Windows') || name.includes('windows')) {
  268. name = 'Windows'
  269. } else if (name.startsWith('Linux') || name.startsWith('linux')) {
  270. name = 'Linux'
  271. } else if (name === 'Others Linux') {
  272. name = 'Linux'
  273. tooltip = row.metadata.os_full_name || tooltip
  274. }
  275. return [
  276. <SystemIcon tooltip={tooltip} name={name} />,
  277. ]
  278. },
  279. },
  280. formatter: ({ row }) => {
  281. if (!row.metadata) return
  282. const dist = row.metadata.os_distribution || row.metadata.distro
  283. const version = row.metadata.os_version || row.metadata.version
  284. let tooltip = ''
  285. if (dist) {
  286. tooltip = version ? (version.includes(dist) ? version : `${decodeURI(dist)} ${version}`) : dist
  287. } else if (row.metadata.os_type) {
  288. tooltip = row.metadata.os_type
  289. } else if (row.os_type) {
  290. tooltip = row.os_type
  291. } else {
  292. tooltip = i18nLocale.t('compute.text_339')
  293. }
  294. return tooltip
  295. },
  296. hidden: () => {
  297. return this.$isScopedPolicyMenuHidden('server_hidden_columns.os_type')
  298. },
  299. },
  300. {
  301. field: 'vcpu_count',
  302. title: 'CPU',
  303. sortable: true,
  304. minWidth: 80,
  305. slots: {
  306. default: ({ row }) => {
  307. if (row.vcpu_count) {
  308. return [<list-body-cell-wrap row={{ row }} hide-field field="vcpu_count">{row.vcpu_count}</list-body-cell-wrap>]
  309. }
  310. return []
  311. },
  312. },
  313. hidden: () => {
  314. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vcpu_count')
  315. },
  316. },
  317. {
  318. field: 'vmem_size',
  319. title: i18nLocale.t('table.title.vmem_size'),
  320. sortable: true,
  321. minWidth: 80,
  322. slots: {
  323. default: ({ row }) => {
  324. if (row.vmem_size) {
  325. const config = (row.vmem_size / 1024) + 'G'
  326. return [<list-body-cell-wrap row={{ row }} hide-field field="vmem_size">{config}</list-body-cell-wrap>]
  327. }
  328. return []
  329. },
  330. },
  331. formatter: ({ row }) => {
  332. if (row.vmem_size) {
  333. const config = (row.vmem_size / 1024) + 'G'
  334. return config
  335. }
  336. return ''
  337. },
  338. hidden: () => {
  339. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vmem_size')
  340. },
  341. },
  342. {
  343. field: 'disk',
  344. title: i18nLocale.t('table.title.disk'),
  345. sortable: true,
  346. minWidth: 80,
  347. slots: {
  348. default: ({ row }) => {
  349. if (this.isPreLoad && !row.disk) return [<data-loading />]
  350. const config = row.disk ? sizestr(row.disk, 'M', 1024) : ''
  351. return [<list-body-cell-wrap row={{ row }} hide-field field="disk">{config}</list-body-cell-wrap>]
  352. },
  353. },
  354. formatter: ({ row }) => {
  355. if (!row.disk) return ''
  356. const config = row.disk ? sizestr(row.disk, 'M', 1024) : ''
  357. return config
  358. },
  359. hidden: () => {
  360. return this.$isScopedPolicyMenuHidden('server_hidden_columns.disk')
  361. },
  362. },
  363. {
  364. field: 'cpu_usage',
  365. title: i18nLocale.t('table.title.cpu_usage'),
  366. minWidth: 100,
  367. slots: {
  368. default: ({ row }) => {
  369. if (row.alert_data && row.alert_data.hasOwnProperty('cpu_usage')) {
  370. return [<UsedPercent used={row.alert_data.cpu_usage} total={100} hiddenTotal={true} hiddenUsed={true} />]
  371. }
  372. return '-'
  373. },
  374. },
  375. formatter: ({ row }) => {
  376. if (row.alert_data && row.alert_data.hasOwnProperty('cpu_usage')) {
  377. return `${row.alert_data.cpu_usage.toFixed(2)}%`
  378. }
  379. return '-'
  380. },
  381. },
  382. {
  383. field: 'mem_usage',
  384. title: i18nLocale.t('table.title.mem_usage'),
  385. minWidth: 100,
  386. slots: {
  387. default: ({ row }) => {
  388. if (row.alert_data && row.alert_data.hasOwnProperty('mem_usage')) {
  389. return [<UsedPercent used={row.alert_data.mem_usage} total={100} hiddenTotal={true} hiddenUsed={true} />]
  390. }
  391. return '-'
  392. },
  393. },
  394. formatter: ({ row }) => {
  395. if (row.alert_data && row.alert_data.hasOwnProperty('mem_usage')) {
  396. return `${row.alert_data.mem_usage.toFixed(2)}%`
  397. }
  398. return '-'
  399. },
  400. },
  401. {
  402. field: 'disk_rate',
  403. title: i18nLocale.t('common.disk_rate'),
  404. minWidth: 100,
  405. slots: {
  406. default: ({ row }) => {
  407. if (row.alert_data && row.alert_data.hasOwnProperty('disk_read_rate') && row.alert_data.hasOwnProperty('disk_write_rate')) {
  408. return [
  409. <div>{i18nLocale.t('common.disk_read_rate_value', [bytesPerSecondStr(row.alert_data.disk_read_rate)])}</div>,
  410. <div>{i18nLocale.t('common.disk_write_rate_value', [bytesPerSecondStr(row.alert_data.disk_write_rate)])}</div>,
  411. ]
  412. }
  413. return '-'
  414. },
  415. },
  416. formatter: ({ row }) => {
  417. if (row.alert_data && row.alert_data.hasOwnProperty('disk_read_rate') && row.alert_data.hasOwnProperty('disk_write_rate')) {
  418. return `${i18nLocale.t('common.disk_read_rate_value', [bytesPerSecondStr(row.alert_data.disk_read_rate)])} / ${i18nLocale.t('common.disk_write_rate_value', [bytesPerSecondStr(row.alert_data.disk_write_rate)])}`
  419. }
  420. return '-'
  421. },
  422. },
  423. {
  424. field: 'net_iops',
  425. title: i18nLocale.t('common.net_iops'),
  426. minWidth: 100,
  427. slots: {
  428. default: ({ row }) => {
  429. if (row.alert_data && row.alert_data.hasOwnProperty('net_in_rate') && row.alert_data.hasOwnProperty('net_out_rate')) {
  430. return [
  431. <div>{i18nLocale.t('common.net_in_rate_value', [bytesPerSecondStr(row.alert_data.net_in_rate)])}</div>,
  432. <div>{i18nLocale.t('common.net_out_rate_value', [bytesPerSecondStr(row.alert_data.net_out_rate)])}</div>,
  433. ]
  434. }
  435. return '-'
  436. },
  437. },
  438. formatter: ({ row }) => {
  439. if (row.alert_data && row.alert_data.hasOwnProperty('net_in_rate') && row.alert_data.hasOwnProperty('net_out_rate')) {
  440. return `${i18nLocale.t('common.net_in_rate_value', [bytesPerSecondStr(row.alert_data.net_in_rate)])} / ${i18nLocale.t('common.net_out_rate_value', [bytesPerSecondStr(row.alert_data.net_out_rate)])}`
  441. }
  442. return '-'
  443. },
  444. },
  445. {
  446. field: 'disk_usage',
  447. title: i18nLocale.t('table.title.disk_usage'),
  448. sortable: true,
  449. minWidth: 150,
  450. hidden: () => true,
  451. slots: {
  452. default: ({ row }) => {
  453. if (row.disk_usage) {
  454. return [<a-progress percent={row.disk_usage.toFixed(4) * 100} size="small" />]
  455. }
  456. return [<a-progress percent={0} size="small" />]
  457. },
  458. },
  459. },
  460. {
  461. field: 'password',
  462. title: i18nLocale.t('table.title.init_keypair'),
  463. minWidth: 50,
  464. slots: {
  465. default: ({ row }) => {
  466. return [<PasswordFetcher serverId={row.id} resourceType='servers' />]
  467. },
  468. },
  469. hidden: () => {
  470. return this.$isScopedPolicyMenuHidden('server_hidden_columns.password')
  471. },
  472. },
  473. {
  474. field: 'secgroups',
  475. title: i18nLocale.t('res.secgroup'),
  476. minWidth: 80,
  477. showOverflow: 'ellipsis',
  478. slots: {
  479. default: ({ row }) => {
  480. if (this.isPreLoad && !row.secgroups) return [<data-loading />]
  481. return row.secgroups?.map(item => item.name).join(',')
  482. },
  483. },
  484. formatter: ({ row }) => {
  485. return row.secgroups?.map(item => item.name).join(',')
  486. },
  487. hidden: () => {
  488. return this.$isScopedPolicyMenuHidden('server_hidden_columns.secgroups')
  489. },
  490. },
  491. getCopyWithContentTableColumn({
  492. field: 'vpc',
  493. title: 'VPC',
  494. hideField: true,
  495. slotCallback: (row) => {
  496. if (this.isPreLoad && !row.vpc) return [<data-loading />]
  497. return row.vpc
  498. },
  499. hidden: () => {
  500. if (this.$store.getters.isProjectMode) return true
  501. return this.$isScopedPolicyMenuHidden('server_hidden_columns.vpc')
  502. },
  503. }),
  504. getBillingTableColumn({
  505. vm: this,
  506. hiddenSetBtn: () => this.$isScopedPolicyMenuHidden('vminstance_hidden_menus.server_perform_cancel_expire'),
  507. hidden: () => {
  508. return this.$isScopedPolicyMenuHidden('server_hidden_columns.billing_type')
  509. },
  510. }),
  511. getBrandTableColumn({
  512. hidden: () => {
  513. return this.$isScopedPolicyMenuHidden('server_hidden_columns.brand')
  514. },
  515. }),
  516. // getCopyWithContentTableColumn({
  517. // field: 'account',
  518. // title: i18nLocale.t('res.cloudaccount'),
  519. // hidden: () => this.$store.getters.isProjectMode,
  520. // }),
  521. getAccountTableColumn({
  522. vm: this,
  523. hidden: () => {
  524. return this.$isScopedPolicyMenuHidden('server_hidden_columns.account')
  525. },
  526. }),
  527. {
  528. field: 'host',
  529. title: i18nLocale.t('res.host'),
  530. sortable: true,
  531. showOverflow: 'ellipsis',
  532. minWidth: 100,
  533. slots: {
  534. default: ({ row }) => {
  535. if (this.isPreLoad && !row.host) return [<data-loading />]
  536. if (findPlatform(row.hypervisor, 'hypervisor') === SERVER_TYPE.public || row.hypervisor === HYPERVISORS_MAP.hcso.hypervisor || row.hypervisor === HYPERVISORS_MAP.hcs.hypervisor) {
  537. return '-'
  538. }
  539. const text = row.host || '-'
  540. return [
  541. <list-body-cell-wrap copy field='host' row={row} message={text}></list-body-cell-wrap>,
  542. ]
  543. },
  544. },
  545. formatter: ({ row }) => {
  546. if (findPlatform(row.hypervisor, 'hypervisor') === SERVER_TYPE.public) {
  547. return ''
  548. }
  549. return row.host || ''
  550. },
  551. hidden: () => {
  552. if (this.$store.getters.isProjectMode) return true
  553. return this.$isScopedPolicyMenuHidden('server_hidden_columns.host')
  554. },
  555. },
  556. getProjectTableColumn({
  557. hidden: () => {
  558. return this.$isScopedPolicyMenuHidden('server_hidden_columns.tenant')
  559. },
  560. }),
  561. getRegionTableColumn({
  562. hidden: () => {
  563. return this.$isScopedPolicyMenuHidden('server_hidden_columns.region')
  564. },
  565. }),
  566. {
  567. field: 'alert_data',
  568. title: this.$t('compute.alert_status'),
  569. hidden: () => {
  570. return this.$isScopedPolicyMenuHidden('server_hidden_columns.alert_data')
  571. },
  572. slots: {
  573. header: () => {
  574. return [<span style="margin-right:5px">{this.$t('compute.alert_status')}</span>, <help-tooltip name="alertDataTimeRange" />]
  575. },
  576. default: ({ row }) => {
  577. if (row.alert_data?.alert_state) {
  578. return [<status status={row.alert_data?.alert_state} statusModule='monitorresources' />]
  579. }
  580. return '-'
  581. },
  582. },
  583. },
  584. getTimeTableColumn({
  585. hidden: () => {
  586. return this.$isScopedPolicyMenuHidden('server_hidden_columns.created_at')
  587. },
  588. }),
  589. ]
  590. if (this.hideColumnFields) {
  591. this.columns = columns.filter((column) => { return !this.hideColumnFields.includes(column.field) })
  592. } else {
  593. this.columns = columns
  594. }
  595. },
  596. }