Commit 9b31d5c5 authored by 邓晓峰's avatar 邓晓峰

merge dev branch

parents cd0765ef abdebee3
Pipeline #27360 failed with stages
in 7 seconds
......@@ -3,18 +3,28 @@ import { join } from 'path';
// utils must build before core
const headPkgs = [
'DeviceTree',
'Empty',
'HistoryInfo',
'ImageSelect',
'MqttView',
'QuotaSelect',
'RealTimeInfo',
'TimeRangePicker',
// 'DeviceTree',
// 'Empty',
// 'HistoryInfo',
// 'ImageSelect',
// 'MqttView',
// 'QuotaSelect',
// 'RealTimeInfo',
// 'TimeRangePicker',
];
const tailPkgs = readdirSync(join(__dirname, 'packages')).filter(
(pkg) => pkg.charAt(0) !== '.' && !headPkgs.includes(pkg),
);
const pkgList = ['base-components', 'extend-components']
.map((dir) => {
const list = readdirSync(join(__dirname, 'packages', dir)).map((item) => `${item}!${dir}`);
return list;
})
.flat();
const tailPkgs = pkgList
.filter((pkg) => pkg.charAt(0) !== '.' && !headPkgs.includes(pkg))
.map((item) => {
const [name, path] = item.split('!');
return `${path}/${name}`;
});
export default {
cjs: { type: 'babel', lazy: true },
......
......@@ -16,7 +16,7 @@ before_script:
init:
stage: init
script:
- cd /d %DEPLOY_PATH%/src/wisdom-components
- cd /d %DEPLOY_PATH%/src/wisdom-extend-components
- dir
- git pull
- echo 开始安装依赖...
......@@ -25,13 +25,13 @@ init:
bootstrap:
stage: bootstrap
script:
- cd /d %DEPLOY_PATH%/src/wisdom-components
- cd /d %DEPLOY_PATH%/src/wisdom-extend-components
- dir
build:
stage: build
script:
- cd /d %DEPLOY_PATH%/src/wisdom-components
- cd /d %DEPLOY_PATH%/src/wisdom-extend-components
- echo 开始打包...
- npm run site
- echo 打包完成
......@@ -39,7 +39,7 @@ build:
release:
stage: release
script:
- cd /d %DEPLOY_PATH%/src/wisdom-components
- cd /d %DEPLOY_PATH%/src/wisdom-extend-components
- echo 开始拷贝发布包...
- robocopy dist %DEPLOY_PATH%/dist /e || cmd /c "exit /b 0"
- echo 发布完成.
......@@ -3,12 +3,17 @@ import { readdirSync } from 'fs';
import { join } from 'path';
const headPkgList = [];
const pkgList = readdirSync(join(__dirname, 'packages')).filter(
(pkg) => pkg.charAt(0) !== '.' && !headPkgList.includes(pkg),
);
const pkgList = ['base-components', 'extend-components']
.map((dir) => {
const list = readdirSync(join(__dirname, 'packages', dir)).map((item) => item + `!${dir}`);
return list.filter((pkg) => pkg.charAt(0) !== '.' && !headPkgList.includes(pkg));
})
.flat();
const alias = pkgList.reduce((pre, pkg) => {
pre[`@wisdom-components/pro-${pkg}`] = join(__dirname, 'packages', pkg, 'src');
const path = pkg.split('!');
pre[`@wisdom-components/pro-${path[0]}`] = join(__dirname, 'packages', path[1], path[0], 'src');
return {
...pre,
};
......@@ -17,11 +22,15 @@ const alias = pkgList.reduce((pre, pkg) => {
console.log(`🌼 alias list \n${chalk.blue(Object.keys(alias).join('\n'))}`);
const tailPkgList = pkgList
.map((path) => [join('packages', path, 'src'), join('packages', path, 'src', 'components')])
.map((pkg) => {
const path = pkg.split('!');
return [
join('packages', path[1], path[0], 'src'),
join('packages', path[0], 'src', 'components'),
];
})
.reduce((acc, val) => acc.concat(val), []);
const isProduction = process.env.NODE_ENV === 'production';
export default {
title: 'panda-components',
mode: 'site',
......@@ -90,5 +99,11 @@ export default {
children: ['DeviceTree', 'RealTimeInfo', 'HistoryInfo'],
},
],
'/extend-components': [
{
title: 'base',
children: ['EC-DeviceTree', 'EC-QuotaSelect'],
},
],
},
};
......@@ -2,6 +2,7 @@
"version": "independent",
"npmClient": "npm",
"useWorkspaces": true,
"packages": ["packages/*"],
"changelog": {
"repo": "wisdom-components",
"cacheDir": ".changelog"
......
......@@ -2,11 +2,12 @@
"private": true,
"license": "MIT",
"workspaces": [
"packages/*"
"packages/base-components/*",
"packages/extend-components/*"
],
"scripts": {
"bootstrap": "node ./scripts/bootstrap.js",
"build": "father-build && webpack",
"build": "cross-env BUILD_TYPE=lib father-build && cross-env BUILD_TYPE=es father-build && webpack && node ./scripts/gen_less_entry.js",
"changelog": "pro-changelog",
"createRelease": "node ./scripts/createRelease.js",
"deploy": "npm run site && gh-pages -d ./dist",
......@@ -137,9 +138,10 @@
"registry": "https://g.civnet.cn:4873"
},
"dependencies": {
"@wisdom-components/Empty": "^1.3.3",
"@wisdom-components/basictable": "^1.2.0",
"@wisdom-components/basictable": "^1.4.5",
"@wisdom-components/empty": "^1.3.9",
"@wisdom-components/timerangepicker": "^1.3.4",
"@wisdom-utils/utils": "0.0.46",
"classnames": "^2.2.6",
"cross-spawn": "^7.0.3",
"form-render": "^0.9.12",
......@@ -152,97 +154,145 @@
},
"size-limit": [
{
"path": "packages/DeviceTree/lib/**/*.js",
"path": "packages/base-components/BasicTable/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/DeviceTree/es/**/*.js",
"path": "packages/base-components/BasicTable/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/Empty/lib/**/*.js",
"path": "packages/base-components/BasicTools/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/Empty/es/**/*.js",
"path": "packages/base-components/BasicTools/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/HistoryInfo/lib/**/*.js",
"path": "packages/base-components/DeviceTree/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/HistoryInfo/es/**/*.js",
"path": "packages/base-components/DeviceTree/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/ImageSelect/lib/**/*.js",
"path": "packages/base-components/Empty/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/ImageSelect/es/**/*.js",
"path": "packages/base-components/Empty/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/MqttView/lib/**/*.js",
"path": "packages/base-components/ExportExcel/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/MqttView/es/**/*.js",
"path": "packages/base-components/ExportExcel/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/QuotaSelect/lib/**/*.js",
"path": "packages/base-components/HistoryInfo/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/QuotaSelect/es/**/*.js",
"path": "packages/base-components/HistoryInfo/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/RealTimeInfo/lib/**/*.js",
"path": "packages/base-components/ImageSelect/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/RealTimeInfo/es/**/*.js",
"path": "packages/base-components/ImageSelect/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/TimeRangePicker/lib/**/*.js",
"path": "packages/base-components/MqttView/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/TimeRangePicker/es/**/*.js",
"path": "packages/base-components/MqttView/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/ParseForm/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/ParseForm/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/QuotaSelect/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/QuotaSelect/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/RealTimeInfo/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/RealTimeInfo/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/TimeRangePicker/lib/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
},
{
"path": "packages/base-components/TimeRangePicker/es/**/*.js",
"limit": "2 s",
"webpack": false,
"running": false
......
# `@wisdom-components/ImageSelect`
> TODO: description
## Usage
```
const imageselect = require('@wisdom-components/ImageSelect');
// TODO: DEMONSTRATE API
```
# `@wisdom-components/QuotaSelect`
> TODO: description
## Usage
```
const quotaselect = require('@wisdom-components/QuotaSelect');
// TODO: DEMONSTRATE API
```
......@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.5](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictable@1.4.2...@wisdom-components/basictable@1.4.5) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.4](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictable@1.4.2...@wisdom-components/basictable@1.4.4) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.3](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictable@1.4.2...@wisdom-components/basictable@1.4.3) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.2](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictable@1.3.0...@wisdom-components/basictable@1.4.2) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/BasicTools`
# `@wisdom-components/basictable`
> TODO: description
## Usage
```
const basicTools = require('@wisdom-components/BasicTools');
const basicTable = require('@wisdom-components/basictable');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/basictable",
"version": "1.4.2",
"version": "1.4.5",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: BasicTable - 标准表格
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......@@ -20,8 +20,14 @@ group:
## 代码演示
### 常规使用
<code src="./demos/Basic.tsx">
### 合计
<code src="./demos/Summary.tsx">
## API
api 参考 Antd Table 组件 https://ant.design/components/table-cn/#API
// @ts-ignore
import React, { useEffect, useState } from 'react';
import Empty from '@wisdom-components/empty';
import BasicTable from '../index';
......@@ -42,11 +43,10 @@ const Demo = () => {
});
};
// @ts-ignore
return (
<div style={{ height: '400px' }}>
{!!dataSource.length && (
<BasicTable dataSource={dataSource} columns={columns} bordered={true} />
)}
{!!dataSource.length && <BasicTable dataSource={dataSource} columns={columns} bordered />}
{!dataSource.length && <Empty description={'暂无数据'} />}
</div>
);
......
// @ts-ignore
import React, { useEffect, useState } from 'react';
import Empty from '@wisdom-components/empty';
import { Table } from 'antd';
import BasicTable from '../index';
import request from 'umi-request';
const Demo = () => {
const [columns, setColumns] = useState([]);
const [dataSource, setDataSource] = useState([]);
useEffect(() => {
fetchData();
}, []);
const fetchData = (params = {}) => {
request(`${baseUrl}/AcrossTable/GetEquipmentDataReport`, {
method: 'get',
params: {},
}).then(function (response) {
const data = response.data;
let column = data.map((item, index) => {
return {
title: `${item.DName + item.DType}(${item.Unit})`,
dataIndex: `name${index}`,
key: `name${index}`,
width: 300,
};
});
column.unshift({
title: '时间',
dataIndex: 'time',
key: 'time',
fixed: true,
width: 200,
});
let dataSource = data[0].NameDate.map((item, index) => ({ key: index, time: item.Time }));
data.forEach((item, index) => {
item.NameDate.forEach((child) => {
dataSource.forEach((v) => {
if (child.Time === v.time) v[`name${index}`] = child.Value;
});
});
});
setColumns(column);
setDataSource(dataSource);
});
};
const Summary = (currentData) => (
<Table.Summary.Row>
{columns.map((item, index) => {
let sum = 0;
currentData.reduce((prev, next) => {
sum += next[item.key];
}, 0);
return (
<Table.Summary.Cell key={index} index={index}>
{index === 0 ? '总计' : sum}
</Table.Summary.Cell>
);
})}
</Table.Summary.Row>
);
// @ts-ignore
return (
<div style={{ height: '400px' }}>
{!!dataSource.length && (
<BasicTable dataSource={dataSource} columns={columns} bordered summary={Summary} />
)}
{!dataSource.length && <Empty description={'暂无数据'} />}
</div>
);
};
export default Demo;
const baseUrl = 'https://www.fastmock.site/mock/162c15dca15c4dba9ba51e0a0b76929b/api';
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { Table, ConfigProvider } from 'antd';
import './index.less';
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@basic-table-prefix-cls: ~'@{ant-prefix}-basic-table';
.@{basic-table-prefix-cls} {
......@@ -19,12 +19,9 @@
overflow: hidden;
}
.ant-table-tbody > tr {
background: rgba(255, 255, 255, 0);
}
.ant-table-tbody > tr,
.ant-table-tbody > tr > td {
background: rgba(255, 255, 255, 0);
background: white;
}
.ant-table-thead > tr > th {
......@@ -41,10 +38,11 @@
}
.ant-table-tbody > tr:hover:not(.ant-table-expanded-row) > td {
background: rgba(255, 255, 255, 0);
background: white;
}
.ant-table-tbody > tr:nth-child(2n-1) {
.ant-table-tbody > tr:nth-child(2n-1),
.ant-table-tbody > tr:nth-child(2n-1) td {
background: #f6f9fe;
}
......@@ -124,4 +122,13 @@
border-right: 0;
border-bottom: 0;
}
.ant-table-summary {
tr td {
position: sticky;
bottom: 0;
background: white;
border-top: 1px solid #dbe7fb;
}
}
}
......@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictools@1.2.7...@wisdom-components/basictools@1.2.10) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.2.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictools@1.2.7...@wisdom-components/basictools@1.2.9) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.2.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictools@1.2.7...@wisdom-components/basictools@1.2.8) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.2.7](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/basictools@1.2.5...@wisdom-components/basictools@1.2.7) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/BasicTable`
# `@wisdom-components/basictools`
> TODO: description
## Usage
```
const basicTable = require('@wisdom-components/BasicTable');
const basicTools = require('@wisdom-components/basictools');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/basictools",
"version": "1.2.7",
"version": "1.2.10",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: BasicTools - 通用工具库
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......@@ -16,7 +16,7 @@ group:
## 使用说明
```javascript
import { getTimeRange, getRange } from '@wisdom-components/BasicTools';
import { getTimeRange, getRange } from 'packages/base-components/BasicTools/lib/index';
let result1 = getTimeRange('lastYear');
let result2 = getTimeRange('nextWeek');
......
......@@ -2,8 +2,8 @@ import moment from 'moment';
// 根据设定查询条件 返回时间范围
const getTimeRange = (type) => {
let start = '',
end = '';
let start = '';
let end = '';
switch (type) {
case 'thisYear': // 今年
start = moment().startOf('year');
......@@ -102,8 +102,8 @@ const getTimeRange = (type) => {
};
const getRange = (date, type) => {
let start = '',
end = '';
let start = '';
let end = '';
switch (type) {
case 'day':
start = moment(date);
......
......@@ -2,6 +2,46 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.3.14](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.8...@wisdom-components/devicetree@1.3.14) (2021-04-26)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.13](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.12...@wisdom-components/devicetree@1.3.13) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.3.12](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.8...@wisdom-components/devicetree@1.3.12) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.11](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.8...@wisdom-components/devicetree@1.3.11) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.8...@wisdom-components/devicetree@1.3.10) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
## [1.3.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.8...@wisdom-components/devicetree@1.3.9) (2021-04-21)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
## [1.3.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/devicetree@1.3.5...@wisdom-components/devicetree@1.3.8) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/DeviceTree`
# `@wisdom-components/devicetree`
> TODO: description
## Usage
```
const devicetree = require('@wisdom-components/DeviceTree');
const devicetree = require('@wisdom-components/devicetree');
// TODO: DEMONSTRATE API
```
......
{
"name": "@wisdom-components/devicetree",
"version": "1.3.8",
"version": "1.3.14",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: DeviceTree - 设备树
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
......@@ -79,7 +79,7 @@ const Demo = () => {
};
return (
<div style={{ width: '300px', height: '400px', border: '1px solid #eee' }}>
<div style={{ width: '200px', height: '400px', border: '1px solid #eee' }}>
<PandaDeviceTree
onSearch={onSearch}
checkable
......
......@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Input, Tree, Divider, ConfigProvider } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import Empty from '@wisdom-components/Empty';
import Empty from '@wisdom-components/empty';
import './index.less';
const DeviceTree = (props) => {
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@device-tree-prefix-cls: ~'@{ant-prefix}-device-tree';
.@{device-tree-prefix-cls} {
......@@ -12,6 +12,14 @@
margin: 6px 0 12px 0;
}
.ant-tree-checkbox {
margin: 4px 2px 0 0;
}
.ant-tree-title {
white-space: nowrap;
}
&-content {
flex: 1;
overflow-y: scroll;
......
......@@ -2,6 +2,27 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.3.12](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/empty@1.3.9...@wisdom-components/empty@1.3.12) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([9948af1](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9948af1f0749243cf866c228fc67b8f8e0d0c41f))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.11](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/empty@1.3.10...@wisdom-components/empty@1.3.11) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.3.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/empty@1.3.9...@wisdom-components/empty@1.3.10) (2021-04-22)
### Bug Fixes
- update package ([9948af1](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9948af1f0749243cf866c228fc67b8f8e0d0c41f))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/empty@1.3.5...@wisdom-components/empty@1.3.9) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/Empty`
# `@wisdom-components/empty`
> TODO: description
## Usage
```
const empty = require('@wisdom-components/Empty');
const empty = require('@wisdom-components/empty');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/empty",
"version": "1.3.9",
"version": "1.3.12",
"description": "@wisdom-components/empty",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: Empty - 空状态
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
import React, { useContext } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import { ConfigProvider } from 'antd';
import noDataLight from './assets/noDataLight.png';
import noDataDark from './assets/noDataDark.png';
import errorLight from './assets/errorLight.png';
import errorDark from './assets/errorDark.png';
import './index.less';
const Empty = ({ description, image, theme, size, statusCode, imageStyle, children }) => {
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@panda-empty-prefix-cls: ~'@{ant-prefix}-panda-empty';
.@{panda-empty-prefix-cls} {
......
......@@ -2,6 +2,24 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/exportexcel@1.0.7...@wisdom-components/exportexcel@1.0.10) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.0.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/exportexcel@1.0.7...@wisdom-components/exportexcel@1.0.9) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.0.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/exportexcel@1.0.7...@wisdom-components/exportexcel@1.0.8) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.0.7](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/exportexcel@1.0.5...@wisdom-components/exportexcel@1.0.7) (2021-04-20)
### Bug Fixes
......
{
"name": "@wisdom-components/exportexcel",
"version": "1.0.7",
"version": "1.0.10",
"description": "> TODO: description",
"author": "lijiwen <961370825@qq.com>",
"homepage": "",
......
---
title: ExportExcel - Excel表格导出
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
import React, { useEffect } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import ExportJsonExcel from 'js-export-excel';
import JSZip from 'jszip';
......
......@@ -2,6 +2,35 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.13](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.8...@wisdom-components/historyinfo@1.4.13) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.12](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.11...@wisdom-components/historyinfo@1.4.12) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
## [1.4.11](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.8...@wisdom-components/historyinfo@1.4.11) (2021-04-22)
### Bug Fixes
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.8...@wisdom-components/historyinfo@1.4.10) (2021-04-22)
### Bug Fixes
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.4.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.8...@wisdom-components/historyinfo@1.4.9) (2021-04-22)
**Note:** Version bump only for package @wisdom-components/historyinfo
## [1.4.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/historyinfo@1.4.5...@wisdom-components/historyinfo@1.4.8) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/HistoryInfo`
# `@wisdom-components/historyinfo`
> TODO: description
## Usage
```
const historyinfo = require('@wisdom-components/HistoryInfo');
const historyinfo = require('@wisdom-components/historyinfo');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/historyinfo",
"version": "1.4.8",
"version": "1.4.13",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: HistoryInfo - 历史数据查看
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......@@ -28,12 +28,12 @@ group:
api 参考 Antd Table 组件 https://ant.design/components/table-cn/#API
| 参数 | 说明 | 类型 | 默认值 |
| -------------- | ---------------------------------------------- | ------------------ | -------- |
| title | 标题 | string | 指标曲线 |
| defaultChecked | 默认选中自定义时间 key | string | oneHour |
| columns | 表格列的配置描述 | array | [ ] |
| dataSource | 表格数据源 | array | [ ] |
| tableProps | 表格其他 props | object | { } |
| chartOptions | 曲线的 options | object | { } |
| onChange | 选择时间设置或曲线设置的回调,会返回修改后的值 | function(value){ } | - |
| 参数 | 说明 | 类型 | 默认值 | 可选值 |
| --- | --- | --- | --- | --- |
| title | 标题 | string | 指标曲线 | - |
| defaultChecked | 默认选中自定义时间 key | string | oneHour | oneHour/fourHour/twelveHours/roundClock/yesterday |
| columns | 表格列的配置描述 | array | [ ] | - |
| dataSource | 表格数据源 | array | [ ] | - |
| tableProps | 表格其他 props | object | { } | - |
| chartOptions | 曲线的 options | object | { } | - |
| onChange | 选择时间设置或曲线设置的回调,会返回修改后的值 | function(value){ } | - | - |
......@@ -43,7 +43,7 @@ const Demo = () => {
});
});
setData(tableData);
setColumns([...columns, ...columnsData]);
setColumns(columnsData);
handleSeries(resData);
});
};
......@@ -92,15 +92,17 @@ const Demo = () => {
};
return (
<div style={{ height: '800px' }}>
<HistoryInfo
title={'指标曲线'}
columns={columns}
dataSource={data}
chartOptions={{ series }}
tableProps={{ bordered: true }}
tableProps={{ bordered: true, pagination: { pageSize: 20 } }}
onChange={onChangeParams}
defaultChecked={'roundClock'}
// defaultChecked={'fourHour'}
/>
</div>
);
};
......
import React, { useContext, useState, useReducer, useEffect } from 'react';
import React, { useContext, useState, useReducer, useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import Highcharts from 'highcharts/highstock';
......@@ -7,7 +7,7 @@ import { Tabs, Select, Radio, Checkbox, ConfigProvider, DatePicker } from 'antd'
import { PlusCircleOutlined } from '@ant-design/icons';
import TimeRangePicker from '@wisdom-components/timerangepicker';
import BasicTable from '@wisdom-components/basictable';
import Empty from '@wisdom-components/Empty';
import Empty from '@wisdom-components/empty';
import moment from 'moment';
import './index.less';
......@@ -99,12 +99,16 @@ const unique = (arr) => {
return arr;
};
let chartWidth = 0; // chart width
let chartHeight = 0; // chart height
const HistoryInfo = (props) => {
const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
const prefixCls = getPrefixCls('history-info');
const { title, columns, dataSource, tableProps, chartOptions, onChange } = props;
const [activeTabKey, setActiveTabKey] = useState('curve');
const [timeValue, setTimeValue] = useState('customer');
const [contrastOption, setContrastOption] = useState('day');
const [customerChecked, setCustomerChecked] = useState(props.defaultChecked || 'oneHour');
......@@ -112,13 +116,24 @@ const HistoryInfo = (props) => {
const [datePickerArr, setDatePickerArr] = useState(DataPickerArr);
const [checkboxData, setCheckboxData] = useState(CheckboxData);
const [dataThinKey, setDataThinKey] = useState(timeIntervalList[0].key);
const [options, setOptions] = useState({});
const [state, dispatch] = useReducer(reducer, initialState);
const container = useRef(null);
useEffect(() => {
onChange(state);
}, [state]);
useEffect(() => {
dispatch({ type: UPDATE_TIME.UPDATE_TIME, payload: props.defaultChecked });
}, [props.defaultChecked]);
useEffect(() => {
setOptions({ ...handleChartOptions() });
}, [chartOptions]);
// 时间设置切换(自定义/同期对比)
const onTimeSetChange = (e) => {
setTimeValue(e.target.value);
......@@ -194,6 +209,9 @@ const HistoryInfo = (props) => {
if (key === 'ignoreOutliers') {
dispatch({ type: item.type, payload: e.target.checked });
}
if (key === 'curveCenter') {
setOptions({ ...handleChartOptions() });
}
}
});
setCheckboxData(data);
......@@ -244,11 +262,7 @@ const HistoryInfo = (props) => {
)}
{timeValue === 'contrast' && ( // 同期对比
<>
<Select
defaultValue={contrastOption}
style={{ width: 60 }}
onChange={onContrastChange}
>
<Select value={contrastOption} style={{ width: 60 }} onChange={onContrastChange}>
<Option value="day"></Option>
<Option value="month"></Option>
</Select>
......@@ -390,6 +404,38 @@ const HistoryInfo = (props) => {
};
}
options.tooltip.formatter = function formatter() {
let _html = `<b>${Highcharts.dateFormat(
contrastOption === 'day' ? '%H:%M' : '%d %H:%M',
this.x,
)}</b><br/>`;
this.points.forEach((item) => {
_html += `<span style={{color: ${item.series.color}}}>${item.series.name}</span>:
<b>${
item.point.y.toFixed(
item.series.userOptions.decimalPoint ? item.series.userOptions.decimalPoint : 2,
) * 1
}${item.series.userOptions.tooltip.valueSuffix}</b>
<br/>`;
});
return _html;
};
if (container.current) {
if (container.current.offsetWidth !== 0) {
chartWidth = container.current.offsetWidth;
chartHeight = container.current.offsetHeight;
}
Highcharts.setOptions({
// 处理 chart 高度坍塌
chart: {
width: container.current.offsetWidth === 0 ? chartWidth : container.current.offsetWidth,
height:
container.current.offsetHeight === 0 ? chartHeight : container.current.offsetHeight,
},
});
}
return options;
};
......@@ -450,11 +496,12 @@ const HistoryInfo = (props) => {
return (
<div className={classNames(prefixCls)}>
<Tabs
defaultActiveKey={TabPaneData[0].key}
activeKey={activeTabKey}
centered
tabBarExtraContent={{
left: <h3 className="tabs-extra-demo-button">{title}</h3>,
}}
onChange={(key) => setActiveTabKey(key)}
>
{TabPaneData.map((item) => (
<TabPane tab={item.tab} key={item.key}>
......@@ -462,19 +509,24 @@ const HistoryInfo = (props) => {
{renderOptions(item)}
{!dataSource.length && <Empty />}
{!!dataSource.length && (
<div>
<div className={classNames(`${prefixCls}-wrap`)}>
<div className={classNames(`${prefixCls}-main`)}>
{item.key === 'curve' && (
<div className={classNames(`${prefixCls}-chart`)} ref={container}>
<HighchartsReact
immutable={true}
highcharts={Highcharts}
constructorType={'stockChart'}
options={handleChartOptions()}
options={options}
allowChartUpdate={true}
/>
</div>
)}
{item.key === 'table' && (
<BasicTable dataSource={dataSource} columns={columns} {...tableProps} />
)}
</div>
</div>
)}
</div>
</TabPane>
......@@ -509,7 +561,7 @@ export default HistoryInfo;
const startFormat = 'YYYY-MM-DD 00:00:00';
const endFormat = 'YYYY-MM-DD 23:59:59';
const timeFormat = 'YYYY-MM-DD kk:mm:ss';
const timeFormat = 'YYYY-MM-DD HH:mm:ss';
const colors = [
'#1884EC',
......@@ -564,21 +616,6 @@ const defaultOptions = {
shared: true,
split: false,
valueDecimals: 3,
formatter: function () {
let _html = `<b>${Highcharts.dateFormat('%Y/%m/%d %H:%M', this.x)}</b><br/>`;
this.points.forEach((item) => {
_html += `<span style={{color: ${item.series.color}}}>${item.series.name}</span>:
<b>${
item.point.y.toFixed(
item.series.userOptions.decimalPoint
? item.series.userOptions.decimalPoint
: 2,
) * 1
}${item.series.userOptions.tooltip.valueSuffix}</b>
<br/>`;
});
return _html;
},
},
plotOptions: {
series: {
......@@ -707,10 +744,10 @@ const timeIntervalList = [
const DataPickerArr = [
{
key: 1,
value: '',
value: moment(),
},
{
key: 2,
value: '',
value: moment().subtract(1, 'days'),
},
];
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@history-info-prefix-cls: ~'@{ant-prefix}-history-info';
.@{history-info-prefix-cls} {
height: 100%;
.ant-tabs,
.ant-tabs-content {
height: 100%;
}
&-content {
display: flex;
flex-direction: column;
height: 100%;
padding: 10px 0 0 0;
}
&-wrap {
flex: 1;
overflow: hidden;
}
&-main {
width: 100%;
max-width: 100%;
height: 100%;
max-height: 100%;
}
&-chart {
width: 100%;
height: 100%;
}
&-time {
display: flex;
align-items: center;
......
......@@ -2,6 +2,33 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.3.12](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/imageselect@1.3.8...@wisdom-components/imageselect@1.3.12) (2021-04-26)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
- update quotaselect ([2bdb602](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/2bdb602dc2349b12aad76d3561dd90adfb71e9f6))
## [1.3.11](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/imageselect@1.3.10...@wisdom-components/imageselect@1.3.11) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update quotaselect ([2bdb602](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/2bdb602dc2349b12aad76d3561dd90adfb71e9f6))
## [1.3.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/imageselect@1.3.8...@wisdom-components/imageselect@1.3.10) (2021-04-22)
### Bug Fixes
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/imageselect@1.3.8...@wisdom-components/imageselect@1.3.9) (2021-04-22)
### Bug Fixes
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.3.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/imageselect@1.3.5...@wisdom-components/imageselect@1.3.8) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/imageselect`
> TODO: description
## Usage
```
const imageselect = require('@wisdom-components/imageselect');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/imageselect",
"version": "1.3.8",
"version": "1.3.12",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: ImageSelect - 图片选择
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
......@@ -2,7 +2,7 @@ import React, { useContext, useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Input, Image, Modal, Row, Col, ConfigProvider } from 'antd';
import Empty from '@wisdom-components/Empty';
import Empty from '@wisdom-components/empty';
import { PlusOutlined, SearchOutlined } from '@ant-design/icons';
import './index.less';
......@@ -50,7 +50,7 @@ const ImageSelect = ({ src, url, width, title, dataSource, onSearch, onSelect })
const renderImageList = (data = []) => {
return (
<Row gutter={[0, 24]}>
<Row gutter={[0, 12]}>
{!!data &&
data.map((item, index) => (
<Col
......@@ -93,6 +93,7 @@ const ImageSelect = ({ src, url, width, title, dataSource, onSearch, onSelect })
</div>
)}
</div>
{visible && (
<Modal
width={width}
centered
......@@ -111,7 +112,7 @@ const ImageSelect = ({ src, url, width, title, dataSource, onSearch, onSelect })
</div>
}
footer={null}
visible={visible}
visible={true}
onCancel={handleCancel}
className={classNames(`${prefixCls}-modal`)}
>
......@@ -126,6 +127,7 @@ const ImageSelect = ({ src, url, width, title, dataSource, onSearch, onSelect })
})}
{!imgList.length && <Empty />}
</Modal>
)}
</div>
);
};
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@image-select-prefix-cls: ~'@{ant-prefix}-image-select';
.@{image-select-prefix-cls} {
......@@ -80,8 +80,15 @@
}
&-item-wrap {
padding: 10px 0;
text-align: center;
border: 1px solid transparent;
&.selected {
background: linear-gradient(0deg, #f1f4fb 0%, #ffffff 100%);
border: 1px solid #b8d6fb;
border-radius: 2px;
}
}
&-item-wrap:hover {
......@@ -96,12 +103,6 @@
height: 40px;
}
&.selected {
background: linear-gradient(0deg, #f1f4fb 0%, #ffffff 100%);
border: 1px solid #b8d6fb;
border-radius: 2px;
}
&-item-text {
font-size: 12px;
white-space: nowrap;
......
......@@ -2,6 +2,13 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.10](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/mqttview@1.2.9...@wisdom-components/mqttview@1.2.10) (2021-04-26)
### Bug Fixes
- 修改 mqtt 连接配置 ([6c886a0](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/6c886a0d148ff89c915ab48e4adf2afbc7dd455c))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.2.9](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/mqttview@1.2.7...@wisdom-components/mqttview@1.2.9) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/MqttView`
# `@wisdom-components/mqttview`
> TODO: description
## Usage
```
const mqttView = require('@wisdom-components/MqttView');
const mqttView = require('@wisdom-components/mqttview');
// TODO: DEMONSTRATE API
```
'use strict';
const mqttView = require('..');
const mqttView = require('../lib');
describe('@wisdom-components/MqttView', () => {
describe('@wisdom-extend-components/MqttView', () => {
it('needs tests');
});
{
"name": "@wisdom-components/mqttview",
"version": "1.2.9",
"version": "1.2.10",
"description": "> TODO: description",
"author": "lijiwen <961370825@qq.com>",
"homepage": "",
"license": "ISC",
"main": "lib/MqttView.js",
"main": "lib/index.js",
"directories": {
"lib": "lib",
"test": "__tests__"
......
---
title: MqttView - Mqtt连接
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
......@@ -47,7 +47,6 @@ class MqttView {
};
//注册连接断开处理事件
this.saveWaClient.onConnectionLost = this.onSaveWaConnectionLost.bind(this);
//注册消息接收处理事件
this.saveWaClient.onMessageArrived = this.onSaveWaMessageArrived.bind(this);
this.saveWaClient.connect(this.saveWaOptions);
......
---
title: ParseForm - 台账解析
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
......@@ -2,6 +2,48 @@
All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.7.8](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.2...@wisdom-components/quotaselect@1.7.8) (2021-04-26)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
- update quotaselect ([2bdb602](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/2bdb602dc2349b12aad76d3561dd90adfb71e9f6))
## [1.7.7](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.6...@wisdom-components/quotaselect@1.7.7) (2021-04-22)
### Bug Fixes
- update package ([403ae9d](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/403ae9d9e5cec67084343cdbfc06370ee07b1681))
- update quotaselect ([2bdb602](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/2bdb602dc2349b12aad76d3561dd90adfb71e9f6))
## [1.7.6](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.2...@wisdom-components/quotaselect@1.7.6) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.7.5](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.2...@wisdom-components/quotaselect@1.7.5) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
- update package ([f0b3401](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/f0b34012654a1a9af9d20f72589b78671cb231a0))
## [1.7.4](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.2...@wisdom-components/quotaselect@1.7.4) (2021-04-22)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
## [1.7.3](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.7.2...@wisdom-components/quotaselect@1.7.3) (2021-04-21)
### Bug Fixes
- bug ([9f4ef61](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/commits/9f4ef61f7016acbc1992e37ba1ffeda66517022d))
## [1.7.2](https://g.civnet.cn:8443/ReactWeb5/wisdom-components/compare/@wisdom-components/quotaselect@1.6.0...@wisdom-components/quotaselect@1.7.2) (2021-04-20)
### Bug Fixes
......
# `@wisdom-components/quotaselect`
> TODO: description
## Usage
```
const quotaselect = require('@wisdom-components/quotaselect');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/quotaselect",
"version": "1.7.2",
"version": "1.7.8",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
......
---
title: QuotaSelect - 指标选择
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
......@@ -2,7 +2,7 @@ import React, { useContext, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Button, Input, Radio, Modal, Checkbox, Row, Col, Tree, ConfigProvider } from 'antd';
import Empty from '@wisdom-components/Empty';
import Empty from '@wisdom-components/empty';
import { ExclamationCircleFilled, SearchOutlined, CloseOutlined } from '@ant-design/icons';
import './index.less';
......@@ -40,8 +40,8 @@ const QuotaSelect = ({
let data = dataSource.map((item) => ({
...item,
checked: false,
title: item.Name,
key: item.Name,
title: item.name,
key: item.name,
}));
setAllQuotaList(data);
}
......@@ -71,7 +71,7 @@ const QuotaSelect = ({
// 过滤重点指标
const filterEmphasisQuota = () => {
let newQuotaList = [...allQuotaList];
newQuotaList = newQuotaList.filter((item) => item.IsShow === '1');
newQuotaList = newQuotaList.filter((item) => item.isShow === '1');
setQuotaList(newQuotaList);
};
......@@ -111,7 +111,7 @@ const QuotaSelect = ({
if (e.target.value !== '') {
let newQuotaList = [];
quotaList.forEach((item) => {
if (item.Name.indexOf(e.target.value) > -1) newQuotaList.push(item);
if (item.name.indexOf(e.target.value) > -1) newQuotaList.push(item);
});
setQuotaList(newQuotaList);
} else {
......@@ -221,13 +221,14 @@ const QuotaSelect = ({
return (
<div className={classNames(prefixCls)}>
<Button {...buttonProps} onClick={showModal} />
{visible && (
<Modal
centered
width={width}
title={title}
cancelText={cancelText}
okText={okText}
visible={visible}
visible={true}
onCancel={handleCancel}
onOk={onOk}
className={classNames(`${prefixCls}-modal`)}
......@@ -312,6 +313,7 @@ const QuotaSelect = ({
</div>
</div>
</Modal>
)}
</div>
);
};
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@quota-select-prefix-cls: ~'@{ant-prefix}-quota-select';
.@{quota-select-prefix-cls} {
......
# `@wisdom-components/RealTimeInfo`
# `@wisdom-components/realtimeinfo`
> TODO: description
## Usage
```
const realtimeinfo = require('@wisdom-components/RealTimeInfo');
const realtimeinfo = require('@wisdom-components/realtimeinfo');
// TODO: DEMONSTRATE API
```
---
title: RealTimeInfo - 实时数据查看
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@realtime-info-prefix-cls: ~'@{ant-prefix}-realtime-info';
.@{realtime-info-prefix-cls} {
......
# `@wisdom-components/TimeRangePicker`
# `@wisdom-components/timerangepicker`
> TODO: description
## Usage
```
const timeRangePicker = require('@wisdom-components/TimeRangePicker');
const timeRangePicker = require('@wisdom-components/timerangepicker');
// TODO: DEMONSTRATE API
```
---
title: TimeRangePicker - 自定义类型时间选择
nav:
title: 组件
title: 基础组件
path: /components
group:
path: /
......
@import (reference) '~antd/es/style/themes/default';
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@time-range-picker-prefix-cls: ~'@{ant-prefix}-time-range-picker';
.@{time-range-picker-prefix-cls} {
......
# `@wisdom-components/ec-devicetree`
> TODO: description
## Usage
```
const ECDeviceTree = require('@wisdom-components/ec-devicetree');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/ec-devicetree",
"version": "1.0.0",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
"license": "ISC",
"main": "lib/index.js",
"directories": {
"lib": "lib",
"test": "__tests__"
},
"files": [
"lib"
],
"publishConfig": {
"registry": "https://g.civnet.cn:4873/"
},
"repository": {
"type": "git",
"url": "https://g.civnet.cn:8443/ReactWeb5/wisdom-components.git"
},
"scripts": {
"test": "echo \"Error: run tests from root\" && exit 1"
}
}
---
title: EC-DeviceTree - 设备树
nav:
title: 业务组件
path: /extend-components
group:
path: /
---
# EC-DeviceTree 设备树
基础业务组件
- 允许单设备选择
- 允许多设备选择
- 允许搜索设备树
## 何时使用
- 在设备树选择时。
## 代码演示
<code src="./demos/Basic.tsx">
## API
api 参考 Antd Tree 组件 https://ant.design/components/tree-cn/
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| prefix | 搜索框的前置图标 | ReactNode | 搜索 icon |
| placeholder | 搜索框占位符 | string | 搜索设备名称 |
| checkable | 节点前添加 Checkbox 复选框 | boolean | false |
| serviceParams | 服务参数 | object | { pageIndex: 1, pageSize: 500, deviceTypes: '二供泵房,二供机组', getChild: true, userID: 1, queryInfo: '', sortFields: '', direction: '', isTop: true } |
| deviceTreeService `必需` | 设备树服务 | promise | - |
| onTreeCheck | 点击复选框触发 | function(checkedNodes){ } | - |
| onTreeSelect | 点击树节点触发 | function(selectedNodes){ } | - |
import React from 'react';
import PandaDeviceTree from '../index';
import { service } from '@wisdom-utils/utils';
const REQUEST_HTTP = 'http';
const REQUEST_METHOD_POST = 'post';
const GET_DEVICE_LIST =
'https://www.fastmock.site/mock/162c15dca15c4dba9ba51e0a0b76929b/api/Publish/Monitor/Device/DeviceTree'; //获取设备树列表
const deviceTreeService = {
getDeviceList: {
url: GET_DEVICE_LIST,
method: REQUEST_METHOD_POST,
type: REQUEST_HTTP,
},
};
const dtService = service(deviceTreeService);
const getDeviceList = dtService.getDeviceList;
const Demo = () => {
const onTreeCheck = (checkedKeysValue) => {
console.log('onTreeCheck', checkedKeysValue);
};
const onTreeSelect = (selectedKeysValue) => {
console.log('onTreeSelect', selectedKeysValue);
};
return (
<div style={{ width: '200px', height: '400px', border: '1px solid #eee' }}>
<PandaDeviceTree
checkable
onTreeCheck={onTreeCheck}
onTreeSelect={onTreeSelect}
deviceTreeService={getDeviceList}
serviceParams={
{
// pageIndex: 1,
// pageSize: 20,
// deviceTypes: '二供泵房,二供机组',
// getChild: true,
// userID: 1,
// queryInfo: '',
// sortFields: '',
// direction: '',
// isTop: true,
}
}
/>
</div>
);
};
export default Demo;
import React, { useContext, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Input, Tree, Divider, message, ConfigProvider } from 'antd';
import { SearchOutlined } from '@ant-design/icons';
import Empty from '@wisdom-components/empty';
import './index.less';
const DeviceTree = (props) => {
const {
prefix,
placeholder,
deviceTreeService,
serviceParams,
onTreeCheck,
onTreeSelect,
} = props;
const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
const prefixCls = getPrefixCls('ec-device-tree');
const [treeData, setTreeData] = useState([]);
const [params, setParams] = useState({});
useEffect(() => {
const param = {
pageIndex: serviceParams.pageIndex || 1,
pageSize: serviceParams.pageSize || 500,
deviceTypes: serviceParams.deviceTypes || '二供泵房,二供机组',
getChild: serviceParams.getChild || true,
userID: serviceParams.userID || 1,
queryInfo: serviceParams.queryInfo || '',
sortFields: serviceParams.sortFields || '',
direction: serviceParams.direction || '',
isTop: serviceParams.isTop || true,
};
setParams(param);
}, []);
const handleData = (data) => {
data.forEach((item) => {
item.title = item.DeviceName;
item.key = item.StationID;
item.children = handleData(item.children);
});
return data;
};
const fetchData = (param = {}) => {
deviceTreeService(param).then((response) => {
if (response.code === 0) {
const data = response.data
? response.data.list && response.data.list.length > 0
? response.data.list[0].DeviceList
: []
: [];
setTreeData(handleData(data));
} else {
message.error(response.msg);
}
});
};
useEffect(() => {
if (JSON.stringify(params) !== '{}') {
fetchData(params);
}
}, [params]);
const onSearch = (e) => {
if (e.type === 'keydown' || e.target.value === '') {
const param = { ...params, queryInfo: e.target.value };
setParams(param);
}
};
// 选中复选框
const onCheck = (checkedKeysValue) => {
const checkedTree = [];
treeData.forEach((item) => {
if (checkedKeysValue.includes(item.key)) {
checkedTree.push(item);
}
if (item.children.length > 0) {
item.children.forEach((child) => {
if (checkedKeysValue.includes(child.key)) {
checkedTree.push(child);
}
});
}
});
onTreeCheck(checkedTree);
};
const onSelect = (selectedKeysValue, info) => {
onTreeSelect(info.selectedNodes);
};
return (
<div className={classNames(prefixCls)}>
<Input
prefix={prefix}
placeholder={placeholder}
bordered={false}
onChange={onSearch}
onPressEnter={onSearch}
/>
<Divider />
<div className={classNames(`${prefixCls}-content`)}>
{!!treeData.length && (
<Tree treeData={treeData} onCheck={onCheck} onSelect={onSelect} {...props} />
)}
{!treeData.length && <Empty />}
</div>
</div>
);
};
DeviceTree.defaultProps = {
prefix: <SearchOutlined />,
placeholder: '搜索设备名称',
serviceParams: {},
onTreeCheck: () => {},
onTreeSelect: () => {},
deviceTreeService: () => {},
};
DeviceTree.propTypes = {
prefix: PropTypes.node,
placeholder: PropTypes.string,
serviceParams: PropTypes.object,
onTreeCheck: PropTypes.func,
onTreeSelect: PropTypes.func,
deviceTreeService: PropTypes.func,
};
export default DeviceTree;
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@ec-device-tree-prefix-cls: ~'@{ant-prefix}-ec-device-tree';
.@{ec-device-tree-prefix-cls} {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
padding: 5px;
.ant-divider {
margin: 6px 0 12px 0;
}
.ant-tree-checkbox {
margin: 4px 2px 0 0;
}
.ant-tree-title {
white-space: nowrap;
}
&-content {
flex: 1;
overflow-y: scroll;
}
}
# `@wisdom-components/EC-QuotaSelect`
> TODO: description
## Usage
```
const ecQuotaSelect = require('@wisdom-components/EC-QuotaSelect');
// TODO: DEMONSTRATE API
```
{
"name": "@wisdom-components/ec-quotaselect",
"version": "1.0.0",
"description": "> TODO: description",
"author": "tuqian <webtuqian@163.com>",
"homepage": "",
"license": "ISC",
"main": "lib/EC-QuotaSelect.js",
"directories": {
"lib": "lib",
"test": "__tests__"
},
"files": [
"lib"
],
"publishConfig": {
"registry": "https://g.civnet.cn:4873/"
},
"repository": {
"type": "git",
"url": "https://g.civnet.cn:8443/ReactWeb5/wisdom-components.git"
},
"scripts": {
"test": "echo \"Error: run tests from root\" && exit 1"
}
}
---
title: EC-QuotaSelect - 指标选择
nav:
title: 业务组件
path: /extend-components
group:
path: /
---
# EC-QuotaSelect 指标选择
基础业务组件
- 允许对分类指标进行选择
- 允许限制选择最大指标数
- 允许搜索指标
## 何时使用
- 在指标选择时。
## 代码演示
<code src="./demos/Basic.tsx">
## API
指标选择按钮 props 参考 https://ant.design/components/button-cn/#API
已选指标树 props 参考 https://ant.design/components/tree-cn/#API
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| buttonProps | 指标选择按钮 | object | { } |
| width | 模态框宽度 | number | 900 |
| title | 模态框标题 | string | 选择显示字段 |
| cancelText | 模态框取消按钮文字 | string | 取消选择 |
| okText | 模态框确认按钮文字 | string | 确定 |
| placeholder | 搜索框占位符 | string | 搜索关键词 |
| searchPrefix | 搜索框前置图标 | ReactNode | SearchOutlined |
| maximum`必需` | 最多可选择指标数量 | number | 0 |
| deviceList`必需` | 设备列表数据源 | array | [ ] |
| confList `必需` | 设备配置数据源 | array | [ ] |
| user | 用户登录名 | string | null |
| pointType`必需` | 指标类型 | string | cardPoints |
| treeProps | 已选指标树 props | object | { } |
| onSelect | 模态框点击确定,选中的数据 | function(device, selectKey, selectList){ } | - |
| onModalCancel | 点击模态框取消按钮的回调 | function(value){ } | - |
| onModalOk | 模态框点击确定回调 | function(value){ } | - |
| onModalClose | 模态框点击关闭回调 | function(value){ } | - |
| quotaListService`必需` | 获取指标列表的服务 | promise | - |
| updateDeviceConfService`user存在时必需` | 更新设备配置的服务 | promise | - |
// @ts-ignore
import React, { useEffect, useState } from 'react';
import request from 'umi-request';
import { UnorderedListOutlined, SearchOutlined } from '@ant-design/icons';
import PandaQuotaSelect from '../index';
import { service } from '@wisdom-utils/utils';
const REQUEST_HTTP = 'http';
const REQUEST_METHOD_GET = 'get';
const REQUEST_METHOD_POST = 'post';
const GET_QUOTA_LIST =
'https://www.fastmock.site/mock/162c15dca15c4dba9ba51e0a0b76929b/api/Publish/Monitor/Device/GetQuotaList'; //获取指标列表
const GET_DEVICE_CONF =
'https://www.fastmock.site/mock/162c15dca15c4dba9ba51e0a0b76929b/api/Publish/Monitor/Device/GetDeviceConf'; //获取设备配置
const UPDATE_DEVICE_CONF =
'https://www.fastmock.site/mock/162c15dca15c4dba9ba51e0a0b76929b/api/Publish/Monitor/Device/SaveDeviceConf'; //更新设备配置
const quotaSelectService = {
getQuotaList: {
url: GET_QUOTA_LIST,
method: REQUEST_METHOD_GET,
type: REQUEST_HTTP,
},
getDeviceConf: {
url: GET_DEVICE_CONF,
method: REQUEST_METHOD_GET,
type: REQUEST_HTTP,
},
updateDeviceConfService: {
url: UPDATE_DEVICE_CONF,
method: REQUEST_METHOD_POST,
type: REQUEST_HTTP,
},
};
const qsService = service(quotaSelectService);
const getQuotaList = qsService.getQuotaList;
const getDeviceConf = qsService.getDeviceConf;
const updateDeviceConfService = qsService.updateDeviceConfService;
const pointType = 'cardPoints';
const Demo = () => {
const [deviceList, setDeviceList] = useState([]); // 设备列表
const [confList, setConfList] = useState([]); // 设备配置列表
const fetchData = () => {
getDeviceConf({
user: 'user',
showAll: true,
deviceType: '二供泵房,二供机组',
})
.then(function (response) {
if (response.code == '0') {
let curData = response.data;
DeviceList.forEach((item) => {
curData.forEach((child) => {
if (item.deviceType === child.deviceType) item.confList = child[pointType].split(',');
});
});
setConfList(curData);
setDeviceList(DeviceList);
}
})
.catch(function (error) {
console.log(error);
});
};
useEffect(() => {
fetchData();
}, []);
const onModalOk = () => {
console.log('onModalOk');
};
const onModalClose = () => {
console.log('onModalClose');
};
const onModalCancel = () => {
console.log('onModalCancel');
};
const onSelect = ({ device, selectKey, selectList }) => {
let list = [...deviceList];
list.forEach((child) => {
if (child.stationID === device.stationID) {
child.confList = selectKey;
}
});
setDeviceList(list);
};
return (
<>
<h3>无 user, 无“保存修改”按钮</h3>
<PandaQuotaSelect
buttonProps={
{
// icon: <UnorderedListOutlined />,
// children: `指标选择(${selectData.length})`,
}
}
deviceList={deviceList}
quotaListService={getQuotaList}
pointType={pointType}
onSelect={onSelect}
// onModalCancel={onModalCancel}
// onModalOk={onModalOk}
// onModalClose={onModalClose}
maximum={5}
/>
<br />
<h3>带 user, 有“保存修改”按钮</h3>
<PandaQuotaSelect
buttonProps={
{
// icon: <UnorderedListOutlined />,
// children: `指标选择(${selectData.length})`,
}
}
deviceList={deviceList}
quotaListService={getQuotaList}
updateDeviceConfService={updateDeviceConfService}
confList={confList}
pointType={pointType}
onSelect={onSelect}
onModalCancel={onModalCancel}
onModalOk={onModalOk}
onModalClose={onModalClose}
maximum={5}
user={'user'}
/>
</>
);
};
export default Demo;
const DeviceList = [
{
deviceName: '001东北明珠',
shortName: '001东北明珠',
code: 'EGBF00000001',
fatherCode: null,
deviceType: '二供泵房',
entryTime: '2020-03-29 04:20:49',
deviceGroup: '箱式变频',
pointAddressID: 4,
children: [],
stationID: 27,
},
{
deviceName: '低区',
shortName: '低区',
code: 'EGJZ00000162',
fatherCode: 'EGBF00000001',
deviceType: '二供机组',
entryTime: '2020-03-29 04:20:49',
deviceGroup: '箱式变频',
pointAddressID: 30,
children: [],
stationID: 28,
},
{
deviceName: '002世元国际',
shortName: '002世元国际',
code: 'EGBF00000002',
fatherCode: null,
deviceType: '二供机组',
entryTime: '2020-03-29 04:24:19',
deviceGroup: '智慧标准泵房',
pointAddressID: 4,
children: [],
stationID: 29,
},
];
import React, { useContext, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import {
Button,
Input,
Radio,
Modal,
Checkbox,
Row,
Col,
Tree,
ConfigProvider,
message,
} from 'antd';
import Empty from '@wisdom-components/empty';
import {
UnorderedListOutlined,
ExclamationCircleFilled,
SearchOutlined,
CloseOutlined,
} from '@ant-design/icons';
import './index.less';
const { TreeNode } = Tree;
const QuotaSelect = ({
buttonProps,
deviceList,
quotaListService,
updateDeviceConfService,
confList,
onSelect,
pointType,
width,
title,
cancelText,
okText,
onModalOk,
onModalClose,
onModalCancel,
searchPrefix,
placeholder,
maximum,
user,
treeProps,
}) => {
const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
const prefixCls = getPrefixCls('ec-quota-select');
const [visible, setVisible] = useState(false);
const [targetValue, setTargetValue] = useState('emphasis');
const [allQuotaList, setAllQuotaList] = useState([]);
const [quotaList, setQuotaList] = useState([]);
const [selectDevice, setSelectDevice] = useState({}); // 选中的设备
const [selectData, setSelectData] = useState([]); // 选中的指标数据
const [confParams, setConfParams] = useState({});
const fetchData = (item = {}) => {
// 请求指标列表
quotaListService({
acountName: item.deviceType,
addrSchemeID: item.pointAddressID,
}).then((res) => {
if (res.code === 0) {
const data =
res.data.length > 0
? res.data.map((child) => ({
...child,
checked: item.confList.includes(child.name),
title: child.name,
key: child.name,
}))
: [];
setAllQuotaList(data);
setSelectData(data.filter((child) => child.checked));
} else {
message.error(res.msg);
}
});
};
// 更新设备配置
const updateDeviceConf = () => {
const params = {
...confParams,
loginName: user,
type: '用户',
};
const curSelectList = JSON.parse(JSON.stringify(selectData));
const curSelectKey = curSelectList.map((child) => child.key);
params[pointType] = curSelectKey.join(',');
updateDeviceConfService(params).then((response) => {
if (response.code === 0) {
message.success('保存成功');
} else {
message.error(response.msg);
}
});
};
useEffect(() => {
if (targetValue === 'emphasis') {
filterEmphasisQuota();
} else {
setQuotaList(allQuotaList);
}
}, [allQuotaList]);
useEffect(() => {
let data = JSON.parse(JSON.stringify(allQuotaList));
data.forEach((item) => {
item.checked = false;
if (selectData.length > 0) {
selectData.forEach((child) => {
if (child.key === item.key) {
item.checked = true;
}
});
}
});
setAllQuotaList(data);
}, [selectData]);
// 过滤重点指标
const filterEmphasisQuota = () => {
let newQuotaList = [...allQuotaList];
newQuotaList = newQuotaList.filter((item) => item.isShow === '1');
setQuotaList(newQuotaList);
};
// 展示模态框
const showModal = (item) => {
setVisible(true);
setSelectDevice(item);
fetchData(item);
};
useEffect(() => {
const param = confList.filter((child) => child.deviceType === selectDevice.deviceType)[0];
setConfParams({ ...param });
}, [selectDevice]);
// 关闭模态框
const handleCancel = (e) => {
if (e.target.innerHTML === cancelText) {
setSelectData([]);
onModalCancel && onModalCancel();
} else {
onModalClose && onModalClose();
setVisible(false);
}
};
const onOk = () => {
onModalOk && onModalOk();
handleOk();
setVisible(false);
};
const handleOk = () => {
const curSelectList = JSON.parse(JSON.stringify(selectData));
const curSelectKey = curSelectList.map((child) => child.key);
onSelect({
device: selectDevice,
selectKey: curSelectKey,
selectList: curSelectList,
});
};
// 切换重点与全部
const onRadioChange = (e) => {
if (e.target.value === 'all') {
setQuotaList(allQuotaList);
} else {
filterEmphasisQuota();
}
setTargetValue(e.target.value);
};
// 搜索指标
const onSearch = (e) => {
if (e.type === 'keydown' || e.target.value === '') {
if (e.target.value !== '') {
let newQuotaList = [];
quotaList.forEach((item) => {
if (item.name.indexOf(e.target.value) > -1) newQuotaList.push(item);
});
setQuotaList(newQuotaList);
} else {
if (targetValue === 'all') {
setQuotaList(allQuotaList);
} else {
filterEmphasisQuota();
}
}
}
};
// 处理复选框点击事件
const handleCheckboxChange = (e, item) => {
let curSelectList = JSON.parse(JSON.stringify(selectData));
if (item.checked) {
curSelectList = curSelectList.filter((child) => child.title !== item.title);
} else {
curSelectList.push({ ...item, checked: !item.checked });
}
setSelectData(curSelectList);
};
// 处理取消选择按钮点击事件
const handleCancelSelect = ({ title }) => {
let data = [...selectData];
data = data.filter((item) => item.title !== title);
setSelectData(data);
};
// 拖动选中树节点
const handleDrop = (info) => {
const dropKey = info.node.key;
const dragKey = info.dragNode.key;
const dropPos = info.node.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
const loop = (data, key, callback) => {
for (let i = 0; i < data.length; i++) {
if (data[i].key === key) {
return callback(data[i], i, data);
}
if (data[i].children) {
loop(data[i].children, key, callback);
}
}
};
const data = [...selectData];
let dragObj;
loop(data, dragKey, (item, index, arr) => {
arr.splice(index, 1);
dragObj = item;
});
if (!info.dropToGap) {
loop(data, dropKey, (item) => {
item.children = item.children || [];
item.children.unshift(dragObj);
});
} else if (
(info.node.props.children || []).length > 0 && // Has children
info.node.props.expanded && // Is expanded
dropPosition === 1 // On the bottom gap
) {
loop(data, dropKey, (item) => {
item.children = item.children || [];
item.children.unshift(dragObj);
});
} else {
let ar;
let i;
loop(data, dropKey, (item, index, arr) => {
ar = arr;
i = index;
});
if (dropPosition === -1) {
ar.splice(i, 0, dragObj);
} else {
ar.splice(i + 1, 0, dragObj);
}
}
setSelectData(data);
};
return (
<div className={classNames(prefixCls)}>
<div className={classNames(`${prefixCls}-btn-wrap`)}>
{deviceList.length &&
deviceList.map((item, index) => (
<Button
key={index}
icon={<UnorderedListOutlined />}
{...buttonProps}
onClick={() => showModal(item)}
>
{buttonProps.children
? buttonProps.children
: `${item.deviceName}(${item.confList ? item.confList.length : 0})`}
</Button>
))}
</div>
{visible && (
<Modal
centered
width={width}
title={title}
cancelText={cancelText}
okText={okText}
visible={true}
onCancel={handleCancel}
onOk={onOk}
className={classNames(`${prefixCls}-modal`)}
footer={[
user ? (
<Button
style={{ float: 'left' }}
key="save"
type="primary"
onClick={() => {
updateDeviceConf();
onOk();
}}
>
保存修改
</Button>
) : null,
<Button key="cancel" onClick={handleCancel}>
取消选择
</Button>,
<Button key="ok" type="primary" onClick={onOk}>
确定
</Button>,
]}
>
<div className={classNames(`${prefixCls}-modal-wrap`)}>
<div className={classNames(`${prefixCls}-modal-left`)}>
<div className={classNames(`${prefixCls}-modal-select-wrap`)}>
<Input
className={classNames(`${prefixCls}-modal-search`)}
placeholder={placeholder}
bordered={false}
prefix={searchPrefix}
onChange={onSearch}
onPressEnter={onSearch}
/>
<div className={classNames(`${prefixCls}-modal-target`)}>
<div>指标:</div>
<Radio.Group onChange={onRadioChange} value={targetValue}>
<Radio.Button value="emphasis">重点指标</Radio.Button>
<Radio.Button value="all">全部</Radio.Button>
</Radio.Group>
</div>
<div
className={classNames(`${prefixCls}-modal-select`, {
warning: !(selectData.length < maximum),
})}
>
{selectData.length < maximum ? (
<>
<ExclamationCircleFilled />
<div>已选择 {selectData.length} 个指标</div>
</>
) : (
<>
<ExclamationCircleFilled />
<div>已达上限,最多选择 {maximum} 个指标</div>
</>
)}
</div>
</div>
<div className={classNames(`${prefixCls}-modal-option-wrap`)}>
{!quotaList.length && <Empty />}
<Row gutter={[0, 6]}>
{!!quotaList.length &&
quotaList.map((item) => (
<Col span={8} key={item.key}>
<Checkbox
value={item.title}
checked={item.checked}
disabled={
(selectData.length > maximum || selectData.length === maximum) &&
!item.checked
}
onChange={(e) => handleCheckboxChange(e, item)}
>
{item.title}
</Checkbox>
</Col>
))}
</Row>
</div>
</div>
<div className={classNames(`${prefixCls}-modal-right`)}>
<div className={classNames(`${prefixCls}-modal-number`)}>
已选:{selectData.length}/{maximum}
</div>
<div className={classNames(`${prefixCls}-modal-tree`)}>
<Tree draggable={true} onDrop={handleDrop} {...treeProps}>
{selectData.map((item) => (
<TreeNode
key={item.key}
title={
<div className={classNames(`${prefixCls}-modal-tree-title`)}>
<div>{item.title}</div>
<CloseOutlined onClick={() => handleCancelSelect(item)} />
</div>
}
/>
))}
</Tree>
</div>
</div>
</div>
</Modal>
)}
</div>
);
};
QuotaSelect.defaultProps = {
buttonProps: {},
width: 900,
title: '选择显示字段',
cancelText: '取消选择',
okText: '确定',
placeholder: '搜索关键词',
searchPrefix: <SearchOutlined />,
maximum: 0,
user: null,
pointType: 'cardPoints',
deviceList: [],
confList: [],
treeProps: {},
quotaListService: () => {},
updateDeviceConfService: () => {},
onSelect: () => {},
onModalCancel: () => {},
onModalOk: () => {},
onModalClose: () => {},
};
QuotaSelect.propTypes = {
buttonProps: PropTypes.object,
width: PropTypes.number,
title: PropTypes.string,
cancelText: PropTypes.string,
okText: PropTypes.string,
placeholder: PropTypes.string,
searchPrefix: PropTypes.node,
maximum: PropTypes.number,
user: PropTypes.string,
pointType: PropTypes.string,
deviceList: PropTypes.array,
confList: PropTypes.array,
treeProps: PropTypes.object,
quotaListService: PropTypes.func,
updateDeviceConfService: PropTypes.func,
onSelect: PropTypes.func,
onModalCancel: PropTypes.func,
onModalOk: PropTypes.func,
onModalClose: PropTypes.func,
};
export default QuotaSelect;
@import (reference) '../../../../node_modules/antd/es/style/themes/default';
@ec-quota-select-prefix-cls: ~'@{ant-prefix}-ec-quota-select';
.@{ec-quota-select-prefix-cls} {
&-btn-wrap {
overflow: auto;
white-space: nowrap;
button {
margin-right: 20px;
}
}
}
.@{ec-quota-select-prefix-cls}-modal {
&-wrap {
display: flex;
height: 500px;
}
&-left {
flex: 7;
border-right: 1px solid rgba(0, 0, 0, 0.2);
.empty {
margin: 128px 0;
}
}
&-right {
flex: 3;
}
&-select-wrap {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px 0 0;
}
&-search {
width: 160px;
background-color: #eef1f9;
border-radius: 15px;
.ant-input-prefix {
color: #5a6c8a;
}
}
&-search:hover {
background-color: #eef1f9;
}
&-target {
display: flex;
align-items: center;
margin: 0 10px 0 10px;
white-space: nowrap;
}
&-select {
display: flex;
align-items: center;
white-space: nowrap;
span {
margin-right: 6px;
color: #52c41a;
font-size: 16px;
}
}
&-select.warning {
color: #f0495d;
span {
color: #f0495d;
}
}
&-option-wrap {
height: calc(100% - 52px);
margin-top: 20px;
overflow-y: auto;
}
&-number {
margin-bottom: 10px;
padding: 4px 0 10px 20px;
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
}
&-tree {
height: calc(100% - 47px);
overflow-y: auto;
.ant-tree-treenode,
.ant-tree-node-content-wrapper {
width: 100%;
}
}
&-tree-title {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
}
......@@ -5,20 +5,26 @@ const { yParser } = require('@umijs/utils');
(async () => {
const args = yParser(process.argv);
const version = '1.0.0-beta.1';
const pkgs = readdirSync(join(__dirname, '../packages')).filter((pkg) => pkg.charAt(0) !== '.');
// readdirSync(join(__dirname, '../packages')).filter((pkg) => pkg.charAt(0) !== '.');
const pkgs = ['base-components', 'extend-components']
.map((dir) => {
const list = readdirSync(join(__dirname, '../packages', dir)).map((item) => `${item}!${dir}`);
return list.filter((pkg) => pkg.charAt(0) !== '.');
})
.flat();
pkgs.forEach((shortName) => {
const name = `@wisdom-components/pro-${shortName}`;
const [name, dir] = shortName.split('!');
const desc = `@wisdom-components/pro-${name}`;
const pkgJSONPath = join(__dirname, '..', 'packages', dir, name, 'package.json');
const pkgJSONPath = join(__dirname, '..', 'packages', shortName, 'package.json');
const pkgJSONExists = existsSync(pkgJSONPath);
let json;
if (args.force || !pkgJSONExists) {
json = {
name,
version,
description: name,
description: desc,
module: 'es/index.js',
main: 'lib/index.js',
types: 'lib/index.d.ts',
......@@ -32,7 +38,7 @@ const { yParser } = require('@umijs/utils');
authors: ['dengxiaofeng'],
license: 'MIT',
bugs: 'https://g.civnet.cn:8443/ReactWeb5/winsdom-components/plugins/issues',
homepage: `https://g.civnet.cn:8443/ReactWeb5/winsdom-components/tree/master/packages/${shortName}#readme`,
homepage: `https://g.civnet.cn:8443/ReactWeb5/winsdom-components/tree/master/packages/${name}#readme`,
peerDependencies: {
umi: '3.x',
},
......@@ -63,13 +69,13 @@ const { yParser } = require('@umijs/utils');
writeFileSync(pkgJSONPath, `${JSON.stringify(json, null, 2)}\n`);
}
const readmePath = join(__dirname, '..', 'packages', shortName, 'README.md');
const readmePath = join(__dirname, '..', 'packages', name, 'README.md');
if (args.force || !existsSync(readmePath)) {
writeFileSync(
readmePath,
`# ${name}
> ${json.description}.
See our website [${name}](https://umijs.org/plugins/${shortName}) for more information.
See our website [${name}](https://umijs.org/plugins/${name}) for more information.
## Install
Using npm:
\`\`\`bash
......
......@@ -52,7 +52,6 @@ const getMds = (allVersion = false) => {
.filter((tag) => tag.includes(pkg))
.map((tag) => tag.split('@').pop());
}
console.log(versions);
// eslint-disable-next-line array-callback-return
versions.map((version) => {
const versionPkg = `@wisdom-components/pro-${pkg}@${version}`;
......@@ -62,8 +61,8 @@ const getMds = (allVersion = false) => {
}
github.repos
.createRelease({
owner: 'wisdom-components',
repo: 'wisdom-components',
owner: 'wisdom-extend-components',
repo: 'wisdom-extend-components',
tag_name: versionPkg,
name: versionPkg,
body: changeLog,
......
const fs = require('fs');
const { join } = require('path');
const fg = require('fast-glob');
const getPackages = require('./utils/getPackages');
const pkgList = getPackages();
pkgList.map(async (pkg) => {
const [name, path] = pkg.split('!');
const baseUrl = `${join(__dirname, '../', 'packages')}/${path}/${name}/src`;
const lessFiles = await fg(`${baseUrl}/**/*.less`, {
ignore: ['**/demos/**'],
deep: 5,
});
const importFiles = lessFiles.map((lessPath) => {
return `@import "../es${lessPath.replace(baseUrl, '')}";`;
});
const distPath = `${join(__dirname, '../', 'packages', path, name, 'dist', `${name}.less`)}`;
if (fs.existsSync(distPath)) {
fs.writeFileSync(distPath, importFiles.join('\n'));
}
});
const path = require('path');
const fs = require('fs');
const writePkg = require('write-pkg');
const getPackages = require('./utils/getPackages');
const cwd = process.cwd();
const ignoreDirPath = ['.DS_Store'];
const filePath = path.resolve(cwd, 'package.json');
const packagesDir = path.resolve(cwd, 'packages');
// const packagesDir = path.resolve(cwd, 'packages');
const json = JSON.parse(fs.readFileSync(filePath, 'utf8'));
delete json['size-limit'];
let componentsNames = fs.readdirSync(packagesDir);
let componentsNames = getPackages();
componentsNames = componentsNames.filter((dir) => ignoreDirPath.indexOf(dir) === -1);
(async () => {
const sizeLimitConfig = [];
componentsNames.forEach((component) => {
const [shortName, p] = component.split('!');
sizeLimitConfig.push({
path: `packages/${component}/lib/**/*.js`,
path: `packages/${p}/${shortName}/lib/**/*.js`,
limit: '2 s',
webpack: false,
running: false,
});
sizeLimitConfig.push({
path: `packages/${component}/es/**/*.js`,
path: `packages/${p}/${shortName}/es/**/*.js`,
limit: '2 s',
webpack: false,
running: false,
......
......@@ -40,7 +40,7 @@ async function release() {
if (userRegistry.includes('https://registry.yarnpkg.com/')) {
printErrorAndExit(`Release failed, please use ${chalk.blue('npm run release')}.`);
}
//https://g.civnet.cn:4873
// https://g.civnet.cn:4873
// if (!userRegistry.includes('https://registry.npmjs.org/')) {
// const registry = chalk.blue('https://registry.npmjs.org/');
// printErrorAndExit(`Release failed, npm registry must be ${registry}.`);
......@@ -118,8 +118,11 @@ async function release() {
const pkgs = args.publishOnly ? getPackages() : updated;
logStep(`publish packages: ${chalk.blue(pkgs.join(', '))}`);
// eslint-disable-next-line consistent-return
pkgs.forEach((pkg, index) => {
const pkgPath = join(cwd, 'packages', pkg.replace('pro-', ''));
const [shortName, p] = pkg.split('!');
const pkgPath = join(cwd, 'packages', p, shortName.replace('pro-', ''));
// eslint-disable-next-line global-require,import/no-dynamic-require
const { name, version } = require(join(pkgPath, 'package.json'));
if (name === 'parseform') return false;
const isNext = isNextVersion(version);
......
......@@ -9,6 +9,7 @@ function replacePath(path) {
const esPath = dirname(join(cwd, `node_modules/${esModule}`));
if (fs.existsSync(esPath)) {
console.log(`[es build] replace ${path.node.source.value} with ${esModule}`);
// eslint-disable-next-line no-param-reassign
path.node.source.value = esModule;
}
}
......
......@@ -5,9 +5,11 @@ const getPackages = require('./utils/getPackages');
process.setMaxListeners(Infinity);
module.exports = (publishPkgList) => {
const pkgList = (publishPkgList || getPackages()).map((name) => {
const pkgList = (publishPkgList || getPackages()).map((pkg) => {
// eslint-disable-next-line global-require,import/no-dynamic-require
return require(join(__dirname, '../packages', name, 'package.json')).name;
const [name, path] = pkg.split('!');
// eslint-disable-next-line global-require,import/no-dynamic-require
return require(join(__dirname, '../packages', path, name, 'package.json')).name;
});
const commands = pkgList.map((pkg) => {
const subprocess = execa('tnpm', ['sync', pkg]);
......
......@@ -2,5 +2,12 @@ const { readdirSync } = require('fs');
const { join } = require('path');
module.exports = function getPackages() {
return readdirSync(join(__dirname, '../../packages')).filter((pkg) => pkg.charAt(0) !== '.');
return ['base-components', 'extend-components']
.map((dir) => {
const list = readdirSync(join(__dirname, '../../packages', dir)).map(
(item) => `${item}!${dir}`,
);
return list.filter((pkg) => pkg.charAt(0) !== '.');
})
.flat();
};
const path = require('path');
const fs = require('fs');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const { readdirSync } = require('fs');
const tailPkgs = readdirSync(path.join(__dirname, 'packages')).filter(
(pkg) => pkg.charAt(0) !== '.',
);
// const tailPkgs = readdirSync(path.join(__dirname, 'packages')).filter(
// (pkg) => pkg.charAt(0) !== '.',
// );
const tailPkgs = ['base-components', 'extend-components']
.map((dir) => {
const list = readdirSync(path.join(__dirname, 'packages', dir)).map((item) => `${item}!${dir}`);
return list.filter((pkg) => pkg.charAt(0) !== '.');
})
.flat();
const isCI = process.env.PRO_COMPONENTS_CI === 'CI';
const externals = isCI
? tailPkgs.reduce((pre, value) => {
const [name] = value.split('!');
return {
...pre,
[`@ant-design/pro-${value}`]: `Pro${value
[`@ant-design/pro-${name}`]: `Pro${name
.toLowerCase()
.replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`,
};
}, {})
: {};
console.log(externals);
const webPackConfigList = [];
// eslint-disable-next-line consistent-return
tailPkgs.forEach((pkg) => {
if (pkg == 'ParseForm') return false;
const [name, p] = pkg.split('!');
if (name === 'ParseForm') return false;
const entry = {};
entry[`${pkg}`] = `./packages/${pkg}/src/index.js`;
entry[`${pkg}.min`] = `./packages/${pkg}/src/index.js`;
entry[`${name}`] = `./packages/${p}/${name}/src/index.js`;
entry[`${name}.min`] = `./packages/${p}/${name}/src/index.js`;
const config = {
entry,
output: {
filename: '[name].js',
library: `WisDOM${pkg.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`,
library: `WisDOM${name.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`,
libraryExport: 'default',
path: path.resolve(__dirname, 'packages', pkg, 'dist'),
path: path.resolve(__dirname, 'packages', p, name, 'dist'),
globalObject: 'this',
},
mode: 'production',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment