diff --git a/.eslintrc.json b/.eslintrc.json index 9d48db4..a306985 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,12 +5,13 @@ { "files": ["*.ts"], "parserOptions": { - "project": ["tsconfig.json"], + "project": ["tsconfig.json", "tsconfig.spec.json", "tsconfig.app.json"], "createDefaultProgram": true }, "extends": [ "plugin:@angular-eslint/recommended", - "plugin:@angular-eslint/template/process-inline-templates" + "plugin:@angular-eslint/template/process-inline-templates", + "plugin:prettier/recommended" ], "rules": { "@angular-eslint/component-class-suffix": [ diff --git a/package-lock.json b/package-lock.json index 1354fbc..b3b75c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,36 +16,45 @@ "@angular/platform-browser": "^17.0.2", "@angular/platform-browser-dynamic": "^17.0.2", "@angular/router": "^17.0.2", + "@awesome-cordova-plugins/in-app-browser": "^6.6.0", + "@capacitor/android": "5.7.4", "@capacitor/app": "5.0.7", "@capacitor/core": "5.7.4", "@capacitor/haptics": "5.0.7", + "@capacitor/ios": "5.7.4", "@capacitor/keyboard": "5.0.8", "@capacitor/status-bar": "5.0.7", "@ionic/angular": "^7.0.0", + "@ionic/storage-angular": "^4.0.0", + "cordova-plugin-inappbrowser": "github:ihackfx/cordova-plugin-inappbrowser", "ionicons": "^7.0.0", + "node-isbn": "^1.6.1", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.2" }, "devDependencies": { "@angular-devkit/build-angular": "^17.0.0", - "@angular-eslint/builder": "^17.0.0", - "@angular-eslint/eslint-plugin": "^17.0.0", - "@angular-eslint/eslint-plugin-template": "^17.0.0", - "@angular-eslint/schematics": "^17.0.0", - "@angular-eslint/template-parser": "^17.0.0", + "@angular-eslint/builder": "17.3.0", + "@angular-eslint/eslint-plugin": "17.3.0", + "@angular-eslint/eslint-plugin-template": "17.3.0", + "@angular-eslint/schematics": "17.3.0", + "@angular-eslint/template-parser": "17.3.0", "@angular/cli": "^17.0.0", "@angular/compiler-cli": "^17.0.2", "@angular/language-service": "^17.0.2", "@capacitor/cli": "5.7.4", "@ionic/angular-toolkit": "^11.0.1", "@types/jasmine": "~5.1.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@types/node-isbn": "^1.6.4", + "@typescript-eslint/eslint-plugin": "7.2.0", + "@typescript-eslint/parser": "7.2.0", "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsdoc": "^48.2.1", "eslint-plugin-prefer-arrow": "1.2.2", + "eslint-plugin-prettier": "^5.1.3", "jasmine-core": "~5.1.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.4.0", @@ -53,6 +62,7 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "prettier": "3.2.5", "typescript": "~5.2.2" } }, @@ -635,6 +645,30 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@awesome-cordova-plugins/core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/core/-/core-6.6.0.tgz", + "integrity": "sha512-mr2oI+qIoxgoccG57VMkkQdedvulIFJ+kyDeXZvrA1CSkFu1RzTwRvM6QuyA01f9i9G9hSSONpAp4v94h45LNA==", + "peer": true, + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, + "node_modules/@awesome-cordova-plugins/in-app-browser": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@awesome-cordova-plugins/in-app-browser/-/in-app-browser-6.6.0.tgz", + "integrity": "sha512-RC+t421VHEz5dyoWb9gKYQ16D0vvtCJWty8moGheN3YmfB8dr80NSyt6gOWW8QIa6+3wDTNfSSUN+h0zMp7pvQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@awesome-cordova-plugins/core": "^6.0.1", + "rxjs": "^5.5.0 || ^6.5.0 || ^7.3.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -2384,6 +2418,14 @@ "node": ">=6.9.0" } }, + "node_modules/@capacitor/android": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-5.7.4.tgz", + "integrity": "sha512-9ETwrCaLaimLHbwGpgfsPS9cHcPMFLmKFdlYsFsYIusMO6aOrcQTA9Q4xVAkr55ava4Wk+pVRniRYsekrbOLdw==", + "peerDependencies": { + "@capacitor/core": "^5.7.0" + } + }, "node_modules/@capacitor/app": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-5.0.7.tgz", @@ -2509,6 +2551,14 @@ "@capacitor/core": "^5.0.0" } }, + "node_modules/@capacitor/ios": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-5.7.4.tgz", + "integrity": "sha512-tQH24WMSYVKYr/Jl1gFImooQmu8OdXUFHoDaPV1WpZIiwbwxbTdwOXeLlGes5U8B8t7xuxTWMWMDt3IwRlDbhQ==", + "peerDependencies": { + "@capacitor/core": "^5.7.0" + } + }, "node_modules/@capacitor/keyboard": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@capacitor/keyboard/-/keyboard-5.0.8.tgz", @@ -3178,6 +3228,27 @@ "tslib": "^2.1.0" } }, + "node_modules/@ionic/storage": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-4.0.0.tgz", + "integrity": "sha512-3N21P19Xk6cICLnSXZ3ilRqbSXAGSFeIF3HNqz+1kARcm0UFT/vwmZreaXtFyq437vvEWOfJ2enlj3JHLKS0FA==", + "dependencies": { + "localforage": "^1.9.0" + } + }, + "node_modules/@ionic/storage-angular": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@ionic/storage-angular/-/storage-angular-4.0.0.tgz", + "integrity": "sha512-FeSmCMCm1bMRfu5TFSqLtjdfEo/dLLUhLIrPmbhSYomVZdV/dNn4mBZv9SabyxSqn4bF31hw40y+4buhG+durQ==", + "dependencies": { + "@ionic/storage": "^4.0.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": "*", + "rxjs": "*" + } + }, "node_modules/@ionic/utils-array": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", @@ -4203,6 +4274,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", @@ -4576,6 +4659,11 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, + "node_modules/@types/cordova": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", + "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==" + }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -4701,6 +4789,25 @@ "@types/node": "*" } }, + "node_modules/@types/node-isbn": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@types/node-isbn/-/node-isbn-1.6.4.tgz", + "integrity": "sha512-SKqE4/fuLWQRHQUzbeKgVEy9Tnh8L6HHzFmTGUgP+c5vmW5us6UmT6I3o4nOnXOw9b249PRP5XMTTfdg6NcwqQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "axios": "^0.21.1" + } + }, + "node_modules/@types/node-isbn/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/@types/qs": { "version": "6.9.14", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", @@ -4780,16 +4887,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", + "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/type-utils": "7.2.0", + "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -4805,8 +4912,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4814,68 +4921,16 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4" }, "engines": { @@ -4886,7 +4941,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4895,13 +4950,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4938,7 +4993,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", @@ -4951,7 +5006,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", @@ -4979,64 +5034,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/utils": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", @@ -5062,65 +5059,7 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", @@ -5137,23 +5076,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -6840,6 +6762,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cordova-plugin-inappbrowser": { + "version": "6.0.1-dev", + "resolved": "git+ssh://git@github.com/ihackfx/cordova-plugin-inappbrowser.git#9f87eabf784614d2b800653462a4840088f0afc1", + "license": "Apache-2.0", + "engines": { + "cordovaDependencies": { + "0.2.3": { + "cordova": ">=3.1.0" + }, + "4.0.0": { + "cordova": ">=3.1.0", + "cordova-ios": ">=4.0.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=6.0.0" + }, + "6.0.1-dev": { + "cordova": ">=9.0.0", + "cordova-android": ">=10.0.0", + "cordova-ios": ">=6.0.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, "node_modules/core-js-compat": { "version": "3.36.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", @@ -7920,6 +7871,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -8093,6 +8056,36 @@ "eslint": ">=2.0.0" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-scope": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", @@ -8637,6 +8630,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -8862,7 +8861,6 @@ "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, "funding": [ { "type": "individual", @@ -9648,6 +9646,11 @@ "node": ">=0.10.0" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/immutable": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", @@ -11160,6 +11163,14 @@ } } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", @@ -11187,6 +11198,14 @@ "node": ">= 12.13.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -11988,6 +12007,22 @@ "node": "^16.13.0 || >=18.0.0" } }, + "node_modules/node-isbn": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/node-isbn/-/node-isbn-1.6.1.tgz", + "integrity": "sha512-OHxpA5xfi7K0iTbqxPpeGlueRA3dasHDRwaKkCWkscLoaKvI8e4mn8yfHrYL0zCJhWq8A2cdrZNbAsHvm7ASwg==", + "dependencies": { + "axios": "^0.21.1" + } + }, + "node_modules/node-isbn/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/node-machine-id": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", @@ -13239,6 +13274,33 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -14898,6 +14960,22 @@ "node": ">=0.10" } }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", diff --git a/package.json b/package.json index 94ba369..097300a 100644 --- a/package.json +++ b/package.json @@ -21,36 +21,45 @@ "@angular/platform-browser": "^17.0.2", "@angular/platform-browser-dynamic": "^17.0.2", "@angular/router": "^17.0.2", + "@awesome-cordova-plugins/in-app-browser": "^6.6.0", + "@capacitor/android": "5.7.4", "@capacitor/app": "5.0.7", "@capacitor/core": "5.7.4", "@capacitor/haptics": "5.0.7", + "@capacitor/ios": "5.7.4", "@capacitor/keyboard": "5.0.8", "@capacitor/status-bar": "5.0.7", "@ionic/angular": "^7.0.0", + "@ionic/storage-angular": "^4.0.0", + "cordova-plugin-inappbrowser": "github:ihackfx/cordova-plugin-inappbrowser", "ionicons": "^7.0.0", + "node-isbn": "^1.6.1", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.14.2" }, "devDependencies": { "@angular-devkit/build-angular": "^17.0.0", - "@angular-eslint/builder": "^17.0.0", - "@angular-eslint/eslint-plugin": "^17.0.0", - "@angular-eslint/eslint-plugin-template": "^17.0.0", - "@angular-eslint/schematics": "^17.0.0", - "@angular-eslint/template-parser": "^17.0.0", + "@angular-eslint/builder": "17.3.0", + "@angular-eslint/eslint-plugin": "17.3.0", + "@angular-eslint/eslint-plugin-template": "17.3.0", + "@angular-eslint/schematics": "17.3.0", + "@angular-eslint/template-parser": "17.3.0", "@angular/cli": "^17.0.0", "@angular/compiler-cli": "^17.0.2", "@angular/language-service": "^17.0.2", "@capacitor/cli": "5.7.4", "@ionic/angular-toolkit": "^11.0.1", "@types/jasmine": "~5.1.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@types/node-isbn": "^1.6.4", + "@typescript-eslint/eslint-plugin": "7.2.0", + "@typescript-eslint/parser": "7.2.0", "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsdoc": "^48.2.1", "eslint-plugin-prefer-arrow": "1.2.2", + "eslint-plugin-prettier": "^5.1.3", "jasmine-core": "~5.1.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.4.0", @@ -58,6 +67,7 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "prettier": "3.2.5", "typescript": "~5.2.2" }, "description": "An Ionic project" diff --git a/src/app/tab3/tab3-routing.module.ts b/src/app/RentPage/rent-routing.module.ts similarity index 60% rename from src/app/tab3/tab3-routing.module.ts rename to src/app/RentPage/rent-routing.module.ts index 5d6abde..6a43024 100644 --- a/src/app/tab3/tab3-routing.module.ts +++ b/src/app/RentPage/rent-routing.module.ts @@ -1,16 +1,16 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { Tab3Page } from './tab3.page'; +import { RentPage } from './rent.page'; const routes: Routes = [ { path: '', - component: Tab3Page, - } + component: RentPage, + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class Tab3PageRoutingModule {} +export class RentPageRoutingModule {} diff --git a/src/app/RentPage/rent.module.ts b/src/app/RentPage/rent.module.ts new file mode 100644 index 0000000..33e08e6 --- /dev/null +++ b/src/app/RentPage/rent.module.ts @@ -0,0 +1,20 @@ +import { IonicModule } from '@ionic/angular'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RentPage } from './rent.page'; + +import { RentPageRoutingModule } from './rent-routing.module'; +import { BookPageModule } from '../modals/book-page/book-page.module'; + +@NgModule({ + imports: [ + IonicModule, + CommonModule, + FormsModule, + RentPageRoutingModule, + BookPageModule, + ], + declarations: [RentPage], +}) +export class RentPageModule {} diff --git a/src/app/RentPage/rent.page.html b/src/app/RentPage/rent.page.html new file mode 100644 index 0000000..1a31d0a --- /dev/null +++ b/src/app/RentPage/rent.page.html @@ -0,0 +1,38 @@ + + + + Аренда + + + + + + + + + + + + + Аренда + + + + + + + + + + {{item.book.volumeInfo.title}} + Выдан: {{item.user?.fio}} + + + + Книга выдана {{dateParse(item.issue.date)}}. До {{dateParse(item.issue.dateTo)}} + + + + + + diff --git a/src/app/RentPage/rent.page.scss b/src/app/RentPage/rent.page.scss new file mode 100644 index 0000000..bbf5fe5 --- /dev/null +++ b/src/app/RentPage/rent.page.scss @@ -0,0 +1,6 @@ +.itemImg{ + margin-left: auto; + margin-right: auto; + margin-top: 2vh; + display: block; +} diff --git a/src/app/RentPage/rent.page.spec.ts b/src/app/RentPage/rent.page.spec.ts new file mode 100644 index 0000000..d6e2519 --- /dev/null +++ b/src/app/RentPage/rent.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; +import { RentPage } from './rent.page'; + +describe('RentPage', () => { + let component: RentPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [RentPage], + imports: [IonicModule.forRoot()], + }).compileComponents(); + + fixture = TestBed.createComponent(RentPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/RentPage/rent.page.ts b/src/app/RentPage/rent.page.ts new file mode 100644 index 0000000..b62ec29 --- /dev/null +++ b/src/app/RentPage/rent.page.ts @@ -0,0 +1,58 @@ +import { Component, OnInit } from '@angular/core'; +import { + bookIssued, + readerUser, + StorageService, +} from '../services/storage/storage.service'; +import { Book, GoogleBookApiService } from '../api/google-book-api.service'; + +interface issue { + issue: bookIssued; + book: Book; + user: readerUser | null; +} + +@Component({ + selector: 'app-rent-page', + templateUrl: 'rent.page.html', + styleUrls: ['rent.page.scss'], +}) +export class RentPage implements OnInit { + constructor( + private storage: StorageService, + private ApiService: GoogleBookApiService, + ) {} + + protected booksName: Array = []; + protected refresh() { + this.ngOnInit(); + } + ngOnInit() { + this.booksName = []; + this.storage.init().then(() => { + this.storage.getBooksIssued().then((issues) => { + this.storage.getReaderUsers().then((users) => { + issues.forEach((issue) => { + return this.ApiService.search(issue.bookId).subscribe({ + next: (book) => { + this.booksName.push({ + issue: issue, + book: book.items[0], + user: + users.find((user) => { + return user.id === issue.userId; + }) || null, + }); + }, + }); + }); + }); + }); + }); + } + + public dateParse(date: string) { + let _date = new Date(date); + return _date.toLocaleDateString(); + } +} diff --git a/src/app/tab2/tab2-routing.module.ts b/src/app/SearchPage/search-routing.module.ts similarity index 58% rename from src/app/tab2/tab2-routing.module.ts rename to src/app/SearchPage/search-routing.module.ts index e96ec09..6f92fb0 100644 --- a/src/app/tab2/tab2-routing.module.ts +++ b/src/app/SearchPage/search-routing.module.ts @@ -1,16 +1,16 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { Tab2Page } from './tab2.page'; +import { SearchPage } from './search.page'; const routes: Routes = [ { path: '', - component: Tab2Page, - } + component: SearchPage, + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class Tab2PageRoutingModule {} +export class SearchPageRoutingModule {} diff --git a/src/app/SearchPage/search.module.ts b/src/app/SearchPage/search.module.ts new file mode 100644 index 0000000..b9f8186 --- /dev/null +++ b/src/app/SearchPage/search.module.ts @@ -0,0 +1,20 @@ +import { IonicModule } from '@ionic/angular'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { SearchPage } from './search.page'; + +import { SearchPageRoutingModule } from './search-routing.module'; +import { BookPageModule } from '../modals/book-page/book-page.module'; + +@NgModule({ + imports: [ + IonicModule, + CommonModule, + FormsModule, + SearchPageRoutingModule, + BookPageModule, + ], + declarations: [SearchPage], +}) +export class SearchPageModule {} diff --git a/src/app/SearchPage/search.page.html b/src/app/SearchPage/search.page.html new file mode 100644 index 0000000..10687dc --- /dev/null +++ b/src/app/SearchPage/search.page.html @@ -0,0 +1,27 @@ + + + + Поиск книг + + + + + + + + Поиск книг + + + + + + + + + + + {{item.volumeInfo.title}} + + + + diff --git a/src/app/SearchPage/search.page.scss b/src/app/SearchPage/search.page.scss new file mode 100644 index 0000000..6697c78 --- /dev/null +++ b/src/app/SearchPage/search.page.scss @@ -0,0 +1,10 @@ +ion-thumbnail{ + height: 15vh; + width: 10vh; +} + +ion-thumbnail img{ + height: 100%; + width: 100%; + object-fit: contain; +} diff --git a/src/app/SearchPage/search.page.spec.ts b/src/app/SearchPage/search.page.spec.ts new file mode 100644 index 0000000..981e91e --- /dev/null +++ b/src/app/SearchPage/search.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; +import { SearchPage } from './search.page'; + +describe('SearchPage', () => { + let component: SearchPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [SearchPage], + imports: [IonicModule.forRoot()], + }).compileComponents(); + + fixture = TestBed.createComponent(SearchPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/SearchPage/search.page.ts b/src/app/SearchPage/search.page.ts new file mode 100644 index 0000000..f28b812 --- /dev/null +++ b/src/app/SearchPage/search.page.ts @@ -0,0 +1,32 @@ +import { Component } from '@angular/core'; +import { Subject, takeUntil } from 'rxjs'; +import { Book, GoogleBookApiService } from '../api/google-book-api.service'; + +@Component({ + selector: 'app-search-page', + templateUrl: 'search.page.html', + styleUrls: ['search.page.scss'], +}) +export class SearchPage { + constructor(private api: GoogleBookApiService) {} + + public searchResult: Array = []; + + private destroy$: Subject = new Subject(); + + public search(e: any) { + this.destroy$.next(true); + this.api + .search(e.target.value) + .pipe(takeUntil(this.destroy$)) + .subscribe({ + next: (res) => { + console.log(res); + this.searchResult = res.items; + }, + error: (error) => { + console.log(error); + }, + }); + } +} diff --git a/src/app/tab1/tab1-routing.module.ts b/src/app/UsersPage/users-routing.module.ts similarity index 59% rename from src/app/tab1/tab1-routing.module.ts rename to src/app/UsersPage/users-routing.module.ts index 8c1cf5b..e6de99e 100644 --- a/src/app/tab1/tab1-routing.module.ts +++ b/src/app/UsersPage/users-routing.module.ts @@ -1,16 +1,16 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { Tab1Page } from './tab1.page'; +import { UsersPage } from './users.page'; const routes: Routes = [ { path: '', - component: Tab1Page, - } + component: UsersPage, + }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class Tab1PageRoutingModule {} +export class UsersPageRoutingModule {} diff --git a/src/app/tab2/tab2.module.ts b/src/app/UsersPage/users.module.ts similarity index 50% rename from src/app/tab2/tab2.module.ts rename to src/app/UsersPage/users.module.ts index 723bac1..f5c02d7 100644 --- a/src/app/tab2/tab2.module.ts +++ b/src/app/UsersPage/users.module.ts @@ -2,19 +2,19 @@ import { IonicModule } from '@ionic/angular'; import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; -import { Tab2Page } from './tab2.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; +import { UsersPage } from './users.page'; -import { Tab2PageRoutingModule } from './tab2-routing.module'; +import { UsersPageRoutingModule } from './users-routing.module'; +import { NewUserModalPageModule } from '../modals/new-user/new-user-modal.module'; @NgModule({ imports: [ IonicModule, CommonModule, FormsModule, - ExploreContainerComponentModule, - Tab2PageRoutingModule + UsersPageRoutingModule, + NewUserModalPageModule, ], - declarations: [Tab2Page] + declarations: [UsersPage], }) export class Tab2PageModule {} diff --git a/src/app/UsersPage/users.page.html b/src/app/UsersPage/users.page.html new file mode 100644 index 0000000..fcafebb --- /dev/null +++ b/src/app/UsersPage/users.page.html @@ -0,0 +1,37 @@ + + + + Читатели + + + + + + + + + + + + + + + + + + Читатели + + + + + ID и ФИО читателя + Дата регистрации + + + {{user.id}} {{user.fio}} + {{getDate(user.registrationDate)}} + + + + + diff --git a/src/app/UsersPage/users.page.scss b/src/app/UsersPage/users.page.scss new file mode 100644 index 0000000..6c7dda4 --- /dev/null +++ b/src/app/UsersPage/users.page.scss @@ -0,0 +1,6 @@ +.toolbar-btn{ + --padding-start: unset; + --padding-end: unset; + --padding-top: unset; + --padding-bottom: unset; +} diff --git a/src/app/UsersPage/users.page.spec.ts b/src/app/UsersPage/users.page.spec.ts new file mode 100644 index 0000000..e8308e3 --- /dev/null +++ b/src/app/UsersPage/users.page.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IonicModule } from '@ionic/angular'; +import { UsersPage } from './users.page'; + +describe('UsersPage', () => { + let component: UsersPage; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [UsersPage], + imports: [IonicModule.forRoot()], + }).compileComponents(); + + fixture = TestBed.createComponent(UsersPage); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/UsersPage/users.page.ts b/src/app/UsersPage/users.page.ts new file mode 100644 index 0000000..de4bacb --- /dev/null +++ b/src/app/UsersPage/users.page.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { + readerUser, + StorageService, +} from '../services/storage/storage.service'; + +@Component({ + selector: 'app-users-page', + templateUrl: 'users.page.html', + styleUrls: ['users.page.scss'], +}) +export class UsersPage implements OnInit { + public users: Array = []; + + constructor(private storage: StorageService) {} + + ngOnInit() { + this.storage.init().then(() => { + this.storage.getReaderUsers().then((users) => { + console.log(users); + this.users = users; + }); + }); + } + + refresh() { + this.ngOnInit(); + } + + getDate(dateNumber: number) { + const date = new Date(dateNumber); + return date.toLocaleDateString(); + } + + protected readonly Date = Date; +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 48fc28d..832664e 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -4,13 +4,28 @@ import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: '', - loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule) - } + loadChildren: () => + import('./tabs/tabs.module').then((m) => m.TabsPageModule), + }, + { + path: 'issue-book-modal', + loadChildren: () => + import('./modals/issue-book-modal/issue-book-modal.module').then( + (m) => m.IssueBookModalPageModule, + ), + }, + { + path: 'new-user-modal', + loadChildren: () => + import('./modals/new-user/new-user-modal.module').then( + (m) => m.NewUserModalPageModule, + ), + }, ]; @NgModule({ imports: [ - RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) + RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }), ], - exports: [RouterModule] + exports: [RouterModule], }) export class AppRoutingModule {} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 51b7b65..5956e6d 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -4,7 +4,6 @@ import { TestBed } from '@angular/core/testing'; import { AppComponent } from './app.component'; describe('AppComponent', () => { - beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [AppComponent], @@ -17,5 +16,4 @@ describe('AppComponent', () => { const app = fixture.componentInstance; expect(app).toBeTruthy(); }); - }); diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4255dd8..e2fcfd5 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,16 +1,29 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; +import { IonicStorageModule } from '@ionic/storage-angular'; import { RouteReuseStrategy } from '@angular/router'; import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; - +import { Drivers } from '@ionic/storage'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { provideHttpClient } from '@angular/common/http'; @NgModule({ declarations: [AppComponent], - imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], - providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }], + imports: [ + BrowserModule, + IonicStorageModule.forRoot({ + name: '__libraryDB', + driverOrder: [Drivers.IndexedDB, Drivers.LocalStorage], + }), + IonicModule.forRoot(), + AppRoutingModule, + ], + providers: [ + { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, + provideHttpClient(), + ], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/src/app/explore-container/explore-container.component.html b/src/app/explore-container/explore-container.component.html deleted file mode 100644 index bbadb7d..0000000 --- a/src/app/explore-container/explore-container.component.html +++ /dev/null @@ -1,4 +0,0 @@ -
- {{ name }} -

