Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat] Implement magic login #8387

Merged
merged 14 commits into from
Oct 13, 2024
Merged

[Feat] Implement magic login #8387

merged 14 commits into from
Oct 13, 2024

Conversation

adkif
Copy link
Contributor

@adkif adkif commented Oct 11, 2024

PR

Please note: we will close your PR without comment if you do not check the boxes above and provide ALL requested information.


L👀M: https://www.loom.com/share/23d96f1728bd4769a7cbb69e059d885e?sid=f7157bea-7fab-4a7e-8b25-d58e169a949e

Summary by CodeRabbit

  • New Features

    • Introduced a magic link login feature with a dedicated component for user authentication.
    • Added a workspace selection component to facilitate user navigation between workspaces.
    • Implemented a debounce click directive to enhance click event handling.
    • Added an avatar component for displaying user avatars with customizable properties.
  • Enhancements

    • Updated routing configuration to utilize lazy loading for improved performance.
    • Enhanced style preprocessing for the desktop timer project to include additional style paths.
    • Improved module structure for better organization of components and imports.
  • Bug Fixes

    • Streamlined authentication route handling to improve user experience.
  • Documentation

    • Updated module structure to better manage shared components and imports.
  • Style

    • Introduced new styles for login interfaces, workspace selection, and avatar components, enhancing visual consistency.

@adkif adkif requested review from evereq and rahul-rocket October 11, 2024 07:07
Copy link
Contributor

coderabbitai bot commented Oct 11, 2024

Walkthrough

The pull request includes significant modifications to the Angular workspace configuration and the implementation of various components aimed at enhancing user authentication features. Key changes involve updating the angular.json for style preprocessing, refactoring routing in the desktop-timer application to utilize lazy loading, and introducing new components such as NgxLoginMagicComponent and NgxMagicSignInWorkspaceComponent. Additionally, new directives and templates are added to improve user interaction during the login process, along with a new AvatarComponent for displaying user avatars.

Changes

File Change Summary
angular.json Updated stylePreprocessorOptions.includePaths for desktop-timer project to include additional styles path.
apps/desktop-timer/src/app/app-routing.module.ts Refactored routes to remove direct component references for authentication, introduced lazy loading for auth, time-tracker, and settings paths.
packages/desktop-ui-lib/src/lib/auth/auth.routes.ts Added authRoutes for authentication module with defined routes for login, register, etc.
packages/desktop-ui-lib/src/lib/auth/index.ts Added export for auth.routes and reordered export statements.
packages/desktop-ui-lib/src/lib/directives/debounce-click.directive.ts Introduced DebounceClickDirective for managing click events with a debounce mechanism.
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html Added HTML template for magic link login interface with reactive forms.
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss New SCSS file defining styles for the magic login component.
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts Introduced NgxLoginMagicComponent for handling magic link login process with reactive forms.
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html Added HTML template for workspace selection interface.
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss New SCSS file for styling the workspace selection component.
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts Introduced NgxLoginWorkspaceComponent for managing user authentication within a workspace context.
packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.html Added conditional rendering for workspace selection and feedback messages.
packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss New SCSS file for styling the magic login workspace component.
packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.ts Introduced NgxMagicSignInWorkspaceComponent for handling magic link sign-in process.
packages/desktop-ui-lib/src/lib/login/login.module.ts Updated NgxLoginModule to include new components and improve form handling capabilities.
packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.html Added HTML template for workspace selection component.
packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss New SCSS file for styling the workspace selection component.
packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.ts Introduced WorkspaceSelectionComponent for selecting workspaces.
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.html Added HTML template for avatar component.
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss New SCSS file defining styles for the avatar component.
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.ts Introduced AvatarComponent for displaying user avatars with customizable properties.
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.module.ts Created AvatarModule to declare and export AvatarComponent.

Possibly related PRs

Suggested reviewers

  • evereq
  • rahul-rocket

Poem

🐰 In the code, new paths we weave,
With magic links, users believe.
A workspace to choose, a login so bright,
With avatars shining, all feels just right!
Clicks now debounced, smooth as can be,
In this Angular world, hop along with glee! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 36

🧹 Outside diff range and nitpick comments (38)
packages/desktop-ui-lib/src/lib/auth/index.ts (1)

3-5: Export order changed

The order of exports has been modified, with services now exported after auth.routes. While this doesn't affect functionality directly, it's worth noting for consistency.

Consider maintaining a consistent order for exports across similar files in the project. If there's a specific reason for this order (e.g., dependency requirements), it might be helpful to add a comment explaining the rationale.

packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss (3)

8-18: Consider relative sizing for .message-container

The styling for .message-container looks good overall. The use of flexbox and theme variables is appropriate. However, consider using relative sizing instead of 100% width and height to ensure better responsiveness across different screen sizes.

You might want to consider changing the width and height to use relative units or max-width/max-height:

 .message-container {
     display: flex;
     flex-direction: column;
     justify-content: space-between;
     background: nb-theme(gauzy-card-2);
     border-radius: nb-theme(border-radius);
     box-sizing: border-box;
     padding: 30px;
-    width: 100%;
-    height: 100%;
+    max-width: 100%;
+    min-height: 100%;
 }

20-30: Consider using theme variables for colors

The styling for titles, subtitles, and error messages looks good. The visual hierarchy is well-defined with different font sizes and weights.

Consider using theme variables for colors to maintain consistency across the application:

 .error .title {
-    color: #FF4040;
+    color: nb-theme(color-danger-default);
 }
 .title {
     font-weight: 600;
     font-size: 1.1rem;
 }
 .sub-title {
     font-size: .8rem;
-    color: var(--text-hint-color);
+    color: nb-theme(text-hint-color);
 }

35-38: Consider using relative units for icon sizing

The icon styling looks good, providing a consistent size and spacing.

For better scalability across different screen sizes, consider using relative units:

 .icon {
-    font-size: 24px;
-    margin-right: 15px;
+    font-size: 1.5rem;
+    margin-right: 1rem;
 }
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.html (2)

1-12: LGTM! Consider adding alt text for accessibility.

The structure and conditional rendering in this section are well-implemented. The use of ngIf and ngClass directives is appropriate for dynamic content and styling.

Consider adding an alt attribute to the <img> tag for better accessibility:

-<img class="rounded-circle" type="user" [src]="src" />
+<img class="rounded-circle" type="user" [src]="src" [alt]="name || 'User avatar'" />

13-17: LGTM! Consider using consistent element types.

The conditional rendering for the name section is well-implemented. The use of ng-container to avoid unnecessary DOM elements is a good practice.

For consistency, consider using the same element type (e.g., <span>) for both cases and control the clickability through CSS:

<ng-container *ngIf="name">
-  <a *ngIf="!isOption" class="link-text" [title]="name">{{ name }}</a>
-  <div *ngIf="isOption">{{ name }}</div>
+  <span [class.link-text]="!isOption" [attr.title]="!isOption ? name : null">{{ name }}</span>
</ng-container>

This approach maintains consistent markup while still allowing for different styles and behaviors.

packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.html (2)

3-9: LGTM: Workspace selection template is well-structured.

The ngx-workspace-selection component is properly implemented with correct input bindings and event handling. The code is clean and follows Angular best practices.

Consider adding a comment above the ngx-workspace-selection component to briefly explain its purpose, which could improve code readability:

<!-- Workspace selection component for user to choose a workspace -->
<ngx-workspace-selection
  [workspaces]="workspaces"
  [confirmedEmail]="confirmedEmail"
  (selectedWorkspace)="signInWorkspace($event)"
></ngx-workspace-selection>

11-33: LGTM: Message display template is well-implemented with proper error and success handling.

The template effectively handles both error and success scenarios, using appropriate structural directives and translations. The inclusion of the logo component adds a nice visual touch.

For consistency and to avoid potential styling issues, consider wrapping the thanking text in a class similar to the error and success messages:

<!-- Thanking text -->
<div class="message">
  <p class="thanking-text">{{ 'WORKSPACES.THANKING_TEXT' | translate }}</p>
</div>

This change would make it easier to apply consistent styling across all message types.

packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.html (4)

1-9: LGTM! Consider adding ARIA labels for improved accessibility.

The header section is well-structured and provides a clear, friendly welcome message along with instructions for workspace selection. The use of the gauzy-logo component adds visual identity to the page.

Consider adding ARIA labels to improve accessibility, especially for the logo:

- <gauzy-logo></gauzy-logo>
+ <gauzy-logo aria-label="Gauzy logo"></gauzy-logo>

10-15: LGTM! Consider handling long email addresses.

The card header effectively uses Nebular components and clearly indicates the required action. Displaying the confirmed email provides good context for the user.

Consider adding a CSS class to handle potential overflow for long email addresses:

- <span class="sub-title">{{ confirmedEmail }}</span>
+ <span class="sub-title email-overflow">{{ confirmedEmail }}</span>

Then, in your CSS file:

.email-overflow {
  max-width: 200px; /* Adjust as needed */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: inline-block;
  vertical-align: bottom;
}

16-50: LGTM! Consider accessibility and error handling improvements.

The workspace list section is well-structured and provides comprehensive information for each workspace. The use of debounceClick and throttledClick is a good practice to prevent accidental double-clicks.

Consider the following improvements:

  1. Add aria-label to the list for better accessibility:
- <nb-list>
+ <nb-list aria-label="List of available workspaces">
  1. Add alt text to the workspace logo:
- <img [src]="workspace.user?.tenant?.logo" />
+ <img [src]="workspace.user?.tenant?.logo" [alt]="workspace.user?.tenant?.name + ' logo'" />
  1. Consider adding error handling for missing images:
- <img [src]="workspace.user?.tenant?.logo" [alt]="workspace.user?.tenant?.name + ' logo'" />
+ <img [src]="workspace.user?.tenant?.logo" [alt]="workspace.user?.tenant?.name + ' logo'" (error)="handleImageError($event)" />
  1. Add a title attribute to the continue button for better tooltip support:
- <div class="continue-icon">
+ <div class="continue-icon" [title]="'Continue to ' + workspace.user?.tenant?.name">

3-3: LGTM! Consider adding inline documentation for custom components and directives.

The use of custom components (gauzy-logo, ngx-avatar) and the custom directive (*gauzySpinnerButton) contributes to a consistent and dynamic UI. They are applied appropriately in the context of the workspace selection interface.

To improve maintainability and ease onboarding for new developers, consider adding brief inline comments explaining the purpose and key properties of these custom elements. For example:

<!-- gauzy-logo: Displays the application logo -->
<gauzy-logo></gauzy-logo>

<!-- ngx-avatar: Renders user avatar with name fallback -->
<ngx-avatar
  [name]="workspace.user?.name"
  [src]="workspace.user?.imageUrl"
  class="workspace"
></ngx-avatar>

<!-- gauzySpinnerButton: Shows loading state on button click -->
<nb-icon
  status="primary"
  icon="arrow-forward-outline"
  *gauzySpinnerButton="workspace.token === selected?.token"
  [options]="{ animation: { type: 'shake' } }"
></nb-icon>

Also applies to: 32-36, 45-45

packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.ts (1)

60-66: Consider enhancing type safety in selectWorkspace method.

While the guard clause is a good practice, consider using a more specific type check to ensure workspace is of type IWorkspaceResponse.

Here's a suggested improvement:

selectWorkspace(workspace: IWorkspaceResponse | null) {
  if (!workspace || !('id' in workspace)) {
    return; // Exit if no workspace or if it doesn't match IWorkspaceResponse structure
  }
  this.selected = workspace;
  this.selectedWorkspace.emit(workspace);
}

This change adds a runtime check to ensure the workspace object has an id property, which is likely a key property of IWorkspaceResponse.

packages/desktop-ui-lib/src/lib/login/login.module.ts (2)

28-33: Good refactoring of shared components.

The introduction of the shared array improves code organization by consolidating components that are both declared and exported. This approach enhances maintainability and readability.

Consider adding a brief comment above the shared array to explain its purpose, e.g.:

// Components to be both declared and exported in the module
const shared = [
  // ... (existing components)
];

57-57: Good simplification of exports.

Using the shared array in the exports ensures consistency between declarations and exports for the shared components. This approach reduces the chance of discrepancies and improves maintainability.

For improved clarity, consider explicitly spreading the array in the exports:

exports: [...shared]

This makes it immediately clear that multiple items are being exported, even though the current syntax is technically correct.

packages/desktop-ui-lib/src/lib/auth/auth.routes.ts (5)

30-34: Register route is correctly set up.

The use of Nebular's NbRegisterComponent is appropriate, and the NoAuthGuard is correctly applied. However, consider implementing a custom registration component if application-specific logic is required.

If you need custom registration logic, consider replacing NbRegisterComponent with a custom component, similar to how NgxLoginComponent is used for the login route.


39-43: Request password route is properly set up.

The use of Nebular's NbRequestPasswordComponent is appropriate, and the NoAuthGuard is correctly applied. However, consider implementing a custom component if application-specific password request logic is required.

If you need custom password request logic, consider replacing NbRequestPasswordComponent with a custom component, similar to how NgxLoginComponent is used for the login route.


44-48: Reset password route is correctly configured.

The use of Nebular's NbResetPasswordComponent is appropriate, and the NoAuthGuard is correctly applied. However, consider implementing a custom component if application-specific password reset logic is required.

If you need custom password reset logic, consider replacing NbResetPasswordComponent with a custom component, similar to how NgxLoginComponent is used for the login route.


49-56: Login workspace route is well-configured, but contains unnecessary comments.

The use of NgxLoginWorkspaceComponent and the application of NoAuthGuard are correct. However, the comments explaining the route configuration are redundant and can be removed to improve code cleanliness.

Consider removing the unnecessary comments on lines 50, 52, and 55. The code is self-explanatory, and these comments don't add value.


57-72: Magic login routes are well-configured, but contain unnecessary comments and potential for consolidation.

The use of custom components (NgxLoginMagicComponent and NgxMagicSignInWorkspaceComponent) and the application of NoAuthGuard are correct. However, there are a few points to consider:

  1. The comments explaining the route configuration are redundant and can be removed to improve code cleanliness.
  2. Having two separate routes for magic login ('login-magic' and 'magic-sign-in') might be unnecessary. Consider if these functionalities can be consolidated into a single route.

Remove the unnecessary comments on lines 58, 60, 62, 66, 68, and 70. The code is self-explanatory, and these comments don't add value.

Evaluate if the 'login-magic' and 'magic-sign-in' routes can be consolidated into a single route. If they serve distinct purposes, consider adding comments explaining the difference between these two magic login routes to improve code clarity.

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss (4)

5-25: LGTM: Well-structured wrapper styles with good use of theming.

The use of flexbox for layout and theme variables for styling is commendable. The nested selectors are well-organized, providing clear structure to the styles.

Consider using consistent units for spacing. For example, line 13 uses 1rem, while line 16 and 17 use 15px. For better maintainability, you might want to stick to one unit type or use SCSS variables for spacing.


27-50: LGTM with suggestions: Title and subtitle styles are well-defined.

The styles for the title and subtitle provide a consistent look. The use of CSS variables for colors is good for theming.

Consider the following improvements:

  1. For better responsiveness, replace the fixed width of the subtitle (line 39) with a percentage or max-width.
  2. Use SCSS nesting to group the title and subtitle styles under the wrapper class, improving readability and reducing selector specificity.

Example refactor:

.-wrapper {
  // ...existing styles...

  .title {
    // ...existing styles...
  }

  .sub-title {
    max-width: 358px;
    // ...other existing styles...
  }
}

