camera fix

This commit is contained in:
Venba 2023-12-18 17:44:35 +05:30
parent 24330999bd
commit 154e6b0f99
27 changed files with 710 additions and 303 deletions

View File

@ -9,8 +9,10 @@ android {
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies { dependencies {
implementation project(':aparajita-capacitor-biometric-auth')
implementation project(':capacitor-app') implementation project(':capacitor-app')
implementation project(':capacitor-camera') implementation project(':capacitor-camera')
implementation project(':capacitor-filesystem')
implementation project(':capacitor-geolocation') implementation project(':capacitor-geolocation')
implementation project(':capacitor-haptics') implementation project(':capacitor-haptics')
implementation project(':capacitor-keyboard') implementation project(':capacitor-keyboard')

View File

@ -41,5 +41,9 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" /> <uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
</manifest> </manifest>

View File

@ -2,12 +2,18 @@
include ':capacitor-android' include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
include ':aparajita-capacitor-biometric-auth'
project(':aparajita-capacitor-biometric-auth').projectDir = new File('../node_modules/@aparajita/capacitor-biometric-auth/android')
include ':capacitor-app' include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
include ':capacitor-camera' include ':capacitor-camera'
project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/camera/android') project(':capacitor-camera').projectDir = new File('../node_modules/@capacitor/camera/android')
include ':capacitor-filesystem'
project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android')
include ':capacitor-geolocation' include ':capacitor-geolocation'
project(':capacitor-geolocation').projectDir = new File('../node_modules/@capacitor/geolocation/android') project(':capacitor-geolocation').projectDir = new File('../node_modules/@capacitor/geolocation/android')

View File

@ -2,6 +2,7 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>NSFaceIDUsageDescription</key>
<key>CFBundleURLTypes</key> <key>CFBundleURLTypes</key>
<array> <array>
<dict> <dict>

View File

@ -11,8 +11,10 @@ install! 'cocoapods', :disable_input_output_paths => true
def capacitor_pods def capacitor_pods
pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
pod 'AparajitaCapacitorBiometricAuth', :path => '../../node_modules/@aparajita/capacitor-biometric-auth'
pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
pod 'CapacitorCamera', :path => '../../node_modules/@capacitor/camera' pod 'CapacitorCamera', :path => '../../node_modules/@capacitor/camera'
pod 'CapacitorFilesystem', :path => '../../node_modules/@capacitor/filesystem'
pod 'CapacitorGeolocation', :path => '../../node_modules/@capacitor/geolocation' pod 'CapacitorGeolocation', :path => '../../node_modules/@capacitor/geolocation'
pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'

153
package-lock.json generated
View File

@ -17,11 +17,13 @@
"@angular/platform-browser": "^16.0.0", "@angular/platform-browser": "^16.0.0",
"@angular/platform-browser-dynamic": "^16.0.0", "@angular/platform-browser-dynamic": "^16.0.0",
"@angular/router": "^16.0.0", "@angular/router": "^16.0.0",
"@aparajita/capacitor-biometric-auth": "^6.0.0",
"@awesome-cordova-plugins/core": "6.4.0", "@awesome-cordova-plugins/core": "6.4.0",
"@capacitor/android": "5.5.1", "@capacitor/android": "5.5.1",
"@capacitor/app": "^5.0.6", "@capacitor/app": "^5.0.6",
"@capacitor/camera": "^5.0.7", "@capacitor/camera": "^5.0.7",
"@capacitor/core": "^5.5.1", "@capacitor/core": "^5.6.0",
"@capacitor/filesystem": "^5.1.4",
"@capacitor/geolocation": "^5.0.6", "@capacitor/geolocation": "^5.0.6",
"@capacitor/haptics": "5.0.6", "@capacitor/haptics": "5.0.6",
"@capacitor/ios": "5.5.1", "@capacitor/ios": "5.5.1",
@ -39,6 +41,7 @@
"ionicons": "^7.0.0", "ionicons": "^7.0.0",
"ng2-pdf-viewer": "^10.0.0", "ng2-pdf-viewer": "^10.0.0",
"ngx-image-compress": "^15.1.6", "ngx-image-compress": "^15.1.6",
"ngx-ionic-image-viewer": "^0.7.4",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"watermarkjs": "^2.1.1", "watermarkjs": "^2.1.1",
@ -67,6 +70,7 @@
"eslint-plugin-prefer-arrow": "1.2.2", "eslint-plugin-prefer-arrow": "1.2.2",
"jasmine-core": "~4.6.0", "jasmine-core": "~4.6.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"jeep-photoviewer": "^1.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0", "karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",
@ -856,6 +860,20 @@
"rxjs": "^6.5.3 || ^7.4.0" "rxjs": "^6.5.3 || ^7.4.0"
} }
}, },
"node_modules/@aparajita/capacitor-biometric-auth": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@aparajita/capacitor-biometric-auth/-/capacitor-biometric-auth-6.0.0.tgz",
"integrity": "sha512-9ASoFywLRNZIpqlI0E3Iow5fiZe8YyCTzsSSATpRlALvnUFGzJf9s/RGl1D89t8Eidu4M1Hb/lsXWaS3IiC0rA==",
"dependencies": {
"@capacitor/android": "^5.5.1",
"@capacitor/app": "^5.0.6",
"@capacitor/core": "^5.5.1",
"@capacitor/ios": "^5.5.1"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@assemblyscript/loader": { "node_modules/@assemblyscript/loader": {
"version": "0.10.1", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
@ -2914,13 +2932,21 @@
} }
}, },
"node_modules/@capacitor/core": { "node_modules/@capacitor/core": {
"version": "5.5.1", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.5.1.tgz", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.6.0.tgz",
"integrity": "sha512-VG6Iv8Q7ZAbvjodxpvjcSe0jfxUwZXnvjbi93ehuJ6eYP8U926qLSXyrT/DToZq+F6v/HyGyVgn3mrE/9jW2Tg==", "integrity": "sha512-xJhCOUGPHw0QYDA3YH+CmL6qiV9DH4Ij3yPxSenymjrtLuXI197u9ddCZwGEwgVIkh9kGZBBKzsNkn89SZ2gdQ==",
"dependencies": { "dependencies": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
}, },
"node_modules/@capacitor/filesystem": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-5.1.4.tgz",
"integrity": "sha512-10EM1KvFMs+pTzxkcflspzxBWcX9sOnS9nTP5Afjr5hn4OxLrwTFySw2Z12Uv6jdN4OnhY3jXtDKXPljXvXILg==",
"peerDependencies": {
"@capacitor/core": "^5.1.1"
}
},
"node_modules/@capacitor/geolocation": { "node_modules/@capacitor/geolocation": {
"version": "5.0.6", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/@capacitor/geolocation/-/geolocation-5.0.6.tgz", "resolved": "https://registry.npmjs.org/@capacitor/geolocation/-/geolocation-5.0.6.tgz",
@ -3542,11 +3568,11 @@
} }
}, },
"node_modules/@ionic/angular": { "node_modules/@ionic/angular": {
"version": "7.5.2", "version": "7.6.1",
"resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.5.2.tgz", "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.6.1.tgz",
"integrity": "sha512-VFgoFw1+9jbcbh2Pm7RLd/Dsf1u6ZxdLbdWhHKY79Xh6hNKVLms+YCvbs08ppCZ0wpBaogJP/5xPVMJ/yjYtRg==", "integrity": "sha512-Eh//g/bAL9se4PD6C19NqymgQbqKp4W+Ffbjo8Qnqwk02jGMs/jcMP0WVEcLNiEws2m67kIiWItrUhJjb8pplA==",
"dependencies": { "dependencies": {
"@ionic/core": "7.5.2", "@ionic/core": "7.6.1",
"ionicons": "^7.0.0", "ionicons": "^7.0.0",
"jsonc-parser": "^3.0.0", "jsonc-parser": "^3.0.0",
"tslib": "^2.3.0" "tslib": "^2.3.0"
@ -3675,11 +3701,11 @@
} }
}, },
"node_modules/@ionic/core": { "node_modules/@ionic/core": {
"version": "7.5.2", "version": "7.6.1",
"resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.5.2.tgz", "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.6.1.tgz",
"integrity": "sha512-0O8YgaE7CzrhDLGpnNq2Ia4bR+qFE1uHJHafoNWhoTXkydNnqSMZlxMCvtSetfv9bwLic93lcXYNoZ8I8zV3XA==", "integrity": "sha512-o4PSRxokfRB5H3E5DAM7xivG8XFXaXD3+U/tha0QKemiMSntqgPqy0FYX0pNEwIrV3llRzFbAGNqyvB1+BG97Q==",
"dependencies": { "dependencies": {
"@stencil/core": "^4.6.0", "@stencil/core": "^4.8.2",
"ionicons": "^7.2.1", "ionicons": "^7.2.1",
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@ -5544,9 +5570,9 @@
"dev": true "dev": true
}, },
"node_modules/@stencil/core": { "node_modules/@stencil/core": {
"version": "4.6.0", "version": "4.8.2",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.2.tgz",
"integrity": "sha512-5Y6/fP28aspPDRB+Tz5GuB1jRVGuUEk5/rnyE8ACGcuzEOG+zR0A/IHRJSU3XmCxUlVDKfKoO6St5W84oUCVMA==", "integrity": "sha512-KdZEAtz9VnqMtXOkf51+8mphyRt0fN/LYgtj5M8gnveGspG8KzoyTDzlWt0wsstWIsJJ21RA1yd3AgMMZiu3MA==",
"bin": { "bin": {
"stencil": "bin/stencil" "stencil": "bin/stencil"
}, },
@ -13073,6 +13099,15 @@
"colors": "1.4.0" "colors": "1.4.0"
} }
}, },
"node_modules/jeep-photoviewer": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/jeep-photoviewer/-/jeep-photoviewer-1.2.0.tgz",
"integrity": "sha512-T/vvCtH5IXZ1ZJPDxy2Mg57Fn8BzwAG2MtdUJxNIfLtP7r5QtL2gJKyP9kgbSBUOkAEjRTluX8YM4NDhaYfJAA==",
"dev": true,
"dependencies": {
"@stencil/core": "^4.0.0"
}
},
"node_modules/jest-worker": { "node_modules/jest-worker": {
"version": "27.5.1", "version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
@ -15068,6 +15103,25 @@
"@angular/core": "x.x.x" "@angular/core": "x.x.x"
} }
}, },
"node_modules/ngx-ionic-image-viewer": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/ngx-ionic-image-viewer/-/ngx-ionic-image-viewer-0.7.5.tgz",
"integrity": "sha512-GZ13aRGqEAww+5qjOfb5EJDIrxe3SD/V+2zoKo7YAQqa/BLMRKkWRgRTw0gxZxcFrzkEd89ge1WaAWLbNwp6vg==",
"deprecated": "This package is deprecated and no longer maintained.",
"dependencies": {
"tslib": "^1.9.0"
},
"peerDependencies": {
"@angular/common": ">=8.2.13",
"@angular/core": ">=8.2.13",
"@ionic/angular": ">=4.0.0"
}
},
"node_modules/ngx-ionic-image-viewer/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/nice-napi": { "node_modules/nice-napi": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",
@ -21492,6 +21546,17 @@
"tslib": "^2.3.0" "tslib": "^2.3.0"
} }
}, },
"@aparajita/capacitor-biometric-auth": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@aparajita/capacitor-biometric-auth/-/capacitor-biometric-auth-6.0.0.tgz",
"integrity": "sha512-9ASoFywLRNZIpqlI0E3Iow5fiZe8YyCTzsSSATpRlALvnUFGzJf9s/RGl1D89t8Eidu4M1Hb/lsXWaS3IiC0rA==",
"requires": {
"@capacitor/android": "^5.5.1",
"@capacitor/app": "^5.0.6",
"@capacitor/core": "^5.5.1",
"@capacitor/ios": "^5.5.1"
}
},
"@assemblyscript/loader": { "@assemblyscript/loader": {
"version": "0.10.1", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz",
@ -22960,13 +23025,19 @@
} }
}, },
"@capacitor/core": { "@capacitor/core": {
"version": "5.5.1", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.5.1.tgz", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-5.6.0.tgz",
"integrity": "sha512-VG6Iv8Q7ZAbvjodxpvjcSe0jfxUwZXnvjbi93ehuJ6eYP8U926qLSXyrT/DToZq+F6v/HyGyVgn3mrE/9jW2Tg==", "integrity": "sha512-xJhCOUGPHw0QYDA3YH+CmL6qiV9DH4Ij3yPxSenymjrtLuXI197u9ddCZwGEwgVIkh9kGZBBKzsNkn89SZ2gdQ==",
"requires": { "requires": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
}, },
"@capacitor/filesystem": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/@capacitor/filesystem/-/filesystem-5.1.4.tgz",
"integrity": "sha512-10EM1KvFMs+pTzxkcflspzxBWcX9sOnS9nTP5Afjr5hn4OxLrwTFySw2Z12Uv6jdN4OnhY3jXtDKXPljXvXILg==",
"requires": {}
},
"@capacitor/geolocation": { "@capacitor/geolocation": {
"version": "5.0.6", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/@capacitor/geolocation/-/geolocation-5.0.6.tgz", "resolved": "https://registry.npmjs.org/@capacitor/geolocation/-/geolocation-5.0.6.tgz",
@ -23324,11 +23395,11 @@
} }
}, },
"@ionic/angular": { "@ionic/angular": {
"version": "7.5.2", "version": "7.6.1",
"resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.5.2.tgz", "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-7.6.1.tgz",
"integrity": "sha512-VFgoFw1+9jbcbh2Pm7RLd/Dsf1u6ZxdLbdWhHKY79Xh6hNKVLms+YCvbs08ppCZ0wpBaogJP/5xPVMJ/yjYtRg==", "integrity": "sha512-Eh//g/bAL9se4PD6C19NqymgQbqKp4W+Ffbjo8Qnqwk02jGMs/jcMP0WVEcLNiEws2m67kIiWItrUhJjb8pplA==",
"requires": { "requires": {
"@ionic/core": "7.5.2", "@ionic/core": "7.6.1",
"ionicons": "^7.0.0", "ionicons": "^7.0.0",
"jsonc-parser": "^3.0.0", "jsonc-parser": "^3.0.0",
"tslib": "^2.3.0" "tslib": "^2.3.0"
@ -23420,11 +23491,11 @@
} }
}, },
"@ionic/core": { "@ionic/core": {
"version": "7.5.2", "version": "7.6.1",
"resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.5.2.tgz", "resolved": "https://registry.npmjs.org/@ionic/core/-/core-7.6.1.tgz",
"integrity": "sha512-0O8YgaE7CzrhDLGpnNq2Ia4bR+qFE1uHJHafoNWhoTXkydNnqSMZlxMCvtSetfv9bwLic93lcXYNoZ8I8zV3XA==", "integrity": "sha512-o4PSRxokfRB5H3E5DAM7xivG8XFXaXD3+U/tha0QKemiMSntqgPqy0FYX0pNEwIrV3llRzFbAGNqyvB1+BG97Q==",
"requires": { "requires": {
"@stencil/core": "^4.6.0", "@stencil/core": "^4.8.2",
"ionicons": "^7.2.1", "ionicons": "^7.2.1",
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@ -24981,9 +25052,9 @@
"dev": true "dev": true
}, },
"@stencil/core": { "@stencil/core": {
"version": "4.6.0", "version": "4.8.2",
"resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.8.2.tgz",
"integrity": "sha512-5Y6/fP28aspPDRB+Tz5GuB1jRVGuUEk5/rnyE8ACGcuzEOG+zR0A/IHRJSU3XmCxUlVDKfKoO6St5W84oUCVMA==" "integrity": "sha512-KdZEAtz9VnqMtXOkf51+8mphyRt0fN/LYgtj5M8gnveGspG8KzoyTDzlWt0wsstWIsJJ21RA1yd3AgMMZiu3MA=="
}, },
"@tootallnate/once": { "@tootallnate/once": {
"version": "1.1.2", "version": "1.1.2",
@ -30730,6 +30801,15 @@
"colors": "1.4.0" "colors": "1.4.0"
} }
}, },
"jeep-photoviewer": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/jeep-photoviewer/-/jeep-photoviewer-1.2.0.tgz",
"integrity": "sha512-T/vvCtH5IXZ1ZJPDxy2Mg57Fn8BzwAG2MtdUJxNIfLtP7r5QtL2gJKyP9kgbSBUOkAEjRTluX8YM4NDhaYfJAA==",
"dev": true,
"requires": {
"@stencil/core": "^4.0.0"
}
},
"jest-worker": { "jest-worker": {
"version": "27.5.1", "version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
@ -32275,6 +32355,21 @@
"tslib": "^2.5.0" "tslib": "^2.5.0"
} }
}, },
"ngx-ionic-image-viewer": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/ngx-ionic-image-viewer/-/ngx-ionic-image-viewer-0.7.5.tgz",
"integrity": "sha512-GZ13aRGqEAww+5qjOfb5EJDIrxe3SD/V+2zoKo7YAQqa/BLMRKkWRgRTw0gxZxcFrzkEd89ge1WaAWLbNwp6vg==",
"requires": {
"tslib": "^1.9.0"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
}
},
"nice-napi": { "nice-napi": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz",

View File

@ -22,11 +22,13 @@
"@angular/platform-browser": "^16.0.0", "@angular/platform-browser": "^16.0.0",
"@angular/platform-browser-dynamic": "^16.0.0", "@angular/platform-browser-dynamic": "^16.0.0",
"@angular/router": "^16.0.0", "@angular/router": "^16.0.0",
"@aparajita/capacitor-biometric-auth": "^6.0.0",
"@awesome-cordova-plugins/core": "6.4.0", "@awesome-cordova-plugins/core": "6.4.0",
"@capacitor/android": "5.5.1", "@capacitor/android": "5.5.1",
"@capacitor/app": "^5.0.6", "@capacitor/app": "^5.0.6",
"@capacitor/camera": "^5.0.7", "@capacitor/camera": "^5.0.7",
"@capacitor/core": "^5.5.1", "@capacitor/core": "^5.6.0",
"@capacitor/filesystem": "^5.1.4",
"@capacitor/geolocation": "^5.0.6", "@capacitor/geolocation": "^5.0.6",
"@capacitor/haptics": "5.0.6", "@capacitor/haptics": "5.0.6",
"@capacitor/ios": "5.5.1", "@capacitor/ios": "5.5.1",
@ -44,6 +46,7 @@
"ionicons": "^7.0.0", "ionicons": "^7.0.0",
"ng2-pdf-viewer": "^10.0.0", "ng2-pdf-viewer": "^10.0.0",
"ngx-image-compress": "^15.1.6", "ngx-image-compress": "^15.1.6",
"ngx-ionic-image-viewer": "^0.7.4",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"tslib": "^2.3.0", "tslib": "^2.3.0",
"watermarkjs": "^2.1.1", "watermarkjs": "^2.1.1",
@ -72,6 +75,7 @@
"eslint-plugin-prefer-arrow": "1.2.2", "eslint-plugin-prefer-arrow": "1.2.2",
"jasmine-core": "~4.6.0", "jasmine-core": "~4.6.0",
"jasmine-spec-reporter": "~5.0.0", "jasmine-spec-reporter": "~5.0.0",
"jeep-photoviewer": "^1.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
"karma-chrome-launcher": "~3.2.0", "karma-chrome-launcher": "~3.2.0",
"karma-coverage": "~2.2.0", "karma-coverage": "~2.2.0",

View File

@ -1 +1,5 @@
<ion-router-outlet></ion-router-outlet> <!-- <ion-router-outlet></ion-router-outlet> -->
<ion-app>
<ion-router-outlet [swipeGesture]="false"></ion-router-outlet>
</ion-app>

View File

@ -34,8 +34,19 @@ export class AppComponent {
this.initializeApp(); this.initializeApp();
// this.changeDecision(); // this.changeDecision();
console.log('first Open') console.log('first Open')
this.platform.backButton.subscribeWithPriority(3, () => { this.platform.backButton.subscribeWithPriority(0, () => {
alert('Handler was called!'); // alert('Handler was called!');
const url = window.location.pathname;
if(url === '/section-list'){
// Handle other pages
// alert('/section-list')
this.router.navigate(['/sales-pd-list']);
} else if(url === '/section9'){
// alert('/section9')
this.router.navigate(['/section-list']);
} else if(url === '/home'){
this.router.navigate(['/sales-pd-list']);
}
}); });
// // iOS only // // iOS only
// window.addEventListener('statusTap', function () { // window.addEventListener('statusTap', function () {
@ -106,21 +117,22 @@ export class AppComponent {
App.addListener('backButton', (data) => { App.addListener('backButton', (data) => {
console.log('backButton') console.log('backButton')
if (this.router.url === '/auth' || this.router.url === '/sales-pd-list' || this.router.url === '/auth/pin-lock') { const url = window.location.pathname;
if (url === '/auth' || url === '/sales-pd-list' || url === '/auth/pin-lock') {
console.log('backButton') console.log('backButton')
if (!this.alertShown) { if (!this.alertShown) {
console.log('presentConfirm') console.log('presentConfirm')
this.presentConfirm(); this.presentConfirm();
} }
} }
else if(this.router.url === '/section-list'){ // else if(url === '/section-list'){
// Handle other pages // // Handle other pages
alert('/section-list') // alert('/section-list')
this.router.navigate(['/sales-pd-list']); // this.router.navigate(['/sales-pd-list']);
} else if(this.router.url === '/section9'){ // } else if(url === '/section9'){
alert('/section9') // alert('/section9')
this.router.navigate(['/section-list']); // this.router.navigate(['/section-list']);
} // }
}); });
} }

View File

@ -54,7 +54,7 @@
</mat-card-footer> </mat-card-footer>
</mat-card> </mat-card>
<mat-card *ngIf="!mpinaccess"> <mat-card *ngIf="!mpinaccess" style="padding-bottom: 20px;">
<mat-card-header> <mat-card-header>
</mat-card-header> </mat-card-header>
<ion-row> <ion-row>
@ -93,13 +93,11 @@
<div align="center" class="text-color">(or)</div> <div align="center" class="text-color">(or)</div>
<h5 align="center" class="text-color">Login Using FingerPrint</h5> <h5 align="center" class="text-color">Login Using FingerPrint</h5>
<div align="center" class="text-color" style="font-size: 11px;">Place your finger on fingerprint scanner to login</div> <div align="center" class="text-color" style="font-size: 11px;">Place your finger on fingerprint scanner to login</div>
<!-- <mat-card-actions class="ion-text-center" (click)="checkfingerprint()"> -->
<ion-row> <ion-row>
<ion-col class="ion-text-center"> <ion-col class="ion-text-center">
<ion-icon (click)="checkfingerprint()" name="finger-print"></ion-icon> <ion-icon (click)="checkfingerprint()" name="finger-print"></ion-icon>
</ion-col> </ion-col>
</ion-row> </ion-row>
<!-- </mat-card-actions> -->
</mat-card-footer> </mat-card-footer>
</mat-card> </mat-card>
</ion-content> </ion-content>

View File

@ -8,6 +8,7 @@ import { LoadingService } from 'src/providers/common-provider/loading.service';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { switchMap } from 'rxjs'; import { switchMap } from 'rxjs';
import { BiometricAuth, BiometryError, BiometryErrorType } from '@aparajita/capacitor-biometric-auth';
interface ApiResponse { interface ApiResponse {
dataStatus: boolean; dataStatus: boolean;
@ -185,8 +186,62 @@ export class PinLockComponent implements OnInit {
} }
} }
checkfingerprint(){
// checkfingerprint()
// {
// this.faio.show({
// clientId: 'Fingerprint-Demo',
// clientSecret: 'password', // Only Android
// localizedFallbackTitle: 'Use Pin', // Only iOS
// localizedReason: 'Please authenticate',
// disableBackup:true,
// })
// .then((result: any) => {
// console.log(this.userDetails);
// let role_name=(this.userDetails[0].role_name).toLowerCase()
// console.log("e",role_name)
// if(role_name.includes('sales')){
// this.navCtrl.setRoot(SalesPDlistPage);
// }
// else{
// this.navCtrl.setRoot(PdListPage,{'userDetails':this.userDetails});
// }
// })
// .catch((error: any) => {
// this.toast.lenderappmessage('err: '+ error);
// });
// }
async checkfingerprint(): Promise<void> {
try {
await BiometricAuth.authenticate({
reason: 'Please authenticate',
cancelTitle: 'Cancel',
allowDeviceCredential: true,
iosFallbackTitle: 'Use passcode',
androidTitle: 'Biometric login',
androidSubtitle: 'Log in using biometric authentication',
androidConfirmationRequired: false,
})
console.log(this.userDetails);
let role_name=(this.userDetails[0].role_name).toLowerCase()
console.log("e",role_name)
if(role_name.includes('sales')){
console.log('sales-pd-list')
this.router.navigate(['/sales-pd-list']);
}
// else{
// alert('out')
// this.navCtrl.setRoot(PdListPage,{'userDetails':this.userDetails});
// }
} catch (error) {
// error is always an instance of BiometryError.
if (error instanceof BiometryError) {
if (error.code !== BiometryErrorType.userCancel) {
// Display the error.
await this.toast.lenderappmessage('err: '+ error.message);
}
}
}
} }

