To enable Google Calendar integration, you need to run `yarn
command:prod cron:calendar:google-calendar-sync` in the worker
container. However, currently, the self-hosting guide does not tell you
how to do it. If you just follow the guide, only Gmail integration will
be enabled. So I added the command for calendar sync cron on
self-hosting-var.mdx.
As per title!
Also, I'm removing an incorrect logic in the enum migration runner that
takes care of the case where we have no defaultValue but non nullable
which is not a valid business case.
# This PR
- Revise my previous work (PR #5969)
Because it would break the current logic and cause unexpected behavior.
(Issue #5979)
- Solve (Issue #5915) with another way
@lucasbordeau What do you think about my current approach?
@JarWarren Please check it out—I'd love to get your feedback too!
---------
Co-authored-by: Achsan <[email protected]>
Co-authored-by: Lucas Bordeau <[email protected]>
Hi Twenty team,
I'd love to have Australian dollar as an option in Twenty! Please let me
me know if I have missed anything I need to change to enable this.
Thanks for a a great product
---------
Co-authored-by: Lucas Bordeau <[email protected]>
We had an issue on infinite scroll on table view.
The fetch more logic was modifying isTableLastRowVisible state (which is
wrong, how could it know)? This was done to prevent loading too much
data at once. This was causing some race condition on
isTableLastRowVisible (as the table itself was also changing it
depending on the real visibility of the line)
I have remove this hacky usage of isTableLastRowVisible and replaced it
by a setTimeout to let the user some time to scroll and introduce a
throttle logic.
Our tests on FE are red, which is a threat to code quality. I'm adding a
few unit tests to improve the coverage and lowering a bit the lines
coverage threshold
## Context
Our Flexible Schema engine dynamically generates entities/tables/APIs
for us but was not flexible enough to build indexes in the DB. With more
and more features involving heavy queries such as Messaging, we are now
adding a new WorkspaceIndex() decorator for our standard objects (will
come later for custom objects). This decorator will give enough
information to the workspace sync metadata manager to generate the
proper migrations that will create or drop indexes on demand.
To be aligned with the rest of the engine, we are adding 2 new tables:
IndexMetadata and IndexFieldMetadata, that will store the info of our
indexes.
## Implementation
```typescript
@WorkspaceEntity({
standardId: STANDARD_OBJECT_IDS.person,
namePlural: 'people',
labelSingular: 'Person',
labelPlural: 'People',
description: 'A person',
icon: 'IconUser',
})
export class PersonWorkspaceEntity extends BaseWorkspaceEntity {
@WorkspaceField({
standardId: PERSON_STANDARD_FIELD_IDS.email,
type: FieldMetadataType.EMAIL,
label: 'Email',
description: 'Contact’s Email',
icon: 'IconMail',
})
@WorkspaceIndex()
email: string;
```
By simply adding the WorkspaceIndex decorator, sync-metadata command
will create a new index for that column.
We can also add composite indexes, note that the order is important for
PSQL.
```typescript
@WorkspaceEntity({
standardId: STANDARD_OBJECT_IDS.person,
namePlural: 'people',
labelSingular: 'Person',
labelPlural: 'People',
description: 'A person',
icon: 'IconUser',
})
@WorkspaceIndex(['phone', 'email'])
export class PersonWorkspaceEntity extends BaseWorkspaceEntity {
```
Currently composite fields and relation fields are not handled by
@WorkspaceIndex() and you will need to use this notation instead
```typescript
@WorkspaceIndex(['companyId', 'nameFirstName'])
export class PersonWorkspaceEntity extends BaseWorkspaceEntity {
```
<img width="700" alt="Screenshot 2024-06-21 at 15 15 45"
src="https://github.com/twentyhq/twenty/assets/1834158/ac6da1d9-d315-40a4-9ba6-6ab9ae4709d4">
Next step: We might need to implement more complex index expressions,
this is why we have an expression column in IndexMetadata.
What I had in mind for the decorator, still open to discussion
```typescript
@WorkspaceIndex(['nameFirstName', 'nameLastName'], { expression: "$1 || ' ' || $2"})
export class PersonWorkspaceEntity extends BaseWorkspaceEntity {
```
---------
Co-authored-by: Charles Bochet <[email protected]>
This PR is replacing and removing all the raw queries and repositories
with the new `TwentyORM` and injection system using
`@InjectWorkspaceRepository`.
Some logic that was contained inside repositories has been moved to the
services.
In this PR we're only replacing repositories for calendar feature.
---------
Co-authored-by: Weiko <[email protected]>
Co-authored-by: bosiraphael <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
## Fixes#5902 :
- [x] Navigation items' height should be risen to 28px.
> For clarity:
- [x] Also increased the height of NavigationDrawerSectionTitle to 28px
to match navigation item.
- [x] The gap between sections should be reduced to 12px
> Was already completed it seems.
- [x] The workspace switcher should be aligned with the navigation items
---------
Co-authored-by: Lucas Bordeau <[email protected]>
Update the docs to accurately reflect `LoggerDriverType`. Using `sentry`
throws an error on startup.
```
export enum LoggerDriverType {
Console = 'console',
}
```
Happy to change the wording of course.
Closes#5915
This issue occurs only when there is no select field.
The user then creates a new one in settings and returns back to the view
picker.
And the bug arises, it because `viewPickerKanbanFieldMetadataId` is not
being set correctly.
When a user navigate to settings, the dirty state should be set to
false. As a result, after re-rendering the view picker component, it
triggers the effect to set `viewPickerKanbanFieldMetadataId`
---------
Co-authored-by: Achsan <[email protected]>
Co-authored-by: Lucas Bordeau <[email protected]>
Timezone with a negative offset weren't working good with date pickers.
I split the logic for display and parsing between date only and
datetime.
Date time is sending and displaying using timezone, and date only is
sending and displaying by forcing the date to take its UTC day and month
and 00:00:00 time.
This way its consistent across all timezones.
Previously the error boundary component was re-rendering with the same
state as long as we stayed in the same router, so for page change inside
an index container, it would stay on error state.
The fix is to memorize the location the error page is on during its
first render, and then to reset the error boundary if it gets
re-rendered with a different location even in the same index container.
Fixes : #3592
- Remove filters from metadata rest api
- add limite before and after parameters for metadata
- remove update from metadata relations
- fix typing issue
- fix naming
- fix before parameter
---------
Co-authored-by: Félix Malfait <[email protected]>
Greetings from Seoul! I found this amazing project a few days ago, and
trying to introduce it to my team. However there is a tiny but
significant problem, that South Korean won is not available in twenty.
So I added `KRW` to the enum `CurrencyCode` and the constant
`SETTINGS_FIELD_CURRENCY_CODES`. I tested it locally and apparently
works fine.
The display for Rating field type was missing, I just added it based on
RatingInput in readonly mode and optimized a bit for performance also.
Fixes https://github.com/twentyhq/twenty/issues/5900
Filtering relations is not allowed
(see`packages/twenty-server/src/engine/metadata-modules/relation-metadata/dtos/relation-metadata.dto.ts`)
so we remove filtering for find many relation
we also fixed some bug in result structure and metadata open-api schema
### Overview
This PR introduces significant enhancements to the MessageQueue module
by integrating `@Processor`, `@Process`, and `@InjectMessageQueue`
decorators. These changes streamline the process of defining and
managing queue processors and job handlers, and also allow for
request-scoped handlers, improving compatibility with services that rely
on scoped providers like TwentyORM repositories.
### Key Features
1. **Decorator-based Job Handling**: Use `@Processor` and `@Process`
decorators to define job handlers declaratively.
2. **Request Scope Support**: Job handlers can be scoped per request,
enhancing integration with request-scoped services.
### Usage
#### Defining Processors and Job Handlers
The `@Processor` decorator is used to define a class that processes jobs
for a specific queue. The `@Process` decorator is applied to methods
within this class to define specific job handlers.
##### Example 1: Specific Job Handlers
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('taskQueue')
export class TaskProcessor {
@Process('taskA')
async handleTaskA(job: { id: string, data: any }) {
console.log(`Handling task A with data:`, job.data);
// Logic for task A
}
@Process('taskB')
async handleTaskB(job: { id: string, data: any }) {
console.log(`Handling task B with data:`, job.data);
// Logic for task B
}
}
```
In the example above, `TaskProcessor` is responsible for processing jobs
in the `taskQueue`. The `handleTaskA` method will only be called for
jobs with the name `taskA`, while `handleTaskB` will be called for
`taskB` jobs.
##### Example 2: General Job Handler
```typescript
import { Processor, Process, InjectMessageQueue } from 'src/engine/integrations/message-queue';
@Processor('generalQueue')
export class GeneralProcessor {
@Process()
async handleAnyJob(job: { id: string, name: string, data: any }) {
console.log(`Handling job ${job.name} with data:`, job.data);
// Logic for any job
}
}
```
In this example, `GeneralProcessor` handles all jobs in the
`generalQueue`, regardless of the job name. The `handleAnyJob` method
will be invoked for every job added to the `generalQueue`.
#### Adding Jobs to a Queue
You can use the `@InjectMessageQueue` decorator to inject a queue into a
service and add jobs to it.
##### Example:
```typescript
import { Injectable } from '@nestjs/common';
import { InjectMessageQueue, MessageQueue } from 'src/engine/integrations/message-queue';
@Injectable()
export class TaskService {
constructor(
@InjectMessageQueue('taskQueue') private readonly taskQueue: MessageQueue,
) {}
async addTaskA(data: any) {
await this.taskQueue.add('taskA', data);
}
async addTaskB(data: any) {
await this.taskQueue.add('taskB', data);
}
}
```
In this example, `TaskService` adds jobs to the `taskQueue`. The
`addTaskA` and `addTaskB` methods add jobs named `taskA` and `taskB`,
respectively, to the queue.
#### Using Scoped Job Handlers
To utilize request-scoped job handlers, specify the scope in the
`@Processor` decorator. This is particularly useful for services that
use scoped repositories like those in TwentyORM.
##### Example:
```typescript
import { Processor, Process, InjectMessageQueue, Scope } from 'src/engine/integrations/message-queue';
@Processor({ name: 'scopedQueue', scope: Scope.REQUEST })
export class ScopedTaskProcessor {
@Process('scopedTask')
async handleScopedTask(job: { id: string, data: any }) {
console.log(`Handling scoped task with data:`, job.data);
// Logic for scoped task, which might use request-scoped services
}
}
```
Here, the `ScopedTaskProcessor` is associated with `scopedQueue` and
operates with request scope. This setup is essential when the job
handler relies on services that need to be instantiated per request,
such as scoped repositories.
### Migration Notes
- **Decorators**: Refactor job handlers to use `@Processor` and
`@Process` decorators.
- **Request Scope**: Utilize the scope option in `@Processor` if your
job handlers depend on request-scoped services.
Fix#5628
---------
Co-authored-by: Weiko <[email protected]>
I have fixed the scrolling the record container page on mobile making it
hidden.
This PR aims to fix#5745
---------
Co-authored-by: Lucas Bordeau <[email protected]>
A mini PR to discuss with @Bonapara tomorrow
Separating remote objects from others and making the menu collapsible
(style to be changed)
<img width="225" alt="Screenshot 2024-06-12 at 23 25 59"
src="https://github.com/twentyhq/twenty/assets/6399865/b4b69d36-6770-43a2-a5e8-bfcdf0a629ea">
Biggest issue is we don't use local storage today so the collapsed state
gets lost.
I see we have localStorageEffect with recoil. Maybe store it there?
Seems easy but don't want to introduce a bad pattern.
Todo:
- style update
- collapsible favorites
- persistent storage
The record chip generator context was missing a edge were a new field of
type relation is created and not yet in the metadata so no chip
generator function can be precomputed.
For now I added a fallback default chip generator, to prevent any bug,
but we might want to add a new chip generator function while creating
the new field ?
# Context
Currently, the Twenty platform incorporates "positions" for rows on the
backend, which are functional within the Kanban view. However, this
advantageous feature has yet to be leveraged within list views.
# Feature Proposal
## Implement Row-Reordering via Drag-and-Drop on Frontend (#4846)
- This PR addresses the implementation of row reordering via
Drag-and-Drop on frontend. The objective is to enrich the list view
functionality by introducing a grip that dynamically appears upon
hovering over the left space preceding the checkbox container. This grip
empowers users to effortlessly reposition rows within the list.
#### Proposal Highlights:
- **Enhanced User Interaction**: Introduce a draggable grip to
facilitate intuitive row reordering, enhancing user experience and
productivity.
- **Preservation of Design Aesthetics**: By excluding the grip from the
first row and maintaining the left gap, we uphold design integrity while
providing enhanced functionality.
- **Consistency with Existing Features**: Align with existing
drag-and-drop functionalities within the platform, such as Favorites
re-ordering or Fields re-ordering in table options, ensuring a seamless
user experience.
## Implementation Strategy
### Grip Implementation:
- Add an extra column to the table (header + body) to accommodate the
grip cell, which displays the IconListViewGrip when its container is
hovered over.
- Ensure the preceding left-space is maintained by setting the
corresponding width for this column and removing padding from the table
container (while maintaining padding in other page elements and the
Kanban view for coherence).
### Row Drag and Drop:
- Implement row drag-and-drop functionality using draggableList and
draggableItem, based on the existing logic in the KanbanView for row
repositioning.
- Create a draggableTableBody and apply it to the current
RecordTableBody (including modal open triggering - if dragging while
sorting exists).
- Apply the draggableItem logic to RecordTableRow.
### Sorting Modal Implementation:
- Reuse the ConfirmationModel for the removeSortingModal.
- Create a new state to address the modal.
- Implement sorting removal logic in the corresponding modal file.
## Outcome
- The left-side margin is preserved.
- The grip appears upon hovering.
- Dragging a row gives it and maintains an aesthetic appearance.
- Dropping a row updates its position, and the table gets a new
configuration.
- If sorting is present, dropping a row activates a modal. Clicking on
the "Remove Sorting" button will deactivate any sorting (clicking on
"Cancel" will close the modal), and the table will revert to its default
configuration by position, allowing manual row reordering. Row
repositioning will not occur if sorting is not removed.
- The record table maintains its overall consistency.
- There are no conflicts with DragSelect functionality.
https://github.com/twentyhq/twenty/assets/92337535/73de96cc-4aac-41a9-b4ec-2b8d1c928d04
---------
Co-authored-by: Vasco Paisana <[email protected]>
Co-authored-by: Lucas Bordeau <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
The new date time formatting util made for performance optimization
missed two things :
- Padding 0 for hours and minutes with 1 digit only.
- Correctly parsing the day of the month (now uses JS Date native
getDate() instead of slicing the ISO String)
In the settings part of the app, where display fields are used as in
table cell and board cards, we didn't have the new context selector
logic implemented, due to the recent performance optimization.
- make invitation and reset password available on every page
- add a sleep after setKeyPair as tokens are sometimes not updated when
redirecting to Index
- refactor sleep
Issue: #5761
Changes:
- Use `useFindManyRecords` in `RecordTableWithWrappers.tsx` to determine
if any records exist for that object
- Add `hasUnfilteredRecords` prop to `RecordTableEmptyState.tsx`.
This changes to empty state title, but I'm guessing that we'll need to
change the button text and subheading as well you guys can let me know
what you think. If this works I can go on to do those next, thanks!
---------
Co-authored-by: Thomas Trompette <[email protected]>
In RecordTableCellContainer, I just removed onMouseEnter event handler
that was being triggered when we used keyboard soft focus move.
It's not necessary to have it because we already listen on mouse move
which is matching our use case where we only want soft focus to move
when mouse move and not when the cursor stays on top of a cell.
- Improve the rest api by introducing startingAfter/endingBefore (we
previously had lastCursor), and moving pageInfo/totalCount outside of
the data object.
- Fix broken GraphQL playground on website
- Improve analytics by sending server url
Add a new util called `resolveAbsolutePath` to allow providing absolute
path for environment variable like `STORAGE_LOCAL_PATH`.
If the path in the env start with `/` we'll not prefix it with
`process.cwd()`.
Also we're using a static path for the old `db_initialized` file now
named `db_status` and stop using the env variable for this file as this
one shouldn't ne stored in the `STORAGE_LOCAL_PATH`.
Fix#4794
---------
Co-authored-by: Quentin Galliano <[email protected]>
Here is a fix for https://github.com/twentyhq/twenty/issues/5163
I tested it on another repo and should work as intended this time
arround.
I've created two workflows
- One that creates a PR
- The second that watch PR merge with specific labels
- I also check the author of the PR to make sure it was created by a bot
You can now disable the creation of the a draft release
---------
Co-authored-by: Charles Bochet <[email protected]>
- Added Linaria to have compiled CSS on our optimized field displays
- Refactored mocks for performance stories on fields
- Refactored generateRecordChipData into a global context, computed only
when we fetch object metadata items.
- Refactored ChipFieldDisplay
- Refactored PhoneFieldDisplay
In `messaging-gmail-messages-import.service`, we were refreshing the
access token before each query but we were passing the old access token
to `fetchAllMessages`.
I modified the function to query the updated connectedAccount with the
new access token.
This will solve the 401 errors we were getting in production.
I increased the inline relation of the relations fields, now the edit
pen is visible when hovering the icon and not only the label.
this aims to fix: #5662
Made the alignment consistent with the field panel. This uses 90px as
the key label width.
**Issue:** #5730
**Changes:**
- Add a label width of 90 to FieldContext Provider in useFieldContext
function
- Add a label width of 90 to ActivityTargetsInlineCell component
**Screen recording form local testing:**
https://github.com/twentyhq/twenty/assets/120792086/e150530b-4163-4a69-9bd5-119a2f202d4f
---------
Co-authored-by: Thomas Trompette <[email protected]>
In this PR, we implement the display and update of fields from
fromManyObjects (e.g update Employees for a Company).
Product requirement
- update should be triggered at each box check/uncheck, not at lose of
focus
Left to do in upcoming PRs
- add the column in the table views (e.g. column "Employees" on
"Companies" table view)
- add "Add new" possibility when there is no records (as is currently
exists for "one" side of relations:)
<img width="374" alt="Capture d’écran 2024-06-10 à 17 38 02"
src="https://github.com/twentyhq/twenty/assets/51697796/6f0cc494-e44f-4620-a762-d7b438951eec">
- update cache after an update affecting other records (e.g "Listings"
have one "Person"; if listing A belonged to Person A but then we
attribute listing A to Person B, Person A is no longer owner of Listing
A. For the moment that would not be reflected immediatly leading, to
potential false information if information is accessed from cache)
- try to get rid of the glitch - we also have it on the task page
example. (probably) due to the fact that we are using a recoil state to
read, update then re-read
https://github.com/twentyhq/twenty/assets/51697796/54f71674-237a-4946-866e-b8d96353c458
* Remove relations where they cannot be used
* Removed duplicated schema for findMany
* Reuse schema for Relation variant to reduce size of sent json object
closes#5778
---------
Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: martmull <[email protected]>
Now while pressing the `Enter` button, the select field selects the
relevant option.
- Added a `handleKeyDown` function to set the `persistField` with the
selected option.
- Added an `onKeyDown` event on `DropdownMenuSearchInput` component, to
trigger `handleKeyDown` when `Enter` is pressed.
- Fixes: #5556
---------
Co-authored-by: Lucas Bordeau <[email protected]>
- Fixes#5504
- Fixes#5503
- Return 404 when the page does not exist
- Modified the footer in order to align it properly
- Removed "noticed something to change" in each table of content
- Fixed the URLs of the edit module
- Added the edit module to Developers
- Fixed header style on the REST API page.
- Edited the README to point to Developers
- Fixed selected state when clicking on sidebar elements
---------
Co-authored-by: Félix Malfait <[email protected]>
In this PR, I'm doing 2 things:
- refresh connectedAccount token on message-list-fetch. It's currently
only refresh while doing the messages-import. However messages-import
stage are only triggered if new messages are detected (which could take
days or week depending of the messageChannel activity). We should also
refresh it while trying to fetch the list
- handle Unhandled Gmail error code 500 with reason "backendError".
These can occur on gmail side. In this case, we just retry later.
In this PR, I'm mainly doing two things:
- uniformizing messaging-messages-import and
messaging-message-list-fetch behaviors (cron.job and job)
- improving performances of these cron.jobs by not triggering the jobs
if the stage is not relevant
- making sure these jobs have same signature (workspaceId +
messageChannelId)
# This PR
- Fixes#5520
- Created a shared confirmation modal component for the `ContextMenu`
and the `ActionBar` components to avoid code repetition - with its
storybook file
Looking forward to getting feedback @charlesBochet
I changed the visibility of the search dialog to make it full screen on
mobile, this should already be ok but I couldn't try it on mobile, so I
just used devtools, if I need to do something else on this PR just tell
me :)
This PR aims to fix: #5746
---------
Co-authored-by: Félix Malfait <[email protected]>
First step for creating credentials for database proxy.
In next PRs:
- When calling endpoint, create database Postgres on proxy server
- Setup user on database using postgresCredentials
- Build remote server on DB to access workspace data
I changed the Sort button used in the Header using
StyledHeaderDropdownButton component (the same used for Filter and
Options') instead of LightButton.
This PR aims to fix the issue: #5743
---------
Co-authored-by: Félix Malfait <[email protected]>
## Context
Fixing `setIsFocused is not a function` and the fact that edit buttons
were not showing up anymore.
A new FieldFocusContextProvider has been introduced and added to
RecordInlineCell but not ActivityTargetsInlineCell. This should fix the
issue.
<img width="523" alt="Screenshot 2024-06-05 at 17 42 07"
src="https://github.com/twentyhq/twenty/assets/1834158/1c1f919e-3829-4e40-b573-3b1b75b7c16f">
This is a small PR to improve the design of our CSV import.
I noticed the back button that was implemented in a recent PR #5625 was
broken and would need to be fixed (e.g. try to come back to the very
first upload step from the sheet selection step). cc @shashankvish0010
if you want to give a stab at fixing your PR that'd be amazing, thanks!
Update of select fields options was failing if we deleted an option that
was used for at least one row: former code would not update the value to
null but leave it to the no-longer-allowed value.
- Rename syncSubStatus to syncStage
- Rename ongoingSyncStartedAt to syncStageStartedAt
- Remove throttlePauseUntil from db and compute it with
syncStageStartedAt and throttleFailureCount
- Fix duplicate view field creation
- Fix redirect to proper settings data model page
- Refetch view fields after field creation (temporary solution)
Fixes https://github.com/twentyhq/twenty/issues/5598
- Removing existing listener that was backfilling created records
without position
- Switch to a job that backfill all objects within workspace
- Adapting `FIND_BY_POSITION` so it can fetch objects without position.
Currently we needed to input a number
Fix issue introduced in https://github.com/twentyhq/twenty/pull/5426
It's not a beautiful solution. Maybe one day we should have a dedicated
component for title but it also comes with downsides (lot of code to
copy paste, such as "esc" to leave field, copy button, etc.). This one
doesn't create less debt in my opinion. Once we have the layout/widget
system we might have a dedicated widget type and the right abstraction
layers
**Changes:**
- Changed -/+ to eye and eye off icons
- Changed menu width to 200px
- Created separate menu for hidden fields
- Added Edit Fields option to hidden fields menu
- Added test file MenuItemSelectTag (wasn't included in the issue)
As this is my first pr, feedback is very welcome!
**Note:**
These changes cover most of #4363 . I left out the implementation of the
RightIcon in the "Hidden Fields" menu item.
---------
Co-authored-by: kiridarivaki <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
This PR introduces a new side panel to edit records and the ability to
minimize the side panel.
The goal is leverage this sidepanel to be able to create records while
being in another show page.
I'm opening the PR for feedback since it involved refactoring and
therefore already touches a lot of files, even though it was quick to
implement.
<img width="1503" alt="Screenshot 2024-05-23 at 17 41 37"
src="https://github.com/twentyhq/twenty/assets/6399865/6f17e7a8-f4e9-4eb4-b392-c756db7198ac">
- fix : #5521
When we deleted an opportunity that had been added to the favorites
list, the opportunity was removed correctly, but it still remained in
the favorites list. The issue was due to not accounting for the removal
of the opportunity from the favorites during the deletion process.
This problem has now been fixed :
https://github.com/twentyhq/twenty/assets/78202522/3d3cb689-3228-43fc-bf50-e824370582a7
Co-authored-by: Jeff Gasparini <[email protected]>
Now all the required fields are displayed with the respective labels.
- Added a `FieldContextProvider` for the field `Reminder` in the
`ActivityEditorFields`.
- Fixed the missing label values, by adding a missed optional
`showLabel` within the `fieldDefinition` in the `useFieldContext`.
fixes: #5667

- refactor record position factory and record position query factory
- override position if not present during createMany
To avoid overriding the same positions for all data in createMany, the
logic is:
- if inserted last, use last position + arg index + 1
- if inserted first, use first position - arg index - 1
Now the fields don't disappear on drag and drop.
- After reviewing the codebase, I checked that when `inView` is true the
`RecordInlineCell` is rendered otherwise the
`StyledRecordInlineCellPlaceholder` will render which causes the fields
get disappear.
- So, I added the condition to check if `isDragSelectionStartEnabled` is
false then `StyledRecordInlineCellPlaceholder` will be rendered
otherwise `RecordInlineCell`.
fixes: #5651https://github.com/twentyhq/twenty/assets/140178357/022195ca-fec2-43a7-8808-f4974dbe66cf
---------
Co-authored-by: martmull <[email protected]>
Our exception handler has to filter out some errors/exceptions so they
are not caught by the ExceptionHandlerDriver (Logged or Sentry for
example). This is done for Http errors in the range of 4xx and also
makes sure they are converted back to Graphql validation errors.
However, graphql validation errors that are already managed by Yoga
(with Schema validation) should also be filtered out, this PR should fix
that behaviour
# This PR
- Fix#5278
- Updates the implementation of the `createOneObjectMataItem` hook to
reduce the number of api calls
- Users can now navigate to the newly created object first and the
graphql api calls to cache data are happening in the background - this
will improve the user experience and reduce the create object api call
time by >2
<img width="1508" alt="Screenshot 2024-05-30 at 12 00 15"
src="https://github.com/twentyhq/twenty/assets/61581306/46513fd1-d46e-40bc-a036-07e3acdf2870">
In the issue description, it also suggested to have a loading indicator
while creating the object, it seems like on #5352 we adopted to disable
it while creating the object - which looks good to me and it works, let
me know if we still need the loading indicator instead @Bonapara
Looking forward to getting your feedback
cc: @charlesBochet
---------
Co-authored-by: Thomas Trompette <[email protected]>
In this PR, I'm refactoring the messaging module into smaller pieces
that have **ONE** responsibility: import messages, clean messages,
handle message participant creation, instead of having ~30 modules (1
per service, jobs, cron, ...). This is mandatory to start introducing
drivers (gmails, office365, ...) IMO. It is too difficult to enforce
common interfaces as we have too many interfaces (30 modules...). All
modules should not be exposed
Right now, we have services that are almost functions:
do-that-and-this.service.ts / do-that-and-this.module.ts
I believe we should have something more organized at a high level and it
does not matter that much if we have a bit of code duplicates.
Note that the proposal is not fully implemented in the current PR that
has only focused on messaging folder (biggest part)
Here is the high level proposal:
- connected-account: token-refresher
- blocklist
- messaging: message-importer, message-cleaner, message-participants,
... (right now I'm keeping a big messaging-common but this will
disappear see below)
- calendar: calendar-importer, calendar-cleaner, ...
Consequences:
1) It's OK to re-implement several times some things. Example:
- error handling in connected-account, messaging, and calendar instead
of trying to unify. They are actually different error handling. The only
things that might be in common is the GmailError => CommonError parsing
and I'm not even sure it makes a lot of sense as these 3 apis might have
different format actually
- auto-creation. Calendar and Messaging could actually have different
rules
2) **We should not have circular dependencies:**
- I believe this was the reason why we had so many modules, to be able
to cherry pick the one we wanted to avoid circular deps. This is not the
right approach IMO, we need architect the whole messaging by defining
high level blocks that won't have circular dependencies by design. If we
encounter one, we should rethink and break the block in a way that makes
sense.
- ex: connected-account.resolver is not in the same module as
token-refresher. ==> connected-account.resolver => message-importer (as
we trigger full sync job when we connect an account) => token-refresher
(as we refresh token on message import).
connected-account.resolver and token-refresher both in connected-account
folder but should be in different modules. Otherwise it's a circular
dependency. It does not mean that we should create 1 module per service
as it was done before
In a nutshell: The code needs to be thought in term of reponsibilities
and in a way that enforce high level interfaces (and avoid circular
dependencies)
Bonus: As you can see, this code is also removing a lot of code because
of the removal of many .module.ts (also because I'm removing the sync
scripts v2 feature flag end removing old code)
Bonus: I have prefixed services name with Messaging to improve dev xp.
GmailErrorHandler could be different between MessagingGmailErrorHandler
and CalendarGmailErrorHandler for instance
Remote tables could be in an empty state because:
- either we do not have data, which is normal
- either the connexion is broken (issue with the server, table requires
updates...)
Apollo throws errors but these will quickly disappear and do not provide
any tips to the user on how handle those.
This PR adds a new empty state placeholder for remote objects, that will
be display when the record list is empty. It will provide a link to the
settings page.
<img width="1512" alt="Capture d’écran 2024-05-30 à 11 49 33"
src="https://github.com/twentyhq/twenty/assets/22936103/fc2dd3cc-e90b-4033-b023-83ac9ff2a70b">
Query read timeouts happen when a remote server is not available. It
breaks:
- the remote server show page
- the record table page of imported remote tables
This PR will catch the exception so it does not go to Sentry in both
cases.
Also did 2 renaming.
Closes#5057.
RefetchQuery is unreliable - [it won't be executed if the component is
unmounted](https://github.com/apollographql/apollo-client/issues/5419),
which is the case here because of the redirection that occurs after the
mutation.
We want to avoid using refetchQuery as much as possible, and write
directly in the cache instead.
Users now can make a back transition from the current step state.
- Added a `BackButton` component to `spreadsheet-import` in order to use
it within the step state components.
- Used the prebuilt `prevStep` from `useStepBar` and passed it as a prop
to the `Uploadflow` to get the previous state as activestep.
- Added a `previousState` to set the previous state with the required
key data.
- Added a `handleOnBack` function in `Uploadflow` to set the correct
state and call the `prevStep` function to make the transition.
- Added a callback function `onBack` and passed it as props to each step
state component.
fixes: #5564https://github.com/twentyhq/twenty/assets/140178357/be7e1a0a-0fb8-41f2-a207-dfc3208ca6f0
---------
Co-authored-by: Thomas Trompette <[email protected]>
We have a lot of contributors that are not aware of our method for
implementing hotkey listeners.
I updated the documentation to provide clear examples so that users can
refer to it and maintainers and reviewers can point to it when they see
onKeyDown implementations.
Fix issue where captcha did not reset after an incorrect password was
entered and invalid token error was thrown, ensuring users receive a new
captcha token on each attempt.
before:

after: user can try again with a new captcha token and login smoothly
without encountering the invalid token error.
- add missing `excludedOperations` in
`packages/twenty-server/src/engine/middlewares/graphql-hydrate-request-from-token.middleware.ts`
- update generated graphql file
- Add missing redirection to index after password update
This PR fixes creation on table.
With the recent optimization refactor, we now use a custom event to
trigger edit and soft focus mode on a table cell.
There's a specific case when we create a pending row to allow creating a
new record, where the custom event gets triggered before the cell
exists, so it cannot listen and put itself in edit mode.
The fix is passing down a new isPendingRow in the context, so the
identifier cell on a pending row can put itself in edit mode during its
first render.
Some parts of the Frontend used theme constants exported from
`modules/ui` while other parts used theme constants exported from
`twenty-ui`.
This PR centralizes theme constants by removing them from `modules/ui`
completely.
RelationFieldDisplay was estabilishing a dependency on
RecordTableContext which is not right as FieldDisplay can be loaded
outside of RecordTable context
I'm using an util directly but understand this is a bit heavier than
before in term of performance. If we want to pre-compute this, we will
need to be a bit smarter.
Also the previous code based on fieldName was not right, we should check
relationObjectMetadataItem instead
Current state:
<img width="704" alt="Bildschirmfoto 2024-05-11 um 17 57 33"
src="https://github.com/twentyhq/twenty/assets/48770548/c979f6fd-083e-40d3-8dbb-c572229e0da3">
I have some things im not really happy with right now:
* If I have different connections it would be weird to display a one_one
or many_one connection differently
* The edges overlay always at one hand at the source/target (also being
a problem with the 3 dots vs 1 dot)
* I would have to do 4 versions of the 3 dot marker variant as an svg
with exactly the same width as the edges wich is not as easy as it seems
:)
* The initial layout is not really great - I know dagre or elkjs could
solve this but maybe there is a better solution ...
If someone has a good idea for one or more of the problems im happy to
integrate them ;)
---------
Co-authored-by: Félix Malfait <[email protected]>
In this PR I'm optimizing a whole RecordTableCell in real conditions
with a complex RelationFieldDisplay component :
- Broke down getObjectRecordIdentifier into multiple utils
- Precompute memoized function for getting chip data per field with
useRecordChipDataGenerator()
- Refactored RelationFieldDisplay
- Use CSS modules where performance is needed instead of styled
components
- Create a CSS theme with global CSS variables to be used by CSS modules
This PR introduces many improvements over the new profiling story
feature, with new tests and some refactor with main :
- Added use-context-selector for getting value faster in display fields
and created useRecordFieldValue() hook and RecordValueSetterEffect to
synchronize states
- Added performance test command in CI
- Refactored ExpandableList drill-downs with FieldFocusContext
- Refactored field button icon logic into getFieldButtonIcon util
- Added RelationFieldDisplay perf story
- Added RecordTableCell perf story
- First split test of useField.. hook with useRelationFieldDisplay()
- Fixed problem with set cell soft focus
- Isolated logic between display / soft focus and edit mode in the
related components to optimize performances for display mode.
- Added warmupRound config for performance story decorator
- Added variance in test reporting
Closes#5062.
Refactoring tables list to avoid rendering all toggles on each sync or
schema update while using fresh data:
- introducing id for RemoteTables in apollo cache
- manually updating the cache for the record that was updated after a
sync or schema update instead of fetching all tables again
Remote object id columns are not removed anymore when a remote object is
unsynced.
This is because we do not use relations anymore. We only created the id
field. So the current behavior that was implemented for custom objects,
to retrieve the fields to deleted, does not work.
Since remote object relations are really different, I extracted the
logic from `objectMetadataService`. It now handles only the relations
for custom objects creation and deletion (this part should be extracted
as well).
I create a new remote table relation service that will:
- fetch objects metadata linked to remotes (favorites,
activityTargets...)
- look for columns based on remote object name
- delete the fields and columns
Stripe tables do not support `hasNextPage` and `totalCount`. This may be
because of stripe wrapper do not properly support `COUNT` request.
Waiting on pg_graphql answer
[here](https://github.com/supabase/pg_graphql/issues/519).
This PR:
- removes `totalCount` and `hasNextPage` form queries for remote
objects. Even if it works for postgres, this may really be inefficient
- adapt the `fetchMore` functions so it works despite `hasNextPage`
missing
- remove `totalCount` display for remotes
- fix `orderBy`
---------
Co-authored-by: Thomas Trompette <[email protected]>
Makes sure the `twenty-front:chromatic:ci` task in the CI job
`front-chromatic-deployment` reuses the cache of the Storybook built in
the CI job `front-sb-build` instead of re-building Storybook so
Chromatic is deployed faster in the CI.
Closes#5375
<img width="381" alt="image"
src="https://github.com/twentyhq/twenty/assets/3098428/d87773df-c685-466b-ae35-a8349f79df48">
_____
~~Note that I ugraded `@apollo/client` to v3.10.4 because current
version is causing an error when trying to write the Links field in the
cache in `updateRecordFromCache` (`TypeError: Cannot convert object to
primitive value`). After upgrade, the error is gone but console still
prints a warning (here the custom object name is `Listing` and the Links
field name is `website`):~~
<img width="964" alt="image"
src="https://github.com/twentyhq/twenty/assets/3098428/834b8909-e8dc-464a-8c5a-6b7e4c964a7f">
~~It might be because the Links field seems to somehow have a
`__typename` property in Apollo's cache, so Apollo considers it as a
record and tries to match the object's cache with an id, but the Links
field value has no id so it can't find it.
We might want to find where this `__typename` is added and remove it
from the Links object in the cache.~~
Edit: will fix this in another PR as upgrading `@apollo/client` +
`apollo-upload-client` seems to break types and/or tests. Related issue:
[#5437](https://github.com/twentyhq/twenty/issues/5437)
- Created congratulations bot :
<img width="939" alt="Screenshot 2024-05-14 at 12 47 13"
src="https://github.com/twentyhq/twenty/assets/102751374/5138515f-fe4d-4c6d-9c7a-0240accbfca9">
- Modified OG image
- Added png extension to OG image route
To be noted: The bot will not work until the new API route is not
deployed. Please check OG image with Cloudflare cache.
---------
Co-authored-by: Ady Beraud <[email protected]>
Closes#5069 back-end part
And:
- do not display schemaPendingUpdates status on remote server lists as
this call will become too costly if there are dozens of servers
- (refacto) create foreignTableService
After this is merged we will be able to delete remoteTable's
availableTables column
Fix a bug introduced in [this
PR](https://github.com/twentyhq/twenty/pull/5254/files)
When a subscription is created, we need to create the subscription,
#5254 return if no subscription is created so the sub can never be
created at all
This PR fixes that
fixes: #5325
changes done (commits in order):
1. **Fixed fontLight & fontDark 'danger' color as per design spec**:
changed theme.font.color.danger to match the disabled color theme (for
light and dark) as followed by the BorderDark and BorderLight. Use the
updated colors for Buttons
2. **Replace theme.font.color.danger with theme.color.red (5 changed
files)**: Since `theme.font.color.danger` has now been updated to
contain the disabled button color values, we use the `theme.color.red`
color in all the places using `theme.font.color.danger` as it contains
same value that was used to be of `theme.font.color.danger` before.
3. **fixed hover color of StyledConfirmationButton in
ConfirmationModal**: issue can be seen when going to /settings/workspace
and trying to hover on delete the workspace button in dark mode. fixed
with this commit.
**Important Note**: The files
`/twenty-front/src/modules/ui/theme/constants/FontLight.ts` and
`/twenty-front/src/modules/ui/theme/constants/FontDark.ts` **are of no
use** as theme for the entire 'twenty-front' and
'twenty-chrome-extension' packages use the same files from '@/ui/theme'
(twenty-ui package)
dark mode :
<img width="987" alt="Screenshot 2024-05-09 at 9 14 35 PM"
src="https://github.com/twentyhq/twenty/assets/60315832/75fe3972-0e8a-41f6-90a1-09bfcd013e72">
when disabled:
<img width="1098" alt="Screenshot 2024-05-09 at 9 13 46 PM"
src="https://github.com/twentyhq/twenty/assets/60315832/5caab8b5-47ba-43e5-90cd-a41a1f690ca0">
on hover:
<img width="1052" alt="Screenshot 2024-05-09 at 9 14 05 PM"
src="https://github.com/twentyhq/twenty/assets/60315832/58de3df6-ed77-4aad-84fc-67b01154b493">
<br>
<br>
light mode (when disabled):
<img width="918" alt="Screenshot 2024-05-09 at 9 13 14 PM"
src="https://github.com/twentyhq/twenty/assets/60315832/18228783-d6c7-44a6-9fce-00053bb35ef2">
on hover:
<img width="983" alt="Screenshot 2024-05-09 at 9 14 18 PM"
src="https://github.com/twentyhq/twenty/assets/60315832/6df99f12-5767-4136-80c9-5d8883ac8e00">
---------
Co-authored-by: Félix Malfait <[email protected]>
For remotes, we will only create the foreign key, without the relation
metadata. Expected behavior will be:
- possible to create an activity. But the remote object will not be
displayed in the relations of the activity
- the remote objects should not be available in the search for relations
Also switched the number settings to an enum, since we now have to
handle `BigInt` case.
---------
Co-authored-by: Thomas Trompette <[email protected]>
[#4422](https://github.com/twentyhq/twenty/issues/4422)
Demo:
https://github.com/twentyhq/twenty/assets/155670906/f8027ab2-c579-45f7-9f08-f4441a346ae7
Within the demo, we show the various areas in which the Command/CTRL +
Click functionality works. The table cells within the People and
Companies tab open within both the current tab and new tab due to
unchanged functionality within RecordTableCell. We did this to ensure we
could get a PR within by the end of the week.
In this commit, we ONLY edited EntityChip.tsx. We did this by:
- Removing useNavigate() and handleLinkClick/onClick functionality
- Wrapping InnerEntityChip in an anchor tag
This allowed for Command/CTRL + Click functionality to work. Clickable
left cells on tables, left side menu, and data model navigation
files/areas DID NOT get updated.
---------
Co-authored-by: Félix Malfait <[email protected]>
TL;DR:
- removed `--configuration={args.scope}` from `storybook:static:test`
for the `storybook:static` part, as it was making `front-sb-test` jobs
in CI not reuse the cache from the `front-sb-build` job and re-build
storybook every time.
- replaced it with a new `test` configuration which optimizes storybook
build for tests and builds storybook 2x faster.
## Fix storybook:build cache usage in CI
`storybook:static:test` executes two scripts in parallel:
1. `storybook:static`, which depends on `storybook:build`
1.a. it builds storybook first with `storybook:build`, the output
directory is `storybook-static`.
1.b. then it launches an `http-server`, using what has been built in
`storybook-static`
2. `storybook:test` to execute tests (needs the storybook http-server to
be running)
When passing `--configuration=pages` or `--configuration=modules` to
`storybook:static` from step 1, those configurations are passed to the
`storybook:build` script from step 1.a as well.
But for Nx `storybook:build` and `storybook:build --configuration=pages`
(or `modules`) are not the same command, therefore one does not reuse
the cache of the other because they could output completely different
things.
As `front-sb-test` jobs are passing `--configuration={args.scope}` to
`storybook:static`, the cache of the previously executed
`storybook:build` (from `front-sb-build`) is not reused and therefore
each job re-builds Storybook with its own scope, which increases CI
time.
### Solution
- Removed scope configurations from `storybook:static` and
`storybook:build` scripts to avoid confusion.
- `storybook:test` and `storybook:dev` can keep scope configurations as
they can be useful and this doesn't impact storybook build cache in CI.
### Improve Storybook build time for testing
Added the `test` configuration to `storybook:build` and
`storybook:static` which makes Storybook build time 2x faster. It
disables addons that slow down build time and are not used in tests.
- Check if a table with the same name already exists
- If yes, add a number suffix, and check again
Co-authored-by: Thomas Trompette <[email protected]>
Update for #4836
- edit primary and secondary transparency opacities from 0.8 to 0.5
- remove forBackdropFilter from themes
- update components referencing transparency/primary and
transparency/secondary to have the following backdrop-filter: blur(12px)
saturate(200%) contrast(50%) brightness(130%)
---------
Co-authored-by: Félix Malfait <[email protected]>
## Description
Adds a view for creation date and author to notes and tasks panel. Here
is a preview of the new `ActivityCreationDate` component:

Closes#5424
### Type of change
<!-- Please delete options that are not relevant. -->
- [x] New feature (non-breaking change which adds functionality)
## Checklist
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules
---------
Co-authored-by: Félix Malfait <[email protected]>
Signing in is a two steps process:
- Checking if the user email is already used
- Checking if the email + password is correct
Those two steps need a captchaToken to be valid. Unfortunately, from
Cloudflare Turnstile doc:
`A token can only be validated once and cannot be consumed twice. Once a
token has been issued, it can be validated within the next 300 seconds.
After 300 seconds, the token is no longer valid and another challenge
needs to be solved`
So we need to generate a new token at each step instead of re-using the
same
* Modified HTML for Algolia Crawler
* Added anchor tags within user-guide headers
To implement Algolia correctly, my changes would need to be deployed
first, as it cannot run on localhost. In the meantime, I simulated
Algolia crawling locally using Cheerio, and it worked successfully on my
end.
## Context
Fixes#5403
Transliteration is now integrated to form validation through the schema.
While it does not impede inputting an invalid value, it impedes
submitting a form that will fail as the transliteration is not possible.
Until then we were only performing the transliteration at save time in
the front-end, but it's best to provide the information as soon as
possible. Later we will add helpers to guide the user (eg "This name is
not valid": https://github.com/twentyhq/twenty/issues/5428).
---------
Co-authored-by: Charles Bochet <[email protected]>
We do not update the comment on the local table when a foreign table key
is deleted.
This was not breaking, which is why we did not see it. But comments
should be kept up to date.
---------
Co-authored-by: Thomas Trompette <[email protected]>
This PR is updating all object metadata entities with the new
decorators, and deleting the old ones.
This way we can use the new TwentyORM with all the standard objects.
---------
Co-authored-by: Weiko <[email protected]>
## Description
This PR fixes a display issue when editing the company name or the name
of a person where the edit input would be offset to the left instead of
being in the middle.

Fixes#5416
### Type of change
<!-- Please delete options that are not relevant. -->
- [x] Bug fix (non-breaking change which fixes an issue)
## Checklist
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules
This PR introduces a Profiling feature for our story book tests.
It also implements a new CI job : front-sb-test-performance, that only
runs stories suffixed with `.perf.stories.tsx`
## How it works
It allows to wrap any component into an array of React Profiler
components that will run tests many times to have the most replicable
average render time possible.
It is simply used by calling the new `getProfilingStory` util.
Internally it creates a defined number of tests, separated by an
arbitrary waiting time to allow the CPU to give more stable results.
It will do 3 warm-up and 3 finishing runs of tests because the first and
last renders are always a bit erratic, so we want to measure only the
runs in-between.
On the UI side it gives a table of results :
<img width="515" alt="image"
src="https://github.com/twentyhq/twenty/assets/26528466/273d2d91-26da-437a-890e-778cb6c1f993">
On the programmatic side, it stores the result in a div that can then be
parsed by the play fonction of storybook, to expect a defined threshold.
```tsx
play: async ({ canvasElement }) => {
await findByTestId(
canvasElement,
'profiling-session-finished',
{},
{ timeout: 60000 },
);
const profilingReport = getProfilingReportFromDocument(canvasElement);
if (!isDefined(profilingReport)) {
return;
}
const p95result = profilingReport?.total.p95;
expect(
p95result,
`Component render time is more than p95 threshold (${p95ThresholdInMs}ms)`,
).toBeLessThan(p95ThresholdInMs);
},
```
Hi twenty team,
Thanks for making such a great product, it's a pleasure to use and see
the rapid development.
@charlesBochet helped me find this error in my setup
In this PR
1. Enable deletion of relation fields in the product and via the api
(migration part was missing in the api)
3. Change wording, only use "deactivate" and "delete" everywhere (and
not a mix of the two + "disable", "erase")
When user is deleting its account on a specific workspace, we remove it
as if it was a workspaceMember, and if no workspaceMember remains, we
delete the workspace and the associated stripe subscription
- Added github:init to allow full import, as opposed to gitHub:sync
which allows partial sync and therefore respecting Github API Limit
quota.
---------
Co-authored-by: Ady Beraud <[email protected]>
- Adds an util `toSpliced`. We cannot used the native Javascript
`Array.prototype.toSpliced` method as Chromatic servers don't support
it.
- Makes sure Select field options have sequential positions after
removing an option (form validation schema checks that positions are
sequential and considers options invalid otherwise).
In this PR, we are refactoring two things:
- leverage field.defaultValue for Select and MultiSelect settings form
(instead of option.isDefault)
- use quoted string (ex: "'USD'") for string default values to embrace
backend format
---------
Co-authored-by: Thaïs Guigon <[email protected]>
After discussing with @charlesBochet, several fixes are needed on
fields:
- [x] Disable Boolean field `defaultValue` edition for now (On
`defaultValue` update, newly created records are not taking the updated
`defaultValue` into account. Setting the `defaultValue` on creation is
fine.)
- [x] Disable Phone field creation for now
- [x] For the Person object, display the "Phone" field as a field of
type Phone (right now its type is Text; later we'll migrate it to a
proper Phone field).
- [x] Fix RawJson field display (displaying `[object Object]` in Record
Table cells).
- [x] In Settings/Data Model, on Relation field creation/edition,
"Object destination" select is not working properly if an object was not
manually selected (displays Companies by default but creates a relation
to another random object than Companies).
Related to #4295
Following #5326, field types other than:
- `FieldMetadataType.Boolean`
- `FieldMetadataType.Currency`
- `FieldMetadataType.Relation`
- `FieldMetadataType.Select`
- `FieldMetadataType.MultiSelect`
Cannot be saved as they are not included in the form validation schema.
This PR makes sure they are included and can therefore be
created/edited.
Closes#4295
Note: for the sake of an easier code review, I did not rename/move some
files and added "todo" comments instead so Github is able to match those
files with their previous version.
A user has reported an issue with REST API.
We have recently migrated the graphql IDs from UUID to ID type. As Rest
API is leveraging the graphql API under the hood, the Rest API query
builder should be updated accordingly
## Context
Since pg_graphql does not return specific error/exception, we have to
map the error message and throw validation errors when needed
This PR adds a check on unicity constraint error returned by pg_graphql
when we are trying to insert duplicate records and returns a 400 instead
of being handled by the exceptionHandler as a 500.
## Context
Yoga can catch its own errors and we don't want to convert them again.
Moreover those errors don't have an "originalError" property and should
be schema related only (400 validation) so we only want to send them
back to the API caller without going through the exception handler.
Also fixed an issue in the createMany which was throwing a 500 when id
was missing from the creation payload. It seems the FE is always sending
an ID but it should actually be optional since the DB can generate one.
This is a regression from the new UUID validation introduced a few weeks
ago.
Fixes#5276.
Updates were not triggering a cache version incrementation because they
do not trigger migrations while that is where the caching version logic
was.
We have decided to move the cache incrementation logic to the services.
## Context
JobsModule is hard to maintain because we provide all the jobs there,
including their dependencies. This PR aims to split jobs in dedicated
modules.
- Removed the env variable and added the current URL in contributor's
page
- Added button to share on LinkedIn on contributor's profile
- Fixed absolute image URL for release API
---------
Co-authored-by: Ady Beraud <[email protected]>
- Encapsulated GitHub star response in an object
- Fixed rounding of Github stars to align with Github convention
- Fixed CORS issue so that endpoint can be called from twenty.com and
app.twenty.com
Co-authored-by: Ady Beraud <[email protected]>
In this PR, I'm refactoring the way we associate messageParticipant post
person/company creation. Instead of looking a all person without
participant, we are passing the one that were just created.
Also, I'm making sure the message and messageParticipant creation
transaction is commited before creating person/company creation (and
then messageParticipant association)
This PR fixes several issues:
- enum naming should be: {tableName}_{fieldName}_enum and respecting the
case
- defaultValue format handled in the FE should respect the one in the BE
In my opinion we should refactor the defaultValue:
- we should respect backend format: "'myDefault'" for constant default
and "0" for float, "now" for expressions, "true" for booleans. we can
rename it to defaultValueExpression if it is more clear but we should
not maintain a parallel system
- we should deprecate option: isDefaultValue which is confusing
- we should re-work backend to have a more unified approach between
fields and avoid having if everywhere about select, multiselect, and
currency cases. one unified "computeDefaultValue" function should do the
job
What is still broken:
- currency default Value on creation. I think we should do the refactor
first
- select default value edition.
These cases do not break the schema but are ignored currently
# This PR
- Fix#5021
- Migrates `passwordResetToken` and `passwordResetTokenExpiresAt` fields
from `core.users` to `core.appToken`
- Marks those fields as `deprecated` so we can remove them later if we
are happy with the transition -- I took this decision on my own,
@FellipeMTX let me know what you think about it, we can also remove them
straight away if you think it's better
- Fixed the `database:migration` script from the `twenty-server` to:
```json
"database:migrate": {
"executor": "nx:run-commands",
"dependsOn": ["build"], // added this line
"options": {
"cwd": "packages/twenty-server",
"commands": [
"nx typeorm -- migration:run -d src/database/typeorm/metadata/metadata.datasource",
"nx typeorm -- migration:run -d src/database/typeorm/core/core.datasource"
],
"parallel": false
}
},
```
The migration script wasn't running because the builds were not executed
- [x] Added unit tests for the token.service file's changes
Looking forward to hearing feedback from you
cc: @charlesBochet
---------
Co-authored-by: Weiko <[email protected]>
This PR is a follow up of PR #5153.
This one introduce some changes on how we're querying composite fields.
We can do:
```typescript
export class CompanyService {
constructor(
@InjectWorkspaceRepository(CompanyObjectMetadata)
private readonly companyObjectMetadataRepository: WorkspaceRepository<CompanyObjectMetadata>,
) {}
async companies(): Promise<CompanyObjectMetadata[]> {
// Old way
// const companiesFilteredByLinkLabel = await this.companyObjectMetadataRepository.find({
// where: { xLinkLabel: 'MyLabel' },
// });
// Result will return xLinkLabel property
// New way
const companiesFilteredByLinkLabel = await this.companyObjectMetadataRepository.find({
where: { xLink: { label: 'MyLabel' } },
});
// Result will return { xLink: { label: 'MyLabel' } } property instead of { xLinkLabel: 'MyLabel' }
return companiesFilteredByLinkLabel;
}
}
```
Also we can now inject `TwentyORMManage` class to manually create a
repository based on a given `workspaceId` using
`getRepositoryForWorkspace` function that way:
```typescript
export class CompanyService {
constructor(
// TwentyORMModule should be initialized
private readonly twentyORMManager,
) {}
async companies(): Promise<CompanyObjectMetadata[]> {
const repository = await this.twentyORMManager.getRepositoryForWorkspace(
'8bb6e872-a71f-4341-82b5-6b56fa81cd77',
CompanyObjectMetadata,
);
const companies = await repository.find();
return companies;
}
}
```
## Context
Because creating an object in metadata also generates a graphql type and
because graphql does not allow 2 types with the same name, we have to
manage a list of reserved keywords that can't be used as object names.
Currently we were maintaining a list of the core objects but we also
have to introduce composite fields that are also generated as gql types.
The whole viewBar component was re-rendered on view changes which was
introducing performance issue. The need was to compute page title, this
should be done in a lower level component
## Context
Positions are used within a view to display and sort the different
records of standard/custom object.
When we add a new record and want to put it before the existing first
record, we have to use float values to insert them in the DB and respect
the desired order. We are adding a new command that can be executed to
flatten those positions.
---------
Co-authored-by: bosiraphael <[email protected]>
While using middleware (executed pre-graphql) for graphql endpoint, we
need to swallow exception and return errors with a 200. Otherwise it's
not a valid graphql response
## Context
There is no calendarChannel syncStatus column compared to the
messageChannel table. In the meantime, we are trying to infer its status
based on the fact that the connection hasn't failed and the sync is
enabled
- Fixes storybook coverage command: the coverage directory path was
incorrect, but instead of failing `storybook:test --configuration=ci`,
it was hanging indefinitely.
- Switches back to `concurrently` to launch `storybook:static` and
`storybook:test` in parallel, which allows to use options to explicitly
kill `storybook:static` when `storybook:test` fails.
- Moves `storybook:test --configuration=ci` to its own command
`storybook:static:test`: used in the CI, and can be used locally to run
storybook tests without having to launch `storybook:dev` first.
- Creates command `storybook:coverage` and enables cache for this
command.
- Fixes Jest tests that were failing.
- Improves caching conditions for some tasks (for instance, no need to
invalidate Jest test cache if only Storybook story files were modified).
Various fixes
- Remote objects are read-only for now, we already hide and block most
of the write actions but the button that allows you to add a new record
in an empty collection was still visible.
- CreatedAt is not mandatory on remote objects (at least for now) so it
was breaking the show page, it now checks if createdAt exists and is not
null before trying to display the human readable format `Added x days
ago`
- The filters are overwritten in query-runner-args.factory.ts to handle
NUMBER field type, this was only working with filters like
```
{
"id": {
"in": [
1
]
}
```
but not with more depth such as
```
"and": [
{},
{
"id": {
"in": [
1
]
}
}
]
```
- Fixes CREATE FOREIGN TABLE raw query which was missing ",".
## Context
We recently introduced a change that now throws a 401 if the token is
invalid or expired.
The first implementation is using an allow list and 'IntrospectionQuery'
was missing so the playground was broken.
The check has been updated and we now only check the excludedOperations
list if a token is not present. This is because some operations can be
both used as loggedIn and loggedOut so we want to validate the token for
those sometimes (and set the workspace, user, cache version, etc). Still
not a very clean solution imho.
## Context
We have a non-nullable constraint on authorId in attachments and
documents, until we have soft-deletion we need to handle deletion of
workspace-members and their attachments/documents.
This PR introduces pre-hooks to deleteOne/deleteMany
This is called when a user deletes a workspace-member from the members
page
Next: needs to be done on user level as well. This is called when users
try to delete their own accounts. I've seen other issues such as
re-creating a user with a previously used email failing.
Adding stripe integration by making the server logic independent of the
input fields:
- query factories (remote server, foreign data wrapper, foreign table)
to loop on fields and values without hardcoding the names of the fields
- adding stripe input and type
- add the logic to handle static schema. Simply creating a big object to
store into the server
Additional work:
- rename username field to user. This is the input intended for postgres
user mapping and we now need a matching by name
---------
Co-authored-by: Thomas Trompette <[email protected]>
## Context
Those settings are not implemented yet, we would like to move them to a
different page as well.
In the meantime, we are hiding them since we plan to launch calendar in
the next release and this won't be implemented before.
We will implement it in this
https://github.com/twentyhq/twenty/issues/5140
## Context
Currently, this middleware validates the token and stores the user,
workspace and cacheversion in the request object.
It only does so when a token is provided and ignores the middleware
logic if not. If the token is invalid or expired, the exception is
swallowed.
This PR removes the try/catch and adds an allowlist to skip the token
validation for operations executed while not signed-in.
I don't know a better way to do that with Nestjs. We can't easily add
the middleware per resolver without refactoring the flexible schema
engine so I'm doing it the other way around.
Fixes https://github.com/twentyhq/twenty/issues/5224
Added a smart Changelog :
- Publish the Changelog before the app release. If the release has not
yet been pushed to production, do not display it.
- When the app release is done, make the Changelog available with the
correct date.
- If the Changelog writing is delayed because the release has already
been made, publish it immediately.
- Display everything locally to be able to iterate on the changelog and
have a preview
Added an endpoint for the Changelog
---------
Co-authored-by: Ady Beraud <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
## Context
#4774
## How was it tested
Locally
## In further PRs
- Update connection status upon page change
- Adapt Info banner to dark mode
- placeholders for form
## Context
Currently we have an unicity constraint in the DB but we don't return a
clear error to the frontend before reaching the DB (which then throws a
500). This PR adds a validation check similar to what we have with field
creation
Closes#5097
- Uses "nx affected" to detect what projects need to be checked in the
current PR (for now, `ci-front` and `ci-server` workflows only).
- Caches results of certain tasks (`lint`, `typecheck`, `test`,
`storybook:build`) when a PR pipeline runs. The next runs of the same
PR's pipeline will then be able to reuse the PR's task cache to execute
tasks faster.
- Caches Yarn's cache folder to install dependencies faster in CI jobs.
- Rewrites the node modules cache/install steps as a custom, reusable
Github action.
- Distributes `ci-front` jobs with a "matrix" strategy.
- Sets common tasks config at the root `nx.json`. For instance, to
activate the `typecheck` task in a project, add `typecheck: {}` to its
`project.json` and it'll use the default config set in `nx.json` for the
`typecheck` task. Options can be overridden in each individual
`project.json` if needed.
- Adds "scope" tags to some projects: `scope:frontend`, `scope:backend`,
`scope:shared`. An eslint rule ensures that `scope:frontend` only
depends on `scope:frontent` or `scope:shared` projects, same for
`scope:backend`. These tags are used by `nx affected` to filter projects
by scope and generates different task cache keys according to the
requested scope.
- Enables checks for twenty-emails in the `ci-server` workflow.
Now that we have persistent cache for schemas, we want to be able to
reset its state when users run the database:reset db otherwise schemas
won't be synced with the new DB state.
Note: In an upcoming PR, we want to be able to invalidate the cache on a
workspace level when we change the metadata schema through twenty
version upgrade
## Context
Messaging and calendar cron jobs are only working for workspace that
have sub status different than incomplete, this is because currently
this is the simplest way to know if a user is onboarded. This should not
be the source of truth and this will be updated in a later version. In
the meantime, to make self-hosting easier, we are adding an extra check
on IS_BILLING_ENABLED env var since sub status is not relevant for
people not using billing.
We should not depend on the foreign data wrapper type to manage distant
table. The remote server should be enough to handle the table creation.
Here is the new flow to fetch available tables:
- check if the remote server have available tables already stored
- if not, import full schema in a temporary schema
- copy the tables into the available tables field
- delete the schema
Left todo:
- update remote server input for postgres so we receive the schema
---------
Co-authored-by: Thomas Trompette <[email protected]>
A search bar has been introduced in the filter dropdown menu however we
don't want to apply debounce since the search has no side-effect and is
purely FE (it's not querying the DB compared to other search bars). Also
adding autofocus on the search bar when the dropdown is open.
## Query depth deprecation
I'm deprecating depth parameter in our graphql query / cache tooling.
They were obsolete since we introduce the possibility to provide
RecordGqlFields
## Refactor combinedFindManyRecordHook
The hook can now take an array of operationSignatures
## Fix tasks issues
Fix optimistic rendering issue. Note that we still haven't handle
optimisticEffect on creation properly
## Introduction
This PR introduces "TwentyORM," a custom ORM module designed to
streamline database interactions within our workspace schema, reducing
the need for raw SQL queries. The API mirrors TypeORM's to provide a
familiar interface while integrating enhancements specific to our
project's needs.
To facilitate this integration, new decorators prefixed with `Workspace`
have been implemented. These decorators are used to define entity
metadata more explicitly and are critical in constructing our schema
dynamically.
## New Features
- **Custom ORM System**: Named "TwentyORM," which aligns closely with
TypeORM for ease of use but is tailored to our application's specific
requirements.
- **Decorator-Driven Configuration**: Entities are now configured with
`Workspace`-prefixed decorators that clearly define schema mappings and
relationships directly within the entity classes.
- **Injectable Repositories**: Repositories can be injected similarly to
TypeORM, allowing for flexible and straightforward data management.
## Example Implementations
### Decorated Entity Definitions
Entities are defined with new decorators that outline table and field
metadata, relationships, and constraints. Here are examples of these
implementations:
#### Company Metadata Object
```typescript
@WorkspaceObject({
standardId: STANDARD_OBJECT_IDS.company,
namePlural: 'companies',
labelSingular: 'Company',
labelPlural: 'Companies',
description: 'A company',
icon: 'IconBuildingSkyscraper',
})
export class CompanyObjectMetadata extends BaseObjectMetadata {
@WorkspaceField({
standardId: COMPANY_STANDARD_FIELD_IDS.name,
type: FieldMetadataType.TEXT,
label: 'Name',
description: 'The company name',
icon: 'IconBuildingSkyscraper',
})
name: string;
@WorkspaceField({
standardId: COMPANY_STANDARD_FIELD_IDS.xLink,
type: FieldMetadataType.LINK,
label: 'X',
description: 'The company Twitter/X account',
icon: 'IconBrandX',
})
@WorkspaceIsNullable()
xLink: LinkMetadata;
@WorkspaceField({
standardId: COMPANY_STANDARD_FIELD_IDS.position,
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Company record position',
icon: 'IconHierarchy2',
})
@WorkspaceIsSystem()
@WorkspaceIsNullable()
position: number;
@WorkspaceRelation({
standardId: COMPANY_STANDARD_FIELD_IDS.accountOwner,
label: 'Account Owner',
description: 'Your team member responsible for managing the company account',
type: RelationMetadataType.MANY_TO_ONE,
inverseSideTarget: () => WorkspaceMemberObjectMetadata,
inverseSideFieldKey: 'accountOwnerForCompanies',
onDelete: RelationOnDeleteAction.SET_NULL,
})
@WorkspaceIsNullable()
accountOwner: WorkspaceMemberObjectMetadata;
}
```
#### Workspace Member Metadata Object
```typescript
@WorkspaceObject({
standardId: STANDARD_OBJECT_IDS.workspaceMember,
namePlural: 'workspaceMembers',
labelSingular: 'Workspace Member',
labelPlural: 'Workspace Members',
description: 'A workspace member',
icon: 'IconUserCircle',
})
@WorkspaceIsSystem()
@WorkspaceIsNotAuditLogged()
export class WorkspaceMemberObjectMetadata extends BaseObjectMetadata {
@WorkspaceField({
standardId: WORKSPACE_MEMBER_STANDARD_FIELD_IDS.name,
type: FieldMetadataType.FULL_NAME,
label: 'Name',
description: 'Workspace member name',
icon: 'IconCircleUser',
})
name: FullNameMetadata;
@WorkspaceRelation({
standardId: WORKSPACE_MEMBER_STANDARD_FIELD_IDS.accountOwnerForCompanies,
label: 'Account Owner For Companies',
description: 'Account owner for companies',
icon: 'IconBriefcase',
type: RelationMetadataType.ONE_TO_MANY,
inverseSideTarget: () => CompanyObjectMetadata,
inverseSideFieldKey: 'accountOwner',
onDelete: RelationOnDeleteAction.SET_NULL,
})
accountOwnerForCompanies: Relation
<CompanyObjectMetadata[]>;
}
```
### Injectable Repository Usage
Repositories can be directly injected into services, allowing for
streamlined query operations:
```typescript
export class CompanyService {
constructor(
@InjectWorkspaceRepository(CompanyObjectMetadata)
private readonly companyObjectMetadataRepository: WorkspaceRepository<CompanyObjectMetadata>,
) {}
async companies(): Promise<CompanyObjectMetadata[]> {
// Example queries demonstrating simple and relation-loaded operations
const simpleCompanies = await this.companyObjectMetadataRepository.find({});
const companiesWithOwners = await this.companyObjectMetadataRepository.find({
relations: ['accountOwner'],
});
const companiesFilteredByLinkLabel = await this.companyObjectMetadataRepository.find({
where: { xLinkLabel: 'MyLabel' },
});
return companiesFilteredByLinkLabel;
}
}
```
## Conclusions
This PR sets the foundation for a decorator-driven ORM layer that
simplifies data interactions and supports complex entity relationships
while maintaining clean and manageable code architecture. This is not
finished yet, and should be extended.
All the standard objects needs to be migrated and all the module using
the old decorators too.
---------
Co-authored-by: Weiko <[email protected]>
Fixes#5168
- Added primaryInverted and primaryInvertedHover to design system.
- Changed primary button background with a gradient to inverted-flat for
both light and dark themes.
- Hover added to go lighter (consistent with tertiary color of +5 step
on GRAY_SCALE).
- Font color changed from primary to inverted.
- Modified button border from light to strong.
Two components are still utilizing the button with gradient background -
email and chrome extension.
Figma design guidelines show them to be inverted and flat (not
gradient).
- Should I change those as well?
- Should the gradient style be removed altogether after this has been
completed?
Co-authored-by: Henry Kim <[email protected]>
I have added error logging to Sentry using Sentry.captureException. The
_info object which includes the componentStack will be sent in extra
data along with the exception.
## Context
We recently enabled the option to bypass SSL certificate authority
validation when establishing a connection to PostgreSQL. Previously, if
this validation failed, the server would revert to unencrypted traffic.
Now, it maintains encryption even if the SSL certificate check fails. In
the process, we overlooked a few DataSource setups, prompting a review
of DataSource creation within our code.
## Current State
Our DataSource initialization is distributed as follows:
- **Database folder**: Contains 'core', 'metadata', and 'raw'
DataSources. The 'core' and 'metadata' DataSources manage migrations and
static resolver calls to the database. The 'raw' DataSource is utilized
in scripts and commands that require handling both aspects.
- **typeorm.service.ts script**: These DataSources facilitate
multi-schema connections.
## Vision for Discussion
- **SystemSchema (formerly core) DataSource**: Manages system schema
migrations and system resolvers/repos. The 'core' schema will be renamed
to 'system' as the Core API will include parts of the system and
workspace schemas.
- **MetadataSchema DataSource**: Handles metadata schema migrations and
metadata API resolvers/repos.
- **(Dynamic) WorkspaceSchema DataSource**: Will be used in the Twenty
ORM to access a specific workspace schema.
We currently do not support cross-schema joins, so maintaining these
DataSources separately should be feasible. Core API resolvers will
select the appropriate DataSource based on the field context.
- **To be discussed**: The potential need for an AdminDataSource (akin
to 'Raw'), which would be used in commands, setup scripts, and the admin
panel to connect to any database schema without loading any model. This
DataSource should be reserved for cases where utilizing metadata,
system, or workspace entities is impractical.
## In This PR
- Ensuring all existing DataSources are compliant with the SSL update.
- Introducing RawDataSource to eliminate the need for declaring new
DataSource() instances in commands.
## Context
@lucasbordeau introduced a new Yoga plugin that allows us to cache our
requests (👏), see https://github.com/twentyhq/twenty/pull/5189
I'm simply updating the implementation to allow us to use different
cache storage types such as redis
Also adding a check so it does not use cache for other operations than
ObjectMetadataItems
## Test
locally, first call takes 340ms, 2nd takes 30ms with 'redis' and 13ms
with 'memory'
In this PR I'm introducing a simple custom graphql-yoga plugin to create
a caching mechanism specific to our metadata.
The cache key is made of : workspace id + workspace cache version, with
this the cache is automatically invalidated each time a change is made
on the workspace metadata.
New strategy:
- add settings field on FieldMetadata. Contains a boolean isIdField and
for numbers, a precision
- if idField, the graphql scalar returned will be a GraphQL id. This
will allow the app to work even for ids that are not uuid
- remove globals dateScalar and numberScalar modes. These were not used
- set limit as Integer
- check manually in query runner mutations that we send a valid id
Todo left:
- remove WorkspaceBuildSchemaOptions since this is not used anymore.
Will do in another PR
---------
Co-authored-by: Thomas Trompette <[email protected]>
Co-authored-by: Weiko <[email protected]>
## Description
This PR adds recaptcha on login form. One can add any one of three
recaptcha vendor -
1. Google Recaptcha -
https://developers.google.com/recaptcha/docs/v3#programmatically_invoke_the_challenge
2. HCaptcha -
https://docs.hcaptcha.com/invisible#programmatically-invoke-the-challenge
3. Turnstile -
https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#execution-modes
### Issue
- #3546
### Environment variables -
1. `CAPTCHA_DRIVER` - `google-recaptcha` | `hcaptcha` | `turnstile`
2. `CAPTCHA_SITE_KEY` - site key
3. `CAPTCHA_SECRET_KEY` - secret key
### Engineering choices
1. If some of the above env variable provided, then, backend generates
an error -
<img width="990" alt="image"
src="https://github.com/twentyhq/twenty/assets/60139930/9fb00fab-9261-4ff3-b23e-2c2e06f1bf89">
Please note that login/signup form will keep working as expected.
2. I'm using a Captcha guard that intercepts the request. If
"captchaToken" is present in the body and all env is set, then, the
captcha token is verified by backend through the service.
3. One can use this guard on any resolver to protect it by the captcha.
4. On frontend, two hooks `useGenerateCaptchaToken` and
`useInsertCaptchaScript` is created. `useInsertCaptchaScript` adds the
respective captcha JS script on frontend. `useGenerateCaptchaToken`
returns a function that one can use to trigger captcha token generation
programatically. This allows one to generate token keeping recaptcha
invisible.
### Note
This PR contains some changes in unrelated files like indentation,
spacing, inverted comma etc. I ran "yarn nx fmt:fix twenty-front" and
"yarn nx lint twenty-front -- --fix".
### Screenshots
<img width="869" alt="image"
src="https://github.com/twentyhq/twenty/assets/60139930/a75f5677-9b66-47f7-9730-4ec916073f8c">
---------
Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
In this PR:
- Follow up on #5170 as we did not take into account not logged in users
- only apply throttler on root fields to avoid performance overhead
In this PR I'm introducing a new patch on @graphql-yoga/nestjs package.
This patch overrides a previous patch that was made to compute the
conditionnal schema on each request,
Here we use a cache map to compute only once per schema workspace cache
version.
This allows us to have sub 100ms query time.
Fixes#5161
<img width="179" alt="image"
src="https://github.com/twentyhq/twenty/assets/68029599/5a7a5b11-c6ec-4f1f-b94d-37be470a7f79">
detail: before this PR, the icon would display as normal for the default
data:// icons, but not for uploaded files
(`workspace-logo/original/{}.png` for example). This PR fixes this by
calling the getImageAbsoluteURIOrBase64 function to resolve the missing
path.
An error has been recently introduced in the sync of fieldMetadata. This
PR fixes it
Additionnally, we are enabling email for trialing and past_due
workspaces. There is an ongoing work to introduce a more robust
activationStatus on workspace.
While trying to migrate a workspace from 0.3.3 to 0.10.0, we've faced an
issue with the script to migrate default-values format.
This PR fixes it.
We really need to add tests on this part ;)
Previously we had to create a separate API key to give access to chrome
extension so we can make calls to the DB. This PR includes logic to
initiate a oauth flow with PKCE method which redirects to the
`Authorise` screen to give access to server tokens.
Implemented in this PR-
1. make `redirectUrl` a non-nullable parameter
2. Add `NODE_ENV` to environment variable service
3. new env variable `CHROME_EXTENSION_REDIRECT_URL` on server side
4. strict checks for redirectUrl
5. try catch blocks on utils db query methods
6. refactor Apollo Client to handle `unauthorized` condition
7. input field to enter server url (for self-hosting)
8. state to show user if its already connected
9. show error if oauth flow is cancelled by user
Follow up PR -
Renew token logic
---------
Co-authored-by: Félix Malfait <[email protected]>
I extracted the init database logic into its own file.
You can now run it with yarn database:init.
Added database entry for GitHub stars.
Do you want me to remove the init route or is it used for something else
?
---------
Co-authored-by: Ady Beraud <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
Added SEO to Contributors, Contributor, User Guide (+ each of it's
pages), Changelog, OSS friends: titles, descriptions
Co-authored-by: Ady Beraud <[email protected]>
Date picker UI was off because of the recent refactor with new field
types Date and DateTime. We had to allow the date picker to edit both.
In this PR we come back to the previous design and we only use the input
to modify time.
Also we use our Select component instead of the ones from the library
`react-datepicker`
---------
Co-authored-by: Weiko <[email protected]>
- Modified CSS: font-size, colors, margins...
- Added an ArticleContent Component that will be used for the changelog
and user guide articles, which contains the styles for each titles,
paragraphs, images etc.
- Added link to User Guide in footer
- Added a UserGuideWarning Component:
<img width="332" alt="Screenshot 2024-04-17 at 18 14 48"
src="https://github.com/twentyhq/twenty/assets/102751374/0f5c601b-a2c0-4c63-baeb-1990d65fc332">
- Added a UserGuideEditContent Component:
<img width="394" alt="Screenshot 2024-04-17 at 18 16 24"
src="https://github.com/twentyhq/twenty/assets/102751374/6c7c3bd4-c5bb-4d02-8f93-bd99bc30ce7b">
- Added a UserGuideLink Component (for usage in MDX to allow links to
open in new tab)
- Fixed table of content
- Made responsive
---------
Co-authored-by: Ady Beraud <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
## Context
As discussed with @lucasbordeau and @charlesBochet we are looking at
making low level UI components stateless when possible.
Therefore TextInput should not handle a hotkey state. Instead hotkeys
should be defined in the parent component (as done here in
CreateProfile).
Introducing here TextInputV2 that is stateless and that can already
replace TextInput without any behaviour change everywhere it is used
with `disableHotkey` prop.
## How was it tested?
Locally + Storybook
---------
Co-authored-by: Lucas Bordeau <[email protected]>
## Context
For users with many records, only the first n*60 records were loaded on
board views (n being the number of visible columns). This was because of
the following behavior:
- watch for end of column visibility changes. If an end of column is
visible, try to fetch more. However, watching for visbility changes is
not reliable enough.
## What we want
If an end of column is visible, try to fetch more. If no more records is
availble in pagination, do not fetch more
Refactored the code to introduce two different concepts:
- AuditLogs (immutable, raw data)
- TimelineActivities (user-friendly, transformed data)
Still some work needed:
- Add message, files, calendar events to timeline (~2 hours if done
naively)
- Refactor repository to try to abstract concept when we can (tbd, wait
for Twenty ORM)
- Introduce ability to display child timelines on parent timeline with
filtering (~2 days)
- Improve UI: add links to open note/task, improve diff display, etc
(half a day)
- Decide the path forward for Task vs Notes: either introduce a new
field type "Record Type" and start going into that direction ; or split
in two objects?
- Trigger updates when a field is changed (will be solved by real-time /
websockets: 2 weeks)
- Integrate behavioral events (1 day for POC, 1 week for
clean/documented)
<img width="1248" alt="Screenshot 2024-04-12 at 09 24 49"
src="https://github.com/twentyhq/twenty/assets/6399865/9428db1a-ab2b-492c-8b0b-d4d9a36e81fa">
This PR fixes#5024.
Local recoil state was not updated when workspace name is changed. This
PR updates local recoil state so that dropdown (and other parts of the
app) correctly shows the workspace name without reload.
When distant table does not have an id column, syncing does not work.
Today the check is only made after creating the foreign table locally.
We should do it first, so we avoid having a foreign table created and
failing right after.
Co-authored-by: Thomas Trompette <[email protected]>
Default currency logic was not handling a specific case where the
default currency is empty in the field metadata.
I fixed the ternary cascade and made it more explicit, thus also
avoiding falling into having an empty currency code being persisted.
Improved table cell performances by putting all hooks from
RecordTableCell in RecordTableContext and RecordTable component, so that
each cell now only subscribes to a reference to those hooks' returned
function.
We couldn't do memoization here since the problem is not to memoize
between re-renders but to share the same function reference between
hundreds of different components, so a context it the fastest way for
this.
I had to refactor the hooks a little bit so that they take as arguments
what was previously taken from the cell's context.
[In a previous PR](https://github.com/twentyhq/twenty/pull/5008) I was
fixing dark mode by calling useTheme in AppErrorBoundary while there was
actually no parent ThemeProvider. This was causing a bug when an error
was actually intercepted by AppErrorBoundary because theme was empty.
Now I am providing the error theme in GenericErrorFallback, fallbacking
to THEME_LIGHT as it can be called from outside a ThemeProvider (as it
is the case today), but also reading into ThemeProvider in case we end
up using this component in a part of the application where it is
available, not to necessarily use THEME_LIGHT.
## How was it tested?
with @thaisguigon
Locally (dark mode works + error mode works (throwing an error in
RecoilDebugObserver))
# This PR
- Moves dev and ci scripts to the `project.json` file in the
twenty-front package
- Adds a project.json file in the root of the project with the main
start command that start both twenty-server and twenty-front
applications concurrently
- Updates the script command of the root project with the start:prod
command (replacing the start command which will be used in dev with the
help of nx)
- Add a start:prod command in the twenty-front app, replacing the start
command (now used for dev purpose)
Issue ref #4645
@charlesBochet @FelixMalfait please let me know how can I improve it
---------
Co-authored-by: Thaïs Guigon <[email protected]>
## Context
We have recently added an event listener to create audit logs on objects
update. However, we have only created the structure (relations on event
standard objects) for Company, Person, Opportunity and custom objects.
There is a larger effort in #4936 to refactor this.
For now, we are disabling log auditing on all other objects
## How
Add @IsNotAuditLogged() annotation on all standard objects except
Company, Person, Opportunity
## Context
We recently introduced this verification but we didn't take into account
self-hosting that might not use billing.
## Test
tested locally with
- new workspace and new account
- existing workspace with new account and billing not enabled and status
incomplete => OK
- existing workspace with new account and billing enabled and status
incomplete => NOK
- existing workspace with new account and billing enabled and status
active => OK
Unfortunately, it is not possible in CSS to have an overflow:visible
over x-axis while having an overflow:hidden over y-axis, leading to the
following issue:
<img width="1512" alt="image"
src="https://github.com/twentyhq/twenty/assets/12035771/9b84cbbb-c6c4-4fd6-a630-a24f01eccf73">
I'm refactoring the RecordInlineCell and RecordTableCell to use
useFloating + createPortal to open the cell.
We will require remote table entity to map distant table name and local
foreign table name.
Introducing the entity:
- new source of truth to know if a table is sync or not
- created synchronously at the same time as metadata and foreign table
Adding a few more changes:
- exception rather than errors so the user can see these
- `pluralize` library that will allow to stop adding `Remote` suffix on
names
---------
Co-authored-by: Thomas Trompette <[email protected]>
## Context
Fixes#4808
TL;DR
Introducing pure stateless modal component ("UI modal") for our auth
modal not to have default hotkeyScope overriding our create-profile
hotkeyScope
+ we dont want the shortcut to be available for all the modal content, only for the input that should not be using a hotkeyscope, so we are using onKeyDown for the specific issue on create profile.
Explanation
create-profile hotkey scope is set by PageChangeEffect; CreateProfile
component adds enter key shortcut; but this scope is overwritten by the
default scope by the Modal component that expects a hotkeyScope to reset
to (and defaults to the default hotkeyScope if none indicated).
In the auth flow we were using that Modal component to give a modal look
to the flow but it is not a modal per say, it's a set of pages contained
within a modal look.
By creating this UI component we are escaping that hotkeyScope
overriding that does not make sense in our context.
## How was it tested
Locally
Storybook
## Context
- Rename remaining V2 services.
- Delete messages in DB when gmail history tells us they've been
deleted. I removed the logic where we store those in a cache since it's
a bit overkill because we don't need to query gmail and can use those
ids directly. The strategy is to delete the message channel message
association of the current channel, not the message or the thread since
they can still be linked to other channels. However, we will need to
call the threadCleaner service on the workspace to remove orphan
threads/non-associated messages.
Note: deletion for full-sync is a bit tricky because we need the full
list of message ids to compare with the DB and make sure we don't
over-delete. Currently, to keep memory, we don't have a variable that
holds all ids as we flush it after each page. Easier solution would be
to wipe everything before each full sync but it's probably not great for
the user experience if they are currently manipulating messages since
full-sync can happen without a user intervention (if a partial sync
fails due to historyId being invalidated by google for some reason)
- Implemented correct mask for Date and DateTime field in
InternalDatePicker
- Use only keyDown event and click outside in InternalDatePicker and
DateInput
- Refactored InternalDatePicker UI to have month and year displayed
- Fixed bug and synchronized date value between the different inputs
that can change it
---------
Co-authored-by: gitstart-twenty <[email protected]>
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
## Context
The full-sync job was enqueued within a transaction, which means it
could be executed before the transaction was commit and
connected-account was not created yet.
This PR re-arrange the code a bit to avoid this
cc @bosiraphael thx for flagging this!
## Context
Recent PR introduced a verifyTransientToken inside the
GoogleAPIsProviderEnabledGuard guard. This is used to extract the
workspaceId from the token. This is working fine for the first call sent
to google however the callback is calling the same guard which is
causing an issue because the transientToken is missing from the
callback.
Imho, the same guard shouldn't be used by the callback but for the time
being I'm adding a check to prevent using feature flag when
transientToken is absent. In fact, it is present in the request but not
in the same key. Because the scope is only relevant for the first call,
I'm simply adding a check there.
## Context
Currently the calendar scope is bound to an env variable. We want to
rollout this feature to some users so this PR adds a check on the
existing IS_CALENDAR_ENABLED flag
closes#4714
We cannot set null expiration dates for api keys. So we will set to 100
years instead of null. If apiKey expires in more that 10 years, it is
displayed as "Never expires"
## Context
With the addition of cronjobs, the app is building a lot of jobs and
stores them indefinitely. There is no real point to keep all of them in
the queue once they have been processed (completed or failed) so we are
adding a new default option to the bull-mq driver
## Implementation
See bull-mq JobsOption doc
```typescript
/**
* If true, removes the job when it successfully completes
* When given a number, it specifies the maximum amount of
* jobs to keep, or you can provide an object specifying max
* age and/or count to keep. It overrides whatever setting is used in the worker.
* Default behavior is to keep the job in the completed set.
*/
removeOnComplete?: boolean | number | KeepJobs;
/**
* If true, removes the job when it fails after all attempts.
* When given a number, it specifies the maximum amount of
* jobs to keep, or you can provide an object specifying max
* age and/or count to keep. It overrides whatever setting is used in the worker.
* Default behavior is to keep the job in the failed set.
*/
removeOnFail?: boolean | number | KeepJobs;
```
removeOnFail should be a bit higher since they are the ones we are most
likely looking at when needed.
1/ When the user inputs wrong connection informations, we do not inform
him. He will only see that no tables are available.
We will display a connection failed status if an error is raised testing
the connection
2/ If the connection fails, it should still be possible to delete the
server. Today, since we try first to delete the tables, the connection
failure throws an error that will prevent server deletion. Using the
foreign tables instead of calling the distant DB.
3/ Redirect to connection show page instead of connection list after
creation
4/ Today, foreign tables are fetched without the server name. This is a
mistake because we need to know which foreign table is linked with which
server. Updating the associated query.
<img width="632" alt="Capture d’écran 2024-04-12 à 10 52 49"
src="https://github.com/twentyhq/twenty/assets/22936103/9e8406b8-75d0-494c-ac1f-5e9fa7100f5c">
---------
Co-authored-by: Thomas Trompette <[email protected]>
The authorization token has an expiry of 5 minutes, we already have
checks in place to verify this and throw a Forbidden exception. We need
to revoke the token once it's used otherwise it could be used multiple
times to gain access to tokens till it expires.
This PR changes the vite config to enable the generation of sourcemaps
with the help of an Env.
It also adds a new script to run the build with the said env as well as
more memory (the dafault 2go leads to an OOM)
Experiment using swc instead of tsc (as we did the switch on
twenty-front)
It's **much** faster (at least 5x) but has stricter requirements.
I fixed the build but there's still an error while starting the server,
opening this PR for discussion.
Checkout the branch and try `nx build:swc twenty-server`
Read: https://docs.nestjs.com/recipes/swc#common-pitfalls
close#4925
Before, for google-auth, if the user exists, we would simply returns a
login token, without checking the InvitationLink
Now, we just call the `authService.signUp` function that handle all
use-cases for us (user exists or not, invitationLink exists or not)
Added isAuditLogged column to object-metadata-entity.ts
This is my first open source pull request. Please do let me know if made
any mistake. I will be greatfull. Thank u
---------
Co-authored-by: Félix Malfait <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
This PR introduces a new folder structure for business modules.
Cron commands and jobs are now stored within the same module/folder at
the root of the business module
e.g: /modules/messaging/crons/commands instead of
/modules/messaging/commands/crons
Patterns are now inside their own cron-command files since they don't
need to be exported
Ideally cronJobs and cronCommands should have their logic within the
same class but it's a bit harder than expected due to how commanderjs
and our worker need both some class heritage check, hence the first
approach is to move them in the same folder
Also Messaging fullsync/partialsync V2 has been dropped since this is
the only used version => Breaking change for ongoing jobs and crons.
Jobs can be dropped but we will need to re-run our crons (only
cron:messaging:gmail-fetch-messages-from-cache)
In the previous PR #4912 it seems that I forgot to pass the environment
on the backend.
Here is a quick fix!
I also added some "doc" in the the .env.example
- Adjusted the height of the background image to fit every possible
screen
- Added the proper rotation degree to the background
- Refactored gradient colour stop into CONST to make sure each
background image starts at the same level
**To be noted :**
I had to use Javascript and useEffect to make the div take the entire
height of the page (turn it into a "use client" component). This was
necessary because absolute positioning by default makes the element's
sizing relative to its nearest positioned ancestor, not the entire
document.
---------
Co-authored-by: Ady Beraud <[email protected]>
- Set `readOnly` boolean in table row context. Preventing updates and
deletion
- Show page is null for remote objects. No need for complicated design
since this is temporary?
- Relation creations are now behind a feature flag for remote objects
- Refetch objects and views after syncing objects
---------
Co-authored-by: Thomas Trompette <[email protected]>
- AuthFailedAt is set when a refreshToken is not valid and an
accessToken can't be generated, meaning it will need a manual action
from the user to provide a new refresh token.
- Calendar/messaging jobs should not be executed if authFailedAt is not
null.
Fixing #4809
The form has a button with a disabled condition, unfortunately there was
an error in checking the condition.
```
disabled={
SignInUpStep.Init
? false
...
```
SignInUpStep.Init is always equal to true, so the first arm was
returning false and button was never disabled. Fixing this check fixes
the double mouse click bug as expected.
```
disabled={
signInUpStep === SignInUpStep.Init
```
Still, the enter keypress is handled a little bit differently. There is
a handleKeyDown event that was ignoring if the form is submitting or
not. I added the check for that, and now pressing enter multiple times
does not result in any errors
Add support for a new SENTRY_RELEASE and SENTRY_ENVIRONMENT env.
It is optional and allows to init sentry with a Release version and an
env (used internally at Twenty).
Docker image have been updated do intergrate the new env as an Argument
- Fix default value sent to backend, using single quotes by default
- Use default value in field definition and column definition so that
field inputs can access it
- Used currency default value in CurrencyFieldInput
---------
Co-authored-by: Charles Bochet <[email protected]>
This PR:
- separates the existing updateSyncStatus endpoint into 2 endpoints
- creates mutations and hooks that will call those endpoints
- trigger the hook on toggle
- removes form logic and add a separated component for toggling
---------
Co-authored-by: Thomas Trompette <[email protected]>
This workflow deploys a new release of Twenty.
- It bumps projects version
- Create a tag
- Push the changes
Then a tag pipeline will be automatically run triggering the deployment
of new Dockerhub images
Deployment to Twenty prod will be a manual action
We have recently discovered that we were using ID type in place of UUID
type in many place in the code.
We have merged #4895 but this introduced bugs as we forgot to replace it
everywhere
- Implemented dataloader package on metadata graphql server
- Implemented a dataloader for relation metadata module
---------
Co-authored-by: Jérémy M <[email protected]>
We have discovered that GraphQL inputs for fields of type ids in create
/ update input where using a more permissive ID type than the type used
in FilterInput in queries.
This PRs fixes it and make sure that all Input are using UUID graphql
scalar types
## Context
Calendar scope was too broad, this PR updates it to events only.
Also changing "Cannot connect Google account to demo workspace" error to
a 404 to avoid having a 500 for something expected
We've introduced in PR #4373 standard ids to be able to rename standard
fields and objects.
Fields part was working properly, but objects part was not yet
implemented.
This PR is adding the missing parts to make it work.
Foreign tables should be created using migrations, as we do for standard
tables.
Since those are not really generated from the object metadata but from
the remote table, those migrations won't live in the object metadata
service.
This PR:
- creates new types of migration : create_foreign_table and
drop_foreign_table
- triggers those migrations rather than raw queries directly
- moves the logic to fetch current foreign tables into the remote table
service since this is not directly linked to postgres data wrapper
- adds logic to unsync all tables before deleting
---------
Co-authored-by: Thomas Trompette <[email protected]>
This PR:
- creates the query to delete a connection
- creates the hook that triggers the query
- triggers the hook function when clicking on remove + get back to
connection page
---------
Co-authored-by: Thomas Trompette <[email protected]>
- Select component was adding a duplicate useListenClickOutside already
present in useDropdown for closing dropdown.
- Added debug logs for hotkeys scopes
This PR is dropping the column `targetColumnMap` of fieldMetadata
entities.
The goal of this column was to properly map field to their respecting
column in the table.
We decide to drop it and instead compute the column name on the fly when
we need it, as it's more easier to support.
Some parts of the code has been refactored to try making implementation
of composite type more easier to understand and maintain.
Fix#3760
---------
Co-authored-by: Charles Bochet <[email protected]>
Endpoint is broken since we now use `Remote` as a suffix for remote
table names.
This PR:
- creates a common function to calculate the name of the remote table
- use it in the `findAvailableRemotePostgresTables` to know if a table
has been synced or not
Co-authored-by: Thomas Trompette <[email protected]>
## Removing repetitive queries (impacting performance on page load)
We have recently introduced the capability to detect schema version
mismatch. To do that, we add a new header in all our queries. On page
load, this header is added once we know the currentUser and especially
its currentWorkspace and related schema version.
However, applying this header to apollo client will re-trigger all
queries that have been already performed (GetClientConfig and
GetCurrentUser). To avoid re-triggering them, I'm introducing two new
"isLoaded" states and skip the query if the query has already been
performed
## Fixing Relation Detail not displaying data on show page
Small bug introduced in a previous PR
In this PR:
- fix empty list placeholder positionning
- prevent user from erasing custom address field as composite types
removal is not supported yet @ijreilly FYI
- fix show page relation error
- Implement address filter
## Context
We are now removing Messaging V2 feature flag to use it everywhere.
## Implementation
- renaming FetchWorkspaceMessagesCommandsModule to
MessagingCommandModule to make it more generic since it it hosts all
commands related to the messaging module
- creating a crons folder inside commands and jobs crons should be named
with xxx.cron.command.ts instead of xxx.command.ts. Same for jobs, jobs
should be named with xxx.cron.job.ts. In a future PR we should make sure
those CronJobs implement a CronJob interface since it's a bit different
(a CronJob does not contain a payload compared to a Job)
- Cron commands have been renamed to "cron:$module:command" so
`fetch-all-workspaces-messages-from-cache:cron:start` has been renamed
to `cron:messaging:gmail-fetch-messages-from-cache`. Also having to
create a command to stop the cron is a bit painful to maintain so I
removed them for now, this can be easily done manually with pg-boss or
bull-mq
- Removing full-sync and partial-sync commands as they were there for
testing only, we might put them back at some point but we will have to
adapt the code anyway.
- Feature flag has been removed from the MessageChannel standard object
to make sure those new columns are created during the next sync-metadata
## Context
Calendar tables are behind a featureFlag, they do not exist if the
feature flag is off which means we should not use them for the same
reason. I'm adding a check on the featureFlag before calling the
repository.
```
Error executing raw query for workspace 20202020-1c25-4d02-bf25-6aeccf7ea419: relation "workspace_1wgvd1injqtife6y4rvfbu3h5.calendarEventParticipant" does not exist
```
## Test
locally with and without featureflag
**Fixed the following build issue:**
```
./src/app/contributors/api/fetch-issues-prs.tsx
12:3 Error: Type boolean trivially inferred from a boolean literal, remove type annotation. @typescript-eslint/no-inferrable-types
./src/app/contributors/api/search-issues-prs.tsx
12:3 Error: Type boolean trivially inferred from a boolean literal, remove type annotation. @typescript-eslint/no-inferrable-types
```
Co-authored-by: Ady Beraud <[email protected]>
**Fixed different issues** :
- Multiple CSS fixes: font-size, colors, margins, z-index ...
- Fixed hover on contributor avatars
- Added link to contributors in footer
- Made the year in the footer dynamic (2023 --> 2024)
- Added name of contributor in "Thank you" section of Contributor page
- Added footer in small screens
- Made Activity Log Responsive
- Fixed bug in "saving issues to DB", title was null everywhere. I
needed to implement an "upsert" behaviour to update the existing
database on init
**To be noted :**
There is the following bug on production happening on mobile when you
refresh a second time :
<img width="1440" alt="Screenshot 2024-04-05 at 01 30 58"
src="https://github.com/twentyhq/twenty/assets/102751374/b935b07a-63dc-463d-8dcb-070ad4ef6db0">
It seems to be related to the following issue on mdx :
[https://github.com/hashicorp/next-mdx-remote/issues/350](https://github.com/hashicorp/next-mdx-remote/issues/350)
I added the following code that fixed this bug for me in development
(this needs to be tested in production) :
```
const serialized = await serialize(content, {
mdxOptions: {
development: process.env.NODE_ENV === 'development',
}
})
```
---------
Co-authored-by: Ady Beraud <[email protected]>
Re-enables no-console eslint rule in stories and tests files:
- In stories, use `action` from '@storybook/addon-actions' or `fn` from
'@storybook/test' instead of console.
- In tests, console methods can be mocked like this:
`global.console.error = jest.fn()`.
In this PR, I'm fixing two things on the ViewPicker in Create mode:
- if the Dropdown has no max height, it should not be scrollable (which
is causing issue with inner dropdowns being cut by overflow: hidden
- if the user has changed the icon, the type or the name of the view,
consider the create form as isDirty and prevent its value to be
overriden by re-renders (cache updates for example)
## Context
When running a command, the process should end normally however it stays
hanging due to the open connection with redis client (when
CACHE_STORAGE_TYPE=redis)
This PR adds the necessary logic to gracefully close the connection once
the module is destroyed. Thanks to that, the command process now
properly ends once executed.
related to #4749.
Adjusted the max height for window so that it cuts the last option a
little.
I wanted to test the menu from the second pic in the issue with the
multi select option but could not figure out where it was in the
application.
---------
Co-authored-by: Lucas Bordeau <[email protected]>
updatedAt and deletedAt field changed to string like createdAt field. On
file upload updatedAt field will be given date same as createdAt.
Co-authored-by: Lucas Bordeau <[email protected]>
Backend: Adding a new util function that throw an error if the
objectMetadata is remote
Frontend: hiding the save button when remote
Also renaming `useObjectMetadataItemForSettings` since this hook is used
in other places than settings and is not in the settings repo. Name can
definitely be challenged!
---------
Co-authored-by: Thomas Trompette <[email protected]>
Split from https://github.com/twentyhq/twenty/pull/4518
- Setup `@ui/*` as an internal alias to reference `twenty-ui/src`.
- Configures twenty-front to understand the `@ui/*` alias on development
mode, so twenty-ui can be hot reloaded.
- When building on production mode, twenty-front needs twenty-ui to be
built beforehand (which is automatic with the `dependsOn` option).
- Configures twenty-front to understand the `@ui/*` alias when launching
tests, so there is no need to re-build twenty-ui for tests.
---------
Co-authored-by: Lucas Bordeau <[email protected]>
Several fixes for remote objects:
- labels are now displayed in title case. Added an util for this.
- Ids are often integers but the foreign keys on the relations were
uuid. Sending the id type to the object metadata service so it can
creates the foreign key accordingly
- Graphql comments are override when several remote objects are
imported. Building a function that fetch the existing comment and update
it
---------
Co-authored-by: Thomas Trompette <[email protected]>
We used to not type properly the return of getRecordFromCache before the
work from last week.
The getViewFromCache function was patching this temporarily in a "dirty"
way.
Now that this is cleaner, I'm removing the typescript patch. This fixing
several behaviors on viewBar
Split from https://github.com/twentyhq/twenty/pull/4518
Related to #4766
Mutualizes eslint config between projects.
I didn't include `twenty-server` in this PR as this was causing too many
lint errors.
As recommended on the repo of the action we were using
https://github.com/styfle/cancel-workflow-action, we should use
`concurrency.group` rather than a dedicated action.
Here is a PR to use it on all our workflows
We've seen a few cascading errors (e.g. comment.activityId would be non
nullable but cascade behavior is set to "set null"). I think it's safer
if we have to explicitly chose the deletion behavior it every time.
Especially since Postgres default to "No action" while we defaulted to
"Set Null", which is confusing.
In the future we will most likely introduce a second param
`onSoftDelete` in the decorator
**Context**
cf. feature request
[#4597](https://github.com/twentyhq/twenty/issues/4597)
Enables deletion of custom fields that aren't active nor of type
relation
Also
1. renamed a misnamed file
2. deleted redundant hook BeforeDeleteOneField as it seemed best to move
the logic to the resolver instead
**How was it tested?**
Did not write unit tests as code is to be migrated (discussed with
@Weiko).
Locally tested.
---------
Co-authored-by: Marie Stoppa <[email protected]>
Closes#4556
- Renames some pages and components after discussion about terminology
with @thomtrp.
- Creates the Settings/Integrations/Database/Connection page.
Having 2 different dev setups caused confusion, let's remove the Docker
local setup and recommend people install yarn locally.
Also simplified some docs by merging pages together, the recommend
self-hosting option is now the docker-compose / to adapt the
docker-compose.
Foreign table id cannot be a foreign key of a base table. But the
current code use foreign keys to link object metadata with activities,
events... So we will:
- create a column without creating a foreign key
- add a comment on the table schema so pg_graphql sees it as a foreign
key
This PR:
- refactor a bit object metadata service so the mutation creation is
separated into an util
- adds the mutation creation for remote object relations
- add a new type of mutation to create a comment
---------
Co-authored-by: Thomas Trompette <[email protected]>
## Context
SyncExternalId should be renamed because this won't always represent an
id. For example, microsoft API does not use ids but dates for their
sync. Also we think external is a bit redundant so we are removing it.
Note: this field is not used by the front-end (and will probably never
be)
Fix: (#4204)
The issue was that when that panel was opened its content would wrap
instead of maintaining its desired structure. I fixed this bug by adding
a minimum width to the panel's contents so that they would stay
correctly formatted throughout the opening transition.
---------
Co-authored-by: Félix Malfait <[email protected]>
We were missing `JsDom` dependencies in the package.json generated by nx
while running `twenty-server`: `yarn nx build:packageJson`
Detailed explanation:
- we are currently using nx paradigm which is to put dependencies of all
projets at root, which enables global package migrations for the whole
monorepo
- for production containers, we only want specific project dependency to
be added. This is done by running `yarn nx build:packageJson` on
`twenty-server`. Nx is statically analyzing twenty-server dependencies
and generating a tailored package.json that production containers can
later use.
- However, `nx` static analysis is not flawless and is missing some
packages. We are going to stop using it as the value is not there yet
but the burden for developers is high. The guideline is to put back
project dependencies into specific package `package.json`
- Therefore, I'm adding `jsdom` to twenty-server `package.json`
- If sync fails we set authFailedAt
- This information is displayed in the frontend in accounts with a `Sync
Failed` pill
- The user can reconnect his account in the dropdown menu
- A new OAuth flow is triggered
- The account is synced
## Context
A new ADDRESS field type has been introduced and the company object has
been updated to use this new type however this introduced a few
regressions.
The good strategy would be to introduce a new field and rename the old
one.
This PR revert that change to fix the issue.
The tests were broken. It turns out that it is not easy to mock two
apolloClients as apollo only provides "MockedProvider" component to mock
apollo in tests.
MockedProvider Api does not allow us to mock on client level.
For now, I'm defaulting to the base ApolloClient in test mode to avoid
the issue
Split from https://github.com/twentyhq/twenty/pull/4518
- Upgrades dependencies and applies automatic config migrations with the
command: `npx nx migrate nx` (see
https://nx.dev/nx-api/nx/documents/migrate)
- Fixes lint errors after upgrading `@typescript-eslint`
Note: it was not possible (for now) to migrate Nx to the latest stable
version (v18.2.1) because it upgrades Typescript to v5.4.3, which seems
to cause a bug on install when Yarn tries to apply its native patches.
Might be a bug on the Yarn side.
When writing to the normalized cache (record), it's crucial to use _refs
for relationships to avoid many problems. Essentially, we only deal with
level 0 and generate all fields to be comfortable with their defaults.
When writing in queries (which should be very rare, the only cases are
prefetch and the case of activities due to the nested query; I've
reduced this to a single file for activities
usePrepareFindManyActivitiesQuery 🙂), it's important to use queryFields
to avoid bugs. I've implemented them on the side of query generation and
record generation.
When doing an updateOne / createOne, etc., it's necessary to distinguish
between optimistic writing (which we actually want to do with _refs) and
the server response without refs. This allows for a clean write in the
optimistic cache without worrying about nesting (as the first point).
To simplify the whole activities part, write to the normalized cache
first. Then, base queries on it in an idempotent manner. This way,
there's no need to worry about the current page or action. The
normalized cache is up-to-date, so I update the queries. Same idea as
for optimisticEffects, actually.
Finally, I've triggered optimisticEffects rather than the manual update
of many queries.
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* default value boolean fixed
* fixed creation, fixed updating a value to false
* fixed default value for default value if boolean
* fixed tests
---------
Co-authored-by: Félix Malfait <[email protected]>
* feat: implement confirmation prompt
* feat: remove prop drilling and introduce recoil state
* chore: fix eslint issues
* feat: set record text according to length of records
* chore: fix eslint issues
* refactor: made changes according to code review
* fix: show delete according to singular and plural records.
* fix: eslint issues
* feat: show number of selected records
* style: fix positioning of actionbar
* feat: display ConfirmationModal seperately
* chore: remove recoil state and use usestate instead
* chore: minor change
---------
Co-authored-by: Félix Malfait <[email protected]>
* adding back new navbar structure
* adding back new home
* adding back objects
* adding back 4 pages
* adding back some pages
* added 3 videos for api, webhook and tasks
* feat: add more dependencies check, randomize postgres admin password, tail logs of server container
* feat: improve retro compatibility
* feat: comment POSTGRES_ADMIN_PASSWORD as it will be generated by the one liner
* fixes
* saving workspaceMemberId and personId when saving attendees
* add typing
* use Map
* improve saveMessageParticipants
* fix role type
* move logic in a service
* create new service
* use new service in calendar-event-attendee.service
* modify service to include more common logic
* add defaumt value to isOrganizer in calendar-event-attendee.object-metadata
* rename folder
* renaming
* feat: add one liner
* fix: interactive issue & add support for both linux & mac
* feat: move quick start documentation
* feat: catch errors
* feat: check if directory exists
* feat: default to yes for prompt
* feat: open in browser
* fix: format
* feat: do not expose STORAGE_LOCAL_PATH env but handle the case where it would be set
* fix: db reset command wasn't working out of the box
* Update install.sh
Co-authored-by: Darek Desu <[email protected]>
* feat: harden the whole UX with one-liner
* fix: small logical order adjustment
* Update packages/twenty-docs/docs/start/self-hosting/docker-compose.mdx
---------
Co-authored-by: Darek Desu <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
* update calendarEvent labels and description to match Figma
* modify conferenceUri to conferenceLink with LINK type
* update format-google-calendar-event.util to match new conferenceLink
* update CalendarEventDetails since overriding the fields is no longer needed
* fix mock metadata
* generate new uuid for field conferenceLink
* feat: wip refactor default-value
* feat: health check to migrate default value
* fix: tests
* fix: refactor defaultValue to make it more clean
* fix: unit tests
* fix: front-end default value
* fix: sever not throwing when enum contains two identical values
* fix: enum column name cannot be change
* fix: put field create/update inside transactions
* fix: check for options duplicate values front-end
* fix: missing commit transaction
* add twenty icon
* rest api calls for company
* check if company exists
* refacto
* person/company saved call
* gql codegen init
* type defs
* build fix
* DB calls with gql codegen and apollo integration
* Build remote server
* Add getters
* Migrate to json inputs
* Use extendable type
* Use regex validation
* Remove acronymes
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Replace Terms & Conditions with Sign Up Link on Sign In #4502
* terms replaced with signup link
* begin fix (incomplete / do not merge)
* Revert
* Introduce welcome page
* Update Twenty website
---------
Co-authored-by: Mamatha Yarramaneni <[email protected]>
Co-authored-by: Félix Malfait <[email protected]>
* add lodash differenceWith
* add awaits
* update sync cursor is working
* add logs
* use isSyncEnabled information to enqueue jobs
* add decorator InjectObjectMetadataRepository
* fix gmail-full-sync
* Being implementing events on the frontend
* Rename JSON to RAW JSON
* Fix handling of json field on frontend
* Log user id
* Add frontend tests
* Update packages/twenty-server/src/engine/api/graphql/workspace-query-runner/jobs/save-event-to-db.job.ts
Co-authored-by: Weiko <[email protected]>
* Move db calls to a dedicated repository
* Add server-side tests
---------
Co-authored-by: Weiko <[email protected]>
* feat: merge front and server dockerfiles and optimize build
* fix: update image label
* fix: bring back support for REACT_APP_SERVER_BASE_URL injection at runtime
* fix: remove old entries & add nx cache in dockerignore
* feat: generate frontend config at runtime using Nest
* fix: format and filename
* feat: use the EnvironmentService and leave default blank
* feat: add support for DB migrations
* update example docker-compose to bitnami postgres path
* leave a note that Postgres needs configuration
* Revert example docker-compose
* Edit text
---------
Co-authored-by: Félix Malfait <[email protected]>
* Add getter factory for attachements
* Override guard in test
* Add secret in env variables
* Return custom message on expiration
* Rename to signPayload
---------
Co-authored-by: Thomas Trompette <[email protected]>
* rename database services to repository
* refactor more repositories
* more refactoring
* followup
* remove unused imports
* fix
* fix
* Fix calendar listener being called when flag is off
* remove folders
* Update backdrop-filter in OverlayBackground.ts
* Fix backdrop-filter in OverlayBackground.ts
* Update opacity of menu item, to be constantly 0
* Fixes
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* fix: state consistency issue while closing the email thread right drawer (#4205)
* Refactored to use useRecoilCallback in RightDrawer open/close hook
* - registered an email drawer click outside callback to memorize the thread id when drawer was closed
- added a state to memorize then event that triggered right drawer close
- added a predicate that checks if event that close email thread right drawer is not the same that the open email thread click event AND that the thread that we want to open is not the thread that is just being closed.
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Added info about reverse-proxy and SERVER_URL to docs
* Fixed comments
* Fix lint
---------
Co-authored-by: Maciej Siwek <[email protected]>
Co-authored-by: Lucas Bordeau <[email protected]>
* feat: add tags in multi select picker
* feat: display MenuItemLeftContent if no color passed
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* calendar module
* wip
* creating a folder for common files between calendar and messages
* wip
* wip
* wip
* wip
* update calendar search filter
* wip
* working on full sync service
* reorganizing folders
* adding repositories
* fix typo
* working on full-sync service
* Add calendarQueue to MessageQueue enum and update dependencies
* start transaction
* wip
* add save and update functions for event
* wip
* save events
* improving step by step
* add calendar scope
* fix nest modules imports
* renaming
* create calendar channel
* create job for google calendar full-sync
* call GoogleCalendarFullSyncJob after connected account creation
* ask for scope conditionnally
* fixes
* create channels conditionnally
* fix
* fixes
* fix FK bug
* filter out canceled events
* create save and update functions for calendarEventAttendee repository
* saving messageParticipants is working
* save calendarEventAttendees is working
* add calendarEvent cleaner
* calendar event cleaner is working
* working on updating attendees
* wip
* reintroducing google-gmail endpoint to ensure smooth deploy
* modify callbackURL
* modify front url
* changes to be able to merge
* put back feature flag
* fixes after PR comments
* add feature flag check
* remove unused modules
* separate delete connected account associated job data in two jobs
* fix error
* rename calendar_v3 as calendarV3
* Update packages/twenty-server/src/workspace/calendar-and-messaging/utils/valueStringForBatchRawQuery.util.ts
Co-authored-by: Jérémy M <[email protected]>
* improve readability
* renaming to remove plural
* renaming to remove plural
* don't throw if no connected account is found
* use calendar queue
* modify usage of HttpService in fetch-by-batch
* modify valuesStringForBatchRawQuery to improve api and return flattened values
* fix auth module feature flag import
* fix getFlattenedValuesAndValuesStringForBatchRawQuery
---------
Co-authored-by: Jérémy M <[email protected]>
* feat: create a separate package for twenty-ui, extract the pill component with hard-coded theme values into it, and use the component inside twenty-front to complete the setup
* feat: extract the light and the dark theme into twenty-ui and update the AppThemeProvider component inside twenty-front to consume themes from twenty-ui
* fix: create a decorator inside preview.tsx to provide a default theme to storybook development server
* fix: remove redundant type declarations and revert back the naming convention for theme declarations
* fix: introduce a default value for pill label within the story for development server
* fix: introduce the nx script into package.json for twenty-ui and resolve imports for theme type within the package
* fix: remove the pill component from the twenty-front package along with the story for it
* fix: revert the package versions to those before running the nx cli command for storybook init
* feat: update readme to include details for building the ui library and starting the storybook development server
* fix: include details about twenty-ui inside jest.config for twenty-front to complete front-jest job
* - Added preview head for font
- Added theme addon for light/dark switch
- Added ComponentDecorator
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* fix serverurl in openapi docs for self hosted instance
* fixed server url slash, moved calculation to enviroment function, fixed openapi path hardcoded api.twenty.com
* Define quantity at checkout
* Remove billing submenu when not isBillingEnabled
* Remove feature flag
* Log warning when missing subscription active workspace add or remove member
* Display subscribe cta for free usage of twenty
* Authorize all settings when subscription canceled or unpaid
* Display subscribe cta for workspace with canceled subscription
* Replace OneToOne by OneToMany
* Add a currentBillingSubscriptionField
* Handle multiple subscriptions by workspace
* Fix redirection
* Fix test
* Fix billingState
* feat: add calendar event attendees avatar group
Closes#4290
* fix: take CalendarEventAttendee data model into account
* feat: add Color code section to Calendar Settings (#4420)
Closes#4293
* Fix lint
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* feat: add next event indicator to Show Page Calendar tab
Closes#4289
* feat: improve calendar animation
* refactor: add some utils and fix sorting edge case with full day
* refactor: rename CalendarCurrentEventIndicator to CalendarCurrentEventCursor
* fix: fix tests
* Fix lint
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Build arg setter for position
* Build separated query factory + rename existing
* Sort record by position in front
* Add tests
* Set first for type board
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Update Release.tsx
* Update StyledTitle.tsx
Changed Release color font to primary (#141414)
* Update StyledTitle.tsx
Spacing around the title for mobile , header font change for tablet
* Update Release.tsx
changed the date font -weight
removed the redundant paragraph color
added media design changes of spacing1, spacing2, paragrap gap
* Update StyledTitle.tsx
subhead releases font color
* Update Release.tsx
media alignment, release font change,
* Update Release.tsx
* Quick fix
* Unrelated change (sentry)
---------
Co-authored-by: Félix Malfait <[email protected]>
* feat: add event rows to Show Page Calendar tab
Closes#4287
* refactor: use time as events group key instead of ISO string for easier sorting
* feat: implement data model changes
* refactor: improve sorting
* add use device types
* add header file
* remove use device type
* add tablet view styles
* remove eslint comment
* create shared folder and add header.ts file for all styled elements which used in app header
* refactor header files structure
* Hide linklist on mobile
---------
Co-authored-by: Félix Malfait <[email protected]>
* Update .env.example
this .env file will now work with the docker-compose example provided.
* Update .env.example
* Update doc and reset env example
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Fix Internal Server Error when removing profile picture (#4257)
This commit addresses the issue where attempting to remove a profile picture resulted in an Internal Server Error.
The fix involves:
* Adding isNullable property to workspace-member avatar;
* Implementing exception handling to handle errors during avatar removal.
* Update packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/workspace-member.object-metadata.ts
---------
Co-authored-by: Charles Bochet <[email protected]>
* create blocklist service
* blocklist is working on email import in full sync
* add log
* add blocklist to partial sync
* define rule for blocklist imports
* gmail filter is working
* correct typo
* fix bugs
* getCompanyNameFromDomainName
* renaming
* remove unused service
* add transaction
* Add SettingsAccountsEmailsBlocklistInput story
* Add SettingsAccountsEmailsBlocklistSection story
* Add SettingsAccountsEmailsBlocklistTable story
* Add SettingsAccountsEmailsBlocklistTableRow story
* wip
* add play
* add play
* add delete from blocklist test
* wip
* wip
* done
* fix: replace twenty logo in the png format with one in the svg format for better resolution
* fix: toggle the custom url switch to true if the local storage contains a server base url different from that of the env variable
* fix: update the front base url and the server base url to those of the production environment in the .env.example file
* fix: update README to add a step for changing env variables to those of the development environment for contributors or local testers
* feat: currency type in optimisitc cache update
* Add test for optimisitc currency cache
* Refactor error message for currency filter to be more accurate
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* fix: set a specifc date to date field input on the story and set the state on record store family selector
* test: add an interaction test to verify the specific date
* feat: configure eslint rules by replicating those in the twenty-front package and introduce scripts for linting, formatting code and removing build output
* fix: ensure each file of the extension package satisfies linting rules and disable some rules where necessary
* fix: update relative imports to absolute imports throughout extension code with the defined tilde and at symbols
* fix: import the updated ui module from the front package to the chrome extension package to prevent eslint rules from breaking subject to the recent merged changes into main
* fix: commit the case change for files that were missed by Git in the earlier commits due to default configuration
* feat: find duplicate objects backend init
* refactor: move duplicate criteria to constants
* fix: correct constant usage after type change
* feat: skip query generation in case its not necessary
* feat: filter out existing duplicate
* feat: FE queries and hooks
* feat: show duplicates on FE
* refactor: should-skip-query moved to workspace utils
* refactor: naming improvements
* refactor: current record typings/parsing improvements
* refactor: throw error if existing record not found
* fix: domain -> domainName duplicate criteria
* refactor: fieldNames -> columnNames
* docs: add explanation to duplicate criteria collection
* feat: add person linkedinLinkUrl as duplicate criteria
* feat: throw early when bot id and data are empty
* refactor: trying to improve readability of filter criteria query
* refactor: naming improvements
* refactor: remove shouldSkipQuery
* feat: resolve empty array in case of empty filter
* feat: hide whole section in case of no duplicates
* feat: FE display list the same way as relations
* test: basic unit test coverage
* Refactor Record detail section front
* Use Create as input argument of findDuplicates
* Improve coverage
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* fix: forbid creation of objects or fields with certain characters or with forbidden keywords that clashes with pg_graphql
* refactor: add a decorator for name validation and use it on fields
* Migrate command to cron
* Put back command using job as well
* Build service and module + move into folder
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Refactor task count
* Fixed show page rerender
* Less rerenders and way better title and body UX
* Finished breaking down activity editor subscriptions
* Removed console.log
* Last console.log
* Fixed bugs and cleaned
* improve timeline messaging to allow users to view the threads to which they participated
* working
* improvement
* improvements
* improvements
* fix
* remove unnecessary type
* Add SettingsAccountsEmailsBlocklistInput story
* prevent contact creation from the same company
* add todo
* improvements
* Delete packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsEmailsBlocklistInput.stories.tsx
* refactor
* modify after review
* improve code
* create utils
* fix
* Fix getAllByWorkspaceId to throw NotFoundException when no workspace member found
* fix after merge
* use map
* modify after review
* Fix delete with no result should not throw
* add logs
* Delete packages/twenty-server/src/database/typeorm/metadata/migrations/1708442904165-addOnDeleteActionToRelationMetadata.ts
* parse metadata path
* metadata rest api
* add queryAction condition and return object singular/plural
* handle GET endpoint for metadata
* FindOne and FindMany query for metadata endpoint
* Request all objects and nest fields in object request
---------
Co-authored-by: martmull <[email protected]>
* Added functionality for onKeyDown for new webhook and new API key, to save when the user presses the [Enter] key
* Update SettingsDevelopersApiKeysNew.tsx
Fix for linter
* Update SettingsDevelopersWebhooksNew.tsx
Fix for linter
* Update SettingsDevelopersApiKeysNew.tsx
Got rid of extra space in if statement
* Update SettingsDevelopersWebhooksNew.tsx
Got rid of extra space for if statement
* Update SettingsDevelopersApiKeysNew.tsx
prettier
* Update SettingsDevelopersWebhooksNew.tsx
prettier
* Fix linter
---------
Co-authored-by: Félix Malfait <[email protected]>
* Add SettingsAccountsEmailsBlocklistInput story
* prevent contact creation from the same company
* add todo
* improvements
* Delete packages/twenty-front/src/modules/settings/accounts/components/__stories__/SettingsAccountsEmailsBlocklistInput.stories.tsx
* refactor
* modify after review
* improve code
* fix: memory issue with truncate command
* fix: LINK doesn't have any default value
* fix: Cannot convert LINK to column type.
* fix: handle old column type and add a warn to fix them manually
* Add computed field to workspace entity
* Add activationStatus to front requests
* Update Selector
* Use activation status
* Stop using selector for mock values
* Remove isCurrentWorkspaceActiveSelector
* Use activation status
* Fix typo
* Use activation status
* Create hook for sign in up navigate
* Update hook to handle profile creation
* Use varaible
* Use more readable boolean function
* Uploading some new visuals
* Delete packages/twenty-docs/static/img/preview-light.png
* Rename Github cover light.png to preview-light.png
* replace index light file test
* Uploaded illustration updated versions
* Adding data model illustrations
* Updated font case for data model illustrations
* Rename Emails-dark.png to emails-dark.png
* Rename Emails-light.png to emails-light.png
* Rename Index-dark.png to index-dark.png
* Rename Index-light.png to index-light.png
* Rename Kanban-dark.png to kanban-dark.png
* Rename Kanban-light.png to kanban-light.png
* Rename Keyboard-dark.png to keyboard-dark.png
* Rename Notes-dark.png to notes-dark.png
* Rename Notes-light.png to notes-light.png
* Rename Tasks-dark.png to tasks-dark.png
* Rename Tasks-light.png to tasks-light.png
* Rename Keyboard-light.png to keyboard-light.png
* Added some API settings illus - final update
* wip
* wip
* move blocklist to connectedAccount
* wip
* format date
* fix styling
* renaming
* fix imports
* fix imports
* Rename BlockListItem.ts to BlocklistItem.ts
* Add IS_BLOCKLIST_ENABLED feature flag and remove IS_MESSAGING_ENABLED gate at model creation
* hide blocklist if feature flag is disabled
* on click focus on activity body editor
* acitivity editor hot key scope added
* classname prop added escape hot key scope call back added
* passing containerClassName prop for activity editor
* hot key scope added
* console log cleanup
* activity target escape hot key listener added
* tasks filter hot key scope refactor
* scope renaming refactor
* imports order linting refactor
* imports order linting refactor
* acitivity editor field focus state and body editor text listener added
* logic refactor removed state for activity editor fields focus
* removed conflicting click handler of inline cell creating new scope
* linting and formatting
* acitivity editor field focus state and body editor text listener added
* adding text at the end of line
* fix duplicate imports
* styling: gap fix activity editor
* format fix
* Added comments
* Fixes
* Remove useListenClickOutside, state, onFocus and onBlur
* Keep simplifying
* Complete review
* Fix lint
---------
Co-authored-by: Lucas Bordeau <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Add CreateContactService to messaging services
* Add logic to create a contact if it doesn't exist
* Add name
* Improvements
* contact creation working
* fix bug
* Add IsPersonEmailService to check if an email is personal or not
* filter is working
* improve filter
* create companies and people
* Refactor createContactFromHandleAndDisplayName to createContactAndCompanyFromHandleAndDisplayName
* improve regex
* reorganizing services
* updates
* reorganize folders
* wip
* use transaction
* wip
* wip
* wip
* batch queries
* almost working
* working
* build: create a new vite project for chrome extension
* feat: configure theme per the frontend codebase for chrome extension
* feat: inject the add to twenty button into linkedin profile page
* feat: create the api key form ui and render it on the options page
* feat: inject the add to twenty button into linkedin company page
* feat: scrape required data from both the user profile and the company profile
* refactor: move modules into options because it is the only page using react for now
* fix: show add to twenty button without having to reload the single page application
* fix: extract domain of the business website instead of scrapping the industry type
* feat: store api key to local storage and open options page when trying to store data without setting a key
* feat: send data to the backend upon click and store it to the database
* fix: open options page upon clicking the extension icon
* fix: update terminology from user to person to match the codebase convention
* fix: adopt chrome extension to monorepo approach using nx and get the development server working
* fix: update vite config for build command to work per the requirement
* feat: add instructions in the readme file to install the extension for local testing
* fix: move server base url to a dotenv file and replace the hard-coded url
* feat: permit user to configure a custom route for the server from the options page
* fix: fetch api key and route from local storage and display on options page to inform users of their choices
* fix: move front base url to dotenv and replace the hard-coded url
* fix: remove the trailing slash from person and company linkedin username
* fix: improve code commenting to explain implementation somewhat better
* ci: introduce a workflow to build chrome extension to ensure it can be published
* fix: format files to display code in a consistent manner per the prettier configuration in codebase
* fix: improve the commenting significantly to explain important and hard-to-understand parts of the code
* fix: remove unused permissions from the manifest file for publishing to the chrome web store
* Add nx
* Fix vale
---------
Co-authored-by: Charles Bochet <[email protected]>
* create service
* wip
* use raw queries
* creating companies is working
* Fix participant handle domain name extraction
* Add HTTP service to fetch company info from domain name
* Handle 404
* Fix missing parameter in INSERT query
* wip
* renaming
* Add typing
* feat: display record identifier field as first column in table
& forbid hiding and moving record identifier column
Closes#3303
* refactor: add availableTableColumnKeysSelectorScopeMap
* feat: show plus icon button for label identifier column and dropdown menu for other columns
* fix: use label identifier field value in RecordShowPage title
* refactor: remove availableColumnKeys selector
* refactor: review - compute label identifier logic in mapViewFieldsToColumnDefinitions + remove selectors
* fix: several fixes
* fix: fix board fields isVisible
* fix: fix board fields reordering
* fix: more board fields fixes
* fix: fix hiddenTableColumnsSelectorScopeMap
* create and use component
* visibility working
* Fix click behavior for email thread previews
* Add dynamic styling to EmailThreadPreview component
* refactor to respect the convention
* Store compact view status
* Rename to isCompact
* Fixes
---------
Co-authored-by: Thomas Trompette <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Add rate limiting in the server using built in Nest.js capability
* Generatekey based on ip address when an http request is sent
* Update env var types to number for ttl and limit
* Remove unused env variables
* Use getRequest utility function
* fix: remove dist from path
* fix: adding .env variables
* fix: remove unused functions
* feat: throttler plugin
* Fix according to review
---------
Co-authored-by: Jérémy Magrin <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Added sanitize funtion to sanitize the link input of the companies record
* Enabled Eslint
* FIXED: Sanitize www. and query params
Added logic to sanitize both www and query params in the link input.
* fix: fix useSpreadsheetPersonImport tests
* Refactored sanitizeLink function at packages/twenty-front/src/modules/object-record/utils/sanitizeLinkRecordInput.ts
Co-authored-by: Thaïs <[email protected]>
---------
Co-authored-by: Thaïs <[email protected]>
* Rename recordPosition into position
* Fix according to review
---------
Co-authored-by: Thomas Trompette <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Refactored PageTitle to remove a dependency to location from App component
* Refactored DefaultHomePage and DefaultPageTitle to remove dependencies from App component.
* Create record field on non syst standard objects + on custom objects
* Create workspace migration
* Fix naming and add seed
---------
Co-authored-by: Thomas Trompette <[email protected]>
* feat: wip add user to sentry
* feat: wip interceptor
* feat: wip add user to sentry
* feat: add user into sentry errors
* fix: hide stack trace in production
* fix: properly log commands and handle exceptions
* fix: filter command exceptions
* feat: handle jobs errors
* chore: create security.txt
Adding a security.txt file enables security researchers to quickly and easily see where they can submit security issues and know that they are being taken serious. From the proposal website:
> When security risks in web services are discovered by independent security researchers who understand the severity of the risk, they often lack the channels to disclose them properly. As a result, security issues may be left unreported. security.txt defines a standard to help organizations define the process for security researchers to disclose security vulnerabilities securely.
See also https://securitytxt.org
* homer merge with hedge
* re-add contact email
* move file to public website
* add type
* query total number of threads
* graphql data generate
* wip
* wip
* Fix fetch more
* fix
---------
Co-authored-by: Thomas Trompette <[email protected]>
- Created addRecordInCache to inject a record in Apollo cache and inject single read query on this record
- Created createOneRecordInCache and createManyRecordsInCache that uses this addRecordInCache
- Created useOpenCreateActivityDrawerV2 hook to create an activity in cache and inject it into all other relevant requests in the app before opening activity drawer
- Refactored DEFAULT_SEARCH_REQUEST_LIMIT constant and hardcoded arbitrary request limits
- Added Apollo dev logs to see errors in the console when manipulating cache
* Use recoil state for page info
* Remove memoization
* Remove right drawer fetch more loader
---------
Co-authored-by: Thomas Trompette <[email protected]>
* refactor: apply relation optimistic effects on record update
Related to #3509
* refactor: remove need to pass relation id field to create and update mutations
* fix: fix tests
* fix: fix SingleEntitySelect glitch
* fix: fix usePersistField tests
* fix: fix wrong import after rebase
* fix: fix several tests
* fix: fix test types
* Add record chip for sender and add receivers
* Build enum for roles
* Rename var and use string literal
---------
Co-authored-by: Thomas Trompette <[email protected]>
* wip
* wip
* add pagination
* wip
* wip
* wip
* update resolver
* wip
* wip
* endpoint is working but there is still work to do
* merge main
* wip
* subject is now first subject
* number of messages is working
* improving query
* fix bug
* fix bug
* added parameter
* pagination introduced a bug
* pagination is working
* fix type
* improve typing
* improve typing
* fix bug
* add displayName
* display displayName in the frontend
* move entities
* fix
* generate metadata
* add avatarUrl
* modify after comments on PR
* updates
* remove email mocks
* remove console log
* move files
* remove mock
* use constant
* use constant
* use fragments
* remove console.log
* generate
* changes made
* update DTO
* generate
* Fetch messages with hard coded thread id
* Fix test
* Use first workspace member or person names
---------
Co-authored-by: Thomas Trompette <[email protected]>
We are working on a Twenty template for Easypanel.io. We need Twenty to allow underscores in order to be compatible with the generated Postgres database service Easypanel creates.
* Adding message thread component
* Add state and mocks
* Rename components and use local state for messages
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Fixed Max lenght in Label , #3515
* should be 200 if label is displayed, 272 if label is not displayed #3558
* Update packages/twenty-front/src/modules/object-record/components/RecordShowPage.tsx
Fix accoding to review
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* Step 3: Set up PostgreSQL Database
* Tooltip on Icons
* Cleaning icon tooltip code
* Fix according to review
---------
Co-authored-by: Charles Bochet <[email protected]>
* fixed overflowing text for select on card #3494
* maxWidth of useRelationFeild hook
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* perf: apply record optimistic effects with cache.modify on mutation
Closes#3509
* refactor: return early when created records do not match filter
* fix: fix id generation on record creation
* fix: comment filtering behavior on record creation
* Fixed typing error
* refactor: review - use ??
* refactor: review - add variables in readFieldValueToSort
* docs: review - add comments for variables.first in triggerUpdateRecordOptimisticEffect
* refactor: review - add intermediary variable for 'not' filter in useMultiObjectSearchMatchesSearchFilterAndToSelectQuery
* refactor: review - add filter utils
* fix: fix tests
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Trigger message thread top bar
* Rename message thread to thread
* Move all components in a directory
---------
Co-authored-by: Thomas Trompette <[email protected]>
* WIP
* Poc
* Use cached root query + remove proloaded views state
* Fix storybook test + fix codegen
* Return default schema if token is absent, unauthenticated if token is invalid
* Use enum instead of bool
---------
Co-authored-by: Thomas Trompette <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* #3472 replace text input by texterarea
* background color change in dark mode
* box shadow and hide overflow
* added tooltip in overflow text
* resolved comment on #3473
* resolved comments in #3473
* feat: display label identifier table cell as chip with link to RecordShowPage
Closes#3502
* Fix test
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: set field as custom object label identifier in Object Detail
Closes#3302
* feat: prevent disabling Object label identitifer field in back-end
* refactor: review - extract isLabelIdentifier variable
* fix: fix Relation field optimistic effect on Record update
Related to #3099
* Fix lint
* Fix
* fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: display identifier field in Object Detail page for custom objects
Closes#3301
* fix: show Name as object label identifier by default
* Minor improvements
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* feat: add link to relation filtered table in Record Show Page
Closes#3125
* refactor: use generateFindManyRecordsQuery for optimization
* Fixes from review
* Minor fixes
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Use new ObjectRecordConnection
* Use new records without connection in GraphQLView
* Added playwright for storybook tests
* Fixed lint
* Fixed test and tsc
* Fixed storybook tests
* wip tests
* Added useMapConnectionToRecords unit test
---------
Co-authored-by: Charles Bochet <[email protected]>
* Migrate record table to scope map
* Update record scope id to record id
* Remove todos and fix edit mode
* Fix perf
* Fix tests
* Fix tests
---------
Co-authored-by: Thomas Trompette <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* feat: wip workspace health
* feat: split structure and metadata check
* feat: check default value structure health
* feat: check targetColumnMap structure health
* fix: composite types doesn't have default value properly defined
* feat: check default value structure health
* feat: check options structure health
* fix: verbose option not working properly
* fix: word issue
* fix: tests
* fix: remove console.log
* fix: TRUE and FALSE instead of YES and NO
* fix: fieldMetadataType instead of type
* convert quick action into a dropdown
* GH-3183 import icons
* GH-3183 display dummy sub-actions in dropdown
* Migrate to new Dropdown API
---------
Co-authored-by: Charles Bochet <[email protected]>
* Fixed#3166
* refactor: improve generateEmptyFieldValue function
- Optimize handling of MultiSelect and Select cases
- Provide a default value for Select based on FieldSelectValue
- Enhance code readability and maintainability
* Fixed#3166
- Introduce MultiSelect-specific logic with a backend support check
- Implement Select-specific logic with a default value
- Throw an error for unhandled FieldMetadataType
---------
Co-authored-by: Lucas Bordeau <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* feat(signup): allow to block signup
* feat(signup): update environment variable documentation
* test: update auth service tests
* feat(signup): prevent user from reaching out the sign up page
* Fix lint
* Fixes
---------
Co-authored-by: Charles Bochet <[email protected]>
* Added sortFields function and used on active and disabled metadataFields
* Added a sortFieldMetadataItem and used parseDate instead of vanila Date
* Added tests for sortFieldMetadataItem (#3253)
* Applied sortFieldMetadataItem (#3253)
* Migrate tab list to scope map
* Return state to hook and let client subscribe to state
* Run prettier
---------
Co-authored-by: Thomas Trompette <[email protected]>
* Delete record if no company added
* EditMode on First column of new row added
* Fix
* Minor fixes
* Passed scopeId
* Changed FieldInputs to accept onChange handler
* Removed getFieldType
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* fix side nav for short viewports
* remove uneeded justify-content in leu of overflow-y addition
* undo last commit to leave justify-content in for submenus
* move overflow-y to StyledContainer
* move overflow-y to items container
* remove problematic overflow to allow scrollable nav sections
* style update
* inlcude box as a table element
* Ui
Loading more fixed
* changes
tbody added with ref
with margin and padding with theme variables
* Remove unused react fragment
---------
Co-authored-by: Charles Bochet <[email protected]>
* Added plugin-explorer in twenty-docs gql page and updated graphiql version
* Cleaned up graphql file (#3087)
* Added plugin-explorer style and modified useEffect to adapt it (#3087)
* Updated the yarn lock file (#3087)
* wip
* fetch only the messages which are not in the db
* fetch only the messages and threads which are not in the db
* fix bugs
* merge
* remove eslint-plugins-twenty
* get saved message thread ids and message ids at the same time
* change fetchAllByBatches and fetchBatch to allow messages and threads to be fetched by batches
* wip
* format threads batches
* command is working
* command is working
* fix typing
* updates
* WIP
* Finished cleaning favorites create, update, delete on record show page
* Fixed context menu favorite
* Fixed relation field bug
* Fix from review
* Review
---------
Co-authored-by: Charles Bochet <[email protected]>
* Added a clear/reset button in InternalDateInput to reset/unschedule events
* Added clearable prop to <InternalDateInput /> and fixed some design mistakes
* Removed unnecessary code that was used during debugging
* Replaced button with <MenuItem /> component
* Fixed null date in ObjectFilterDropdownDateSearchInput
* Moved clear context call from DateInput to DateFieldInput
* Removed useless props
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Issue#3150 - Esc and clickOutside will close Searchbox
* Font size, margin + 'esc' only
Font size changed to theme specific, have a handsome margin to the top right of search box for text "Esc to cancel". Passing 'esc' only to escape.
* Updated the color theme of icon in Data Model Settings table
* add the sm stroke to icon
* add the sm stroke to icon
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* GH-3106 fix activity drawer opener for selected rows hook
* GH-3106 ability to multi note/task with action bar
* GH-3106 use snapshot to get selected row IDs
* GH-3106 format code & fix linting issues
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* fix: On Sign Out > Sign In, States are not loaded properly
* draft: reset on logout
* chore: lint
* chore: lint
---------
Co-authored-by: Charles Bochet <[email protected]>
* sending mock data from the resolver
* add sql raw query to the resolver
* improve query
* fix email component css
* fix query
* css adjustments
* create hard limit for mail display
* fix display name ellipsis
* add service
* fetching email on company page is working
* graphql generate
* move queries into separate files
* add types
* renaming
* add early return
* modified according to comments
* graphql data generate
* fix bug after renaming
* fix issue with mock data
* fix: display label identifier field input in Show Page
Fixes#3003
* Cleaned a bit after comments
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* - upload image to use in blocknote editor
- fix local-storage not in gitignore
* fix lint
* fix runtime config
add tests for body parsing notes and tasks
* lint
* feat(workspace-resolver): prevent deletion of demo workspaces (#2207)
* ForbiddenException instead of Error
* Optimize user and workspace deletion checks and clarify exception messages (#2207)
- ForbiddenException messages for attempts to delete users and workspaces associated with demo accounts
* fix: empty state should not appear during table loading
* feat: add initla load tracking
* Fix lint
---------
Co-authored-by: Charles Bochet <[email protected]>
* wip
* trying to parse display names and emails
* add nodemailer mailparser
* mail parsing is working
* add personId and workspaceMemberId
* add date to messages
* Fix PR
* Run tsc on bigger machine
* Fix lint
---------
Co-authored-by: Charles Bochet <[email protected]>
* update syntax to POSIX
The function keyword is not recognize by every POSIX-compliant shell. The function keyword is a bashism, a bash extension. POSIX syntax does not use function and mandates the use of parenthesis.
This commit fixes the two issues :
./linux/provision-postgres-linux.sh: 9: function: not found
./linux/provision-postgres-linux.sh: 15: Syntax error: "}" unexpected
* update path init.sql
* update steps numbers yarn setup
There were two number 3's, everything should be correct now.
* delete useless -e
* Add Enrich to frontend
* Naive backend implementation
* Add work email check
* Rename Enrich to Quick Action
* Refactor logic to a separate service
* Refacto to separate IntelligenceService
* Small fixes
* Missing Break statement
* Address PR comments
* Create company interface
* Improve edge case handling
* Use httpService instead of Axios
* Fix server tests
* Add feature flag key for select and rating
* Use feature flag boolean to decide if select & rating are enabled
* Enable select and rating in demo & core
* 2982-feat: Clear SelectableList reset scoped state
* State fixes as suggested in pr
* State fixes as suggested in pr
---------
Co-authored-by: Lucas Bordeau <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Init rest-api page
* Add ugly form to fetch open api schema
* Clean code
* Make the form design more acceptable
* Update doc
* Use local storage
* Update design
* Add isLoading
* Fix typo
* Fix long lines
* Code review returns
* Remove staging and local url from servers
* create empty service
* getting threads is working
* insert message channel
* save threads in the db
* clean
* fetch messages
* create a service to fetch a batch of messages
* batch messages
* use httpService instead
* parse batch
* base 64 decoding working
* solve parsing bug
* saving messages is working
* bug to fix in fetchAllByBatches
* fetching all messages is working but not saving yet
* fecth 500 messages and threads is working
* remove unused package and console log
* set direction to incoming
* fix bug after merging main
* Fix CIs
* Fix docs
* Fix eslint-build
* Move file
* Move back
* Fix server ci
* Fix server ci
* Fix server ci
* Fix server ci
* Deactivate e2e tests
* Fix front
* Fix front
* Fix front
* Add twenty-zapier and twenty-utils to the yarn project
* fix
* fix
* Remove pull_request trigger
* feat: redirect to Plan Required page if subscription status is not active
Closes#2934
* feat: navigate to Plan Required in PageChangeEffect
* feat: add Twenty logo to Plan Required modal
* test: add Storybook story
* Fix lint
---------
Co-authored-by: Charles Bochet <[email protected]>
* create model
* finished model
* modidied visibility type to select
* changed back to TEXT
* handle instead of email
* handle instead of email
* handle instead of email
* modified according to comment
* migrate-connectedAccount-model
* update accountOwerId
* prevent user from connecting multiple times with the same account
* Delete .yarn/releases/yarn-1.22.21.cjs
* Delete .yarnrc
* modified according to comments
* updates
* merge squashed
- A couple of CJS modules into ESM (config mostly)
- Vite complains about node.js modules: fixed `useIsMatchingLocation.ts`
> or use rollupOptions in vite.config.ts
> ref: https://github.com/saleor/saleor-dashboard/blob/f0e4f59d97e2a8c3e22bd2af7b7ce68a361fc9a4/vite.config.js#L6
- Adjust Storybook to work with Vite: use @storybook/test
- Use SWC for jest tranformations
- Remove unused deps:
- ts-jest: replaced with @swc/jest, typecheck by `tsc`
- babel plugins
- @svgr/plugin-jsx: not used
- @testing-library/user-event: handled by @storybook/test
- @typescript-eslint/utils: was not plugged in
- tsup, esbuild-plugin-svgr: will look into that later
- Install Vite required deps, and remove craco/webpack deps
- Adjust SVG to work with Vite as components
- Fixed `Step.tsx`: I dont know if one should be swaped for the other,
but there should be no slash
- Initial formating and linting:
- removed empty object params
- sorting imports, etc..
* prettier: fix pattern
* coverage: sb coverage report isnt working
* Add missing pieces
* `yarn lint --fix`
* fix: scripts permissions
* tsc: cut errors in half
* fix: remove `react-app-env.d.ts`
* tsc: all fixed, except `react-data-grid` types issue
* eslint: ignore env-config.js
* eslint: Align ci with config
* msw: bypass testing warnings
ref: https://stackoverflow.com/questions/68024935/msw-logging-warnings-for-unhandled-supertest-requests
* rebase: and fix things
* Adjust to current `graphql-codegen` no ESM support
* Remove vite plugin and use built-in methods
* rebase: and some fixes
* quick fix + `corepack use [email protected]`
* Fix build errors
---------
Co-authored-by: Charles Bochet <[email protected]>
* create gmail strategy and controller
* gmail button connect
* wip
* trying to fix error { error: 'invalid_grant', error_description: 'Bad Request' }
* access token working
* refresh token working
* Getting the short term token from the front is working
* working
* rename token
* remove comment
* rename env var
* move file
* Fix
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* Moved pure UI object fields to ui folder
* Moved pure UI object fields to ui folder 2
* Updated graphql metadata schema and fixed typing issues
* Added a new hook to create a record identifier mapper
* Fixed merge main
* Added empty state display for when object table is empty
* Added functionality to add button for empty state
* Fixed positioning of empty state
* Renamed style containers for empty state
* Added empty state display for when object table is empty
* Added functionality to add button for empty state
* Fixed positioning of empty state
* Renamed style containers for empty state
* Addressed PR comments by using createRecord prop and numberOfTableRowsState
* fix: SELECT enum can have a color key
* fix: "findOneOrFail" of undefined
* feat: alter column migration store previous metadata informations
* fix: enum validation extra keys
* WIP
* Finished multi select filter
* Cleaned console log
* Fix naming
* Fixed naming
* Moved RelationPicker folder
* Moved EntitySelect components
* Moved story
* Moved RelationPicker non component folders
* Moved everything else
* feat: add stylistic eslint plugin
* feat: add missing line return
* feat: secure line-break style
* feat: disallow break before else
* feat: line between class members
* feat: better new line lint rule
* fix: several Navigation Bar and Drawer fixes
Fixes#2821
- Fix navigation drawer animations
- Fix navigation bar positioning
- Do not display navigation drawer collapse button on mobile
- Refactor code and rename componentst
* Fix storybook test
* fix: fix NavigationDrawerHeader elements space-between
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: seed companies and people data
* init DataSeedDemoWorkspaceCommand to handle:
- seedCoreSchema()
- seedMetadataSchema()
* feature: Seed workspace with demo data
- delete workspace
- initDemo() with prefillWorkspaceWithDemoObjects()
* added companies-demo.ts with data
* added people-demo.ts with data
* added workspaceId to seedFeatureFlags()
* delete previous CoreSchema before seedCoreSchema
* added workspaceMemberPrefillData
* getDemoWorkspaces() to get DEMO_WORKSPACES from config
* defined DemoSeedUserIds
- created core/demo/ to keep modified seedCoreSchema() there
- DemoSeedUserIds with new set of users and Ids
* generateOpportunities() to seed demo opportunities (limit = 50)
* Code review and fixes
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* 2727-fix(front): CommandMenu and KeyboardMenu invoke handled
* Fix Command Menu and bug on metadata re-render
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: improve mobile display by tab bar and other changes
* fix: remove unused declaration in mobile navigation
* fix: update desktop navbar stories title
* fix: retrieve old titles for desktop-navbar stories
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: styles, manage active tabs
* fix: update logic for tab bar menu icons
* fix: remove Settings icon for mobile
* fix: resolve comments in pl
* feat: rework mobile navigation bar
* Fix
* Fixes
---------
Co-authored-by: Thaïs Guigon <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* feat: add enum type (RATING, SELECT, MULTI_SELECT)
feat: wip enum type
feat: try to alter enum
feat: wip enum
feat: wip enum
feat: schema-builder can handle enum
fix: return default value in field metadata response
* fix: create fieldMedata with options
* fix: lint issues
* fix: rename abstract factory
* feat: drop `PHONE` and `EMAIL` fieldMetadata types
* feat: drop `VARCHAR` fieldMetadata type and rely on `TEXT`
* Revert "feat: drop `PHONE` and `EMAIL` fieldMetadata types"
This reverts commit 3857539f7d.
* 2394-feat(front): create new record on click of plus icon
* 2394-feat(front): fix of Icon Button
* 2394-fix: PR fixes
---------
Co-authored-by: Charles Bochet <[email protected]>
* Replaced Google mono logo with colourful logo
* Removed stroke and increased size of logo to 20
* Changed default size of Google Icon to 20
* added default value for size from theme
* Refactored useFindOneObjectMetadataItem and useFindManyObjectMetadataItems to rely on a recoil family selector
* Removed console.log
* Cleaned
* Removed unused hook
* Fixed seeds
* feat: add useCreateOneRelationMetadata and useRelationMetadata
Closes#2423
* feat: add Relation field form
Closes#2003
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: rename tenant into workspace
* fix: missing some files and reset not working
* fix: wrong import
* Use link in company seeds
* Use link in company seeds
---------
Co-authored-by: Charles Bochet <[email protected]>
* Use apiKeyV2 for getApiKeys
* Use apiKeyV2 for createApiKey
* Use apiKeyV2 for getApiKey
* Use apiKeyV2 to deleteapikey
* Filter null revokedAt -> not working
* Use apiKeyV2 to regenerate
* Fix default values injected
* Remove useless stuff
* Fix type
* Added react-dev-inspector
* Add field relation type parsing and filter available fields for record table and show page
* Revert "Added react-dev-inspector"
This reverts commit 7a78964c2c.
* update findOneWorkspaceMember
* profile picture upload is working
* first name and last name working
* support almost working
* remove picture working
* removed unused code
* remove console logs and fix allowImpersonation in FIND_ONE_WORKSPACE_MEMBER_V2
* use useUpdateOneObjectRecord
* wip
* wip
* adding favorite works in the database
* favorites are showing in the left drawer
* update favoorite NavItem link
* wip
* adding favorite works
* everything seems to work
* fix delete bug
* fix update favorite position
* update Favorite type
* Fix
---------
Co-authored-by: Charles Bochet <[email protected]>
* Finished renaming and scope
* wip
* WIP update
* Ok
* Cleaned
* Finished infinite scroll
* Clean
* Fixed V1 tables
* Fix post merge
* Removed ScrollWrapper
* Put back ScrollWrapper
* Put back in the right place
* create RecordTableScope
* use RecordTableScope
* working on useRecordTable hook
* add RecordTableScope to company-table
* add RecordTableScope to person-table
* add filter state and sort state
* add useSetRecordTableData to useRecordTable
* wip
* add setRecordTableData to useRecordTable
* update in RecordTableEffect
* fix bug
* getting rid of unnecessary context and hooks
* remove console.log
* wip
* fix bug by creating an init effect
* fix viewbar not in scope in company and people tables
* wip
* updating useRecordTable to use internal hooks
* updating useRecordTable to use internal hooks
* updating useRecordTable to use internal hooks
* updating useRecordTable to use internal hooks
* modified according to comments
* Update cleaning script to run on old schema
* Add boundaries parameter
* Stop requesting data for each workspace/table
* Stop checking same as seed if not requested
* Minor update
* Minor update
* Minor update
* Minor update
* Minor update
* Simplify result
* Simplify result
* Simplify result
* Delete updates
* Fix issues
* Update logs
* Remove throw when schema does not exist
* Remove missing table in old schema
* Remove boundaries parameter
* Remove useless trycatch
* Move question to questions folder
* Aggregate update result functions
* Use lodash to compare list of objects
* Remove favorites from tables
* Add a workspace parameter
* Move question after result log
* Improve logging
* Code review returns
* Add only lodash.isequal
* chore: add new eslint config file for ci
* add test console log
* merge the lint steps
* Fix according to PR
---------
Co-authored-by: Charles Bochet <[email protected]>
* Display maxUpdatedAt for each workspace Schema
* Factorize functions
* Add max update for public workspaces
* Merge everything in a single json
* Enrich results
* Get from proper table
* Update
* Move to proper command file
* Add a dry-run option
* Remove workspaces from database
* Fix DeleteWorkspace method
* Add new option
* Remove proper data when deleting workspace
* Minor improvements
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* fixed spelling errors in docs
* Final round of edits for frontend, added backend folder architecture
* Created CODE_OF_CONDUCT.md
* Add code of conduct to contributing.md
* doc changes
* fixed broken links
* doc addition and changes
* introduce user guide & graphql api
* set up vale, added to docs
* vale config file
* revised backend best practices
* connecting zapier and twenty
* added warning for zapier
* Add Standard Object migration commands
* rebase
* add sync-tenant-metadata command
* fix naming
* renaming command class names
* remove field deletion and use object cascade instead
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: save activated/disabled fields in New Field - Step 1 page
Closes#2170
* fix: fix objectSlug
* Console.log
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* feat: activate standard objects in New Object page
Closes#2010, Closes#2173
* Pagination limit = 1000
* Various fixes
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* icons added
* recoil family state added for checking compact view in each card
* recoil state added for toggle button. Wether compact view show or not
* menu item modifed for right side content
* compact view toggle added in dropdown options
* dropdown width increased because compact view text was overflowing
* compact view added in boardcard
* new animation added for in and out
* compact view enabled state added
* old state deleted
* sizes added in toggle component
* removed extra added code form navigation
* toggle size added in menuitem toggle
* MenuItemToggle added instead of MenuItemNavigate
* Compact view improved
* Add folder for api settings
* Init create api key page
* Update create api key page
* Implement api call to create apiKey
* Add create api key mutation
* Get id when creating apiKey
* Display created Api Key
* Add delete api key button
* Remove button from InputText
* Update stuff
* Add test for ApiDetail
* Fix type
* Use recoil instead of router state
* Remane route paths
* Remove online return
* Move and test date util
* Remove useless Component
* Rename ApiKeys paths
* Rename ApiKeys files
* Add input text info testing
* Rename hooks to webhooks
* Remove console error
* Add tests to reach minimum coverage
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* fixed spelling errors in docs
* Final round of edits for frontend, added backend folder architecture
* Created CODE_OF_CONDUCT.md
* Add code of conduct to contributing.md
* doc changes
* fixed broken links
* doc addition and changes
* introduce user guide & graphql api
* Fix issue 2151: Dropdown menu of header table does not close after hide column
* Remove dropdown scope
---------
Co-authored-by: Charles Bochet <[email protected]>
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* fixed spelling errors in docs
* Final round of edits for frontend, added backend folder architecture
* Created CODE_OF_CONDUCT.md
* Add code of conduct to contributing.md
* doc changes
* fixed broken links
* doc addition and changes
* prisma schema updated: added index in favorite
* update abilitiy added for favorite
* update one favorite resolver added
* update on favorite mutation added
* updateFavoriteOrder added
* Draglist added in favorite
* nav item convert to div from button: because it was not working dragable with button
* changed index to position
* position added in getFavorites query
* added recoil state for favorites
* reordering updated according to new method
* Use accurate type
---------
Co-authored-by: Charles Bochet <[email protected]>
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* fixed spelling errors in docs
* Final round of edits for frontend, added backend folder architecture
* Created CODE_OF_CONDUCT.md
* Add code of conduct to contributing.md
* doc changes
* fixed broken links
* feat: wip
* feat: add filter on findOne
* fix: tests & small bug
* feat: add test and support aggregation
* feat: add order by support
* fix: fix comments
* fix: tests
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* fixed spelling errors in docs
* Final round of edits for frontend, added backend folder architecture
* Created CODE_OF_CONDUCT.md
* Add code of conduct to contributing.md
Deploy to Render updated (#2033):
* postgres as a pserv (private service) compiled with pg_graphql
* default credentials (todo to fix), but postgres in a private network
* added FRONT_BASE_URL to server env
* added Dockerfile for postgres in infra/prod/postgres
* for server added dockerCommand with yarn database:setup
* add image
* overflow hidden
* add close button
* add animation to cover image
* use cookie to store user preference
* refactor to have a reusable component called AnimatedFadeOut
* corrected close button position
* modified according to comments
* feat: created new Developers Page in Settings
* update styled according to the updated design
* update styled according to the updated design
* remove unused color import from TableCell component
* update pl based on comments
* update pl based on comments
* update pl based on comments
* update pl based on comments
* update pl based on comments
* update pl based on comments
* update pl based on comments
* create save and cancel buttons and their stories
* add SaveAndCancelButtons to the New Object page
* add onSave and onCancel
* modified according to comments
* refactored Storybook UI
* refactored Storybook UI
* removed extra cards from the doc, added card for ui components
* added hover behavior to doc page & made it look selected
* separate storybook docs and tests
* separating storybook tests and docs
* feat: New Object - Add Object type section #1918
* fix: dark mode border color
* feat: New Object - Add Object type section #1918
* fix: dark mode border color
* Requested changes in the PR
* fix(new object): requested changes in the PR
* fix(1985): border color
* Fix bug where "metadata" scheme was not created automatically (#1971)
* logging on
* testing on render
* render upadte
* added setup-db.ts and updated package.json
* Add an ESLint rule to prevent the usage of useRef other than for HTML elements
Co-authored-by: v1b3m <[email protected]>
* Bump eslint version and rewrite rule
* Fix
---------
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* renamed volume name db_data to twenty_db_data
* named postgres container_name: twenty_postgres
make provision-postgres does:
* checking if docker is running
* stop the container postgres twenty_postgres
* prune the volume twenty_db_data
* rebuild the image every time, use --build
* wip
* wip
* wip
* wip
* wip
* remove hardcoded values and use theme values
* add styles to StyledContainer
* fix iconPicker bug
* wip
* refactor IconPicker to include IconButton
* close IconPicker on click outside
* close IconPicker on escape and enter
* refactor to use DropDownMenu
* refactor to use DropDownMenu
* modify default icon
* Refactor to use useIconPicker hook
* fix WithSearch story
* reinitialized searchString state on close
* create and update stories for the iconPicker
* remove comments
* use theme for gap
* remove align-self
* fix typo in icon
* fix type any
* fix merge conflicts
* remove experimental css properties
* feat: wip conditional schema based on column map instead of column field
* feat: conditionalSchema columnMap and singular plural
* fix: remove uuid fix
* feat: add name and label (singular/plural) drop old tableColumnName
* working on DateFieldInput story
* wip
* wip
* wip
* Fix story
* Fix other story
* finish stories for BooleanFieldInput and DateFieldInput
* reorganize stories in UI/Field in Input and Display folders
* unite FieldDisplayContextProvider and FieldInputContextProvider in one file FieldContextProvider
---------
Co-authored-by: Charles Bochet <[email protected]>
* Fix long text issue on people dropdown picker
* Fix checkmark shrink for long text
* remove width to not shrink image
* fix: remove width 100% from StyledMenuItemLabel
* added stories RawLink, SocialLink, and ContactLink and deleted story for PrimaryLink
* add play function to link tests
---------
Co-authored-by: bosiraphael <[email protected]>
* in compaines>fields Name fields is hided.
* in Opputunities>Options>Fieds make closeData dragable
* close data (first colum) make hideable
* added size field
* added filter in fields with index and size
* index updated
* Added Overview page
* Revised Getting Started page
* Minor revision
* Edited readme, minor modifications to docs
* Removed sweep.yaml, .devcontainer, .ergomake
* Moved security.md to .github, added contributing.md
* changes as per code review
* updated DropdownButton props
* refactoring in progress
* working but layout is wrong
* fixed bug
* wip on ColumnHeadWithDropdown
* fix bug
* fix bug
* remove unused styled component
* fix z-index bug
* add an optional argument to DropdownMenu to control the offset of the menu
* add an optional argument to DropdownMenu to control the offset of the menu
* modify files after PR comments
* clean the way the offset is handled
* fix lint
* Fix overlay positioning for 'Sort,' 'Filter,' and 'Options' menus
* Fix according to review
---------
Co-authored-by: Charles Bochet <[email protected]>
* fix: Team creation dialog is visible and closable
* fix according to recs
* fix border-radius issue visible on dark theme
* rename to appropriate naming: hotkeyCloser
* no memoize
* implemented all select option FilterDropdownEntitySearchSelect and enabled it for tasks page filter
* created new filter operand IsNotNull for make a select all qraphql query, added internal state for tracking isAllEntitySelected
* used filterCurrentlyEdited to track if isAllEntitySelected is selected
* fixed filter button icon SelectAll Icon
* added figma link to README.md
* added figma to the recommended extensions for the project
* updated useful tips in 'work with Figma' section of the docs to add Figma extension for VSCode
* removing yarn.lock
* modified Figma extension docs in 'Work with Figma'
* added Mdx Preview extension to recommended extensions
* implented add/remove favorite in context menu
* clear selected rows after favorite button click, context menu width 200px when remove from favorites is shown
* Update front/src/modules/ui/context-menu/components/ContextMenu.tsx
* test: adds test to check if adding a new company or people works
* test: improves people/add and companies/add tests
* style: cleanup
* style: cleanup
* Display 404 while person or company not found
* Display 404 while person or company not found
* Issue solved
* Icon Size Adjustment, resize the icons used in filter and sort
* Fixed issues
* Icon Size Adjustment, resize the icons used in filter and sort
* Add onClick in Avatar.tsx
* Comments solved
* Solve conflicts
* Update front/src/modules/users/components/Avatar.tsx
* Update front/src/modules/users/components/Avatar.tsx
* Update front/src/modules/users/components/Avatar.tsx
* Update front/src/modules/users/components/Avatar.tsx
* Update front/src/modules/users/components/Avatar.tsx
---------
Co-authored-by: Charles Bochet <[email protected]>
* Remove the {...props} pattern and props coupling, and create an eslint rule for that
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Thiago Nascimbeni <[email protected]>
* Add another test to the new rule
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Thiago Nascimbeni <[email protected]>
---------
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Thiago Nascimbeni <[email protected]>
* Use Fragments as types
Co-authored-by: v1b3m <[email protected]>
* Use Fragments as types in GraphQL queries and mutations
Co-authored-by: v1b3m <[email protected]>
---------
Co-authored-by: v1b3m <[email protected]>
* Boost CI
* Split CI tests in 2
* Try caching node modules
* Try caching node modules
* Try caching node modules
* Improve CI
* Improve CI
* Improve CI
* Improve CI
* Improve CI
* Improve CI
* Separate jest tests
* Fix typo
* Re-order tests jobs
* feat: added a dropDownCloseEffect component
* Delete yarn.lock
* refactor: moved the DropdownCloseEffect inside the Dropdown button as a hook
* refactor: moved the DropdownCloseEffect to the DropdownButton jsx
* Create sweep.yaml with gha_enabled set to False
* Updated infra/dev/Makefile
---------
Co-authored-by: sweep-ai[bot] <128439645+sweep-ai[bot]@users.noreply.github.com>
* adjusted MainNavbar icons size from 'md' to 'sm'
* reduced CollapseButton size from 32px to 24px
* Added margin-left of 4px to the left chevron icon
* removed 8px padding
* updated the stroke for the NavItem
* Fixed bug for refectch activities and create activity on the currently filtered user.
* Refactor optimistif effect
---------
Co-authored-by: Charles Bochet <[email protected]>
* Display 404 while person or company not found
* Display 404 while person or company not found
* Issue solved
* Icon Size Adjustment, resize the icons used in filter and sort
* Fixed issues
* Icon Size Adjustment, resize the icons used in filter and sort
---------
Co-authored-by: Charles Bochet <[email protected]>
* Refactor icons passed as props with the new way
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
* Update more files
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
* Fix according to review
* Fix according to review
* Fix according to review
* Fix chromatic regressions
---------
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
chore: Update package version in package.json
An increment in version number was made in the application's package.json file, from 0.1.2 to 0.1.3. This update was necessary as part of the new release preparation encompassing changes made in the codebase since the last version.
* feat: Add separate constants in theme for modal sizes and paddings
* feat: Implement dynamic sizing and padding for Modal
* feat: use dynamic modal feature for csv import
* fix: Remove redundant props from spreadsheet-import
* fix: use theme.spacing() instead
* fix: place types to Modal.tsx, convert ternary to switch-case, give default value
* fix: give px to modal sizes
* enhance: add color style to modal
* feat: add modal to storybook
* feat: add ability to enable or disable header selection
* feat: limit to max of 200 records for now
* fix: bigger modal
* feat: add missing standard fields for company
* fix: person fields
* feat: add hotkeys on dialog
* feat: mobile device
* fix: company import error
* fix: csv import crash
* fix: use scoped hotkey
* Add URL validation tests
Add test for longer TLDs
Add test for internationalized TLDs
* Fix URL validation with long TLDs
* TLD max size match RFC 1034
---------
Co-authored-by: Jérémy M <[email protected]>
* fix: improve full name editable fields in Person Show page
+ autoresize inputs according to their content
+ use "Empty" as placeholder
+ improve hover style
Closes#910
* refactor: code review
- rename TemplateDimensionsEffect to ComputeNodeDimensionsEffect
* feat: allow adding available pre-defined table columns to views
Closes#1360
* fix: allow creating views with the same name for the same table
* refactor: code review
- rename things
- move handleColumnVisibilityChange to useTableColumns hook
* unselect users and companies
* Icon now works with theme
---------
Co-authored-by: vboxuser <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* feat: create view from selected filters and sorts
Closes#1292
* refactor: use selector to obtain table filters where query option
* refactor: activate exhaustive deps eslint rule for useRecoilCallback
* feat: switch to newly created view on view creation
Closes#1297
* refactor: code review
- use `useCallback` instead of `useRecoilCallback`
- rename `useTableViews` to `useViews`
- move filter-n-sort selectors to /states/selector subfolder
* The scrollbar should fade away when the scroll is finished or not started
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: FellipeMTX <[email protected]>
* Complete scroll work
* Fix pr
* Fix pr
---------
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: FellipeMTX <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Renamed AuthAutoRouter
* Moved RecoilScope
* Refactored old WithTopBarContainer to make it less transclusive
* Created new add opportunity button and refactored DropdownButton
* Added tests
* Deactivated new eslint rule
* Refactored Table options with new dropdown
* Started BoardDropdown
* Fix lint
* Refactor dropdown openstate
* Fix according to PR
* Fix tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* add 404 page
* add not found wildacard path to apppath
* rename styled components
* add theme blur and background color
* change backgrounf to transparent secondary
* feat: wip implement back-end call csv import
* fix: rebase IconBrandTwitter missing
* feat: person and company csv import
* fix: test & clean
* fix: clean & test
* On Company Show, I can select an existing person and add it to the company
Co-authored-by: Matheus <[email protected]>
Co-authored-by: v1b3m <[email protected]>
* Add requested changes
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
* Add excludePersonIds
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Matheus <[email protected]>
* Add hotkey support
* Fix popin placement and fix company show mobile
* Fix popin placement and fix company show mobile
---------
Co-authored-by: Matheus <[email protected]>
Co-authored-by: v1b3m <[email protected]>
Co-authored-by: Charles Bochet <[email protected]>
* Upgrade /front version and display the version in settings navbar
* fix
* fix version
* restore center
* add icon
* Fix styled components
---------
Co-authored-by: Charles Bochet <[email protected]>
* Remove unused components
* Fix company not being created issue
* Fix company not being created issue
* Fix company not being created issue
* Optimize rendering
* Optimize rendering
* Use FieldDefinition for company show page
* removing console.log
* fix conflicts
* fix address placeholder + company show page field definition ordering
* fix story
* add replacePlaceholder
* use AppPath enum in stories
* add routeParams
* fix people input story
* fix: [#1079] adding max width to menu items and also the tooltip to show full text value
* chore: removed max-width property
* chore: fixed the interaction for people.sortby
* chore: removed unused code
* chore: fixed the interaction for companies.sortby
* feat: require confirmation before on memeber deletion
* fix: typo
* feat: ConfrimationModal moved to ui/modals/component - confirmation modal storybook
* fix: modal member deletion text
* fix: extra ! operator - remove deletemodal - using styledconfirmationbutton
* fix: story structer
* fix: imports
* Fix#1038: Logout button should be change to gray
* Fix#1059: Replace Inbox by Notifications in navigation
* Fixed lint issues
* Fixed the import
* Fix#1076: Change User icon into User-circle on Companies & Settings
* - added drag to select on EntityTable
* - moved dragToSelect to own component
* - convert DragSelect to a generic component
* - fixed unused vars
* formatting
---------
Co-authored-by: Charles Bochet <[email protected]>
* Add company and person on update and create
* Enable reading with error management on commentable ID
* [CHECKPOINT] backward-compatible
* Migrate data for activity targets
* Revert "Migrate data for activity targets"
This reverts commit f89bc30689.
---------
Co-authored-by: Charles Bochet <[email protected]>
* Deprecate pipelineprogress backref on person to improve naming
* Remove deprecated point of contact fields
* Add company and person entities on pipelineprogress
* Migrate data from old progressable to new entity fields
* Codegen frontend
* Use company Id, deprecate progressableId
* Get rid of deprecated progressableId field
* Remove deprecated progressableType field from pipeline progress
* Remove useless migrations
* Move files
* Add filtering for tasks inbox
* Add filter dropdown for single entity
* Minor
* Fill empty button
* Refine logic for filter dropdown
* remove log
* Fix unwanted change
* Set current user as default filter
* Add avatar on filter
* Improve initialization of assignee filter
* Add story for Tasks page
* Add more stories
* Add sotry with no tasks
* Improve dates
* Enh tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* Add the number of oppurtunities on each stage
* Remove excess css properties in Boardcolumn.tsx and use theme
* Remove padding from oppurnities counters
* Added generic relation cell
* Deactivated debug
* Added default warning
* Put back display component
* Removed unused types
* wip
* Renamed to view field
* Use new view field structure to have chip working
* Finished
* Added a temp feature flag
* Added double text chip cell
* Ok
* Finished tables
* Fixed icon size
* Fixed bug on date field
* Use icon index
* Fix
* Fixed naming
* Fix
* removed file from merge
* Fixed tests
* Coverage
* Fix LinkedIn URL not redirecting to the right url
* add avatars for people and seeds
* Fix delete account/workspace
* Add people picture on other pages
* Change style of delete button
* Revert modal to previous size
* Fix tests
* Added generic relation cell
* Deactivated debug
* Added default warning
* Put back display component
* Removed unused types
* wip
* Renamed to view field
* Use new view field structure to have chip working
* Finished
* Added a temp feature flag
* feat: rename commentThread into activity server
* feat: rename commentThread into activity front
* feat: migration only create tables
feat: migration only create tables
* Update activities
* fix: rebase partial fix
* fix: all rebase problems and drop activity target alter
* fix: lint
* Update migration
* Update migration
* Fix conflicts
* Fix conflicts
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: wip e2e server test
* feat: use github action postgres & use infra for local
* feat: company e2e test
* feat: add company e2e test for permissions
* Simplify server e2e test run
* Fix lint
---------
Co-authored-by: Charles Bochet <[email protected]>
* feat: create ViewField model
- Created ViewField prisma model
- Added ViewField server resolvers for findMany/updateOne
- Added getViewFields/updateViewField graphql queries
Closes#849
* chore: update node version in .nvmrc files
* Removed isSomeInputInEditMode
* Removed console.log
* Added a first version of generic cell text
* Removed metadata from entity table V1
* Fix
* Fix
* Fix
* url should reference container name instead of localhost
* add context for the postgres URL change, when installing with Docker. Also minor grammar/typo changes.
* return the postgres URL to its original value, which corresponds with the recommended (yarn) installation.
---------
Co-authored-by: Charles Bochet <[email protected]>
* docs: use PageDecorator
* docs: use decorators in TableHeader stories
* docs: use theming parameter in App stories
* docs: enable auto-generated docs for stories
Closes#702
* Enable company name edition from page
* Enable editing persons as well
* Add styling for titles
* Better manage style with inheritance
* Add stories for poeple editable fields
* Remove failing test
* Revert "Remove failing test"
This reverts commit 02cdeeba64276a26f93cf4af94f5857e47d36fff.
* Fix test
* Update name
* Fix location
* Rename tests
* Fix stories
* WIP
* Add menu for rename/color select
* Add stories
* Remove useless code
* Fix color name, add icon for selected color
* Remove useless comment
* Unify color vocabulary
* Fix rebase
* Rename story
* Improve hotkeys and imports
* feat: no atomic
* feat: update front not atomic operations
* feat: optional fields for person model & use proper gql type
* Fix bug display name
* Fix bug update user
* Fixed bug avatar URL
* Fixed display name on people cell
* Fix lint
* Fixed storybook display name
* Fix storybook requests
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* Removed console log
* Used current scope as default parent scope for fields
* Finished editable fields on people show page
* Added stories
* Console log
* Lint
* feat: add color scheme toggle
* feat: colorScheme stored in UserSettings model
* feat: add stories
* fix: AnimatePresence exit not working
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* feat: add back button in company details top bar
Closes#636
* Add back button on person page
---------
Co-authored-by: Charles Bochet <[email protected]>
* Add link to company page
* Have company chip background color matchin the card's
* Revert "Have company chip background color matchin the card's"
This reverts commit 8e9575fd933f9efb8d6614ec7287d6be28b81f7e.
* Create chip variants
* Lint
* code style
* Fix tests
* Fix tests
* Fix tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* Get pipeline progress from stage IDs
* Rename hooks file
* Addd first amount filter
* Add remaining filters
* Design fixes
* Add filtering on creation date or amount
* Fix card updates and creations with the new state management
* Keep ordering when dropping a card
* Add remainint sorts
* Make board header more generic
* Move available filters and sorts to board options
* Fix decorators for test
* Add pipeline stage ids to mock data
* Adapt mock data
* Linter
* Move useFilteredSearchEntityQuery from relation picker to search module
* refactor duplicated code with useFilteredSearchCompanyQuery
* Implement similar pattern for people than for companies with useFilteredSearchEntityQuery
* Fix warning from a previous PR
* Enable search from menu
* Add companies to search
* Fix ESLint
* Refactor
* Fix according to peer review
---------
Co-authored-by: Charles Bochet <[email protected]>
* Move filter and sort compoenets in a separate lib
* Add SortAndFilterBar to the filter lib
* Abstract hotkeys scopes
* Fix hotkeys on filters
---------
Co-authored-by: Charles Bochet <[email protected]>
* Change placeholder color and design fixes for show page / sidebar
* Replace hardcoded border radiuses
* Improve border display for middle of button group
* Editor styling
* Editor font size
* Comment Bar positioning and remove scrollbar for 1px
* Add Comments section title
* Nit: match css style
---------
Co-authored-by: Emilien <[email protected]>
* feat: colored avatar
* fix: use id instead of name & remove unused
* fix: remove unused
* Allow empty ID to avoid empty string
* Fix tests
* Add person chip story
---------
Co-authored-by: Emilien <[email protected]>
* feat: workspace update name and logo
* fix: remove logs
* fix: disable warning until refacto
* Fix text
---------
Co-authored-by: Emilien <[email protected]>
* fix: clean small back-end issues
* fix: apollo factory causing infinite loop on token renew
* feat: small refactor and add ability to remove workspace member
* fix: test
* Begin adding show view and refactoring threads to become notes
* Progress on design
* Progress redesign timeline
* Dropdown button, design improvement
* Open comment thread edit mode in drawer
* Autosave local storage and commentThreadcount
* Improve display and fix missing key issue
* Remove some hardcoded CSS properties
* Create button
* Split company show into ui/business + fix eslint
* Fix font weight
* Begin auto-save on edit mode
* Save server-side query result to Apollo cache
* Fix save behavior
* Refetch timeline after creating note
* Rename createCommentThreadWithComment
* Improve styling
* Revert "Improve styling"
This reverts commit 9fbbf2db00.
* Improve CSS styling
* Bring back border radius inadvertently removed
* padding adjustment
* Improve blocknote design
* Improve edit mode display
* Remove Comments.tsx
* Remove irrelevant comment stories
* Removed un-necessary panel component
* stop using fragment, move trash icon
* Add a basic story for CompanyShow
* Add a basic People show view
* Fix storybook tests
* Add very basic Person story
* Refactor PR1
* Refactor part 2
* Refactor part 3
* Refactor part 4
* Fix tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* Move code to new folder
* Deduplicate code, remove dependancy on table
* Remove more table dependency
* Move close logic to input
* Migrate editable text cell
* Rename EditableTextInput
* Fix component test id
* feat: wip upload module
* feat: local storage and serve local images
* feat: protect against injections
* feat: server local and s3 files
* fix: use storage location when serving local files
* feat: cross field env validation
* wip
* - Added scopes on useHotkeys
- Use new EditableCellV2
- Implemented Recoil Scoped State with specific context
- Implemented soft focus position
- Factorized open/close editable cell
- Removed editable relation old components
- Broke down entity table into multiple components
- Added Recoil Scope by CellContext
- Added Recoil Scope by RowContext
* First working version
* Use a new EditableCellSoftFocusMode
* Fixes
* wip
* wip
* wip
* Use company filters
* Refactored FilterDropdown into multiple components
* Refactored entity search select in dropdown
* Renamed states
* Fixed people filters
* Removed unused code
* Cleaned states
* Cleaned state
* Better naming
* fixed rebase
* Fix
* Fixed stories and mocked data and displayName bug
* Fixed cancel sort
* Fixed naming
* Fixed dropdown height
* Fix
* Fixed lint
* fix: add firstname and lastanme to user model
* fix: avoid undefined in displayName resolve field
* fix: user firstName and lastName instead of firstname lastname
* fix: person table proper naming firstName lastName
* fix: migrate front with firstName and lastName
* fix: make front-graphql-generate not working
* wip
* wip
* - Added scopes on useHotkeys
- Use new EditableCellV2
- Implemented Recoil Scoped State with specific context
- Implemented soft focus position
- Factorized open/close editable cell
- Removed editable relation old components
- Broke down entity table into multiple components
- Added Recoil Scope by CellContext
- Added Recoil Scope by RowContext
* First working version
* Use a new EditableCellSoftFocusMode
* Fixed initialize soft focus
* Fixed enter mode
* Added TODO
* Fix
* Fixes
* Fix tests
* Fix lint
* Fixes
---------
Co-authored-by: Lucas Bordeau <[email protected]>
* fix: add ellipsis in all table cells
* fix: workspace click redirect to home
* fix: add company chip story and edit comment cell story
* fix: remove cursor pointer on workspace name
* fix: snoop pill height
* fix: rebase
* feature: add navigation for opportunities
* chore: add companies in pipeline seed
* feature: make the board scrollable
* feature: make the board scrollable vertically
* feature: remove board container
* feature: fix newButton style
* feature: add onClickNew method on board
* feature: call backend with hardcoded id for new pipeline progressable
* feature: refetch board on click on new
* feature: use pipelineProgressId instead of entityId to ensure unicity of itemKey
* feature: avoid rerender of columns when refetching
* Fix some icon display size + fix padding issue on EditableChip component
* Fix according to PR
* Fix server generate and deploy scripts
* Fix image size on Opportunities board
* Fix lint
* Fix according to PR
* feature: create boardCard component
* test: add snapshot for BoardCards
* feature: fix typename of company
* feature: add max width on BoardItem
* feature: design CompanyBoardCard
* feature: Add People picture and name
* feature: design PeopleCard
* feature: fix font weight for card header
* test: fix storybook for board
* test: add unit test for column optimistic renderer
* Add a custom rule to prevent colors from being hardcoded in ESLint
* Refactor colors
* Create packages folder and fix colors
* Remove external dependency for css alphabetical order linting
* Fix install with yarn
---------
Co-authored-by: Charles Bochet <[email protected]>
* feature: get pipelines columns from backend
* feature: display item not found instead of crashing
* feature: add BoardCard component
* feature: display items from the backend
* refactor: extract useBoard in a hook
* refactor: export only loading and error from useBoard
* refactor: create var pipelineStage
* feature: implement support for Company boards
* Created dropdown menu UI component with story
* Added all components for composing Dropdown Menus
* Better component naming and reordered stories
* Solved comment thread from review
* Make the sidebar collapsable
* Fix padding
* Automatically collapase sidebar and hide container on mobile
* Hide navbar content when navbar is collapsed
* Update naming convention for states
* Added comments and authors on drawer with proper resolving
* Fixed generated front graphql from rebase
* Fixed comment chip
* wip
* wip 2
* - Added string typing for DateTime scalar
- Refactored user in a recoil state and workspace using it
- Added comment creation
* Put theme and user state in generic providers
* Fix from rebase
* Fixed app theme provider removed from storybook
* Wip
* Fix graphql front
* Fixed backend bug
* - Added comment fetching in creation mode
- Fixed drawer overflows and heights
* - Fixed autosize validation button CSS bug
* Fixed CSS bug with drawer changing height if overflow
* Fixed text input too many event catched and useless error message
* Removed console.log
* Fixed comment cell chip
* Create comment thread on each comment action bar click
* Fixed lint
* Fixed TopBar height
* refactor: extract data from Board component
* feature: display board on opportunities page
* test: add strict mode in storybook
* chore: replace dnd to make it work with React 18 and strict mode
Atlassion has not fixed this issue in a year so we use the fork @hello-pangea/dnd
https://github.com/atlassian/react-beautiful-dnd/issues/2350
* refactor: move mocked-data in a file
* chore: use real column names in mock data
* feature: design columns
* feature: add New button at bottum of columns
* bugfix: move header out of dragable so the cards does not flicker on drop
* lint: remove useless imports
* refactor: rename board item key
* feature: add Board component
* feature: add BoardColumn
* feature: add BoardCard
* chore: install react beautiful dnd
* refactor: use children instead of item parameter
* feature: wrap board in DragDropContext
* feature: wrap columns in dropable
* feature: wrap boardCard in draggable
* feature: add a second column
* refactor: rename columns to initialBoard
* refactor: use itemKeys instead if item directly
* feature: add key for react to render
* refactor: type the onDragEnd callback
* feature: drag and drop elements between columns
* Added prisma to suggested extension in container
* Added comments and authors on drawer with proper resolving
* Fix lint
* Fix console log
* Fixed generated front graphql from rebase
* Fixed right drawer width and shared in theme
* Added date packages and tooltip
* Added date utils and tests
* Added comment thread components
* Fixed comment chip
* wip
* wip 2
* - Added string typing for DateTime scalar
- Refactored user in a recoil state and workspace using it
- Added comment creation
* Prepared EditableCell refactor
* Fixed line height and tooltip
* Fix lint
* Fixed right drawer width and shared in theme
* Added date packages and tooltip
* Added date utils and tests
* Added comment thread components
* Fixed comment chip
* Fix from rebase
* Fix from rebase
* Fix margin right
* Fixed CSS and graphql
* test: add story for table header
* feature: wrap chips in a container and set shrink to 0 so they don't grow vertically
* feature: cancel button is darker
* feature: set gap between chip to 4px instead of 8
* lint: remove unused code
* bugfix: ChipContainer has a starting margin
* test: add empty comment test
* test: comments section opens on click on comments chip
* test: add a failing test for opening comment section
* feature: open comments drawer on click on comment chip
* test: refactor company test, create folders
* refactor: use generated queries for Companies
* refactor: remove useQuery from service, use generated code
* refactor: rename to ts file instead of tsx
* bugfix: use generatd queries, and fix non existing id in workspace member query
* Added prisma to suggested extension in container
* Added comments and authors on drawer with proper resolving
* Fix lint
* Fix console log
* Fixed generated front graphql from rebase
* feature: add rightEndContent to editable cell
* refactor: use rightEndContent instead of comments sections
* refactor: move commentCount in a var
* feature: get commentsCount from backend
* refactor: use an index
* feature: use commentCount from backend on people
* refactor: rename commentCount for companies
* refactor: use generated queries, instead of useQuery
* Added on click on Checkbox component
* - Added test in story
- Added sleep util
- Fixed click target collision (thanks to test !)
* Use a new CheckboxCell to wrap Checkbox
* Fixed lint
* Refactored CSS after comment
* Fixed tests
* Lowercase all relations in prisma/graphql schema
* Add Comments data model and graphql schema
* Make comments availalble on the api through resolvers and guard them
* Update front graphql schema
* Fix PR
* Rename User to AuthUser to avoid naming conflict with user business entity
* Prevent query by workspace in graphql
* Make full user and workspace object available in graphql resolvers
* Add Seed to create companies and people accross two workspace
* Check workspace on all entities findMany, find, create, update)
* Fixed ActionBar paddings and added transition on button hover
* Added recoil library for state management
* Refactor table state with recoil :
- Removed table internal states
- Added refetchQueries to plug apollo store directly into tables
- Added an action bar component that manages itself
- Use recoil state and selector for row selection
- Refactored Companies and People tables
* Moved hook
* Cleaned some files
* Fix bug infinite re-compute table row selection
---------
Co-authored-by: Charles Bochet <[email protected]>
* new header for Readme
* new header for Readme
* new header for Readme
* Correct naming and changed assets
* Applied Strapi method for dark-mode images
* Corrected logo-square-dark look
* Corrected a typo
* Corrected spacing
This PR is a bit messy:
adding graphql schema
adding create company creation on company select on People page
some frontend refactoring to be continued
---------
Co-authored-by: Charles Bochet <[email protected]>
* chore: remove old resolvers
* refactor: move generated file in code base
* feature: use only necessary code in graphql
* feature: implement query companies
* feature: implement companies and relations
* feature: implement all companies resolvers
* feature: implement all people resolver
* feature: add use resolvers
* feature: implement resolvers for workspace and users
* Remove hasura and hasura-auth
* Move all models to prisma
* Start implementing graphql
* chore: clean package json
* chore: make the code build
* chore: get initial graphql.tsx file
* feature: use typegql as qgl server
* refactor: small refactoring
* refactor: clean tests
* bugfix: make all filters not case sensitive
* chore: remove unused imports
---------
Co-authored-by: Sammy Teillet <[email protected]>
* refactor: use AnyEntity instead of any
* refactor: remove any and brand company type
* refactor: add typename for user and people
* bugfix: await company to be created before displaying it
* feature: await deletion before removing the lines
* refactor: remove default tyep for filters
* refactor: remove default type AnyEntity
* refactor: remove USers from filterable types
* refactor: do not depend on Filter types in Table
* Add tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* Create and EditableRelation component and make it generic
* Refactor EditableCell component to be more flexible
* Complete Company picker on people page
* Fix lint
* feature: add company filter by name
* feature: add fitler on URL
* feature: set icons for sorts
* feature: add creation date and address sorts
* Add tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* bugfix: use original row id in cells to make sure it rerenders
* feature: implement multiple sorts
* bugfix: recreate new array to make sure component rerenders
* feature: orderBy is an array to keep orders
* test: snapshot the searchTemplate methods
* feature: remove the console log and return undefined
* feature: use orderByTemplate instead of hardcoded orderBy
* refactor: move sort and where filters helpers out of service
* refactor: rename file helper
* refactor: move assert function in test
* feature: add email filter
* feature: add city filter
* test: fix company search tests
* test: use the right value in test
* refactor: test all the filters in a loop
* feature: add operand list to filters
* feature: implement not include
* feature: add operand on filters
* feature: use filters operand instead of defaults
* test: adapt test with new operands
* refactor: remove useless %% in gql where
* test: test fullname filter
* test: add test for where rendering of filters
* Add filter search logic
WIP Filter search
Implement filters
test: fix sorts tests
test: fix filter test
feature: search person and display firstname in results
feature: fix test for filter component
test: mock search filters
refactor: create a useSearch hook
refactor: move debounce in useSearch and reset status of filter selection
feature: debounce set filters
refactor: remove useless setSorts
feature: add where variable to people query
feature: strongly type Filters
feature: update WhereTemplate method
feature: implement filtering on full name
feature: type the useSearch hook
feature: use where reducer
refactor: create a type for readability
feature: use query and mapper from filters
feature: implement filter by company
feature: search filter results on filter select
feature: add loading and results to search results in filters
refactor: move render search results in a function
feature: display a LOADING when it loads
feature: split search input and search filter for different debounce
refactor: remove some warnings
refactor: remove some warnings
* Write test 1
* Write test 2
* test: useSearch is tested
* test: update names of default people data
* test: add a filter search
* Test 3
* Fix tests
---------
Co-authored-by: Charles Bochet <[email protected]>
* Ignore node_modules
* Use bash-compatible dotenv format
While still being compatible with dotenv, this
also allows sourcing the file to export all
variables in bash.
* Add prettier extension to recommendations
* Move to port 5001 to avoid conflict with macOS services
* Add workspace
* Add devcontainer
This automatically starts with all environment
variables available locally.
It brings up services which are dependent on each
other individually and verifies health before
moving on to the next service.
* Split init into clean, up, and logs tasks.
This allows the developer to set up .env and .npmrc
files before running services, and does not require
starting from a clean db every time the devcontainer
is restarted.
* Copy .env when creating codespace
* Automatically run UP command upon devcontainer creation
* Fix log message
---------
Co-authored-by: Felix Malfait <[email protected]>
* Add columns to companies:
* account_owner_id
* employees
* address
Add foreign key constraint companies_account_owner_id_fkey
to auth.users.id
* Add select permissions to:
* account_owner_id
* employees
* address
Add relationship between companies and auth.users.
* Update Companies interface to include:
* account_owner_id
* employees
* address
Opportunity is expected to be replace by actual opportunity in a separate PR.
* Add GetCompanies query
* Add initial companies table
* Update test to use mock apollo provider
* Update to match changed company column names
* Add company interface mapping tests
* Test entire object
* Add test for companies being rendered in table.
* Add test for sorting reduce.
* Fix prettier errors
* Propose new doc architecture
* Many improvements to documentation (styling, structure...)
* Remove modules added inadvertently + continue improving styling
* Swizzle navbar item to add support for custom icon
* Additional doc styling
* Setup docs for API and redirect homepage for docs
* feature: add filter dropdown
* test: add story for FilterDropdown
* feature: display filterOperand on top of dropdown
* feature: display filter operand
* feature: fix index and display selected filter
* refactor: set TopOption button inside dropdown file
* feature: move availableFilters outside the fitler component
* refactor: make the available sorts and filter optionnal
* refactor: rename availableSorts
* feature: add a resetState property on onOutsideClick
* feature: add filters and set filters on Dropdown component
* feature: set filters on click in dropdown
* test: verify button is active after filters are set
* feature: display sorts and filters
* refactor: move SelectedFilters in SortAndFilter
* refactor: move SelectedFilters in dedicated file
* refactor: remove Id and use Key
* Fix html entities and newline handling
This forces contenteditable to behave as single line input,
and properly handles html entities.
* Proposal without reacteditable
* Fix tests and re-add focus styleé
---------
Co-authored-by: Charles Bochet <[email protected]>
* Fix compose syntax error
It turns out that docker compose does not like a literal `true`
but it will accept a `"true"` string.
* Added missing && operators
* refactor: use safe css selector
* feature: onclick update the order option
* feature: set option in the dropdown
* feature: display icon for sort options
* refactor: indent key so react does not complain of conflicting keys
* feature: align icon and text
* feature: fix size of icon to align text
* feature: create design for TopOption in dropdown
* refactor: set font weight in style
* feature: finalise design of TopOption
* refactor: rename option to sort
* refactor: remove order from the sortType
* refactor: move sort mapper in service
* test: selection of Descending in SortDropdownButton
* refactor: fix styme-component warning
* feature: add sorting by people
* refactor: set SortFields types for tables
* feature: add sort by company
* refactor: rename sortFields to singular
* refactor: rename option to SortDirection
Add insert, update, delete permissions without any custom checks.
It is assumes that custom checks will be added as a part of the
workspace authorization ticket.
I didn't know whether we should chose GPL or MIT.
Let's just assume people have good intentions, and not overly restrict usage by using a copyleft licence.
The risk is someone hijacking the project (e.g. a well-funded company forking the project, then building a direct competitor on top of it), but our choices shouldn't be driven by the worst possible outcome, they should be driven by the best possible outcome, which is that a lot of creative people use our project and take it in a successful direction we couldn't have seen ourselves
The following terms are used throughout this agreement:
- You - the person or legal entity including its affiliates asked to accept this agreement. An affiliate is any entity that controls or is controlled by the legal entity, or is under common control with it.
- Project - is an umbrella term that refers to any and all Twenty.com PBC open source projects.
- Contribution - any type of work that is submitted to a Project, including any modifications or additions to existing work.
- Submitted - conveyed to a Project via a pull request, commit, issue, or any form of electronic, written, or verbal communication with Twenty.com PBC, contributors or maintainers.
# Grant of Copyright License.
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers, contributors, users and to Twenty.com PBC a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your contributions and such derivative works. Except for this license, You reserve all rights, title, and interest in your contributions.
# Grant of Patent License.
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers, contributors, users and to Twenty.com PBC a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your contributions, where such license applies only to those patent claims licensable by you that are necessarily infringed by your contribution or by combination of your contribution with the project to which this contribution was submitted.
If any entity institutes patent litigation - including cross-claim or counterclaim in a lawsuit - against You alleging that your contribution or any project it was submitted to constitutes or is responsible for direct or contributory patent infringement, then any patent licenses granted to that entity under this agreement shall terminate as of the date such litigation is filed.
# Source of Contribution.
Your contribution is either your original creation, based upon previous work that, to the best of your knowledge, is covered under an appropriate open source license and you have the right under that license to submit that work with modifications, whether created in whole or in part by you, or you have clearly identified the source of the contribution and any license or other restriction (like related patents, trademarks, and license agreements) of which you are personally aware.
The contributors and maintainers of this project pledge to ensure a harassment-free experience for everyone in the community. This commitment applies to individuals of all backgrounds, including age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity, experience, education, socio-economic status, nationality, appearance, race, religion. It also applies to individuals of all sexual identities and orientations.
The focus of both contributors and maintainers is on acting and interacting in ways that promote an open, welcoming, friendly, diverse, inclusive, and healthy community.
## Twenty's Standards
Examples of behavior that contributes to a positive environment for this
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Respectfully giving and accepting constructive feedback
* Accepting responsibility and apologizing to those affected by mistakes,
and learning from the experience
* Focusing on what's best, not just for each individual but also for the community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* The use of aggressive language
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct inappropriate in a professional setting.
## Enforcement Responsibilities
Community leaders and maintainers of this repository are responsible for clarifying and enforcing Twenty's standards of acceptable behavior. They will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
Community leaders and maintainers of this repository have the right and responsibility to remove, edit, or reject comments, commits, code, issues, and other contributions that aren't aligned with this Code of Conduct. They will also communicate reasons for moderation decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing this community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Attribution
This Code of Conduct is an adaption of the [Contributor Covenant][homepage],
Thank you for considering contributing to Twenty! All community contributions are welcome.
This guide outlines the process for contributing to this project. Please make sure to go through the [documentation](https://docs.twenty.com) before making your contribution.
> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation:
> - Star the project
> - Tweet about it
<br>
## Getting Started
Good first issues are a great way to start contributing to the project and get familiar with the codebase. Here's how to find them:
1. Visit the "[Issues](https://github.com/twentyhq/twenty/issues)" tab on the main [repository](https://github.com/twentyhq/twenty).
2. Use the "Labels" filter and select "[Good First Issue](https://github.com/twentyhq/twenty/labels/good%20first%20issue)" to see a list of beginner-friendly tasks.
3. Choose an issue that interests you, fork the project, and start working on it. Once you solve and test the issue, open a PR for review.
Note: We are aware that having multiple contributors address the same issue can cause frustration. To prevent this, we adhere to a specific guideline: if a core team member has assigned an issue to a contributor, either as the issue assignee or through explicit assignment in the issue comments within the past three days, that contributor's pull request takes precedence. Otherwise, the first PR submitted will be given priority. This delay is reduced to one day for PR tagged with "size: minutes" and extended to a week for PR tagged "size: days".
Therefore, ensure you are assigned to an issue before beginning work on it.
<br>
## Contributing Guidelines
1.**Fork the Repository:** Click on the 'Fork' button in the upper right corner of the repository's GitHub page. This will create a copy of the repository in your GitHub account.
2.**Clone the Repository:** Clone your forked repository to your local machine using `git clone`.
3.**Make Changes:** Make your desired changes and ensure that your code adheres to Twenty's coding standards.
4.**Test Locally:** Test your changes locally to ensure they work as expected.
5.**Commit Changes:** Commit your changes with a clear and concise commit message.
```shell
git commit -m "Add your detailed description here"
```
6.**Push Changes:** Push your changes to your forked repository.
```shell
git push origin branch-name
```
7.**Create a Pull Request:** Go to the original Twenty repository and create a pull request. Please provide a detailed description of your changes. To have your pull request accepted, you must sign a CLA.
8.**Code Review:** Your pull request will undergo a code review. Note that you might need to make any necessary adjustments based on feedback.
9.**Merge:** Once approved, maintainers will merge your pull request into the main repository.
<br>
## Code of Conduct
Please note that by contributing to this project, you're expected to follow Twenty's [Code of Conduct](./CODE_OF_CONDUCT.md). All maintainers strive to maintain a welcoming, friendly, and inclusive community for all contributors.
<br>
## Reporting Issues
If you encounter any issues or have suggestions for improvements, please feel free to (create an issue on Twenty's GitHub repository)[https://github.com/twentyhq/twenty/issues/new]. When reporting issues, please provide as much detail as possible to help in understanding and addressing the problem effectively.
---
Thank you for considering contributing to Twenty. Your contributions help make Twenty's CRM platform even better!
title:'Ex:Add custom field from Companies / People table options menu'
labels:''
assignees:''
---
## Scope & Context
**Example:**
```
We are working on enabling users to add custom fields in their workspace.
The ticket is about adding the custom field feature on Companies and People pages only.
```
## Current behavior
A clear and concise description of what the current behavior is.
Please also add **screenshots** of the existing application.
**Example:**
```
On Companies and People pages, the "field" menu item from the option menu shows both displayed columns, and hidden columns
[screenshot]
```
## Expected behavior
A clear and concise description of what you want to happen.
Please also add **figma screenshots or figma links** if available
**Example:**
```
The "field" menu item from the option menu should only display visible columns. To display a new column, the user should click on "Add field" at the bottom of the menu.
[figma screenshot 1]
[figma link 1]
Clicking on this button should swap the menu with the same menu that is used by pressing the "+" button on the table title bar, showing "Add custom field option"
[figma screenshot 2]
[figma link 2]
Clicking on "Add custom field" should open swap the menu with the "field type" menu
...
```
## Technical inputs
**Example:**
```
- Modify TableOptionsDropdownContent to add the new "Add field Item" using a MenuItem component
- Create an internal state 'isAddingField' to track the progress in the flow. Set this state to true on "Add field Item" onClick
title:'Ex:In DarkMode, a blank square appears in bottom right corner while scrolling'
labels:['type:bug']
assignees:''
---
## Bug Description
A clear and concise description of what the current behavior is.
Please also add **screenshots** of the existing application.
**Example:**
```
In DarkMode, when scrollbar are displayed (for example on Companies page, with enough companies in the list), we see a blank square in the bottom right corner
[screenshot]
```
## Expected behavior
A clear and concise description of what the expected behavior is.
**Example:**
```
The blank square should be transparent (invisible)
```
## Technical inputs
**Example:**
```
- We are displaying custom scrollbars that disappear when the user is not scrolling. See ScrollWrapper.
about:Request technical work that does not provide any product increment (aka refactoring)
title:''
labels:['type:chore']
assignees:''
---
## Scope & Context
**Example:**
```
In previous PRs: #1667 and #1636, we have introduced a new MenuItem draggable in the dropdown and implemented a drag and drop behavior.
This is working but it would be great to refactor this into separated components so we can re-use them.
```
## Technical inputs
A clear and detailed description of what the expected change is.
Describe components, files and folders that should be touch and how.
Using a Task list can be helpful
**Example:**
```
Having a list that is draggable will be useful, not only in dropdown.
Create a folder @/ui/draggable-list with a DraggableList component
This component should take as prop: itemsComponents, onDragEnd((previousIndex, nextIndex) => {})
Use this component in ViewFieldsVisibilityDropdownSection (move the logic from ViewFieldsVisibilityDropdownSection to DraggableList) by passing a list of DraggableMenuItems
Add a storybook test on this list (we don't know how to actually test the draggable behavior, but we can at least make sure the component renders correctly a list of items)
Reporting any potential vulnerabilities is strongly encouraged.
If you suspect a vulnerability, please take the following steps:
- Contact the team at `security at twenty.com`.
- Include a comprehensive description of the potential vulnerability and steps to reproduce the issue, if possible. The more information you can provide, the quicker Twenty can address the problem.
You can expect a response to your initial report within one business day.
While the core team works on addressing the issue, please maintain confidentiality about the vulnerability to ensure the security of all users.
Please refrain from exploiting the vulnerability or revealing the problem to others.
While Twenty doesn't have a formal bug bounty program right now due to the project's nascent stage, rest assured that:
- You will get a response within one business day.
- Your report and all accompanying data will receive the highest level of confidentiality.
- Your contribution is greatly appreciated, and Twenty would acknowledge your role in the vulnerability fix, if you opt for identification.
- Twenty will grant you permission to publicly discuss your findings once users have had a reasonable time to apply the patch after it becomes available.
- Twenty guarantees not to pursue any legal action as long as the vulnerability is not exploited.
## Security Features
Efforts are continually made to enhance the security of the product.
If you have any recommendations or feature request that could enhance the product's security, please share them via the discussion forum.
⚠️ Note this does not apply to security vulnerabilities. If you're in doubt, then always follow the security vulnerability process
console.error('[NX]: The "installation" entry in the "nx.json" file is required when running the nx wrapper. See https://nx.dev/recipes/installation/install-non-javascript');
process.exit(1);
}
}
catch{
console.error('[NX]: The "nx.json" file is required when running the nx wrapper. See https://nx.dev/recipes/installation/install-non-javascript');
We’ve spent thousands of hours grappling with traditional CRMs like Pipedrive and Salesforce to align them with our business needs, only to end up frustrated — customizations are complex and the closed ecosystems of these platforms can feel restrictive.
We felt the need for a CRM platform that empowers rather than constrains. We believe the next great CRM will come from the open-source community. We’ve packed Twenty with powerful features to give you full control and help you run your business efficiently.
<br>
# Demo
Go to <a href="https://demo.twenty.com/">demo.twenty.com</a> and login with the following credentials:
We understand that the CRM landscape is vast. So why should you choose us?
⛓️ **Full control, Full Freedom:** Contribute, self-host, fork. Break free from vendor lock-in and join us in shaping the open future of CRM.
📊 **Data, Your Way:** The days when the role of CRM platforms was to shift manual data entries to a database are over. Now, the data is already there. CRM 2.0 should be built around your data, allowing you to access and visualize any existing sources, not forcing you to retrofit your data into predefined objects on a remote cloud.
🎨 **Effortlessly Intuitive:** We set out to create something that we ourselves would always enjoy using. The main application draws inspiration from Notion, a tool known for its user-friendly interface and customization capabilities.
<br>
<br>
# What You Can Do With Twenty
We're currently in the development phase of Twenty's alpha version.
Please feel free to flag any specific need you have need by creating an issue.
Below are some features we have implemented to date:
+ [Add, filter, sort, edit, and track customers](#add-filter-sort-edit-and-track-customers)
+ [Create one or several opportunities for each company](#create-one-or-several-opportunities-for-each-company)
+ [See rich notes tasks displayed in a timeline](#see-rich-notes-tasks-displayed-in-a-timeline)
+ [Create tasks on records](#create-tasks-on-records)
+ [Navigate quickly through the app using keyboard shortcuts and search](#navigate-quickly-through-the-app-using-keyboard-shortcuts-and-search)
echo -e "\t❌ Docker is not installed or not in PATH. Please install Docker first.\n\t\tSee https://docs.docker.com/get-docker/"
exit1
fi
# Check if docker compose plugin is installed
if ! docker compose version &>/dev/null;then
echo -e "\t❌ Docker Compose is not installed or not in PATH (n.b. docker-compose is deprecated)\n\t\tUpdate docker or install docker-compose-plugin\n\t\tOn Linux: sudo apt-get install docker-compose-plugin\n\t\tSee https://docs.docker.com/compose/install/"
exit1
fi
# Check if docker is started
if ! docker info &>/dev/null;then
echo -e "\t❌ Docker is not running.\n\t\tPlease start Docker Desktop, Docker or check documentation at https://docs.docker.com/config/daemon/start/"
exit1
fi
if ! command -v curl &>/dev/null;then
echo -e "\t❌ Curl is not installed or not in PATH.\n\t\tOn macOS: brew install curl\n\t\tOn Linux: sudo apt install curl"
echo -e "\n\t⚠️ 'docker-compose' is installed but outdated. Make sure to use 'docker compose' or to upgrade 'docker-compose' to version 2.\n\t\tSee https://docs.docker.com/compose/install/standalone/\n"
fi
fi
# Catch errors
set -e
function on_exit {
# $? is the exit status of the last command executed
localexit_status=$?
if[$exit_status -ne 0];then
echo"❌ Something went wrong, exiting: $exit_status"
fi
}
trap on_exit EXIT
# Use environment variables VERSION and BRANCH, with defaults if not set
- STEP 3 (optional): Update values of the environment variables to match those of your instance for `twenty-front` and `twenty-server`. If you want to work on your local machine with the default setup from `Twenty Docs`, replace everything in the .env file with the following.
```
VITE_SERVER_BASE_URL=http://localhost:3000
VITE_FRONT_BASE_URL=http://localhost:3001
```
- STEP 4: Now, execute the following command in the root directory to start up the development server on Port 3002. This will create a `dist` folder in `twenty-chrome-extension`.
```
npx nx start twenty-chrome-extension
```
- STEP 5: Open Google Chrome and head to the extensions page by typing `chrome://extensions` in the address bar.
To install the extension in production mode without hmr (hot module reload), replace the command in STEP FOUR with `npx nx build twenty-chrome-extension`. You may or may not want to execute STEP THREE based on your requirements.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.