52-87: LGTM: Form styles are well-structured and use mixins effectively.

The form styles are well-organized, providing consistent spacing and alignment. The use of mixins for common styles like horizontal dividers and the submit button is excellent for maintainability.

Consider using SCSS variables for common values like font sizes and colors to improve maintainability. For example:

$label-font-size: 11px;
$label-color: #7e7e8f;

.label {
  font-size: $label-font-size;
  color: $label-color;
  // ...other styles...
}

89-112: LGTM with suggestions: Redirect link styles are well-defined.

The styles for the redirect link provide a clear distinction between regular text and the link. The removal of the default underline on the link allows for custom styling.

Consider the following improvements:

  1. Remove the commented line (line 95) as it doesn't provide any value.
  2. Use SCSS nesting to improve readability and reduce selector specificity:
.redirect-link-p {
  // ...existing styles...

  .text-link {
    // ...existing styles...
  }
}
  1. Consider using CSS variables or SCSS variables for colors to improve maintainability and consistency with the rest of the styles.
packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss (3)

1-33: LGTM! Consider adding responsive adjustments.

The main container and logo styles are well-structured and use CSS variables effectively. The flexbox layout and typography settings create a clear visual hierarchy.

Consider adding media queries for better responsiveness on smaller screens. For example:

@media (max-width: 768px) {
  .logo {
    h4 {
      font-size: 20px;
    }
    p {
      font-size: 14px;
    }
  }
}

57-114: Excellent list item styling with room for enhancement.

The nb-list-item styles are well-crafted, providing clear visual feedback on hover and maintaining a consistent layout. The use of flexbox for the workspace container is appropriate.

Consider extracting some of the nested styles into separate classes to improve readability and reusability. For example:

.workspace-list-item {
  // ... existing styles ...

  &:hover {
    // ... existing hover styles ...
  }
}

.workspace-image {
  // ... existing styles ...
}

.workspace-info {
  // ... existing styles ...
}

.continue-icon {
  // ... existing styles ...
}

This approach can make the styles more modular and easier to maintain.


1-125: Overall, well-structured and maintainable styles.

The SCSS file for the workspace-selection component is well-organized and makes good use of modern CSS features such as flexbox and CSS variables. The styles are appropriate for the component's purpose and provide a clear visual hierarchy.

To further improve the file:

  1. Consider breaking down the styles into smaller, reusable components or mixins.
  2. Implement a naming convention like BEM (Block Element Modifier) for more structured and predictable class names.
  3. Add comments to explain the purpose of complex selectors or nested rules.
  4. Ensure all colors and sizes are using variables for consistency across the application.

These suggestions will enhance maintainability and scalability as the component evolves.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (1)

1-27: LGTM! Consider adding ARIA labels for improved accessibility.

The structure and implementation of the main container and header section are well-organized. The use of translations and conditional rendering is appropriate.

Consider adding ARIA labels to improve accessibility, especially for the logo and theme switcher components. For example:

<gauzy-logo aria-label="Company logo"></gauzy-logo>
<gauzy-switch-theme aria-label="Switch theme"></gauzy-switch-theme>
packages/desktop-ui-lib/src/lib/directives/debounce-click.directive.ts (1)

38-38: Add a null check before unsubscribing

To prevent potential runtime errors if the subscription was never initialized, add a null check before calling unsubscribe().

Apply this change:

-    this.subscription.unsubscribe();
+    if (this.subscription) {
+        this.subscription.unsubscribe();
+    }
apps/desktop-timer/src/app/app-routing.module.ts (1)

Line range hint 28-31: Avoid using both 'component' and 'loadChildren' in the same route

In the route configurations for 'time-tracker' and 'settings', both component and loadChildren are specified. Angular routing does not support using both component and loadChildren in the same route definition. This can lead to unexpected behavior as the router cannot render a component and load child routes simultaneously.

To fix the routing configuration, you should remove the component property if you're lazy loading child routes:

For the 'time-tracker' route, remove the component property:

 {
     path: 'time-tracker',
-    component: TimeTrackerComponent,
     canActivate: [AppModuleGuard, AuthGuard],
     loadChildren: () => import('@gauzy/desktop-ui-lib').then((m) => m.recapRoutes)
 },

For the 'settings' route, remove the component property:

 {
     path: 'settings',
-    component: SettingsComponent,
     loadChildren: () => import('@gauzy/desktop-ui-lib').then((m) => m.pluginRoutes)
 },

Ensure that the routes within the lazy-loaded modules handle the display of the necessary components.

Also applies to: 42-45

packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.ts (2)

44-50: Simplify the name property using a public input

The private _name field with corresponding getter and setter adds unnecessary complexity if there's no additional logic. You can simplify the code by using a public @Input() property.

Simplify the name property:

-private _name: string;
-@Input() set name(value: string) {
-    this._name = value;
-}
-get name(): string {
-    return this._name;
-}
+@Input() name: string;

14-19: Provide default values for optional @Input() properties

Properties like src, caption, id, and others might be undefined if not provided. Consider adding default values or handling null cases to prevent potential runtime errors.

For example, you can set default values:

@Input() src: string = 'default-avatar.png';
@Input() caption: string = 'Unknown User';
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (1)

59-60: Ensure consistent use of translation key namespaces

The translation keys for the password field use the 'LOGIN_PAGE' namespace (e.g., 'LOGIN_PAGE.LABELS.PASSWORD'), while other fields use the 'WORKSPACES' namespace (e.g., 'WORKSPACES.LABELS.EMAIL'). For consistency and maintainability, consider aligning all translation keys under the same namespace unless there's a specific reason for the difference.

Also applies to: 70-70, 92-93

packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.ts (1)

40-42: Redundant Check for email and code in tap Operator

The preceding filter operators already ensure that email and code are present. The if (email && code) check inside the tap operator is redundant.

You can simplify the tap operator by removing the redundant check:

tap(({ email, code }: Params) => {
  this.confirmSignInCode();
}),
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (1)

111-113: Correct typo in comment

There's a typo in the comment on line 112: "Exit if the no workspace". It should be "Exit if there is no workspace or confirmed email".

Apply this diff:

		if (!workspace || !this.confirmedEmail) {
-			return; // Exit if the no workspace
+			return; // Exit if there is no workspace or confirmed email
		}
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (2)

151-160: Check for email presence before starting the timer.

In the onResendCode() method, the timer is started before verifying if the email is present. If the email is not provided, the method returns without resending the code, but the timer continues running, which could confuse users.

Consider checking if the email is present before starting the timer to ensure the timer only runs when a resend attempt is made.

Apply this diff to adjust the code:

 async onResendCode(): Promise<void> {
-    // Start the timer
-    this.startTimer();

     // Get the email value from the form
     const email = this.form.get('email').value;

     // Check if email is present
     if (!email) {
         return;
     }

+    // Start the timer
+    this.startTimer();

177-177: Avoid using console.error for error logging in production code.

The use of console.error in production code is discouraged as it may expose sensitive information and is not a best practice for error handling.

Use the existing ErrorHandlerService to handle and log errors consistently across the application.

Apply this diff to replace the console statement:

-    console.error('Error while resending sign-in code:', error);
+    this._errorHandlingService.handleError(error);
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1)

4-10: Ensure consistent gap and alignment in .inner-wrapper

The .inner-wrapper class sets gap: 8px; and align-items: center;. Verify that these values align with the overall design specifications and are consistent across different contexts.

Review the design guidelines to ensure the gap and align-items properties meet the intended layout requirements.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 1d0475a and 8bb4076.

📒 Files selected for processing (23)
  • angular.json (1 hunks)
  • apps/desktop-timer/src/app/app-routing.module.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/auth/auth.routes.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/auth/index.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/directives/debounce-click.directive.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/directives/desktop-directive.module.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/login.module.ts (3 hunks)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.module.ts (1 hunks)
