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: QBD direct main connection page business logic #1066

Merged

Conversation

DhaaraniCIT
Copy link
Contributor

@DhaaraniCIT DhaaraniCIT commented Nov 11, 2024

Description

feat: QBD direct main connection page business logic

Clickup

https://app.clickup.com/t/86cwzcepr

Screen.Recording.2024-11-13.at.12.12.20.PM.mov

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a structured onboarding process for QuickBooks Direct (QBD) configurations, enhancing user interactions and visibility of loading states.
    • Added new components for downloading files, setting up connections, and data synchronization with improved user experience.
    • Enhanced confirmation dialog with dynamic content based on application state.
  • Improvements

    • Enhanced data handling by transitioning from single instances to arrays for better management of synchronization attributes.
    • Updated HTML templates for various components to improve conditional rendering and user feedback.
    • Improved initialization logic for dynamic branding in confirmation dialogs.
  • Bug Fixes

    • Improved validation logic and error handling in the download file component.
    • Corrected naming inconsistencies in onboarding state management.
  • Refactor

    • Streamlined component logic and state management across onboarding and data synchronization components.

Copy link
Contributor

coderabbitai bot commented Nov 11, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

This pull request introduces significant changes to the QBD Direct integration within the application. Key modifications include an updated SyncDataType definition to enforce a stricter schema, the introduction of the QbdDirectConnectorService for backend interactions, and a comprehensive restructuring of various components and their templates to enhance the onboarding process and data synchronization. Additionally, several test files were renamed or removed to reflect these changes.

Changes

File Change Summary
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts Updated SyncDataType from `{ [key: string]: number
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts Renamed test suite from xdescribe('QbdDirectConnectorService', ...) to describe('QbdDirectConnectorServiceTsService', ...).
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts Added QbdDirectConnectorService class with methods postQbdDirectConntion and syncAttribuites.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.spec.ts Removed test file for QbdDirectConnectorServiceTsService.
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.ts Removed QbdDirectConnectorServiceTsService class.
src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts Removed QbdDirectConnectorService class.
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html Restructured HTML with onboarding stepper and dynamic components based on loading states.
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts Updated component to implement OnInit and added various properties and methods for onboarding.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html Modified HTML for conditional rendering and data binding logic based on showSection.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts Updated qbdFields to an array of SyncDataType and added showSection input property.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html Enhanced UI with updated error handling and button click events.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts Specified downloadClick output event emitter type as EventEmitter<string>.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html Conditionally rendered elements based on showSection and isStepCompleted.
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts Added showSection input property to enhance configurability.

Possibly related PRs

  • fix: intacct prepend code field fix #1011: This PR addresses an issue related to the Intacct prepend code field, which may be relevant as it involves changes to data handling similar to the modifications made to the SyncDataType in the main PR.
  • fix: qbd back end fixes #1049: This PR introduces backend fixes for the QBD integration, which could relate to the changes in data structure and handling in the main PR, particularly regarding how data types are processed.
  • feat: qbd direct connector setup connector ts changes #1064: This PR enhances the TypeScript setup for the QBD direct connector, which is directly related to the changes made in the main PR regarding the SyncDataType and its usage in the QBD context.

Suggested labels

deploy, size/M

Suggested reviewers

  • ashwin1111

🐇 In the meadow, changes bloom bright,
With QBD's path now set just right.
SyncDataType's form, more clear and neat,
Onboarding flows, a rhythmic beat.
With services ready, let’s hop and play,
A new dawn for QBD, hip-hip-hooray! 🌼


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.

@github-actions github-actions bot added the size/L Large PR label Nov 11, 2024
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: 19

🧹 Outside diff range and nitpick comments (23)
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts (2)

Line range hint 7-10: Configure TestBed with required dependencies.

The empty TestBed configuration might be insufficient. Consider adding necessary providers and dependencies for proper service testing.

 beforeEach(() => {
-  TestBed.configureTestingModule({});
+  TestBed.configureTestingModule({
+    providers: [
+      QbdDirectConnectorService,
+      // Add other required dependencies like HttpClient, etc.
+    ]
+  });
   service = TestBed.inject(QbdDirectConnectorService);
 });

Line range hint 11-14: Add test coverage for service methods.

The test suite only verifies service creation. Based on the AI summary, tests are missing for critical methods like postQbdDirectConntion and syncAttribuites.

Would you like me to help generate test cases for these methods? This would include:

  • Testing successful API calls
  • Testing error handling
  • Verifying correct data transformation
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts (1)

29-30: Consider adding JSDoc comments.

Adding documentation about the purpose of these fields and their expected values would improve maintainability.

+/**
+ * Represents synchronization data for QBD attributes
+ * @property {string} attribute_type - The type of attribute being synchronized
+ * @property {number | null} count - The count of items for this attribute type, null if not available
+ */
 export type SyncDataType = {
     attribute_type: string;
     count: null | number
 };
src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts (1)

17-19: Fix typo in method name: "Conntion" → "Connection"

The method implementation is correct, but there's a typo in the method name.

-  postQbdDirectConntion(payload: QbdConnectorPost): Observable<QbdConnectorGet> {
+  postQbdDirectConnection(payload: QbdConnectorPost): Observable<QbdConnectorGet> {
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (2)

16-20: Add validation for qbdFields array.

While the required decorator ensures the input is provided, consider adding validation in ngOnInit to ensure the array is not empty and contains valid SyncDataType objects.

 ngOnInit() {
+  if (!this.qbdFields?.length) {
+    throw new Error('qbdFields array cannot be empty');
+  }
   this.fieldLength = this.qbdFields.length;
 }

Line range hint 7-13: Add component documentation.

Consider adding JSDoc comments to document the component's purpose, inputs, and outputs. This would improve maintainability and help other developers understand the component's role in the QBD Direct integration.

+/**
+ * Component responsible for handling QuickBooks Desktop Direct data synchronization.
+ * Displays synchronization fields and manages the continuation flow.
+ *
+ * @input qbdFields - Array of synchronization data types to be processed
+ * @input isCTAEnabled - Controls the enabled state of the continue button
+ * @input showSection - Controls the visibility of the component section
+ * @output continueClick - Emitted when the continue action is triggered
+ */
 @Component({
   selector: 'app-qbd-direct-data-sync',
   standalone: true,
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts (1)

Line range hint 13-19: Consider adding component documentation

The component seems to be part of a multi-step process with several inputs and outputs. Adding JSDoc comments would help other developers understand its purpose and usage better.

Add documentation like this:

+/**
+ * Component for handling QBD file downloads in the onboarding process.
+ * Manages download state, retry mechanisms, and navigation between steps.
+ */
@Component({
  selector: 'app-qbd-direct-download-file',
  standalone: true,
  imports: [SharedModule, QbdDirectSharedComponent, CardModule, CommonModule, ProgressSpinnerModule],
  templateUrl: './qbd-direct-download-file.component.html',
  styleUrl: './qbd-direct-download-file.component.scss'
})
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts (3)

Line range hint 21-21: Remove hardcoded default password

The hardcoded default password poses a security risk and should be removed. The password should be provided by the parent component or service.

Apply this diff:

- @Input({required: true}) password: string = '098765';
+ @Input({required: true}) password: string;

Line range hint 49-64: Modernize clipboard implementation

The current clipboard implementation uses deprecated execCommand and DOM manipulation. Consider using the modern Clipboard API for better security and maintainability.

Replace with this implementation:

- onClipboardCopy() {
-   const selBox = document.createElement('textarea');
-   selBox.value = this.password;
-   document.body.appendChild(selBox);
-   selBox.select();
-   selBox.click();
-   document.execCommand('copy');
-
-   this.messageService.add({
-     severity: 'success',
-     summary: 'Password copied to clipboard'
-   });
-
-   document.body.removeChild(selBox);
-   event?.stopPropagation();
- }
+ async onClipboardCopy() {
+   try {
+     await navigator.clipboard.writeText(this.password);
+     this.messageService.add({
+       severity: 'success',
+       summary: 'Password copied to clipboard'
+     });
+   } catch (err) {
+     this.messageService.add({
+       severity: 'error',
+       summary: 'Failed to copy password'
+     });
+   }
+ }

Line range hint 43-48: Add proper type definitions for event handlers

The event handling methods lack proper TypeScript type definitions. Also, event?.stopPropagation() is used without declaring the event parameter.

Consider applying these improvements:

- onDoneClick(event: checkBoxEmit) {
+ onDoneClick(event: checkBoxEmit): void {
   this.doneClick.emit(event);
 }

- onNextClick() {
+ onNextClick(): void {
   this.nextClick.emit();
 }
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html (2)

14-14: Simplify border styling logic.

The border styling condition can be simplified by using the last property from ngFor.

-<div *ngFor="let field of qbdFields; let i = index" class="tw-flex tw-items-center tw-justify-between tw-p-14-px" [ngClass]=" i < fieldLength-1 ? 'tw-border-b tw-border-b-divider-border-color' : '' ">
+<div *ngFor="let field of qbdFields; let last = last" class="tw-flex tw-items-center tw-justify-between tw-p-14-px" [ngClass]="{'tw-border-b tw-border-b-divider-border-color': !last}">

26-28: Move static text to constants.

Consider moving the static info text to a constant in the component to improve maintainability and enable easier localization in the future.

// In component file
readonly SYNC_INFO_TEXT = 'The values displayed here are synced from QuickBooks Desktop to Fyle. If you notice discrepancies in the synced values, you can continue onboarding; the sync will refresh automatically in 5 minutes to capture any missed values.';
-<app-configuration-info-label [infoText]="'The values displayed here are synced from QuickBooks Desktop to Fyle. If you notice discrepancies in the synced values, you can continue onboarding; the sync will refresh automatically in 5 minutes to capture any missed values.'" [showIcon]="false"></app-configuration-info-label>
+<app-configuration-info-label [infoText]="SYNC_INFO_TEXT" [showIcon]="false"></app-configuration-info-label>
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html (3)

1-2: Add ARIA attributes for better accessibility.

The stepper component should include proper ARIA attributes to improve accessibility for screen readers.

-<app-onboarding-steppers [onboardingSteps]="onboardingSteps"></app-onboarding-steppers>
+<app-onboarding-steppers 
+    [onboardingSteps]="onboardingSteps"
+    role="navigation"
+    aria-label="Onboarding progress">
+</app-onboarding-steppers>

4-6: Enhance loading state accessibility.

Add ARIA attributes to properly announce loading state to screen readers.

-<div *ngIf="isLoading" class="tw-flex tw-justify-center tw-items-center tw-pt-80-px">
+<div *ngIf="isLoading" 
+    class="tw-flex tw-justify-center tw-items-center tw-pt-80-px"
+    role="status"
+    aria-live="polite">
     <app-loader></app-loader>
 </div>

7-14: Consider extracting brand-specific styles to a theme configuration.

The current approach of using conditional classes based on brandId could become difficult to maintain as more brands are added. Consider using a theme configuration service or CSS custom properties.

Consider implementing a theme configuration:

// theme.service.ts
interface ThemeConfig {
  containerClasses: string;
  // other theme properties
}

@Injectable()
class ThemeService {
  getThemeConfig(brandId: string): ThemeConfig {
    // Return brand-specific configuration
  }
}
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html (4)

39-40: Enhance download button with proper states and feedback.

The button lacks proper state management and user feedback during the download process.

Consider this improved implementation:

- <button pButton pRipple label="Download" class="downloadBtn" (click)="onDownloadClick()"></button>
+ <button 
+   pButton 
+   pRipple 
+   [label]="isDownloading ? 'Downloading...' : 'Download'" 
+   class="downloadBtn" 
+   [disabled]="downloadFilePathField.invalid || isCompanyPathValid === false || isDownloading"
+   (click)="onDownloadClick()"
+ >
+   <i *ngIf="isDownloading" class="pi pi-spin pi-spinner tw-mr-2"></i>
+ </button>

Line range hint 58-66: Improve accessibility for download status section.

While the implementation is good, the manual download and retry links could benefit from better accessibility.

Consider these improvements:

- <a class="tw-underline tw-underline-offset-1 tw-cursor-pointer" (click)="onManualDownload()">
+ <a 
+   class="tw-underline tw-underline-offset-1 tw-cursor-pointer" 
+   (click)="onManualDownload()"
+   role="button"
+   aria-label="Download integration file manually"
+ >

- <a class="tw-underline tw-underline-offset-1 tw-cursor-pointer" (click)="onRetryClick()">
+ <a 
+   class="tw-underline tw-underline-offset-1 tw-cursor-pointer" 
+   (click)="onRetryClick()"
+   role="button"
+   aria-label="Try downloading with a different file path"
+ >

Line range hint 69-71: Enhance footer UX with more descriptive button state.

The footer implementation could benefit from better user guidance.

Consider this improvement:

- <app-configuration-step-footer [ctaText]="ConfigurationCtaText.NEXT" [isButtonDisabled]="!showDownloadLink" (save)="continueToNextStep()">
+ <app-configuration-step-footer 
+   [ctaText]="showDownloadLink ? ConfigurationCtaText.NEXT : 'Download File to Continue'"
+   [isButtonDisabled]="!showDownloadLink" 
+   [tooltipText]="!showDownloadLink ? 'Please download and save the integration file to continue' : ''"
+   (save)="continueToNextStep()"
+ >

Line range hint 46-47: Improve YouTube video embedding accessibility and responsiveness.

The embedded video iframe lacks proper accessibility attributes and responsive behavior.

Consider these improvements:

- <iframe width="427" height="259" src="https://www.youtube.com/embed/2oYdc8KcQnk" frameborder="0"></iframe>
+ <iframe 
+   class="tw-w-full tw-max-w-[427px] tw-aspect-video"
+   src="https://www.youtube.com/embed/2oYdc8KcQnk"
+   title="How to find QuickBooks Desktop company file path"
+   loading="lazy"
+   allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
+   allowfullscreen
+ ></iframe>
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html (3)

18-18: Consider extracting complex conditional logic.

The complex condition !isLoading && connectionStatus !== qbdConnectionStatus.SUCCESS && showSection && !isStepCompleted is repeated multiple times. Consider extracting it to a getter in the component class.

+// In component class
+get shouldShowInstructions(): boolean {
+  return !this.isLoading && 
+         this.connectionStatus !== this.qbdConnectionStatus.SUCCESS && 
+         this.showSection && 
+         !this.isStepCompleted;
+}

-<div *ngIf="!isLoading && connectionStatus !== qbdConnectionStatus.SUCCESS && showSection && !isStepCompleted"
+<div *ngIf="shouldShowInstructions"

Line range hint 69-69: Enhance iframe accessibility and performance.

The YouTube iframe lacks important accessibility and performance attributes.

-<iframe width="427" height="259" src="https://www.youtube.com/embed/2oYdc8KcQnk" frameborder="0"></iframe>
+<iframe 
+  width="427" 
+  height="259" 
+  src="https://www.youtube.com/embed/2oYdc8KcQnk" 
+  title="QuickBooks Desktop Connection Guide" 
+  loading="lazy"
+  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
+  frameborder="0">
+</iframe>

Line range hint 43-44: Add accessibility attributes to password visibility toggle.

The password visibility toggle buttons lack proper accessibility attributes.

-<app-svg-icon *ngIf="!isPasswordShown" [svgSource]="'eye-slash'" [width]="'24px'" [height]="'24px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-muted tw-cursor-pointer'" (iconClick)="showPassword(true)"></app-svg-icon>
-<app-svg-icon *ngIf="isPasswordShown" [svgSource]="'eye'" [width]="'24px'" [height]="'24px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-muted tw-cursor-pointer'" (iconClick)="showPassword(false)"></app-svg-icon>
+<app-svg-icon 
+  *ngIf="!isPasswordShown" 
+  [svgSource]="'eye-slash'" 
+  [width]="'24px'" 
+  [height]="'24px'" 
+  [isTextColorAllowed]="true" 
+  [styleClasses]="'tw-text-icon-muted tw-cursor-pointer'"
+  role="button"
+  aria-label="Show password"
+  tabindex="0"
+  (iconClick)="showPassword(true)">
+</app-svg-icon>
+<app-svg-icon 
+  *ngIf="isPasswordShown" 
+  [svgSource]="'eye'" 
+  [width]="'24px'" 
+  [height]="'24px'" 
+  [isTextColorAllowed]="true" 
+  [styleClasses]="'tw-text-icon-muted tw-cursor-pointer'"
+  role="button"
+  aria-label="Hide password"
+  tabindex="0"
+  (iconClick)="showPassword(false)">
+</app-svg-icon>
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts (1)

121-128: Remove commented-out code for clarity

The code block within the onConnectionDone method is commented out. If this code is no longer needed, consider removing it to improve code readability.

- // Interval(3000).pipe(
- //   SwitchMap(() => this.workspaceService.getWorkspace(this.user.org_id)), // Make HTTP request
- //   TakeWhile((status: any) => !this.isTerminalStatus(status.onboarding_state as QbdDirectOnboardingState), true) // Stop if terminal status is reached
- // )
- // .subscribe(
- //   (status) => this.handleStatus(status),
- //   (error) => console.error('Error polling workspace status:', error)
- // );
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 20665aa and c2ecefc.

📒 Files selected for processing (14)
  • src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts (1 hunks)
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts (1 hunks)
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts (1 hunks)
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.spec.ts (0 hunks)
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.ts (0 hunks)
  • src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts (0 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html (1 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts (1 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html (3 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html (5 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts (1 hunks)
💤 Files with no reviewable changes (3)
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.spec.ts
  • src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts.service.ts
  • src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts
🔇 Additional comments (13)
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts (1)

29-30: LGTM! Improved type safety with strict schema.

The change from a flexible key-value structure to a strict schema with attribute_type and count fields improves type safety and makes the data structure more explicit.

Let's verify all usages of this type have been updated:

✅ Verification successful

Let me analyze the usage of SyncDataType to verify if all occurrences are compatible with the new structure:


Let me check one final aspect - the template usage of this type in the data sync component:


Type change is correctly implemented across the codebase

The verification confirms that all usages of SyncDataType are compatible with the new structure:

  • The API service correctly types the response as SyncDataType[]
  • The component template correctly accesses attribute_type and count fields
  • No instances of the old key-value pair structure were found
  • All component inputs and data bindings use the new type correctly
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find all usages of SyncDataType to ensure they match the new structure
# Expected: Only occurrences using the new attribute_type and count fields

# Search for SyncDataType usage
rg -l "SyncDataType" | xargs rg -A 5 "SyncDataType"

# Search for potential old usage patterns with dynamic keys
ast-grep --pattern 'SyncDataType[$_] = { [$_]: $_}'

Length of output: 7039


Script:

#!/bin/bash
# Let's check the actual implementation of syncAttribuites() and its response handling
rg -A 10 "syncAttribuites\(\)" 

# Also check any direct object creation or type assertions with SyncDataType
ast-grep --pattern 'as SyncDataType'
ast-grep --pattern 'SyncDataType = {'

Length of output: 2727


Script:

#!/bin/bash
# Check the template usage in data sync component
rg -A 10 "qbdFields" src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts

# Also check the HTML template
fd -e html -x cat {} \; -p "qbd-direct-data-sync.component.html"

Length of output: 2825

src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts (2)

1-10: LGTM! Service setup follows Angular best practices.

The imports are complete and the service is properly configured as an injectable provider at the root level.


12-15: LGTM! Dependencies are properly injected.

The constructor follows Angular dependency injection best practices with appropriate access modifiers.

src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (1)

33-33: LGTM! Improved efficiency in fieldLength calculation.

The change from using Object.keys() to direct array length access is a good improvement that simplifies the code and potentially improves performance.

src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts (2)

28-28: LGTM! Type safety improvement

Good improvement adding type specification to the EventEmitter. This enhances type safety and makes the component's contract clearer.


Line range hint 21-25: Verify error handling for invalid company path

The component accepts isCompanyPathInvalid input but there's no visible handling of this state in the component logic.

Let's check if this state is handled in the template:

✅ Verification successful

The search results show that isCompanyPathInvalid is indeed used in the template for error handling. The template shows multiple error conditions where this flag is used:

  1. In CSS class binding for 'error-box'
  2. In error message display conditions
  3. In specific error text display logic

Let me verify the complete template content to ensure the error handling is properly implemented:


Error handling for invalid company path is properly implemented

The template shows comprehensive error handling for the isCompanyPathInvalid input:

  • Applies 'error-box' CSS class when path is invalid
  • Shows error message with an info icon
  • Displays "Enter a valid company file path" text
  • Integrates with form validation (combines with downloadFilePathField.invalid checks)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if isCompanyPathInvalid is used in the template
rg -l "isCompanyPathInvalid" src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html

# Check for error handling patterns in related components
rg "isCompanyPathInvalid" src/app/integrations/qbd-direct/

Length of output: 1981


Script:

#!/bin/bash
# Get the full template content
cat src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html

Length of output: 5337

src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts (1)

29-30: LGTM! Input property follows best practices

The showSection input property is properly implemented with the required decorator and type definition.

src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html (1)

1-1: LGTM! Good use of conditional styling.

The conditional styling provides clear visual feedback about the section's state.

src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html (3)

1-1: LGTM! Container styling follows design system guidelines.

The conditional styling provides clear visual feedback when the section is inactive.


Line range hint 76-83: LGTM! Checkbox implementation is clean.

The checkbox button implementation follows component patterns correctly.


Line range hint 84-87: LGTM! Loading state provides clear user feedback.

The loading spinner with message provides good visual feedback to users.

src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts (2)

68-68: Confirm the type of user retrieved from StorageService

The user property is assigned from this.storageService.get('user') and typed as MinimalUser. Ensure that the stored value matches the MinimalUser type to prevent potential type errors.


78-80: Validate the file path regex pattern

Ensure that the regex pattern used for validating the company file path correctly matches all valid paths and excludes invalid ones. Consider edge cases such as different drive letters, special characters, or network paths.

import { QbdDirectConnectorService } from './qbd-direct-connector.service';

xdescribe('QbdDirectConnectorService', () => {
describe('QbdDirectConnectorServiceTsService', () => {
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix inconsistent test suite naming.

The test suite name 'QbdDirectConnectorServiceTsService' doesn't match the actual service name 'QbdDirectConnectorService' and includes redundant 'Ts' suffix.

-describe('QbdDirectConnectorServiceTsService', () => {
+describe('QbdDirectConnectorService', () => {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
describe('QbdDirectConnectorServiceTsService', () => {
describe('QbdDirectConnectorService', () => {

Comment on lines +21 to +23
syncAttribuites(): Observable<SyncDataType[]> {
return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {});
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Fix method name and simplify API call

  1. There's a typo in the method name ("Attribuites" → "Attributes")
  2. The empty object parameter in the get() call is unnecessary
-  syncAttribuites(): Observable<SyncDataType[]> {
-    return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {});
+  syncAttributes(): Observable<SyncDataType[]> {
+    return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
syncAttribuites(): Observable<SyncDataType[]> {
return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {});
}
syncAttributes(): Observable<SyncDataType[]> {
return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`);
}

Comment on lines +1 to +24
import { Injectable } from '@angular/core';
import { ApiService } from '../../common/api.service';
import { WorkspaceService } from '../../common/workspace.service';
import { Observable } from 'rxjs';
import { QbdConnectorPost, QbdConnectorGet, SyncDataType } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model';

@Injectable({
providedIn: 'root'
})
export class QbdDirectConnectorService {

constructor(
private apiService: ApiService,
private workspaceService: WorkspaceService
) { }

postQbdDirectConntion(payload: QbdConnectorPost): Observable<QbdConnectorGet> {
return this.apiService.post(`/workspaces/${this.workspaceService.getWorkspaceId()}/connector_settings/`, payload);
}

syncAttribuites(): Observable<SyncDataType[]> {
return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {});
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Test coverage is insufficient for QbdDirectConnectorService

The service has only a basic test file with a single test case that verifies service creation. Both postQbdDirectConntion and syncAttribuites methods lack test coverage. The test file needs to be enhanced with:

  • Test cases for postQbdDirectConntion method
    • Verify correct API endpoint construction with workspace ID
    • Verify payload handling
    • Test response mapping
  • Test cases for syncAttribuites method
    • Verify correct API endpoint construction
    • Test response handling for attribute stats
🔗 Analysis chain

Verify test coverage for the service

The AI summary mentions that tests have been activated, but let's verify the test coverage for both methods.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if both service methods are covered in tests

# Test: Search for test cases covering both methods
echo "Searching for test coverage of service methods..."
rg -A 5 "describe.*QbdDirectConnectorService" "src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts"
rg "postQbdDirectCon|syncAttribui" "src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts"

Length of output: 599


Script:

#!/bin/bash
# Let's verify if the test file exists and check its content
echo "Checking test file existence and content..."
fd "qbd-direct-connector.service.spec.ts" --type f --exec cat {}

# Also check for any other test files that might cover this service
echo -e "\nSearching for other potential test files..."
rg -l "QbdDirectConnectorService" --type ts

Length of output: 1053

@@ -40,7 +40,7 @@ export class QbdDirectDownloadFileComponent {
}

onDownloadClick() {
this.downloadClick.emit();
this.downloadClick.emit(this.downloadFilePath);
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Potential undefined value emission

The downloadFilePath property is declared but never initialized. This could lead to emitting an undefined value when onDownloadClick() is called.

Consider initializing the property or adding a null check:

- downloadFilePath: string;
+ downloadFilePath: string = '';

  onDownloadClick() {
-   this.downloadClick.emit(this.downloadFilePath);
+   if (this.downloadFilePath) {
+     this.downloadClick.emit(this.downloadFilePath);
+   }
  }

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +19 to 22
<span *ngIf="field.count !== null" class="tw-text-text-tertiary tw-font-400 tw-text-14-px">{{field.count}}</span>
<div class="spin-icon tw-text-text-tertiary tw-font-400 tw-text-14-px">
<app-svg-icon *ngIf="qbdFields[field] === null" [svgSource]="'arrow-rotate-sync'" [width]="'14px'" [height]="'14px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-tertiary'"></app-svg-icon>
<app-svg-icon *ngIf="field.count === null" [svgSource]="'arrow-rotate-sync'" [width]="'14px'" [height]="'14px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-tertiary'"></app-svg-icon>
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance loading state feedback.

The current implementation doesn't clearly distinguish between loading and error states. Consider adding a tooltip or status text to provide more context when count is null.

-<span *ngIf="field.count !== null" class="tw-text-text-tertiary tw-font-400 tw-text-14-px">{{field.count}}</span>
-<div class="spin-icon tw-text-text-tertiary tw-font-400 tw-text-14-px">
-    <app-svg-icon *ngIf="field.count === null" [svgSource]="'arrow-rotate-sync'" [width]="'14px'" [height]="'14px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-tertiary'"></app-svg-icon>
-</div>
+<span *ngIf="field.count !== null" class="tw-text-text-tertiary tw-font-400 tw-text-14-px">{{field.count}}</span>
+<div class="spin-icon tw-text-text-tertiary tw-font-400 tw-text-14-px" *ngIf="field.count === null">
+    <app-svg-icon [svgSource]="'arrow-rotate-sync'" [width]="'14px'" [height]="'14px'" [isTextColorAllowed]="true" [styleClasses]="'tw-text-icon-tertiary'" [tooltip]="'Syncing data...'"></app-svg-icon>
+</div>

Committable suggestion skipped: line range outside the PR's diff.

private router: Router,
private workspaceService: WorkspaceService,
private storageService: StorageService,
private qbdDirectConntorService: QbdDirectConnectorService
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Typo in variable name qbdDirectConntorService

The variable qbdDirectConntorService seems to have a typo. It should likely be qbdDirectConnectorService to match the service it's referencing.

Apply this diff to correct the variable name:

- private qbdDirectConntorService: QbdDirectConnectorService
+ private qbdDirectConnectorService: QbdDirectConnectorService
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private qbdDirectConntorService: QbdDirectConnectorService
private qbdDirectConnectorService: QbdDirectConnectorService


onConnectionDone(event: checkBoxEmit) {
if (event.value) {
this.qbdDirectConntorService.syncAttribuites().subscribe((sd: SyncDataType[]) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Typo in method name syncAttribuites

The method syncAttribuites seems to be misspelled. It should likely be syncAttributes.

Apply this diff to correct the method name:

- this.qbdDirectConntorService.syncAttribuites().subscribe((sd: SyncDataType[]) => {
+ this.qbdDirectConnectorService.syncAttributes().subscribe((sd: SyncDataType[]) => {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
this.qbdDirectConntorService.syncAttribuites().subscribe((sd: SyncDataType[]) => {
this.qbdDirectConnectorService.syncAttributes().subscribe((sd: SyncDataType[]) => {

this.isCompanyPathInvalid = filePathRegex.test(normalizedPath);
if (this.isCompanyPathInvalid) {
this.isdownloadfileLoading = true;
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Typo in method name postQbdDirectConntion

The method postQbdDirectConntion appears to have a typo. It should likely be postQbdDirectConnection to reflect the correct spelling.

Apply this diff to correct the method name:

- this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
+ this.qbdDirectConnectorService.postQbdDirectConnection({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
this.qbdDirectConnectorService.postQbdDirectConnection({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {

Comment on lines 83 to 89
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
this.password = connectionResponse.password;
this.xmlFileContent = connectionResponse.qwc;
this.triggerManualDownload();
this.showDownloadLink = true;
});
this.isdownloadfileLoading = false;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Ensure loading state is handled correctly in asynchronous call

In the triggerDownload method, this.isdownloadfileLoading = false; is set outside the subscribe callback, which may result in incorrect loading state if the API call is asynchronous.

Move the loading state update inside the subscribe callback to ensure it reflects the completion of the API call:

this.qbdDirectConnectorService.postQbdDirectConnection({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
  this.password = connectionResponse.password;
  this.xmlFileContent = connectionResponse.qwc;
  this.triggerManualDownload();
  this.showDownloadLink = true;
+ this.isdownloadfileLoading = false;
});
- this.isdownloadfileLoading = false;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
this.password = connectionResponse.password;
this.xmlFileContent = connectionResponse.qwc;
this.triggerManualDownload();
this.showDownloadLink = true;
});
this.isdownloadfileLoading = false;
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
this.password = connectionResponse.password;
this.xmlFileContent = connectionResponse.qwc;
this.triggerManualDownload();
this.showDownloadLink = true;
this.isdownloadfileLoading = false;
});

Comment on lines +79 to +80
const filePathRegex = /^(\/?|\.?\/?|[a-zA-Z]:\\)([a-zA-Z0-9_-]+[\\/])*[a-zA-Z0-9 _-]+\.qbw$/;
this.isCompanyPathInvalid = filePathRegex.test(normalizedPath);
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Potential logic error with isCompanyPathInvalid variable

The variable isCompanyPathInvalid may have inverted logic. The filePathRegex.test(normalizedPath) returns true when the path is valid, but the variable name suggests it indicates an invalid path.

Consider renaming the variable to isCompanyPathValid and updating the logic accordingly:

- this.isCompanyPathInvalid = filePathRegex.test(normalizedPath);
- if (this.isCompanyPathInvalid) {
+ this.isCompanyPathValid = filePathRegex.test(normalizedPath);
+ if (this.isCompanyPathValid) {

Committable suggestion skipped: line range outside the PR's diff.

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: 7

🧹 Outside diff range and nitpick comments (8)
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (1)

34-36: Add validation for edge cases in ngOnInit.

The current initialization only handles null/undefined using optional chaining. Consider adding validation for empty arrays and logging for debugging.

 ngOnInit() {
-  this.fieldLength = this.qbdFields?.length;
+  if (!this.qbdFields?.length) {
+    console.warn('QbdDirectDataSyncComponent: No sync fields provided');
+  }
+  this.fieldLength = this.qbdFields?.length || 0;
 }
src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts (1)

46-46: Consider adding null check for brandingConfig

The brandIcon initialization could be more robust by adding a null check for brandingConfig.

Apply this diff to add null safety:

- this.brandIcon = `assets/${brandingConfig.brandId === 'co' ? 'co' : 'fyle'}/favicon.png`;
+ this.brandIcon = `assets/${brandingConfig?.brandId === 'co' ? 'co' : 'fyle'}/favicon.png`;
src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html (2)

6-11: Maintain consistent icon dimensions

The warning icon (16x16) and danger icon (18x18) have different dimensions, which could cause subtle layout shifts or alignment issues.

Consider standardizing the dimensions:

-<app-svg-icon [svgSource]="'warning-outline'" [width]="'16px'" [height]="'16px'" [styleClasses]="'tw-text-icon-warning'"></app-svg-icon>
+<app-svg-icon [svgSource]="'warning-outline'" [width]="'18px'" [height]="'18px'" [styleClasses]="'tw-text-icon-warning'"></app-svg-icon>

23-35: Enhance link accessibility and maintainability

The help article link section has several areas for improvement:

  1. The URL is split across lines making maintenance harder
  2. The disabled text color (tw-text-disable) might make it hard to recognize as a clickable link
  3. Missing accessibility attributes for external links

Consider applying these improvements:

-                        <a class="tw-text-size-10 tw-text-text-disable tw-font-400" href="https://help.fylehq.com/en/articles/71773-common-quickbooks-web-connector-errors-and">
-                            https://help.fylehq.com/en/articles/71773-common-quickbooks-web-connector
-                        </a>
+                        <a 
+                            class="tw-text-size-10 tw-text-link tw-font-400" 
+                            href="https://help.fylehq.com/en/articles/71773-common-quickbooks-web-connector-errors-and"
+                            target="_blank"
+                            rel="noopener noreferrer"
+                            aria-label="Common QuickBooks Web Connector errors and solutions (opens in new tab)"
+                        >
+                            Common QuickBooks Web Connector errors and solutions
+                        </a>
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html (2)

7-14: Simplify branding-based styling logic.

The template uses complex conditional classes for branding. Consider moving this logic to the component class for better maintainability.

-[ngClass]="{'tw-mx-120-px tw-shadow-app-card': brandingConfig.brandId === 'fyle', 'tw-mx-60-px tw-shadow-shadow-level-1': brandingConfig.brandId === 'co'}"
+[ngClass]="getBrandingClasses()"

In the component:

getBrandingClasses(): Record<string, boolean> {
  const classes = {
    'tw-mx-120-px tw-shadow-app-card': this.brandingConfig.brandId === 'fyle',
    'tw-mx-60-px tw-shadow-shadow-level-1': this.brandingConfig.brandId === 'co'
  };
  return classes;
}

51-61: Improve dialog configuration and visibility handling.

  1. Dialog text should be externalized to support i18n and improve maintainability
  2. The visibility check is duplicated in isWarningVisible
-[isWarningVisible]="isDialogVisible"
+[isWarningVisible]="true"
-[headerText]="'Connection failed'"
-[contextText]="warningDialogText"
-[confirmBtnText]="'Got it'"
+[headerText]="dialogConfig.headerText | translate"
+[contextText]="dialogConfig.contextText | translate"
+[confirmBtnText]="dialogConfig.confirmBtnText | translate"

In the component:

interface DialogConfig {
  headerText: string;
  contextText: string;
  confirmBtnText: string;
}

dialogConfig: DialogConfig = {
  headerText: 'CONNECTION_FAILED',
  contextText: this.warningDialogText,
  confirmBtnText: 'GOT_IT'
};
src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts (2)

Line range hint 28-32: Fix incorrect integration routes in onboarding steps

The route paths in onboarding steps are using 'qbo' instead of 'qbd'. This needs to be corrected to ensure proper navigation.

Apply this fix to all steps:

-  route: '/integrations/qbo/onboarding/pre_requisite',
+  route: '/integrations/qbd/onboarding/pre_requisite',

Also applies to: 34-39, 41-46, 48-53, 55-60


Line range hint 82-94: Consider improving step management for better maintainability

The current implementation has a few potential maintenance concerns:

  1. Hardcoded indices in the loop could break if step order changes
  2. No type safety for step numbers in onboardingStateStepMap

Consider these improvements:

  1. Use an enum or constants for step numbers
  2. Add runtime validation for step numbers
  3. Use array methods instead of index-based loop

Example refactor:

getOnboardingSteps(currentStep: string, onboardingState: QbdDirectOnboardingState): OnboardingStepper[] {
  // Update active state
  this.onboardingSteps = this.onboardingSteps.map(step => ({
    ...step,
    active: step.step.toLowerCase() === currentStep.toLowerCase()
  }));

  // Update completed states
  const targetStep = this.onboardingStateStepMap[onboardingState];
  this.onboardingSteps = this.onboardingSteps.map((step, index) => ({
    ...step,
    completed: index < targetStep - 1
  }));

  return this.onboardingSteps;
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between c2ecefc and 8b9170e.

⛔ Files ignored due to path filters (1)
  • src/assets/fyle/favicon.png is excluded by !**/*.png
📒 Files selected for processing (10)
  • src/app/core/models/enum/enum.model.ts (1 hunks)
  • src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html (1 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts (1 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (2 hunks)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html (4 hunks)
  • src/app/integrations/qbd-direct/qbd-direct.component.ts (1 hunks)
  • src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html (1 hunks)
  • src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts (2 hunks)
✅ Files skipped from review due to trivial changes (2)
  • src/app/core/models/enum/enum.model.ts
  • src/app/integrations/qbd-direct/qbd-direct.component.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html
  • src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html
🧰 Additional context used
🪛 Biome
src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts

[error] 142-142: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)

src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts

[error] 39-39: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

🔇 Additional comments (11)
src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts (1)

16-22: Verify parent component bindings for breaking changes.

The change of qbdFields from SyncDataType to SyncDataType[] is a breaking change. Additionally, new required inputs have been added.

Let's verify all parent component templates are updated:

Consider adding JSDoc comments to document:

  • The expected structure of qbdFields
  • The purpose of isLoading and showSection
  • Example usage of the component
✅ Verification successful

Let me verify the component's usage in the parent component by checking the TypeScript file to ensure the properties are correctly typed:


Parent component is correctly updated with all required inputs

The parent component QbdDirectOnboardingConnectorComponent correctly:

  • Declares qbdFields as SyncDataType[]
  • Initializes isDataSyncLoading as boolean
  • Sets isConnectionStepCompleted for showSection
  • Handles isCTAEnabled binding

The template bindings match the required inputs and their types. The breaking change has been properly handled.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for parent components using this component
rg -l "app-qbd-direct-data-sync" | while read -r file; do
  echo "=== $file ==="
  # Show the component usage with context
  rg -A 5 -B 5 "app-qbd-direct-data-sync" "$file"
done

Length of output: 2097


Script:

#!/bin/bash
# Check the parent component's TypeScript implementation
cat "src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts"

Length of output: 10316

src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts (2)

3-3: LGTM!

The import statement is correctly structured and AppName enum is properly imported alongside ConfigurationWarningEvent.


35-37: LGTM!

The class properties are properly defined:

  • AppName is correctly exposed for template usage
  • brandIcon is properly typed for storing the favicon path
src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html (1)

18-18: Verify HTML content sanitization

Using [innerHTML] could expose the application to XSS attacks if the content isn't properly sanitized.

Let's verify the sanitization in the component:

src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html (5)

1-2: LGTM! Clean structure with proper spacing.

The main container with stepper is well-organized and follows component-based architecture.


3-6: LGTM! Clean loading state implementation.

The loading state is handled properly with centered loader and conditional rendering.


17-25: Refer to previous review comment about download state management.

The previous review comment about using an enum for download status is still applicable here.


28-36: Refer to previous review comment about connection security.

The previous review comment about enhancing security and state management for connection setup is still applicable here.


39-44: Refer to previous review comment about boolean prop naming.

The previous review comment about fixing the confusing boolean prop name is still applicable here.

src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts (2)

11-11: LGTM! Improved naming consistency

The state key rename from IN_CORRECT_PASSWORD to INCORRECT_PASSWORD improves clarity and maintains consistency with the enum definition.


72-72: LGTM! Consistent state mapping

The state mapping correctly reflects the renamed state while maintaining the same step number (2).

Comment on lines +25 to +29
@Input() appName: string;

@Input() subLable: string;

@Input() redirectLink: string;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix typo in input property name

The property name 'subLable' contains a typo and should be 'subLabel' to follow proper naming conventions.

Apply this diff to fix the typo:

- @Input() subLable: string;
+ @Input() subLabel: string;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@Input() appName: string;
@Input() subLable: string;
@Input() redirectLink: string;
@Input() appName: string;
@Input() subLabel: string;
@Input() redirectLink: string;

AppName = AppName;

brandIcon: string;

constructor() { }
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Remove unnecessary empty constructor

The empty constructor doesn't serve any purpose and can be safely removed.

Apply this diff to remove the unnecessary constructor:

- constructor() { }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
constructor() { }
🧰 Tools
🪛 Biome

[error] 39-39: This constructor is unnecessary.

Unsafe fix: Remove the unnecessary constructor.

(lint/complexity/noUselessConstructor)

import { QbdDirectSharedModule } from '../../qbd-direct-shared/qbd-direct-shared.module';
import { SharedModule } from 'src/app/shared/shared.module';
import { brandingConfig, brandingContent, brandingKbArticles } from 'src/app/branding/branding-config';
import { BrandingConfiguration } from 'src/app/core/models/branding/branding-configuration.model';
import { AppName, ConfigurationCta, QBDConnectionStatus, QbdDirectOnboardingState, QBDOnboardingState, ToastSeverity } from 'src/app/core/models/enum/enum.model';
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Inconsistent enum naming convention

The enum IN_CORRECT_PASSWORD in QBDConnectionStatus doesn't follow the same naming pattern as INCORRECT_COMPANY_PATH. This inconsistency could lead to confusion.

Update the enum definition to maintain consistency:

- IN_CORRECT_PASSWORD = 'IN_CORRECT_PASSWORD',
+ INCORRECT_PASSWORD = 'INCORRECT_PASSWORD',

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +206 to +213
proceedToExportSetting() {
this.isLoading = true;
this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: "EXPORT_SETTING"}).subscribe((workspaceResponse: QbdDirectWorkspace) => {
this.router.navigate([`/integrations/qbd_direct/onboarding/export_settings`]);
this.isLoading = false;
this.toastService.displayToastMessage(ToastSeverity.SUCCESS, 'QuickBooks Desktop connection successful');
});
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Use enum value instead of hard-coded string and improve error handling

The navigation implementation uses a hard-coded string and lacks proper error handling.

Apply these improvements:

 proceedToExportSetting() {
   this.isLoading = true;
-  this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: "EXPORT_SETTING"}).subscribe((workspaceResponse: QbdDirectWorkspace) => {
-    this.router.navigate([`/integrations/qbd_direct/onboarding/export_settings`]);
-    this.isLoading = false;
-    this.toastService.displayToastMessage(ToastSeverity.SUCCESS, 'QuickBooks Desktop connection successful');
-  });
+  this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: QbdDirectOnboardingState.EXPORT_SETTING}).subscribe({
+    next: (workspaceResponse: QbdDirectWorkspace) => {
+      this.router.navigate([`/integrations/qbd_direct/onboarding/export_settings`]);
+      this.toastService.displayToastMessage(ToastSeverity.SUCCESS, 'QuickBooks Desktop connection successful');
+    },
+    error: (error) => {
+      this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Failed to proceed to export settings');
+    },
+    complete: () => {
+      this.isLoading = false;
+    }
+  });
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
proceedToExportSetting() {
this.isLoading = true;
this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: "EXPORT_SETTING"}).subscribe((workspaceResponse: QbdDirectWorkspace) => {
this.router.navigate([`/integrations/qbd_direct/onboarding/export_settings`]);
this.isLoading = false;
this.toastService.displayToastMessage(ToastSeverity.SUCCESS, 'QuickBooks Desktop connection successful');
});
}
proceedToExportSetting() {
this.isLoading = true;
this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: QbdDirectOnboardingState.EXPORT_SETTING}).subscribe({
next: (workspaceResponse: QbdDirectWorkspace) => {
this.router.navigate([`/integrations/qbd_direct/onboarding/export_settings`]);
this.toastService.displayToastMessage(ToastSeverity.SUCCESS, 'QuickBooks Desktop connection successful');
},
error: (error) => {
this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Failed to proceed to export settings');
},
complete: () => {
this.isLoading = false;
}
});
}

Comment on lines +124 to +135
onConnectionDone(event: checkBoxEmit) {
if (event.value) {
interval(3000).pipe(
switchMap(() => this.workspaceService.getWorkspace(this.user.org_id)), // Make HTTP request
takeWhile((status: any) => !this.isTerminalStatus(status[0].onboarding_state as QbdDirectOnboardingState), true) // Stop if terminal status is reached
)
.subscribe(
(status) => this.handleStatus(status[0]),
(error) => console.error('Error polling workspace status:', error)
);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve polling implementation with proper cleanup

The polling subscription should be cleaned up to prevent memory leaks, and error handling should provide user feedback.

Consider implementing:

+ private pollingSubscription: Subscription;
+
 onConnectionDone(event: checkBoxEmit) {
   if (event.value) {
-    interval(3000).pipe(
+    this.pollingSubscription = interval(3000).pipe(
       switchMap(() => this.workspaceService.getWorkspace(this.user.org_id)),
       takeWhile((status: any) => !this.isTerminalStatus(status[0].onboarding_state as QbdDirectOnboardingState), true)
     )
     .subscribe(
       (status) => this.handleStatus(status[0]),
-      (error) => console.error('Error polling workspace status:', error)
+      (error) => {
+        this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Failed to check connection status');
+        this.pollingSubscription?.unsubscribe();
+      }
     );
   }
 }
+
+ ngOnDestroy() {
+   this.pollingSubscription?.unsubscribe();
+ }

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 85 to 99
triggerDownload(filePath: string) {
const normalizedPath = filePath.replace(/\\\\/g, "\\");
const filePathRegex = /^(\/?|\.?\/?|[a-zA-Z]:\\)([a-zA-Z0-9_-]+[\\/])*[a-zA-Z0-9 _-]+\.qbw$/;
this.isCompanyPathInvalid = filePathRegex.test(normalizedPath);
if (this.isCompanyPathInvalid) {
this.isDownloadfileLoading = true;
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => {
this.password = connectionResponse.password;
this.xmlFileContent = connectionResponse.qwc;
// This.triggerManualDownload();
this.showDownloadLink = true;
});
this.isDownloadfileLoading = false;
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance error handling in file path validation

The function lacks proper error handling and user feedback for invalid file paths.

Consider adding error feedback:

 triggerDownload(filePath: string) {
   const normalizedPath = filePath.replace(/\\\\/g, "\\");
   const filePathRegex = /^(\/?|\.?\/?|[a-zA-Z]:\\)([a-zA-Z0-9_-]+[\\/])*[a-zA-Z0-9 _-]+\.qbw$/;
   this.isCompanyPathInvalid = filePathRegex.test(normalizedPath);
   if (this.isCompanyPathInvalid) {
     this.isDownloadfileLoading = true;
     this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe({
       next: (connectionResponse: QbdConnectorGet) => {
         this.password = connectionResponse.password;
         this.xmlFileContent = connectionResponse.qwc;
         this.showDownloadLink = true;
+        this.isDownloadfileLoading = false;
       },
+      error: (error) => {
+        this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Failed to process company file path');
+        this.isDownloadfileLoading = false;
+      }
     });
-    this.isDownloadfileLoading = false;
+  } else {
+    this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Invalid company file path format');
   }
 }

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines 137 to 144
handleDataSyncState(status: QbdDirectWorkspace) {
const onboardingState = status.onboarding_state;
this.qbdDirectConntorService.syncAttribuites().subscribe((qbdAttribuites: SyncDataType[]) => {
this.qbdFields = qbdAttribuites;
this.isDataSyncLoading = false;
this.isDataSyncCTADisabled = onboardingState === QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE ? false : true;
});
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enhance error handling in data sync and simplify boolean logic

The data sync implementation needs better error handling and the boolean assignment can be simplified.

Apply these improvements:

 handleDataSyncState(status: QbdDirectWorkspace) {
   const onboardingState = status.onboarding_state;
-  this.qbdDirectConntorService.syncAttribuites().subscribe((qbdAttribuites: SyncDataType[]) => {
-    this.qbdFields = qbdAttribuites;
-    this.isDataSyncLoading = false;
-    this.isDataSyncCTADisabled = onboardingState === QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE ? false : true;
-  });
+  this.qbdDirectConntorService.syncAttribuites().subscribe({
+    next: (qbdAttribuites: SyncDataType[]) => {
+      this.qbdFields = qbdAttribuites;
+      this.isDataSyncLoading = false;
+      this.isDataSyncCTADisabled = onboardingState !== QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE;
+    },
+    error: (error) => {
+      this.toastService.displayToastMessage(ToastSeverity.ERROR, 'Failed to sync QuickBooks Desktop attributes');
+      this.isDataSyncLoading = false;
+    }
+  });
 }

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome

[error] 142-142: Unnecessary use of boolean literals in conditional expression.

Simplify your code by directly assigning the result without using a ternary operator.
If your goal is negation, you may use the logical NOT (!) or double NOT (!!) operator for clearer and concise code.
Check for more details about NOT operator.
Unsafe fix: Remove the conditional expression with

(lint/complexity/noUselessTernary)

Copy link

Unit Test Coverage % values
Statements 34.99% ( 4244 / 12129 )
Branches 28.89% ( 1232 / 4264 )
Functions 27.58% ( 939 / 3404 )
Lines 35.12% ( 4171 / 11876 )

@DhaaraniCIT DhaaraniCIT merged commit 5ecf737 into qbd-direct-connector-data-sync-up-ts Nov 13, 2024
5 checks passed
DhaaraniCIT added a commit that referenced this pull request Nov 13, 2024
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: qbd-direct-onboarding-pre-requisite implementation

* styling changes

* unit test fix

* step footer contentt fix

* pre requisite Ui updation

* PR comments fix

* PR comments fix

* feat: Download qwd file UI changes (#1059)

* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: qbd direct onboarding landing page

* feat: qbd-direct-onboarding-pre-requisite implementation

* PR comments fix

* PR fix

* updateWorkspaceOnboardingState service return type update

* qbd direct logo update

* feat: qbd-direct onboarding prerequisite UI implementation (#1058)

* feat: qbd-direct-onboarding-pre-requisite implementation

* styling changes

* unit test fix

* step footer contentt fix

* pre requisite Ui updation

* PR comments fix

* PR comments fix

* feat: Download qwd file UI changes (#1059)

* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: onboarding basic setup

* feat: qbd direct onboarding landing page (#1056)

* feat: qbd direct onboarding landing page

* feat: qbd-direct-onboarding-pre-requisite implementation

* PR comments fix

* PR fix

* updateWorkspaceOnboardingState service return type update

* qbd direct logo update

* feat: qbd-direct onboarding prerequisite UI implementation (#1058)

* feat: qbd-direct-onboarding-pre-requisite implementation

* styling changes

* unit test fix

* step footer contentt fix

* pre requisite Ui updation

* PR comments fix

* PR comments fix

* feat: Download qwd file UI changes (#1059)

* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
ashwin1111 added a commit that referenced this pull request Nov 13, 2024
* feat: checkbox button creation

* PR comments fix

* feat: onboarding basic setup (#1055)

* feat: onboarding basic setup

* feat: qbd direct onboarding landing page (#1056)

* feat: qbd direct onboarding landing page

* feat: qbd-direct-onboarding-pre-requisite implementation

* PR comments fix

* PR fix

* updateWorkspaceOnboardingState service return type update

* qbd direct logo update

* feat: qbd-direct onboarding prerequisite UI implementation (#1058)

* feat: qbd-direct-onboarding-pre-requisite implementation

* styling changes

* unit test fix

* step footer contentt fix

* pre requisite Ui updation

* PR comments fix

* PR comments fix

* feat: Download qwd file UI changes (#1059)

* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>
DhaaraniCIT added a commit that referenced this pull request Dec 3, 2024
* fead: folder creation

* PR comments fix

* feat: Qbd checkbox button creation (#1054)

* feat: checkbox button creation

* PR comments fix

* feat: onboarding basic setup (#1055)

* feat: onboarding basic setup

* feat: qbd direct onboarding landing page (#1056)

* feat: qbd direct onboarding landing page

* feat: qbd-direct-onboarding-pre-requisite implementation

* PR comments fix

* PR fix

* updateWorkspaceOnboardingState service return type update

* qbd direct logo update

* feat: qbd-direct onboarding prerequisite UI implementation (#1058)

* feat: qbd-direct-onboarding-pre-requisite implementation

* styling changes

* unit test fix

* step footer contentt fix

* pre requisite Ui updation

* PR comments fix

* PR comments fix

* feat: Download qwd file UI changes (#1059)

* feat: Download qwd file UI changes

* download file Ui updation

* download file Ui updation

* download file Ui updation

* download file Ui updation

* feat: qbd connector setup UI changes (#1060)

* feat: qbd connector setup UI changes

* Merge branch qbd-direct-onboarding-download-file-UI into qbd-direct-step-connector-UI

* feat: Qbd direct connection data sync UI changes (#1061)

* feat: Qbd direct connection data sync UI changes

* input made required

* svg update

* feat: qbd direct pre requisite ts changes (#1062)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes (#1063)

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes (#1064)

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes (#1065)

* PR comment fix

* PR comment fix

* Qbd direct connector data sync up ts (#1070)

* feat: qbd direct pre requisite ts changes

* feat: qbd direct pre requisite ts changes

* feat: qbd direct connector download file ts changes

* feat: qbd direct connector setup connector ts changes

* feat: qbd direct connector data sync up ts changes

* feat: QBD direct main connection page business logic (#1066)

* feat: QBD direct main connection page business logic

* onboarding connection ts changes

* onboarding connection ts changes

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

---------

Co-authored-by: ashwin1111 <[email protected]>

* checkbox button fix

* QA fixes

* qa fixes

* qa fixes

* fix: qbd direct export settings onboarding changes and content changes (#1082)

* qbd direct export settings onboarding changes and content changes

* fix: qbd direct import settings onboarding changes and content changes (#1083)

* qbd direct import settings onboarding changes and content changes

* qbd direct advanced settings onboarding changes and content changes (#1084)

* QA fixes

* QBD direct bug fixes

* QBD direct bug fixes

* JE changes in export settings and mapping

* PR comments fix

---------

Co-authored-by: ashwin1111 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
size/L Large PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant