-
Notifications
You must be signed in to change notification settings - Fork 0
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
feat: QBD direct main connection page business logic #1066
Conversation
Caution Review failedThe pull request is closed. WalkthroughThis pull request introduces significant changes to the QBD Direct integration within the application. Key modifications include an updated Changes
Possibly related PRs
Suggested labels
Suggested reviewers
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? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this 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
andsyncAttribuites
.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 documentationThe 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 passwordThe 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 implementationThe 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 handlersThe 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 fromngFor
.-<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 clarityThe 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
📒 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
andcount
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:
- In CSS class binding for 'error-box'
- In error message display conditions
- 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', () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
describe('QbdDirectConnectorServiceTsService', () => { | |
describe('QbdDirectConnectorService', () => { |
syncAttribuites(): Observable<SyncDataType[]> { | ||
return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {}); | ||
} |
There was a problem hiding this comment.
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
- There's a typo in the method name ("Attribuites" → "Attributes")
- 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.
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/`); | |
} |
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/`, {}); | ||
} | ||
} |
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
<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> |
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
private qbdDirectConntorService: QbdDirectConnectorService | |
private qbdDirectConnectorService: QbdDirectConnectorService |
|
||
onConnectionDone(event: checkBoxEmit) { | ||
if (event.value) { | ||
this.qbdDirectConntorService.syncAttribuites().subscribe((sd: SyncDataType[]) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
this.qbdDirectConntorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => { | |
this.qbdDirectConnectorService.postQbdDirectConnection({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => { |
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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; | |
}); |
const filePathRegex = /^(\/?|\.?\/?|[a-zA-Z]:\\)([a-zA-Z0-9_-]+[\\/])*[a-zA-Z0-9 _-]+\.qbw$/; | ||
this.isCompanyPathInvalid = filePathRegex.test(normalizedPath); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this 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 brandingConfigThe 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 dimensionsThe 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 maintainabilityThe help article link section has several areas for improvement:
- The URL is split across lines making maintenance harder
- The disabled text color (
tw-text-disable
) might make it hard to recognize as a clickable link- 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.
- Dialog text should be externalized to support i18n and improve maintainability
- 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 stepsThe 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 maintainabilityThe current implementation has a few potential maintenance concerns:
- Hardcoded indices in the loop could break if step order changes
- No type safety for step numbers in
onboardingStateStepMap
Consider these improvements:
- Use an enum or constants for step numbers
- Add runtime validation for step numbers
- 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
⛔ 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
andshowSection
- 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
asSyncDataType[]
- Initializes
isDataSyncLoading
as boolean - Sets
isConnectionStepCompleted
forshowSection
- 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).
@Input() appName: string; | ||
|
||
@Input() subLable: string; | ||
|
||
@Input() redirectLink: string; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
@Input() appName: string; | |
@Input() subLable: string; | |
@Input() redirectLink: string; | |
@Input() appName: string; | |
@Input() subLabel: string; | |
@Input() redirectLink: string; |
AppName = AppName; | ||
|
||
brandIcon: string; | ||
|
||
constructor() { } |
There was a problem hiding this comment.
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.
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'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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'); | ||
}); | ||
} |
There was a problem hiding this comment.
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.
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; | |
} | |
}); | |
} |
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) | ||
); | ||
} | ||
} |
There was a problem hiding this comment.
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.
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; | ||
} | ||
} |
There was a problem hiding this comment.
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.
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; | ||
}); | ||
} |
There was a problem hiding this comment.
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)
|
5ecf737
into
qbd-direct-connector-data-sync-up-ts
This reverts commit 5ecf737.
* 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]>
* 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]>
* 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]>
* 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]>
* 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]>
* 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]>
* 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]>
* 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]>
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
Improvements
Bug Fixes
Refactor