🧰 Additional context used
🔇 Additional comments (42)
packages/desktop-ui-lib/src/lib/auth/index.ts (1)

3-3: New export added for auth.routes

The addition of auth.routes export suggests that new routing functionality has been implemented for authentication. This could potentially change how authentication flows are handled in the application.

To ensure this change is properly integrated, let's verify the implementation and usage of auth.routes:

✅ Verification successful

Export of auth.routes is correctly implemented and utilized.

The auth.routes export exists in both packages/desktop-ui-lib/src/lib/auth/index.ts and packages/ui-auth/src/lib/public-api.ts, and it is properly imported as createAuthRoutes in packages/ui-auth/src/lib/auth.module.ts. No issues detected with the current implementation and usage.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation and usage of auth.routes

# Check the implementation of auth.routes
echo "Checking auth.routes implementation:"
ast-grep --lang typescript --pattern 'export const auth.routes = $_'

# Check for usage of auth.routes in the project
echo "Checking auth.routes usage:"
rg --type typescript 'auth\.routes'

Length of output: 291


Script:

#!/bin/bash
# Description: Verify the implementation and usage of auth.routes with adjusted commands

# Check the implementation of auth.routes with a refined pattern
echo "Checking auth.routes implementation with updated pattern:"
ast-grep --lang typescript --pattern 'export * from '\''./auth.routes'\'''

# Check for usage of auth.routes in .ts and .tsx files
echo "Checking auth.routes usage in TypeScript files:"
rg 'auth\.routes' --glob '*.ts' --glob '*.tsx'

Length of output: 743

packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.module.ts (4)

1-3: LGTM: Imports are correct and follow best practices.

The imports section includes all necessary modules and components for defining the AvatarModule. The use of CommonModule and the separation of the AvatarComponent into its own file are good practices in Angular development.


5-9: LGTM: NgModule decorator is well-structured and follows Angular best practices.

The NgModule configuration is correct:

  • AvatarComponent is properly declared and exported, making it available for use in other modules.
  • CommonModule is imported, providing access to essential Angular directives and pipes.
  • The module has a single responsibility, which is good for maintainability.

10-10: LGTM: AvatarModule class is correctly defined and exported.

The AvatarModule class is properly exported and follows Angular naming conventions. The empty class is appropriate as all the module configuration is handled by the NgModule decorator.


1-10: Overall, the AvatarModule is well-structured and follows Angular best practices.

The module is concise, focused, and correctly implements the necessary configuration for providing an Avatar component. To ensure completeness, it would be beneficial to verify the implementation of the AvatarComponent itself.

Let's verify the implementation of the AvatarComponent:

packages/desktop-ui-lib/src/lib/directives/desktop-directive.module.ts (4)

4-4: LGTM: Import statement for DebounceClickDirective

The import statement for DebounceClickDirective is correctly implemented, following Angular best practices with appropriate file naming and relative path.


10-10: LGTM: DebounceClickDirective added to declarations

The DebounceClickDirective is correctly added to the module's declarations array, which is necessary for Angular to recognize and use the directive within this module.


1-14: Overall assessment: Well-implemented addition of DebounceClickDirective

The changes to DesktopDirectiveModule are well-implemented and follow Angular best practices. The new DebounceClickDirective is correctly imported, declared, and exported, making it available for use within this module and in other modules that import DesktopDirectiveModule. This addition enhances the functionality of the desktop directives library.


11-11: LGTM: DebounceClickDirective added to exports

The DebounceClickDirective is correctly added to the module's exports array, making it available for use in other modules that import DesktopDirectiveModule. This aligns with the module's purpose of providing desktop directives for use across the application.

To ensure the directive is being used as intended, you may want to verify its usage across the application. Run the following script to find occurrences of the directive:

packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss (2)

1-6: LGTM: Theme import and logo styling.

The theme import and the styling for the logo look good. The use of align-self: center; ensures the logo is centered, and the top margin provides appropriate spacing.


31-34: LGTM: Thanking text styling

The styling for the thanking text is appropriate. The centered alignment and smaller font size help to differentiate it from the main content while still keeping it readable.

packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.html (2)

18-21: LGTM! Please clarify the caption order.

The conditional rendering for the caption section is well-implemented.

Could you please clarify the intended order of the captions? Currently, appendCaption is rendered before caption, which might be counterintuitive given the name "append". If this is intentional, consider renaming appendCaption to prefixCaption for clarity. If not, you may want to swap their order:

<div class="text-caption caption" *ngIf="caption">
-  <ng-container *ngIf="appendCaption">{{ appendCaption }}</ng-container>
   {{ caption }}
+  <ng-container *ngIf="appendCaption">{{ appendCaption }}</ng-container>
</div>

1-24: 🛠️ Refactor suggestion

Consider semantic HTML and ensure proper test coverage.

The overall structure of the component is well-organized and follows Angular best practices. However, there are a few suggestions for improvement:

  1. Consider using more semantic HTML5 elements. For example, you could use <figure> and <figcaption> for the avatar and its caption.

  2. The component handles multiple scenarios, which increases its complexity. Ensure that all these scenarios are properly tested.

Here's a suggestion for a more semantic structure:

<figure class="avatar-wrapper">
  <div class="avatar-content">
    <img *ngIf="src" [src]="src" [alt]="name || 'User avatar'" [ngClass]="size" class="rounded-circle">
    <span *ngIf="employee" class="status-indicator" [ngClass]="{ online: online$ | async, offline: !(online$ | async) }"></span>
  </div>
  <figcaption *ngIf="name || caption">
    <span *ngIf="name" [class.link-text]="!isOption" [attr.title]="!isOption ? name : null">{{ name }}</span>
    <span *ngIf="caption" class="text-caption">
      <ng-container *ngIf="appendCaption">{{ appendCaption }}</ng-container>
      {{ caption }}
    </span>
  </figcaption>
</figure>

To ensure the component works as expected in all scenarios, please confirm that you have comprehensive unit tests covering the following cases:

  • Avatar with and without an image
  • Avatar with and without a name
  • Avatar with and without a caption
  • Employee status indicator (online and offline)
  • Different size classes
  • Clickable and non-clickable name variants

If these tests are not in place, I can assist in generating them. Would you like help with creating these unit tests?

packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.html (2)

1-2: LGTM: Conditional rendering logic is well-implemented.

The use of ng-container with *ngIf directive for conditional rendering is a good practice in Angular. It efficiently switches between the workspace selection and message display templates based on the showPopup variable.


1-33: Overall, excellent implementation of the magic login workspace component.

The template is well-structured, utilizing Angular best practices for conditional rendering, component composition, and internationalization. It effectively handles both the workspace selection process and the display of success/error messages.

A few minor suggestions have been made to further enhance code clarity and consistency, but these are not critical issues. The component appears to be robust and should function as intended.

packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.ts (3)

1-2: LGTM: Imports are appropriate and concise.

The imports include necessary Angular decorators and an interface from the project's contracts, which is good for maintaining a clean and modular structure.


4-8: LGTM: Component decorator is well-structured.

The @component decorator is correctly implemented with appropriate metadata. The use of the 'ngx-' prefix in the selector suggests adherence to project naming conventions.


9-53: LGTM: Well-structured component with good encapsulation.

The component class is well-implemented with proper use of @input and @output decorators for component communication. The use of private properties with public getters and setters demonstrates good encapsulation practices.

packages/desktop-ui-lib/src/lib/login/login.module.ts (3)

56-56: LGTM! Declarations updated correctly.

The addition of WorkspaceSelectionComponent and the use of the spread operator for the shared array in the declarations is a clean and efficient approach. This ensures all necessary components are declared in the module.


Line range hint 1-59: Overall, good improvements to the login module.

The changes to this module enhance its functionality and improve code organization. The introduction of new components for magic login and workspace selection, along with the refactoring of shared components, contributes to a more maintainable and feature-rich login system.

