## 蓝鲸 IPv6 选择器

#### 使用

##### service.js
```javascript
  export default {
    fetchTopologyWithCount: (params) => {
      return http.post('topology_width_count', { params })
    },
    fetchTopologyHost: (params) => {
      return http.post('topology_host', { params })
    },
    fetchTopologyHostIdsNodes: (params) => {
      return http.post('topology_host_ids_noodes', { params })
    },
    // ...
  }
```

##### 创建组件
``` javascript
import vue from 'vue';
import createFactory from '@blueking/ip-selector';
import Service from './service'

// 初始化配置，创建组件
const IpSelector = createFactory({
  // 组件版本（改变版本重置用户自定义配置）
  version: '',
  // 需要支持的面板（'staticTopo', 'dynamicTopo', 'dynamicGroup', 'serviceTemplate', 'setTemplate', 'serviceInstance', 'manualInput'）
  panelList: ['staticTopo', 'dynamicTopo', 'dynamicGroup', 'manualInput'],
  // 面板选项的值是否唯一
  unqiuePanelValue: false,
  // 字段命名风格（'camelCase', 'kebabCase'）
  nameStyle: 'camelCase',
  // 主机列表全选模式，false: 本页全选；true: 跨页全选
  hostTableDefaultSelectAllMode: false,
  // 主机列表开启仅显示可用过滤
  hostOnlyValid: false,
  // 主机列表开启仅显示可用过滤时，手动输入 tab 判断主机可用的回调
  manualInputHostValidMethod: () => true,
  // 自定义主机列表列
  hostTableCustomColumnList: [
    // {
    //   key: 'collectStatus',
    //   index: 5,
    //   width: '100px',
    //   label: '采集状态',
    //   renderHead: h => h('span', '采集状态'),
    //   field: 'collect_status',
    //   renderCell: (h, row) => h('span', row.collect_status || '--'),
    // }
  ],
  nodeTableCustomColumnList: [],  // 自定义动态拓扑列表列 同上
  serviceTemplateTableCustomColumnList: [],  // 自定义服务模板列表列 同上
  setTemplateCustomColumnList: [],  // 自定义集群模板列表列 同上
  hostMemuExtends: [
    // {
    //   name: '复制采集状态异常',
    //   action: () => {
    //     console.log('复制成功');
    //   },
    // },
  ],
  // 主机预览字段显示
  hostViewFieldRender: (host, primaryField) => host.host_id,
  // 主机列表显示列（默认值：['ip', 'ipv6', 'alive', 'osName']），按配置顺序显示列
  // 内置所有列的 key ['ip', 'ipv6', 'cloudArea', 'alive', 'hostName', 'osName', 'coludVerdor', 'osType', 'hostId', 'agentId']
  hostTableRenderColumnList: [],

  // 创建时是否提示 service 信息
  serviceConfigError: false,

  // 需要的数据源配置（返回 Promise）
  // 主机拓扑
  fetchTopologyHostCount: Service.fetchTopologyWithCount,
  fetchTopologyHostsNodes: Service.fetchTopologyHost, // (params: Object, hostOnlyValid: boolean) => Promise<any[]>
  fetchTopologyHostIdsNodes: Service.fetchTopogyHostIdList, // (params: Object, hostOnlyValid: boolean) => Promise<any[]>
  fetchHostsDetails: Service.fetchHostInfoByHostId,
  fetchHostCheck: Service.fetchInputParseHostList,
  fetchNodesQueryPath: Service.fetchNodePath,
  fetchHostAgentStatisticsNodes: Service.fetchBatchNodeAgentStatistics,
  // 动态分组
  fetchDynamicGroups: Service.fetchDynamicGroup,
  fetchHostsDynamicGroup: Service.fetchDynamicGroupHost,
  fetchHostAgentStatisticsDynamicGroups: Service.fetchBatchGroupAgentStatistics,
  // 服务模板
  fetchServiceTemplates: Service.fetchServiceTemplates,
  fetchNodesServiceTemplate: Service.fetchNodesServiceTemplate,
  fetchHostServiceTemplate: Service.fetchHostServiceTemplate,
  fetchHostAgentStatisticsServiceTemplate: Service.fetchHostAgentStatisticsServiceTemplate,
  // 集群模板
  fetchSetTemplates: Service.fetchSetTemplates,
  fetchNodesSetTemplate: Service.fetchNodesSetTemplate,
  fetchHostSetTemplate: Service.fetchHostSetTemplate,
  fetchHostAgentStatisticsSetTemplate: Service.fetchHostAgentStatisticsSetTemplate,
  // 服务实例
  fetchSeriviceInstanceList: Service.fetchSeriviceInstanceList,
  fetchSeriviceInstanceDetails: Service.fetchSeriviceInstanceDetails,
  // DBM 白名单
  fetchDBMWhitelist: Service.fetchDBMWhitelist,
  // 自定义配置
  fetchCustomSettings: Service.fetchAll,
  updateCustomSettings: Service.update,
  // 系统相关配置
  fetchConfig: () => Promise.resolve()
    .then(() => ({
      // CMDB 动态分组链接
      bk_cmdb_dynamic_group_url: `http:xx.yy.zz.com/#/business/1/custom-query`,
      // CMDB 拓扑节点链接
      bk_cmdb_static_topo_url: `http:xx.yy.zz.com/#/business/1/custom-query`,
      // DBM 创建白名单链接
      bk_dbm_whitelist: `http:xx.yy.zz.com/#/business/1/custom-query`,
      // CMDB 服务模版链接
      bk_cmdb_service_template_url: `http:xx.yy.zz.com/#/business/1/custom-query`,
    })),
})

