diff --git a/front/.eslintrc.js b/front/.eslintrc.js index c78088372..d47a49995 100644 --- a/front/.eslintrc.js +++ b/front/.eslintrc.js @@ -5,7 +5,7 @@ module.exports = { tsconfigRootDir: __dirname, sourceType: 'module', }, - plugins: ['@typescript-eslint/eslint-plugin', 'simple-import-sort', 'twenty'], + plugins: ['@typescript-eslint/eslint-plugin', 'simple-import-sort', 'twenty', 'unused-imports'], extends: [ 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended', @@ -48,5 +48,12 @@ module.exports = { 'twenty/sort-css-properties-alphabetically': 'error', 'twenty/no-hardcoded-colors': 'error', 'func-style':['error', 'declaration', { 'allowArrowFunctions': true }], + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "off", + "unused-imports/no-unused-imports": "warn", + "unused-imports/no-unused-vars": [ + "warn", + { "vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_" } + ] } }; diff --git a/front/package.json b/front/package.json index 891ab1062..9f2d671f7 100644 --- a/front/package.json +++ b/front/package.json @@ -51,7 +51,7 @@ "yup": "^1.2.0" }, "scripts": { - "start": "PORT=3001 craco start", + "start": "PORT=3001 craco start --max-warnings=0", "build": "craco build", "test": "craco test", "coverage": "craco test --coverage .", @@ -148,6 +148,7 @@ "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-storybook": "^0.6.12", "eslint-plugin-twenty": "file:../packages/eslint-plugin-twenty", + "eslint-plugin-unused-imports": "^3.0.0", "http-server": "^14.1.1", "mock-apollo-client": "^1.2.1", "msw": "1.2.1", diff --git a/front/src/generated/graphql.tsx b/front/src/generated/graphql.tsx index 27fdfe102..85062f255 100644 --- a/front/src/generated/graphql.tsx +++ b/front/src/generated/graphql.tsx @@ -46,6 +46,7 @@ export type Attachment = { name: Scalars['String']; type: AttachmentType; updatedAt: Scalars['DateTime']; + workspace: Workspace; }; export type AttachmentCreateNestedManyWithoutActivityInput = { @@ -84,6 +85,12 @@ export type AttachmentUpdateManyWithoutAuthorNestedInput = { set?: InputMaybe>; }; +export type AttachmentUpdateManyWithoutWorkspaceNestedInput = { + connect?: InputMaybe>; + disconnect?: InputMaybe>; + set?: InputMaybe>; +}; + export type AttachmentWhereInput = { AND?: InputMaybe>; NOT?: InputMaybe>; @@ -219,6 +226,10 @@ export type CommentThreadCreateInput = { updatedAt?: InputMaybe; }; +export type CommentThreadCreateNestedOneWithoutCommentThreadTargetsInput = { + connect?: InputMaybe; +}; + export type CommentThreadCreateNestedOneWithoutCommentsInput = { connect?: InputMaybe; }; @@ -282,6 +293,7 @@ export type CommentThreadTarget = { createdAt: Scalars['DateTime']; id: Scalars['ID']; updatedAt: Scalars['DateTime']; + workspace: Workspace; }; export type CommentThreadTargetCreateManyCommentThreadInput = { @@ -297,6 +309,20 @@ export type CommentThreadTargetCreateManyCommentThreadInputEnvelope = { skipDuplicates?: InputMaybe; }; +export type CommentThreadTargetCreateManyWorkspaceInput = { + commentThreadId: Scalars['String']; + commentableId: Scalars['String']; + commentableType: CommentableType; + createdAt?: InputMaybe; + id?: InputMaybe; + updatedAt?: InputMaybe; +}; + +export type CommentThreadTargetCreateManyWorkspaceInputEnvelope = { + data: Array; + skipDuplicates?: InputMaybe; +}; + export type CommentThreadTargetCreateNestedManyWithoutCommentThreadInput = { connect?: InputMaybe>; connectOrCreate?: InputMaybe>; @@ -309,6 +335,11 @@ export type CommentThreadTargetCreateOrConnectWithoutCommentThreadInput = { where: CommentThreadTargetWhereUniqueInput; }; +export type CommentThreadTargetCreateOrConnectWithoutWorkspaceInput = { + create: CommentThreadTargetCreateWithoutWorkspaceInput; + where: CommentThreadTargetWhereUniqueInput; +}; + export type CommentThreadTargetCreateWithoutCommentThreadInput = { commentableId: Scalars['String']; commentableType: CommentableType; @@ -317,6 +348,15 @@ export type CommentThreadTargetCreateWithoutCommentThreadInput = { updatedAt?: InputMaybe; }; +export type CommentThreadTargetCreateWithoutWorkspaceInput = { + commentThread: CommentThreadCreateNestedOneWithoutCommentThreadTargetsInput; + commentableId: Scalars['String']; + commentableType: CommentableType; + createdAt?: InputMaybe; + id?: InputMaybe; + updatedAt?: InputMaybe; +}; + export type CommentThreadTargetListRelationFilter = { every?: InputMaybe; none?: InputMaybe; @@ -350,6 +390,17 @@ export type CommentThreadTargetUpdateManyWithoutCommentThreadNestedInput = { set?: InputMaybe>; }; +export type CommentThreadTargetUpdateManyWithoutWorkspaceNestedInput = { + connect?: InputMaybe>; + connectOrCreate?: InputMaybe>; + create?: InputMaybe>; + createMany?: InputMaybe; + delete?: InputMaybe>; + deleteMany?: InputMaybe>; + disconnect?: InputMaybe>; + set?: InputMaybe>; +}; + export type CommentThreadTargetWhereInput = { AND?: InputMaybe>; NOT?: InputMaybe>; @@ -1818,6 +1869,8 @@ export type Verify = { export type Workspace = { __typename?: 'Workspace'; + Attachment?: Maybe>; + CommentThreadTarget?: Maybe>; commentThreads?: Maybe>; comments?: Maybe>; companies?: Maybe>; @@ -1890,6 +1943,8 @@ export type WorkspaceMemberWhereUniqueInput = { }; export type WorkspaceUpdateInput = { + Attachment?: InputMaybe; + CommentThreadTarget?: InputMaybe; commentThreads?: InputMaybe; comments?: InputMaybe; companies?: InputMaybe; diff --git a/front/src/modules/activities/components/CommentThreadComments.tsx b/front/src/modules/activities/components/CommentThreadComments.tsx index fdc40f912..363391b45 100644 --- a/front/src/modules/activities/components/CommentThreadComments.tsx +++ b/front/src/modules/activities/components/CommentThreadComments.tsx @@ -83,7 +83,7 @@ export function CommentThreadComments({ commentThread }: OwnProps) { <> Comments - {commentThread?.comments?.map((comment, index) => ( + {commentThread?.comments?.map((comment) => ( ))} diff --git a/front/src/modules/apollo/hooks/useApolloFactory.ts b/front/src/modules/apollo/hooks/useApolloFactory.ts index 5c4eeef53..54367b298 100644 --- a/front/src/modules/apollo/hooks/useApolloFactory.ts +++ b/front/src/modules/apollo/hooks/useApolloFactory.ts @@ -24,7 +24,7 @@ export function useApolloFactory() { fields: { commentThreadTargets: { merge( - existing: CommentThreadTarget[] = [], + _existing: CommentThreadTarget[] = [], incoming: CommentThreadTarget[], ) { return [...incoming]; diff --git a/front/src/modules/people/components/EditablePeopleFullName.tsx b/front/src/modules/people/components/EditablePeopleFullName.tsx index 7a8b63bc4..7d8c0891a 100644 --- a/front/src/modules/people/components/EditablePeopleFullName.tsx +++ b/front/src/modules/people/components/EditablePeopleFullName.tsx @@ -19,7 +19,6 @@ type OwnProps = { > | null | undefined; - onChange?: (firstName: string, lastName: string) => void; onSubmit?: (firstName: string, lastName: string) => void; onCancel?: () => void; }; @@ -33,7 +32,6 @@ const NoEditModeContainer = styled.div` export function EditablePeopleFullName({ person, - onChange, onSubmit, onCancel, }: OwnProps) { diff --git a/front/src/modules/ui/button/components/Button.tsx b/front/src/modules/ui/button/components/Button.tsx index ad90df3bf..ebd751a96 100644 --- a/front/src/modules/ui/button/components/Button.tsx +++ b/front/src/modules/ui/button/components/Button.tsx @@ -76,7 +76,7 @@ const StyledButton = styled.button< } }}; border-style: solid; - border-width: ${({ theme, variant, position }) => { + border-width: ${({ variant, position }) => { switch (variant) { case 'primary': case 'secondary': diff --git a/front/src/modules/ui/button/components/IconButton.tsx b/front/src/modules/ui/button/components/IconButton.tsx index fa1b5d3a8..2a3a67b87 100644 --- a/front/src/modules/ui/button/components/IconButton.tsx +++ b/front/src/modules/ui/button/components/IconButton.tsx @@ -117,7 +117,6 @@ const StyledIconButton = styled.button< export function IconButton({ icon, - title, variant = 'transparent', size = 'medium', textColor = 'tertiary', diff --git a/front/src/modules/ui/editable-field/components/EditableField.tsx b/front/src/modules/ui/editable-field/components/EditableField.tsx index ae5a33347..f05eab573 100644 --- a/front/src/modules/ui/editable-field/components/EditableField.tsx +++ b/front/src/modules/ui/editable-field/components/EditableField.tsx @@ -140,7 +140,7 @@ export function EditableField({ transition={{ duration: 0.1 }} whileHover={{ scale: 1.04 }} > - + )} diff --git a/front/src/modules/ui/editable-field/components/EditableFieldEditButton.tsx b/front/src/modules/ui/editable-field/components/EditableFieldEditButton.tsx index 067a88d47..4ab49aa61 100644 --- a/front/src/modules/ui/editable-field/components/EditableFieldEditButton.tsx +++ b/front/src/modules/ui/editable-field/components/EditableFieldEditButton.tsx @@ -1,7 +1,6 @@ import styled from '@emotion/styled'; import { IconButton } from '@/ui/button/components/IconButton'; -import { HotkeyScope } from '@/ui/hotkey/types/HotkeyScope'; import { IconPencil } from '@/ui/icon'; import { overlayBackground } from '@/ui/themes/effects'; @@ -26,11 +25,7 @@ export const StyledEditableFieldEditButton = styled.div` ${overlayBackground} `; -type OwnProps = { - customHotkeyScope?: HotkeyScope; -}; - -export function EditableFieldEditButton({ customHotkeyScope }: OwnProps) { +export function EditableFieldEditButton() { const { openEditableField } = useEditableField(); function handleClick() { diff --git a/front/src/modules/ui/input/components/TextInput.tsx b/front/src/modules/ui/input/components/TextInput.tsx index b4ff6bffa..83445628d 100644 --- a/front/src/modules/ui/input/components/TextInput.tsx +++ b/front/src/modules/ui/input/components/TextInput.tsx @@ -27,7 +27,7 @@ type OwnProps = Omit, 'onChange'> & { const StyledContainer = styled.div>` display: flex; flex-direction: column; - width: ${({ fullWidth, theme }) => (fullWidth ? `100%` : 'auto')}; + width: ${({ fullWidth }) => (fullWidth ? `100%` : 'auto')}; `; const StyledLabel = styled.span` diff --git a/front/src/modules/ui/snack-bar/states/snackBarState.ts b/front/src/modules/ui/snack-bar/states/snackBarState.ts index 159edfdbe..dad665f4c 100644 --- a/front/src/modules/ui/snack-bar/states/snackBarState.ts +++ b/front/src/modules/ui/snack-bar/states/snackBarState.ts @@ -19,9 +19,10 @@ export const snackBarInternalState = atom({ }, }); +// TODO: use a recoil callback export const snackBarSetQueueState = selector({ key: 'snackBarQueueState', - get: ({ get }) => null, // We don't care about getting the value + get: ({ get: _get }) => null, // We don't care about getting the value set: ({ set }, newValue) => set(snackBarInternalState, (prev) => { if (prev.queue.length >= prev.maxQueue) { diff --git a/front/src/modules/ui/table/components/SelectAllCheckbox.tsx b/front/src/modules/ui/table/components/SelectAllCheckbox.tsx index acf88420a..74e91e168 100644 --- a/front/src/modules/ui/table/components/SelectAllCheckbox.tsx +++ b/front/src/modules/ui/table/components/SelectAllCheckbox.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import styled from '@emotion/styled'; import { Checkbox } from '@/ui/input/components/Checkbox'; @@ -19,7 +18,8 @@ export const SelectAllCheckbox = () => { const checked = allRowsSelectedStatus === 'all'; const indeterminate = allRowsSelectedStatus === 'some'; - function onChange(value: boolean) { + + function onChange() { selectAllRows(); } diff --git a/front/src/modules/ui/table/editable-cell/types/EditableCellDoubleTextEditMode.tsx b/front/src/modules/ui/table/editable-cell/types/EditableCellDoubleTextEditMode.tsx index ba59bf86b..57dc33d11 100644 --- a/front/src/modules/ui/table/editable-cell/types/EditableCellDoubleTextEditMode.tsx +++ b/front/src/modules/ui/table/editable-cell/types/EditableCellDoubleTextEditMode.tsx @@ -36,7 +36,6 @@ export function EditableCellDoubleTextEditMode({ secondValue, firstValuePlaceholder, secondValuePlaceholder, - onChange, onSubmit, onCancel, }: OwnProps) { diff --git a/front/src/modules/ui/table/editable-cell/types/EditableCellText.tsx b/front/src/modules/ui/table/editable-cell/types/EditableCellText.tsx index d20f20137..505df1e03 100644 --- a/front/src/modules/ui/table/editable-cell/types/EditableCellText.tsx +++ b/front/src/modules/ui/table/editable-cell/types/EditableCellText.tsx @@ -7,20 +7,16 @@ import { EditableCell } from '../components/EditableCell'; type OwnProps = { placeholder?: string; value: string; - onChange?: (newValue: string) => void; editModeHorizontalAlign?: 'left' | 'right'; loading?: boolean; onSubmit?: (newText: string) => void; - onCancel?: () => void; }; export function EditableCellText({ value, placeholder, - onChange, editModeHorizontalAlign, loading, - onCancel, onSubmit, }: OwnProps) { return ( diff --git a/front/src/modules/users/components/UserChip.tsx b/front/src/modules/users/components/UserChip.tsx index 6113619d0..e4fc47c43 100644 --- a/front/src/modules/users/components/UserChip.tsx +++ b/front/src/modules/users/components/UserChip.tsx @@ -1,13 +1,12 @@ -import { EntityChip, EntityChipVariant } from '@/ui/chip/components/EntityChip'; +import { EntityChip } from '@/ui/chip/components/EntityChip'; export type UserChipPropsType = { id: string; name: string; pictureUrl?: string; - variant?: EntityChipVariant; }; -export function UserChip({ id, name, pictureUrl, variant }: UserChipPropsType) { +export function UserChip({ id, name, pictureUrl }: UserChipPropsType) { return (