Key points:

  1. New imports and components added for expanded login functionality.
  2. Improved organization with the shared array for components.
  3. Module imports updated to support new features.
  4. Minor issues: redundant FormsModule import and potential clarity improvements.

Please address the redundant import and consider the suggested minor improvements for even better code quality.


3-3: LGTM! New imports enhance login functionality.

The additions of ReactiveFormsModule, NbListModule, AvatarModule, and new login-related components suggest an expansion of the login functionality, potentially including magic login and workspace selection features.

To ensure these new imports are utilized effectively, please run the following verification script:

Also applies to: 14-14, 18-18, 20-22, 26-26

✅ Verification successful

To address the issues with the previous verification script, please run the following corrected scripts to ensure the newly imported modules and components are properly utilized:

Please execute these scripts and provide the output for further analysis.


Verified! All newly imported modules and components are actively used within the login.module.ts and related files, ensuring the enhanced login functionality operates as intended.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of newly imported modules and components

# Test: Check for ReactiveFormsModule usage
rg --type typescript 'ReactiveFormsModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for NbListModule usage
rg --type typescript 'NbListModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for AvatarModule usage
rg --type typescript 'AvatarModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for usage of new login-related components
rg --type typescript 'NgxLoginMagicComponent|NgxLoginWorkspaceComponent|NgxMagicSignInWorkspaceComponent|WorkspaceSelectionComponent' packages/desktop-ui-lib/src/lib/login

Length of output: 542


Script:

#!/bin/bash
# Description: Verify the usage of newly imported modules and components

# Test: Check for ReactiveFormsModule usage
rg --glob '*.ts' 'ReactiveFormsModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for NbListModule usage
rg --glob '*.ts' 'NbListModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for AvatarModule usage
rg --glob '*.ts' 'AvatarModule' packages/desktop-ui-lib/src/lib/login

# Test: Check for usage of new login-related components
rg --glob '*.ts' 'NgxLoginMagicComponent|NgxLoginWorkspaceComponent|NgxMagicSignInWorkspaceComponent|WorkspaceSelectionComponent' packages/desktop-ui-lib/src/lib/login

Length of output: 2895

packages/desktop-ui-lib/src/lib/auth/auth.routes.ts (6)

1-13: Imports look good and are well-organized.

The necessary components and modules are imported correctly. The imports are grouped logically, which enhances readability.


15-19: Route structure is well-defined and follows best practices.

The authRoutes constant is correctly exported and typed. Using NbAuthComponent as the base component for authentication routes is the right approach when working with Nebular.


20-24: Default redirect is correctly implemented.

The root path redirects to the login page, which is a common and user-friendly approach. The use of pathMatch: 'full' ensures precise routing behavior.


25-29: Login route is properly configured.

The use of a custom NgxLoginComponent allows for application-specific login functionality. The NoAuthGuard correctly protects this route, ensuring only unauthenticated users can access it.


35-38: Logout route is correctly configured.

The use of Nebular's NbLogoutComponent is appropriate for handling logout functionality. The absence of a guard is correct, as logout should be accessible to authenticated users.


1-75: Overall, the auth routes are well-structured with minor improvements possible.

The file follows Angular routing best practices and correctly implements authentication routes using a mix of Nebular and custom components. All routes are properly protected with NoAuthGuard where necessary.

To further improve the code:

  1. Remove unnecessary comments throughout the file.
  2. Consider consolidating the magic login routes if possible.
  3. Evaluate the need for custom components for register, request password, and reset password functionalities.

These changes will enhance code cleanliness and potentially simplify the route structure.

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss (1)

1-4: LGTM: Imports and host selector are well-structured.

The imports for themes and shared reusable styles, along with the use of the host selector, follow good practices for Angular component styling.

packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss (1)

35-56: Well-structured card styles!

The nb-card styles are well-defined, using CSS variables for consistency. The overflow handling for the title is a good practice to prevent layout issues with long text.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (6)

155-165: LGTM! Magic description section is well-implemented.

The magic description section is correctly implemented with proper use of translations and routing.


170-178: LGTM! Registration prompt section is well-implemented.

The registration prompt section is correctly implemented with proper use of translations, routing, and accessibility attributes.


30-69: LGTM! Verify the custom directive noSpaceEdges.

The form structure and email input implementation are well-done. The use of reactive forms, validation, and conditional rendering for error messages is appropriate.

Please confirm that the noSpaceEdges directive is properly implemented and imported. This appears to be a custom directive and should be verified. You can use the following script to check its implementation:

#!/bin/bash
# Search for the noSpaceEdges directive implementation
rg --type typescript 'noSpaceEdges'

166-169: LGTM! Verify accessibility of social links component.

The inclusion of the social links component is appropriate.

Please ensure that the ngx-social-links component is implemented with proper accessibility features, such as appropriate aria labels and keyboard navigation. You can use the following script to locate the component's implementation:

#!/bin/bash
# Search for the ngx-social-links component implementation
rg --type typescript 'ngx-social-links'

121-154: LGTM! Verify custom directive and enhance accessibility for loading state.

The submit button section is well-implemented with proper conditional rendering and form validation checks.

Please confirm that the *gauzySpinnerButton directive is properly implemented and imported. This appears to be a custom directive and should be verified. You can use the following script to check its implementation:

#!/bin/bash
# Search for the gauzySpinnerButton directive implementation
rg --type typescript 'gauzySpinnerButton'

Consider adding an aria-label to the button when it's in a loading state to improve accessibility. This will help screen reader users understand that the button is currently loading. For example:

<button [attr.aria-label]="isLoading ? ('LOADING' | translate) : null">
  <!-- ... existing button content ... -->
</button>

71-119: LGTM! Verify custom directive and consider accessibility improvement.

The code input section is well-implemented with proper conditional rendering, validation, and UX features like the resend code functionality.

Please confirm that the debounceClick directive is properly implemented and imported. This appears to be a custom directive and should be verified. You can use the following script to check its implementation:

Consider adding an aria-live attribute to the countdown message for better accessibility. This will ensure screen readers announce the changing countdown. For example:

<span class="request-new-code" aria-live="polite">
  {{ 'LOGIN_PAGE.LOGIN_MAGIC.REQUEST_NEW_CODE_TITLE' | translate : { countdown: countdown } }}
</span>
angular.json (1)

1091-1094: LGTM! Improved style preprocessing configuration.

The addition of "packages/ui-core/static/styles" to the includePaths array in the stylePreprocessorOptions is a positive change. This modification allows the desktop-timer project to access styles from the ui-core package, promoting code reuse and maintaining consistency across the workspace.

apps/desktop-timer/src/app/app-routing.module.ts (2)

Line range hint 28-31: Adjust route guards as needed after modifying routes

After updating the routing configuration, ensure that the route guards (AppModuleGuard, AuthGuard) are appropriately applied within the lazy-loaded modules' routes if necessary.

You can verify the application of route guards with the following script:

#!/bin/bash
# Description: Verify that route guards are applied in the lazy-loaded modules

# Test: Search for the usage of 'canActivate' in 'recapRoutes'. Expect: Guards are set.
rg --type ts 'canActivate' -A 2 --word-regexp --fields 'file,content' --pretty '@gauzy/desktop-ui-lib' | grep -E '(recapRoutes|pluginRoutes)'

25-26: Ensure 'authRoutes' module is correctly configured for lazy loading

The loadChildren syntax for the 'auth' path is correctly set for lazy loading. Please verify that authRoutes is properly exported and that all necessary modules and dependencies are configured for lazy loading in @gauzy/desktop-ui-lib.

You can run the following script to confirm that authRoutes is exported:

✅ Verification successful

'authRoutes' is correctly exported and configured for lazy loading.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that 'authRoutes' is exported in '@gauzy/desktop-ui-lib'

