Skip to content

Commit 908465f

Browse files
committed
[fix] Array Field updating & MobX 7 compatibility
1 parent d6fd396 commit 908465f

6 files changed

Lines changed: 44 additions & 48 deletions

File tree

‎ReadMe.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ npm i react \
5454
```html
5555
<link rel="stylesheet" href="https://unpkg.com/bootstrap@5.3.8/dist/css/bootstrap.min.css" />
5656
<link rel="stylesheet" href="https://unpkg.com/bootstrap-icons@1.13.1/font/bootstrap-icons.css" />
57-
<link rel="stylesheet" href="https://unpkg.com/mobx-restful-table@2.6.2/dist/index.css" />
57+
<link rel="stylesheet" href="https://unpkg.com/mobx-restful-table@2.6.6/dist/index.css" />
5858
```
5959

6060
### `tsconfig.json`
@@ -257,7 +257,7 @@ export const EditorPage = () => (
257257
[4]: https://mobx.js.org/
258258
[5]: https://libraries.io/npm/mobx-restful-table
259259
[6]: https://github.com/idea2app/MobX-RESTful-table/actions/workflows/main.yml
260-
[7]: https://nodei.co/npm/mobx-restful-table/
260+
[7]: https://npm.im/mobx-restful-table/
261261
[8]: https://github.com/idea2app/Next-Bootstrap-TS/blob/main/models/Translation.ts
262262
[9]: https://github.com/idea2app/Next-Bootstrap-TS/tree/main/translation
263263
[10]: https://github.com/idea2app/Next-Bootstrap-TS/blob/main/models/Base.ts#L12-L24

‎package.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mobx-restful-table",
3-
"version": "2.6.5",
3+
"version": "2.6.6",
44
"license": "LGPL-3.0",
55
"author": "shiy2008@gmail.com",
66
"description": "A Pagination Table & Scroll List component suite for CRUD operation, which is based on MobX RESTful & React.",
@@ -28,9 +28,9 @@
2828
"@swc/helpers": "^0.5.23",
2929
"classnames": "^2.5.1",
3030
"lodash": "^4.18.1",
31-
"mobx": "^6.16.1",
31+
"mobx": ">=6",
3232
"mobx-i18n": ">=0.6",
33-
"mobx-react": "^9.2.2",
33+
"mobx-react": ">=9",
3434
"mobx-react-helper": "^0.5.1",
3535
"mobx-restful": "^2.1.4",
3636
"react-bootstrap": "^2.10.10",

‎pnpm-lock.yaml‎

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎source/ArrayField.tsx‎

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { toJS } from 'mobx';
21
import { observer } from 'mobx-react';
32
import { FormComponent, FormComponentProps } from 'mobx-react-helper';
43
import { DataObject } from 'mobx-restful';
@@ -20,20 +19,10 @@ export class ArrayField<T extends DataObject = DataObject> extends FormComponent
2019
> {
2120
static displayName = 'ArrayField';
2221

23-
protected readonly rowIds = new WeakMap<object, string>();
22+
protected readonly rowIds: string[] = [];
2423

25-
protected readRowId(item: T) {
26-
return this.rowIds.get(item as object);
27-
}
28-
29-
protected writeRowId(item: T, rowId = uniqueID()) {
30-
this.rowIds.set(item as object, rowId);
31-
32-
return rowId;
33-
}
34-
35-
protected getRowId(item: T) {
36-
return this.readRowId(item) || this.writeRowId(item);
24+
protected getRowId(index: number) {
25+
return (this.rowIds[index] ||= uniqueID());
3726
}
3827

3928
componentDidMount() {
@@ -46,46 +35,49 @@ export class ArrayField<T extends DataObject = DataObject> extends FormComponent
4635
const { innerValue = [] } = this,
4736
item = {} as T;
4837

49-
this.writeRowId(item);
38+
this.rowIds.splice(index, 0, uniqueID());
5039
this.innerValue = [...innerValue.slice(0, index), item, ...innerValue.slice(index)];
5140
};
5241

53-
remove = (index: number) => (this.innerValue = this.innerValue?.filter((_, i) => i !== index));
42+
remove = (index: number) => {
43+
this.rowIds.splice(index, 1);
44+
45+
this.innerValue = this.innerValue?.filter((_, i) => i !== index);
46+
};
5447

5548
handleChange =
5649
(index: number) =>
5750
({ currentTarget }: ChangeEvent<EventTarget>) => {
5851
const item = formToJSON<T>(currentTarget as HTMLFieldSetElement),
5952
{ innerValue = [] } = this;
60-
const currentItem = innerValue[index];
61-
62-
this.writeRowId(item, this.readRowId(currentItem));
6353

6454
this.innerValue = [...innerValue.slice(0, index), item, ...innerValue.slice(index + 1)];
6555
};
6656

6757
handleUpdate =
6858
(index: number) =>
6959
({ currentTarget }: ChangeEvent<EventTarget>) => {
70-
const item = formToJSON<T>(currentTarget as HTMLFieldSetElement),
71-
currentItem = this.innerValue![index];
60+
const item = formToJSON<T>(currentTarget as HTMLFieldSetElement);
7261

73-
this.writeRowId(item, this.readRowId(currentItem));
7462
this.innerValue![index] = item;
7563
};
7664

7765
render() {
78-
const { className = '', style, name, renderItem } = this.props;
66+
const { className = '', style, name, renderItem } = this.props,
67+
{ value, rowIds } = this;
68+
const length = value?.length || 0;
69+
70+
if (rowIds.length > length) rowIds.length = length;
7971

8072
return (
8173
<>
82-
{this.value?.map((item, index, { length }) => (
74+
{value?.map((item, index, { length }) => (
8375
<fieldset
84-
key={this.getRowId(item)}
76+
key={this.getRowId(index)}
8577
className={`d-flex align-items-center my-2 gap-2 ${className}`}
8678
{...{ style, name }}
87-
onChange={this.handleChange(index)}
88-
onBlur={this.handleUpdate(index)}
79+
onBlur={this.handleChange(index)}
80+
onChange={this.handleUpdate(index)}
8981
>
9082
<div className="flex-fill">{renderItem(item, index)}</div>
9183
<ButtonGroup>

‎source/FormField.tsx‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,19 @@ export const FormField: FC<FormFieldProps> = ({
3131
<Form.FloatingLabel
3232
{...{ className, style, label }}
3333
controlId={id}
34-
onBlur={event => {
35-
if ((event.target as HTMLInputElement).checkValidity()) {
36-
event.target.classList.remove('is-invalid');
37-
event.currentTarget.classList.remove('is-invalid');
38-
} else {
39-
event.target.classList.add('is-invalid');
40-
event.currentTarget.classList.add('is-invalid');
41-
}
42-
onBlur?.(event as Parameters<FormControlProps['onBlur']>[0]);
43-
}}
34+
onBlur={
35+
onBlur &&
36+
(event => {
37+
if ((event.target as HTMLInputElement).checkValidity()) {
38+
event.target.classList.remove('is-invalid');
39+
event.currentTarget.classList.remove('is-invalid');
40+
} else {
41+
event.target.classList.add('is-invalid');
42+
event.currentTarget.classList.add('is-invalid');
43+
}
44+
onBlur(event as Parameters<FormControlProps['onBlur']>[0]);
45+
})
46+
}
4447
>
4548
{options ? (
4649
<Form.Select

‎source/RestTable.tsx‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ export class RestTable<
322322
hover,
323323
editable,
324324
deletable,
325+
filter,
325326
filterFields,
326327
store,
327328
translator,

0 commit comments

Comments
 (0)