// Copyright 2021 99cloud // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import React, { useEffect, useState } from 'react'; import { Col, Empty, Popover, Row, Spin } from 'antd'; import { FileTextOutlined } from '@ant-design/icons'; import { SubnetStore } from 'stores/neutron/subnet'; export const networkStatus = { ACTIVE: t('Active'), BUILD: t('Build'), DOWN: t('Down'), ERROR: t('Error'), }; export const networkState = { UP: t('Up'), DOWN: t('Down'), }; export const networkColumns = (self) => [ { title: t('ID/Name'), dataIndex: 'name', linkPrefix: `/network/${self.getUrl('networks')}/detail`, }, { title: t('Is Current Project'), dataIndex: 'project_id', render: (value) => (value === self.currentProjectId ? t('Yes') : t('No')), hidden: self.isAdminPage, sorter: false, }, { title: t('External'), dataIndex: 'router:external', valueRender: 'yesNo', sorter: false, }, { title: t('Shared'), dataIndex: 'shared', valueRender: 'yesNo', sorter: false, }, { title: t('Status'), dataIndex: 'status', render: (value) => networkStatus[value] || '-', }, { title: t('Subnet Count'), dataIndex: 'subnets', render: (value, record) => { const content = ; return ( <> {(value && value.length) || 0}{' '} {value && value.length !== 0 && ( )} ); }, stringify: (subnets) => `${subnets.length}(${subnets.join(',')})`, sorter: false, }, { title: t('Created At'), dataIndex: 'created_at', valueRender: 'sinceTime', isHideable: true, sorter: false, }, ]; export const networkSortProps = { isSortByBack: true, defaultSortKey: 'status', defaultSortOrder: 'descend', }; export const ipTypeOptions = [ { label: t('Automatically Assigned Address'), value: 0, }, { label: t('Manually Assigned Address'), value: 1, }, ]; export const getAnchorData = (num, y) => { const xLength = parseFloat(1 / (num + 1)).toFixed(2); const result = []; for (let i = 1; i < num + 1; i++) { const x = i * xLength; result.push([x, y]); } return result; }; export const isExternalNetwork = (network) => !!network['router:external']; function PopUpSubnet({ subnetIds }) { const [subnets, setSubnets] = useState(subnetIds); const [isLoading, setLoaidng] = useState(false); useEffect(() => { setLoaidng(true); (async function () { const promises = subnets.map((i) => new SubnetStore().fetchDetail({ id: i }) ); const ret = await Promise.all(promises); setSubnets(ret); setLoaidng(false); })(); }, []); if (isLoading) { return ; } return subnets.length === 0 ? ( ) : ( subnets.map((item, index) => ( {item.name} {item.cidr} )) ); }