# Test: Search for the export of 'authRoutes'. Expect: At least one match showing 'export const authRoutes'.
rg --type ts --files-with-matches 'export\s+const\s+authRoutes' | xargs grep -n 'export\s\+const\s\+authRoutes'

Length of output: 571


Script:

#!/bin/bash
# Description: Verify that 'authRoutes' is exported in '@gauzy/desktop-ui-lib'

# Test: Search for the export of 'authRoutes'. Expect: At least one match showing 'export const authRoutes'.
rg --type ts 'export\s+const\s+authRoutes' @gauzy/desktop-ui-lib

Length of output: 128


Script:

#!/bin/bash
# Description: Search for 'export const authRoutes' across the entire codebase.

# Test: Look for the export of 'authRoutes' in all TypeScript files. Expect: At least one match.
rg --type ts 'export\s+const\s+authRoutes'

Length of output: 133

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (1)

35-38: 🛠️ Refactor suggestion

Review the necessity of hidden input fields

The hidden input fields within the div might be unnecessary or could be handled differently. If they're intended to prevent browser autocomplete, ensure autocomplete="off" is properly set on the form and input elements. Consider removing these inputs if they serve no other purpose.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1)

220-226: Prevent potential memory leaks by ensuring the timer unsubscribes correctly.

While the untilDestroyed(this) operator is used, it's important to verify that the timer subscription is properly cleaned up to prevent any memory leaks, especially if the component can be destroyed before the timer completes.

Confirm that the @UntilDestroy decorator is correctly handling the unsubscription of the timer observable.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss (1)

189-190: Ensure spin keyframes are defined for animation

The animation: spin 1s linear infinite; declaration requires a corresponding @keyframes spin definition. Without it, the spinner will not display the intended animation.

Please confirm that the @keyframes spin is defined elsewhere or add it if missing.

packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1)

131-132: Verify LTR and RTL padding values for correctness

The use of @include nb-ltr(padding, 3px 9px 3px 3px); and @include nb-rtl(padding, 3px 3px 3px 9px); should ensure correct padding for left-to-right and right-to-left layouts.

Double-check that the padding values correspond correctly to the intended sides in both LTR and RTL contexts to prevent layout issues in different languages.

Copy link

nx-cloud bot commented Oct 11, 2024

☁️ Nx Cloud Report

CI is running/has finished running commands for commit 00583c8. As they complete they will appear below. Click to see the status, the terminal output, and the build insights.

📂 See all runs for this CI Pipeline Execution


🟥 Failed Commands
nx serve api -c=production --prod

Sent with 💌 from NxCloud.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

🧹 Outside diff range and nitpick comments (7)
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (3)

1-27: LGTM: Well-structured header with consistent translations.

The main structure and header section are well-organized, with proper use of translations and conditional rendering. The logo and theme switcher are nicely integrated.

Consider adding a comment or documentation explaining the purpose and impact of the isDemo condition on line 7.


121-160: Submit button section is well-implemented with good UX considerations.

The submit button section is nicely done with proper conditional rendering and state management. The use of debounceClick on the resend code link is a good practice to prevent multiple rapid clicks.

Consider adding an aria-label to the submit buttons to improve accessibility. For example:

 <button
   type="submit"
   nbButton
   size="tiny"
   class="submit-btn"
   [disabled]="form.invalid || isLoading"
+  [attr.aria-label]="'BUTTONS.LOGIN' | translate"
 >

This will provide better context for screen readers.


177-184: Registration prompt is clear and properly internationalized.

The registration prompt section is well-implemented with proper use of translations.

To improve accessibility, consider adding an aria-label to the registration link:

 <a class="text-link" routerLink="/auth/register"
+   [attr.aria-label]="'BUTTONS.REGISTER' | translate"
 >
   {{ 'BUTTONS.REGISTER' | translate }}
 </a>

This will provide better context for screen readers.

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (3)

45-54: Add autocomplete="email" attribute to the email input field

Including the autocomplete="email" attribute enhances user experience by allowing browsers to provide email suggestions tailored to the user.

Suggested change:

<input
	nbInput
	id="email"
	name="email"
	type="email"
+	autocomplete="email"
	[placeholder]="'WORKSPACES.PLACEHOLDERS.EMAIL' | translate"
	fullWidth
	fieldSize="large"
	formControlName="email"
/>

37-37: Verify the class attribute value

The class attribute on line 37 is set to "d-". Please verify if this is intentional or if it should be corrected (e.g., "d-none" or another valid class name).


43-60: Ensure consistent translation key namespaces

The translation keys for the email label ('WORKSPACES.LABELS.EMAIL') and the password label ('LOGIN_PAGE.LABELS.PASSWORD') use different namespaces. For better maintainability and consistency, consider aligning them under a common namespace.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1)

152-176: Add loading state management to 'onResendCode()'

The onResendCode() method currently does not manage the isLoading state, which may result in inconsistent user feedback. Consider adding loading indicators similar to those in sendLoginCode() to enhance the user experience.

Apply this diff to include loading state management:

     async onResendCode(): Promise<void> {
+        this.isLoading = true;
         // Start the timer
         this.startTimer();

         // Get the email value from the form
         const email = this.form.get('email').value;

         // Check if email is present
         if (!email) {
+            this.isLoading = false;
+            this.stopTimer();
             return;
         }

         // Send a request to sign in to workspaces using the authentication service
         await firstValueFrom(
             this._authService.sendSigninCode({ email }).pipe(
                 catchError((error) => {
                     // Handle and log errors using the error handling service
                     this._errorHandlingService.handleError(error);
+                    this.stopTimer();
+                    this.isLoading = false;
                     return EMPTY;
                 }),
+                finalize(() => {
+                    this.isLoading = false;
+                }),
                 // Handle component lifecycle to avoid memory leaks
                 untilDestroyed(this)
             )
         ); // Wait for the login request to complete
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 8bb4076 and f0eb44a.

📒 Files selected for processing (12)
  • packages/desktop-ui-lib/src/lib/directives/debounce-click.directive.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/login.module.ts (3 hunks)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • packages/desktop-ui-lib/src/lib/directives/debounce-click.directive.ts
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.scss
  • packages/desktop-ui-lib/src/lib/login/features/magic-login-workspace/magic-login-workspace.component.ts
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.scss
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.ts
🧰 Additional context used
🔇 Additional comments (12)
packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1)

1-67: LGTM: Good use of CSS variables and mixin for theming

The import statement and the avatarMixin definition look good. The use of CSS variables (--border-radius) for customization in the mixin parameters is a great practice for flexible theming.

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (3)

15-44: LGTM: Well-structured class properties and constructor

The class properties are well-defined with appropriate types, and the form property is initialized using a static method, which is a good practice. The constructor correctly injects the necessary services.


49-147: LGTM: Well-implemented authentication logic

The onSubmit and signInWorkspace methods are well-structured and handle various scenarios effectively. The use of RxJS operators for managing asynchronous flows is appropriate, and error handling is properly implemented using catchError. The loading state is managed correctly throughout the authentication process.


1-152: Summary: Well-implemented workspace login component with minor improvement suggestions

Overall, the NgxLoginWorkspaceComponent is well-structured and effectively handles the workspace login functionality. The use of reactive forms, RxJS operators, and proper error handling demonstrates good Angular practices.

Key points from the review:

  1. Removed unused UntypedFormBuilder import and updated constructor parameter.
  2. Suggested adding a minimum length validator for the password field to enhance security.
  3. Approved the well-implemented authentication logic in onSubmit and signInWorkspace methods.
  4. Recommended adding an email getter for consistency with the existing password getter.

These minor improvements will enhance the component's consistency, security, and maintainability. Great job on the implementation!

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (2)

161-175: LGTM: Magic description and social links section is well-structured.

This section provides clear information about the magic login feature and offers an alternative sign-in method. The use of a separate component for social links (ngx-social-links) promotes modularity and reusability.


1-184: Overall, excellent implementation of the magic login feature.

The magic login component is well-structured, with proper form validation, internationalization, and conditional rendering. It provides a good user experience with features like resend code functionality and clear error messages.

Summary of suggested improvements:

  1. Clarify the purpose of the isDemo condition and the edit icon functionality.
  2. Document or verify the noSpaceEdges directive.
  3. Fix the autocomplete attribute on the code input.
  4. Add aria-label attributes to buttons and links for improved accessibility.

These minor enhancements will further improve the already solid implementation.

packages/desktop-ui-lib/src/lib/login/login.module.ts (6)

50-53: New modules are properly imported

The additions of ReactiveFormsModule, SwitchThemeModule, NbListModule, and AvatarModule to the imports array are appropriate and necessary for the functionality of the new components.


3-3: Imports for form modules are correct

Including both FormsModule and ReactiveFormsModule ensures that the module supports both template-driven and reactive forms.


13-14: Nebular modules are correctly imported

The addition of NbListModule complements the existing Nebular modules, enabling new list features in your components.


20-22: New components are properly imported

The imports for NgxLoginMagicComponent, NgxLoginWorkspaceComponent, and NgxMagicSignInWorkspaceComponent are correctly added, which is essential for module declarations.


28-33: Shared components are well-organized

Grouping shared components into the shared array enhances readability and maintainability.


55-55: Declarations include all necessary components

All new and existing components, including WorkspaceSelectionComponent and the shared components, are properly declared.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Outside diff range and nitpick comments (1)
packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1)

61-75: Enhance constructor readability with consistent access modifiers.

To improve code consistency and readability, consider using private readonly for all injected dependencies that are not explicitly needed as public. This clearly communicates that these dependencies are immutable and used internally.

Apply this pattern to all injected dependencies:

constructor(
  private readonly _fb: FormBuilder,
  private readonly _activatedRoute: ActivatedRoute,
  private readonly nbAuthService: NbAuthService,
  private readonly cdr: ChangeDetectorRef,
  private readonly router: Router,
  private readonly _authService: AuthService,
  private readonly _errorHandlingService: ErrorHandlerService,
  @Inject(NB_AUTH_OPTIONS) private readonly options,
  @Inject(GAUZY_ENV) private readonly _environment: any
) {
  super(nbAuthService, options, cdr, router);
  this.isDemo = this._environment.DEMO;
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between f0eb44a and 2fc8b6a.

📒 Files selected for processing (8)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/login.module.ts (3 hunks)
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.html
  • packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.scss
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.scss
  • packages/desktop-ui-lib/src/lib/shared/components/ui/avatar/avatar.component.scss
🧰 Additional context used
🔇 Additional comments (15)
packages/desktop-ui-lib/src/lib/login/login.module.ts (6)

3-3: LGTM: Import statements updated correctly

The new import statements align well with the module's enhanced functionality. The addition of ReactiveFormsModule, NbListModule, and new components (NgxLoginMagicComponent, NgxLoginWorkspaceComponent, NgxMagicSignInWorkspaceComponent, WorkspaceSelectionComponent) supports the implementation of new features as described in the PR summary.

Also applies to: 13-14, 18-18, 20-22, 26-26


28-33: Good: Improved organization with shared array

The introduction of the 'shared' array is a good practice. It centralizes the login-related components, making the module more maintainable and easier to understand. This approach will simplify future updates to the shared components list.


50-53: LGTM: Module imports updated correctly

The new module imports (ReactiveFormsModule, SwitchThemeModule, NbListModule, AvatarModule) align well with the enhanced functionality of the login module. It's good to see that the redundant FormsModule import mentioned in the past review has been addressed, resolving that issue.


55-55: LGTM: Declarations updated correctly

The declarations array has been updated correctly. The addition of WorkspaceSelectionComponent and the use of the spread operator for the 'shared' array ensures all components are properly declared. This approach maintains clarity and allows for easy future updates.


56-56: LGTM: Exports array fixed as suggested

The exports array has been updated correctly, addressing the issue mentioned in the past review comments. Using the spread operator [...shared] ensures that all components in the 'shared' array are properly exported. This is the correct implementation and resolves the previous concern.


Line range hint 1-58: Overall: Well-structured and comprehensive update to NgxLoginModule

The changes to this module file are well-implemented and align perfectly with the PR objectives. Key improvements include:

  1. Addition of new components for magic login functionality.
  2. Proper organization of shared components.
  3. Correct updates to imports, declarations, and exports.
  4. Resolution of issues mentioned in past review comments.

These changes enhance the module's functionality while maintaining good code organization and Angular best practices. Great job on this update!

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.html (4)

1-31: LGTM: Main container and signInTemplate structure

The main container and signInTemplate section are well-structured and follow Angular best practices. The use of conditional rendering and translation pipes is consistent and appropriate. Previous issues with typos have been resolved.


33-102: LGTM: Improved signInForm structure and functionality

The signInForm section demonstrates good use of Angular's Reactive Forms, proper input validation, and enhanced user experience with the password visibility toggle. Previous issues with autocomplete attributes have been addressed, and unnecessary hidden input fields have been removed.


104-112: LGTM: Well-structured workspacesTemplate section

The workspacesTemplate section is well-organized and follows Angular best practices. The use of a custom component for workspace selection promotes modularity, and the data flow through inputs and outputs is clear and well-defined.


97-97: Verify the translation key 'BUTTONS.SIGNIN'

The translation key 'BUTTONS.SIGNIN' might not exist in the localization files. Consider changing it to 'BUTTONS.SIGN_IN' or verifying its existence in the translation files.

Run the following script to check for the translation key:

packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (4)

1-14: LGTM: Imports and component decorator are well-structured

The imports are appropriate for the component's functionality, and the component decorator is correctly implemented. The use of @UntilDestroy for automatic unsubscription is a good practice.


149-155: LGTM: Getter methods are well-implemented

The getter methods for password and email form controls are correctly implemented. They provide easy access to these form controls, which is a good practice for improved readability and maintainability.


49-94: ⚠️ Potential issue

Remove unnecessary try-catch block around asynchronous code

The try-catch block (lines 54-57) will not catch errors occurring inside the asynchronous Observable chain started by this._authService.findWorkspaces().subscribe(). Errors in Observables are already handled using the catchError operator.

You can remove the try-catch block since it's not effective here. Apply this diff:

-		try {
-			//
			this.loading = true;

			// Rest of your code...

-		} catch (error) {
-			console.log(error);
-		}

This change will simplify the code without affecting its functionality.

Likely invalid or redundant comment.


32-37: 🛠️ Refactor suggestion

Consider adding a minimum length validator for the password field

While the form structure is correct, it's recommended to enhance the security of the password field by adding a minimum length validator. This ensures that users create passwords that meet a basic security standard.

Apply this diff to add a minimum length validator:

 static buildForm(fb: FormBuilder): FormGroup {
   return fb.group({
     email: new FormControl(null, [Validators.required, Validators.email]),
-    password: new FormControl(null, [Validators.required])
+    password: new FormControl(null, [Validators.required, Validators.minLength(8)])
   });
 }

This change sets a minimum password length of 8 characters, which is a common security practice. Adjust the length as per your application's security requirements.

Likely invalid or redundant comment.

packages/desktop-ui-lib/src/lib/login/features/login-magic/login-magic.component.ts (1)

1-240: Overall assessment: Well-implemented component with room for refinement.

The NgxLoginMagicComponent is generally well-structured and implements the magic login functionality effectively. However, there are several opportunities for improvement:

  1. Moving form building logic to a separate service.
  2. Enhancing constructor readability with consistent access modifiers.
  3. Using the async pipe for query params subscription.
  4. Refactoring common logic in sendLoginCode and onResendCode methods.
  5. Enhancing error handling in the confirmSignInCode method.

Implementing these suggestions will improve the component's maintainability, readability, and robustness. Great job on the initial implementation, and these refinements will take it to the next level!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (4)
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (4)

16-24: LGTM: Well-structured class properties with a suggestion.

The class properties are well-defined and appropriate for managing the component's state. The use of a static buildForm method is a good practice for form initialization.

Consider adding JSDoc comments for the public properties to improve code documentation and maintainability.


49-94: LGTM: onSubmit method is well-implemented with proper error handling.

The onSubmit method correctly handles form submission, workspace retrieval, and error scenarios. The use of RxJS operators and untilDestroyed ensures proper asynchronous operation handling and subscription management.

Consider adding a comment explaining the purpose of the 3-second delay in the asyncScheduler.schedule call on line 132.


99-147: LGTM: signInWorkspace method handles authentication flow effectively.

The signInWorkspace method properly manages the sign-in process for a specific workspace, including token-based authentication and state updates. Error handling and subscription management are well-implemented.

Consider extracting the logic inside the tap operator (lines 120-136) into a separate private method for better readability and maintainability.


1-156: Overall, the NgxLoginWorkspaceComponent is well-implemented with some suggestions for improvement.

The component demonstrates good use of Angular practices, RxJS for asynchronous operations, and proper form handling. Previous review comments have been largely addressed, improving the overall quality of the code.

To further enhance the component:

  1. Add JSDoc comments for public properties and methods to improve documentation.
  2. Consider implementing the suggested minimum length validator for the password field.
  3. Extract complex logic in the signInWorkspace method into separate private methods for better readability.
  4. Add explanatory comments for non-obvious code, such as the purpose of the 3-second delay in the asyncScheduler.schedule call.

These minor improvements will further increase the maintainability and readability of the component.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 2fc8b6a and 00583c8.

📒 Files selected for processing (2)
  • packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (1 hunks)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.html (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/desktop-ui-lib/src/lib/login/shared/ui/workspace-selection/workspace-selection.component.html
🧰 Additional context used
🔇 Additional comments (4)
packages/desktop-ui-lib/src/lib/login/features/login-workspace/login-workspace.component.ts (4)

1-7: LGTM: Imports are appropriate and previous suggestions implemented.

The imports are well-organized and include necessary Angular, RxJS, and custom modules. It's good to see the use of typed forms (FormBuilder) as suggested in a previous review.


9-14: LGTM: Component decorator is well-configured.

The use of UntilDestroy with checkProperties: true is a good practice for automatic subscription management. The component metadata is correctly specified with appropriate selector, template, and styles.


32-37: LGTM: Form building logic is sound, with a suggestion for enhancement.

The buildForm method correctly uses FormBuilder to create the form group with appropriate validators for email and password fields.

As suggested in a previous review, consider enhancing the password security by adding a minimum length validator:

password: new FormControl(null, [Validators.required, Validators.minLength(8)])

This will ensure that users create passwords that meet a basic security standard.


149-155: LGTM: Getters for form controls improve code readability.

The getters for password and email form controls are well-implemented and improve the readability of the code when accessing these controls.

@evereq evereq merged commit f8080cf into develop Oct 13, 2024
18 of 20 checks passed
@evereq evereq deleted the feat/implement-magic-login branch October 13, 2024 14:59
evereq added a commit that referenced this pull request Oct 13, 2024
* fix: #8339 employee & organization parameters to URLs

* fix: #8339 project parameters to URLs

* fix: #8339 date range picker parameters to URLs

* fix: #8339 project parameters to URLs

* fix: don't merge new config with old default config

* fix: don't merge new config with old default config

* fix: organization controller and module improvement

* feat: add standardWorkHoursPerDay column to organization entity

* feat: #8341 add standardWorkHoursPerDay column migration to organization entity

* feat: #8341 add standardWorkHoursPerDay column migration to organization table

* feat: #8341 add standardWorkHoursPerDay column migration to tenant table

* fix: create/update standard work hours per day

* feat: get task by view query model

* feat: get task by view query DTO

* feat: get tasks by view filter API

* fix: save standard work hours per day for organization

* fix: get tasks by view filters

* fix: remove unused DTO

* chore(deps): add chartjs-plugin-annotation

chore: add chartjs-plugin-annotation package for annotation support in charts

* fix: organization ID filter in query

* feat: add translations for Standard Work Hours

* feat: #8341 added horizontal dotted line

* fix(deepscan): removed unused import

* fix(coderrabitai): improve types and finders

* fix: sprint DELETE role permission

* fix: improve sprints role permissions

* fix: #8340 clear data before loading on report pages

* fix: issue type value using enum

* fix(deepscan): removed unused import

* feat: #8339 bookmark query params builder resolver

* [Feat] Add new workspace's methods to desktop authentication service (#8375)

* feat: add new methods to service

* feat: remove unecessary try-catch blocks and type annotations for return values in AuthService methods.

* [Feat] Create Reusable Component and Add Workspace Links (#8383)

* feat: export social links

* feat: create a shared logo component

* feat: create a shared social links component

* feat: add reusable patterns to constants

* feat: add link to magic workspace signin and use reusable logo, links and switch

* feat: SwitchThemeModule, LogoComponent, and SocialLinksComponent to NgxLoginModule

* fix(cspell): typo spelling :-)

* fix: improvement suggested by CodeRabbit

* fix: improvement suggested by CodeRabbit

* fix: improvement suggested by CodeRabbit

* fix: task type enum swagger

* fix: issue type enum

* feat: #8386 add module and entity for global logging of API

* feat: #8386 add repository and subscriber for global logging of API

* feat: #8386 table migration for "api_call_log" table

* fix: #8386 circular dependency injection in repository

* [Fix] Edit team functionality not working

* feat: #8386 retrieves call logs API

* fix(deepscan): property is accessed without null check

* fix: missing role-permission module

* fix: better encapsulation and reducing coupling between modules

* fix: task view not found update command handler

* [Fix] Filters not working

* fix: #8386 added origin into `api_call_log`  table

* [Feat] Implement magic login (#8387)

* feat: create reusable workspace selection component

* feat: create debounce click directive

* feat: create reusable avatar component

* feat: implement login magic component

* feat: implement login magic workspace component

* feat: implement login workspace component

* feat: reuse shared core styles

* feat: add new component to login

* feat: create authentication routes

* feat: use lazy loading for authentications routes

* fix: add code rabbit suggestions

* fix: apply code rabbit suggestions

* fix: apply code rabbit suggestions

* [Fix] Task deselect on refresh (#8392)

* fix: task deselect on refresh

* fix: add `organizationTeamId` missing property to time tracker API request and spread `arg.timer` into the request object.

* fix: apply code rabbit suggestion

* [Fix] Edit contact for (client,customers,leads) functionality not working  (#8393)

* [Fix] Edit contact for (client,customers,leads) functionality not working

* Remove member deletion

* [Fix] Remote timer logic stop calls (#8394)

* fix: remote timer logic and stopTimer calls

* refactor: remote timer logic

* [Feat] Resource Link Entity (#8397)

* feat: add resource link model and entity

* feat: resource link migration

* [Feat] Resource Link API (#8399)

* feat: add resource link model and entity

* feat: resource link migration

* feat: add resource link service

* feat: resource link commands

* feat: add resource link handlers

* feat: add resource link subscriber

* feat: add resource link controller and DTO

* chore: desktop builds on Windows

---------

Co-authored-by: Rahul R. <rahulrathore576@gmail.com>
Co-authored-by: GloireMutaliko21 <mufunyig@gmail.com>
Co-authored-by: Kifungo A <45813955+adkif@users.noreply.github.com>
Co-authored-by: samuelmbabhazi <samuelmbabhazi@gmail.com>
Co-authored-by: samuel mbabhazi <111171386+samuelmbabhazi@users.noreply.github.com>
Co-authored-by: Gloire Mutaliko (Salva) <86450367+GloireMutaliko21@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants