@douyinfe/semi-ui 2.15.1 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -166,6 +166,35 @@ TransferDraggable.story = {
166
166
  name: 'Transfer draggable',
167
167
  };
168
168
 
169
+ export const TransferDraggableAndDisabled = () => {
170
+ const data = Array.from({ length: 30 }, (v, i) => {
171
+ return {
172
+ label: `选项名称 ${i}`,
173
+ value: i,
174
+ key: i,
175
+ disabled: true,
176
+ };
177
+ });
178
+ return (
179
+ <>
180
+ <div>Transfer设置draggable, 并且左侧面板中的选项disabled </div>
181
+ <div>符合预期的行为: 右侧面板hover不会出现删除按钮,因此不可以点击删除,但是可以拖拽 </div>
182
+ <Transfer
183
+ style={{ width: 568, height: 416 }}
184
+ dataSource={data}
185
+ defaultValue={[2, 4]}
186
+ draggable
187
+ onChange={(values, items) => console.log(values, items)}
188
+ />
189
+ </>
190
+ );
191
+ };
192
+
193
+ TransferDraggableAndDisabled.story = {
194
+ name: 'transfer draggable and disabled',
195
+ }
196
+
197
+
169
198
  const ControledTransfer = () => {
170
199
  const [value, setValue] = useState([2, 3]);
171
200
 
@@ -102,6 +102,12 @@ export interface ResolvedDataItem extends DataItem {
102
102
  _optionKey?: string | number;
103
103
  }
104
104
 
105
+ export interface DraggableResolvedDataItem {
106
+ key?: string | number;
107
+ index?: number;
108
+ item?: ResolvedDataItem;
109
+ }
110
+
105
111
  export type DataSource = Array<DataItem> | Array<GroupItem> | Array<TreeItem>;
106
112
 
107
113
  interface HeaderConfig {
@@ -511,12 +517,7 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
511
517
 
512
518
  renderRightItem(item: ResolvedDataItem): React.ReactNode {
513
519
  const { renderSelectedItem, draggable, type, showPath } = this.props;
514
- let newItem = item;
515
- if (draggable) {
516
- newItem = { ...item, key: item._optionKey };
517
- delete newItem._optionKey;
518
- }
519
- const onRemove = () => this.foundation.handleSelectOrRemove(newItem);
520
+ const onRemove = () => this.foundation.handleSelectOrRemove(item);
520
521
  const rightItemCls = cls({
521
522
  [`${prefixcls}-item`]: true,
522
523
  [`${prefixcls}-right-item`]: true,
@@ -536,7 +537,7 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
536
537
 
537
538
  return (
538
539
  // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex
539
- <div role="listitem" className={rightItemCls} key={newItem.key}>
540
+ <div role="listitem" className={rightItemCls} key={item.key}>
540
541
  {draggable ? <DragHandle /> : null}
541
542
  <div className={`${prefixcls}-right-item-text`}>{label}</div>
542
543
  <IconClose
@@ -562,14 +563,13 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
562
563
  renderRightSortableList(selectedData: Array<ResolvedDataItem>) {
563
564
  // when choose some items && draggable is true
564
565
  const SortableItem = SortableElement((
565
- (item: ResolvedDataItem) => this.renderRightItem(item)) as React.FC<ResolvedDataItem>
566
+ (props: DraggableResolvedDataItem) => this.renderRightItem(props.item)) as React.FC<DraggableResolvedDataItem>
566
567
  );
567
568
  const SortableList = SortableContainer(({ items }: { items: Array<ResolvedDataItem> }) => (
568
569
  <div className={`${prefixcls}-right-list`} role="list" aria-label="Selected list">
569
570
  {items.map((item, index: number) => (
570
- // sortableElement will take over the property 'key', so use another '_optionKey' to pass
571
571
  // @ts-ignore skip SortableItem type check
572
- <SortableItem key={item.label} index={index} {...item} _optionKey={item.key} />
572
+ <SortableItem key={item.label} index={index} item={item} />
573
573
  ))}
574
574
  </div>
575
575
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment