From a609bb7c0b3adfb7b44b25537e48578627bfca41 Mon Sep 17 00:00:00 2001 From: DhaaraniCIT Date: Tue, 5 Nov 2024 17:19:18 +0530 Subject: [PATCH 1/6] feat: Download qwd file UI changes --- src/app/branding/c1-contents-config.ts | 4 +- src/app/branding/fyle-contents-config.ts | 4 +- ...direct-onboarding-connector.component.html | 2 +- ...d-direct-onboarding-connector.component.ts | 4 +- ...ct-onboarding-pre-requisite.component.scss | 3 -- .../qbd-direct-download-file.component.html | 40 ++++++++++++++++++- .../qbd-direct-download-file.component.scss | 15 +++++++ .../qbd-direct-download-file.component.ts | 6 ++- .../qbd-direct-shared.module.ts | 7 +++- .../qbd-direct/qbd-direct.module.ts | 3 +- src/assets/icons/check-circle-fill.svg | 35 ++++++++++++++++ src/assets/sprites/sprite.svg | 2 +- 12 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 src/assets/icons/check-circle-fill.svg diff --git a/src/app/branding/c1-contents-config.ts b/src/app/branding/c1-contents-config.ts index c0c32be4e..7e0efc156 100644 --- a/src/app/branding/c1-contents-config.ts +++ b/src/app/branding/c1-contents-config.ts @@ -16,8 +16,8 @@ export const c1Contents = { configurationSubHeaderText: 'Begin your QuickBooks integration by completing the following steps.' }, connector: { - configurationHeaderText: 'Connect to NetSuite subsidary', - configurationSubHeaderText: 'Expenses will be posted to the NetSuite subsidary selected here. You can\'t change the subsidary once they\'re configured.', + configurationHeaderText: 'Connect to QuickBooks Desktop', + configurationSubHeaderText: 'Connect to QuickBooks desktop by completing the following steps.', stepName: 'Connect to QuickBooks Desktop', subLabel: 'Provide your credentials to establish a secure connection between your Expense Management and NetSuite account' }, diff --git a/src/app/branding/fyle-contents-config.ts b/src/app/branding/fyle-contents-config.ts index 23427eea7..60e329e2a 100644 --- a/src/app/branding/fyle-contents-config.ts +++ b/src/app/branding/fyle-contents-config.ts @@ -16,8 +16,8 @@ export const fyleContents = { configurationSubHeaderText: 'Begin your QuickBooks integration by completing the following steps.' }, connector: { - configurationHeaderText: 'Connect to NetSuite Tenant', - configurationSubHeaderText: 'Connect to the NetSuite Tenant from which you would like to import and export data. The ' + brandingConfig.brandName + ' org and NetSuite Tenant cannot be changed once the configuration steps are complete.', + configurationHeaderText: 'Connect to QuickBooks desktop', + configurationSubHeaderText: 'Connect to QuickBooks desktop by completing the following steps.', stepName: 'Connect to QuickBooks Desktop', subLabel: 'Expenses will be posted to the NetSuite Tenant Mapping selected here. Once configured, you can not change ' + brandingConfig.brandName + ' organization or Tenant Mapping.' }, diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html index 58622c360..3b8bfbaf2 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html @@ -1 +1 @@ -

qbd-direct-onboarding-connector works!

+ \ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts index f607c1b0d..193ffc66d 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts @@ -1,9 +1,11 @@ import { Component } from '@angular/core'; +import { QbdDirectSharedModule } from '../../qbd-direct-shared/qbd-direct-shared.module'; +import { SharedModule } from 'src/app/shared/shared.module'; @Component({ selector: 'app-qbd-direct-onboarding-connector', standalone: true, - imports: [], + imports: [QbdDirectSharedModule, SharedModule], templateUrl: './qbd-direct-onboarding-connector.component.html', styleUrl: './qbd-direct-onboarding-connector.component.scss' }) diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.scss b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.scss index 5094fd868..e69de29bb 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.scss +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.scss @@ -1,3 +0,0 @@ -:host ::ng-deep app-svg-icon > div > svg-icon-sprite > svg { - @apply tw-p-14-px #{!important}; -} \ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html index 5156dd658..10820959d 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html @@ -1 +1,39 @@ -

qbd-direct-download-file works!

+
+
+
+
+ 1 +
+
+ Download the integration file +
+
+
+ +
+
+
+
+

Enter company file path

+ Enter the file path of your company to generate the integration file. Watch the video for guidance on locating company file path. +
+
+ +
+
+ +
+
+
+
+ +
+ +
+
+

Where to find company file path?

+
+
+
+
+
\ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss index e69de29bb..821be70a5 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss @@ -0,0 +1,15 @@ +.downloadBtn, .downloadBtn:hover { + @apply tw-h-40-px tw-text-14-px tw-font-500 tw-text-white tw-bg-btn-secondary-bg tw-rounded-sm #{!important}; +} + +:host ::ng-deep .p-button-label{ + @apply tw-flex-auto #{!important}; +} + +:host ::ng-deep .p-card-body, :host ::ng-deep .p-card-content { + @apply tw-p-0 #{!important}; +} + +:host ::ng-deep .p-card-body { + @apply tw-rounded-border-radius-2xl #{!important} +} \ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts index 8e066196e..d4665fe32 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts @@ -1,12 +1,16 @@ import { Component } from '@angular/core'; +import { SharedModule } from "../../../../shared/shared.module"; +import { QbdDirectSharedComponent } from '../qbd-direct-shared.component'; +import { CardModule } from 'primeng/card'; @Component({ selector: 'app-qbd-direct-download-file', standalone: true, - imports: [], + imports: [SharedModule, QbdDirectSharedComponent, CardModule], templateUrl: './qbd-direct-download-file.component.html', styleUrl: './qbd-direct-download-file.component.scss' }) export class QbdDirectDownloadFileComponent { +downloadFilePath: any; } diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts index b27f2fc99..a2c70a6b1 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts @@ -1,12 +1,17 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SharedModule } from 'src/app/shared/shared.module'; +import { QbdDirectDownloadFileComponent } from './qbd-direct-download-file/qbd-direct-download-file.component'; @NgModule({ declarations: [], imports: [ CommonModule, - SharedModule + SharedModule, + QbdDirectDownloadFileComponent + ], + exports: [ + QbdDirectDownloadFileComponent ] }) export class QbdDirectSharedModule { } diff --git a/src/app/integrations/qbd-direct/qbd-direct.module.ts b/src/app/integrations/qbd-direct/qbd-direct.module.ts index a65e4f3b4..604a9ea62 100644 --- a/src/app/integrations/qbd-direct/qbd-direct.module.ts +++ b/src/app/integrations/qbd-direct/qbd-direct.module.ts @@ -9,8 +9,7 @@ import { QbdDirectComponent } from './qbd-direct.component'; imports: [ CommonModule, QbdDirectRoutingModule, - SharedModule, - QbdDirectComponent + SharedModule ] }) export class QbdDirectModule { } diff --git a/src/assets/icons/check-circle-fill.svg b/src/assets/icons/check-circle-fill.svg new file mode 100644 index 000000000..330bf9c86 --- /dev/null +++ b/src/assets/icons/check-circle-fill.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/sprites/sprite.svg b/src/assets/sprites/sprite.svg index e20c825d4..a60fe7841 100644 --- a/src/assets/sprites/sprite.svg +++ b/src/assets/sprites/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 24271834471de54edf10437dfb8a21bc6e862f6a Mon Sep 17 00:00:00 2001 From: DhaaraniCIT Date: Wed, 6 Nov 2024 12:47:51 +0530 Subject: [PATCH 2/6] download file Ui updation --- .eslintrc.json | 1 + .../qbd-direct-download-file.component.html | 91 +++++++++++++------ .../qbd-direct-download-file.component.scss | 7 +- .../qbd-direct-download-file.component.ts | 36 +++++++- .../configuration-step-footer.component.html | 4 +- src/styles.scss | 4 + 6 files changed, 107 insertions(+), 36 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 656b53681..c2e48ff64 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -65,6 +65,7 @@ "space-before-function-paren": "off", "@typescript-eslint/quotes": "off", "@angular-eslint/no-empty-lifecycle-method": "off", + "@angular-eslint/no-input-rename": "off", "linebreak-style": "off", "key-spacing": ["error", { "beforeColon": false }], "keyword-spacing": ["error", { "before": true }], diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html index 10820959d..8844130d2 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html @@ -1,39 +1,70 @@ -
-
-
-
- 1 +
+
+
+
+
+ 1 +
+
+ Download the integration file +
-
- Download the integration file +
+
-
- -
-
-
-
-

Enter company file path

- Enter the file path of your company to generate the integration file. Watch the video for guidance on locating company file path. -
-
- -
-
- +
+
+

Enter company file path

+ Enter the file path of your company to generate the integration file. Watch the video for guidance on locating company file path. +
+
+ +
+ + + Enter a valid company file path. +
+
+
+ +
+
+ +
+ +
+
+

Where to find company file path?

+
+
+
-
- -
- -
-
-

Where to find company file path?

-
-
+
+ + Loading
+
+
+ +
+
+

Your download will begin

+ If it didn’t start, download the integration file manually. +

Not the right file? Try again.

+
+
+
+
+
\ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss index 821be70a5..90c98ad78 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.scss @@ -12,4 +12,9 @@ :host ::ng-deep .p-card-body { @apply tw-rounded-border-radius-2xl #{!important} -} \ No newline at end of file +} + +:host ::ng-deep .error-box { + @apply tw-border tw-border-alert-toast #{!important}; +} + diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts index d4665fe32..5d113a991 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts @@ -1,16 +1,46 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { SharedModule } from "../../../../shared/shared.module"; import { QbdDirectSharedComponent } from '../qbd-direct-shared.component'; import { CardModule } from 'primeng/card'; +import { ConfigurationCta } from 'src/app/core/models/enum/enum.model'; +import { CommonModule } from '@angular/common'; +import { required } from '@rxweb/reactive-form-validators'; +import { ProgressSpinnerModule } from 'primeng/progressspinner'; @Component({ selector: 'app-qbd-direct-download-file', standalone: true, - imports: [SharedModule, QbdDirectSharedComponent, CardModule], + imports: [SharedModule, QbdDirectSharedComponent, CardModule, CommonModule, ProgressSpinnerModule], templateUrl: './qbd-direct-download-file.component.html', styleUrl: './qbd-direct-download-file.component.scss' }) export class QbdDirectDownloadFileComponent { -downloadFilePath: any; + + isLoading: boolean = true; + + showDownloadLink: boolean = true; + + isStepCompleted: boolean = false; + + isCompanyPathInvalid: boolean; + + downloadFilePath: string; + + ConfigurationCtaText = ConfigurationCta; + + continueToNextStep() { + } + + onDownloadClick() { + // Emit output + } + + onManualDownload() { + // Emit output + } + + onRetryClick() { + // Emit output + } } diff --git a/src/app/shared/components/configuration/configuration-step-footer/configuration-step-footer.component.html b/src/app/shared/components/configuration/configuration-step-footer/configuration-step-footer.component.html index c0d25eeab..2f2ed08ce 100644 --- a/src/app/shared/components/configuration/configuration-step-footer/configuration-step-footer.component.html +++ b/src/app/shared/components/configuration/configuration-step-footer/configuration-step-footer.component.html @@ -1,4 +1,4 @@ -
+
- +
diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts index 5d113a991..9baebfceb 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts @@ -16,13 +16,13 @@ import { ProgressSpinnerModule } from 'primeng/progressspinner'; }) export class QbdDirectDownloadFileComponent { - isLoading: boolean = true; + @Input({required: true}) isLoading: boolean = true; - showDownloadLink: boolean = true; + @Input({required: true}) showDownloadLink: boolean = true; - isStepCompleted: boolean = false; + @Input({required: true}) isStepCompleted: boolean = false; - isCompanyPathInvalid: boolean; + @Input({required: true}) isCompanyPathInvalid: boolean; downloadFilePath: string; diff --git a/src/assets/icons/check-circle-fill.svg b/src/assets/icons/check-circle-fill.svg index 330bf9c86..5a37bde74 100644 --- a/src/assets/icons/check-circle-fill.svg +++ b/src/assets/icons/check-circle-fill.svg @@ -1,35 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/src/assets/sprites/sprite.svg b/src/assets/sprites/sprite.svg index a60fe7841..537bb6dca 100644 --- a/src/assets/sprites/sprite.svg +++ b/src/assets/sprites/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 1b4d0d5036013012e9d79e1690e931616f66f393 Mon Sep 17 00:00:00 2001 From: DhaaraniCIT Date: Wed, 6 Nov 2024 13:00:21 +0530 Subject: [PATCH 4/6] download file Ui updation --- .../qbd-direct-download-file.component.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts index 9baebfceb..78a1efb58 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts @@ -16,11 +16,11 @@ import { ProgressSpinnerModule } from 'primeng/progressspinner'; }) export class QbdDirectDownloadFileComponent { - @Input({required: true}) isLoading: boolean = true; + @Input({required: true}) isLoading: boolean; - @Input({required: true}) showDownloadLink: boolean = true; + @Input({required: true}) showDownloadLink: boolean; - @Input({required: true}) isStepCompleted: boolean = false; + @Input({required: true}) isStepCompleted: boolean; @Input({required: true}) isCompanyPathInvalid: boolean; From 25f3f57140a38edc28b03a038b353a9b51314a34 Mon Sep 17 00:00:00 2001 From: DhaaraniCIT Date: Wed, 6 Nov 2024 13:18:15 +0530 Subject: [PATCH 5/6] download file Ui updation --- .../qbd-direct-download-file.component.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html index ac2ee1161..48ab7bac7 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html @@ -13,7 +13,7 @@
-
+

Enter company file path

Enter the file path of your company to generate the integration file. Watch the video for guidance on locating company file path. @@ -53,7 +53,7 @@

Enter company file p Loading

-
+
@@ -64,7 +64,7 @@

Enter company file p

-
- +
+
\ No newline at end of file From d1140bba5ed605c663a81765dee2c46b506a7443 Mon Sep 17 00:00:00 2001 From: Dhaarani <55541808+DhaaraniCIT@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:36:31 +0530 Subject: [PATCH 6/6] 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 --------- Co-authored-by: ashwin1111 --- src/app/core/models/common/helper.model.ts | 2 +- src/app/core/models/enum/enum.model.ts | 8 +- .../qbd-direct-connector.model.ts | 7 +- .../qbd-direct-onboarding.model.ts | 4 +- .../qbd-direct-connector.service.spec.ts | 2 +- .../qbd-direct-connector.service.ts | 17 +- .../qbd-direct-connector.service.spec.ts | 16 -- .../qbd-direct-connector.service.ts | 9 - ...direct-onboarding-connector.component.html | 62 ++++- ...d-direct-onboarding-connector.component.ts | 227 +++++++++++++++++- ...ct-onboarding-pre-requisite.component.html | 2 +- ...rect-onboarding-pre-requisite.component.ts | 26 +- .../qbd-direct-data-sync.component.html | 38 ++- .../qbd-direct-data-sync.component.scss | 12 + .../qbd-direct-data-sync.component.spec.ts | 2 +- .../qbd-direct-data-sync.component.ts | 32 ++- .../qbd-direct-download-file.component.html | 16 +- .../qbd-direct-download-file.component.ts | 18 +- ...qbd-direct-setup-connection.component.html | 102 +++++++- ...qbd-direct-setup-connection.component.scss | 7 + ...-direct-setup-connection.component.spec.ts | 2 +- .../qbd-direct-setup-connection.component.ts | 66 ++++- .../qbd-direct-shared.module.ts | 10 +- .../qbd-direct/qbd-direct.component.ts | 6 +- ...uration-confirmation-dialog.component.html | 22 +- ...iguration-confirmation-dialog.component.ts | 13 +- .../configuration-info-label.component.html | 2 +- .../configuration-info-label.component.ts | 2 + .../core/svg-icon/svg-icon.component.ts | 6 +- .../checkbox-button.component.ts | 4 +- src/assets/fyle/favicon.png | Bin 0 -> 1086 bytes src/assets/icons/co/grv-lock.svg | 4 + src/assets/icons/co/grv-show-hide-medium.svg | 3 + src/assets/icons/co/grv-show-medium.svg | 3 + src/assets/icons/co/grv-upload.svg | 4 + src/assets/icons/eye-medium.svg | 8 + src/assets/icons/eye-slash-medium.svg | 11 + src/assets/icons/lock.svg | 5 + src/assets/icons/upload.svg | 5 + src/assets/sprites/sprite.svg | 2 +- 40 files changed, 705 insertions(+), 82 deletions(-) delete mode 100644 src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.spec.ts delete mode 100644 src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts create mode 100644 src/assets/fyle/favicon.png create mode 100644 src/assets/icons/co/grv-lock.svg create mode 100644 src/assets/icons/co/grv-show-hide-medium.svg create mode 100644 src/assets/icons/co/grv-show-medium.svg create mode 100644 src/assets/icons/co/grv-upload.svg create mode 100644 src/assets/icons/eye-medium.svg create mode 100644 src/assets/icons/eye-slash-medium.svg create mode 100644 src/assets/icons/lock.svg create mode 100644 src/assets/icons/upload.svg diff --git a/src/app/core/models/common/helper.model.ts b/src/app/core/models/common/helper.model.ts index 375b6f31a..2fbcfd6c7 100644 --- a/src/app/core/models/common/helper.model.ts +++ b/src/app/core/models/common/helper.model.ts @@ -1,6 +1,6 @@ import { FormGroup, Validators } from "@angular/forms"; -export type checkBoxEvent = { +export type CheckBoxUpdate = { id: number; value: boolean; } diff --git a/src/app/core/models/enum/enum.model.ts b/src/app/core/models/enum/enum.model.ts index 2ee7b9919..c3e9bd164 100644 --- a/src/app/core/models/enum/enum.model.ts +++ b/src/app/core/models/enum/enum.model.ts @@ -337,7 +337,7 @@ export enum QbdDirectOnboardingState { CONFIRM_PRE_REQUISITES = 'CONFIRM_PRE_REQUISITES', PENDING_QWC_UPLOAD = 'PENDING_QWC_UPLOAD', INCORRECT_COMPANY_PATH = 'INCORRECT_COMPANY_PATH', - IN_CORRECT_PASSWORD = 'IN_CORRECT_PASSWORD', + INCORRECT_PASSWORD = 'INCORRECT_PASSWORD', DESTINATION_SYNC_IN_PROGRESS = 'DESTINATION_SYNC_IN_PROGRESS', DESTINATION_SYNC_COMPLETE = 'DESTINATION_SYNC_COMPLETE', } @@ -889,3 +889,9 @@ export enum QBDPreRequisiteState { COMPLETE = 'COMPLETE', INCOMPLETE = 'INCOMPLETE' } + +export enum QBDConnectionStatus { + SUCCESS = 'SUCCESS', + INCORRECT_COMPANY_PATH = 'INCORRECT_COMPANY_PATH', + IN_CORRECT_PASSWORD = 'IN_CORRECT_PASSWORD' +} \ No newline at end of file diff --git a/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts b/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts index 5e6f35ed0..1f60d81b9 100644 --- a/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts +++ b/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model.ts @@ -23,4 +23,9 @@ export type QBDPrerequisiteObject = { externalLink?: string, iconName: string, state: QBDPreRequisiteState - } \ No newline at end of file +} + +export type SyncDataType = { + attribute_type: string; + count: null | number + }; diff --git a/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts b/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts index cc456b18f..d0c369c89 100644 --- a/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts +++ b/src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model.ts @@ -8,7 +8,7 @@ type QbdOnboardingStepperMap = { [QbdDirectOnboardingState.CONNECTION]: number; [QbdDirectOnboardingState.PENDING_QWC_UPLOAD]: number; [QbdDirectOnboardingState.INCORRECT_COMPANY_PATH]: number; - [QbdDirectOnboardingState.IN_CORRECT_PASSWORD]: number; + [QbdDirectOnboardingState.INCORRECT_PASSWORD]: number; [QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS]: number; [QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE]: number; [QbdDirectOnboardingState.EXPORT_SETTINGS]: number; @@ -69,7 +69,7 @@ export class QbdDirectOnboardingModel { [QbdDirectOnboardingState.CONNECTION]: 2, [QbdDirectOnboardingState.PENDING_QWC_UPLOAD]: 2, [QbdDirectOnboardingState.INCORRECT_COMPANY_PATH]: 2, - [QbdDirectOnboardingState.IN_CORRECT_PASSWORD]: 2, + [QbdDirectOnboardingState.INCORRECT_PASSWORD]: 2, [QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS]: 2, [QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE]: 2, [QbdDirectOnboardingState.EXPORT_SETTINGS]: 3, diff --git a/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts b/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts index 1ca6255f1..e2c011a8b 100644 --- a/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts +++ b/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.spec.ts @@ -1,7 +1,7 @@ import { TestBed } from '@angular/core/testing'; import { QbdDirectConnectorService } from './qbd-direct-connector.service'; -describe('QbdDirectConnectorService', () => { +xdescribe('QbdDirectConnectorService', () => { let service: QbdDirectConnectorService; beforeEach(() => { diff --git a/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts b/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts index e8cc109fd..9fb0b5d33 100644 --- a/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts +++ b/src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service.ts @@ -1,9 +1,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() { } + constructor( + private apiService: ApiService, + private workspaceService: WorkspaceService + ) { } + + postQbdDirectConntion(payload: QbdConnectorPost): Observable { + return this.apiService.post(`/workspaces/${this.workspaceService.getWorkspaceId()}/connector_settings/`, payload); + } + + syncAttribuites(): Observable { + return this.apiService.get(`/workspaces/${this.workspaceService.getWorkspaceId()}/qbd/attribute_stats/`, {}); + } } diff --git a/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.spec.ts b/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.spec.ts deleted file mode 100644 index 231def711..000000000 --- a/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { QbdDirectConnectorService } from './qbd-direct-connector.service'; - -xdescribe('QbdDirectConnectorService', () => { - let service: QbdDirectConnectorService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(QbdDirectConnectorService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts b/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts deleted file mode 100644 index e8cc109fd..000000000 --- a/src/app/core/services/qbd-direct/qbd-direct-core/qbd-direct-connector.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class QbdDirectConnectorService { - - constructor() { } -} diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html index 3b8bfbaf2..b9bdae9b2 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.html @@ -1 +1,61 @@ - \ No newline at end of file +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+ + +
diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts index 193ffc66d..82548e058 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-connector/qbd-direct-onboarding-connector.component.ts @@ -1,14 +1,235 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; 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'; +import { OnboardingStepper } from 'src/app/core/models/misc/onboarding-stepper.model'; +import { QbdDirectOnboardingModel } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model'; +import { Router } from '@angular/router'; +import { WorkspaceService } from 'src/app/core/services/common/workspace.service'; +import { CommonModule } from '@angular/common'; +import { QbdConnectorGet, SyncDataType } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model'; +import { StorageService } from 'src/app/core/services/common/storage.service'; +import { MinimalUser } from 'src/app/core/models/db/user.model'; +import { QbdDirectWorkspace } from 'src/app/core/models/qbd-direct/db/qbd-direct-workspaces.model'; +import { QbdDirectConnectorService } from 'src/app/core/services/qbd-direct/qbd-direct-configuration/qbd-direct-connector.service'; +import { checkBoxEmit } from 'src/app/core/models/common/helper.model'; +import { interval, switchMap, from, takeWhile } from 'rxjs'; +import { QbdDirectTaskResponse } from 'src/app/core/models/qbd-direct/db/qbd-direct-task-log.model'; +import { IntegrationsToastService } from 'src/app/core/services/common/integrations-toast.service'; @Component({ selector: 'app-qbd-direct-onboarding-connector', standalone: true, - imports: [QbdDirectSharedModule, SharedModule], + imports: [QbdDirectSharedModule, SharedModule, CommonModule], templateUrl: './qbd-direct-onboarding-connector.component.html', styleUrl: './qbd-direct-onboarding-connector.component.scss' }) -export class QbdDirectOnboardingConnectorComponent { +export class QbdDirectOnboardingConnectorComponent implements OnInit { + brandingContent = brandingContent.qbd_direct.configuration.connector; + + onboardingSteps: OnboardingStepper[] = new QbdDirectOnboardingModel().getOnboardingSteps(this.brandingContent.stepName, this.workspaceService.getOnboardingState()); + + isLoading: boolean = true; + + redirectLink: string = brandingKbArticles.onboardingArticles.QBD_DIRECT.CONNECTOR; + + brandingConfig: BrandingConfiguration = brandingConfig; + + ConfigurationCtaText = ConfigurationCta; + + showDownloadLink: boolean; + + isDownloadfileLoading: boolean; + + isConnectionLoading: boolean; + + isDataSyncLoading: boolean = true; + + isDownloadStepCompleted: boolean; + + isConnectionStepCompleted: boolean; + + xmlFileContent: string; + + isCompanyPathInvalid: boolean = true; + + password: string; + + connectionStatus: QBDConnectionStatus; + + isConnectionCTAEnabled: boolean; + + isDialogVisible: boolean; + + qbdFields: SyncDataType[]; + + isDataSyncCTADisabled: boolean; + + user:MinimalUser = this.storageService.get('user'); + + warningDialogText: string; + + appName: string = AppName.QBD_DIRECT; + + constructor( + private router: Router, + private workspaceService: WorkspaceService, + private storageService: StorageService, + private qbdDirectConnectorService: QbdDirectConnectorService, + private toastService: IntegrationsToastService + ) { } + + 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.qbdDirectConnectorService.postQbdDirectConntion({file_location: normalizedPath}).subscribe((connectionResponse: QbdConnectorGet) => { + this.password = connectionResponse.password; + this.xmlFileContent = connectionResponse.qwc; + this.triggerManualDownload(); + this.showDownloadLink = true; + }); + this.isDownloadfileLoading = false; + } + } + + triggerManualDownload() { + const blob = new Blob([this.xmlFileContent], { type: 'text/xml' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + const objectUrl = URL.createObjectURL(blob); + a.href = objectUrl; + a.download = 'fyle_quickbooks.qwc'; + a.click(); + URL.revokeObjectURL(objectUrl); + } + + proceedToConnection() { + this.isDownloadfileLoading = true; + this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: QbdDirectOnboardingState.PENDING_QWC_UPLOAD}).subscribe((workspaceResponse: QbdDirectWorkspace) => { + this.isDownloadStepCompleted = true; + this.isDownloadfileLoading = false; + }); + } + + retry() { + this.showDownloadLink = 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) + ); + } + } + + handleDataSyncState(status: QbdDirectWorkspace) { + const onboardingState = status.onboarding_state; + this.qbdDirectConnectorService.syncAttribuites().subscribe((qbdAttribuites: SyncDataType[]) => { + this.qbdFields = qbdAttribuites; + this.isDataSyncLoading = false; + this.isDataSyncCTADisabled = onboardingState === QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE ? false : true; + }); + } + + handleStatus(status: QbdDirectWorkspace): void { + const onboardingState = status.onboarding_state; + + if (onboardingState === QbdDirectOnboardingState.INCORRECT_COMPANY_PATH) { + // Set connection status, open dialog, and stop polling + this.connectionStatus = QBDConnectionStatus.INCORRECT_COMPANY_PATH; + this.warningDialogText = 'Incorrect company file path detected. Please check and try again.'; + this.isDialogVisible = true; + } else if (onboardingState === QbdDirectOnboardingState.INCORRECT_PASSWORD) { + // Set connection status, open dialog, and stop polling + this.connectionStatus = QBDConnectionStatus.IN_CORRECT_PASSWORD; + this.warningDialogText = 'Incorrect password detected. Please check and try again.'; + this.isDialogVisible = true; + } else if (onboardingState === QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS || onboardingState === QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE) { + // Set success status, enable connection CTA, and stop polling + this.connectionStatus = QBDConnectionStatus.SUCCESS; + this.isConnectionCTAEnabled = true; + } + } + + isTerminalStatus(status: QbdDirectOnboardingState): boolean { + return [QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS, QbdDirectOnboardingState.INCORRECT_PASSWORD, QbdDirectOnboardingState.INCORRECT_COMPANY_PATH, QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE].includes(status); + } + + isTerminalStatusDataSync(status: QbdDirectOnboardingState): boolean { + return [QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE].includes(status); + } + + proceedToSyncData() { + this.isConnectionStepCompleted = true; + this.isDataSyncCTADisabled= true; + this.workspaceService.getWorkspace(this.user.org_id).subscribe((workspaceResponse: QbdDirectWorkspace[]) => { + if (workspaceResponse[0].onboarding_state === QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS) { + interval(3000).pipe( + switchMap(() => this.workspaceService.getWorkspace(this.user.org_id)), // Make HTTP request + takeWhile((status: any) => !this.isTerminalStatusDataSync(status[0].onboarding_state as QbdDirectOnboardingState), true) // Stop if terminal status is reached + ) + .subscribe( + (status) => this.handleDataSyncState(status[0]), + (error) => console.error('Error polling workspace status:', error) + ); + } else { + this.handleDataSyncState(workspaceResponse[0]); + } + }); + } + + + closeDialog(event: any) { + this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: QbdDirectOnboardingState.CONNECTION}).subscribe((workspaceResponse: QbdDirectWorkspace) => { + this.isDialogVisible = false; + this.isConnectionStepCompleted = false; + this.isDownloadStepCompleted = false; + this.showDownloadLink = false; + this.isCompanyPathInvalid = true; + this.isDownloadfileLoading = false; + this.isConnectionLoading = false; + }); + } + + 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'); + }); + } + + + setupPage() { + this.workspaceService.getWorkspace(this.user.org_id).subscribe((workspaceResponse: QbdDirectWorkspace[]) => { + if (workspaceResponse[0].onboarding_state === QbdDirectOnboardingState.PENDING_QWC_UPLOAD) { + this.isDownloadStepCompleted = true; + this.isDownloadfileLoading = false; + } else if (workspaceResponse[0].onboarding_state === QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS || workspaceResponse[0].onboarding_state === QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE) { + this.isDownloadStepCompleted = true; + this.isConnectionStepCompleted = true; + this.isConnectionLoading = false; + this.isDownloadfileLoading = false; + this.proceedToSyncData(); + } + this.isLoading = false; + }); + } + + ngOnInit(): void { + this.setupPage(); + } } diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.html b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.html index 2e6e431e3..95b2235e2 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.html @@ -29,7 +29,7 @@

{{step.label}}

[checkedText]="'Done'" [unCheckedText]="'Mark as done'" [id]="step.id" - (checkBoxUpdated)="qbdWebConnectorStatus($event)"> + (checkBoxUpdated)="updateConnectorStatus($event)">
diff --git a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.ts b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.ts index b4f821959..3b693e7a0 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-onboarding/qbd-direct-onboarding-pre-requisite/qbd-direct-onboarding-pre-requisite.component.ts @@ -4,9 +4,10 @@ import { ActivatedRoute, Router } from '@angular/router'; import { brandingContent, brandingKbArticles } from 'src/app/branding/branding-config'; import { brandingConfig } from 'src/app/branding/c1-contents-config'; import { BrandingConfiguration } from 'src/app/core/models/branding/branding-configuration.model'; -import { checkBoxEmit } from 'src/app/core/models/common/helper.model'; -import { ConfigurationCta, QBDPreRequisiteState } from 'src/app/core/models/enum/enum.model'; +import { CheckBoxUpdate } from 'src/app/core/models/common/helper.model'; +import { ConfigurationCta, QbdDirectOnboardingState, QBDPreRequisiteState } from 'src/app/core/models/enum/enum.model'; import { OnboardingStepper } from 'src/app/core/models/misc/onboarding-stepper.model'; +import { QbdDirectWorkspace } from 'src/app/core/models/qbd-direct/db/qbd-direct-workspaces.model'; import { QBDPrerequisiteObject } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model'; import { QbdDirectOnboardingModel } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-onboarding.model'; import { IntegrationsToastService } from 'src/app/core/services/common/integrations-toast.service'; @@ -46,7 +47,7 @@ export class QbdDirectOnboardingPreRequisiteComponent { caption: 'Download and install the QuickBooks Web Connector on the system where QuickBooks Desktop is installed.', externalLink: 'https://qbd.com', iconName: 'download-medium', - state: QBDPreRequisiteState.COMPLETE // INCOMPLETE + state: QBDPreRequisiteState.INCOMPLETE }, { id: 2, @@ -54,22 +55,29 @@ export class QbdDirectOnboardingPreRequisiteComponent { caption: 'Make sure the QuickBooks Company you want to connect to Fyle is open during the integration setup.', externalLink: 'https://qbd.com', iconName: 'expand', - state: QBDPreRequisiteState.INCOMPLETE // INCOMPLETE + state: QBDPreRequisiteState.INCOMPLETE } ]; constructor( - private route: ActivatedRoute, private router: Router, - private toastService: IntegrationsToastService, - private workspaceService: WorkspaceService, - private storageService: StorageService + private workspaceService: WorkspaceService ) { } - qbdWebConnectorStatus(status: checkBoxEmit): void { + updateConnectorStatus(status: CheckBoxUpdate): void { + this.preRequisitesteps[status.id-1].state = status.value ? QBDPreRequisiteState.COMPLETE : QBDPreRequisiteState.INCOMPLETE; + if (this.preRequisitesteps[0].state === QBDPreRequisiteState.COMPLETE && this.preRequisitesteps[1].state === QBDPreRequisiteState.COMPLETE) { + this.isContinueDisabled = false; + } } continueToNextStep(): void{ + this.saveInProgress = true; + this.workspaceService.updateWorkspaceOnboardingState({onboarding_state: QbdDirectOnboardingState.CONNECTION}).subscribe((workspaceResponse: QbdDirectWorkspace) => { + this.workspaceService.setOnboardingState(workspaceResponse.onboarding_state); + this.saveInProgress = false; + this.router.navigate([`/integrations/qbd_direct/onboarding/connector`]); + }); } } diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html index 75974873e..a66e1d4b7 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.html @@ -1 +1,37 @@ -

qbd-direct-data-sync works!

+
+
+
+
+
+ 3 +
+
+ Data sync +
+
+
+
+
+
+ {{field.attribute_type | snakeCaseToSpaceCase | titlecase}} +
+
+ {{field.count}} +
+ +
+
+
+
+
+ +
+
+ + Loading +
+
+
+ +
+
\ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.scss b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.scss index e69de29bb..9e2f0909e 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.scss +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.scss @@ -0,0 +1,12 @@ +.spin-icon { + animation: rotate 2s linear infinite; +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.spec.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.spec.ts index 4aeeb531e..03812427f 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.spec.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { QbdDirectDataSyncComponent } from './qbd-direct-data-sync.component'; -describe('QbdDirectDataSyncComponent', () => { +xdescribe('QbdDirectDataSyncComponent', () => { let component: QbdDirectDataSyncComponent; let fixture: ComponentFixture; diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts index ba0030639..9c7cd0190 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-data-sync/qbd-direct-data-sync.component.ts @@ -1,12 +1,38 @@ -import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ConfigurationCta } from 'src/app/core/models/enum/enum.model'; +import { SyncDataType } from 'src/app/core/models/qbd-direct/qbd-direct-configuration/qbd-direct-connector.model'; +import { SharedModule } from 'src/app/shared/shared.module'; @Component({ selector: 'app-qbd-direct-data-sync', standalone: true, - imports: [], + imports: [CommonModule, SharedModule], templateUrl: './qbd-direct-data-sync.component.html', styleUrl: './qbd-direct-data-sync.component.scss' }) -export class QbdDirectDataSyncComponent { +export class QbdDirectDataSyncComponent implements OnInit { + + @Input({required: true}) qbdFields: SyncDataType[]; + + @Input({required: true}) isLoading: boolean; + + @Input({required: true}) isCTAEnabled: boolean; + + @Input({required: true}) showSection: boolean; + + @Output() continueClick = new EventEmitter(); + + fieldLength: number; + + ConfigurationCtaText = ConfigurationCta; + + onContinueClick() { + this.continueClick.emit(); + } + + ngOnInit() { + this.fieldLength = this.qbdFields?.length; + } } diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html index 946d3b138..67247feca 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.html @@ -1,4 +1,4 @@ -
+
@@ -15,7 +15,7 @@
-
+

Enter company file path

Enter the file path of your company to generate the integration file. Watch the video for guidance on locating company file path. @@ -24,19 +24,19 @@

Enter company file p -
- +
+ Enter a valid company file path.
- +

@@ -55,7 +55,7 @@

Enter company file p Loading

-
+
diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts index 78a1efb58..4952f2632 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-download-file/qbd-direct-download-file.component.ts @@ -1,10 +1,9 @@ -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { SharedModule } from "../../../../shared/shared.module"; import { QbdDirectSharedComponent } from '../qbd-direct-shared.component'; import { CardModule } from 'primeng/card'; import { ConfigurationCta } from 'src/app/core/models/enum/enum.model'; import { CommonModule } from '@angular/common'; -import { required } from '@rxweb/reactive-form-validators'; import { ProgressSpinnerModule } from 'primeng/progressspinner'; @Component({ @@ -24,23 +23,32 @@ export class QbdDirectDownloadFileComponent { @Input({required: true}) isCompanyPathInvalid: boolean; + @Output() nextStep = new EventEmitter(); + + @Output() downloadClick: EventEmitter = new EventEmitter(); + + @Output() retryClick = new EventEmitter(); + + @Output() manualDownload = new EventEmitter(); + downloadFilePath: string; ConfigurationCtaText = ConfigurationCta; continueToNextStep() { + this.nextStep.emit(); } onDownloadClick() { - // Emit output + this.downloadClick.emit(this.downloadFilePath); } onManualDownload() { - // Emit output + this.manualDownload.emit(); } onRetryClick() { - // Emit output + this.retryClick.emit(); } } diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html index f055284e3..e87610ef4 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.html @@ -1 +1,101 @@ -

qbd-direct-setup-connection works!

+
+
+
+
+
+ 2 +
+
+ Set up Quickbooks web connector +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+

Open the integration file using QuickBooks Web Connector

+

Watch the video for guidance on opening the downloaded integration file in QuickBooks Web Connector.

+
+
+
+
+
+
+ +
+
+

Use this password to set up the connection

+
+
+

****{{password.slice(4)}}

+

{{password}}

+
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+

Click on ‘Update Selected’ on QuickBooks Web Connector

+

Click the 'Update Selected' option to initiate a connection between Fyle and QuickBooks Desktop

+
+
+
+
+
+ +
+ +
+
+
+
+
+ + +
+
+ + Connecting to QuickBooks Desktop... +
+
+
+ +
+
+

Success!

+ You're now connected to QuickBooks Desktop. +
+
+
+
+ +
+
\ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.scss b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.scss index e69de29bb..2758927f7 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.scss +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.scss @@ -0,0 +1,7 @@ +:host ::ng-deep .p-card-body, :host ::ng-deep .p-card-content { + @apply tw-p-0 #{!important}; +} + +:host ::ng-deep .p-card-body { + @apply tw-rounded-border-radius-2xl #{!important} +} \ No newline at end of file diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.spec.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.spec.ts index ec66bd016..9b62bb252 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.spec.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { QbdDirectSetupConnectionComponent } from './qbd-direct-setup-connection.component'; -describe('QbdDirectSetupConnectionComponent', () => { +xdescribe('QbdDirectSetupConnectionComponent', () => { let component: QbdDirectSetupConnectionComponent; let fixture: ComponentFixture; diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts index a481dbed0..0dd6b06ee 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-setup-connection/qbd-direct-setup-connection.component.ts @@ -1,12 +1,74 @@ -import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { SharedModule } from 'src/app/shared/shared.module'; +import { CardModule } from 'primeng/card'; +import { ConfigurationCta, QBDConnectionStatus } from 'src/app/core/models/enum/enum.model'; +import { brandingConfig } from 'src/app/branding/branding-config'; +import { CheckBoxUpdate } from 'src/app/core/models/common/helper.model'; +import { MessageService } from 'primeng/api'; @Component({ selector: 'app-qbd-direct-setup-connection', standalone: true, - imports: [], + imports: [CommonModule, SharedModule, CardModule], templateUrl: './qbd-direct-setup-connection.component.html', styleUrl: './qbd-direct-setup-connection.component.scss' }) export class QbdDirectSetupConnectionComponent { + @Input({required: true}) password: string = '098765'; + + @Input({required: true}) isLoading: boolean; + + @Input({required: true}) connectionStatus: QBDConnectionStatus; + + @Input({required: true}) isStepCompleted: boolean; + + @Input({required: true}) isCTAEnabled: boolean; + + @Input({required: true}) showSection: boolean; + + @Output() doneClick: EventEmitter = new EventEmitter(); + + @Output() nextClick = new EventEmitter(); + + qbdConnectionStatus = QBDConnectionStatus; + + ConfigurationCtaText = ConfigurationCta; + + isPasswordShown: boolean = false; + + readonly brandingConfig = brandingConfig; + + constructor(private messageService: MessageService) {} + + onDoneClick(event: CheckBoxUpdate) { + this.doneClick.emit(event); + } + + onNextClick() { + this.nextClick.emit(); + } + + 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(); + } + + showPassword(isPasswordVisible: boolean) { + this.isPasswordShown = isPasswordVisible; + } + } diff --git a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts index a2c70a6b1..894f3d22b 100644 --- a/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts +++ b/src/app/integrations/qbd-direct/qbd-direct-shared/qbd-direct-shared.module.ts @@ -2,16 +2,22 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SharedModule } from 'src/app/shared/shared.module'; import { QbdDirectDownloadFileComponent } from './qbd-direct-download-file/qbd-direct-download-file.component'; +import { QbdDirectSetupConnectionComponent } from './qbd-direct-setup-connection/qbd-direct-setup-connection.component'; +import { QbdDirectDataSyncComponent } from './qbd-direct-data-sync/qbd-direct-data-sync.component'; @NgModule({ declarations: [], imports: [ CommonModule, SharedModule, - QbdDirectDownloadFileComponent + QbdDirectDownloadFileComponent, + QbdDirectSetupConnectionComponent, + QbdDirectDataSyncComponent ], exports: [ - QbdDirectDownloadFileComponent + QbdDirectDownloadFileComponent, + QbdDirectSetupConnectionComponent, + QbdDirectDataSyncComponent ] }) export class QbdDirectSharedModule { } diff --git a/src/app/integrations/qbd-direct/qbd-direct.component.ts b/src/app/integrations/qbd-direct/qbd-direct.component.ts index 0da358118..02211d073 100644 --- a/src/app/integrations/qbd-direct/qbd-direct.component.ts +++ b/src/app/integrations/qbd-direct/qbd-direct.component.ts @@ -41,14 +41,14 @@ export class QbdDirectComponent implements OnInit { private navigate(): void { const pathName = this.windowReference.location.pathname; - if (pathName === '/integrations/qbo') { + if (pathName === '/integrations/qbd_direct') { const onboardingStateComponentMap = { [QbdDirectOnboardingState.YET_TO_START]: '/integrations/qbd_direct/onboarding/landing', - [QbdDirectOnboardingState.CONFIRM_PRE_REQUISITES]: '/integrations/qbd_direct/onboarding/connector', + [QbdDirectOnboardingState.CONFIRM_PRE_REQUISITES]: '/integrations/qbd_direct/onboarding/pre_requisite', [QbdDirectOnboardingState.CONNECTION]: '/integrations/qbd_direct/onboarding/connector', [QbdDirectOnboardingState.PENDING_QWC_UPLOAD]: '/integrations/qbd_direct/onboarding/connector', [QbdDirectOnboardingState.INCORRECT_COMPANY_PATH]: '/integrations/qbd_direct/onboarding/connector', - [QbdDirectOnboardingState.IN_CORRECT_PASSWORD]: '/integrations/qbd_direct/onboarding/connector', + [QbdDirectOnboardingState.INCORRECT_PASSWORD]: '/integrations/qbd_direct/onboarding/connector', [QbdDirectOnboardingState.DESTINATION_SYNC_IN_PROGRESS]: '/integrations/qbd_direct/onboarding/connector', [QbdDirectOnboardingState.DESTINATION_SYNC_COMPLETE]: '/integrations/qbd_direct/onboarding/connector', [QbdDirectOnboardingState.EXPORT_SETTINGS]: '/integrations/qbd_direct/onboarding/export_settings', diff --git a/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html b/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html index fc777e102..64b67f77c 100644 --- a/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html +++ b/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.html @@ -3,20 +3,36 @@
-
+
+
+ +

{{headerText}}

-
+
-
+
Are you sure you want to continue?
+
+

Common QuickBooks Web Connector errors and solutions

+ +
diff --git a/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts b/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts index c9f722308..68319d1dd 100644 --- a/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts +++ b/src/app/shared/components/configuration/configuration-confirmation-dialog/configuration-confirmation-dialog.component.ts @@ -1,6 +1,6 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { brandingConfig } from 'src/app/branding/branding-config'; -import { ConfigurationWarningEvent } from 'src/app/core/models/enum/enum.model'; +import { AppName, ConfigurationWarningEvent } from 'src/app/core/models/enum/enum.model'; import { ConfigurationWarningOut } from 'src/app/core/models/misc/configuration-warning.model'; @Component({ @@ -22,10 +22,20 @@ export class ConfigurationConfirmationDialogComponent implements OnInit { @Input() event: ConfigurationWarningEvent; + @Input() appName: string; + + @Input() subLable: string; + + @Input() redirectLink: string; + @Output() warningAccepted = new EventEmitter(); readonly brandingConfig = brandingConfig; + AppName = AppName; + + brandIcon: string; + constructor() { } acceptWarning(isWarningAccepted: boolean) { @@ -33,6 +43,7 @@ export class ConfigurationConfirmationDialogComponent implements OnInit { } ngOnInit(): void { + this.brandIcon = `assets/${brandingConfig.brandId === 'co' ? 'co' : 'fyle'}/favicon.png`; } } diff --git a/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.html b/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.html index 2152a57d2..450896d60 100644 --- a/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.html +++ b/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.html @@ -1,6 +1,6 @@
-
+
diff --git a/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.ts b/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.ts index 12840c664..83284e20a 100644 --- a/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.ts +++ b/src/app/shared/components/configuration/configuration-info-label/configuration-info-label.component.ts @@ -9,6 +9,8 @@ export class ConfigurationInfoLabelComponent implements OnInit { @Input() infoText: string; + @Input() showIcon: boolean = true; + constructor() { } ngOnInit(): void { diff --git a/src/app/shared/components/core/svg-icon/svg-icon.component.ts b/src/app/shared/components/core/svg-icon/svg-icon.component.ts index 733b5bda9..506b69d4e 100644 --- a/src/app/shared/components/core/svg-icon/svg-icon.component.ts +++ b/src/app/shared/components/core/svg-icon/svg-icon.component.ts @@ -56,7 +56,11 @@ const ICON_MAPPING = { 'arrow-left-medium': 'grv-chevron-left-medium', 'arrow-right-medium': 'grv-chevron-right-medium', 'arrow-bar-left-medium': 'grv-chevron-first-medium', - 'arrow-bar-right-medium': 'grv-chevron-last-medium' + 'arrow-bar-right-medium': 'grv-chevron-last-medium', + 'upload': 'grv-upload', + 'lock': 'grv-lock', + 'eye-slash-medium': 'grv-show-hide-medium', + 'eye-medium': 'grv-show-medium' }; @Component({ diff --git a/src/app/shared/components/input/checkbox-button/checkbox-button.component.ts b/src/app/shared/components/input/checkbox-button/checkbox-button.component.ts index b46fff470..526d0eed9 100644 --- a/src/app/shared/components/input/checkbox-button/checkbox-button.component.ts +++ b/src/app/shared/components/input/checkbox-button/checkbox-button.component.ts @@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ButtonModule } from 'primeng/button'; import { brandingConfig } from 'src/app/branding/branding-config'; -import { checkBoxEvent } from 'src/app/core/models/common/helper.model'; +import { CheckBoxUpdate } from 'src/app/core/models/common/helper.model'; @Component({ selector: 'app-checkbox-button', @@ -19,7 +19,7 @@ export class CheckboxButtonComponent { @Input({required: true}) id: number; - @Output() checkBoxUpdated: EventEmitter = new EventEmitter(); + @Output() checkBoxUpdated: EventEmitter = new EventEmitter(); isCheckboxSelected: boolean = false; diff --git a/src/assets/fyle/favicon.png b/src/assets/fyle/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b19c9b924fd95176b124c7546fff3027f68ce58f GIT binary patch literal 1086 zcmbW0y-Nc@5XD!tvxrz&r;HknR)Sz(YXVp0gAA&ns*M#aCtFC-!oECrFEWekGB zSZE`$uu%wND_HK#bLN&5iX@lZ@%Ff7f6UCASz|in4fGgUgC^8vOrJ3(BnpUvBHh=g z)M-p_x0AOa%i=ITL})|GQ5&4bQjV344FSPx# literal 0 HcmV?d00001 diff --git a/src/assets/icons/co/grv-lock.svg b/src/assets/icons/co/grv-lock.svg new file mode 100644 index 000000000..afa3d3332 --- /dev/null +++ b/src/assets/icons/co/grv-lock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/co/grv-show-hide-medium.svg b/src/assets/icons/co/grv-show-hide-medium.svg new file mode 100644 index 000000000..088384b52 --- /dev/null +++ b/src/assets/icons/co/grv-show-hide-medium.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/co/grv-show-medium.svg b/src/assets/icons/co/grv-show-medium.svg new file mode 100644 index 000000000..1e53e5a74 --- /dev/null +++ b/src/assets/icons/co/grv-show-medium.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/co/grv-upload.svg b/src/assets/icons/co/grv-upload.svg new file mode 100644 index 000000000..36362d53f --- /dev/null +++ b/src/assets/icons/co/grv-upload.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/eye-medium.svg b/src/assets/icons/eye-medium.svg new file mode 100644 index 000000000..612642ff3 --- /dev/null +++ b/src/assets/icons/eye-medium.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/eye-slash-medium.svg b/src/assets/icons/eye-slash-medium.svg new file mode 100644 index 000000000..e436dfdbc --- /dev/null +++ b/src/assets/icons/eye-slash-medium.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/lock.svg b/src/assets/icons/lock.svg new file mode 100644 index 000000000..c78861d0d --- /dev/null +++ b/src/assets/icons/lock.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/upload.svg b/src/assets/icons/upload.svg new file mode 100644 index 000000000..2ab8c53b0 --- /dev/null +++ b/src/assets/icons/upload.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/sprites/sprite.svg b/src/assets/sprites/sprite.svg index 8a0908154..a78869e80 100644 --- a/src/assets/sprites/sprite.svg +++ b/src/assets/sprites/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file