Skip to content

Commit

Permalink
feat(rate): add disabled prop and clean code (#474)
Browse files Browse the repository at this point in the history
* feat:n-input Support hidden password

* feat(form): support require-mark-placement(#171)

* Revert "feat(form): support require-mark-placement(#171)"

This reverts commit 0627777.

* Revert "feat:n-input Support hidden password"

This reverts commit ea64917.

* feat(rate): add disabled prop and clean code

* feat(rate): add test

* feat(rate): fix code

* feat(rate): fix code

* feat(rate): fix test
  • Loading branch information
doom-9-zz authored Jul 12, 2021
1 parent 6ff56c5 commit b4a1ab6
Show file tree
Hide file tree
Showing 9 changed files with 72 additions and 21 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- `n-rate` add `allow-half` prop.
- `n-carousel` add `show-arrow` prop.
- `n-slider` add `format-tooltip` prop.
- `n-rate` add `readonly` prop.

### Fixes

Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

- `n-rate` 新增 `allow-half` 属性
- `n-carousel` 新增 `show-arrow` 属性
- `n-slider` 新增 `format-tooltip` 属性.
- `n-slider` 新增 `format-tooltip` 属性
- `n-rate` 新增 `readonly` 属性

### Fixes

Expand Down
2 changes: 2 additions & 0 deletions src/rate/demos/enUS/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ size
color
icon
allow-half
readonly
```

## Props
Expand All @@ -20,6 +21,7 @@ allow-half
| color | `string` | `undefined` | Icon color activated(support `#FFF`, `#FFFFFF`, `yellow`,`rgb(0, 0, 0)` formatted colors). |
| count | `number` | `5` | Icon count. |
| default-value | `number` | `0` | Value of activated icons by default. |
| readonly | `boolean` | `false` | Read only. |
| size | `'small' \| 'medium' \| 'large' \| number` | `'medium'` | Icon size. |
| value | `number` | `undefined` | Value of activated icons. |
| on-update:value | `(value: number) => void` | `undefined` | Callback when update value. |
Expand Down
5 changes: 5 additions & 0 deletions src/rate/demos/enUS/readonly.demo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Read only

```html
<n-rate readonly :default-value="3" />
```
2 changes: 2 additions & 0 deletions src/rate/demos/zhCN/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ size
color
icon
allow-half
readonly
```

## Props
Expand All @@ -20,6 +21,7 @@ allow-half
| color | `string` | `undefined` | 已激活图标颜色(支持形如 `#FFF``#FFFFFF``yellow``rgb(0, 0, 0)` 的颜色) |
| count | `number` | `5` | 图标个数 |
| default-value | `number` | `0` | 默认已激活图标个数 |
| readonly | `boolean` | `false` | 只读,交互失效 |
| size | `'small' \| 'medium' \| 'large' \| number` | `'medium'` | 图标尺寸 |
| value | `number` | `undefined` | 绑定已激活图标个数 |
| on-update:value | `(value: number) => void` | `undefined` | 激活图标个数改变时触发 |
Expand Down
5 changes: 5 additions & 0 deletions src/rate/demos/zhCN/readonly.demo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# 只读

```html
<n-rate readonly :default-value="3" />
```
33 changes: 22 additions & 11 deletions src/rate/src/Rate.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const rateProps = {
type: Number,
default: 0
},
readonly: Boolean,
size: {
type: [String, Number] as PropType<number | 'small' | 'medium' | 'large'>,
default: 'medium'
Expand Down Expand Up @@ -100,16 +101,12 @@ export default defineComponent({
function handleClick (index: number, e: MouseEvent): void {
doUpdateValue(getDerivedValue(index, e))
}
function handleHalfClick (index: number): void {
doUpdateValue(index + 0.5)
}
return {
mergedClsPrefix: mergedClsPrefixRef,
mergedValue: useMergedState(controlledValueRef, uncontrolledValueRef),
hoverIndex: hoverIndexRef,
handleMouseMove,
handleClick,
handleHalfClick,
handleMouseLeave,
cssVars: computed(() => {
const { size } = props
Expand All @@ -135,14 +132,20 @@ export default defineComponent({
},
render () {
const {
readonly,
hoverIndex,
mergedValue,
mergedClsPrefix,
$slots: { default: defaultSlot }
} = this
return (
<div
class={`${mergedClsPrefix}-rate`}
class={[
`${mergedClsPrefix}-rate`,
{
[`${mergedClsPrefix}-rate--readonly`]: readonly
}
]}
style={this.cssVars as CSSProperties}
onMouseleave={this.handleMouseLeave}
>
Expand All @@ -166,12 +169,20 @@ export default defineComponent({
: index + 1 <= mergedValue
}
]}
onClick={(e) => {
this.handleClick(index, e)
}}
onMousemove={(e) => {
this.handleMouseMove(index, e)
}}
onClick={
readonly
? undefined
: (e) => {
this.handleClick(index, e)
}
}
onMousemove={
readonly
? undefined
: (e) => {
this.handleMouseMove(index, e)
}
}
>
{icon}
{this.allowHalf ? (
Expand Down
23 changes: 14 additions & 9 deletions src/rate/src/styles/index.cssr.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { c, cB, cE, cM } from '../../../_utils/cssr'
import { c, cB, cE, cM, cNotM } from '../../../_utils/cssr'

// vars:
// --bezier
Expand All @@ -23,22 +23,27 @@ export default cB('rate', {
color .3s var(--bezier);
transform: scale(1);
font-size: var(--item-size);
cursor: pointer;
color: var(--item-color);
`, [
c('&:hover', {
transform: 'scale(1.05)'
}),
c('&:active', {
transform: 'scale(0.96)'
}),
c('&:not(:first-child)', {
marginLeft: '6px'
}),
cM('active', {
color: 'var(--item-color-active)'
})
]),
cNotM('readonly', `
cursor: pointer;
`, [
cE('item', [
c('&:hover', {
transform: 'scale(1.05)'
}),
c('&:active', {
transform: 'scale(0.96)'
})
])
]),
cE('half', `
display: flex;
transition: inherit;
Expand All @@ -49,7 +54,7 @@ export default cB('rate', {
width: 50%;
overflow: hidden;
color: var(--item-color);
`, [
`, [
cM('active', {
color: 'var(--item-color-active)'
})
Expand Down
19 changes: 19 additions & 0 deletions src/rate/tests/Rate.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,23 @@ describe('n-rate', () => {

wrapper.unmount()
})

it('should work with `readonly` prop', async () => {
const wrapper = mount(NRate)

await wrapper.setProps({ readonly: true })

expect(wrapper.find('.n-rate').classes()).toContain('n-rate--readonly')

await wrapper.setProps({ readonly: true, value: 3 })
expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)

await wrapper.findAll('.n-rate__item')[3].trigger('click')
expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)

await wrapper.findAll('.n-rate__item')[3].trigger('mousemove')
expect(wrapper.findAll('.n-rate__item--active').length).toBe(3)

wrapper.unmount()
})
})

0 comments on commit b4a1ab6

Please sign in to comment.