View File

@ -1,9 +1,3 @@
<!--
Generated template for the AdvanceFilterPage page.
See http://ionicframework.com/docs/components/#navigation for more info on
Ionic pages and navigation.
-->
<ion-header> <ion-header>
<ion-toolbar> <ion-toolbar>
<ion-title><ion-icon name="options" style="font-size: 18px;"></ion-icon> &nbsp;Advanced Filter</ion-title> <ion-title><ion-icon name="options" style="font-size: 18px;"></ion-icon> &nbsp;Advanced Filter</ion-title>
@ -18,9 +12,14 @@
<ion-content padding> <ion-content padding>
<div class="scrollable-content"> <div class="scrollable-content">
<!-- <mat-card class="cardUI"> -->
<form [formGroup]="searchForm" fxLayout="row wrap" fxFlex="100%" fxLayoutGap="35px" fxLayoutAlign="flex-start stretch"> <form [formGroup]="searchForm" fxLayout="row wrap" fxFlex="100%" fxLayoutGap="35px" fxLayoutAlign="flex-start stretch">
<mat-form-field style="width: 100%" *ngIf="from_page != 'complete_list'"> <mat-form-field style="width: 100%">
<mat-select multiple formControlName="sales_pd_type" placeholder="PD Type">
<mat-option *ngFor="let item of salesPdTypeList" [value]="item.id">{{item.pd_type_name}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field style="width: 100%">
<mat-select multiple formControlName="pd_status" placeholder="PD Status"> <mat-select multiple formControlName="pd_status" placeholder="PD Status">
<mat-option *ngFor="let status of pdStatus" [value]="status.pd_status_name">{{status.pd_status_name}} <mat-option *ngFor="let status of pdStatus" [value]="status.pd_status_name">{{status.pd_status_name}}
</mat-option> </mat-option>
@ -43,31 +42,11 @@
<mat-option *ngFor="let pro of PRODUCTS" [value]="pro.product_id">{{pro.abbr}}</mat-option> <mat-option *ngFor="let pro of PRODUCTS" [value]="pro.product_id">{{pro.abbr}}</mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<!-- <mat-form-field style="width:100%">
<mat-select multiple formControlName="pd_city" placeholder="City">
<mat-option *ngFor="let city of CITY" [value]="city.city_id">{{city.name}}</mat-option>
</mat-select>
</mat-form-field> &nbsp; &nbsp; -->
<!-- <mat-form-field style="width:100%">
<mat-select multiple formControlName="pd_lender" placeholder="Lender Name">
<mat-option *ngFor="let ent of ENTITY" [value]="ent.entity_id">{{ent.full_name}}</mat-option>
</mat-select>
</mat-form-field> -->
<mat-form-field style="width:100%"> <mat-form-field style="width:100%">
<input matInput type="text" formControlName="pd_applicant_name" placeholder="Applicant Name"> <input matInput type="text" formControlName="pd_applicant_name" placeholder="Company/Firm Name">
</mat-form-field> </mat-form-field>
<!-- <mat-form-field style="width: 100%">
<input matInput type="text" formControlName="pd_officer" placeholder="PD Officer Name">
</mat-form-field> -->
<!-- <div fxLayout="row wrap">
<div fxFlex.xs="100%" fxFlex.sm="100%" fxFlex="45%">
<mat-checkbox class="example-margin" color="primary" formControlName="is_include_archived">Include Archived</mat-checkbox>
</div>
</div> -->
</form> </form>
</div> </div>
<!-- </mat-card> -->
</ion-content> </ion-content>
<ion-footer> <ion-footer>
<ion-row> <ion-row>

View File

@ -1,11 +1,5 @@
@import '../../../../theme/filter-modal.scss'; // @import '../../../../theme/filter-modal.scss';
.header-md{
// background-color: #ff0303 !important;
// color: black !important;
--background: #fff;
--color: black;
}
::ng-deep .toolbar-background{ ::ng-deep .toolbar-background{
--background: none; /* Set it to none to clear the background */ --background: none; /* Set it to none to clear the background */
border-color: #b2b2b2 ; border-color: #b2b2b2 ;
@ -15,6 +9,13 @@
.toolbar-title-md{ .toolbar-title-md{
color: #fff !important; color: #fff !important;
} }
/* Add this to your global styles or component-specific styles */
::ng-deep .mat-option {
z-index: 1000 !important; /* Adjust the value as needed */
}
.cdk-overlay-pane{
z-index: 1018 !important;
}
::ng-deep .filterModal { ::ng-deep .filterModal {
--width: 82% !important; --width: 82% !important;
@ -22,6 +23,7 @@
--max-width: 52vh !important; --max-width: 52vh !important;
--max-height: 77vh !important; --max-height: 77vh !important;
--border-radius: 10px; --border-radius: 10px;
z-index: 0 !important;
} }
.mt{ .mt{
margin-top: 2rem; margin-top: 2rem;
@ -39,7 +41,16 @@
/* your-modal.component.scss */ /* your-modal.component.scss */
.scrollable-content { .scrollable-content {
max-height: 80vh; /* Adjust the max height as needed */ // max-height: 80vh; /* Adjust the max height as needed */
overflow-y: auto; // overflow-y: auto;
padding: 16px; padding: 16px;
} }
// ::ng-deep .mat-select-panel {
// z-index: 1000; /* Adjust the value as needed */
// }
// ::ng-deep .mat-datepicker-content {
// z-index: 1000; /* Adjust the value as needed */
// }

View File

@ -1,5 +1,5 @@
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { Component, OnInit } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { FormBuilder, FormGroup } from '@angular/forms'; import { FormBuilder, FormGroup } from '@angular/forms';
import { ModalController, NavController, NavParams } from '@ionic/angular'; import { ModalController, NavController, NavParams } from '@ionic/angular';
import { AuthService } from 'src/app/authencation/auth-service/auth.service'; import { AuthService } from 'src/app/authencation/auth-service/auth.service';
@ -16,21 +16,29 @@ export class PdAdvanceFilterComponent implements OnInit {
todaydate: Date; todaydate: Date;
from_page: any; from_page: any;
drop_down_datas: any; drop_down_datas: any;
@Output() filteredlistData = new EventEmitter();
@Output() resetFilter = new EventEmitter();
searchForm:FormGroup | any; searchForm:FormGroup | any;
PRODUCTS: any=[]; PRODUCTS: any=[];
pdStatus: any; pdStatus: any;
ENTITY: any=[]; ENTITY: any=[];
xpandStatus: boolean = false; xpandStatus: boolean = false;
pipe=new DatePipe('en-US'); pipe=new DatePipe('en-US');
is_sales_login: boolean = false;
salesPdTypeList = [
{
id:'1',
pd_type_name:"Physical PD"
},
{
id:'2',
pd_type_name:"Telephonic PD"
}
]
constructor(private pdTriggerProvider:PdtriggerService,private _fb:FormBuilder,private modalController: ModalController,public navCtrl: NavController, public navParams: NavParams,public aws: AuthService,private toastProvider:ToastService,private loaderProvider:LoadingService) { constructor(private pdTriggerProvider:PdtriggerService,private _fb:FormBuilder,private modalController: ModalController,public navCtrl: NavController, public navParams: NavParams,public aws: AuthService,private toastProvider:ToastService,private loaderProvider:LoadingService) {
this.todaydate = new Date(); this.todaydate = new Date();
this.getDropdown(); this.getDropdown();
this.from_page = this.navParams.get('FormDet');
console.log(this.from_page);
if(this.from_page){
this.from_page =this.from_page.from_page
}
} }
ngOnInit() { ngOnInit() {
@ -38,7 +46,8 @@ export class PdAdvanceFilterComponent implements OnInit {
let local:any = JSON.parse(users); let local:any = JSON.parse(users);
console.log('local****',local); console.log('local****',local);
this.drop_down_datas = this.navParams.get('drop_down_datas'); this.drop_down_datas = this.navParams.get('drop_down_datas');
console.log(this.drop_down_datas) this.is_sales_login = this.navParams.get('is_sales_login')
console.log(this.drop_down_datas,this.is_sales_login)
this.setDropDownDatas() this.setDropDownDatas()
console.log(this.drop_down_datas); console.log(this.drop_down_datas);
this.searchForm = this._fb.group({ this.searchForm = this._fb.group({
@ -48,11 +57,9 @@ export class PdAdvanceFilterComponent implements OnInit {
pd_products:[''], pd_products:[''],
pd_lender:[local.fk_entity_id], pd_lender:[local.fk_entity_id],
pd_applicant_name:[''], pd_applicant_name:[''],
// pd_officer:[''], pd_officer:[''],
// pd_officer_id:[''], sales_pd_type:[''],
// pd_type:[''], sales_pd_officer_id:[this.is_sales_login ? local.userid : '']
// pd_name:[null],
// pd_applicant_id:[null],
}) })
console.log(this.drop_down_datas) console.log(this.drop_down_datas)
} }
@ -64,6 +71,13 @@ export class PdAdvanceFilterComponent implements OnInit {
this.PRODUCTS = res.records.filter((pro:any)=>pro.isactive==1); this.PRODUCTS = res.records.filter((pro:any)=>pro.isactive==1);
} }
}); });
this.pdTriggerProvider.getAllMasterDatas('ENTITY').subscribe(res=>
{
if(res.dataStatus==true)
{
this.ENTITY = res.records.filter((ent:any)=>ent.isactive==1 && ent.hasOwnProperty('avail_pd_types') && (ent.avail_pd_types == '2' || ent.avail_pd_types == '3' ));
}
});
this.pdTriggerProvider.getAllMasterDatas("PDSTATUS").subscribe((res:any)=>{ this.pdTriggerProvider.getAllMasterDatas("PDSTATUS").subscribe((res:any)=>{
if(res.dataStatus==true) if(res.dataStatus==true)
{ {
@ -107,7 +121,7 @@ export class PdAdvanceFilterComponent implements OnInit {
} }
searchItem(){ searchItem(){
this.loaderProvider.pdloader('fetching data') // this.loaderProvider.pdloader('fetching data')
this.searchForm.value.pd_from_date = this.pipe.transform(this.searchForm.value.pd_from_date,'yyyy-MM-dd'); this.searchForm.value.pd_from_date = this.pipe.transform(this.searchForm.value.pd_from_date,'yyyy-MM-dd');
this.searchForm.value.pd_to_date = this.pipe.transform(this.searchForm.value.pd_to_date,'yyyy-MM-dd'); this.searchForm.value.pd_to_date = this.pipe.transform(this.searchForm.value.pd_to_date,'yyyy-MM-dd');
// console.log(JSON.stringifythis.searchForm.value); // console.log(JSON.stringifythis.searchForm.value);
@ -115,12 +129,21 @@ export class PdAdvanceFilterComponent implements OnInit {
this.pdTriggerProvider.advancedFilter(this.searchForm.value).subscribe(res=>{ this.pdTriggerProvider.advancedFilter(this.searchForm.value).subscribe(res=>{
if(res.dataStatus){ if(res.dataStatus){
console.log(res); console.log(res);
this.loaderProvider.dismissLoader(); // this.loaderProvider.dismissLoader();
this.modalController.dismiss(res['records']); let listValue = res['records']
if(listValue && listValue.length > 0) {
if(!this.is_sales_login) {
listValue = listValue.filter((vvd:any)=>vvd.status == 'COMPLETED')
}
this.modalController.dismiss(listValue);
} else {
this.toastProvider.lenderappmessage('No Records Found...!')
}
} }
else{ else{
// this.filteredlistData.emit(res) // this.filteredlistData.emit(res)
this.loaderProvider.dismissLoader() // this.loaderProvider.dismissLoader()
this.toastProvider.lenderappmessage('No Records Found...!') this.toastProvider.lenderappmessage('No Records Found...!')
} }
}) })
@ -128,10 +151,13 @@ export class PdAdvanceFilterComponent implements OnInit {
onReset(){ onReset(){
this.searchForm.reset(); this.searchForm.reset();
let users:any = localStorage.getItem('user_details') let usr:any = localStorage.getItem('user_details')
let local:any = JSON.parse(users); let local:any = JSON.parse(usr);
local=local.fk_entity_id this.searchForm.controls['pd_lender'].setValue(local.fk_entity_id);
this.searchForm.controls['pd_lender'].setValue(local); this.searchForm.controls['sales_pd_officer_id'].setValue(local.userid);
this.xpandStatus=false
this.resetFilter.emit(true);
} }
closeModal() { closeModal() {

View File

@ -344,19 +344,6 @@ export class PdListComponent implements OnInit {
} }
updateVisibleItems() {
this.visibleItems = this.sales_displayValue.slice(this.startIndex, this.startIndex + this.itemsPerView);
console.log(this.visibleItems)
}
// Calculate the visible range based on user interaction or screen size
onScroll(event: any) {
const scrollTop = event.target.scrollTop;
this.startIndex = Math.floor(scrollTop / 50); // Adjust this value based on your item height
this.updateVisibleItems();
console.log('scroll')
}
goToUrl(url:any){ goToUrl(url:any){
window.open(url, '_blank'); window.open(url, '_blank');
} }
@ -388,7 +375,7 @@ export class PdListComponent implements OnInit {
const modal = await this.modalController.create({ const modal = await this.modalController.create({
component: PdAdvanceFilterComponent, component: PdAdvanceFilterComponent,
componentProps: { 'drop_down_datas': this.filter_drop_down_data }, componentProps: { 'drop_down_datas': this.filter_drop_down_data,is_sales_login:this.is_sales_login },
...modalOption ...modalOption
}); });
@ -396,65 +383,99 @@ export class PdListComponent implements OnInit {
const { data } = await modal.onDidDismiss(); const { data } = await modal.onDidDismiss();
if (data) { if(data){
// this.sales_displayValue = data; console.log(data)
this.filterMsg=false this.sales_displayValue = data;
this.loader_access=false console.log(this.sales_displayValue)
this.pdlistaccess = true; this.filterMsg = false
this.pdinprogress = data.filter((past:any)=>past.pd_status !="QC_COMPLETED"); }
this.searchinprogress = this.pdinprogress; if(this.sales_displayValue.length > 0){
this.pdlistdetails = data.filter((past:any)=>past.pd_status =="QC_COMPLETED"); let user1:any = localStorage.getItem('user_details');
this.searchpast = this.pdlistdetails; let user=(JSON.parse(user1))
console.log(this.sales_displayValue);
if(!this.is_sales_login) {
this.sales_displayValue = this.sales_displayValue.filter((vll:any)=>vll.status == 'COMPLETED');
}
this.filterMsg = true
let products:any = []
let lenders:any = []
let pd_status:any = []
this.sales_displayValue.map((val:any)=>{
console.log('vvvaaall');
console.log(val);
// https://gstapp.smcfinance.com/home?saltkey=VQDa79tyBlpu7ZuKt6U&PDID=123&Email=manojsahrawat@smcfinance.com
//let link = "http://gstapp.devopsmcfinance.com/home?saltkey=VQDa79tyBlpu7ZuKt6U"
// this.apiurl = this.apiurl
console.log(this.apiurl.authorization)
let link
if(this.apiurl.authorization == 'sparqvenba2018'){
console.log(this.apiurl.authorization)
link ="http://salesapp.devopsmcfinance.com/secure?saltkey=VQDa79tyBlpu7ZuKt6U"
}else {
console.log(this.apiurl.authorization)
link ="https://salesapp.smcfinance.com/app/secure?saltkey=VQDa79tyBlpu7ZuKt6U"
}
var string:any = {
EmpName:user.user_first_name,
EmpCode:"",
PDID:val.sales_pd_sno,
//PD_NO:val.sales_pd_sno,
}
//console.log(string);
//var encodedString = btoa(JSON.stringify(string));
//console.log("encode",encodedString); // Outputs: "SGVsbG8gV29ybGQh"
//var decodedString = atob(encodedString);
//console.log("decode",JSON.parse(decodedString));
//let email="mwisesales1@sine.com";
let PDID = val.sales_pd_sno;
// let mail="&Email=manojsahrawat@smcfinance.com"
let finallink = link+"&PDID="+PDID+"&Email="+user.email
//FOR SPLITTING THE VALUE OF pd_sno console.log('finallink')
this.pdinprogress.length >0 ? console.log(finallink);
this.pdinprogress.forEach((value:any)=>{ val.link = finallink;
let original=value.pd_sno if(products.length > 0 ){
if(original != null){ if(products.filter((pro:any)=>pro == val.product_id).length == 0 ){
value.pd_sno_split={lender_name:original.replace(/[^a-z]/gi, ''),serial_no:original.match(/(\d+)/)[0]} products.push(val.product_id)
}
} }
else{ else{
value.pd_sno_split={lender_name:'',serial_no:''} products.push(val.product_id)
}
if(lenders.length > 0 ){
if(lenders.filter((pro:any)=>pro == val.lender_id).length == 0 ){
lenders.push(val.lender_id)
} }
}) : this.pdinprogress
this.pdlistdetails.length >0 ?
this.pdlistdetails.forEach((value:any)=>{
let original=value.pd_sno
if(original != null){
value.pd_sno_split={lender_name:original.replace(/[^a-z]/gi, ''),serial_no:original.match(/(\d+)/)[0]}
} }
else{ else{
value.pd_sno_split={lender_name:'',serial_no:''} lenders.push(val.lender_id)
} }
}) : this.pdlistdetails if(pd_status.length > 0 ){
if(pd_status.filter((pro:any)=>pro == val.status).length == 0 ){
pd_status.push(val.status)
}
}
else{
pd_status.push(val.status)
}
if(pd_status.length > 0 ){
if(pd_status.filter((pro:any)=>pro == val.status).length == 0 ){
pd_status.push(val.status)
}
}
//let link='a';
// val.link = finallink;
console.log('val');
console.log(val)
// link.push(val.status)
console.log("ingp",this.pdinprogress); })
this.random_bg_color(); this.filter_drop_down_data = {product_ids:products,lender_ids:lenders,pd_status:pd_status}
this.random_ng_past(); console.log(this.sales_displayValue);
} }
} }
random_bg_color() {
for(let id of this.pdinprogress){
var x = Math.floor(Math.random() * 256);
var y = Math.floor(Math.random() * 256);
var z = Math.floor(Math.random() * 256);
this.bgColor.push("rgb(" + x + "," + y + "," + z + ")");
}
return this.bgColor;
}
random_ng_past(){
for(let id of this.pdlistdetails){
this.status = id.pd_status.replace("_"," ");
var x = Math.floor(Math.random() * 256);
var y = Math.floor(Math.random() * 256);
var z = Math.floor(Math.random() * 256);
this.bgColorPast.push("rgb(" + x + "," + y + "," + z + ")");
}
}
// redirectToAnotherPage() { // redirectToAnotherPage() {
// // Navigate to another page when the "List" tab is clicked // // Navigate to another page when the "List" tab is clicked

View File

@ -5,6 +5,10 @@ import { Geolocation } from '@capacitor/geolocation'
// import watermark from 'watermarkjs'; // import watermark from 'watermarkjs';
import { NgxImageCompressService } from 'ngx-image-compress'; import { NgxImageCompressService } from 'ngx-image-compress';
import { ToastService } from 'src/providers/common-provider/toast.service';
import * as watermark from 'watermarkjs'
@Injectable({ @Injectable({
@ -14,7 +18,7 @@ export class CameraService {
geoCords: any; geoCords: any;
pipe: DatePipe; pipe: DatePipe;
constructor(private imageCompress: NgxImageCompressService) { constructor(private toastProvider:ToastService,private imageCompress: NgxImageCompressService) {
console.log('Hello CameraProvider Provider'); console.log('Hello CameraProvider Provider');
this.pipe=new DatePipe('en-US') this.pipe=new DatePipe('en-US')
} }
@ -61,7 +65,9 @@ export class CameraService {
async getpicture() { async getpicture() {
console.log('getPicture')
try { try {
console.log('getPicture')
localStorage.removeItem('current_coordinates'); localStorage.removeItem('current_coordinates');
const coordinates = await this.getGeoTag(); const coordinates = await this.getGeoTag();
@ -69,17 +75,10 @@ export class CameraService {
console.log(this.geoCords) console.log(this.geoCords)
localStorage.setItem('current_coordinates', this.geoCords); localStorage.setItem('current_coordinates', this.geoCords);
// const image = await Camera.getPhoto({
// quality: 100,
// allowEditing: false,
// resultType: CameraResultType.DataUrl,
// });
// // Here you get the image as result.
// const theActualPicture = image.dataUrl; // const theActualPicture = image.dataUrl;
// const permissionStatus = await Camera.checkPermissions();
// if (permissionStatus.camera === 'granted') {
// GPS permission is granted
const image = await Camera.getPhoto({ const image = await Camera.getPhoto({
quality: 75, quality: 75,
allowEditing: false, // Set to true if you want to enable image editing allowEditing: false, // Set to true if you want to enable image editing
@ -89,11 +88,33 @@ export class CameraService {
height: 600, height: 600,
correctOrientation: true, correctOrientation: true,
}); });
// this.image = image
// } else {
// // GPS permission is not granted, request it
// const requestResult = await Camera.requestPermissions({ permissions: ['camera'] });
// if (requestResult.camera === 'granted') {
// // User granted GPS permission, proceed to turn on GPS
// const image = await Camera.getPhoto({
// quality: 75,
// allowEditing: false, // Set to true if you want to enable image editing
// resultType: CameraResultType.Base64,
// source: CameraSource.Camera,
// width: 600,
// height: 600,
// correctOrientation: true,
// });
// this.image = image
// } else {
// // User denied GPS permission
// console.error('GPS permission denied');
// }
// }
console.log(image)
const base64Image = `data:image/jpeg;base64,${image.base64String}`; const base64Image = `data:image/jpeg;base64,${image.base64String}`;
this.imageInfo(base64Image, 'Captured :'); this.imageInfo(base64Image, 'Captured :');
console.log('getPicture',base64Image)
return base64Image; return base64Image;
} catch (error) { } catch (error) {
localStorage.removeItem('current_coordinates'); localStorage.removeItem('current_coordinates');
console.error('CAMERA ERROR ->', error); console.error('CAMERA ERROR ->', error);
@ -113,47 +134,71 @@ export class CameraService {
}; };
} }
async addWatermarks(base64Img: string) { addWatermarks(base64Img:any) {
return new Promise<string>(async (resolve, reject) => {
const geoCords = localStorage.getItem('current_coordinates');
console.log('coords', geoCords);
const today = new Date(); return new Promise((resolve, reject) => {
const today_loc = new DatePipe('en-US').transform(today, 'yyyy-MM-dd, h:mm a');
const dateTime = 'Date : ' + today_loc;
try { // this.constant.getGeoTag().then(geoCoordinates => {
// const watermarkedImg = await watermark([base64Img, 'assets/img/PD_watermark.png']) // this.geoCords = geoCoordinates
// .image(watermark.image.upperRight()); // });
this.geoCords=localStorage.getItem('current_coordinates')
console.log("corrds",this.geoCords)
let raw_img = base64Img
var today = new Date();
// let today_loc = today.toLocaleString('en-US', { timeZone: "Asia/Kolkata" })
let today_loc=this.pipe.transform(today, 'yyyy-MM-dd, h:mm a')
var date = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
// var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
var dateTime = 'Date : ' + today_loc;
// const text = watermark.text; console.log(date)
// const locationText = `Location : ${geoCords}`; // resolve(raw_img);
// fetch(raw_img)
// .then(res => res.blob())
// .then(blob => {
watermark([raw_img, 'assets/img/PD_watermark.png'])
.image(watermark.image.upperRight())
.then((img:any) => {
raw_img = img.src;
// const watermarkedWithDateTime = await watermark([watermarkedImg.src]) let text = watermark.text
// .image(text.upperLeft(dateTime, '18px sans-serif', '#ff0000', 1.0, 40)); watermark([raw_img])
.image(text.upperLeft(dateTime, '18px sans-serif', '#ff0000', 1.0, 40))
.then((img:any) => {
raw_img = img.src;
// console.log("2d", raw_img)
// const finalWatermarkedImg = await watermark([watermarkedWithDateTime.src]) let Location = `Location : ` + this.geoCords
// .image(text.upperLeft(locationText, '18px sans-serif', '#ff0000', 1.0)); watermark([raw_img])
.image(text.upperLeft(Location, '18px sans-serif', '#ff0000', 1.0))
const lastWatermarked = base64Img .then((img:any) => {
this.imageInfo(lastWatermarked, 'Watermarked :'); raw_img = img.src
localStorage.removeItem('current_coordinates'); raw_img =raw_img.replace('png;','jpeg;')
let last_water_marked=raw_img
try { // console.log("3rd", raw_img)
const compressedImg = await this.compressTheImage(lastWatermarked); this.imageInfo(last_water_marked,'Watermarked :')
this.imageInfo(compressedImg, 'Compressed :'); localStorage.removeItem('current_coordinates')
resolve(compressedImg); return this.compressTheImage(last_water_marked).then(compressed_img=>{
} catch (err) { this.imageInfo(compressed_img,'Compressed :')
console.log(compressed_img)
resolve(compressed_img);
},err=>{
console.log(err); console.log(err);
reject(); reject();
} })
} catch (error) { // resolve(img.src)
console.log('Watermarking Error', error);
resolve(base64Img);
}
});
}
});
});
},(err:any)=>{
console.log("Watermarking Error", err)
resolve(raw_img);
});
})
// });
}
compressTheImage(img: string): Promise<string> { compressTheImage(img: string): Promise<string> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -208,5 +253,30 @@ export class CameraService {
} }
async checkAndRequestCameraPermission() {
try {
const permissionStatus = await Camera.checkPermissions();
if (permissionStatus.camera === 'granted') {
// GPS permission is granted
return 'Premission granted'
} else {
// GPS permission is not granted, request it
const requestResult = await Camera.requestPermissions();
if (requestResult.camera === 'granted') {
// User granted GPS permission, proceed to turn on GPS
return 'Request Premission granted'
} else {
// User denied GPS permission
console.error('Camera permission denied');
return null; // You might want to handle this case differently
}
}
} catch (error) {
console.error('Error checking or requesting Camera permission', error);
return null;
}
}
} }

View File

@ -0,0 +1,5 @@
// watermarkjs.d.ts
declare module 'watermarkjs' {
const watermark: any;
export = watermark;
}

View File

@ -406,10 +406,8 @@ export class OfflineManagerService {
console.log(section_redirect); console.log(section_redirect);
const alert:any = this.toastProvider.setAlertWithOkButton( const alert:any = this.toastProvider.setAlertWithOkButton(
"<small>Sales PD is incomplete<small>", "Sales PD is incomplete",
"The Following sections are not Saved <b>" + "The Following sections are not Saved " + section_dis_names.join(', ')
section_dis_names.join(', ') +
'</b>'
); );
alert.present(); alert.present();

View File

@ -401,6 +401,10 @@ callMultipleApisForTemplate(product_arr:any) {
}) })
} }
advancedFilter(params:any): Observable<any>{
return this.http.post(this.apiUrl+'filterSalesPDList',{"records":params})
}
api_post_method(apiName: string, params: any, apiMethod?: string): Observable<any> { api_post_method(apiName: string, params: any, apiMethod?: string): Observable<any> {
if (this.networkProvider.getCurrentNetworkStatus() === ConnectionStatus.online) { if (this.networkProvider.getCurrentNetworkStatus() === ConnectionStatus.online) {
return new Observable((observer: Observer<any>) => { return new Observable((observer: Observer<any>) => {
@ -527,6 +531,9 @@ callMultipleApisForTemplate(product_arr:any) {
}) })
} }
sendSmsViaLink(params:any): Observable<any> {
return this.http.post(this.apiUrl + 'sendCusLinkViaSMS', params)
}
updateSectionDataLocally(params:any,form_structure:any){ updateSectionDataLocally(params:any,form_structure:any){
return Observable.create((observer:Observer<any>) => { return Observable.create((observer:Observer<any>) => {

View File

@ -16,7 +16,7 @@
autocomplete="off" (change)="onChangeProperty($event,parent_ques,'','',p_i)" autocomplete="off" (change)="onChangeProperty($event,parent_ques,'','',p_i)"
> >
<!-- [placeholder]="parent_ques.get('field_type').value == 'num' || parent_ques.get('field_type').value == 'numtoword' ? 'Entert the Number' : 'Enter the Text'" --> <!-- [placeholder]="parent_ques.get('field_type').value == 'num' || parent_ques.get('field_type').value == 'numtoword' ? 'Entert the Number' : 'Enter the Text'" -->
<!-- <mat-hint *ngIf="parent_ques.get('answer_value').value != '' && parent_ques.get('field_type').value == 'numtoword'" align="end" style="font-size: 12px;">{{"&#8377;"}}{{parent_ques.get('answer_value').value | numToWords}}</mat-hint> --> <mat-hint *ngIf="parent_ques.get('answer_value').value != '' && parent_ques.get('field_type').value == 'numtoword'" align="end" style="font-size: 12px;">{{"&#8377;"}}{{parent_ques.get('answer_value').value | numToWords}}</mat-hint>
<!-- <mat-hint align="end" style="font-size: 11.5px;color: gray;" *ngIf="parent_ques.get('is_amt_in_words').value == true">One Lack</mat-hint> --> <!-- <mat-hint align="end" style="font-size: 11.5px;color: gray;" *ngIf="parent_ques.get('is_amt_in_words').value == true">One Lack</mat-hint> -->
<ng-container *ngFor="let validation of parent_ques.get('validations').value;" ngProjectAs="mat-error"> <ng-container *ngFor="let validation of parent_ques.get('validations').value;" ngProjectAs="mat-error">
<mat-error align="end" *ngIf="parent_ques.get('answer_value').hasError(validation.name.toLowerCase())">{{validation.message}}</mat-error> <mat-error align="end" *ngIf="parent_ques.get('answer_value').hasError(validation.name.toLowerCase())">{{validation.message}}</mat-error>
@ -24,7 +24,7 @@
</mat-form-field> </mat-form-field>
<!-- <mat-form-field> --> <!-- <mat-form-field> -->
<div class="radio-gap" *ngIf="parent_ques.get('type').value == '2'"> <div class="radio-gap" *ngIf="parent_ques.get('type').value == '2'">
<mat-label>{{parent_ques.get('question').value}}</mat-label><br/> <h5>{{parent_ques.get('question').value}}</h5><br/>
<mat-radio-group aria-label="Select an option" formControlName="answer_value" (change)="onChangeProperty($event,parent_ques,'','',p_i)"> <mat-radio-group aria-label="Select an option" formControlName="answer_value" (change)="onChangeProperty($event,parent_ques,'','',p_i)">
<mat-radio-button class="radio-btn-gap" *ngFor="let val of parent_ques.get('answers').value" [value]="val.hasOwnProperty('answer_id') ? val.answer_id : val.answer">{{val.answer}}</mat-radio-button><br /> <mat-radio-button class="radio-btn-gap" *ngFor="let val of parent_ques.get('answers').value" [value]="val.hasOwnProperty('answer_id') ? val.answer_id : val.answer">{{val.answer}}</mat-radio-button><br />
</mat-radio-group> </mat-radio-group>
@ -182,7 +182,7 @@
<input matInput [type]="single_ques.value.hasOwnProperty('field_type') ? single_ques.get('field_type').value == 'num' || single_ques.get('field_type').value == 'numtoword' ? 'number' : single_ques.get('field_type').value == 'string' ? 'text' : single_ques.get('field_type').value: ''" formControlName="answer_value" <input matInput [type]="single_ques.value.hasOwnProperty('field_type') ? single_ques.get('field_type').value == 'num' || single_ques.get('field_type').value == 'numtoword' ? 'number' : single_ques.get('field_type').value == 'string' ? 'text' : single_ques.get('field_type').value: ''" formControlName="answer_value"
[placeholder]="single_ques.value.hasOwnProperty('place_holder') ? single_ques.get('place_holder').value : ''" [placeholder]="single_ques.value.hasOwnProperty('place_holder') ? single_ques.get('place_holder').value : ''"
autocomplete="off" (change)="onChangeProperty($event,single_ques,group_ques,2,s_i)"> autocomplete="off" (change)="onChangeProperty($event,single_ques,group_ques,2,s_i)">
<!-- <mat-hint *ngIf="single_ques.get('answer_value').value != '' && single_ques.value.hasOwnProperty('field_type') && single_ques.get('field_type').value == 'numtoword'" align="end" style="font-size: 10px;">{{"&#8377;"}}{{single_ques.get('answer_value').value | numToWords}}</mat-hint> --> <mat-hint *ngIf="single_ques.get('answer_value').value != '' && single_ques.value.hasOwnProperty('field_type') && single_ques.get('field_type').value == 'numtoword'" align="end" style="font-size: 10px;">{{"&#8377;"}}{{single_ques.get('answer_value').value | numToWords}}</mat-hint>
<!-- <mat-error align="end" style="font-style: italic;margin-right: 5px;">Field is Required</mat-error> --> <!-- <mat-error align="end" style="font-style: italic;margin-right: 5px;">Field is Required</mat-error> -->
<ng-container *ngFor="let validation of single_ques.get('validations').value;" ngProjectAs="mat-error"> <ng-container *ngFor="let validation of single_ques.get('validations').value;" ngProjectAs="mat-error">
<mat-error align="end" *ngIf="single_ques.get('answer_value').hasError(validation.name.toLowerCase())">{{validation.message}}</mat-error> <mat-error align="end" *ngIf="single_ques.get('answer_value').hasError(validation.name.toLowerCase())">{{validation.message}}</mat-error>
@ -190,7 +190,7 @@
</mat-form-field> </mat-form-field>
<div class="radio-gap" *ngIf="single_ques.get('type').value == '2'"> <div class="radio-gap" *ngIf="single_ques.get('type').value == '2'">
<mat-label>{{single_ques.get('question').value}}</mat-label><br/> <h5>{{single_ques.get('question').value}}</h5><br/>
<mat-radio-group aria-label="Select an option" formControlName="answer_value" (change)="onChangeProperty($event,single_ques,group_ques,2,s_i)"> <mat-radio-group aria-label="Select an option" formControlName="answer_value" (change)="onChangeProperty($event,single_ques,group_ques,2,s_i)">
<mat-radio-button class="radio-btn-gap" *ngFor="let val of single_ques.get('answers').value" [value]="val.hasOwnProperty('answer_id') ? val.answer_id : val.answer">{{val.answer}}</mat-radio-button><br /> <mat-radio-button class="radio-btn-gap" *ngFor="let val of single_ques.get('answers').value" [value]="val.hasOwnProperty('answer_id') ? val.answer_id : val.answer">{{val.answer}}</mat-radio-button><br />
</mat-radio-group> </mat-radio-group>

View File

@ -48,6 +48,7 @@ export class QuesTemplateComponent implements OnInit {
console.log('Hello QuesTemplateComponent Component'); console.log('Hello QuesTemplateComponent Component');
this.text = 'Hello World'; this.text = 'Hello World';
this.cameraProvider.checkAndRequestGPSPermission(); this.cameraProvider.checkAndRequestGPSPermission();
this.cameraProvider.checkAndRequestCameraPermission();
} }
ngOnInit() {} ngOnInit() {}
@ -350,7 +351,9 @@ export class QuesTemplateComponent implements OnInit {
data = data.filter((group_indi:any) => !group_indi.hasOwnProperty('additional_field') && group_indi.additional_field != 1); data = data.filter((group_indi:any) => !group_indi.hasOwnProperty('additional_field') && group_indi.additional_field != 1);
if (options == 'camera') { if (options == 'camera') {
console.log('camera')
this.cameraProvider.getpicture().then((res:any) => { this.cameraProvider.getpicture().then((res:any) => {
console.log('camera',res)
if (res != 'error') { if (res != 'error') {
this.geoCoordinates = localStorage.getItem('current_coordinates'); this.geoCoordinates = localStorage.getItem('current_coordinates');
this.cameraProvider.addWatermarks(res).then((watermarkedImage:any) => { this.cameraProvider.addWatermarks(res).then((watermarkedImage:any) => {
@ -439,10 +442,13 @@ export class QuesTemplateComponent implements OnInit {
captureImg(parent_index:any,parent_control:any){ captureImg(parent_index:any,parent_control:any){
// parent_control.controls.is_image_status.setValue('l') // parent_control.controls.is_image_status.setValue('l')
console.log('camera')
this.cameraProvider.getpicture().then((res:any) => { this.cameraProvider.getpicture().then((res:any) => {
console.log('Camera',res)
if (res != 'error') { if (res != 'error') {
this.geoCoordinates=localStorage.getItem('current_coordinates') this.geoCoordinates=localStorage.getItem('current_coordinates')
this.cameraProvider.addWatermarks(res).then((watermarkedImage:any)=>{ this.cameraProvider.addWatermarks(res).then((watermarkedImage:any)=>{
console.log(watermarkedImage)
parent_control.controls.answer_value.setValue(watermarkedImage) parent_control.controls.answer_value.setValue(watermarkedImage)
@ -923,32 +929,41 @@ export class QuesTemplateComponent implements OnInit {
console.log(this.fileredSearchValue) console.log(this.fileredSearchValue)
} }
public findInvalidControls() {
const questionsControl = this.quesAnsForm.get('questions');
if (questionsControl instanceof FormArray && questionsControl.controls) { // public findInvalidControls() {
const controls = questionsControl.controls; // const questionsArray = this.quesAnsForm.get('questions') as FormArray;
console.log(controls);
for (const name in controls) {
if (controls[name].invalid) {
let invalidFields = [].slice.call(document.getElementsByClassName('ng-invalid')) as HTMLElement[]; // for (let i = 0; i < questionsArray.length; i++) {
let firstInvalidField:any; // const parent_ques = questionsArray.at(i) as FormGroup;
for(let val in invalidFields){
if(invalidFields[val].nodeName == 'MAT-FORM-FIELD'){ //INPUT FOR INPUT FIELD // // Iterate through all controls in the FormGroup
firstInvalidField=invalidFields[val] // Object.keys(parent_ques.controls).forEach(controlName => {
break; // const formControl = parent_ques.get(controlName);
// if (formControl && formControl.invalid) {
// formControl.markAsTouched(); // Trigger Angular validation and error messages
// const invalidControlElement = document.getElementById(controlName + '_' + i);
// if (invalidControlElement) {
// invalidControlElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
// // Scroll to the first invalid control and break the loop
// return;
// }
// }
// });
// }
// }
private findInvalidControls(formGroup: FormGroup | FormArray) {
Object.values(formGroup.controls).forEach(control => {
if (control instanceof FormControl) {
control.markAsTouched();
} else if (control instanceof FormGroup || control instanceof FormArray) {
this.findInvalidControls(control);
} }
});
} }
if(firstInvalidField != undefined){
firstInvalidField.scrollIntoView(true)
}
break;
}
}
}
// return invalid;
}
onSubmit(flag:any){ //1-Submit 0-Draft onSubmit(flag:any){ //1-Submit 0-Draft
if(flag != 0){ if(flag != 0){
@ -961,7 +976,7 @@ export class QuesTemplateComponent implements OnInit {
if(this.matExpansionPanel!= undefined){ if(this.matExpansionPanel!= undefined){
this.matExpansionPanel.open() this.matExpansionPanel.open()
} }
this.findInvalidControls() this.findInvalidControls(this.quesAnsForm)
return return
} }
// CHECKING THE SAVE IMAGE REQUEST IS STILL PENDING // CHECKING THE SAVE IMAGE REQUEST IS STILL PENDING
@ -1123,7 +1138,7 @@ export class QuesTemplateComponent implements OnInit {
section_dis_names.push(res.sectin_name) section_dis_names.push(res.sectin_name)
}) })
} }
const alert = this.toastProvider.setAlertWithOkButton("<small>Sales PD is incomplete<small>", "The Following sections are not Saved <b>" + section_dis_names + '</b>'); const alert = this.toastProvider.setAlertWithOkButton("Sales PD is incomplete", "The Following sections are not Saved " + section_dis_names);
alert.then(async (resolvedAlert) => { alert.then(async (resolvedAlert) => {
await resolvedAlert.present(); await resolvedAlert.present();

View File

@ -113,3 +113,6 @@
--padding-top: 16px; // Adjust as needed --padding-top: 16px; // Adjust as needed
--padding-bottom: 16px; // Adjust as needed --padding-bottom: 16px; // Adjust as needed
} }
h6{
font-size: 14px;
}

View File

@ -19,6 +19,7 @@
@import "@ionic/angular/css/typography.css"; @import "@ionic/angular/css/typography.css";
@import "@ionic/angular/css/display.css"; @import "@ionic/angular/css/display.css";
/* Optional CSS utils that can be commented out */ /* Optional CSS utils that can be commented out */
@import "@ionic/angular/css/padding.css"; @import "@ionic/angular/css/padding.css";
@import "@ionic/angular/css/float-elements.css"; @import "@ionic/angular/css/float-elements.css";
@ -41,6 +42,10 @@
// --padding-bottom: 16px; // Adjust as needed // --padding-bottom: 16px; // Adjust as needed
// } // }
.alert-title.sc-ion-alert-md{
color: black !important;
}

View File

@ -0,0 +1,8 @@
import { NumToWordsPipe } from './num-to-words.pipe';
describe('NumToWordsPipe', () => {
it('create an instance', () => {
const pipe = new NumToWordsPipe();
expect(pipe).toBeTruthy();
});
});

View File

@ -0,0 +1,74 @@
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'numToWords'
})
export class NumToWordsPipe implements PipeTransform {
/**
* Takes a value and makes it lowercase.
*/
a:any = [
'',
'one ',
'two ',
'three ',
'four ',
'five ',
'six ',
'seven ',
'eight ',
'nine ',
'ten ',
'eleven ',
'twelve ',
'thirteen ',
'fourteen ',
'fifteen ',
'sixteen ',
'seventeen ',
'eighteen ',
'nineteen '];
b:any = [
'',
'',
'twenty',
'thirty',
'forty',
'fifty',
'sixty',
'seventy',
'eighty',
'ninety'];
transform(value: any, ...args:any) {
if (value) {
let num: any = Number(value);
if (num) {
if ((num = num.toString()).length > 9) {
// return 'We are not the Iron Bank, you can lower down the stakes :)';
return ''
}
const n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/);
if (!n) {return ''; }
let str = '';
str += (Number(n[1]) !== 0) ? (this.a[Number(n[1])] || this.b[n[1][0]] + ' ' + this.a[n[1][1]]) + 'crore ' : '';
str += (Number(n[2]) !== 0) ? (this.a[Number(n[2])] || this.b[n[2][0]] + ' ' + this.a[n[2][1]]) + 'lakh ' : '';
str += (Number(n[3]) !== 0) ? (this.a[Number(n[3])] || this.b[n[3][0]] + ' ' + this.a[n[3][1]]) + 'thousand ' : '';
str += (Number(n[4]) !== 0) ? (this.a[Number(n[4])] || this.b[n[4][0]] + ' ' + this.a[n[4][1]]) + 'hundred ' : '';
str += (Number(n[5]) !== 0) ? ((str !== '') ? 'and ' : '') +
(this.a[Number(n[5])] || this.b[n[5][0]] + ' ' +
this.a[n[5][1]]) + 'rupee' : '';
// return str;
return str.charAt(0).toUpperCase() +
str.slice(1);
} else {
return '';
}
} else {
return '';
}
}
}

View File

@ -98,9 +98,9 @@ export class PdtriggerService {
// catchError(this.handleError('role', [])) // catchError(this.handleError('role', []))
) )
} }
advancedFilter(params:any): Observable<any>{ advancedFilter(params:any): Observable<any>{
return this.http.post(this.apiUrl+'filterPDList',{"records":params}) return this.http.post(this.apiUrl+'filterSalesPDList',{"records":params})
} }
} }

View File

@ -16,12 +16,13 @@ import { MatDatepickerModule } from '@angular/material/datepicker'
import { MatSelectModule } from '@angular/material/select' import { MatSelectModule } from '@angular/material/select'
import { MatRadioModule } from '@angular/material/radio' import { MatRadioModule } from '@angular/material/radio'
import { MatExpansionModule } from '@angular/material/expansion' import { MatExpansionModule } from '@angular/material/expansion'
import { NumToWordsPipe } from 'src/pipes/num-to-words.pipe';
@NgModule({ @NgModule({
declarations: [], declarations: [NumToWordsPipe],
imports: [ imports: [
CommonModule, CommonModule,
MatButtonModule, MatButtonModule,
@ -68,6 +69,7 @@ import { MatExpansionModule } from '@angular/material/expansion'
// FlexModule, // FlexModule,
], ],
exports: [ exports: [
NumToWordsPipe,
MatButtonModule, MatButtonModule,
MatCardModule, MatCardModule,
MatInputModule, MatInputModule,