# nb-ui-components

> react && antd

Latest version **1.3.9** (published 2022-07-07) · MIT license · 0 weekly downloads

## Install

```sh
npm install nb-ui-components
pnpm add nb-ui-components
yarn add nb-ui-components
bun add nb-ui-components
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: esm support; no vulnerabilities.

Warnings: low downloads; no types.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.3.9 |
| Published | 2022-07-07 |
| First published | 2022-02-10 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Dependencies | 7 |
| Unpacked size | 1.1 MB |
| Known vulnerabilities | 0 (+2 in 1 direct dependencies) |
| Install scripts | no |
| Maintainers | li129 |
| Keywords | react, antd |

## Links

- npm: https://www.npmjs.com/package/nb-ui-components
- Homepage: http://.
- npm.io page: https://npm.io/package/nb-ui-components

## Dependencies (7)

- [web-vitals](https://npm.io/package/web-vitals.md) ^2.1.4
- [react-router](https://npm.io/package/react-router.md) ^6.2.2
- [react-scripts](https://npm.io/package/react-scripts.md) 5.0.0
- [react-router-dom](https://npm.io/package/react-router-dom.md) ^6.2.2
- [@testing-library/react](https://npm.io/package/@testing-library/react.md) ^12.1.3
- [@testing-library/jest-dom](https://npm.io/package/@testing-library/jest-dom.md) ^5.16.2
- [@testing-library/user-event](https://npm.io/package/@testing-library/user-event.md) ^13.5.0

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 1.3.9 (latest) — 2022-07-07
- 1.3.8 — 2022-07-07
- 1.3.7 — 2022-07-07
- 1.3.6 — 2022-07-07
- 1.3.5 — 2022-07-07
- 1.3.4 — 2022-07-07
- 1.3.3 — 2022-03-21
- 1.3.2 — 2022-03-15
- 1.3.1 — 2022-03-15
- 1.3.0 — 2022-03-11
- 1.2.0 — 2022-03-11
- 1.1.0 — 2022-03-09
- 1.0.9 — 2022-02-10
- 1.0.8 — 2022-02-10
- 1.0.7 — 2022-02-10
- … 7 more at https://npm.io/package/nb-ui-components/versions

## README

# ANTD-based UI framework for Nubomed  

react && antd

## Install

Before install the libarary, you need to : 
1. install antd 
```
npm i antd -S
```
2. install less、less-loader, you can install other versions, but need to  configure it correctly
```
npm i less@4.1.2 less-loader@7.3.0 -D
```
you can configure the react project as you want. Here are some suggestions provided.
* using npm run eject to produce the config file and add some config for less and less-options
* using some plugins to override configuration sucn as customize-cra、customize-cra-less-loader

after your configuration , checked if everything(like antd and less) work fine. Now, you can start to install the packages
```
npm i nb-ui-components -S
```
3. add color config in less modifyvars to override some antd's theme
```
{
    "@primary-color":"#0066E0",
    "@input-hover-border-color":"#0066E0",
    "@input-placeholder-color":"rgba(24, 29, 65, 0.5)",
    "@input-border-color":"#CAD0E0",
    "@input-color":" #181D41",
    "@border-radius-base":"8px",
    "@picker-date-hover-range-border-color":"#0066E0",
    "@picker-date-hover-range-color":"#0066E0",
    "@picker-basic-cell-hover-color": "#0066E0",
    "@picker-panel-cell-height":"48px",
    "@picker-panel-width":"560px",
    "@picker-text-height":"96px",
    "@tooltip-arrow-color":"rgba(24, 29, 65, 0.5)",
    "@tooltip-arrow-width":"40px"
}

```

### Usage

import components and use it like antd.
>以下组件除了列出来的Api，其他可参考antd对应组件的Api
#### NbTabs
使用方式
```
<NbTabs
  selectIndex={index}
  onChange={(index) => {
    setIndex(index)
  }}
></NbTabs>
```
参数Api （非antd)

|参数|说明|类型|默认值|可取值|
|:-:|:-:|:-:|:-:|:-:|
|selectIndex|选中tab索引|Number|--|--|
|type|tab类型|String|'page'|'page'、"title"、 或者 其他字符串|
|options|tab列表|Array|['菜单一','菜单二','菜单三']|--|
|onChange|切换tab方法|Function|--|

#### NbProgress
使用方式
```
 <NbProgress type="line" percent="50"></NbProgress>
```
参数Api (antd-progress组件)

|参数|说明|类型|默认值|可取值|
|:-:|:-:|:-:|:-:|:-:|
|type|progress类型|String|'circle'|'circle'、'line'|

>strokeWidth、 width 、trailColor 、strokeColor 设置有默认的值，不建议覆盖

#### NbSelectCom
使用方式 (antd-select组件)
```
<NbSelectCom
  optionslist={[{ label: 1, value: 1 }]}
  onChange={() => {}}
></NbSelectCom>
```
参数Api

|参数|说明|类型|默认值|可取值|
|:-:|:-:|:-:|:-:|:-:|
|check|是否显示下拉框列表后的自定义√,如果多选，设置true会替换antd自带的√|Boolean|true|ture、false|
|optionslist|下拉列表|Array|[]|[{label:'', value:''}]|
|maxShowDropdonwCount|默认下拉框展示的最大条数，超出滚动显示|Number|5|--|

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|maxTagPlaceholder|...|
|dropdownMatchSelectWidth|true|
|listHeight|lineHeight * maxShowDropdonwCount|
|dropdownMatchSelectWidth|true|
|suffixIcon|Icon组件|
|dropdownClassName|--|
|removeIcon|Icon组件|


#### NbSearch
使用方式
```
<NbSearch onChange={(e)=>{
        setValue(e.target.value)
      }} value={value} onSearch={(val)=>search(val)}></NbSearch>
```
参数Api (antd-Input.search组件)
无，使用antd的Api

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|enterButton|Icon组件|


#### NbSelectButton
使用方式
```
<NbSelectButton
  checked={checked}
  onChange={() => {
    setChecked(!checked)
  }}
>
  插槽内容
</NbSelectButton>
<NbSelectButton
  checked={checked1}
  options={[12, 23, 34]}
  onChange={(data) => {
    setChecked1(data.slice())
  }}
></NbSelectButton>
```
参数Api  (antd-Checkbox组件)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|checked|勾选数据|单选Boolean 多选Array|[]|--|checked值为数组默认多选|
|options|多选的数组|Array|[]|['按钮一']、 [{label:'1', value:'1'}]|--|
|onChange|选中状态改变|Function|单选：()=>{}, 多选：(checkedArr)=>{}|--|--|

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|onClick|()=>{emit('change')}|

#### NbCascader
使用方式
```
<NbCascader
  options={options}
  onChange={(value) => {
    console.log(value)
  }}
></NbCascader>
```
参数Api  (antd-Cascader组件)
参照antd组件Api

#### NbMenu
使用方式
```
<NbMenu menuList={[1, 2, 3]} content={content}></NbMenu>
```
参数Api  (antd-Menu组件)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|menuList|菜单列表|Array|[]|--|--|
|content|菜单内容|Function|null|函数 ({data={index, ...menu}})=>{return <><div></div></>}|

其他：参照antd组件Menu的Api

#### NbDropdown
使用方式
```
<NbDropdown
  DropdownMenu={
    <NbMenu
      onSelect={(data) => {
        console.log(data)
      }}
      selectable={true}
      menuList={[1, 2, 3, 4, 5, 6]}
    >
      <a>123s</a>
    </NbMenu>
  }
  DropdownTitle={<a>hello</a>}
></NbDropdown>
```
参数Api  (antd-Dropdown组件)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|overlayClassName|'nb-dropdown'|

其他：参照antd组件Menu的Api

 #### NbSteps
使用方式
```
<NbSteps current={current} stepOptions={['步骤一', '步骤二', '步骤三']}></NbSteps>
```
参数Api  (非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|current|当前步骤|Number|0|--|从0开始|
|stepOptions|步骤内容|Array|['步骤一', '步骤二', '步骤三']|[{title:'步骤一', icon:<Icon />}]、 ['步骤一']|



#### NbDatePicker && NbRangePicker
使用方式
```
<NbDatePicker onChange={(date, dateString)=>{
  setDate(date)
}} defaultValue={date}></NbDatePicker> 
<NbRangePicker onChange={(date)=>{
  console.log(date);
}} defaultValue={date1}></NbRangePicker>
```
中文版本
```
<NbRangePicker onChange={(date)=>{
  console.log(date);
}} defaultValue={date1}></NbRangePicker>
  <h2>中文日期</h2>
