Skip to content

Commit 073fe37

Browse files
author
MargeBot
committed
Merge branch 'IDTEAM-improve-member-field-UX' into 'main'
[IDTEAM-4723] ListField improvements See merge request web/clients!16847
2 parents 2d34b96 + f533090 commit 073fe37

File tree

5 files changed

+63
-5
lines changed

5 files changed

+63
-5
lines changed

packages/pass/components/Form/Field/Layout/FieldBox.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export type FieldBoxProps = {
2424
icon?: IconName | ReactElement;
2525
unstyled?: boolean;
2626
onClick?: MouseEventHandler;
27+
onMouseDown?: MouseEventHandler;
2728
};
2829

2930
const stopOnClickPropagation = (nodes: MaybeArray<ReactElement>): MaybeArray<ReactElement> =>
@@ -56,6 +57,7 @@ const FieldBoxRender: ForwardRefRenderFunction<HTMLDivElement, FieldBoxProps> =
5657
className={clsx('pass-field-box flex flex-nowrap items-start', !props.unstyled && 'px-4 py-3', className)}
5758
ref={ref}
5859
onClick={props.onClick}
60+
onMouseDown={props.onMouseDown}
5961
>
6062
{icon && (
6163
<span

packages/pass/components/Form/Field/ListField.scss

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
li.pass-field-text-group--item {
1+
@import '~@proton/styles/scss/lib';
2+
3+
$base: 'pass-field-text-group--item';
4+
5+
li.#{$base} {
26
background-color: var(--interaction-norm-minor-1);
37
transition: background-color 0.2s;
48

@@ -16,13 +20,40 @@ li.pass-field-text-group--item {
1620

1721
span {
1822
user-select: text;
23+
white-space: nowrap;
1924

2025
&:focus {
2126
outline: none;
2227
color: var(--interaction-weak-contrast);
2328
}
2429
}
30+
31+
.#{$base}-delete {
32+
display: none;
33+
padding: em(2);
34+
block-size: em(20);
35+
inline-size: em(20);
36+
inset-inline-end: em(2.5);
37+
}
38+
}
39+
40+
&:not(&#{'\\:editing'}) {
41+
button:hover {
42+
span {
43+
inline-size: calc(100% - em(15));
44+
text-overflow: ellipsis;
45+
}
46+
47+
.#{$base}-delete {
48+
display: block;
49+
}
50+
}
2551
}
52+
53+
&#{'\\:editing'} {
54+
background-color: transparent;
55+
}
56+
2657
&#{'\\:error'} {
2758
background-color: transparent;
2859
border-color: var(--signal-danger);

packages/pass/components/Form/Field/ListField.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export const ListField = <
106106
evt.preventDefault();
107107
inputRef.current?.focus();
108108
}}
109+
onMouseDown={(evt) => evt.preventDefault()}
109110
>
110111
{label && (
111112
<label
@@ -194,6 +195,7 @@ export const ListField = <
194195
onChange={onChange(idx, entry)}
195196
onMoveLeft={onMoveLeft(idx)}
196197
onMoveRight={onMoveRight(idx)}
198+
onDelete={() => helpers.remove(idx)}
197199
renderValue={fieldValue}
198200
/>
199201
))}

packages/pass/components/Form/Field/ListFieldItem.tsx

+26-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
import type { KeyboardEventHandler } from 'react';
33
import { useRef, useState } from 'react';
44

5-
import { CircleLoader } from '@proton/atoms';
5+
import { ButtonLike, CircleLoader } from '@proton/atoms';
6+
import { Icon } from '@proton/components/index';
67
import clsx from '@proton/utils/clsx';
78

89
import type { ListFieldValue } from './ListField';
@@ -11,6 +12,7 @@ export type ListFieldItemProps<T> = ListFieldValue<T> & {
1112
error?: boolean;
1213
loading: boolean;
1314
onChange: (value: string) => void;
15+
onDelete: () => void;
1416
onMoveLeft: () => void;
1517
onMoveRight: () => void;
1618
renderValue: (value: T) => string;
@@ -37,6 +39,7 @@ export const ListFieldItem = <T,>({
3739
loading,
3840
value,
3941
onChange,
42+
onDelete,
4043
onMoveLeft,
4144
onMoveRight,
4245
renderValue,
@@ -88,11 +91,12 @@ export const ListFieldItem = <T,>({
8891
className={clsx(
8992
'pass-field-text-group--item flex flex-nowrap flex-row max-w-full overflow-hidden stop-propagation border rounded',
9093
error && 'pass-field-text-group--item:error',
91-
loading && 'pass-field-text-group--item:loading'
94+
loading && 'pass-field-text-group--item:loading',
95+
editing && 'pass-field-text-group--item:editing'
9296
)}
9397
>
9498
<button
95-
className="pill-remove inline-flex flex-nowrap items-center px-2 py-1 max-w-full gap-2"
99+
className="pill-remove inline-flex flex-nowrap items-center px-2 py-1 max-w-full gap-2 relative"
96100
type="button"
97101
tabIndex={-1}
98102
>
@@ -101,6 +105,7 @@ export const ListFieldItem = <T,>({
101105
onBlur={handleBlur}
102106
onFocus={() => setEditing(true)}
103107
onClick={(e) => e.stopPropagation()}
108+
onMouseDown={(e) => e.stopPropagation()}
104109
contentEditable
105110
onKeyDown={handleKeyDown}
106111
ref={ref}
@@ -110,7 +115,25 @@ export const ListFieldItem = <T,>({
110115
>
111116
{renderValue(value)}
112117
</span>
118+
113119
{loading && <CircleLoader size="small" className="shrink-0" />}
120+
121+
{!loading && (
122+
<ButtonLike
123+
as="a"
124+
className="pass-field-text-group--item-delete flex absolute"
125+
shape="ghost"
126+
pill
127+
icon
128+
onClick={(evt) => {
129+
evt.preventDefault();
130+
evt.stopPropagation();
131+
onDelete();
132+
}}
133+
>
134+
<Icon name="cross" className="shrink-0" />
135+
</ButtonLike>
136+
)}
114137
</button>
115138
</li>
116139
);

packages/pass/components/Invite/Steps/InviteStepMembers.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ export const InviteStepMembers = forwardRef<HTMLInputElement, Props>(
131131
</>
132132
);
133133
}}
134-
onAutocomplete={setAutocomplete}
134+
onAutocomplete={(value) => setAutocomplete(value.trim())}
135135
/>
136136
</FieldsetCluster>
137137

0 commit comments

Comments
 (0)