Explore UI Components

-
\ No newline at end of file diff --git a/src/app/explore-container/explore-container.component.scss b/src/app/explore-container/explore-container.component.scss deleted file mode 100644 index 8993e7c..0000000 --- a/src/app/explore-container/explore-container.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -#container { - text-align: center; - - position: absolute; - left: 0; - right: 0; - top: 50%; - transform: translateY(-50%); -} - -#container strong { - font-size: 20px; - line-height: 26px; -} - -#container p { - font-size: 16px; - line-height: 22px; - - color: #8c8c8c; - - margin: 0; -} - -#container a { - text-decoration: none; -} \ No newline at end of file diff --git a/src/app/explore-container/explore-container.component.spec.ts b/src/app/explore-container/explore-container.component.spec.ts deleted file mode 100644 index caa9a7c..0000000 --- a/src/app/explore-container/explore-container.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponent } from './explore-container.component'; - -describe('ExploreContainerComponent', () => { - let component: ExploreContainerComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ExploreContainerComponent], - imports: [IonicModule.forRoot()] - }).compileComponents(); - - fixture = TestBed.createComponent(ExploreContainerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/explore-container/explore-container.component.ts b/src/app/explore-container/explore-container.component.ts deleted file mode 100644 index 11beba0..0000000 --- a/src/app/explore-container/explore-container.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'app-explore-container', - templateUrl: './explore-container.component.html', - styleUrls: ['./explore-container.component.scss'], -}) -export class ExploreContainerComponent { - - @Input() name?: string; - -} diff --git a/src/app/explore-container/explore-container.module.ts b/src/app/explore-container/explore-container.module.ts deleted file mode 100644 index 4376296..0000000 --- a/src/app/explore-container/explore-container.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; - -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponent } from './explore-container.component'; - -@NgModule({ - imports: [ CommonModule, FormsModule, IonicModule], - declarations: [ExploreContainerComponent], - exports: [ExploreContainerComponent] -}) -export class ExploreContainerComponentModule {} diff --git a/src/app/tab1/tab1.module.ts b/src/app/tab1/tab1.module.ts deleted file mode 100644 index 135eeae..0000000 --- a/src/app/tab1/tab1.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IonicModule } from '@ionic/angular'; -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { Tab1Page } from './tab1.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab1PageRoutingModule } from './tab1-routing.module'; - -@NgModule({ - imports: [ - IonicModule, - CommonModule, - FormsModule, - ExploreContainerComponentModule, - Tab1PageRoutingModule - ], - declarations: [Tab1Page] -}) -export class Tab1PageModule {} diff --git a/src/app/tab1/tab1.page.html b/src/app/tab1/tab1.page.html deleted file mode 100644 index 22e11e4..0000000 --- a/src/app/tab1/tab1.page.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Tab 1 - - - - - - - - Tab 1 - - - - - diff --git a/src/app/tab1/tab1.page.scss b/src/app/tab1/tab1.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/tab1/tab1.page.spec.ts b/src/app/tab1/tab1.page.spec.ts deleted file mode 100644 index 0dbb7c0..0000000 --- a/src/app/tab1/tab1.page.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab1Page } from './tab1.page'; - -describe('Tab1Page', () => { - let component: Tab1Page; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Tab1Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab1Page); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab1/tab1.page.ts b/src/app/tab1/tab1.page.ts deleted file mode 100644 index 3deefc3..0000000 --- a/src/app/tab1/tab1.page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-tab1', - templateUrl: 'tab1.page.html', - styleUrls: ['tab1.page.scss'] -}) -export class Tab1Page { - - constructor() {} - -} diff --git a/src/app/tab2/tab2.page.html b/src/app/tab2/tab2.page.html deleted file mode 100644 index 38b153e..0000000 --- a/src/app/tab2/tab2.page.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Tab 2 - - - - - - - - Tab 2 - - - - - diff --git a/src/app/tab2/tab2.page.scss b/src/app/tab2/tab2.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/tab2/tab2.page.spec.ts b/src/app/tab2/tab2.page.spec.ts deleted file mode 100644 index 70bd876..0000000 --- a/src/app/tab2/tab2.page.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab2Page } from './tab2.page'; - -describe('Tab2Page', () => { - let component: Tab2Page; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Tab2Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab2Page); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab2/tab2.page.ts b/src/app/tab2/tab2.page.ts deleted file mode 100644 index e14cad4..0000000 --- a/src/app/tab2/tab2.page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-tab2', - templateUrl: 'tab2.page.html', - styleUrls: ['tab2.page.scss'] -}) -export class Tab2Page { - - constructor() {} - -} diff --git a/src/app/tab3/tab3.module.ts b/src/app/tab3/tab3.module.ts deleted file mode 100644 index 2599fc6..0000000 --- a/src/app/tab3/tab3.module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IonicModule } from '@ionic/angular'; -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { Tab3Page } from './tab3.page'; -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab3PageRoutingModule } from './tab3-routing.module'; - -@NgModule({ - imports: [ - IonicModule, - CommonModule, - FormsModule, - ExploreContainerComponentModule, - Tab3PageRoutingModule - ], - declarations: [Tab3Page] -}) -export class Tab3PageModule {} diff --git a/src/app/tab3/tab3.page.html b/src/app/tab3/tab3.page.html deleted file mode 100644 index 222333d..0000000 --- a/src/app/tab3/tab3.page.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Tab 3 - - - - - - - - Tab 3 - - - - - diff --git a/src/app/tab3/tab3.page.scss b/src/app/tab3/tab3.page.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/tab3/tab3.page.spec.ts b/src/app/tab3/tab3.page.spec.ts deleted file mode 100644 index 28d8619..0000000 --- a/src/app/tab3/tab3.page.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { IonicModule } from '@ionic/angular'; - -import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; - -import { Tab3Page } from './tab3.page'; - -describe('Tab3Page', () => { - let component: Tab3Page; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [Tab3Page], - imports: [IonicModule.forRoot(), ExploreContainerComponentModule] - }).compileComponents(); - - fixture = TestBed.createComponent(Tab3Page); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/tab3/tab3.page.ts b/src/app/tab3/tab3.page.ts deleted file mode 100644 index 9ed0dae..0000000 --- a/src/app/tab3/tab3.page.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-tab3', - templateUrl: 'tab3.page.html', - styleUrls: ['tab3.page.scss'] -}) -export class Tab3Page { - - constructor() {} - -} diff --git a/src/app/tabs/tabs-routing.module.ts b/src/app/tabs/tabs-routing.module.ts index 770e87e..e8e404f 100644 --- a/src/app/tabs/tabs-routing.module.ts +++ b/src/app/tabs/tabs-routing.module.ts @@ -8,29 +8,32 @@ const routes: Routes = [ component: TabsPage, children: [ { - path: 'tab1', - loadChildren: () => import('../tab1/tab1.module').then(m => m.Tab1PageModule) + path: 'search', + loadChildren: () => + import('../SearchPage/search.module').then((m) => m.SearchPageModule), }, { - path: 'tab2', - loadChildren: () => import('../tab2/tab2.module').then(m => m.Tab2PageModule) + path: 'users', + loadChildren: () => + import('../UsersPage/users.module').then((m) => m.Tab2PageModule), }, { - path: 'tab3', - loadChildren: () => import('../tab3/tab3.module').then(m => m.Tab3PageModule) + path: 'rent', + loadChildren: () => + import('../RentPage/rent.module').then((m) => m.RentPageModule), }, { path: '', - redirectTo: '/tabs/tab1', - pathMatch: 'full' - } - ] + redirectTo: '/tabs/search', + pathMatch: 'full', + }, + ], }, { path: '', - redirectTo: '/tabs/tab1', - pathMatch: 'full' - } + redirectTo: '/tabs/search', + pathMatch: 'full', + }, ]; @NgModule({ diff --git a/src/app/tabs/tabs.module.ts b/src/app/tabs/tabs.module.ts index de4184a..d177b17 100644 --- a/src/app/tabs/tabs.module.ts +++ b/src/app/tabs/tabs.module.ts @@ -8,12 +8,7 @@ import { TabsPageRoutingModule } from './tabs-routing.module'; import { TabsPage } from './tabs.page'; @NgModule({ - imports: [ - IonicModule, - CommonModule, - FormsModule, - TabsPageRoutingModule - ], - declarations: [TabsPage] + imports: [IonicModule, CommonModule, FormsModule, TabsPageRoutingModule], + declarations: [TabsPage], }) export class TabsPageModule {} diff --git a/src/app/tabs/tabs.page.html b/src/app/tabs/tabs.page.html index ae0aceb..ae88d30 100644 --- a/src/app/tabs/tabs.page.html +++ b/src/app/tabs/tabs.page.html @@ -1,19 +1,19 @@ - - - Tab 1 + + + Поиск книг - - - Tab 2 + + + Читатели - - - Tab 3 + + + Аренда diff --git a/src/app/tabs/tabs.page.ts b/src/app/tabs/tabs.page.ts index 7d64f97..5d19119 100644 --- a/src/app/tabs/tabs.page.ts +++ b/src/app/tabs/tabs.page.ts @@ -3,10 +3,8 @@ import { Component } from '@angular/core'; @Component({ selector: 'app-tabs', templateUrl: 'tabs.page.html', - styleUrls: ['tabs.page.scss'] + styleUrls: ['tabs.page.scss'], }) export class TabsPage { - constructor() {} - } diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3612073..c966979 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,3 +1,3 @@ export const environment = { - production: true + production: true, }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index f56ff47..66998ae 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,7 +3,7 @@ // The list of file replacements can be found in `angular.json`. export const environment = { - production: false + production: false, }; /* diff --git a/src/main.ts b/src/main.ts index 91ec6da..741c9eb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,5 +8,6 @@ if (environment.production) { enableProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.log(err)); +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch((err) => console.log(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts index 394705a..1ae7891 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -41,14 +41,13 @@ * (window as any).__Zone_enable_cross_context_check = true; * */ - + import './zone-flags'; /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js'; // Included with Angular CLI. - +import 'zone.js'; // Included with Angular CLI. /*************************************************************************************************** * APPLICATION IMPORTS diff --git a/src/test.ts b/src/test.ts index 51bb020..b218a9f 100644 --- a/src/test.ts +++ b/src/test.ts @@ -4,7 +4,7 @@ import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, - platformBrowserDynamicTesting + platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; // First, initialize the Angular testing environment.