<NbConfigProvider>
```


#### NbAccount
使用方式
```
<NbAccount onChange={(e)=>{
  setAccount(e.target.value)
}} value={acount}></NbAccount>
```
参数Api (antd-Input组件)
无，使用antd的Api

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|prefix|Icon组件|





#### NbBadge
使用方式
```
<NbBadge count={1000}></NbBadge>
```
参数Api (antd-Badge组件)
无，使用antd的Api

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|overflowCount|999|

#### NbPages
使用方式
```
<NbPages onChange={(page,pageSize)=>{
  console.log(page, pageSize)
}} defaultCurrent={1} total={50} defaultCurrent={1} total={50}></NbPages>
```
参数Api (antd-Page组件)
无，使用antd的Api




#### NbButton
使用方式
```
<NbButton onClick={()=>{
  console.log('点击')
}}>123</NbButton>
```
参数Api （非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|type|按钮类型|String|'main'|'big-primary' ...|传入类型：场景-类型， 如果只传场景，按钮类型默认使用default 场景类型字段：big main icon text icontext 按钮类型: default primary danger minor(次要) disabled|
|onClick|点击事件|Function|--|

#### NbInput
使用方式
```
<NbInput value={input} onChange={(e)=>{
  setInput(e.target.value)
}}></NbInput>
```
参数Api (antd-Input组件)
无，使用antd的Api

占用的antd部分字段:

|参数|值|
|:-:|:-:|
|prefix|Icon组件|





#### NbResult
使用方式
```
<NbResult visible={visible}>
  文字插槽
</NbResult>
```
参数Api (antd-Modal组件)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|type|弹窗类型|String|'success'|'succes'、'error'、'warn'||

其他，使用antd的Api

方法
```
NbResult.success({
  content: '123',
})
```

方法类型：'succes'、'error'、'warn'、'loading'
方法参数：

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|content|文字内容|node|--|ReactNode||
|delayClosed|自动关闭时间|Number|--|Number|设置延时自动关闭，为0不关闭|

占用antd字段：
footer、className、bodyStyle、width、mask、maskClosable、content、icon  

#### NbMessage
使用方式 (antd-message)
```
NbMessage.success({
  content: '123',
})
```

方法类型：'succes'、'error'、'warn'
占用antd字段：
className、content、icon  

#### NbConfirm
使用方式
```
<NbConfirm
  visible={visible1}
  onCancel={() => setVisible1(false)}
></NbConfirm>
```
参数Api (antd-Modal组件)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|singleBtn|底部为单个按钮|Boolean|--|--||
|footerDom|底部插槽|VNode|--|--|优先级： 底部插槽 > singleBtn > 取消确定底部|
|confirmStyle|确定按钮样式|Object|{background: 'linear-gradient(180deg, #3385E6 0%, #0066E0 100%)',color: '#fff'}|--||

其他，使用antd的Api

占用antd字段：
className, title

#### NbDialog
使用方式
```
 <NbDialog onCancel={() => setVisible2(false)} visible={visible2}></NbDialog>
```
参数Api (antd-Modal组件)
无，使用antd的Api

#### NbNumberCounter
使用方式
```
<NbNumberCounter type="danger" value={value} onChange={(value)=>{
  setValue(value)
}}></NbNumberCounter>
```
参数Api (非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|type|数字框类型|String|'default'|'default'、'danger'、'normal'|蓝色、红色、黑色|
|value|数字框值|Number|0|数字|输入非数字，显示0|
|onChange|数字改变事件|Function|(value)=>{}|(value)=>{}||

#### NbSwitch
使用方式
```
<NbSwitch></NbSwitch>
```
参数Api (antd-Switch组件)
无，使用antd的Api

#### NbArrow
使用方式
```
<NbArrow open={checked}></NbArrow>
```
参数Api (非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|open|是否展开|Boolean|false|||
|onClick|切换展开合并|function|()=>{}|||


#### NbRadio NbRadioGroup
使用方式
```
<NbRadioGroup defaultValue={1}>
  <NbRadio value={1}></NbRadio>
  <NbRadio value={2}></NbRadio>
  <NbRadio value={3}></NbRadio>
</NbRadioGroup>
```
参数Api (antd-radio、radio.Group组件)
无，使用antd的Api

#### NbCheckbox NbCheckboxGroup
使用方式
```
<NbCheckboxGroup defaultValue={['A']} onChange={(value)=>{
  console.log(value, '---致');
}}>
  <NbCheckbox value={'A'} disabled />
  <NbCheckbox value={'B'} indeterminate={false} />
  <span>hello</span>
</NbCheckboxGroup>
```
参数Api (antd-checkbox、checkbox.Group组件)
无，使用antd的Api

#### NbTable 基础表格
使用方式
```
<NbTable dataSource={dataSource} columns={columns} fold={true} foldRow={(data)=>{
  setDataSource(data);
}}></NbTable>
```
参数Api (非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|fold|是否显示折叠箭头|Boolean|false|||
|columns|表头|Array||操作列的dataIndex请使用"operator"|[{title: '数字',dataIndex: 'number',width: 156, align:'center', strong:true, operate:true}]。 其中：align:文字居中方式， strong: 加粗效果, operate: 表示当前列数据需要切换编辑， 如数字切换成数字器， 效期切换成效期组件操作， 当行数据的editing改变时切换， 另需设置属性对应的编辑组件[属性-opt]的值|
|dataSource|表格内容|Array|[]|[{key:'', ['columns对应的dataIndex']:'',children:{columns:[], dataSource:[]}}]|columns字段：{...同上} dataSource字段：{editing:true,number:'123', numer-opt:()=>{}}。 其中：align:文字居中方式， strong: 加粗效果, editing: 是否处于编辑中状态, 编辑状态对应的数据切换成相应的操作, operate: 表示当前列数据需要切换编辑， 如数字切换成数字器， 效期切换成效期组件操作|
|foldRow|切换行内表格|Function|(data)=>{}|(value)=>{}||
|isControl|是否父行表格控制子数据全部编辑|Boolean|true||设置true后，子元素无法控制是否可编辑， 设置false， 父级无法控制子级编辑， 子级自己控制自己|

注意： 
为了实现编辑时组件和值的切换。dataSource表格内容提供了三种情况：
- 内容简单展示值 row['number']
- 内容需要定制 row['number'] = ()=>{return dom}
- 内容需要在值与组件之间切换（如数字点击编辑，进入数字器状态），此时columns数组dataIndex为number的对象operate属性需为true, 数据采用 number-opt 来做为编辑时的替换， 其他类似， 均为属性后拼接-opt

示例一：
```
<NbTable
  dataSource={dataSource}
  columns={columns}
  fold={true}
  foldRow={(data) => {
    setDataSource(data)
  }}
></NbTable>

// 对应的表格列表：
const columns = [
    {
      title: '位置',
      dataIndex: 'pos',
      width: 226,
    },
    {
      title: '品名',
      dataIndex: 'name',
      strong: true,
      width: 404,
    },
    {
      title: '规格',
      dataIndex: 'specification',
      width: 192,
    },
    {
      title: '中文',
      dataIndex: 'zh',
      width: 156,
    },
    {
      title: '英文数字',
      dataIndex: 'num',
      width: 148,
    },
    {
      title: '数量', // 标题
      dataIndex: 'number', // dataSource中对应的key
      width: 186, // 列宽
      strong: true, // 加粗
      align: 'center', // 文本方向
      operate:true // 可动态切换编辑
    },
    {
      title: '单位',
      dataIndex: 'unit',
      width: 168,
      align: 'center',
    },
    {
      title: '',
      dataIndex: 'operator',
      operate:true
    }
  ]
// 初始数据：
// 1. 默认展示数据， 无需做处理
// 2. name属性数据需要展示省略号，但不改变原始值 
const data = [
  {
    key: '1',
    pos: '柜子的名称-0000',
    name: "品名超过十二个的中间省略, 超过用省略号表示",
    specification: '0000…0000',
    zh: '中文内容',
    num: '00000000',
    number: 123,
    unit: '盒',
    children:{
      columns:[],
      dataSource:[]
    }
  }
]
data.forEach(item=>{
  let value = item.name;
  item.name = (opt)=>{
    // opt中可访问 rowIndex colKey属性
    if (value && value.length && value.length > 12) {
    return <div style={{color:'red'}}>{value
      .slice(0, 6)
      .concat('...')
      .concat(value.slice(-6))}</div>
    }
    return value
  }
}
// 3. 父级表格数据点击操作 编辑父级列的数据，同理，子级表格使用相同的处理
item['operator'] = (scopeData) => {
  // scopedDate 返回 {rowIndex: 父级行索引和子级table行索引用-拼接 , editing: 是否编辑状态，用于在不同状态显示不同的按钮 , colKey: 表格列}
  const { rowIndex, editing } = scopeData
  // 行索引 、行子表格索引
  const [fIdx, lIdx] = rowIndex.split('-')
  let newData = data
  let item = newData[fIdx];
  if(lIdx !== undefined){
    // 操作的是children行
    item = item.children.dataSource[lIdx]
  }
  return !editing ?
    <div style={{ display: 'flex' }}>
      <NbButton
        type="text-minor"
        onClick={() => {
          // list 父级中需要变成操作器的属性， 如需要从数字变成数字器
          const list = []
          // list 子级中需要变成操作器的属性， 如需要从数字变成数字器
          const childrenList = ['number', 'expiredDate']
          if(!lIdx){
            // 编辑父行及其子行 如number属性 添加一个changedNumber属性用于保存初始值， 便于后面取消编辑时还原数据
            list.forEach(key=>{
              item[`changed${key.slice(0,1).toUpperCase()+key.slice(1)}`] = item[key]
            })
            // 当前行子表格全部添加对应属性
            item.children.dataSource.forEach(list=>{
              childrenList.forEach(childKey=>{
                list[`changed${childKey.slice(0,1).toUpperCase()+childKey.slice(1)}`] = list[childKey]
              })
            })
          }else{
            childrenList.forEach(key=>{
              item[`changed${key.slice(0,1).toUpperCase()+key.slice(1)}`] = item[key] 
            })
          }
          item.editing = true;
          // data 赋值给newData 
          // data 赋值给dataSource
          // 操作newData 赋值给setDataSource 无法更新
          // 不能用newData无法更新 需要使用newData.slice()
          setDataSource(newData.slice())
        }}
      >
        编辑
      </NbButton>
      <div style={{ opacity: 0, width: '20px' }}></div>
      <NbButton
        type="text-primary"
        onClick={() => {
          newData.splice(rowIndex, 1)
          setDataSource(newData.slice())
        }}
      >
        删除
      </NbButton>
    </div>
  : <div style={{ display: 'flex' }}>
      <NbButton
        type="text-minor"
        onClick={() => {
          const list = []
          const childrenList = ['number', 'expiredDate']
          item['editing'] = false;
          if(!lIdx){
            // 保存时与编辑相反， 将changedNumber属性赋值number属性
            list.forEach(key=>{
              item[key] = item[`changed${key.slice(0,1).toUpperCase()+key.slice(1)}`]
            })
            // 当前行子表格全部添加对应属性
            item.children.dataSource.forEach(list=>{
              childrenList.forEach(childKey=>{
                list[childKey] = list[`changed${childKey.slice(0,1).toUpperCase()+childKey.slice(1)}`]
                console.log(list,`changed${childKey.slice(0,1).toUpperCase()+childKey.slice(1)}`);
              })
            })
          }else{
            childrenList.forEach(key=>{
              item[key]  = item[`changed${key.slice(0,1).toUpperCase()+key.slice(1)}`]
            })
          }
          setDataSource(newData.slice())
        }}
      >保存</NbButton>
      <div style={{ opacity: 0, width: '20px' }}></div>
      <NbButton type="text-primary"
        onClick={() => {
          item['editing'] = false;
          setDataSource(newData.slice())
        }}
      >取消</NbButton>
    </div>
  
}
```



#### NbExpireDate 效期组件
使用方式
```
<NbExpireDate date={dayjs(item.expiredDate)} onChange={(date)=>{
  item.changedExpiredDate = dayjs(date).format('YYYY-MM-DD');
  setDataSource(newData.slice())
}}></NbExpireDate>
```
参数Api (非antd)

|参数|说明|类型|默认值|可取值|备注|
|:-:|:-:|:-:|:-:|:-:|:-:|
|date|日期|Object|当前日期|dayjs||
|joinStr|日期连接符|String|'-'|["-", "/"]||
|yearCount|显示的年份个数|Number|7|Number||
|onChange|改变日期|Function|()=>{}|function||

---
_Source: https://npm.io/package/nb-ui-components · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
