mirror of
https://github.com/twentyhq/twenty.git
synced 2024-11-22 21:50:43 +03:00
parent
7e73f013d1
commit
830b76cd9a
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -26,6 +26,7 @@
|
|||||||
"cSpell.enableFiletypes": [
|
"cSpell.enableFiletypes": [
|
||||||
"!javascript",
|
"!javascript",
|
||||||
"!json",
|
"!json",
|
||||||
|
"!typescript",
|
||||||
"!typescriptreact",
|
"!typescriptreact",
|
||||||
"md",
|
"md",
|
||||||
"mdx"
|
"mdx"
|
||||||
|
9
front/package-lock.json
generated
9
front/package-lock.json
generated
@ -28,7 +28,6 @@
|
|||||||
"react-datepicker": "^4.11.0",
|
"react-datepicker": "^4.11.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-hotkeys-hook": "^4.4.0",
|
"react-hotkeys-hook": "^4.4.0",
|
||||||
"react-icons": "^4.8.0",
|
|
||||||
"react-router-dom": "^6.4.4",
|
"react-router-dom": "^6.4.4",
|
||||||
"react-textarea-autosize": "^8.4.1",
|
"react-textarea-autosize": "^8.4.1",
|
||||||
"react-tooltip": "^5.13.1",
|
"react-tooltip": "^5.13.1",
|
||||||
@ -32859,14 +32858,6 @@
|
|||||||
"react-dom": ">=16.8.1"
|
"react-dom": ">=16.8.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-icons": {
|
|
||||||
"version": "4.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz",
|
|
||||||
"integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==",
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/react-inspector": {
|
"node_modules/react-inspector": {
|
||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz",
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
"react-datepicker": "^4.11.0",
|
"react-datepicker": "^4.11.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-hotkeys-hook": "^4.4.0",
|
"react-hotkeys-hook": "^4.4.0",
|
||||||
"react-icons": "^4.8.0",
|
|
||||||
"react-router-dom": "^6.4.4",
|
"react-router-dom": "^6.4.4",
|
||||||
"react-textarea-autosize": "^8.4.1",
|
"react-textarea-autosize": "^8.4.1",
|
||||||
"react-tooltip": "^5.13.1",
|
"react-tooltip": "^5.13.1",
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbInbox,
|
|
||||||
TbSearch,
|
|
||||||
TbSettings,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
import { useMatch, useResolvedPath } from 'react-router-dom';
|
import { useMatch, useResolvedPath } from 'react-router-dom';
|
||||||
|
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconInbox,
|
||||||
|
IconSearch,
|
||||||
|
IconSettings,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import NavItemsContainer from '@/ui/layout/navbar/NavItemsContainer';
|
import NavItemsContainer from '@/ui/layout/navbar/NavItemsContainer';
|
||||||
|
|
||||||
import NavItem from './modules/ui/layout/navbar/NavItem';
|
import NavItem from './modules/ui/layout/navbar/NavItem';
|
||||||
@ -21,25 +21,25 @@ export function AppNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="Search"
|
label="Search"
|
||||||
to="/search"
|
to="/search"
|
||||||
icon={<TbSearch size={16} />}
|
icon={<IconSearch size={16} />}
|
||||||
soon={true}
|
soon={true}
|
||||||
/>
|
/>
|
||||||
<NavItem
|
<NavItem
|
||||||
label="Inbox"
|
label="Inbox"
|
||||||
to="/inbox"
|
to="/inbox"
|
||||||
icon={<TbInbox size={16} />}
|
icon={<IconInbox size={16} />}
|
||||||
soon={true}
|
soon={true}
|
||||||
/>
|
/>
|
||||||
<NavItem
|
<NavItem
|
||||||
label="Settings"
|
label="Settings"
|
||||||
to="/settings/profile"
|
to="/settings/profile"
|
||||||
icon={<TbSettings size={16} />}
|
icon={<IconSettings size={16} />}
|
||||||
/>
|
/>
|
||||||
<NavTitle label="Workspace" />
|
<NavTitle label="Workspace" />
|
||||||
<NavItem
|
<NavItem
|
||||||
label="People"
|
label="People"
|
||||||
to="/people"
|
to="/people"
|
||||||
icon={<TbUser size={16} />}
|
icon={<IconUser size={16} />}
|
||||||
active={
|
active={
|
||||||
!!useMatch({
|
!!useMatch({
|
||||||
path: useResolvedPath('/people').pathname,
|
path: useResolvedPath('/people').pathname,
|
||||||
@ -50,7 +50,7 @@ export function AppNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="Companies"
|
label="Companies"
|
||||||
to="/companies"
|
to="/companies"
|
||||||
icon={<TbBuilding size={16} />}
|
icon={<IconBuilding size={16} />}
|
||||||
active={
|
active={
|
||||||
!!useMatch({
|
!!useMatch({
|
||||||
path: useResolvedPath('/companies').pathname,
|
path: useResolvedPath('/companies').pathname,
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
import { TbColorSwatch, TbLogout, TbSettings, TbUser } from 'react-icons/tb';
|
|
||||||
import { useMatch, useResolvedPath } from 'react-router-dom';
|
import { useMatch, useResolvedPath } from 'react-router-dom';
|
||||||
|
|
||||||
import { removeTokens } from '@/auth/services/AuthService';
|
import { removeTokens } from '@/auth/services/AuthService';
|
||||||
|
import {
|
||||||
|
IconColorSwatch,
|
||||||
|
IconLogout,
|
||||||
|
IconSettings,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import NavBackButton from '@/ui/layout/navbar//NavBackButton';
|
import NavBackButton from '@/ui/layout/navbar//NavBackButton';
|
||||||
import NavItem from '@/ui/layout/navbar/NavItem';
|
import NavItem from '@/ui/layout/navbar/NavItem';
|
||||||
import NavItemsContainer from '@/ui/layout/navbar/NavItemsContainer';
|
import NavItemsContainer from '@/ui/layout/navbar/NavItemsContainer';
|
||||||
@ -16,7 +21,7 @@ export function SettingsNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="Profile"
|
label="Profile"
|
||||||
to="/settings/profile"
|
to="/settings/profile"
|
||||||
icon={<TbUser size={16} />}
|
icon={<IconUser size={16} />}
|
||||||
active={
|
active={
|
||||||
!!useMatch({
|
!!useMatch({
|
||||||
path: useResolvedPath('/people').pathname,
|
path: useResolvedPath('/people').pathname,
|
||||||
@ -27,7 +32,7 @@ export function SettingsNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="Experience"
|
label="Experience"
|
||||||
to="/settings/profile/experience"
|
to="/settings/profile/experience"
|
||||||
icon={<TbColorSwatch size={16} />}
|
icon={<IconColorSwatch size={16} />}
|
||||||
soon={true}
|
soon={true}
|
||||||
active={
|
active={
|
||||||
!!useMatch({
|
!!useMatch({
|
||||||
@ -40,7 +45,7 @@ export function SettingsNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="General"
|
label="General"
|
||||||
to="/settings/workspace"
|
to="/settings/workspace"
|
||||||
icon={<TbSettings size={16} />}
|
icon={<IconSettings size={16} />}
|
||||||
soon={true}
|
soon={true}
|
||||||
active={
|
active={
|
||||||
!!useMatch({
|
!!useMatch({
|
||||||
@ -53,7 +58,7 @@ export function SettingsNavbar() {
|
|||||||
<NavItem
|
<NavItem
|
||||||
label="Logout"
|
label="Logout"
|
||||||
onClick={removeTokens}
|
onClick={removeTokens}
|
||||||
icon={<TbLogout size={16} />}
|
icon={<IconLogout size={16} />}
|
||||||
danger={true}
|
danger={true}
|
||||||
/>
|
/>
|
||||||
</NavItemsContainer>
|
</NavItemsContainer>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { IconPlus } from '@tabler/icons-react';
|
|
||||||
|
import { IconPlus } from '@/ui/icons/index';
|
||||||
|
|
||||||
const StyledButton = styled.button`
|
const StyledButton = styled.button`
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { ChangeEvent, ComponentType, useEffect, useState } from 'react';
|
import { ChangeEvent, ComponentType, useEffect, useState } from 'react';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
import { FaPlus } from 'react-icons/fa';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { SearchConfigType } from '@/search/interfaces/interface';
|
import { SearchConfigType } from '@/search/interfaces/interface';
|
||||||
import { useSearch } from '@/search/services/search';
|
import { useSearch } from '@/search/services/search';
|
||||||
|
import { IconPlus } from '@/ui/icons/index';
|
||||||
import { textInputStyle } from '@/ui/layout/styles/themes';
|
import { textInputStyle } from '@/ui/layout/styles/themes';
|
||||||
import { isSomeInputInEditModeState } from '@/ui/tables/states/isSomeInputInEditModeState';
|
import { isSomeInputInEditModeState } from '@/ui/tables/states/isSomeInputInEditModeState';
|
||||||
import { AnyEntity } from '@/utils/interfaces/generic.interface';
|
import { AnyEntity } from '@/utils/interfaces/generic.interface';
|
||||||
@ -252,7 +252,7 @@ export function EditableRelation<
|
|||||||
onClick={handleCreateNewRelationButtonClick}
|
onClick={handleCreateNewRelationButtonClick}
|
||||||
>
|
>
|
||||||
<StyledCreateButtonIcon>
|
<StyledCreateButtonIcon>
|
||||||
<FaPlus />
|
<IconPlus />
|
||||||
</StyledCreateButtonIcon>
|
</StyledCreateButtonIcon>
|
||||||
<StyledCreateButtonText>Create new</StyledCreateButtonText>
|
<StyledCreateButtonText>Create new</StyledCreateButtonText>
|
||||||
</EditableRelationCreateButton>
|
</EditableRelationCreateButton>
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
import { HotkeysEvent } from 'react-hotkeys-hook/dist/types';
|
import { HotkeysEvent } from 'react-hotkeys-hook/dist/types';
|
||||||
import { HiArrowSmRight } from 'react-icons/hi';
|
|
||||||
import TextareaAutosize from 'react-textarea-autosize';
|
import TextareaAutosize from 'react-textarea-autosize';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
import { IconButton } from '@/ui/components/buttons/IconButton';
|
import { IconButton } from '@/ui/components/buttons/IconButton';
|
||||||
|
import { IconArrowRight } from '@/ui/icons/index';
|
||||||
|
|
||||||
const MAX_ROWS = 5;
|
const MAX_ROWS = 5;
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ export function AutosizeTextInput({
|
|||||||
<StyledBottomRightIconButton>
|
<StyledBottomRightIconButton>
|
||||||
<IconButton
|
<IconButton
|
||||||
onClick={handleOnClickSendButton}
|
onClick={handleOnClickSendButton}
|
||||||
icon={<HiArrowSmRight size={15} />}
|
icon={<IconArrowRight size={15} />}
|
||||||
disabled={isSendButtonDisabled}
|
disabled={isSendButtonDisabled}
|
||||||
/>
|
/>
|
||||||
</StyledBottomRightIconButton>
|
</StyledBottomRightIconButton>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { IconCheck } from '@tabler/icons-react';
|
|
||||||
|
|
||||||
|
import { IconCheck } from '@/ui/icons/index';
|
||||||
import { hoverBackground } from '@/ui/layout/styles/themes';
|
import { hoverBackground } from '@/ui/layout/styles/themes';
|
||||||
|
|
||||||
import { DropdownMenuButton } from './DropdownMenuButton';
|
import { DropdownMenuButton } from './DropdownMenuButton';
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import type { Meta, StoryObj } from '@storybook/react';
|
import type { Meta, StoryObj } from '@storybook/react';
|
||||||
import { IconPlus } from '@tabler/icons-react';
|
|
||||||
|
|
||||||
|
import { IconPlus } from '@/ui/icons/index';
|
||||||
import { Avatar } from '@/users/components/Avatar';
|
import { Avatar } from '@/users/components/Avatar';
|
||||||
import { getRenderWrapperForComponent } from '~/testing/renderWrappers';
|
import { getRenderWrapperForComponent } from '~/testing/renderWrappers';
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FaRegComment } from 'react-icons/fa';
|
import { IconComment } from '@/ui/icons/index';
|
||||||
|
|
||||||
import { EntityTableActionBarButton } from './EntityTableActionBarButton';
|
import { EntityTableActionBarButton } from './EntityTableActionBarButton';
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ export function TableActionBarButtonToggleComments({ onClick }: OwnProps) {
|
|||||||
return (
|
return (
|
||||||
<EntityTableActionBarButton
|
<EntityTableActionBarButton
|
||||||
label="Comment"
|
label="Comment"
|
||||||
icon={<FaRegComment size={16} />}
|
icon={<IconComment size={16} />}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { ReactNode, useRef } from 'react';
|
import { ReactNode, useRef } from 'react';
|
||||||
import { FaAngleDown } from 'react-icons/fa';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { IconChevronDown } from '@/ui/icons/index';
|
||||||
|
|
||||||
import { useOutsideAlerter } from '../../../hooks/useOutsideAlerter';
|
import { useOutsideAlerter } from '../../../hooks/useOutsideAlerter';
|
||||||
import {
|
import {
|
||||||
overlayBackground,
|
overlayBackground,
|
||||||
@ -196,7 +197,7 @@ const StyleAngleDownContainer = styled.div`
|
|||||||
function DropdownTopOptionAngleDown() {
|
function DropdownTopOptionAngleDown() {
|
||||||
return (
|
return (
|
||||||
<StyleAngleDownContainer>
|
<StyleAngleDownContainer>
|
||||||
<FaAngleDown />
|
<IconChevronDown />
|
||||||
</StyleAngleDownContainer>
|
</StyleAngleDownContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { FaArrowDown, FaArrowUp } from 'react-icons/fa';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -6,6 +5,7 @@ import {
|
|||||||
SelectedFilterType,
|
SelectedFilterType,
|
||||||
} from '@/filters-and-sorts/interfaces/filters/interface';
|
} from '@/filters-and-sorts/interfaces/filters/interface';
|
||||||
import { SelectedSortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
import { SelectedSortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
||||||
|
import { IconArrowNarrowDown, IconArrowNarrowUp } from '@/ui/icons/index';
|
||||||
|
|
||||||
import SortOrFilterChip from './SortOrFilterChip';
|
import SortOrFilterChip from './SortOrFilterChip';
|
||||||
|
|
||||||
@ -74,7 +74,13 @@ function SortAndFilterBar<SortField, TData extends FilterableFieldsType>({
|
|||||||
key={sort.key}
|
key={sort.key}
|
||||||
labelValue={sort.label}
|
labelValue={sort.label}
|
||||||
id={sort.key}
|
id={sort.key}
|
||||||
icon={sort.order === 'desc' ? <FaArrowDown /> : <FaArrowUp />}
|
icon={
|
||||||
|
sort.order === 'desc' ? (
|
||||||
|
<IconArrowNarrowDown />
|
||||||
|
) : (
|
||||||
|
<IconArrowNarrowUp />
|
||||||
|
)
|
||||||
|
}
|
||||||
onRemove={() => onRemoveSort(sort.key)}
|
onRemove={() => onRemoveSort(sort.key)}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { TbX } from 'react-icons/tb';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { IconX } from '@/ui/icons/index';
|
||||||
|
|
||||||
type OwnProps = {
|
type OwnProps = {
|
||||||
id: string;
|
id: string;
|
||||||
labelKey?: string;
|
labelKey?: string;
|
||||||
@ -55,7 +56,7 @@ function SortOrFilterChip({
|
|||||||
{labelKey && <StyledLabelKey>{labelKey}: </StyledLabelKey>}
|
{labelKey && <StyledLabelKey>{labelKey}: </StyledLabelKey>}
|
||||||
{labelValue}
|
{labelValue}
|
||||||
<StyledDelete onClick={onRemove} data-testid={'remove-icon-' + id}>
|
<StyledDelete onClick={onRemove} data-testid={'remove-icon-' + id}>
|
||||||
<TbX />
|
<IconX />
|
||||||
</StyledDelete>
|
</StyledDelete>
|
||||||
</StyledChip>
|
</StyledChip>
|
||||||
);
|
);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { FaList } from 'react-icons/fa';
|
|
||||||
import { ApolloProvider } from '@apollo/client';
|
import { ApolloProvider } from '@apollo/client';
|
||||||
import type { Meta, StoryObj } from '@storybook/react';
|
import type { Meta, StoryObj } from '@storybook/react';
|
||||||
import { userEvent, within } from '@storybook/testing-library';
|
import { userEvent, within } from '@storybook/testing-library';
|
||||||
|
|
||||||
|
import { IconList } from '@/ui/icons/index';
|
||||||
import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout';
|
import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout';
|
||||||
import { mockedClient } from '~/testing/mockedClient';
|
import { mockedClient } from '~/testing/mockedClient';
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ export const Empty: Story = {
|
|||||||
<FullHeightStorybookLayout>
|
<FullHeightStorybookLayout>
|
||||||
<TableHeader
|
<TableHeader
|
||||||
viewName="ViewName"
|
viewName="ViewName"
|
||||||
viewIcon={<FaList />}
|
viewIcon={<IconList />}
|
||||||
availableSorts={availableSorts}
|
availableSorts={availableSorts}
|
||||||
availableFilters={availableFilters}
|
availableFilters={availableFilters}
|
||||||
/>
|
/>
|
||||||
@ -40,7 +40,7 @@ export const WithSortsAndFilters: Story = {
|
|||||||
<FullHeightStorybookLayout>
|
<FullHeightStorybookLayout>
|
||||||
<TableHeader
|
<TableHeader
|
||||||
viewName="ViewName"
|
viewName="ViewName"
|
||||||
viewIcon={<FaList />}
|
viewIcon={<IconList />}
|
||||||
availableSorts={availableSorts}
|
availableSorts={availableSorts}
|
||||||
availableFilters={availableFilters}
|
availableFilters={availableFilters}
|
||||||
/>
|
/>
|
||||||
|
@ -1 +0,0 @@
|
|||||||
export { IconMessageCircle as IconComment } from '@tabler/icons-react';
|
|
@ -1 +0,0 @@
|
|||||||
export { TbLayoutSidebarLeftCollapse as IconSidebarLeftCollapse } from 'react-icons/tb';
|
|
@ -1 +0,0 @@
|
|||||||
export { TbLayoutSidebarRightCollapse as IconSidebarRightCollapse } from 'react-icons/tb';
|
|
@ -1,6 +1,28 @@
|
|||||||
export { IconAddressBook } from './components/IconAddressBook';
|
export { IconAddressBook } from './components/IconAddressBook';
|
||||||
export { IconComment } from './components/IconComment';
|
export { IconBuilding } from '@tabler/icons-react';
|
||||||
export { IconSidebarLeftCollapse } from './components/IconSidebarLeftCollapse';
|
export { IconMessageCircle as IconComment } from '@tabler/icons-react';
|
||||||
export { IconSidebarRightCollapse } from './components/IconSidebarRightCollapse';
|
|
||||||
export { IconAward } from '@tabler/icons-react';
|
|
||||||
export { IconCheck } from '@tabler/icons-react';
|
export { IconCheck } from '@tabler/icons-react';
|
||||||
|
export { IconTrash } from '@tabler/icons-react';
|
||||||
|
export { IconLayoutSidebarRightCollapse } from '@tabler/icons-react';
|
||||||
|
export { IconLayoutSidebarLeftCollapse } from '@tabler/icons-react';
|
||||||
|
export { IconUser } from '@tabler/icons-react';
|
||||||
|
export { IconList } from '@tabler/icons-react';
|
||||||
|
export { IconInbox } from '@tabler/icons-react';
|
||||||
|
export { IconSearch } from '@tabler/icons-react';
|
||||||
|
export { IconSettings } from '@tabler/icons-react';
|
||||||
|
export { IconLogout } from '@tabler/icons-react';
|
||||||
|
export { IconColorSwatch } from '@tabler/icons-react';
|
||||||
|
export { IconX } from '@tabler/icons-react';
|
||||||
|
export { IconChevronLeft } from '@tabler/icons-react';
|
||||||
|
export { IconPlus } from '@tabler/icons-react';
|
||||||
|
export { IconLink } from '@tabler/icons-react';
|
||||||
|
export { IconSum } from '@tabler/icons-react';
|
||||||
|
export { IconCalendar } from '@tabler/icons-react';
|
||||||
|
export { IconMapPin } from '@tabler/icons-react';
|
||||||
|
export { IconMail } from '@tabler/icons-react';
|
||||||
|
export { IconPhone } from '@tabler/icons-react';
|
||||||
|
export { IconTarget } from '@tabler/icons-react';
|
||||||
|
export { IconChevronDown } from '@tabler/icons-react';
|
||||||
|
export { IconArrowNarrowDown } from '@tabler/icons-react';
|
||||||
|
export { IconArrowNarrowUp } from '@tabler/icons-react';
|
||||||
|
export { IconArrowRight } from '@tabler/icons-react';
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { TbChevronLeft } from 'react-icons/tb';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { IconChevronLeft } from '@/ui/icons/index';
|
||||||
|
|
||||||
import NavCollapseButton from './NavCollapseButton';
|
import NavCollapseButton from './NavCollapseButton';
|
||||||
|
|
||||||
type OwnProps = {
|
type OwnProps = {
|
||||||
@ -38,7 +39,7 @@ export default function NavBackButton({ title }: OwnProps) {
|
|||||||
<IconAndButtonContainer
|
<IconAndButtonContainer
|
||||||
onClick={() => navigate('/', { replace: true })}
|
onClick={() => navigate('/', { replace: true })}
|
||||||
>
|
>
|
||||||
<TbChevronLeft strokeWidth={3} />
|
<IconChevronLeft strokeWidth={3} />
|
||||||
<span>{title}</span>
|
<span>{title}</span>
|
||||||
</IconAndButtonContainer>
|
</IconAndButtonContainer>
|
||||||
<NavCollapseButton hideOnDesktop={true} />
|
<NavCollapseButton hideOnDesktop={true} />
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { IconSidebarLeftCollapse, IconSidebarRightCollapse } from '@/ui/icons';
|
import {
|
||||||
|
IconLayoutSidebarLeftCollapse,
|
||||||
|
IconLayoutSidebarRightCollapse,
|
||||||
|
} from '@/ui/icons';
|
||||||
|
|
||||||
import { isNavbarOpenedState } from '../states/isNavbarOpenedState';
|
import { isNavbarOpenedState } from '../states/isNavbarOpenedState';
|
||||||
import { MOBILE_VIEWPORT } from '../styles/themes';
|
import { MOBILE_VIEWPORT } from '../styles/themes';
|
||||||
@ -50,7 +53,7 @@ export default function NavCollapseButton({
|
|||||||
onClick={() => setIsNavOpen(!isNavOpen)}
|
onClick={() => setIsNavOpen(!isNavOpen)}
|
||||||
hideOnDesktop={hideOnDesktop}
|
hideOnDesktop={hideOnDesktop}
|
||||||
>
|
>
|
||||||
<IconSidebarLeftCollapse size={16} />
|
<IconLayoutSidebarLeftCollapse size={16} />
|
||||||
</CollapseButton>
|
</CollapseButton>
|
||||||
)}
|
)}
|
||||||
{!isNavOpen && (
|
{!isNavOpen && (
|
||||||
@ -58,7 +61,7 @@ export default function NavCollapseButton({
|
|||||||
onClick={() => setIsNavOpen(!isNavOpen)}
|
onClick={() => setIsNavOpen(!isNavOpen)}
|
||||||
hideOnDesktop={hideOnDesktop}
|
hideOnDesktop={hideOnDesktop}
|
||||||
>
|
>
|
||||||
<IconSidebarRightCollapse size={16} />
|
<IconLayoutSidebarRightCollapse size={16} />
|
||||||
</CollapseButton>
|
</CollapseButton>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { IconPlus } from '@tabler/icons-react';
|
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { IconPlus } from '@/ui/icons/index';
|
||||||
|
|
||||||
import { isRightDrawerOpenState } from '../states/isRightDrawerOpenState';
|
import { isRightDrawerOpenState } from '../states/isRightDrawerOpenState';
|
||||||
|
|
||||||
const StyledButton = styled.button`
|
const StyledButton = styled.button`
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { TbPlus } from 'react-icons/tb';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { IconPlus } from '@/ui/icons/index';
|
||||||
|
|
||||||
import NavCollapseButton from '../navbar/NavCollapseButton';
|
import NavCollapseButton from '../navbar/NavCollapseButton';
|
||||||
|
|
||||||
export const TOP_BAR_MIN_HEIGHT = '40px';
|
export const TOP_BAR_MIN_HEIGHT = '40px';
|
||||||
@ -59,7 +60,7 @@ export function TopBar({ title, icon, onAddButtonClick }: OwnProps) {
|
|||||||
data-testid="add-button"
|
data-testid="add-button"
|
||||||
onClick={onAddButtonClick}
|
onClick={onAddButtonClick}
|
||||||
>
|
>
|
||||||
<TbPlus size={16} />
|
<IconPlus size={16} />
|
||||||
</AddButtonContainer>
|
</AddButtonContainer>
|
||||||
)}
|
)}
|
||||||
</TopBarContainer>
|
</TopBarContainer>
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { FaList } from 'react-icons/fa';
|
|
||||||
import { TbBuilding } from 'react-icons/tb';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
@ -21,6 +19,8 @@ import {
|
|||||||
import { SelectedFilterType } from '@/filters-and-sorts/interfaces/filters/interface';
|
import { SelectedFilterType } from '@/filters-and-sorts/interfaces/filters/interface';
|
||||||
import { EntityTableActionBar } from '@/ui/components/table/action-bar/EntityTableActionBar';
|
import { EntityTableActionBar } from '@/ui/components/table/action-bar/EntityTableActionBar';
|
||||||
import { EntityTable } from '@/ui/components/table/EntityTable';
|
import { EntityTable } from '@/ui/components/table/EntityTable';
|
||||||
|
import { IconBuilding } from '@/ui/icons/index';
|
||||||
|
import { IconList } from '@/ui/icons/index';
|
||||||
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
||||||
import { BoolExpType } from '@/utils/interfaces/generic.interface';
|
import { BoolExpType } from '@/utils/interfaces/generic.interface';
|
||||||
import { AppPage } from '~/AppPage';
|
import { AppPage } from '~/AppPage';
|
||||||
@ -78,7 +78,7 @@ export function Companies() {
|
|||||||
<AppPage>
|
<AppPage>
|
||||||
<WithTopBarContainer
|
<WithTopBarContainer
|
||||||
title="Companies"
|
title="Companies"
|
||||||
icon={<TbBuilding size={16} />}
|
icon={<IconBuilding size={16} />}
|
||||||
onAddButtonClick={handleAddButtonClick}
|
onAddButtonClick={handleAddButtonClick}
|
||||||
>
|
>
|
||||||
<>
|
<>
|
||||||
@ -87,7 +87,7 @@ export function Companies() {
|
|||||||
data={companies}
|
data={companies}
|
||||||
columns={companiesColumns}
|
columns={companiesColumns}
|
||||||
viewName="All Companies"
|
viewName="All Companies"
|
||||||
viewIcon={<FaList />}
|
viewIcon={<IconList />}
|
||||||
availableSorts={availableSorts}
|
availableSorts={availableSorts}
|
||||||
availableFilters={availableFilters}
|
availableFilters={availableFilters}
|
||||||
onSortsUpdate={updateSorts}
|
onSortsUpdate={updateSorts}
|
||||||
|
@ -1,12 +1,4 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbLink,
|
|
||||||
TbMapPin,
|
|
||||||
TbSum,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
import { createColumnHelper } from '@tanstack/react-table';
|
import { createColumnHelper } from '@tanstack/react-table';
|
||||||
|
|
||||||
import { CompanyEditableNameChipCell } from '@/companies/components/CompanyEditableNameCell';
|
import { CompanyEditableNameChipCell } from '@/companies/components/CompanyEditableNameCell';
|
||||||
@ -22,6 +14,14 @@ import { EditableDate } from '@/ui/components/editable-cell/types/EditableDate';
|
|||||||
import { EditableRelation } from '@/ui/components/editable-cell/types/EditableRelation';
|
import { EditableRelation } from '@/ui/components/editable-cell/types/EditableRelation';
|
||||||
import { EditableText } from '@/ui/components/editable-cell/types/EditableText';
|
import { EditableText } from '@/ui/components/editable-cell/types/EditableText';
|
||||||
import { ColumnHead } from '@/ui/components/table/ColumnHead';
|
import { ColumnHead } from '@/ui/components/table/ColumnHead';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconLink,
|
||||||
|
IconMapPin,
|
||||||
|
IconSum,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import { getCheckBoxColumn } from '@/ui/tables/utils/getCheckBoxColumn';
|
import { getCheckBoxColumn } from '@/ui/tables/utils/getCheckBoxColumn';
|
||||||
import { mapToUser, User } from '@/users/interfaces/user.interface';
|
import { mapToUser, User } from '@/users/interfaces/user.interface';
|
||||||
import { QueryMode } from '~/generated/graphql';
|
import { QueryMode } from '~/generated/graphql';
|
||||||
@ -34,7 +34,7 @@ export const useCompaniesColumns = () => {
|
|||||||
getCheckBoxColumn(),
|
getCheckBoxColumn(),
|
||||||
columnHelper.accessor('name', {
|
columnHelper.accessor('name', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Name" viewIcon={<TbBuilding size={16} />} />
|
<ColumnHead viewName="Name" viewIcon={<IconBuilding size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<CompanyEditableNameChipCell company={props.row.original} />
|
<CompanyEditableNameChipCell company={props.row.original} />
|
||||||
@ -43,7 +43,7 @@ export const useCompaniesColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('domainName', {
|
columnHelper.accessor('domainName', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="URL" viewIcon={<TbLink size={16} />} />
|
<ColumnHead viewName="URL" viewIcon={<IconLink size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableText
|
<EditableText
|
||||||
@ -60,7 +60,7 @@ export const useCompaniesColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('employees', {
|
columnHelper.accessor('employees', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Employees" viewIcon={<TbSum size={16} />} />
|
<ColumnHead viewName="Employees" viewIcon={<IconSum size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableText
|
<EditableText
|
||||||
@ -83,7 +83,7 @@ export const useCompaniesColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('address', {
|
columnHelper.accessor('address', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Address" viewIcon={<TbMapPin size={16} />} />
|
<ColumnHead viewName="Address" viewIcon={<IconMapPin size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableText
|
<EditableText
|
||||||
@ -100,7 +100,10 @@ export const useCompaniesColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('createdAt', {
|
columnHelper.accessor('createdAt', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Creation" viewIcon={<TbCalendar size={16} />} />
|
<ColumnHead
|
||||||
|
viewName="Creation"
|
||||||
|
viewIcon={<IconCalendar size={16} />}
|
||||||
|
/>
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableDate
|
<EditableDate
|
||||||
@ -118,7 +121,7 @@ export const useCompaniesColumns = () => {
|
|||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead
|
<ColumnHead
|
||||||
viewName="Account Owner"
|
viewName="Account Owner"
|
||||||
viewIcon={<TbUser size={16} />}
|
viewIcon={<IconUser size={16} />}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
|
@ -1,22 +1,21 @@
|
|||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbLink,
|
|
||||||
TbMapPin,
|
|
||||||
TbSum,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
|
|
||||||
import { Company } from '@/companies/interfaces/company.interface';
|
import { Company } from '@/companies/interfaces/company.interface';
|
||||||
import { FilterConfigType } from '@/filters-and-sorts/interfaces/filters/interface';
|
import { FilterConfigType } from '@/filters-and-sorts/interfaces/filters/interface';
|
||||||
import { SEARCH_USER_QUERY } from '@/search/services/search';
|
import { SEARCH_USER_QUERY } from '@/search/services/search';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconLink,
|
||||||
|
IconMapPin,
|
||||||
|
IconSum,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import { mapToUser, User } from '@/users/interfaces/user.interface';
|
import { mapToUser, User } from '@/users/interfaces/user.interface';
|
||||||
import { QueryMode } from '~/generated/graphql';
|
import { QueryMode } from '~/generated/graphql';
|
||||||
|
|
||||||
export const nameFilter = {
|
export const nameFilter = {
|
||||||
key: 'name',
|
key: 'name',
|
||||||
label: 'Name',
|
label: 'Name',
|
||||||
icon: <TbBuilding size={16} />,
|
icon: <IconBuilding size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -46,7 +45,7 @@ export const nameFilter = {
|
|||||||
export const employeesFilter = {
|
export const employeesFilter = {
|
||||||
key: 'employees',
|
key: 'employees',
|
||||||
label: 'Employees',
|
label: 'Employees',
|
||||||
icon: <TbSum size={16} />,
|
icon: <IconSum size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -73,7 +72,7 @@ export const employeesFilter = {
|
|||||||
export const urlFilter = {
|
export const urlFilter = {
|
||||||
key: 'domainName',
|
key: 'domainName',
|
||||||
label: 'Url',
|
label: 'Url',
|
||||||
icon: <TbLink size={16} />,
|
icon: <IconLink size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -106,7 +105,7 @@ export const urlFilter = {
|
|||||||
export const addressFilter = {
|
export const addressFilter = {
|
||||||
key: 'address',
|
key: 'address',
|
||||||
label: 'Address',
|
label: 'Address',
|
||||||
icon: <TbMapPin size={16} />,
|
icon: <IconMapPin size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -136,7 +135,7 @@ export const addressFilter = {
|
|||||||
export const ccreatedAtFilter = {
|
export const ccreatedAtFilter = {
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
label: 'Created At',
|
label: 'Created At',
|
||||||
icon: <TbCalendar size={16} />,
|
icon: <IconCalendar size={16} />,
|
||||||
type: 'date',
|
type: 'date',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -163,7 +162,7 @@ export const ccreatedAtFilter = {
|
|||||||
export const accountOwnerFilter = {
|
export const accountOwnerFilter = {
|
||||||
key: 'accountOwner',
|
key: 'accountOwner',
|
||||||
label: 'Account Owner',
|
label: 'Account Owner',
|
||||||
icon: <TbUser size={16} />,
|
icon: <IconUser size={16} />,
|
||||||
type: 'relation',
|
type: 'relation',
|
||||||
searchConfig: {
|
searchConfig: {
|
||||||
query: SEARCH_USER_QUERY,
|
query: SEARCH_USER_QUERY,
|
||||||
|
@ -1,43 +1,42 @@
|
|||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbLink,
|
|
||||||
TbMapPin,
|
|
||||||
TbSum,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
|
|
||||||
import { SortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
import { SortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconLink,
|
||||||
|
IconMapPin,
|
||||||
|
IconSum,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import { CompanyOrderByWithRelationInput as Companies_Order_By } from '~/generated/graphql';
|
import { CompanyOrderByWithRelationInput as Companies_Order_By } from '~/generated/graphql';
|
||||||
|
|
||||||
export const availableSorts = [
|
export const availableSorts = [
|
||||||
{
|
{
|
||||||
key: 'name',
|
key: 'name',
|
||||||
label: 'Name',
|
label: 'Name',
|
||||||
icon: <TbBuilding size={16} />,
|
icon: <IconBuilding size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'employees',
|
key: 'employees',
|
||||||
label: 'Employees',
|
label: 'Employees',
|
||||||
icon: <TbSum size={16} />,
|
icon: <IconSum size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'domainName',
|
key: 'domainName',
|
||||||
label: 'Url',
|
label: 'Url',
|
||||||
icon: <TbLink size={16} />,
|
icon: <IconLink size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'address',
|
key: 'address',
|
||||||
label: 'Address',
|
label: 'Address',
|
||||||
icon: <TbMapPin size={16} />,
|
icon: <IconMapPin size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
label: 'Creation',
|
label: 'Creation',
|
||||||
icon: <TbCalendar size={16} />,
|
icon: <IconCalendar size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
] satisfies Array<SortType<Companies_Order_By>>;
|
] satisfies Array<SortType<Companies_Order_By>>;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { TbTrash } from 'react-icons/tb';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { EntityTableActionBarButton } from '@/ui/components/table/action-bar/EntityTableActionBarButton';
|
import { EntityTableActionBarButton } from '@/ui/components/table/action-bar/EntityTableActionBarButton';
|
||||||
|
import { IconTrash } from '@/ui/icons/index';
|
||||||
import { useResetTableRowSelection } from '@/ui/tables/hooks/useResetTableRowSelection';
|
import { useResetTableRowSelection } from '@/ui/tables/hooks/useResetTableRowSelection';
|
||||||
import { selectedRowIdsState } from '@/ui/tables/states/selectedRowIdsState';
|
import { selectedRowIdsState } from '@/ui/tables/states/selectedRowIdsState';
|
||||||
import { useDeleteCompaniesMutation } from '~/generated/graphql';
|
import { useDeleteCompaniesMutation } from '~/generated/graphql';
|
||||||
@ -28,7 +28,7 @@ export function TableActionBarButtonDeleteCompanies() {
|
|||||||
return (
|
return (
|
||||||
<EntityTableActionBarButton
|
<EntityTableActionBarButton
|
||||||
label="Delete"
|
label="Delete"
|
||||||
icon={<TbTrash size={16} />}
|
icon={<IconTrash size={16} />}
|
||||||
type="warning"
|
type="warning"
|
||||||
onClick={handleDeleteClick}
|
onClick={handleDeleteClick}
|
||||||
/>
|
/>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { FaBullseye } from 'react-icons/fa';
|
import { IconTarget } from '@/ui/icons/index';
|
||||||
|
|
||||||
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
||||||
import { AppPage } from '~/AppPage';
|
import { AppPage } from '~/AppPage';
|
||||||
|
|
||||||
@ -12,7 +11,7 @@ import { Board } from '../../modules/opportunities/components/Board';
|
|||||||
export function Opportunities() {
|
export function Opportunities() {
|
||||||
return (
|
return (
|
||||||
<AppPage>
|
<AppPage>
|
||||||
<WithTopBarContainer title="Opportunities" icon={<FaBullseye />}>
|
<WithTopBarContainer title="Opportunities" icon={<IconTarget />}>
|
||||||
<Board initialBoard={initialBoard} items={items} />
|
<Board initialBoard={initialBoard} items={items} />
|
||||||
</WithTopBarContainer>
|
</WithTopBarContainer>
|
||||||
</AppPage>
|
</AppPage>
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { FaList } from 'react-icons/fa';
|
|
||||||
import { TbUser } from 'react-icons/tb';
|
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
@ -18,6 +16,7 @@ import {
|
|||||||
} from '@/people/services';
|
} from '@/people/services';
|
||||||
import { EntityTableActionBar } from '@/ui/components/table/action-bar/EntityTableActionBar';
|
import { EntityTableActionBar } from '@/ui/components/table/action-bar/EntityTableActionBar';
|
||||||
import { EntityTable } from '@/ui/components/table/EntityTable';
|
import { EntityTable } from '@/ui/components/table/EntityTable';
|
||||||
|
import { IconList, IconUser } from '@/ui/icons/index';
|
||||||
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
import { WithTopBarContainer } from '@/ui/layout/containers/WithTopBarContainer';
|
||||||
import { BoolExpType } from '@/utils/interfaces/generic.interface';
|
import { BoolExpType } from '@/utils/interfaces/generic.interface';
|
||||||
import { AppPage } from '~/AppPage';
|
import { AppPage } from '~/AppPage';
|
||||||
@ -76,7 +75,7 @@ export function People() {
|
|||||||
<AppPage>
|
<AppPage>
|
||||||
<WithTopBarContainer
|
<WithTopBarContainer
|
||||||
title="People"
|
title="People"
|
||||||
icon={<TbUser size={16} />}
|
icon={<IconUser size={16} />}
|
||||||
onAddButtonClick={handleAddButtonClick}
|
onAddButtonClick={handleAddButtonClick}
|
||||||
>
|
>
|
||||||
<>
|
<>
|
||||||
@ -85,7 +84,7 @@ export function People() {
|
|||||||
data={people}
|
data={people}
|
||||||
columns={peopleColumns}
|
columns={peopleColumns}
|
||||||
viewName="All People"
|
viewName="All People"
|
||||||
viewIcon={<FaList />}
|
viewIcon={<IconList />}
|
||||||
availableSorts={availableSorts}
|
availableSorts={availableSorts}
|
||||||
availableFilters={availableFilters}
|
availableFilters={availableFilters}
|
||||||
onSortsUpdate={updateSorts}
|
onSortsUpdate={updateSorts}
|
||||||
|
@ -1,12 +1,4 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbMail,
|
|
||||||
TbMapPin,
|
|
||||||
TbPhone,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
import { createColumnHelper } from '@tanstack/react-table';
|
import { createColumnHelper } from '@tanstack/react-table';
|
||||||
|
|
||||||
import { EditablePeopleFullName } from '@/people/components/EditablePeopleFullName';
|
import { EditablePeopleFullName } from '@/people/components/EditablePeopleFullName';
|
||||||
@ -17,6 +9,14 @@ import { EditableDate } from '@/ui/components/editable-cell/types/EditableDate';
|
|||||||
import { EditablePhone } from '@/ui/components/editable-cell/types/EditablePhone';
|
import { EditablePhone } from '@/ui/components/editable-cell/types/EditablePhone';
|
||||||
import { EditableText } from '@/ui/components/editable-cell/types/EditableText';
|
import { EditableText } from '@/ui/components/editable-cell/types/EditableText';
|
||||||
import { ColumnHead } from '@/ui/components/table/ColumnHead';
|
import { ColumnHead } from '@/ui/components/table/ColumnHead';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconMail,
|
||||||
|
IconMapPin,
|
||||||
|
IconPhone,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import { getCheckBoxColumn } from '@/ui/tables/utils/getCheckBoxColumn';
|
import { getCheckBoxColumn } from '@/ui/tables/utils/getCheckBoxColumn';
|
||||||
|
|
||||||
const columnHelper = createColumnHelper<Person>();
|
const columnHelper = createColumnHelper<Person>();
|
||||||
@ -27,7 +27,7 @@ export const usePeopleColumns = () => {
|
|||||||
getCheckBoxColumn(),
|
getCheckBoxColumn(),
|
||||||
columnHelper.accessor('firstname', {
|
columnHelper.accessor('firstname', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="People" viewIcon={<TbUser size={16} />} />
|
<ColumnHead viewName="People" viewIcon={<IconUser size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<>
|
<>
|
||||||
@ -46,7 +46,7 @@ export const usePeopleColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('email', {
|
columnHelper.accessor('email', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Email" viewIcon={<TbMail size={16} />} />
|
<ColumnHead viewName="Email" viewIcon={<IconMail size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableText
|
<EditableText
|
||||||
@ -63,14 +63,17 @@ export const usePeopleColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('company', {
|
columnHelper.accessor('company', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Company" viewIcon={<TbBuilding size={16} />} />
|
<ColumnHead
|
||||||
|
viewName="Company"
|
||||||
|
viewIcon={<IconBuilding size={16} />}
|
||||||
|
/>
|
||||||
),
|
),
|
||||||
cell: (props) => <PeopleCompanyCell people={props.row.original} />,
|
cell: (props) => <PeopleCompanyCell people={props.row.original} />,
|
||||||
size: 150,
|
size: 150,
|
||||||
}),
|
}),
|
||||||
columnHelper.accessor('phone', {
|
columnHelper.accessor('phone', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Phone" viewIcon={<TbPhone size={16} />} />
|
<ColumnHead viewName="Phone" viewIcon={<IconPhone size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditablePhone
|
<EditablePhone
|
||||||
@ -87,7 +90,10 @@ export const usePeopleColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('createdAt', {
|
columnHelper.accessor('createdAt', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="Creation" viewIcon={<TbCalendar size={16} />} />
|
<ColumnHead
|
||||||
|
viewName="Creation"
|
||||||
|
viewIcon={<IconCalendar size={16} />}
|
||||||
|
/>
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableDate
|
<EditableDate
|
||||||
@ -103,7 +109,7 @@ export const usePeopleColumns = () => {
|
|||||||
}),
|
}),
|
||||||
columnHelper.accessor('city', {
|
columnHelper.accessor('city', {
|
||||||
header: () => (
|
header: () => (
|
||||||
<ColumnHead viewName="City" viewIcon={<TbMapPin size={16} />} />
|
<ColumnHead viewName="City" viewIcon={<IconMapPin size={16} />} />
|
||||||
),
|
),
|
||||||
cell: (props) => (
|
cell: (props) => (
|
||||||
<EditableText
|
<EditableText
|
||||||
|
@ -1,12 +1,3 @@
|
|||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbMail,
|
|
||||||
TbMapPin,
|
|
||||||
TbPhone,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Company,
|
Company,
|
||||||
mapToCompany,
|
mapToCompany,
|
||||||
@ -14,12 +5,20 @@ import {
|
|||||||
import { FilterConfigType } from '@/filters-and-sorts/interfaces/filters/interface';
|
import { FilterConfigType } from '@/filters-and-sorts/interfaces/filters/interface';
|
||||||
import { Person } from '@/people/interfaces/person.interface';
|
import { Person } from '@/people/interfaces/person.interface';
|
||||||
import { SEARCH_COMPANY_QUERY } from '@/search/services/search';
|
import { SEARCH_COMPANY_QUERY } from '@/search/services/search';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconMail,
|
||||||
|
IconMapPin,
|
||||||
|
IconPhone,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import { QueryMode } from '~/generated/graphql';
|
import { QueryMode } from '~/generated/graphql';
|
||||||
|
|
||||||
export const fullnameFilter = {
|
export const fullnameFilter = {
|
||||||
key: 'fullname',
|
key: 'fullname',
|
||||||
label: 'People',
|
label: 'People',
|
||||||
icon: <TbUser size={16} />,
|
icon: <IconUser size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -72,7 +71,7 @@ export const fullnameFilter = {
|
|||||||
export const emailFilter = {
|
export const emailFilter = {
|
||||||
key: 'email',
|
key: 'email',
|
||||||
label: 'Email',
|
label: 'Email',
|
||||||
icon: <TbMail size={16} />,
|
icon: <IconMail size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -102,7 +101,7 @@ export const emailFilter = {
|
|||||||
export const companyFilter = {
|
export const companyFilter = {
|
||||||
key: 'company_name',
|
key: 'company_name',
|
||||||
label: 'Company',
|
label: 'Company',
|
||||||
icon: <TbBuilding size={16} />,
|
icon: <IconBuilding size={16} />,
|
||||||
type: 'relation',
|
type: 'relation',
|
||||||
searchConfig: {
|
searchConfig: {
|
||||||
query: SEARCH_COMPANY_QUERY,
|
query: SEARCH_COMPANY_QUERY,
|
||||||
@ -136,7 +135,7 @@ export const companyFilter = {
|
|||||||
export const phoneFilter = {
|
export const phoneFilter = {
|
||||||
key: 'phone',
|
key: 'phone',
|
||||||
label: 'Phone',
|
label: 'Phone',
|
||||||
icon: <TbPhone size={16} />,
|
icon: <IconPhone size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -166,7 +165,7 @@ export const phoneFilter = {
|
|||||||
export const createdAtFilter = {
|
export const createdAtFilter = {
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
label: 'Created At',
|
label: 'Created At',
|
||||||
icon: <TbCalendar size={16} />,
|
icon: <IconCalendar size={16} />,
|
||||||
type: 'date',
|
type: 'date',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
@ -193,7 +192,7 @@ export const createdAtFilter = {
|
|||||||
export const cityFilter = {
|
export const cityFilter = {
|
||||||
key: 'city',
|
key: 'city',
|
||||||
label: 'City',
|
label: 'City',
|
||||||
icon: <TbMapPin size={16} />,
|
icon: <IconMapPin size={16} />,
|
||||||
type: 'text',
|
type: 'text',
|
||||||
operands: [
|
operands: [
|
||||||
{
|
{
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
import {
|
|
||||||
TbBuilding,
|
|
||||||
TbCalendar,
|
|
||||||
TbMail,
|
|
||||||
TbMapPin,
|
|
||||||
TbPhone,
|
|
||||||
TbUser,
|
|
||||||
} from 'react-icons/tb';
|
|
||||||
|
|
||||||
import { SortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
import { SortType } from '@/filters-and-sorts/interfaces/sorts/interface';
|
||||||
|
import {
|
||||||
|
IconBuilding,
|
||||||
|
IconCalendar,
|
||||||
|
IconMail,
|
||||||
|
IconMapPin,
|
||||||
|
IconPhone,
|
||||||
|
IconUser,
|
||||||
|
} from '@/ui/icons/index';
|
||||||
import {
|
import {
|
||||||
PersonOrderByWithRelationInput as People_Order_By,
|
PersonOrderByWithRelationInput as People_Order_By,
|
||||||
SortOrder as Order_By,
|
SortOrder as Order_By,
|
||||||
@ -17,7 +16,7 @@ export const availableSorts = [
|
|||||||
{
|
{
|
||||||
key: 'fullname',
|
key: 'fullname',
|
||||||
label: 'People',
|
label: 'People',
|
||||||
icon: <TbUser size={16} />,
|
icon: <IconUser size={16} />,
|
||||||
_type: 'custom_sort',
|
_type: 'custom_sort',
|
||||||
orderByTemplates: [
|
orderByTemplates: [
|
||||||
(order: Order_By) => ({
|
(order: Order_By) => ({
|
||||||
@ -31,32 +30,32 @@ export const availableSorts = [
|
|||||||
{
|
{
|
||||||
key: 'company_name',
|
key: 'company_name',
|
||||||
label: 'Company',
|
label: 'Company',
|
||||||
icon: <TbBuilding size={16} />,
|
icon: <IconBuilding size={16} />,
|
||||||
_type: 'custom_sort',
|
_type: 'custom_sort',
|
||||||
orderByTemplates: [(order: Order_By) => ({ company: { name: order } })],
|
orderByTemplates: [(order: Order_By) => ({ company: { name: order } })],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'email',
|
key: 'email',
|
||||||
label: 'Email',
|
label: 'Email',
|
||||||
icon: <TbMail size={16} />,
|
icon: <IconMail size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'phone',
|
key: 'phone',
|
||||||
label: 'Phone',
|
label: 'Phone',
|
||||||
icon: <TbPhone size={16} />,
|
icon: <IconPhone size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
label: 'Created at',
|
label: 'Created at',
|
||||||
icon: <TbCalendar size={16} />,
|
icon: <IconCalendar size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'city',
|
key: 'city',
|
||||||
label: 'City',
|
label: 'City',
|
||||||
icon: <TbMapPin size={16} />,
|
icon: <IconMapPin size={16} />,
|
||||||
_type: 'default_sort',
|
_type: 'default_sort',
|
||||||
},
|
},
|
||||||
] satisfies Array<SortType<People_Order_By>>;
|
] satisfies Array<SortType<People_Order_By>>;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { TbTrash } from 'react-icons/tb';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { EntityTableActionBarButton } from '@/ui/components/table/action-bar/EntityTableActionBarButton';
|
import { EntityTableActionBarButton } from '@/ui/components/table/action-bar/EntityTableActionBarButton';
|
||||||
|
import { IconTrash } from '@/ui/icons/index';
|
||||||
import { useResetTableRowSelection } from '@/ui/tables/hooks/useResetTableRowSelection';
|
import { useResetTableRowSelection } from '@/ui/tables/hooks/useResetTableRowSelection';
|
||||||
import { selectedRowIdsState } from '@/ui/tables/states/selectedRowIdsState';
|
import { selectedRowIdsState } from '@/ui/tables/states/selectedRowIdsState';
|
||||||
import { useDeletePeopleMutation } from '~/generated/graphql';
|
import { useDeletePeopleMutation } from '~/generated/graphql';
|
||||||
@ -28,7 +28,7 @@ export function TableActionBarButtonDeletePeople() {
|
|||||||
return (
|
return (
|
||||||
<EntityTableActionBarButton
|
<EntityTableActionBarButton
|
||||||
label="Delete"
|
label="Delete"
|
||||||
icon={<TbTrash size={16} />}
|
icon={<IconTrash size={16} />}
|
||||||
type="warning"
|
type="warning"
|
||||||
onClick={handleDeleteClick}
|
onClick={handleDeleteClick}
|
||||||
/>
|
/>
|
||||||
|
Loading…
Reference in New Issue
Block a user