2023-03-05 14:19:44 +00:00
|
|
|
import React from "react";
|
2022-07-14 07:02:35 +00:00
|
|
|
import Table from "./Table";
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
import type {
|
2022-11-05 09:54:20 +00:00
|
|
|
AddNewRowActions,
|
2022-07-14 07:02:35 +00:00
|
|
|
CompactMode,
|
|
|
|
|
ReactTableColumnProps,
|
|
|
|
|
ReactTableFilter,
|
2023-02-15 11:42:46 +00:00
|
|
|
StickyType,
|
2022-07-14 07:02:35 +00:00
|
|
|
} from "./Constants";
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
import type { Row } from "react-table";
|
2022-07-14 07:02:35 +00:00
|
|
|
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
import type { EventType } from "constants/AppsmithActionConstants/ActionConstants";
|
2022-09-02 09:16:30 +00:00
|
|
|
import equal from "fast-deep-equal/es6";
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
import type { EditableCell, TableVariant } from "../constants";
|
|
|
|
|
import { ColumnTypes } from "../constants";
|
2022-07-14 07:02:35 +00:00
|
|
|
import { useCallback } from "react";
|
|
|
|
|
|
|
|
|
|
export interface ColumnMenuOptionProps {
|
|
|
|
|
content: string | JSX.Element;
|
|
|
|
|
closeOnClick?: boolean;
|
|
|
|
|
isSelected?: boolean;
|
|
|
|
|
editColumnName?: boolean;
|
|
|
|
|
columnAccessor?: string;
|
|
|
|
|
id?: string;
|
|
|
|
|
category?: boolean;
|
|
|
|
|
options?: ColumnMenuSubOptionProps[];
|
|
|
|
|
onClick?: (columnIndex: number, isSelected: boolean) => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface ColumnMenuSubOptionProps {
|
|
|
|
|
content: string | JSX.Element;
|
|
|
|
|
isSelected?: boolean;
|
|
|
|
|
closeOnClick?: boolean;
|
|
|
|
|
onClick?: (columnIndex: number) => void;
|
|
|
|
|
id?: string;
|
|
|
|
|
category?: boolean;
|
|
|
|
|
isHeader?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface ReactTableComponentProps {
|
|
|
|
|
widgetId: string;
|
|
|
|
|
widgetName: string;
|
|
|
|
|
searchKey: string;
|
|
|
|
|
isDisabled?: boolean;
|
|
|
|
|
isVisible?: boolean;
|
|
|
|
|
isLoading: boolean;
|
|
|
|
|
editMode: boolean;
|
|
|
|
|
editableCell: EditableCell;
|
|
|
|
|
width: number;
|
|
|
|
|
height: number;
|
|
|
|
|
pageSize: number;
|
|
|
|
|
totalRecordsCount?: number;
|
|
|
|
|
tableData: Array<Record<string, unknown>>;
|
|
|
|
|
disableDrag: (disable: boolean) => void;
|
|
|
|
|
onBulkEditDiscard: () => void;
|
|
|
|
|
onBulkEditSave: () => void;
|
|
|
|
|
onRowClick: (rowData: Record<string, unknown>, rowIndex: number) => void;
|
|
|
|
|
selectAllRow: (pageData: Row<Record<string, unknown>>[]) => void;
|
|
|
|
|
unSelectAllRow: (pageData: Row<Record<string, unknown>>[]) => void;
|
|
|
|
|
updatePageNo: (pageNo: number, event?: EventType) => void;
|
|
|
|
|
sortTableColumn: (column: string, asc: boolean) => void;
|
|
|
|
|
nextPageClick: () => void;
|
|
|
|
|
prevPageClick: () => void;
|
|
|
|
|
pageNo: number;
|
|
|
|
|
serverSidePaginationEnabled: boolean;
|
|
|
|
|
selectedRowIndex: number;
|
|
|
|
|
selectedRowIndices: number[];
|
|
|
|
|
multiRowSelection?: boolean;
|
|
|
|
|
hiddenColumns?: string[];
|
|
|
|
|
triggerRowSelection: boolean;
|
|
|
|
|
columnWidthMap?: { [key: string]: number };
|
|
|
|
|
handleResizeColumn: (columnWidthMap: { [key: string]: number }) => void;
|
|
|
|
|
handleReorderColumn: (columnOrder: string[]) => void;
|
|
|
|
|
searchTableData: (searchKey: any) => void;
|
|
|
|
|
filters?: ReactTableFilter[];
|
|
|
|
|
applyFilter: (filters: ReactTableFilter[]) => void;
|
|
|
|
|
columns: ReactTableColumnProps[];
|
|
|
|
|
compactMode?: CompactMode;
|
|
|
|
|
isVisibleSearch?: boolean;
|
|
|
|
|
isVisibleFilters?: boolean;
|
|
|
|
|
isVisibleDownload?: boolean;
|
|
|
|
|
isVisiblePagination?: boolean;
|
|
|
|
|
delimiter: string;
|
|
|
|
|
isSortable?: boolean;
|
|
|
|
|
accentColor: string;
|
|
|
|
|
borderRadius: string;
|
2022-11-05 09:54:20 +00:00
|
|
|
boxShadow: string;
|
2022-10-14 04:53:31 +00:00
|
|
|
borderColor?: string;
|
|
|
|
|
borderWidth?: number;
|
|
|
|
|
variant?: TableVariant;
|
2022-11-05 09:54:20 +00:00
|
|
|
isEditableCellsValid?: Record<string, boolean>;
|
2022-10-06 09:32:09 +00:00
|
|
|
primaryColumnId?: string;
|
2022-11-05 09:54:20 +00:00
|
|
|
isAddRowInProgress: boolean;
|
|
|
|
|
allowAddNewRow: boolean;
|
|
|
|
|
onAddNewRow: () => void;
|
|
|
|
|
onAddNewRowAction: (
|
|
|
|
|
type: AddNewRowActions,
|
|
|
|
|
onActionComplete: () => void,
|
|
|
|
|
) => void;
|
|
|
|
|
allowRowSelection: boolean;
|
|
|
|
|
allowSorting: boolean;
|
|
|
|
|
disabledAddNewRowSave: boolean;
|
2023-02-15 11:42:46 +00:00
|
|
|
handleColumnFreeze?: (columnName: string, sticky?: StickyType) => void;
|
|
|
|
|
canFreezeColumn?: boolean;
|
2022-07-14 07:02:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ReactTableComponent(props: ReactTableComponentProps) {
|
|
|
|
|
const {
|
2022-11-05 09:54:20 +00:00
|
|
|
allowAddNewRow,
|
|
|
|
|
allowRowSelection,
|
|
|
|
|
allowSorting,
|
2022-07-14 07:02:35 +00:00
|
|
|
applyFilter,
|
2022-10-14 04:53:31 +00:00
|
|
|
borderColor,
|
|
|
|
|
borderWidth,
|
2023-02-15 11:42:46 +00:00
|
|
|
canFreezeColumn,
|
2022-07-14 07:02:35 +00:00
|
|
|
columns,
|
|
|
|
|
columnWidthMap,
|
|
|
|
|
compactMode,
|
|
|
|
|
delimiter,
|
2022-11-05 09:54:20 +00:00
|
|
|
disabledAddNewRowSave,
|
2022-07-14 07:02:35 +00:00
|
|
|
disableDrag,
|
|
|
|
|
editableCell,
|
|
|
|
|
editMode,
|
|
|
|
|
filters,
|
2023-02-15 11:42:46 +00:00
|
|
|
handleColumnFreeze,
|
2022-07-14 07:02:35 +00:00
|
|
|
handleReorderColumn,
|
|
|
|
|
handleResizeColumn,
|
|
|
|
|
height,
|
2022-11-05 09:54:20 +00:00
|
|
|
isAddRowInProgress,
|
2022-07-14 07:02:35 +00:00
|
|
|
isLoading,
|
|
|
|
|
isSortable,
|
|
|
|
|
isVisibleDownload,
|
|
|
|
|
isVisibleFilters,
|
|
|
|
|
isVisiblePagination,
|
|
|
|
|
isVisibleSearch,
|
|
|
|
|
multiRowSelection,
|
|
|
|
|
nextPageClick,
|
2022-11-05 09:54:20 +00:00
|
|
|
onAddNewRow,
|
|
|
|
|
onAddNewRowAction,
|
2022-07-14 07:02:35 +00:00
|
|
|
onBulkEditDiscard,
|
|
|
|
|
onBulkEditSave,
|
|
|
|
|
onRowClick,
|
|
|
|
|
pageNo,
|
|
|
|
|
pageSize,
|
|
|
|
|
prevPageClick,
|
2022-10-06 09:32:09 +00:00
|
|
|
primaryColumnId,
|
2022-07-14 07:02:35 +00:00
|
|
|
searchKey,
|
|
|
|
|
searchTableData,
|
|
|
|
|
selectAllRow,
|
|
|
|
|
selectedRowIndex,
|
|
|
|
|
selectedRowIndices,
|
|
|
|
|
serverSidePaginationEnabled,
|
|
|
|
|
sortTableColumn: _sortTableColumn,
|
|
|
|
|
tableData,
|
|
|
|
|
totalRecordsCount,
|
|
|
|
|
triggerRowSelection,
|
|
|
|
|
unSelectAllRow,
|
|
|
|
|
updatePageNo,
|
2022-10-14 04:53:31 +00:00
|
|
|
variant,
|
2022-07-14 07:02:35 +00:00
|
|
|
widgetId,
|
|
|
|
|
widgetName,
|
|
|
|
|
width,
|
|
|
|
|
} = props;
|
|
|
|
|
|
2023-03-30 04:54:29 +00:00
|
|
|
const sortTableColumn = useCallback(
|
|
|
|
|
(columnIndex: number, asc: boolean) => {
|
|
|
|
|
if (allowSorting) {
|
|
|
|
|
if (columnIndex === -1) {
|
|
|
|
|
_sortTableColumn("", asc);
|
|
|
|
|
} else {
|
|
|
|
|
const column = columns[columnIndex];
|
|
|
|
|
const columnType = column.metaProperties?.type || ColumnTypes.TEXT;
|
|
|
|
|
if (
|
|
|
|
|
columnType !== ColumnTypes.IMAGE &&
|
|
|
|
|
columnType !== ColumnTypes.VIDEO
|
|
|
|
|
) {
|
|
|
|
|
_sortTableColumn(column.alias, asc);
|
|
|
|
|
}
|
2022-11-05 09:54:20 +00:00
|
|
|
}
|
2022-07-14 07:02:35 +00:00
|
|
|
}
|
2023-03-30 04:54:29 +00:00
|
|
|
},
|
|
|
|
|
[_sortTableColumn, allowSorting, columns],
|
|
|
|
|
);
|
2022-07-14 07:02:35 +00:00
|
|
|
|
2023-03-30 04:54:29 +00:00
|
|
|
const selectTableRow = useCallback(
|
|
|
|
|
(row: { original: Record<string, unknown>; index: number }) => {
|
|
|
|
|
if (allowRowSelection) {
|
|
|
|
|
onRowClick(row.original, row.index);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
[allowRowSelection, onRowClick],
|
|
|
|
|
);
|
2022-07-14 07:02:35 +00:00
|
|
|
|
2023-03-30 04:54:29 +00:00
|
|
|
const toggleAllRowSelect = useCallback(
|
|
|
|
|
(isSelect: boolean, pageData: Row<Record<string, unknown>>[]) => {
|
|
|
|
|
if (allowRowSelection) {
|
|
|
|
|
if (isSelect) {
|
|
|
|
|
selectAllRow(pageData);
|
|
|
|
|
} else {
|
|
|
|
|
unSelectAllRow(pageData);
|
|
|
|
|
}
|
2022-11-05 09:54:20 +00:00
|
|
|
}
|
2023-03-30 04:54:29 +00:00
|
|
|
},
|
|
|
|
|
[allowRowSelection, selectAllRow, unSelectAllRow],
|
|
|
|
|
);
|
2022-07-14 07:02:35 +00:00
|
|
|
|
chore: upgrade to prettier v2 + enforce import types (#21013)Co-authored-by: Satish Gandham <hello@satishgandham.com> Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
## Description
This PR upgrades Prettier to v2 + enforces TypeScript’s [`import
type`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html#type-only-imports-and-export)
syntax where applicable. It’s submitted as a separate PR so we can merge
it easily.
As a part of this PR, we reformat the codebase heavily:
- add `import type` everywhere where it’s required, and
- re-format the code to account for Prettier 2’s breaking changes:
https://prettier.io/blog/2020/03/21/2.0.0.html#breaking-changes
This PR is submitted against `release` to make sure all new code by team
members will adhere to new formatting standards, and we’ll have fewer
conflicts when merging `bundle-optimizations` into `release`. (I’ll
merge `release` back into `bundle-optimizations` once this PR is
merged.)
### Why is this needed?
This PR is needed because, for the Lodash optimization from
https://github.com/appsmithorg/appsmith/commit/7cbb12af886621256224be0c93e6a465dd710ad3,
we need to use `import type`. Otherwise, `babel-plugin-lodash` complains
that `LoDashStatic` is not a lodash function.
However, just using `import type` in the current codebase will give you
this:
<img width="962" alt="Screenshot 2023-03-08 at 17 45 59"
src="https://user-images.githubusercontent.com/2953267/223775744-407afa0c-e8b9-44a1-90f9-b879348da57f.png">
That’s because Prettier 1 can’t parse `import type` at all. To parse it,
we need to upgrade to Prettier 2.
### Why enforce `import type`?
Apart from just enabling `import type` support, this PR enforces
specifying `import type` everywhere it’s needed. (Developers will get
immediate TypeScript and ESLint errors when they forget to do so.)
I’m doing this because I believe `import type` improves DX and makes
refactorings easier.
Let’s say you had a few imports like below. Can you tell which of these
imports will increase the bundle size? (Tip: it’s not all of them!)
```ts
// app/client/src/workers/Linting/utils.ts
import { Position } from "codemirror";
import { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
It’s pretty hard, right?
What about now?
```ts
// app/client/src/workers/Linting/utils.ts
import type { Position } from "codemirror";
import type { LintError as JSHintError, LintOptions } from "jshint";
import { get, isEmpty, isNumber, keys, last, set } from "lodash";
```
Now, it’s clear that only `lodash` will be bundled.
This helps developers to see which imports are problematic, but it
_also_ helps with refactorings. Now, if you want to see where
`codemirror` is bundled, you can just grep for `import \{.*\} from
"codemirror"` – and you won’t get any type-only imports.
This also helps (some) bundlers. Upon transpiling, TypeScript erases
type-only imports completely. In some environment (not ours), this makes
the bundle smaller, as the bundler doesn’t need to bundle type-only
imports anymore.
## Type of change
- Chore (housekeeping or task changes that don't impact user perception)
## How Has This Been Tested?
This was tested to not break the build.
### Test Plan
> Add Testsmith test cases links that relate to this PR
### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)
## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag
### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
---------
Co-authored-by: Satish Gandham <hello@satishgandham.com>
Co-authored-by: Satish Gandham <satish.iitg@gmail.com>
2023-03-16 11:41:47 +00:00
|
|
|
const memoziedDisableDrag = useCallback(
|
|
|
|
|
() => disableDrag(true),
|
|
|
|
|
[disableDrag],
|
|
|
|
|
);
|
|
|
|
|
const memoziedEnableDrag = useCallback(
|
|
|
|
|
() => disableDrag(false),
|
|
|
|
|
[disableDrag],
|
|
|
|
|
);
|
2022-07-14 07:02:35 +00:00
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Table
|
|
|
|
|
accentColor={props.accentColor}
|
2022-11-05 09:54:20 +00:00
|
|
|
allowAddNewRow={allowAddNewRow}
|
2022-07-14 07:02:35 +00:00
|
|
|
applyFilter={applyFilter}
|
2022-10-14 04:53:31 +00:00
|
|
|
borderColor={borderColor}
|
2022-07-14 07:02:35 +00:00
|
|
|
borderRadius={props.borderRadius}
|
2022-10-14 04:53:31 +00:00
|
|
|
borderWidth={borderWidth}
|
2022-07-14 07:02:35 +00:00
|
|
|
boxShadow={props.boxShadow}
|
2023-02-15 11:42:46 +00:00
|
|
|
canFreezeColumn={canFreezeColumn}
|
2022-07-14 07:02:35 +00:00
|
|
|
columnWidthMap={columnWidthMap}
|
|
|
|
|
columns={columns}
|
|
|
|
|
compactMode={compactMode}
|
|
|
|
|
data={tableData}
|
|
|
|
|
delimiter={delimiter}
|
|
|
|
|
disableDrag={memoziedDisableDrag}
|
2022-11-05 09:54:20 +00:00
|
|
|
disabledAddNewRowSave={disabledAddNewRowSave}
|
2022-07-14 07:02:35 +00:00
|
|
|
editMode={editMode}
|
|
|
|
|
editableCell={editableCell}
|
|
|
|
|
enableDrag={memoziedEnableDrag}
|
|
|
|
|
filters={filters}
|
2023-02-15 11:42:46 +00:00
|
|
|
handleColumnFreeze={handleColumnFreeze}
|
2023-03-05 14:19:44 +00:00
|
|
|
handleReorderColumn={handleReorderColumn}
|
2022-07-14 07:02:35 +00:00
|
|
|
handleResizeColumn={handleResizeColumn}
|
|
|
|
|
height={height}
|
2022-11-05 09:54:20 +00:00
|
|
|
isAddRowInProgress={isAddRowInProgress}
|
2022-07-14 07:02:35 +00:00
|
|
|
isLoading={isLoading}
|
|
|
|
|
isSortable={isSortable}
|
|
|
|
|
isVisibleDownload={isVisibleDownload}
|
|
|
|
|
isVisibleFilters={isVisibleFilters}
|
|
|
|
|
isVisiblePagination={isVisiblePagination}
|
|
|
|
|
isVisibleSearch={isVisibleSearch}
|
|
|
|
|
multiRowSelection={multiRowSelection}
|
|
|
|
|
nextPageClick={nextPageClick}
|
2022-11-05 09:54:20 +00:00
|
|
|
onAddNewRow={onAddNewRow}
|
|
|
|
|
onAddNewRowAction={onAddNewRowAction}
|
2022-07-14 07:02:35 +00:00
|
|
|
onBulkEditDiscard={onBulkEditDiscard}
|
|
|
|
|
onBulkEditSave={onBulkEditSave}
|
|
|
|
|
pageNo={pageNo - 1}
|
|
|
|
|
pageSize={pageSize || 1}
|
|
|
|
|
prevPageClick={prevPageClick}
|
2022-10-06 09:32:09 +00:00
|
|
|
primaryColumnId={primaryColumnId}
|
2022-07-14 07:02:35 +00:00
|
|
|
searchKey={searchKey}
|
|
|
|
|
searchTableData={searchTableData}
|
|
|
|
|
selectTableRow={selectTableRow}
|
|
|
|
|
selectedRowIndex={selectedRowIndex}
|
|
|
|
|
selectedRowIndices={selectedRowIndices}
|
|
|
|
|
serverSidePaginationEnabled={serverSidePaginationEnabled}
|
|
|
|
|
sortTableColumn={sortTableColumn}
|
|
|
|
|
toggleAllRowSelect={toggleAllRowSelect}
|
|
|
|
|
totalRecordsCount={totalRecordsCount}
|
|
|
|
|
triggerRowSelection={triggerRowSelection}
|
|
|
|
|
updatePageNo={updatePageNo}
|
2022-10-14 04:53:31 +00:00
|
|
|
variant={variant}
|
2022-07-14 07:02:35 +00:00
|
|
|
widgetId={widgetId}
|
|
|
|
|
widgetName={widgetName}
|
|
|
|
|
width={width}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default React.memo(ReactTableComponent, (prev, next) => {
|
|
|
|
|
return (
|
|
|
|
|
prev.applyFilter === next.applyFilter &&
|
|
|
|
|
prev.compactMode === next.compactMode &&
|
|
|
|
|
prev.delimiter === next.delimiter &&
|
|
|
|
|
prev.disableDrag === next.disableDrag &&
|
|
|
|
|
prev.editMode === next.editMode &&
|
|
|
|
|
prev.isSortable === next.isSortable &&
|
|
|
|
|
prev.filters === next.filters &&
|
|
|
|
|
prev.handleReorderColumn === next.handleReorderColumn &&
|
|
|
|
|
prev.handleResizeColumn === next.handleResizeColumn &&
|
|
|
|
|
prev.height === next.height &&
|
|
|
|
|
prev.isLoading === next.isLoading &&
|
|
|
|
|
prev.isVisibleDownload === next.isVisibleDownload &&
|
|
|
|
|
prev.isVisibleFilters === next.isVisibleFilters &&
|
|
|
|
|
prev.isVisiblePagination === next.isVisiblePagination &&
|
|
|
|
|
prev.isVisibleSearch === next.isVisibleSearch &&
|
|
|
|
|
prev.nextPageClick === next.nextPageClick &&
|
|
|
|
|
prev.onRowClick === next.onRowClick &&
|
|
|
|
|
prev.pageNo === next.pageNo &&
|
|
|
|
|
prev.pageSize === next.pageSize &&
|
|
|
|
|
prev.prevPageClick === next.prevPageClick &&
|
|
|
|
|
prev.searchKey === next.searchKey &&
|
|
|
|
|
prev.searchTableData === next.searchTableData &&
|
|
|
|
|
prev.selectedRowIndex === next.selectedRowIndex &&
|
|
|
|
|
prev.selectedRowIndices === next.selectedRowIndices &&
|
|
|
|
|
prev.serverSidePaginationEnabled === next.serverSidePaginationEnabled &&
|
|
|
|
|
prev.sortTableColumn === next.sortTableColumn &&
|
|
|
|
|
prev.totalRecordsCount === next.totalRecordsCount &&
|
|
|
|
|
prev.triggerRowSelection === next.triggerRowSelection &&
|
|
|
|
|
prev.updatePageNo === next.updatePageNo &&
|
|
|
|
|
prev.widgetId === next.widgetId &&
|
|
|
|
|
prev.widgetName === next.widgetName &&
|
|
|
|
|
prev.width === next.width &&
|
|
|
|
|
prev.borderRadius === next.borderRadius &&
|
|
|
|
|
prev.boxShadow === next.boxShadow &&
|
2022-10-14 04:53:31 +00:00
|
|
|
prev.borderWidth === next.borderWidth &&
|
|
|
|
|
prev.borderColor === next.borderColor &&
|
2022-07-14 07:02:35 +00:00
|
|
|
prev.accentColor === next.accentColor &&
|
2023-03-30 04:54:29 +00:00
|
|
|
//shallow equal possible
|
2022-09-02 09:16:30 +00:00
|
|
|
equal(prev.columnWidthMap, next.columnWidthMap) &&
|
2023-03-30 04:54:29 +00:00
|
|
|
//static reference
|
|
|
|
|
prev.tableData === next.tableData &&
|
2022-07-14 07:02:35 +00:00
|
|
|
// Using JSON stringify becuase isEqual doesnt work with functions,
|
|
|
|
|
// and we are not changing the columns manually.
|
2023-03-30 04:54:29 +00:00
|
|
|
prev.columns === next.columns &&
|
2022-09-13 05:41:59 +00:00
|
|
|
equal(prev.editableCell, next.editableCell) &&
|
2022-10-14 04:53:31 +00:00
|
|
|
prev.variant === next.variant &&
|
2022-11-05 09:54:20 +00:00
|
|
|
prev.primaryColumnId === next.primaryColumnId &&
|
|
|
|
|
equal(prev.isEditableCellsValid, next.isEditableCellsValid) &&
|
|
|
|
|
prev.isAddRowInProgress === next.isAddRowInProgress &&
|
|
|
|
|
prev.allowAddNewRow === next.allowAddNewRow &&
|
|
|
|
|
prev.allowRowSelection === next.allowRowSelection &&
|
|
|
|
|
prev.allowSorting === next.allowSorting &&
|
2023-02-15 11:42:46 +00:00
|
|
|
prev.disabledAddNewRowSave === next.disabledAddNewRowSave &&
|
|
|
|
|
prev.canFreezeColumn === next.canFreezeColumn
|
2022-07-14 07:02:35 +00:00
|
|
|
);
|
|
|
|
|
});
|