// 全局注册
vue.component('IpSelector', IpSelector)
```

#### 组件 Props
<table style='width:100%'>
  <thead>
    <tr>
      <th>属性名</th>
      <th>说明</th>
      <th>类型</th>
      <th>可选值</th>
      <th>默认值</th>
      <th>必填</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>mode</td>
      <td>IP 选择的交互模式</td>
      <td>String</td>
      <td>
        <code>dialog</code>
        |
        <code>section</code>
      </td>
      <td>
        <code>dialog</code>
      </td>
      <td>true</td>
    </tr>
    <tr>
      <td>showDialog</td>
      <td>mode 为 dialog 时弹出 dialog</td>
      <td>Boolean</td>
      <td>
          <code>true</code>
          |
          <code>false</code>
        </td>
      <td>
          <code>false</code>
        </td>
      <td>true</td>
    </tr>
    <tr>
      <td>showView</td>
      <td>IP 选择完成后是否显示结果</td>
      <td>Boolean</td>
      <td>
        <code>true</code>
        |
        <code>false</code>
      </td>
      <td>
        <code>false</code>
      </td>
      <td>true</td>
    </tr>
    <tr>
      <td>value</td>
      <td>默认结果</td>
      <td>Object</td>
      <td>--</td>
      <td>
<pre>
<code>
{
  hostList: [],
  nodeList: [],
  dynamicGroupList: [],
  serviceTemplateList: [],
  setTemplateList: []
}
</code>
</pre>
        </td>
      <td>false</td>
    </tr>
    <tr>
      <td>originalValue</td>
      <td>编辑状态的初始值，用于和最新选择的值进行对比</td>
      <td>Object</td>
      <td>--</td>
      <td>
<pre>
<code>
{
  hostList: [],
  nodeList: [],
  dynamicGroupList: [],
  serviceTemplateList: [],
  setTemplateList: []
}
</code>
</pre>
        </td>
      <td>false</td>
    </tr>
    <tr>
      <td>showViewDiff</td>
      <td>是否在选择结果面板显示数据对比</td>
      <td>Boolean</td>
      <td>
        <code>true</code>
        |
        <code>false</code>
        </td>
      <td>
        <code>false</code>
        </td>
      <td>false</td>
    </tr>
    <tr>
      <td>viewSearchKey</td>
      <td>在选择结果面板搜索主机</td>
      <td>String</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>defaultOutputFieldList</td>
      <td>
        蓝鲸监控场景下的默认主机输出字段
      </td>
      <td>Array</td>
      <td>--</td>
      <td>['ip', 'ipv6']</td>
      <td>--</td>
    </tr>
    <tr>
      <td>outputFieldOptionalHostTableColumn</td>
      <td>
        蓝鲸监控场景下主机输出备选字段列表
        （为空则可选所有主机字段，值为主机 column 的 key）
      </td>
      <td>Array</td>
      <td>--</td>
      <td>--</td>
      <td>--</td>
    </tr>
    <tr>
      <td>outputFieldList</td>
      <td>
        <p>蓝鲸监控场景下的配置主机输出字段</p>
        <p>（如果要开启该功能则值不能为空）</p>
      </td>
      <td>Array</td>
      <td>--</td>
      <td>--</td>
      <td>--</td>
    </tr>
    <tr>
      <td>readonly</td>
      <td>只读</td>
      <td>Boolean</td>
      <td>
        <code>true</code>
        |
        <code>false</code>
        </td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>singleHostSelect</td>
      <td>静态拓扑主机单选</td>
      <td>Boolean</td>
      <td>
        <code>true</code>
        |
        <code>false</code>
        </td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>disableDialogSubmitMethod</td>
      <td>
        <pre>Dialog 确定按钮是否禁用</pre>
        <pre>返回 Boolean 表示禁用状态，返回 String 表示禁用状态的 Tips</pre>
      </td>
      <td>Function</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>disableHostMethod</td>
      <td>
        <pre>静态拓扑主机是否禁用</pre>
        <pre>params: (hostData, hostList)</pre>
        <pre>返回 Boolean 表示禁用状态，返回 String 表示禁用状态的 Tips</pre>
      </td>
      <td>Function</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>allowHostListMissHostId</td>
      <td>允许 hostList 中缺少 hostId，通过 ip + cloudArea.id 回填选中主机</td>
      <td>Boolean</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>allowHostListOnlyIpv4</td>
      <td>允许 hostList 中缺少 hostId，通过 ip 回填选中主机</td>
      <td>Boolean</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>keepHostFieldOutput</td>
      <td>change 事件回调时输出完整的主机字段</td>
      <td>Boolean</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>completeHostList</td>
      <td>change 事件回调时输出完整的主机字段</td>
      <td>Boolean</td>
      <td>--</td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>service</td>
      <td>覆盖组件初始的数据源配置</td>
      <td>Object</td>
      <td>
<pre>
<code>
{
  fetchTopologyHostCount:
  () => Promise.resolve([]),
  fetchTopologyHostsNodes:
  () => Promise.resolve([]),
  fetchTopologyHostIdsNodes:
  () => Promise.resolve([]),
}
</code>
</pre>
      </td>
      <td>--</td>
      <td>false</td>
    </tr>
    <tr>
      <td>config</td>
      <td>覆盖组件初始的基础配置</td>
      <td>Object</td>
      <td>
<pre>
<code>
{
  panelList: [
  'staticTopo',
  'dynamicTopo',
  'dynamicGroup',
  'manualInput'
  ],
  unqiuePanelValue: true,
  nameStyle: 'camelCase',
}
</code>
</pre>
      </td>
      <td>--</td>
      <td>false</td>
    </tr>
  </tbody>
</table>

#### 组件 Events
<table style='width:100%'>
    <thead>
    <tr>
        <th>事件名</th>
        <th>说明</th>
        <th>参数</th>
    </tr>
    </thead>
    <tbody>
    <tr>
      <td>change</td>
      <td>选择完成</td>
      <td>
<pre>
<code>
// 根据配置的 panelList 返回关联结果字段
{
  hostList: [
    {
      hostId: 1111,
      ip: 'x.x.x.x',
      cloudArea: {
        id: 2222,
        name: 'default area',
      }
    }
  ],
  nodeList: [
    {
      objectId: 'module',
      instanceId: 3333
    }
  ],
  dynamicGroupList: [
    {
      id: 4444
    }
  ],
  serviceTemplateList: [
    {
      id: 5555
    }
  ],
  setTemplateList: [
    {
      id: 666
    }
  ]
}
</code>
</pre>
        </td>
    </tr>
    <tr>
      <td>close-dialog</td>
      <td>关闭 dialog</td>
      <td>--</td>
    </tr>
    <tr>
      <td>panel-change</td>
      <td>面板切换</td>
      <td>--</td>
    </tr>
    <tr>
      <td>output-field-change</td>
      <td>输出字段更改</td>
      <td>['ip', 'ipv6']</td>
    </tr>
  </tbody>
</table>

#### 实例方法
<table style='width:100%'>
  <thead>
    <tr>
        <th>方法名</th>
        <th>说明</th>
        <th>参数</th>
        <th>返回值</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>getHostList</td>
      <td>获取选择结果的主机列表</td>
      <td>--</td>
      <td>
<pre>
<code>
  Promise.resolve([
    {
      host_id: 1,
      ip: '1.1.1.1',
      ...
    }
  ])
</code>
</pre>
      </td>
    </tr>
    <tr>
      <td>getHostIpv4List</td>
      <td><pre>获取选择结果的主机 IPv4 列表</pre></td>
      <td>--</td>
      <td>
<pre>
<code>
[
  1.1.1.1,
  ...
]
</code>
</pre>
      </td>
    </tr>
    <tr>
      <td>getHostIpv6List</td>
      <td>获取选择结果的主机 IPv6 列表</td>
      <td>--</td>
      <td>
<pre>
<code>
[
  ee.fff.ddd.111,
  ...
]
</code>
</pre>
      </td>
    </tr>
    <tr>
      <td>getAbnormalHostIpv4List</td>
      <td>获取选择结果的异常主机 IPv4 列表</td>
      <td>--</td>
      <td>
<pre>
<code>
[
  2.2.2.2,
  ...
]
</code>
</pre>
      </td>
    </tr>
    <tr>
      <td>getAbnormalHostIpv6List</td>
      <td>获取选择结果的异常主机 IPv6 列表</td>
      <td>--</td>
      <td>
<pre>
<code>
[
  ee.fff.ddd.222,
  ...
]
</code>
</pre>
      </td>
    </tr>
    <tr>
      <td>resetValue</td>
      <td>重置选择结果</td>
      <td>--</td>
      <td>--</td>
    </tr>
    <tr>
      <td>refresh</td>
      <td>刷新结果展示面板的主机状态</td>
      <td>--</td>
      <td>--</td>
    </tr>
    <tr>
      <td>collapseToggle</td>
      <td>切换结果展示面板的折叠状态</td>
      <td>
<pre>
<code>
true // 展开所有
false // 收起所有
[ // 展开指定
  'host',
  'node',
  'dynamicGroup',
  'setTemplate',
  'serviceTemplate'
]
</code>
</pre>
      </td>
      <td>--</td>
    </tr>
    <tr>
      <td>removeInvalidData</td>
      <td>移除 view 面板无效数据</td>
      <td>--</td>
      <td>--</td>
    </tr>
  </tbody>
</table>