Skip to content

Commit 5ddb252

Browse files
committed
Merge branch 'dev' into feat/system-admin
2 parents a82243b + 2bf40eb commit 5ddb252

File tree

41 files changed

+1135
-248
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1135
-248
lines changed

src/apps/admin/src/lib/components/FieldSingleSelect/FieldSingleSelect.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,22 @@ import {
99
useMemo,
1010
useRef,
1111
} from 'react'
12-
import ReactSelect, { components, SingleValue } from 'react-select'
12+
import { components, SingleValue } from 'react-select'
13+
import CreatableReactSelect from 'react-select/creatable'
1314
import classNames from 'classnames'
1415

1516
import { IconOutline, InputWrapper, LoadingSpinner } from '~/libs/ui'
1617

1718
import { SelectOption } from '../../models'
19+
import ReactSelect from '../common/ReactSelectExport'
1820

1921
import styles from './FieldSingleSelect.module.scss'
2022

2123
interface Props {
2224
label?: string
2325
className?: string
2426
placeholder?: string
25-
readonly value?: SelectOption
27+
readonly value?: SelectOption | null
2628
readonly onChange?: (event: SelectOption) => void
2729
readonly disabled?: boolean
2830
readonly dirty?: boolean
@@ -32,6 +34,10 @@ interface Props {
3234
readonly onBlur?: (event: FocusEvent<HTMLInputElement>) => void
3335
readonly options: SelectOption[]
3436
readonly isLoading?: boolean
37+
readonly classNameWrapper?: string
38+
readonly onSearchChange?: (value: string) => void
39+
readonly creatable?: boolean
40+
readonly createLabel?: (inputValue: string) => string
3541
}
3642

3743
// eslint-disable-next-line react/function-component-definition
@@ -60,6 +66,10 @@ export const FieldSingleSelect: FC<Props> = (props: Props) => {
6066
[],
6167
)
6268

69+
const Input = useMemo(() => (
70+
props.creatable ? CreatableReactSelect : ReactSelect
71+
), [props.creatable])
72+
6373
return (
6474
<InputWrapper
6575
{...props}
@@ -72,7 +82,7 @@ export const FieldSingleSelect: FC<Props> = (props: Props) => {
7282
hideInlineErrors={props.hideInlineErrors}
7383
ref={wrapRef as MutableRefObject<HTMLDivElement>}
7484
>
75-
<ReactSelect
85+
<Input
7686
components={asyncSelectComponents}
7787
className={classNames(props.className, styles.select)}
7888
placeholder={props.placeholder ?? 'Enter'}
@@ -88,9 +98,13 @@ export const FieldSingleSelect: FC<Props> = (props: Props) => {
8898
}
8999
}}
90100
value={props.value}
101+
defaultValue={props.value}
91102
isDisabled={props.disabled || props.isLoading}
92103
onBlur={props.onBlur}
93104
options={props.options}
105+
onInputChange={props.onSearchChange}
106+
createOptionPosition='first'
107+
formatCreateLabel={props.createLabel}
94108
/>
95109
{props.isLoading && (
96110
<div className={styles.blockActionLoading}>

src/apps/admin/src/lib/components/RoleMembersFilters/RoleMembersFilters.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ export const RoleMembersFilters: FC<Props> = props => {
6666
inputControl={register('userHandle')}
6767
disabled={props.isLoading}
6868
/>
69+
<InputText
70+
type='text'
71+
name='email'
72+
label='Email'
73+
placeholder='Enter'
74+
tabIndex={0}
75+
onChange={_.noop}
76+
classNameWrapper={styles.field}
77+
inputControl={register('email')}
78+
disabled={props.isLoading}
79+
/>
6980
</div>
7081

7182
<div className={styles.blockBottom}>

src/apps/admin/src/lib/components/RoleMembersTable/RoleMembersTable.tsx

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
/**
22
* Role members table.
33
*/
4-
import { FC, useContext, useEffect, useMemo, useState } from 'react'
4+
import { FC, useMemo, useState } from 'react'
55
import _ from 'lodash'
66
import classNames from 'classnames'
77

88
import { useWindowSize, WindowSize } from '~/libs/shared'
99
import { Button, colWidthType, InputCheckbox, Table, TableColumn } from '~/libs/ui'
1010

11-
import { AdminAppContext } from '../../contexts'
1211
import { useTableFilterLocal, useTableFilterLocalProps } from '../../hooks'
13-
import { AdminAppContextType, RoleMemberInfo } from '../../models'
12+
import { RoleMemberInfo } from '../../models'
1413
import { MobileTableColumn } from '../../models/MobileTableColumn.model'
1514
import { Pagination } from '../common/Pagination'
1615
import { TableMobile } from '../common/TableMobile'
@@ -29,8 +28,6 @@ interface Props {
2928

3029
export const RoleMembersTable: FC<Props> = (props: Props) => {
3130
const [colWidth, setColWidth] = useState<colWidthType>({})
32-
const { loadUser, usersMapping, cancelLoadUser }: AdminAppContextType
33-
= useContext(AdminAppContext)
3431
const {
3532
page,
3633
setPage,
@@ -52,27 +49,6 @@ export const RoleMembersTable: FC<Props> = (props: Props) => {
5249
unselectAll,
5350
}: useTableSelectionProps<string> = useTableSelection<string>(datasIds)
5451

55-
useEffect(() => {
56-
// clear queue of currently loading user handles
57-
cancelLoadUser()
58-
// load user handles for members visible on the current page
59-
_.forEach(results, result => {
60-
loadUser(result.id)
61-
})
62-
63-
return () => {
64-
// clear queue of currently loading user handles after exit ui
65-
cancelLoadUser()
66-
}
67-
// eslint-disable-next-line react-hooks/exhaustive-deps
68-
}, [results])
69-
70-
useEffect(() => {
71-
_.forEach(results, result => {
72-
result.handle = usersMapping[result.id]
73-
})
74-
}, [usersMapping, results])
75-
7652
const columns = useMemo<TableColumn<RoleMemberInfo>[]>(
7753
() => [
7854
{
@@ -112,20 +88,12 @@ export const RoleMembersTable: FC<Props> = (props: Props) => {
11288
columnId: 'handle',
11389
label: 'Handle',
11490
propertyName: 'handle',
115-
renderer: (data: RoleMemberInfo) => {
116-
if (!data.id) {
117-
return <></>
118-
}
119-
120-
return (
121-
<>
122-
{!usersMapping[data.id]
123-
? 'loading...'
124-
: usersMapping[data.id]}
125-
</>
126-
)
127-
},
128-
type: 'element',
91+
type: 'text',
92+
},
93+
{
94+
label: 'Email',
95+
propertyName: 'email',
96+
type: 'text',
12997
},
13098
{
13199
className: styles.blockColumnAction,
@@ -150,7 +118,6 @@ export const RoleMembersTable: FC<Props> = (props: Props) => {
150118
[
151119
isSelectAll,
152120
selectedDatas,
153-
usersMapping,
154121
props.isRemoving,
155122
props.isRemovingBool,
156123
props.doRemoveRoleMember,
@@ -176,12 +143,30 @@ export const RoleMembersTable: FC<Props> = (props: Props) => {
176143
),
177144
type: 'element',
178145
},
146+
], [
147+
{
148+
...columns[3],
149+
className: '',
150+
label: `${columns[3].label as string} label`,
151+
mobileType: 'label',
152+
renderer: () => (
153+
<div>
154+
{columns[3].label as string}
155+
:
156+
</div>
157+
),
158+
type: 'element',
159+
},
160+
{
161+
...columns[3],
162+
mobileType: 'last-value',
163+
},
179164
],
180165
[
181166
{
182-
...columns[3],
167+
...columns[4],
183168
className: classNames(
184-
columns[3].className,
169+
columns[4].className,
185170
styles.blockRightColumn,
186171
),
187172
colSpan: 2,

0 commit comments

Comments
 (0)