diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 7184ee04b..000000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: Autocloser -on: [issues] -jobs: - autoclose: - runs-on: ubuntu-latest - steps: - - name: Issue auto-closer - uses: roots/issue-closer-action@v1.1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-close-message: "@${issue.user.login} this issue was automatically closed because it did not follow the bellow rules:\n\n
\n\n\n\nIMPORTANT: Please use the following link to create a new issue:\n\nhttps://www.creative-tim.com/new-issue/light-bootstrap-dashboard-angular2\n\n**If your issue was not created using the app above, it will be closed immediately.**\n\n\n\nLove Creative Tim? Do you need Angular, React, Vuejs or HTML? You can visit:\n👉  https://www.creative-tim.com/bundles\n👉  https://www.creative-tim.com\n\n\n
\n\n" - issue-pattern: (\#\#\# Version([\S\s.*]*?)\#\#\# Reproduction link([\S\s.*]*?)\#\#\# Operating System([\S\s.*]*?)\#\#\# Device([\S\s.*]*?)\#\#\# Browser & Version([\S\s.*]*?)\#\#\# Steps to reproduce([\S\s.*]*?)\#\#\# What is expected([\S\s.*]*?)\#\#\# What is actually happening([\S\s.*]*?)---([\S\s.*]*?)\#\#\# Solution([\S\s.*]*?)\#\#\# Additional comments([\S\s.*]*?)\<\!-- generated by creative-tim-issues\. DO NOT REMOVE --\>)|(\#\#\# What is your enhancement([\S\s.*]*?)\<\!-- generated by creative-tim-issues\. DO NOT REMOVE --\>) diff --git a/.gitignore b/.gitignore index 2e46ff8a2..09d797412 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output /dist /tmp diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md deleted file mode 100644 index 8309acfab..000000000 --- a/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index c186949d6..000000000 --- a/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Creative Tim (www.creative-tim.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..489b2700a --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: node server.js diff --git a/README.md b/README.md index 5803d89cf..e69de29bb 100644 --- a/README.md +++ b/README.md @@ -1,172 +0,0 @@ -# [Light Bootstrap Dashboard Angular](https://demos.creative-tim.com/light-bootstrap-dashboard-angular2/dashboard) -[![version][version-badge]][CHANGELOG] ![license][license-badge] - -![alt text](src/assets/img/opt_lbd_angular_thumbnail.jpg) - -**[Light Bootstrap Dashboard Angular](https://demos.creative-tim.com/light-bootstrap-dashboard-angular2/dashboard)** is an admin dashboard template designed to be beautiful and simple. It is built on top of Bootstrap 3, using [Light Bootstrap Dashboard](https://www.creative-tim.com/product/light-bootstrap-dashboard) and it is fully responsive. It comes with a big collections of elements that will offer you multiple possibilities to create the app that best fits your needs. It can be used to create admin panels, project management systems, web applications backend, CMS or CRM. - -The product represents a big suite of front-end developer tools that can help you jump start your project. We have created it thinking about things you actually need in a dashboard. Light Bootstrap Dashboard Angular 2 contains multiple handpicked and optimized plugins. Everything is designed to fit with one another. As you will be able to see, the dashboard you can access on Creative Tim is a customization of this product. - -It comes with 6 filter colors for the sidebar (“black”, “azure”,”green”,”orange”,”red”,”purple”) and an option to have a background image. - -Special thanks go to: Robert McIntosh for the notification system Chartist for the wonderful charts We are very excited to share this dashboard with you and we look forward to hearing your feedback! - -## Links: - -+ [Live Preview](https://demos.creative-tim.com/light-bootstrap-dashboard-angular2/dashboard) -+ [Light Bootstrap Dashboard PRO Angular](https://www.creative-tim.com/product/light-bootstrap-dashboard-pro-angular2/?ref=lbd-angular-github) ($49) - -## Quick Start: - -Quick start options: - -+ [Download from Github](https://github.com/creativetimofficial/light-bootstrap-dashboard-angular2/archive/master.zip). -+ [Download from Creative Tim](https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2). -+ Clone the repo: `git clone https://github.com/creativetimofficial/light-bootstrap-dashboard-angular2.git`. - -## Terminal Commands - -1. Install NodeJs from [NodeJs Official Page](https://nodejs.org/en). -2. Open Terminal -3. Go to your file project -4. Run in terminal: ```npm install -g @angular/cli``` -5. Then: ```npm install``` -6. And: ```ng serve``` -7. Navigate to `http://localhost:4200/` - -### What's included - -Within the download you'll find the following directories and files: -``` -light-bootstrap-dashboard-angular -├── CHANGELOG.md -├── LICENSE.md -├── README.md -├── angular.json -├── documentation -│   ├── css -│   └── tutorial-lbd-angular2.html -├── e2e -├── karma.conf.js -├── package-lock.json -├── package.json -├── protractor.conf.js -├── src -│   ├── app -│   │   ├── app.component.css -│   │   ├── app.component.html -│   │   ├── app.component.spec.ts -│   │   ├── app.component.ts -│   │   ├── app.module.ts -│   │   ├── app.routing.ts -│   │   ├── home -│   │   │   ├── home.component.css -│   │   │   ├── home.component.html -│   │   │   ├── home.component.spec.ts -│   │   │   └── home.component.ts -│   │   ├── icons -│   │   │   ├── icons.component.css -│   │   │   ├── icons.component.html -│   │   │   ├── icons.component.spec.ts -│   │   │   └── icons.component.ts -│   │   ├── layouts -│   │   │   └── admin-layout -│   │   │   ├── admin-layout.component.html -│   │   │   ├── admin-layout.component.scss -│   │   │   ├── admin-layout.component.spec.ts -│   │   │   ├── admin-layout.component.ts -│   │   │   ├── admin-layout.module.ts -│   │   │   └── admin-layout.routing.ts -│   │   ├── lbd -│   │   │   ├── lbd-chart -│   │   │   │   ├── lbd-chart.component.html -│   │   │   │   └── lbd-chart.component.ts -│   │   │   └── lbd.module.ts -│   │   ├── maps -│   │   │   ├── maps.component.css -│   │   │   ├── maps.component.html -│   │   │   ├── maps.component.spec.ts -│   │   │   └── maps.component.ts -│   │   ├── notifications -│   │   │   ├── notifications.component.css -│   │   │   ├── notifications.component.html -│   │   │   ├── notifications.component.spec.ts -│   │   │   └── notifications.component.ts -│   │   ├── shared -│   │   │   ├── footer -│   │   │   │   ├── footer.component.html -│   │   │   │   ├── footer.component.ts -│   │   │   │   └── footer.module.ts -│   │   │   └── navbar -│   │   │   ├── navbar.component.html -│   │   │   ├── navbar.component.ts -│   │   │   └── navbar.module.ts -│   │   ├── sidebar -│   │   │   ├── sidebar.component.html -│   │   │   ├── sidebar.component.ts -│   │   │   └── sidebar.module.ts -│   │   ├── tables -│   │   │   ├── tables.component.css -│   │   │   ├── tables.component.html -│   │   │   ├── tables.component.spec.ts -│   │   │   └── tables.component.ts -│   │   ├── typography -│   │   │   ├── typography.component.css -│   │   │   ├── typography.component.html -│   │   │   ├── typography.component.spec.ts -│   │   │   └── typography.component.ts -│   │   ├── upgrade -│   │   │   ├── upgrade.component.css -│   │   │   ├── upgrade.component.html -│   │   │   ├── upgrade.component.spec.ts -│   │   │   └── upgrade.component.ts -│   │   └── user -│   │   ├── user.component.css -│   │   ├── user.component.html -│   │   ├── user.component.spec.ts -│   │   └── user.component.ts -│   ├── assets -│   │   ├── css -│   │   ├── fonts -│   │   ├── img -│   │   └── sass -│   │   ├── lbd -│   │   └── light-bootstrap-dashboard.scss -│   ├── environments -│   ├── favicon.ico -│   ├── index.html -│   ├── main.ts -│   ├── polyfills.ts -│   ├── styles.css -│   ├── test.ts -│   └── tsconfig.json -├── tslint.json -└── typings.json - -``` -## Useful Links - -More products from Creative Tim: - -Tutorials: - -Freebies: - -Affiliate Program (earn money): - -Social Media: - -Twitter: - -Facebook: - -Dribbble: - -Google+: - -Instagram: - -[CHANGELOG]: ./CHANGELOG.md - -[version-badge]: https://img.shields.io/badge/version-1.9.0-blue.svg -[license-badge]: https://img.shields.io/badge/license-MIT-blue.svg diff --git a/angular.json b/angular.json index b232b7f9f..2e4134486 100644 --- a/angular.json +++ b/angular.json @@ -21,6 +21,7 @@ "src/favicon.ico" ], "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "node_modules/perfect-scrollbar/css/perfect-scrollbar.css", "node_modules/animate.css/animate.min.css", "node_modules/bootstrap/dist/css/bootstrap.min.css", @@ -102,6 +103,7 @@ "node_modules/chartist/dist/chartist.js" ], "styles": [ + "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "node_modules/animate.css/animate.min.css", "node_modules/bootstrap/dist/css/bootstrap.min.css", "src/assets/sass/light-bootstrap-dashboard.scss", diff --git a/documentation/css/light-bootstrap-dashboard.css b/documentation/css/light-bootstrap-dashboard.css index e2112107f..62f396aa8 100644 --- a/documentation/css/light-bootstrap-dashboard.css +++ b/documentation/css/light-bootstrap-dashboard.css @@ -1,19 +1,3 @@ -/*! - - ========================================================= - * Light Bootstrap Dashboard Angular - v1.6.0 - ========================================================= - - * Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2 - * Copyright 2016 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - */ -/* light colors */ @keyframes spin { from { transform: rotate(0deg); @@ -46,7 +30,7 @@ -ms-transform: rotate(360deg); } } -/* Font Smoothing */ + body, h1, .h1, h2, .h2, @@ -147,7 +131,7 @@ h1 .subtitle { color: #FF4A55 !important; } -/* General overwrite */ + #loader { position: absolute; display: block; @@ -199,7 +183,7 @@ input:focus { outline: 0 !important; } -/* Animations */ + .form-control, .input-group-addon, .tagsinput, diff --git a/documentation/tutorial-lbd-angular2.html b/documentation/tutorial-lbd-angular2.html deleted file mode 100644 index 86fd04805..000000000 --- a/documentation/tutorial-lbd-angular2.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - Light Bootstrap Dashboard Angular by Creative Tim - - - - - - - - - - - - - - - - - -
- - -
-
-
-

Light Bootstrap Dashboard Angular

-

v1.9.0

-

We are constantly doing updates for you.

- View Documentation -
-
-
- - - - diff --git a/karma.conf.js b/karma.conf.js index 8d6187901..c5a8d334d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,5 +1,3 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/0.13/config/configuration-file.html module.exports = function (config) { config.set({ diff --git a/package.json b/package.json index 61ed09064..71a400d90 100644 --- a/package.json +++ b/package.json @@ -1,63 +1,64 @@ { - "name": "lbd-free-angular-cli", - "version": "1.9.0", - "license": "MIT", - "scripts": { - "ng": "ng", - "start": "ng serve", - "build": "ng build", - "test": "ng test", - "lint": "ng lint", - "e2e": "ng e2e", - "install:clean": "rm -rf node_modules/ && rm -rf package-lock.json && npm install && npm start" - }, - "private": true, - "dependencies": { - "@angular/animations": "^14.2.0", - "@angular/cdk": "^14.2.0", - "@angular/common": "^14.2.0", - "@angular/compiler": "^14.2.0", - "@angular/core": "^14.2.0", - "@angular/elements": "^14.2.0", - "@angular/forms": "^14.2.0", - "@angular/localize": "^14.2.0", - "@angular/material": "^14.2.0", - "@angular/platform-browser": "^14.2.0", - "@angular/platform-browser-dynamic": "^14.2.0", - "@angular/router": "^14.2.0", - "@ngui/map": "0.30.3", - "@types/googlemaps": "3.40.5", - "animate.css": "4.1.1", - "arrive": "2.4.1", - "bootstrap": "3.3.7", - "bootstrap-notify": "3.1.3", - "chartist": "0.11.4", - "googleapis": "66.0.0", - "jquery": "3.5.1", - "perfect-scrollbar": "1.5.0", - "rxjs": "~7.5.0", - "tslib": "^2.3.0", - "zone.js": "~0.11.4" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^14.2.3", - "@angular/cli": "~14.2.3", - "@angular/compiler-cli": "^14.2.0", - "@types/jasmine": "~4.0.0", - "jasmine-core": "~4.3.0", - "karma": "~6.4.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.2.0", - "karma-jasmine": "~5.1.0", - "karma-jasmine-html-reporter": "~2.0.0", - "typescript": "~4.7.2", - "@types/jasminewd2": "~2.0.10", - "@types/chartist": "0.11.0", - "@types/jquery": "3.5.1", - "@types/node": "16.3.2", - "codelyzer": "6.0.2", - "jasmine-spec-reporter": "~7.0.0", - "protractor": "7.0.0", - "ts-node": "~10.7.0" - } -} + "name": "encuentros-matrimoniales", + "version": "1.9.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "node server.js", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "install:clean": "rm -rf node_modules/ && rm -rf package-lock.json && npm install -g npm@latest && npm start" + }, + "private": true, + "dependencies": { + "@angular/animations": "^14.2.0", + "@angular/cdk": "^14.2.0", + "@angular/common": "^14.2.0", + "@angular/compiler": "^14.2.0", + "@angular/core": "^14.2.0", + "@angular/elements": "^14.2.0", + "@angular/forms": "^14.2.0", + "@angular/localize": "^14.2.0", + "@angular/material": "^14.2.0", + "@angular/platform-browser": "^14.2.0", + "@angular/platform-browser-dynamic": "^14.2.0", + "@angular/router": "^14.2.0", + "@ngui/map": "0.30.3", + "@types/googlemaps": "3.40.5", + "animate.css": "4.1.1", + "arrive": "2.4.1", + "bootstrap": "^3.4.1", + "bootstrap-notify": "3.1.3", + "chartist": "0.11.4", + "express": "^4.16.3", + "googleapis": "66.0.0", + "jquery": "3.5.1", + "perfect-scrollbar": "1.5.0", + "rxjs": "~7.5.0", + "tslib": "^2.3.0", + "xlsx": "^0.18.5", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^14.2.0", + "@angular/cli": "~14.2.3", + "@angular/compiler-cli": "^14.2.0", + "@types/jasmine": "~4.0.0", + "@types/jasminewd2": "~2.0.10", + "@types/jquery": "3.5.1", + "@types/node": "16.3.2", + "codelyzer": "^0.0.28", + "jasmine-core": "~4.3.0", + "jasmine-spec-reporter": "~7.0.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.0.0", + "protractor": "7.0.0", + "ts-node": "~10.7.0", + "typescript": "~4.7.2" + } +} \ No newline at end of file diff --git a/protractor.conf.js b/protractor.conf.js index ffded7018..40ef6b3b9 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -1,7 +1,4 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts -/*global jasmine */ var SpecReporter = require('jasmine-spec-reporter'); exports.config = { diff --git a/server.js b/server.js new file mode 100644 index 000000000..123c4130a --- /dev/null +++ b/server.js @@ -0,0 +1,18 @@ +//Install express server +const express = require('express'); +const path = require('path'); + +const app = express(); + +// Serve only the static files form the dist directory +app.use(express.static(__dirname+ '/dist/')); + +app.get('/*', function(req,res) { +console.log("Fetching from __dirname.." + __dirname); +const fpath = path.join(__dirname+ '/dist/index.html'); +console.log("Fetching from.." + fpath); +res.sendFile(fpath); +}); + +// Start the app by listening on the default Heroku port +app.listen(process.env.PORT || 8080); diff --git a/src/app/app.component.html b/src/app/app.component.html index 79be59ce6..b6dea4f4a 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,2 +1,3 @@ - - +
+ +
\ No newline at end of file diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 5be2cb3fa..51ffc9fab 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,4 +1,4 @@ -/* tslint:disable:no-unused-variable */ + import { TestBed, async } from '@angular/core/testing'; import { AppComponent } from './app.component'; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 24da5d994..2a9a4dfd9 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -3,15 +3,26 @@ import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { RouterModule } from '@angular/router'; - import { AppRoutingModule } from './app.routing'; import { NavbarModule } from './shared/navbar/navbar.module'; import { FooterModule } from './shared/footer/footer.module'; import { SidebarModule } from './sidebar/sidebar.module'; - import { AppComponent } from './app.component'; - import { AdminLayoutComponent } from './layouts/admin-layout/admin-layout.component'; +import { LoginComponent } from './login/login.component'; +import { RegisterComponent } from './register/register.component'; + +import { PaginationComponent } from './pagination/pagination.component'; + +import { MatDialogModule } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { ConfirmDialogComponent } from './shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmDownloadDialogComponent } from './shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from './shared/confirm-delete/confirm-delete.component'; +import { ConfirmCreationComponent } from './shared/confirm-creation/confirm-creation.component'; +import { ConfimLoginErrorComponent } from './shared/confim-login-error/confim-login-error.component'; + + @NgModule({ imports: [ @@ -22,12 +33,13 @@ import { AdminLayoutComponent } from './layouts/admin-layout/admin-layout.compon NavbarModule, FooterModule, SidebarModule, - AppRoutingModule - ], - declarations: [ - AppComponent, - AdminLayoutComponent + AppRoutingModule, + MatDialogModule, + MatButtonModule ], + + entryComponents: [ConfirmDialogComponent], + declarations: [AppComponent, AdminLayoutComponent, LoginComponent, RegisterComponent, ConfirmDialogComponent, ConfirmDownloadDialogComponent, PaginationComponent, ConfirmDeleteComponent, ConfirmCreationComponent, ConfimLoginErrorComponent], providers: [], bootstrap: [AppComponent] }) diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index 993dc346d..1fbb3f663 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -2,15 +2,20 @@ import { NgModule } from '@angular/core'; import { CommonModule, } from '@angular/common'; import { BrowserModule } from '@angular/platform-browser'; import { Routes, RouterModule } from '@angular/router'; - import { AdminLayoutComponent } from './layouts/admin-layout/admin-layout.component'; +import { RegisterComponent } from './register/register.component'; +import { LoginComponent } from './login/login.component'; + -const routes: Routes =[ +const appRoutes: Routes =[ { path: '', redirectTo: 'dashboard', pathMatch: 'full', - }, { + }, + { path: "login", component: LoginComponent, pathMatch: "full" }, + { path: "register", component: RegisterComponent, pathMatch: "full" }, + { path: '', component: AdminLayoutComponent, children: [ @@ -21,14 +26,14 @@ const routes: Routes =[ { path: '**', redirectTo: 'dashboard' - } + }, ]; @NgModule({ imports: [ CommonModule, BrowserModule, - RouterModule.forRoot(routes,{ + RouterModule.forRoot(appRoutes,{ useHash: true }) ], diff --git a/src/app/auth.guard.spec.ts b/src/app/auth.guard.spec.ts new file mode 100644 index 000000000..68889d22d --- /dev/null +++ b/src/app/auth.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthGuard } from './auth.guard'; + +describe('AuthGuard', () => { + let guard: AuthGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(AuthGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/src/app/auth.guard.ts b/src/app/auth.guard.ts new file mode 100644 index 000000000..bb0f2ad1d --- /dev/null +++ b/src/app/auth.guard.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, Router } from '@angular/router'; +import { AuthService } from './services/auth.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate { + + constructor( + private authService: AuthService, + private router: Router + ) {} + + canActivate(): boolean { + if (this.authService.isAuthenticated) { + return true; + } else { + this.router.navigate(['/login']); + return false; + } + } + +} diff --git a/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.css b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.html b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.html new file mode 100644 index 000000000..e5d227025 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.html @@ -0,0 +1,161 @@ + +
+
+
+
+
+
+

Editar Registro

+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ diff --git a/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.spec.ts b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.spec.ts new file mode 100644 index 000000000..5ca3e1275 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EditarMatrimonioComponent } from './editarMatrimonio.component'; + +describe('EditarMatrimonioComponent', () => { + let component: EditarMatrimonioComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditarMatrimonioComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditarMatrimonioComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.ts b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.ts new file mode 100644 index 000000000..e21245c03 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component.ts @@ -0,0 +1,273 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + + +@Component({ + selector: 'app-editarMatrimonio', + templateUrl: './editarMatrimonio.component.html', + styleUrls: ['./editarMatrimonio.component.css'] +}) +export class EditarMatrimonioComponent implements OnInit { + + editarMatrimonioForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarMatrimonioForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + jornadaDialogo: [null, Validators.required], + retornoEspiritual: [null, Validators.required], + lenguajeAmor: [null, Validators.required], + guiaDeRelacion: [null, Validators.required], + sacramento: [null, Validators.required], + diosEnSacramento: [null, Validators.required], + diosEnVida: [null, Validators.required], + patronesComportamiento: [null, Validators.required], + dialogoProfundo: [null, Validators.required], + servidoresPostEncuentro: [null, Validators.required], + formacionAcompanantes: [null, Validators.required], + padreNuestro: [null, Validators.required], + transmisionNacional: [null, Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerMatrimonio(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + + let fecha = new Date(data.response.fechaCreacion); + fecha.setDate(fecha.getDate() - 1); // Resta un día + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarMatrimonioForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarMatrimonioForm.controls['jornadaDialogo'].setValue(data.response.jornadaDialogo); + this.editarMatrimonioForm.controls['retornoEspiritual'].setValue(data.response.retornoEspiritual); + this.editarMatrimonioForm.controls['lenguajeAmor'].setValue(data.response.lenguajeAmor); + this.editarMatrimonioForm.controls['guiaDeRelacion'].setValue(data.response.guiaDeRelacion); + this.editarMatrimonioForm.controls['sacramento'].setValue(data.response.sacramento); + this.editarMatrimonioForm.controls['diosEnSacramento'].setValue(data.response.diosEnSacramento); + this.editarMatrimonioForm.controls['diosEnVida'].setValue(data.response.diosEnVida); + this.editarMatrimonioForm.controls['patronesComportamiento'].setValue(data.response.patronesComportamiento); + this.editarMatrimonioForm.controls['dialogoProfundo'].setValue(data.response.dialogoProfundo); + this.editarMatrimonioForm.controls['servidoresPostEncuentro'].setValue(data.response.servidoresPostEncuentro); + this.editarMatrimonioForm.controls['formacionAcompanantes'].setValue(data.response.formacionAcompanantes); + this.editarMatrimonioForm.controls['padreNuestro'].setValue(data.response.padreNuestro); + this.editarMatrimonioForm.controls['transmisionNacional'].setValue(data.response.transmisionNacional); + + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + console.log(pais.id) + this.editarMatrimonioForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarMatrimonioForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + console.log(ciudades); + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarMatrimonioForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + }); + + } + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + obtenerMatrimonio(id: string): Observable { + const params = { id: id }; + console.log(this.token); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarMatrimonio(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarMatrimonio() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const jornadaDialogo = (document.getElementById('jornadaDialogo')).value; + const retornoEspiritual = (document.getElementById('retornoEspiritual')).value; + const lenguajeAmor = (document.getElementById('lenguajeAmor')).value; + const guiaDeRelacion = (document.getElementById('guiaDeRelacion')).value; + const sacramento = (document.getElementById('sacramento')).value; + const diosEnSacramento = (document.getElementById('diosEnSacramento')).value; + const diosEnVida = (document.getElementById('diosEnVida')).value; + const patronesComportamiento = (document.getElementById('patronesComportamiento')).value; + const dialogoProfundo = (document.getElementById('dialogoProfundo')).value; + const servidoresPostEncuentro = (document.getElementById('servidoresPostEncuentro')).value; + const formacionAcompanantes = (document.getElementById('formacionAcompanantes')).value; + const padreNuestro = (document.getElementById('padreNuestro')).value; + const transmisionNacional = (document.getElementById('transmisionNacional')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const editarMatrimonio = { + id, + fechaCreacion, + jornadaDialogo, + retornoEspiritual, + lenguajeAmor, + guiaDeRelacion, + sacramento, + diosEnSacramento, + diosEnVida, + patronesComportamiento, + dialogoProfundo, + servidoresPostEncuentro, + formacionAcompanantes, + padreNuestro, + transmisionNacional, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonMatrimonio = JSON.stringify(editarMatrimonio); // Convertir el objeto en una cadena JSON + console.log(jsonMatrimonio); + console.log(this.httpOptions); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/create', jsonMatrimonio, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/matrimoniosGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarMatrimonioForm.controls['select-ciudad'].reset(); + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.css b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.css new file mode 100644 index 000000000..74d772980 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.css @@ -0,0 +1,44 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.html b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.html new file mode 100644 index 000000000..85ab6026a --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.html @@ -0,0 +1,86 @@ +
+
+
+
+
+
+
+
+

Formación Matrimonios

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
FechaJornada de dialogoLenguaje de amorSacramentoPatrones de comportamientoAcciones
{{row.fechaCreacion}}{{row.jornadaDialogo}}{{row.lenguajeAmor}}{{row.sacramento}}{{row.patronesComportamiento}} + + +
+ +
+
+
+ +
+
+
diff --git a/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.spec.ts b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.spec.ts new file mode 100644 index 000000000..c27524bc9 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { MatrimoniosGridComponent } from './matrimoniosGrid.component'; + +describe('MatrimoniosGridComponent', () => { + let component: MatrimoniosGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MatrimoniosGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MatrimoniosGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.ts b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.ts new file mode 100644 index 000000000..fc1b0a8da --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/matrimoniosGrid.component.ts @@ -0,0 +1,290 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-matrimoniosGrid', + templateUrl: './matrimoniosGrid.component.html', + styleUrls: ['./matrimoniosGrid.component.css'] +}) + +export class MatrimoniosGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + } + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + isVisible: true + + } + }); + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + } + }); + + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + + editRow(row) { + const elementId = row.id; + console.log(elementId); + this.router.navigate(['/editarMatrimonio', elementId]); + + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/delete?id=${params.id}`, {}, httpOptions); + response.subscribe((result: any) => { + + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + }); + } + + + public getTableData() { + const userId = localStorage.getItem('userId'); + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + isVisible: true + } + }); + + this.data = responseData; + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + + generateExcel(){ + let userId = localStorage.getItem('userId'); + // Realizar la consulta y obtener los datos en un arreglo + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/getAll?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = [ + 'ID', + 'Fecha de Creación', + 'Jornada de Diálogo', + 'Retorno Espiritual', + 'Lenguaje del Amor', + 'Guía de Relación', + 'Sacramento', + 'Dios en el Sacramento', + 'Dios en la Vida', + 'Patrones de Comportamiento', + 'Diálogo Profundo', + 'Servidores Post Encuentro', + 'Formación de Acompañantes', + 'Padre Nuestro', + 'Transmisión Nacional' + ]; + + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.jornadaDialogo, + item.retornoEspiritual, + item.lenguajeAmor, + item.guiaDeRelacion, + item.sacramento, + item.diosEnSacramento, + item.diosEnVida, + item.patronesComportamiento, + item.dialogoProfundo, + item.servidoresPostEncuentro, + item.formacionAcompanantes, + item.padreNuestro, + item.transmisionNacional + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'Matrimonios.xlsx'; + link.click(); + }) + } + // Función para convertir una cadena a un arreglo de bytes + s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; + } + filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + + id: item.id, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + + }; + }); + } + +} diff --git a/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.css b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.html b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.html new file mode 100644 index 000000000..f9c4fdcae --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.html @@ -0,0 +1,163 @@ + +
+
+
+
+
+
+

Crear Nuevo matrimonio

+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ + +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.spec.ts b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.spec.ts new file mode 100644 index 000000000..64924dac7 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoMatrimonioComponent } from './nuevoMatrimonio.component'; + +describe('NuevoMatrimonioComponent', () => { + let component: NuevoMatrimonioComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoMatrimonioComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoMatrimonioComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.ts b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.ts new file mode 100644 index 000000000..732876762 --- /dev/null +++ b/src/app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component.ts @@ -0,0 +1,170 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-nuevoMatrimonio', + templateUrl: './nuevoMatrimonio.component.html', + styleUrls: ['./nuevoMatrimonio.component.css'] +}) +export class NuevoMatrimonioComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newMatrimonio(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newMatrimonio() { + + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const jornadaDialogo = (document.getElementById('jornadaDialogo')).value; + const retornoEspiritual = (document.getElementById('retornoEspiritual')).value; + const lenguajeAmor = (document.getElementById('lenguajeAmor')).value; + const guiaDeRelacion = (document.getElementById('guiaDeRelacion')).value; + const sacramento = (document.getElementById('sacramento')).value; + const diosEnSacramento = (document.getElementById('diosEnSacramento')).value; + const diosEnVida = (document.getElementById('diosEnVida')).value; + const patronesComportamiento = (document.getElementById('patronesComportamiento')).value; + const dialogoProfundo = (document.getElementById('dialogoProfundo')).value; + const servidoresPostEncuentro = (document.getElementById('servidoresPostEncuentro')).value; + const formacionAcompanantes = (document.getElementById('formacionAcompanantes')).value; + const padreNuestro = (document.getElementById('padreNuestro')).value; + const transmisionNacional = (document.getElementById('transmisionNacional')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const matrimonio = { + fechaCreacion, + jornadaDialogo, + retornoEspiritual, + lenguajeAmor, + guiaDeRelacion, + sacramento, + diosEnSacramento, + diosEnVida, + patronesComportamiento, + dialogoProfundo, + servidoresPostEncuentro, + formacionAcompanantes, + padreNuestro, + transmisionNacional, + ciudad: { + id: ciudadSeleccionada + }, + }; + + + const jsonMatrimonio = JSON.stringify(matrimonio); // Convertir el objeto en una cadena JSON + console.log(jsonMatrimonio); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/formacion/matrimonio/create', jsonMatrimonio, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/matrimoniosGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } +} diff --git a/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.css b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.html b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.html new file mode 100644 index 000000000..85bdb4140 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.html @@ -0,0 +1,161 @@ + +
+
+
+
+
+
+

Editar Registro

+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
+
diff --git a/src/app/upgrade/upgrade.component.spec.ts b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.spec.ts similarity index 51% rename from src/app/upgrade/upgrade.component.spec.ts rename to src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.spec.ts index 7e834f205..37dcb5475 100644 --- a/src/app/upgrade/upgrade.component.spec.ts +++ b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.spec.ts @@ -1,20 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { EditarSacerdoteComponent } from './editarSacerdote.component'; -import { UpgradeComponent } from './upgrade.component'; - -describe('UpgradeComponent', () => { - let component: UpgradeComponent; - let fixture: ComponentFixture; +describe('EditarSacerdoteComponent', () => { + let component: EditarSacerdoteComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ UpgradeComponent ] + declarations: [ EditarSacerdoteComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(UpgradeComponent); + fixture = TestBed.createComponent(EditarSacerdoteComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.ts b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.ts new file mode 100644 index 000000000..0b025119a --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component.ts @@ -0,0 +1,270 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + + +@Component({ + selector: 'app-editarSacerdote', + templateUrl: './editarSacerdote.component.html', + styleUrls: ['./editarSacerdote.component.css'] +}) +export class EditarSacerdoteComponent implements OnInit { + + editarSacerdoteForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + constructor(private http: HttpClient, private router: Router,public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarSacerdoteForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + jornadaDialogo: [null, Validators.required], + retornoEspiritual: [null, Validators.required], + lenguajeAmor: [null, Validators.required], + guiaDeRelacion: [null, Validators.required], + sacramento: [null, Validators.required], + diosEnSacramento: [null, Validators.required], + diosEnVida: [null, Validators.required], + patronesComportamiento: [null, Validators.required], + dialogoProfundo: [null, Validators.required], + servidoresPostEncuentro: [null, Validators.required], + formacionAcompanantes: [null, Validators.required], + padreNuestro: [null, Validators.required], + transmisionNacional: [null, Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + + + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerSacerdote(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + + let fecha = new Date(data.response.fechaCreacion); + fecha.setDate(fecha.getDate() - 1); // Resta un día + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarSacerdoteForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarSacerdoteForm.controls['jornadaDialogo'].setValue(data.response.jornadaDialogo); + this.editarSacerdoteForm.controls['retornoEspiritual'].setValue(data.response.retornoEspiritual); + this.editarSacerdoteForm.controls['lenguajeAmor'].setValue(data.response.lenguajeAmor); + this.editarSacerdoteForm.controls['guiaDeRelacion'].setValue(data.response.guiaDeRelacion); + this.editarSacerdoteForm.controls['sacramento'].setValue(data.response.sacramento); + this.editarSacerdoteForm.controls['diosEnSacramento'].setValue(data.response.diosEnSacramento); + this.editarSacerdoteForm.controls['diosEnVida'].setValue(data.response.diosEnVida); + this.editarSacerdoteForm.controls['patronesComportamiento'].setValue(data.response.patronesComportamiento); + this.editarSacerdoteForm.controls['dialogoProfundo'].setValue(data.response.dialogoProfundo); + this.editarSacerdoteForm.controls['servidoresPostEncuentro'].setValue(data.response.servidoresPostEncuentro); + this.editarSacerdoteForm.controls['formacionAcompanantes'].setValue(data.response.formacionAcompanantes); + this.editarSacerdoteForm.controls['padreNuestro'].setValue(data.response.padreNuestro); + this.editarSacerdoteForm.controls['transmisionNacional'].setValue(data.response.transmisionNacional); + + + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + this.editarSacerdoteForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarSacerdoteForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarSacerdoteForm.controls['select-ciudad'].setValue(ciudad.id); + }); + }); + + } + actualizarMostrarBotonGuardar(rol: number): boolean { + const mostrarBoton = rol !== 1; + return mostrarBoton; + } + obtenerSacerdote(id: string): Observable { + const params = { id: id }; + const url = `https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + if(res){ + this.editarSacerdote(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarSacerdote() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const jornadaDialogo = (document.getElementById('jornadaDialogo')).value; + const retornoEspiritual = (document.getElementById('retornoEspiritual')).value; + const lenguajeAmor = (document.getElementById('lenguajeAmor')).value; + const guiaDeRelacion = (document.getElementById('guiaDeRelacion')).value; + const sacramento = (document.getElementById('sacramento')).value; + const diosEnSacramento = (document.getElementById('diosEnSacramento')).value; + const diosEnVida = (document.getElementById('diosEnVida')).value; + const patronesComportamiento = (document.getElementById('patronesComportamiento')).value; + const dialogoProfundo = (document.getElementById('dialogoProfundo')).value; + const servidoresPostEncuentro = (document.getElementById('servidoresPostEncuentro')).value; + const formacionAcompanantes = (document.getElementById('formacionAcompanantes')).value; + const padreNuestro = (document.getElementById('padreNuestro')).value; + const transmisionNacional = (document.getElementById('transmisionNacional')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const editSacerdote = { + id, + fechaCreacion, + jornadaDialogo, + retornoEspiritual, + lenguajeAmor, + guiaDeRelacion, + sacramento, + diosEnSacramento, + diosEnVida, + patronesComportamiento, + dialogoProfundo, + servidoresPostEncuentro, + formacionAcompanantes, + padreNuestro, + transmisionNacional, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonSacerdote = JSON.stringify(editSacerdote); // Convertir el objeto en una cadena JSON + + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/update', jsonSacerdote, this.httpOptions) + .subscribe(data => { + + this.openDialogConfirm(); + + this.router.navigate(['/sacerdotesGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarSacerdoteForm.controls['select-ciudad'].reset(); + + }); + } + + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.css b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.html b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.html new file mode 100644 index 000000000..5aff0fe57 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.html @@ -0,0 +1,159 @@ +
+
+
+
+
+
+

Crear Nuevo

+
+
+
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
diff --git a/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.spec.ts b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.spec.ts new file mode 100644 index 000000000..618651cbf --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoCuartoPilarComponent } from './nuevoCuartoPilar.component'; + +describe('NuevoPrimerPilarComponent', () => { + let component: NuevoCuartoPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoCuartoPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoCuartoPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.ts b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.ts new file mode 100644 index 000000000..33a585220 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component.ts @@ -0,0 +1,170 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + +@Component({ + selector: 'app-nuevoSacerdote', + templateUrl: './nuevoSacerdote.component.html', + styleUrls: ['./nuevoSacerdote.component.css'] +}) +export class NuevoSacerdoteComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newSacerdote(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newSacerdote() { + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const jornadaDialogo = (document.getElementById('jornadaDialogo')).value; + const retornoEspiritual = (document.getElementById('retornoEspiritual')).value; + const lenguajeAmor = (document.getElementById('lenguajeAmor')).value; + const guiaDeRelacion = (document.getElementById('guiaDeRelacion')).value; + const sacramento = (document.getElementById('sacramento')).value; + const diosEnSacramento = (document.getElementById('diosEnSacramento')).value; + const diosEnVida = (document.getElementById('diosEnVida')).value; + const patronesComportamiento = (document.getElementById('patronesComportamiento')).value; + const dialogoProfundo = (document.getElementById('dialogoProfundo')).value; + const servidoresPostEncuentro = (document.getElementById('servidoresPostEncuentro')).value; + const formacionAcompanantes = (document.getElementById('formacionAcompanantes')).value; + const padreNuestro = (document.getElementById('padreNuestro')).value; + const transmisionNacional = (document.getElementById('transmisionNacional')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + + + const sacerdote = { + fechaCreacion, + jornadaDialogo, + retornoEspiritual, + lenguajeAmor, + guiaDeRelacion, + sacramento, + diosEnSacramento, + diosEnVida, + patronesComportamiento, + dialogoProfundo, + servidoresPostEncuentro, + formacionAcompanantes, + padreNuestro, + transmisionNacional, + ciudad: { + id: ciudadSeleccionada + }, + }; + + const jsonSacerdote = JSON.stringify(sacerdote); // Convertir el objeto en una cadena JSON + console.log(jsonSacerdote); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/create', jsonSacerdote, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/sacerdotesGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } + +} diff --git a/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.css b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.css new file mode 100644 index 000000000..74d772980 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.css @@ -0,0 +1,44 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.html b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.html new file mode 100644 index 000000000..224af3512 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.html @@ -0,0 +1,87 @@ +
+
+
+
+
+
+
+
+

Formación Sacerdotes

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
FechaJornada de dialogoLenguaje de amorSacramentoPatrones de comportamientoAcciones
{{row.fechaCreacion}}{{row.jornadaDialogo}}{{row.lenguajeAmor}}{{row.sacramento}}{{row.patronesComportamiento}} + + +
+ +
+
+
+ +
+
+
diff --git a/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.spec.ts b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.spec.ts new file mode 100644 index 000000000..db2f7e8cf --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { SacerdotesGridComponent } from './sacerdotesGrid.component'; + +describe('SacerdotesGridComponent', () => { + let component: SacerdotesGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SacerdotesGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SacerdotesGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.ts b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.ts new file mode 100644 index 000000000..9baae5922 --- /dev/null +++ b/src/app/formacion/sacerdotesGrid/sacerdotesGrid.component.ts @@ -0,0 +1,287 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-sacerdotesGrid', + templateUrl: './sacerdotesGrid.component.html', + styleUrls: ['./sacerdotesGrid.component.css'] +}) + +export class SacerdotesGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + } + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + isVisible: true + + } + }); + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + } + + }); + } + + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + editRow(row) { + const elementId = row.id; + console.log(elementId); + this.router.navigate(['/editarSacerdote', elementId]); + + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/delete?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + }); + } + + + public getTableData() { + const userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + fechaCreacion: new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + } + }); + + this.data = responseData; + }); + } + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + generateExcel(){ + // Realizar la consulta y obtener los datos en un arreglo + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/formacion/sacerdote/getAll?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = [ + 'ID', + 'Fecha de Creación', + 'Jornada de Diálogo', + 'Retorno Espiritual', + 'Lenguaje del Amor', + 'Guía de Relación', + 'Sacramento', + 'Dios en el Sacramento', + 'Dios en la Vida', + 'Patrones de Comportamiento', + 'Diálogo Profundo', + 'Servidores Post Encuentro', + 'Formación de Acompañantes', + 'Padre Nuestro', + 'Transmisión Nacional' + ]; + + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.jornadaDialogo, + item.retornoEspiritual, + item.lenguajeAmor, + item.guiaDeRelacion, + item.sacramento, + item.diosEnSacramento, + item.diosEnVida, + item.patronesComportamiento, + item.dialogoProfundo, + item.servidoresPostEncuentro, + item.formacionAcompanantes, + item.padreNuestro, + item.transmisionNacional + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'Sacerdotes.xlsx'; + link.click(); + }) + } + // Función para convertir una cadena a un arreglo de bytes + s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; + } + filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + + id: item.id, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), + jornadaDialogo : item.jornadaDialogo, + lenguajeAmor: item.lenguajeAmor, + sacramento: item.sacramento, + patronesComportamiento: item.patronesComportamiento, + + }; + }); + } + } \ No newline at end of file diff --git a/src/app/formation/formation.component.css b/src/app/formation/formation.component.css new file mode 100644 index 000000000..321785fa6 --- /dev/null +++ b/src/app/formation/formation.component.css @@ -0,0 +1,39 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + + } + + .pagination .page-link { + color: #cccccc !important; + background-color: white !important; + border-color: white !important; + } + + .pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; + } \ No newline at end of file diff --git a/src/app/user/user.component.html b/src/app/formation/formation.component.html similarity index 53% rename from src/app/user/user.component.html rename to src/app/formation/formation.component.html index 8d7298d6b..afe0c4979 100644 --- a/src/app/user/user.component.html +++ b/src/app/formation/formation.component.html @@ -1,94 +1,117 @@
-
+
-

Edit Profile

+

Crear nuevo - FORMACIÓN

-
+
- - + +
- - + +
+ +
+

Experiencias de formación (# matrimonios que asistieron)

+ +
- - + +
-
- -
-
+
- - + +
-
+
- - + +
+
-
+
+
+ + +
+
+
- - + +
+
+
+ + +
+
+
-
- - + +
- - + +
- - + +
+
-
-
+
+
+ + +
+
+
- - + +
+ +
- +
-
+
diff --git a/src/app/typography/typography.component.spec.ts b/src/app/formation/formation.component.spec.ts similarity index 62% rename from src/app/typography/typography.component.spec.ts rename to src/app/formation/formation.component.spec.ts index 70aa36093..64dd9846b 100644 --- a/src/app/typography/typography.component.spec.ts +++ b/src/app/formation/formation.component.spec.ts @@ -3,21 +3,21 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; -import { TypographyComponent } from './typography.component'; +import { FormationComponent } from './formation.component'; -describe('TypographyComponent', () => { - let component: TypographyComponent; - let fixture: ComponentFixture; +describe('FormationComponent', () => { + let component: FormationComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TypographyComponent ] + declarations: [ FormationComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(TypographyComponent); + fixture = TestBed.createComponent(FormationComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/formation/formation.component.ts b/src/app/formation/formation.component.ts new file mode 100644 index 000000000..ad93c92a1 --- /dev/null +++ b/src/app/formation/formation.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-formation', + templateUrl: './formation.component.html', + styleUrls: ['./formation.component.css'] +}) +export class FormationComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/home/home.component.css b/src/app/home/home.component.css index e69de29bb..4a2850b85 100644 --- a/src/app/home/home.component.css +++ b/src/app/home/home.component.css @@ -0,0 +1,14 @@ +.contenedor-imagen { + max-width: 100%; + height: auto; + align-items: center; + align-content: center; + margin-left: 25%; + } + .contenedor-imagen img { + width: 100%; + height: auto; + align-items: center; + align-content: center; + } + diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html index 53fc2fd3a..8ddb14c24 100644 --- a/src/app/home/home.component.html +++ b/src/app/home/home.component.html @@ -1,186 +1,35 @@
-
- - -
-
- - -
-
-
-
- - -
-
+ + + +
-

Tasks

-

Backend development

+

Finalidad del sistema

+

Gestion pilares Encuentro Matrimonial Mundial

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
Sign contract for "What are conference organizers afraid of?" - - -
-
- - -
-
Lines From Great Russian Literature? Or E-mails From My Boss? - - -
-
- - -
-
Flooded: One year later, assessing what was lost and what was found when a ravaging rain swept through metro Detroit - - - -
-
- - -
-
Create 4 Invisible User Experiences you Never Knew About - - -
-
- - -
-
Read "Following makes Medium better" - - -
-
- - -
-
Unfollow 5 enemies from twitter - - -
+
-
+
diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index 9aba51e04..4ffc94360 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -3,6 +3,7 @@ import { LocationStrategy, PlatformLocation, Location } from '@angular/common'; import { LegendItem, ChartType } from '../lbd/lbd-chart/lbd-chart.component'; import * as Chartist from 'chartist'; + @Component({ selector: 'app-home', templateUrl: './home.component.html', @@ -24,9 +25,12 @@ export class HomeComponent implements OnInit { public activityChartOptions: any; public activityChartResponsive: any[]; public activityChartLegendItems: LegendItem[]; - constructor() { } - ngOnInit() { + constructor() {} + + ngOnInit() { + this.getUserLogged(); + this.emailChartType = ChartType.Pie; this.emailChartData = { labels: ['62%', '32%', '6%'], @@ -107,6 +111,9 @@ export class HomeComponent implements OnInit { ]; + } + getUserLogged() { + } } diff --git a/src/app/icons/icons.component.html b/src/app/icons/icons.component.html index 794999e32..6cc6347d1 100644 --- a/src/app/icons/icons.component.html +++ b/src/app/icons/icons.component.html @@ -4,1202 +4,20 @@
-

202 Awesome Stroke Icons

-

Handcrafted by our friends from Pixeden

+

Reportes

- +
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- +
+
-
-
- -
diff --git a/src/app/icons/icons.component.spec.ts b/src/app/icons/icons.component.spec.ts index fcd3c7fe3..4eae38663 100644 --- a/src/app/icons/icons.component.spec.ts +++ b/src/app/icons/icons.component.spec.ts @@ -3,7 +3,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; -import { IconsComponent } from './icons.component'; +import { IconsComponent } from './iconss.component'; describe('IconsComponent', () => { let component: IconsComponent; diff --git a/src/app/icons/icons.component.ts b/src/app/icons/icons.component.ts index c6a1e48ea..ab2456dda 100644 --- a/src/app/icons/icons.component.ts +++ b/src/app/icons/icons.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-icons', + selector: 'app-iconss', templateUrl: './icons.component.html', styleUrls: ['./icons.component.css'] }) diff --git a/src/app/layouts/admin-layout/admin-layout.component.html b/src/app/layouts/admin-layout/admin-layout.component.html index 51e376fda..7186188bd 100644 --- a/src/app/layouts/admin-layout/admin-layout.component.html +++ b/src/app/layouts/admin-layout/admin-layout.component.html @@ -1,16 +1,15 @@ -
- +
\ No newline at end of file diff --git a/src/app/layouts/admin-layout/admin-layout.component.scss b/src/app/layouts/admin-layout/admin-layout.component.scss index e69de29bb..5c41260d5 100644 --- a/src/app/layouts/admin-layout/admin-layout.component.scss +++ b/src/app/layouts/admin-layout/admin-layout.component.scss @@ -0,0 +1,22 @@ +.user-section { + position: absolute; + top: 10px; + right: 10px; + } + + .user-button { + background-color: white; + border: 2px solid #cd4042; + border-radius: 12px; + color: #cd4042; + /*font-size: 18px;*/ + padding: 10px 20px; + max-width: 100px; + cursor: pointer; + transition: all 0.3s ease; + } + + .user-button:hover { + background-color: #cd4042; + color: white; + } \ No newline at end of file diff --git a/src/app/layouts/admin-layout/admin-layout.component.ts b/src/app/layouts/admin-layout/admin-layout.component.ts index 34c9814e0..73134000d 100644 --- a/src/app/layouts/admin-layout/admin-layout.component.ts +++ b/src/app/layouts/admin-layout/admin-layout.component.ts @@ -21,8 +21,6 @@ export class AdminLayoutComponent implements OnInit { const isWindows = navigator.platform.indexOf('Win') > -1 ? true : false; if (isWindows) { - // if we are on windows OS we activate the perfectScrollbar function - document.getElementsByTagName('body')[0].classList.add('perfect-scrollbar-on'); } else { document.getElementsByTagName('body')[0].classList.remove('perfect-scrollbar-off'); diff --git a/src/app/layouts/admin-layout/admin-layout.module.ts b/src/app/layouts/admin-layout/admin-layout.module.ts index e7c0efa96..b032a50b1 100644 --- a/src/app/layouts/admin-layout/admin-layout.module.ts +++ b/src/app/layouts/admin-layout/admin-layout.module.ts @@ -2,21 +2,36 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - import { LbdModule } from '../../lbd/lbd.module'; import { NguiMapModule} from '@ngui/map'; - import { AdminLayoutRoutes } from './admin-layout.routing'; - import { HomeComponent } from '../../home/home.component'; -import { UserComponent } from '../../user/user.component'; -import { TablesComponent } from '../../tables/tables.component'; -import { TypographyComponent } from '../../typography/typography.component'; +import { UsuariosGridComponent } from '../../usuarios/usuariosGrid.component'; +import { PrimerPilarGridComponent } from '../../pilares/primerPilarGrid/primerPilarGrid.component'; +import { SegundoPilarGridComponent } from '../../pilares/segundoPilarGrid/segundoPilarGrid.component'; +import { TercerPilarGridComponent } from '../../pilares/tercerPilarGrid/tercerPilarGrid.component'; +import { CuartoPilarGridComponent } from '../../pilares/cuartoPilarGrid/cuartoPilarGrid.component'; +import { MatrimoniosGridComponent } from '../../formacion/matrimoniosGrid/matrimoniosGrid.component'; +import { SacerdotesGridComponent } from '../../formacion/sacerdotesGrid/sacerdotesGrid.component'; +import { FormationComponent } from '../../formation/formation.component'; import { IconsComponent } from '../../icons/icons.component'; import { MapsComponent } from '../../maps/maps.component'; import { NotificationsComponent } from '../../notifications/notifications.component'; -import { UpgradeComponent } from '../../upgrade/upgrade.component'; - +import { NuevoPrimerPilarComponent } from '../../pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component'; +import { NuevoSegundoPilarComponent } from '../../pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component'; +import { NuevoTercerPilarComponent } from '../../pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component'; +import { NuevoCuartoPilarComponent } from '../../pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component'; +import { EditarPrimerPilarComponent } from 'app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component'; +import { EditarSegundoPilarComponent } from 'app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component'; +import { EditarTercerPilarComponent } from 'app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component'; +import { EditarCuartoPilarComponent } from 'app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component'; +import { NuevoSacerdoteComponent } from 'app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component'; +import { EditarSacerdoteComponent } from 'app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component'; +import { NuevoMatrimonioComponent } from 'app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component'; +import { EditarMatrimonioComponent } from 'app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component'; +import { UsuariosComponent } from 'app/usuarios/usuariosCrear/usuarios.component'; +import { UsuariosEditarComponent } from 'app/usuarios/usuariosEditar/usuariosEditar.component'; +import { PerfilComponent } from 'app/perfil/perfil.component'; @NgModule({ imports: [ @@ -24,17 +39,38 @@ import { UpgradeComponent } from '../../upgrade/upgrade.component'; RouterModule.forChild(AdminLayoutRoutes), FormsModule, LbdModule, - NguiMapModule.forRoot({apiUrl: 'https://maps.google.com/maps/api/js?key=YOUR_KEY_HERE'}) + ReactiveFormsModule, ], declarations: [ HomeComponent, - UserComponent, - TablesComponent, - TypographyComponent, + UsuariosGridComponent, + UsuariosComponent, + PrimerPilarGridComponent, + SegundoPilarGridComponent, + TercerPilarGridComponent, + CuartoPilarGridComponent, + MatrimoniosGridComponent, + SacerdotesGridComponent, + FormationComponent, IconsComponent, MapsComponent, + NotificationsComponent, + NuevoPrimerPilarComponent, NotificationsComponent, - UpgradeComponent + NuevoPrimerPilarComponent, + NuevoSegundoPilarComponent, + NuevoTercerPilarComponent, + NuevoCuartoPilarComponent, + EditarPrimerPilarComponent, + EditarSegundoPilarComponent, + EditarTercerPilarComponent, + EditarCuartoPilarComponent, + NuevoSacerdoteComponent, + EditarSacerdoteComponent, + NuevoMatrimonioComponent, + EditarMatrimonioComponent, + UsuariosEditarComponent, + PerfilComponent ] }) diff --git a/src/app/layouts/admin-layout/admin-layout.routing.ts b/src/app/layouts/admin-layout/admin-layout.routing.ts index e09417d82..31f78f0ff 100644 --- a/src/app/layouts/admin-layout/admin-layout.routing.ts +++ b/src/app/layouts/admin-layout/admin-layout.routing.ts @@ -1,21 +1,63 @@ import { Routes } from '@angular/router'; - import { HomeComponent } from '../../home/home.component'; -import { UserComponent } from '../../user/user.component'; -import { TablesComponent } from '../../tables/tables.component'; -import { TypographyComponent } from '../../typography/typography.component'; +import { UsuariosComponent } from '../../usuarios/usuariosCrear/usuarios.component'; +import { UsuariosGridComponent } from '../../usuarios/usuariosGrid.component'; +import { PrimerPilarGridComponent } from '../../pilares/primerPilarGrid/primerPilarGrid.component'; +import { SegundoPilarGridComponent } from '../../pilares/segundoPilarGrid/segundoPilarGrid.component'; +import { TercerPilarGridComponent } from '../../pilares/tercerPilarGrid/tercerPilarGrid.component'; +import { CuartoPilarGridComponent } from '../../pilares/cuartoPilarGrid/cuartoPilarGrid.component'; +import { MatrimoniosGridComponent } from '../../formacion/matrimoniosGrid/matrimoniosGrid.component'; +import { SacerdotesGridComponent } from '../../formacion/sacerdotesGrid/sacerdotesGrid.component'; import { IconsComponent } from '../../icons/icons.component'; import { MapsComponent } from '../../maps/maps.component'; import { NotificationsComponent } from '../../notifications/notifications.component'; -import { UpgradeComponent } from '../../upgrade/upgrade.component'; +import { FormationComponent } from '../../formation/formation.component'; +import { NuevoPrimerPilarComponent } from '../../pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component'; +import { NuevoSegundoPilarComponent } from '../../pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component'; +import { NuevoTercerPilarComponent } from '../../pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component'; +import { NuevoCuartoPilarComponent } from '../../pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component'; +import { AuthGuard } from '../../auth.guard'; +import { EditarPrimerPilarComponent } from 'app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component'; +import { EditarSegundoPilarComponent } from 'app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component'; +import { EditarTercerPilarComponent } from 'app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component'; +import { EditarCuartoPilarComponent } from 'app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component'; + +import { NuevoSacerdoteComponent } from 'app/formacion/sacerdotesGrid/nuevoSacerdote/nuevoSacerdote.component'; +import { EditarSacerdoteComponent } from 'app/formacion/sacerdotesGrid/editarSacerdote/editarSacerdote.component'; +import { NuevoMatrimonioComponent } from 'app/formacion/matrimoniosGrid/nuevoMatrimonio/nuevoMatrimonio.component'; +import { EditarMatrimonioComponent } from 'app/formacion/matrimoniosGrid/editarMatrimonio/editarMatrimonio.component'; +import { UsuariosEditarComponent } from 'app/usuarios/usuariosEditar/usuariosEditar.component'; +import { PerfilComponent } from 'app/perfil/perfil.component'; + export const AdminLayoutRoutes: Routes = [ - { path: 'dashboard', component: HomeComponent }, - { path: 'user', component: UserComponent }, - { path: 'table', component: TablesComponent }, - { path: 'typography', component: TypographyComponent }, - { path: 'icons', component: IconsComponent }, - { path: 'maps', component: MapsComponent }, - { path: 'notifications', component: NotificationsComponent }, - { path: 'upgrade', component: UpgradeComponent }, + { path: 'dashboard',component: HomeComponent , canActivate: [AuthGuard]}, + { path: 'usuariosGrid',component: UsuariosGridComponent, canActivate: [AuthGuard] }, + { path: 'usuarios',component: UsuariosComponent, canActivate: [AuthGuard] }, + { path: 'usuariosEditar/:id',component: UsuariosEditarComponent,canActivate: [AuthGuard] }, + { path: 'primerPilarGrid',component: PrimerPilarGridComponent,canActivate: [AuthGuard] }, + { path: 'segundoPilarGrid',component: SegundoPilarGridComponent, canActivate: [AuthGuard] }, + { path: 'tercerPilarGrid',component: TercerPilarGridComponent, canActivate: [AuthGuard] }, + { path: 'cuartoPilarGrid',component: CuartoPilarGridComponent, canActivate: [AuthGuard] }, + { path: 'matrimoniosGrid',component: MatrimoniosGridComponent, canActivate: [AuthGuard] }, + { path: 'sacerdotesGrid',component: SacerdotesGridComponent, canActivate: [AuthGuard] }, + { path: 'icons',component: IconsComponent, canActivate: [AuthGuard] }, + { path: 'maps',component: MapsComponent, canActivate: [AuthGuard] }, + { path: 'notifications',component: NotificationsComponent, canActivate: [AuthGuard] }, + { path: 'formation',component: FormationComponent }, + { path: 'nuevoPrimerPilar',component: NuevoPrimerPilarComponent , canActivate: [AuthGuard]}, + { path: 'nuevoSegundoPilar',component: NuevoSegundoPilarComponent , canActivate: [AuthGuard]}, + { path: 'nuevoTercerPilar',component: NuevoTercerPilarComponent , canActivate: [AuthGuard]}, + { path: 'nuevoCuartoPilar',component: NuevoCuartoPilarComponent, canActivate: [AuthGuard] }, + { path: 'editarPrimerPilar/:id', component: EditarPrimerPilarComponent, canActivate: [AuthGuard]}, + { path: 'editarSegundoPilar/:id', component: EditarSegundoPilarComponent , canActivate: [AuthGuard]}, + { path: 'editarTercerPilar/:id', component: EditarTercerPilarComponent, canActivate: [AuthGuard] }, + { path: 'editarCuartoPilar/:id', component: EditarCuartoPilarComponent, canActivate: [AuthGuard] }, + { path: 'nuevoMatrimonio',component: NuevoMatrimonioComponent, canActivate: [AuthGuard] }, + { path: 'editarMatrimonio/:id',component: EditarMatrimonioComponent, canActivate: [AuthGuard] }, + { path: 'nuevoSacerdote',component: NuevoSacerdoteComponent, canActivate: [AuthGuard] }, + { path: 'editarSacerdote/:id',component: EditarSacerdoteComponent, canActivate: [AuthGuard] }, + { path: 'perfil',component: PerfilComponent, canActivate: [AuthGuard] }, + + ]; diff --git a/src/app/login/images/encuentros.jpg b/src/app/login/images/encuentros.jpg new file mode 100644 index 000000000..c5e6db381 Binary files /dev/null and b/src/app/login/images/encuentros.jpg differ diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css new file mode 100644 index 000000000..33ce8e8ca --- /dev/null +++ b/src/app/login/login.component.css @@ -0,0 +1,8360 @@ + + :root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } + +*, +*::before, +*::after { + -webkit-box-sizing: border-box; + box-sizing: border-box; } + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; } + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; } + +[tabindex="-1"]:focus { + outline: 0 !important; } + +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; } + +p { + margin-top: 0; + margin-bottom: 1rem; } + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; } + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; } + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; } + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; } + +dt { + font-weight: 700; } + +dd { + margin-bottom: .5rem; + margin-left: 0; } + +blockquote { + margin: 0 0 1rem; } + +b, +strong { + font-weight: bolder; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; } + +sub { + bottom: -.25em; } + +sup { + top: -.5em; } + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; } + a:hover { + color: #0056b3; + text-decoration: underline; } + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; } + a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; } + a:not([href]):not([tabindex]):focus { + outline: 0; } + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; } + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; } + +figure { + margin: 0 0 1rem; } + +img { + vertical-align: middle; + border-style: none; } + +svg { + overflow: hidden; + vertical-align: middle; } + +table { + border-collapse: collapse; } + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; } + +th { + text-align: inherit; } + +label { + display: inline-block; + margin-bottom: 0.5rem; } + +button { + border-radius: 0; } + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; } + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +button, +input { + overflow: visible; } + +button, +select { + text-transform: none; } + +select { + word-wrap: normal; } + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; } + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; } + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; } + +input[type="radio"], +input[type="checkbox"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; } + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; } + +textarea { + overflow: auto; + resize: vertical; } + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; } + +progress { + vertical-align: baseline; } + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; } + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; } + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; } + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; } + +output { + display: inline-block; } + +summary { + display: list-item; + cursor: pointer; } + +template { + display: none; } + +[hidden] { + display: none !important; } + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; } + +h1, .h1 { + font-size: 2.5rem; } + +h2, .h2 { + font-size: 2rem; } + +h3, .h3 { + font-size: 1.75rem; } + +h4, .h4 { + font-size: 1.5rem; } + +h5, .h5 { + font-size: 1.25rem; } + +h6, .h6 { + font-size: 1rem; } + +.lead { + font-size: 1.25rem; + font-weight: 300; } + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; } + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; } + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; } + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; } + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); } + +small, +.small { + font-size: 80%; + font-weight: 400; } + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; } + +.list-unstyled { + padding-left: 0; + list-style: none; } + +.list-inline { + padding-left: 0; + list-style: none; } + +.list-inline-item { + display: inline-block; } + .list-inline-item:not(:last-child) { + margin-right: 0.5rem; } + +.initialism { + font-size: 90%; + text-transform: uppercase; } + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; } + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; } + .blockquote-footer::before { + content: "\2014\00A0"; } + +.img-fluid { + max-width: 100%; + height: auto; } + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; } + +.figure { + display: inline-block; } + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; } + +.figure-caption { + font-size: 90%; + color: #6c757d; } + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; } + a > code { + color: inherit; } + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; } + +pre { + display: block; + font-size: 87.5%; + color: #212529; } + pre code { + font-size: inherit; + color: inherit; + word-break: normal; } + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + @media (min-width: 576px) { + .container { + max-width: 540px; } } + @media (min-width: 768px) { + .container { + max-width: 720px; } } + @media (min-width: 992px) { + .container { + max-width: 960px; } } + @media (min-width: 1200px) { + .container { + max-width: 1140px; } } + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + +.row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; } + +.no-gutters { + margin-right: 0; + margin-left: 0; } + .no-gutters > .col, + .no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; } + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; } + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + +.col-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; } + +.col-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; } + +.col-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; } + +.col-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + +.col-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; } + +.col-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; } + +.col-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + +.col-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; } + +.col-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; } + +.col-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + +.col-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; } + +.col-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; } + +.col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + +.order-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; } + +.order-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; } + +.order-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; } + +.order-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; } + +.order-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; } + +.order-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; } + +.order-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; } + +.order-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; } + +.order-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; } + +.order-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; } + +.order-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; } + +.order-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; } + +.order-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; } + +.order-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; } + +.order-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; } + +.offset-1 { + margin-left: 8.33333%; } + +.offset-2 { + margin-left: 16.66667%; } + +.offset-3 { + margin-left: 25%; } + +.offset-4 { + margin-left: 33.33333%; } + +.offset-5 { + margin-left: 41.66667%; } + +.offset-6 { + margin-left: 50%; } + +.offset-7 { + margin-left: 58.33333%; } + +.offset-8 { + margin-left: 66.66667%; } + +.offset-9 { + margin-left: 75%; } + +.offset-10 { + margin-left: 83.33333%; } + +.offset-11 { + margin-left: 91.66667%; } + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-sm-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-sm-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; } + .col-sm-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; } + .col-sm-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-sm-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; } + .col-sm-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; } + .col-sm-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-sm-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; } + .col-sm-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; } + .col-sm-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-sm-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; } + .col-sm-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; } + .col-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .order-sm-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; } + .order-sm-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; } + .order-sm-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; } + .order-sm-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; } + .order-sm-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; } + .order-sm-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; } + .order-sm-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; } + .order-sm-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; } + .order-sm-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; } + .order-sm-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; } + .order-sm-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; } + .order-sm-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; } + .order-sm-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; } + .order-sm-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; } + .order-sm-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; } + .offset-sm-0 { + margin-left: 0; } + .offset-sm-1 { + margin-left: 8.33333%; } + .offset-sm-2 { + margin-left: 16.66667%; } + .offset-sm-3 { + margin-left: 25%; } + .offset-sm-4 { + margin-left: 33.33333%; } + .offset-sm-5 { + margin-left: 41.66667%; } + .offset-sm-6 { + margin-left: 50%; } + .offset-sm-7 { + margin-left: 58.33333%; } + .offset-sm-8 { + margin-left: 66.66667%; } + .offset-sm-9 { + margin-left: 75%; } + .offset-sm-10 { + margin-left: 83.33333%; } + .offset-sm-11 { + margin-left: 91.66667%; } } + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-md-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-md-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; } + .col-md-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; } + .col-md-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-md-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; } + .col-md-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; } + .col-md-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-md-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; } + .col-md-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; } + .col-md-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-md-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; } + .col-md-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; } + .col-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .order-md-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; } + .order-md-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; } + .order-md-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; } + .order-md-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; } + .order-md-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; } + .order-md-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; } + .order-md-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; } + .order-md-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; } + .order-md-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; } + .order-md-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; } + .order-md-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; } + .order-md-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; } + .order-md-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; } + .order-md-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; } + .order-md-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; } + .offset-md-0 { + margin-left: 0; } + .offset-md-1 { + margin-left: 8.33333%; } + .offset-md-2 { + margin-left: 16.66667%; } + .offset-md-3 { + margin-left: 25%; } + .offset-md-4 { + margin-left: 33.33333%; } + .offset-md-5 { + margin-left: 41.66667%; } + .offset-md-6 { + margin-left: 50%; } + .offset-md-7 { + margin-left: 58.33333%; } + .offset-md-8 { + margin-left: 66.66667%; } + .offset-md-9 { + margin-left: 75%; } + .offset-md-10 { + margin-left: 83.33333%; } + .offset-md-11 { + margin-left: 91.66667%; } } + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-lg-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-lg-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; } + .col-lg-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; } + .col-lg-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-lg-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; } + .col-lg-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; } + .col-lg-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-lg-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; } + .col-lg-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; } + .col-lg-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-lg-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; } + .col-lg-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; } + .col-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .order-lg-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; } + .order-lg-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; } + .order-lg-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; } + .order-lg-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; } + .order-lg-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; } + .order-lg-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; } + .order-lg-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; } + .order-lg-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; } + .order-lg-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; } + .order-lg-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; } + .order-lg-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; } + .order-lg-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; } + .order-lg-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; } + .order-lg-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; } + .order-lg-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; } + .offset-lg-0 { + margin-left: 0; } + .offset-lg-1 { + margin-left: 8.33333%; } + .offset-lg-2 { + margin-left: 16.66667%; } + .offset-lg-3 { + margin-left: 25%; } + .offset-lg-4 { + margin-left: 33.33333%; } + .offset-lg-5 { + margin-left: 41.66667%; } + .offset-lg-6 { + margin-left: 50%; } + .offset-lg-7 { + margin-left: 58.33333%; } + .offset-lg-8 { + margin-left: 66.66667%; } + .offset-lg-9 { + margin-left: 75%; } + .offset-lg-10 { + margin-left: 83.33333%; } + .offset-lg-11 { + margin-left: 91.66667%; } } + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; } + .col-xl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; } + .col-xl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; } + .col-xl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; } + .col-xl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; } + .col-xl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; } + .col-xl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; } + .col-xl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; } + .col-xl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; } + .col-xl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; } + .col-xl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; } + .col-xl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; } + .col-xl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; } + .col-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; } + .order-xl-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; } + .order-xl-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; } + .order-xl-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; } + .order-xl-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; } + .order-xl-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; } + .order-xl-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; } + .order-xl-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; } + .order-xl-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; } + .order-xl-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; } + .order-xl-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; } + .order-xl-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; } + .order-xl-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; } + .order-xl-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; } + .order-xl-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; } + .order-xl-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; } + .offset-xl-0 { + margin-left: 0; } + .offset-xl-1 { + margin-left: 8.33333%; } + .offset-xl-2 { + margin-left: 16.66667%; } + .offset-xl-3 { + margin-left: 25%; } + .offset-xl-4 { + margin-left: 33.33333%; } + .offset-xl-5 { + margin-left: 41.66667%; } + .offset-xl-6 { + margin-left: 50%; } + .offset-xl-7 { + margin-left: 58.33333%; } + .offset-xl-8 { + margin-left: 66.66667%; } + .offset-xl-9 { + margin-left: 75%; } + .offset-xl-10 { + margin-left: 83.33333%; } + .offset-xl-11 { + margin-left: 91.66667%; } } + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; } + .table th, + .table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; } + .table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; } + .table tbody + tbody { + border-top: 2px solid #dee2e6; } + +.table-sm th, +.table-sm td { + padding: 0.3rem; } + +.table-bordered { + border: 1px solid #dee2e6; } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6; } + .table-bordered thead th, + .table-bordered thead td { + border-bottom-width: 2px; } + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; } + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); } + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); } + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; } + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7abaff; } + +.table-hover .table-primary:hover { + background-color: #9fcdff; } + .table-hover .table-primary:hover > td, + .table-hover .table-primary:hover > th { + background-color: #9fcdff; } + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; } + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #b3b7bb; } + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; } + .table-hover .table-secondary:hover > td, + .table-hover .table-secondary:hover > th { + background-color: #c8cbcf; } + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; } + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; } + +.table-hover .table-success:hover { + background-color: #b1dfbb; } + .table-hover .table-success:hover > td, + .table-hover .table-success:hover > th { + background-color: #b1dfbb; } + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; } + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; } + +.table-hover .table-info:hover { + background-color: #abdde5; } + .table-hover .table-info:hover > td, + .table-hover .table-info:hover > th { + background-color: #abdde5; } + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; } + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #ffdf7e; } + +.table-hover .table-warning:hover { + background-color: #ffe8a1; } + .table-hover .table-warning:hover > td, + .table-hover .table-warning:hover > th { + background-color: #ffe8a1; } + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; } + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; } + +.table-hover .table-danger:hover { + background-color: #f1b0b7; } + .table-hover .table-danger:hover > td, + .table-hover .table-danger:hover > th { + background-color: #f1b0b7; } + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; } + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; } + +.table-hover .table-light:hover { + background-color: #ececf6; } + .table-hover .table-light:hover > td, + .table-hover .table-light:hover > th { + background-color: #ececf6; } + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; } + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; } + +.table-hover .table-dark:hover { + background-color: #b9bbbe; } + .table-hover .table-dark:hover > td, + .table-hover .table-dark:hover > th { + background-color: #b9bbbe; } + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); } + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); } + .table-hover .table-active:hover > td, + .table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); } + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; } + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; } + +.table-dark { + color: #fff; + background-color: #343a40; } + .table-dark th, + .table-dark td, + .table-dark thead th { + border-color: #454d55; } + .table-dark.table-bordered { + border: 0; } + .table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); } + .table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); } + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-sm > .table-bordered { + border: 0; } } + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-md > .table-bordered { + border: 0; } } + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-lg > .table-bordered { + border: 0; } } + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive-xl > .table-bordered { + border: 0; } } + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .table-responsive > .table-bordered { + border: 0; } + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .form-control { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .form-control::-ms-expand { + background-color: transparent; + border: 0; } + .form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; } + .form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; } + .form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; } + .form-control::placeholder { + color: #6c757d; + opacity: 1; } + .form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; } + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; } + +.form-control-file, +.form-control-range { + display: block; + width: 100%; } + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; } + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; } + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; } + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; } + .form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; } + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +select.form-control[size], select.form-control[multiple] { + height: auto; } + +textarea.form-control { + height: auto; } + +.form-group { + margin-bottom: 1rem; } + +.form-text { + display: block; + margin-top: 0.25rem; } + +.form-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; } + .form-row > .col, + .form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; } + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; } + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; } + .form-check-input:disabled ~ .form-check-label { + color: #6c757d; } + +.form-check-label { + margin-bottom: 0; } + +.form-check-inline { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; } + .form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; } + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; } + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; } + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + .was-validated .form-control:valid ~ .valid-feedback, + .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, + .form-control.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + .was-validated .custom-select:valid ~ .valid-feedback, + .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, + .custom-select.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; } + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; } + .was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; } + +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; } + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; } + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; } + +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; } + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); } + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; } + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; } + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + .was-validated .form-control:invalid ~ .invalid-feedback, + .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, + .form-control.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); } + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); } + .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + .was-validated .custom-select:invalid ~ .invalid-feedback, + .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, + .custom-select.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; } + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; } + .was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #dc3545; } + +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d; } + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; } + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; } + +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; } + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); } + +.form-inline { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .form-inline .form-check { + width: 100%; } + @media (min-width: 576px) { + .form-inline label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; } + .form-inline .form-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; } + .form-inline .form-control-plaintext { + display: inline-block; } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; } + .form-inline .form-check { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; } + .form-inline .form-check-input { + position: relative; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; } + .form-inline .custom-control { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .form-inline .custom-control-label { + margin-bottom: 0; } } + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .btn { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .btn:hover { + color: #212529; + text-decoration: none; } + .btn:focus, .btn.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .btn.disabled, .btn:disabled { + opacity: 0.65; } + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; } + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; } + .btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; } + .btn-primary:focus, .btn-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); } + .btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; } + .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, + .show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; } + .btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, + .show > .btn-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); } + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; } + .btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; } + .btn-secondary:focus, .btn-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); } + .btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; } + .btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, + .show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; } + .btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, + .show > .btn-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); } + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; } + .btn-success:focus, .btn-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } + .btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, + .show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; } + .btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, + .show > .btn-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); } + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; } + .btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; } + .btn-info:focus, .btn-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } + .btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; } + .btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, + .show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; } + .btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, + .show > .btn-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); } + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; } + .btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; } + .btn-warning:focus, .btn-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); } + .btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; } + .btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, + .show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; } + .btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, + .show > .btn-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); } + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; } + .btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; } + .btn-danger:focus, .btn-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } + .btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; } + .btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, + .show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; } + .btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, + .show > .btn-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); } + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; } + .btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; } + .btn-light:focus, .btn-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } + .btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; } + .btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, + .show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; } + .btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, + .show > .btn-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); } + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; } + .btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; } + .btn-dark:focus, .btn-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } + .btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; } + .btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, + .show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; } + .btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, + .show > .btn-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); } + +.btn-outline-primary { + color: #007bff; + border-color: #007bff; } + .btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; } + .btn-outline-primary:focus, .btn-outline-primary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } + .btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; } + .btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, + .show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; } + .btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-primary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; } + .btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; } + .btn-outline-secondary:focus, .btn-outline-secondary.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } + .btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; } + .btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, + .show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; } + .btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-secondary.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } + +.btn-outline-success { + color: #28a745; + border-color: #28a745; } + .btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-outline-success:focus, .btn-outline-success.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + .btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; } + .btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, + .show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; } + .btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-success.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + +.btn-outline-info { + color: #17a2b8; + border-color: #17a2b8; } + .btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; } + .btn-outline-info:focus, .btn-outline-info.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + .btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; } + .btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, + .show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; } + .btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-info.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; } + .btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; } + .btn-outline-warning:focus, .btn-outline-warning.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } + .btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; } + .btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, + .show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; } + .btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-warning.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; } + .btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; } + .btn-outline-danger:focus, .btn-outline-danger.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + .btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; } + .btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, + .show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; } + .btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-danger.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; } + .btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; } + .btn-outline-light:focus, .btn-outline-light.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + .btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; } + .btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, + .show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; } + .btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-light.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + +.btn-outline-dark { + color: #343a40; + border-color: #343a40; } + .btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; } + .btn-outline-dark:focus, .btn-outline-dark.focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + .btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; } + .btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, + .show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; } + .btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, + .show > .btn-outline-dark.dropdown-toggle:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + +.btn-link { + font-weight: 400; + color: #007bff; + text-decoration: none; } + .btn-link:hover { + color: #0056b3; + text-decoration: underline; } + .btn-link:focus, .btn-link.focus { + text-decoration: underline; + -webkit-box-shadow: none; + box-shadow: none; } + .btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; } + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.btn-block { + display: block; + width: 100%; } + .btn-block + .btn-block { + margin-top: 0.5rem; } + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } + +.fade { + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } + @media (prefers-reduced-motion: reduce) { + .fade { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .fade:not(.show) { + opacity: 0; } + +.collapse:not(.show) { + display: none; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; } + @media (prefers-reduced-motion: reduce) { + .collapsing { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; } + +.dropdown-toggle { + white-space: nowrap; } + .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; } + .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; } + .dropdown-menu-sm-right { + right: 0; + left: auto; } } + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; } + .dropdown-menu-md-right { + right: 0; + left: auto; } } + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; } + .dropdown-menu-lg-right { + right: 0; + left: auto; } } + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; } + .dropdown-menu-xl-right { + right: 0; + left: auto; } } + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; } + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; } + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; } + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; } + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropright .dropdown-toggle::after { + vertical-align: 0; } + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; } + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; } + +.dropleft .dropdown-toggle::after { + display: none; } + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; } + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; } + +.dropleft .dropdown-toggle::before { + vertical-align: 0; } + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; } + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; } + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; } + .dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; } + .dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; } + .dropdown-item.disabled, .dropdown-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: transparent; } + +.dropdown-menu.show { + display: block; } + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; } + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; } + +.btn-group, +.btn-group-vertical { + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; } + .btn-group > .btn, + .btn-group-vertical > .btn { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + .btn-group > .btn:hover, + .btn-group-vertical > .btn:hover { + z-index: 1; } + .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 1; } + +.btn-toolbar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .btn-toolbar .input-group { + width: auto; } + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; } + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; } + .dropdown-toggle-split::after, + .dropup .dropdown-toggle-split::after, + .dropright .dropdown-toggle-split::after { + margin-left: 0; } + .dropleft .dropdown-toggle-split::before { + margin-right: 0; } + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; } + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; } + +.btn-group-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .btn-group-vertical > .btn, + .btn-group-vertical > .btn-group { + width: 100%; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; } + .btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), + .btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .btn-group-vertical > .btn:not(:first-child), + .btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; } + .btn-group-toggle > .btn input[type="radio"], + .btn-group-toggle > .btn input[type="checkbox"], + .btn-group-toggle > .btn-group > .btn input[type="radio"], + .btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; } + .input-group > .form-control, + .input-group > .form-control-plaintext, + .input-group > .custom-select, + .input-group > .custom-file { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; } + .input-group > .form-control + .form-control, + .input-group > .form-control + .custom-select, + .input-group > .form-control + .custom-file, + .input-group > .form-control-plaintext + .form-control, + .input-group > .form-control-plaintext + .custom-select, + .input-group > .form-control-plaintext + .custom-file, + .input-group > .custom-select + .form-control, + .input-group > .custom-select + .custom-select, + .input-group > .custom-select + .custom-file, + .input-group > .custom-file + .form-control, + .input-group > .custom-file + .custom-select, + .input-group > .custom-file + .custom-file { + margin-left: -1px; } + .input-group > .form-control:focus, + .input-group > .custom-select:focus, + .input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; } + .input-group > .custom-file .custom-file-input:focus { + z-index: 4; } + .input-group > .form-control:not(:last-child), + .input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group > .form-control:not(:first-child), + .input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .input-group > .custom-file { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .input-group > .custom-file:not(:last-child) .custom-file-label, + .input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.input-group-prepend, +.input-group-append { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .input-group-prepend .btn, + .input-group-append .btn { + position: relative; + z-index: 2; } + .input-group-prepend .btn:focus, + .input-group-append .btn:focus { + z-index: 3; } + .input-group-prepend .btn + .btn, + .input-group-prepend .btn + .input-group-text, + .input-group-prepend .input-group-text + .input-group-text, + .input-group-prepend .input-group-text + .btn, + .input-group-append .btn + .btn, + .input-group-append .btn + .input-group-text, + .input-group-append .input-group-text + .input-group-text, + .input-group-append .input-group-text + .btn { + margin-left: -1px; } + +.input-group-prepend { + margin-right: -1px; } + +.input-group-append { + margin-left: -1px; } + +.input-group-text { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; } + .input-group-text input[type="radio"], + .input-group-text input[type="checkbox"] { + margin-top: 0; } + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); } + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; } + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); } + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; } + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; } + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; } + +.custom-control-inline { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; } + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; } + .custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; } + .custom-control-input:focus ~ .custom-control-label::before { + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #80bdff; } + .custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff; } + .custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; } + .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; } + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; } + .custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; } + .custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; } + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; } + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); } + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #007bff; + background-color: #007bff; } + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); } + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); } + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); } + +.custom-radio .custom-control-label::before { + border-radius: 50%; } + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); } + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); } + +.custom-switch { + padding-left: 2.25rem; } + .custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; } + .custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(0.75rem); + -ms-transform: translateX(0.75rem); + transform: translateX(0.75rem); } + .custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); } + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + .custom-select:focus { + border-color: #80bdff; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; } + .custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; } + .custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; } + .custom-select::-ms-expand { + display: none; } + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; } + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; } + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; } + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; } + .custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; } + .custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; } + .custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); } + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; } + .custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; } + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + .custom-range:focus { + outline: none; } + .custom-range:focus::-webkit-slider-thumb { + -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + .custom-range::-moz-focus-outer { + border: 0; } + .custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff; } + .custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; } + .custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .custom-range::-moz-range-thumb:active { + background-color: #b3d7ff; } + .custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; } + .custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + appearance: none; } + @media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .custom-range::-ms-thumb:active { + background-color: #b3d7ff; } + .custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; } + .custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; } + .custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; } + .custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; } + .custom-range:disabled::-moz-range-track { + cursor: default; } + .custom-range:disabled::-ms-thumb { + background-color: #adb5bd; } + +.custom-control-label::before, +.custom-file-label, +.custom-select { + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +.nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + +.nav-link { + display: block; + padding: 0.5rem 1rem; } + .nav-link:hover, .nav-link:focus { + text-decoration: none; } + .nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; } + +.nav-tabs { + border-bottom: 1px solid #dee2e6; } + .nav-tabs .nav-item { + margin-bottom: -1px; } + .nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; } + .nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; } + .nav-tabs .nav-link.active, + .nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; } + .nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.nav-pills .nav-link { + border-radius: 0.25rem; } + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; } + +.nav-fill .nav-item { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; } + +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; } + +.tab-content > .tab-pane { + display: none; } + +.tab-content > .active { + display: block; } + +.navbar { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; } + .navbar > .container, + .navbar > .container-fluid { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + +.navbar-nav { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; } + .navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; } + .navbar-nav .dropdown-menu { + position: static; + float: none; } + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; } + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; } + .navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; } + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; } + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 576px) { + .navbar-expand-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .navbar-expand-sm .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .navbar-expand-sm .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + .navbar-expand-sm .navbar-toggler { + display: none; } } + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 768px) { + .navbar-expand-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .navbar-expand-md .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .navbar-expand-md .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + .navbar-expand-md .navbar-toggler { + display: none; } } + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 992px) { + .navbar-expand-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .navbar-expand-lg .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .navbar-expand-lg .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + .navbar-expand-lg .navbar-toggler { + display: none; } } + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; } } + +@media (min-width: 1200px) { + .navbar-expand-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .navbar-expand-xl .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .navbar-expand-xl .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + .navbar-expand-xl .navbar-toggler { + display: none; } } + +.navbar-expand { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + .navbar-expand > .container, + .navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; } + .navbar-expand .navbar-nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .navbar-expand .navbar-nav .dropdown-menu { + position: absolute; } + .navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; } + .navbar-expand > .container, + .navbar-expand > .container-fluid { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; } + .navbar-expand .navbar-collapse { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; } + .navbar-expand .navbar-toggler { + display: none; } + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); } + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); } + .navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); } + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); } + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); } + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); } + .navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); } + .navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); } + +.navbar-dark .navbar-brand { + color: #fff; } + .navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; } + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); } + .navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); } + .navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); } + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; } + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); } + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); } + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); } + .navbar-dark .navbar-text a { + color: #fff; } + .navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; } + +.card { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; } + .card > hr { + margin-right: 0; + margin-left: 0; } + .card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + +.card-body { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1.25rem; } + +.card-title { + margin-bottom: 0.75rem; } + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; } + +.card-text:last-child { + margin-bottom: 0; } + +.card-link:hover { + text-decoration: none; } + +.card-link + .card-link { + margin-left: 1.25rem; } + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); } + .card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; } + .card-header + .list-group .list-group-item:first-child { + border-top: 0; } + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); } + .card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); } + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; } + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; } + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; } + +.card-img { + width: 100%; + border-radius: calc(0.25rem - 1px); } + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); } + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); } + +.card-deck { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + .card-deck .card { + margin-bottom: 15px; } + @media (min-width: 576px) { + .card-deck { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; } + .card-deck .card { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; } } + +.card-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + .card-group > .card { + margin-bottom: 15px; } + @media (min-width: 576px) { + .card-group { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; } + .card-group > .card { + -webkit-box-flex: 1; + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; } } + +.card-columns .card { + margin-bottom: 0.75rem; } + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; } + .card-columns .card { + display: inline-block; + width: 100%; } } + +.accordion > .card { + overflow: hidden; } + .accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; } + .accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; } + .accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + .accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .accordion > .card .card-header { + margin-bottom: -1px; } + +.breadcrumb { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; } + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; } + .breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; } + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; } + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; } + +.breadcrumb-item.active { + color: #6c757d; } + +.pagination { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; } + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; } + .page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; } + .page-link:focus { + z-index: 2; + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; } + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff; } + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; } + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; } + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; } + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; } + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; } + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; } + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; + -o-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .badge { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + a.badge:hover, a.badge:focus { + text-decoration: none; } + .badge:empty { + display: none; } + +.btn .badge { + position: relative; + top: -1px; } + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; } + +.badge-primary { + color: #fff; + background-color: #007bff; } + a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0062cc; } + a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); } + +.badge-secondary { + color: #fff; + background-color: #6c757d; } + a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #545b62; } + a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); } + +.badge-success { + color: #fff; + background-color: #28a745; } + a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; } + a.badge-success:focus, a.badge-success.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); } + +.badge-info { + color: #fff; + background-color: #17a2b8; } + a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #117a8b; } + a.badge-info:focus, a.badge-info.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); } + +.badge-warning { + color: #212529; + background-color: #ffc107; } + a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #d39e00; } + a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); } + +.badge-danger { + color: #fff; + background-color: #dc3545; } + a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #bd2130; } + a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); } + +.badge-light { + color: #212529; + background-color: #f8f9fa; } + a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dae0e5; } + a.badge-light:focus, a.badge-light.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); } + +.badge-dark { + color: #fff; + background-color: #343a40; } + a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #1d2124; } + a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); } + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; } + @media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; } } + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; } + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; } + +.alert-heading { + color: inherit; } + +.alert-link { + font-weight: 700; } + +.alert-dismissible { + padding-right: 4rem; } + .alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; } + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; } + .alert-primary hr { + border-top-color: #9fcdff; } + .alert-primary .alert-link { + color: #002752; } + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; } + .alert-secondary hr { + border-top-color: #c8cbcf; } + .alert-secondary .alert-link { + color: #202326; } + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; } + .alert-success hr { + border-top-color: #b1dfbb; } + .alert-success .alert-link { + color: #0b2e13; } + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; } + .alert-info hr { + border-top-color: #abdde5; } + .alert-info .alert-link { + color: #062c33; } + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; } + .alert-warning hr { + border-top-color: #ffe8a1; } + .alert-warning .alert-link { + color: #533f03; } + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; } + .alert-danger hr { + border-top-color: #f1b0b7; } + .alert-danger .alert-link { + color: #491217; } + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; } + .alert-light hr { + border-top-color: #ececf6; } + .alert-light .alert-link { + color: #686868; } + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; } + .alert-dark hr { + border-top-color: #b9bbbe; } + .alert-dark .alert-link { + color: #040505; } + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; } + to { + background-position: 0 0; } } + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; } + to { + background-position: 0 0; } } + +.progress { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; } + +.progress-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + -webkit-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .progress-bar { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; } + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; } + @media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; } } + +.media { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; } + +.media-body { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; } + +.list-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; } + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; } + .list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; } + .list-group-item-action:active { + color: #212529; + background-color: #e9ecef; } + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); } + .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; } + .list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; } + .list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; } + +.list-group-horizontal { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 768px) { + .list-group-horizontal-md { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0; } } + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; } + .list-group-flush .list-group-item:last-child { + margin-bottom: -1px; } + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; } + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; } + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; } + .list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; } + .list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; } + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; } + .list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; } + .list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; } + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; } + .list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; } + .list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; } + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; } + .list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; } + .list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; } + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; } + .list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; } + .list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; } + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; } + .list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; } + .list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; } + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; } + .list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; } + .list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; } + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; } + .list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; } + .list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; } + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; } + .close:hover { + color: #000; + text-decoration: none; } + .close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; } + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; } + +a.close.disabled { + pointer-events: none; } + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; } + .toast:not(:last-child) { + margin-bottom: 0.75rem; } + .toast.showing { + opacity: 1; } + .toast.show { + display: block; + opacity: 1; } + .toast.hide { + display: none; } + +.toast-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); } + +.toast-body { + padding: 0.75rem; } + +.modal-open { + overflow: hidden; } + .modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; } + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; } + .modal.fade .modal-dialog { + -webkit-transition: -webkit-transform 0.3s ease-out; + transition: -webkit-transform 0.3s ease-out; + -o-transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + -ms-transform: translate(0, -50px); + transform: translate(0, -50px); } + @media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .modal.show .modal-dialog { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + +.modal-dialog-scrollable { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + max-height: calc(100% - 1rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; } + .modal-dialog-scrollable .modal-header, + .modal-dialog-scrollable .modal-footer { + -ms-flex-negative: 0; + flex-shrink: 0; } + .modal-dialog-scrollable .modal-body { + overflow-y: auto; } + +.modal-dialog-centered { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); } + .modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; } + .modal-dialog-centered.modal-dialog-scrollable { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 100%; } + .modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; } + .modal-dialog-centered.modal-dialog-scrollable::before { + content: none; } + +.modal-content { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; } + .modal-backdrop.fade { + opacity: 0; } + .modal-backdrop.show { + opacity: 0.5; } + +.modal-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; } + .modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; } + +.modal-title { + margin-bottom: 0; + line-height: 1.5; } + +.modal-body { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; } + +.modal-footer { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; } + .modal-footer > :not(:first-child) { + margin-left: .25rem; } + .modal-footer > :not(:last-child) { + margin-right: .25rem; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); } + .modal-sm { + max-width: 300px; } } + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; } } + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; } } + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; } + .tooltip.show { + opacity: 0.9; } + .tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; } + .tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; } + .bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; } + .bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; } + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; } + .bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; } + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; } + .bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; } + .bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; } + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; } + .bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; } + .bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; } + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; } + .popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; } + .popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; } + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; } + .bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc((0.5rem + 1px) * -1); } + .bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); } + .bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; } + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; } + .bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); } + .bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; } + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; } + .bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc((0.5rem + 1px) * -1); } + .bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; } + .bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; } + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; } + .bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; } + .bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); } + .bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; } + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); } + .popover-header:empty { + display: none; } + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; } + +.carousel { + position: relative; } + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + .carousel-inner::after { + display: block; + clear: both; + content: ""; } + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform 0.6s ease-in-out; + transition: -webkit-transform 0.6s ease-in-out; + -o-transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; } + @media (prefers-reduced-motion: reduce) { + .carousel-item { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; } + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); } + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); } + +.carousel-fade .carousel-item { + opacity: 0; + -webkit-transition-property: opacity; + -o-transition-property: opacity; + transition-property: opacity; + -webkit-transform: none; + -ms-transform: none; + transform: none; } + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; } + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + -webkit-transition: 0s 0.6s opacity; + -o-transition: 0s 0.6s opacity; + transition: 0s 0.6s opacity; } + @media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + -webkit-transition: opacity 0.15s ease; + -o-transition: opacity 0.15s ease; + transition: opacity 0.15s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .carousel-control-prev:hover, .carousel-control-prev:focus, + .carousel-control-next:hover, + .carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; } + +.carousel-control-prev { + left: 0; } + +.carousel-control-next { + right: 0; } + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; } + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); } + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); } + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; } + .carousel-indicators li { + -webkit-box-sizing: content-box; + box-sizing: content-box; + -webkit-box-flex: 0; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + -webkit-transition: opacity 0.6s ease; + -o-transition: opacity 0.6s ease; + transition: opacity 0.6s ease; } + @media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + .carousel-indicators .active { + opacity: 1; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; } + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; } + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; } + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); } + 50% { + opacity: 1; } } + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); } + 50% { + opacity: 1; } } + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite; } + +.spinner-grow-sm { + width: 1rem; + height: 1rem; } + +.align-baseline { + vertical-align: baseline !important; } + +.align-top { + vertical-align: top !important; } + +.align-middle { + vertical-align: middle !important; } + +.align-bottom { + vertical-align: bottom !important; } + +.align-text-bottom { + vertical-align: text-bottom !important; } + +.align-text-top { + vertical-align: text-top !important; } + +.bg-primary { + background-color: #007bff !important; } + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; } + +.bg-secondary { + background-color: #6c757d !important; } + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; } + +.bg-success { + background-color: #28a745 !important; } + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; } + +.bg-info { + background-color: #17a2b8 !important; } + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; } + +.bg-warning { + background-color: #ffc107 !important; } + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; } + +.bg-danger { + background-color: #dc3545 !important; } + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; } + +.bg-light { + background-color: #f8f9fa !important; } + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; } + +.bg-dark { + background-color: #343a40 !important; } + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !important; } + +.bg-white { + background-color: #fff !important; } + +.bg-transparent { + background-color: transparent !important; } + +.border { + border: 1px solid #dee2e6 !important; } + +.border-top { + border-top: 1px solid #dee2e6 !important; } + +.border-right { + border-right: 1px solid #dee2e6 !important; } + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; } + +.border-left { + border-left: 1px solid #dee2e6 !important; } + +.border-0 { + border: 0 !important; } + +.border-top-0 { + border-top: 0 !important; } + +.border-right-0 { + border-right: 0 !important; } + +.border-bottom-0 { + border-bottom: 0 !important; } + +.border-left-0 { + border-left: 0 !important; } + +.border-primary { + border-color: #007bff !important; } + +.border-secondary { + border-color: #6c757d !important; } + +.border-success { + border-color: #28a745 !important; } + +.border-info { + border-color: #17a2b8 !important; } + +.border-warning { + border-color: #ffc107 !important; } + +.border-danger { + border-color: #dc3545 !important; } + +.border-light { + border-color: #f8f9fa !important; } + +.border-dark { + border-color: #343a40 !important; } + +.border-white { + border-color: #fff !important; } + +.rounded-sm { + border-radius: 0.2rem !important; } + +.rounded { + border-radius: 0.25rem !important; } + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; } + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; } + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-lg { + border-radius: 0.3rem !important; } + +.rounded-circle { + border-radius: 50% !important; } + +.rounded-pill { + border-radius: 50rem !important; } + +.rounded-0 { + border-radius: 0 !important; } + +.clearfix::after { + display: block; + clear: both; + content: ""; } + +.d-none { + display: none !important; } + +.d-inline { + display: inline !important; } + +.d-inline-block { + display: inline-block !important; } + +.d-block { + display: block !important; } + +.d-table { + display: table !important; } + +.d-table-row { + display: table-row !important; } + +.d-table-cell { + display: table-cell !important; } + +.d-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + +.d-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; } + .d-sm-inline { + display: inline !important; } + .d-sm-inline-block { + display: inline-block !important; } + .d-sm-block { + display: block !important; } + .d-sm-table { + display: table !important; } + .d-sm-table-row { + display: table-row !important; } + .d-sm-table-cell { + display: table-cell !important; } + .d-sm-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + .d-sm-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } } + +@media (min-width: 768px) { + .d-md-none { + display: none !important; } + .d-md-inline { + display: inline !important; } + .d-md-inline-block { + display: inline-block !important; } + .d-md-block { + display: block !important; } + .d-md-table { + display: table !important; } + .d-md-table-row { + display: table-row !important; } + .d-md-table-cell { + display: table-cell !important; } + .d-md-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + .d-md-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } } + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; } + .d-lg-inline { + display: inline !important; } + .d-lg-inline-block { + display: inline-block !important; } + .d-lg-block { + display: block !important; } + .d-lg-table { + display: table !important; } + .d-lg-table-row { + display: table-row !important; } + .d-lg-table-cell { + display: table-cell !important; } + .d-lg-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + .d-lg-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } } + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; } + .d-xl-inline { + display: inline !important; } + .d-xl-inline-block { + display: inline-block !important; } + .d-xl-block { + display: block !important; } + .d-xl-table { + display: table !important; } + .d-xl-table-row { + display: table-row !important; } + .d-xl-table-cell { + display: table-cell !important; } + .d-xl-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + .d-xl-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } } + +@media print { + .d-print-none { + display: none !important; } + .d-print-inline { + display: inline !important; } + .d-print-inline-block { + display: inline-block !important; } + .d-print-block { + display: block !important; } + .d-print-table { + display: table !important; } + .d-print-table-row { + display: table-row !important; } + .d-print-table-cell { + display: table-cell !important; } + .d-print-flex { + display: -webkit-box !important; + display: -ms-flexbox !important; + display: flex !important; } + .d-print-inline-flex { + display: -webkit-inline-box !important; + display: -ms-inline-flexbox !important; + display: inline-flex !important; } } + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; } + .embed-responsive::before { + display: block; + content: ""; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-21by9::before { + padding-top: 42.85714%; } + +.embed-responsive-16by9::before { + padding-top: 56.25%; } + +.embed-responsive-4by3::before { + padding-top: 75%; } + +.embed-responsive-1by1::before { + padding-top: 100%; } + +.flex-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; } + +.flex-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; } + +.flex-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + +.flex-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + +.flex-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + +.flex-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + +.flex-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + +.justify-content-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + +.justify-content-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + +.justify-content-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; } + +.justify-content-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + +.align-items-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; } + +.align-items-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; } + +.align-items-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; } + +.align-items-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; } + +.align-items-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; } + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + +.align-self-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + +.align-self-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } + +@media (min-width: 576px) { + .flex-sm-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; } + .flex-sm-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; } + .flex-sm-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .flex-sm-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .flex-sm-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .flex-sm-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .flex-sm-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .justify-content-sm-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .justify-content-sm-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .justify-content-sm-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; } + .justify-content-sm-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .align-items-sm-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; } + .align-items-sm-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; } + .align-items-sm-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; } + .align-items-sm-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .align-items-sm-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .align-self-sm-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 768px) { + .flex-md-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; } + .flex-md-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; } + .flex-md-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .flex-md-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .flex-md-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .flex-md-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .flex-md-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .justify-content-md-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .justify-content-md-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .justify-content-md-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; } + .justify-content-md-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .align-items-md-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; } + .align-items-md-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; } + .align-items-md-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; } + .align-items-md-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .align-items-md-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .align-self-md-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 992px) { + .flex-lg-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; } + .flex-lg-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; } + .flex-lg-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .flex-lg-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .flex-lg-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .flex-lg-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .flex-lg-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .justify-content-lg-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .justify-content-lg-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .justify-content-lg-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; } + .justify-content-lg-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .align-items-lg-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; } + .align-items-lg-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; } + .align-items-lg-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; } + .align-items-lg-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .align-items-lg-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .align-self-lg-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +@media (min-width: 1200px) { + .flex-xl-row { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: row !important; + flex-direction: row !important; } + .flex-xl-column { + -webkit-box-orient: vertical !important; + -webkit-box-direction: normal !important; + -ms-flex-direction: column !important; + flex-direction: column !important; } + .flex-xl-row-reverse { + -webkit-box-orient: horizontal !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; } + .flex-xl-column-reverse { + -webkit-box-orient: vertical !important; + -webkit-box-direction: reverse !important; + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; } + .flex-xl-fill { + -webkit-box-flex: 1 !important; + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; } + .flex-xl-grow-0 { + -webkit-box-flex: 0 !important; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; } + .flex-xl-grow-1 { + -webkit-box-flex: 1 !important; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; } + .justify-content-xl-start { + -webkit-box-pack: start !important; + -ms-flex-pack: start !important; + justify-content: flex-start !important; } + .justify-content-xl-end { + -webkit-box-pack: end !important; + -ms-flex-pack: end !important; + justify-content: flex-end !important; } + .justify-content-xl-center { + -webkit-box-pack: center !important; + -ms-flex-pack: center !important; + justify-content: center !important; } + .justify-content-xl-between { + -webkit-box-pack: justify !important; + -ms-flex-pack: justify !important; + justify-content: space-between !important; } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; } + .align-items-xl-start { + -webkit-box-align: start !important; + -ms-flex-align: start !important; + align-items: flex-start !important; } + .align-items-xl-end { + -webkit-box-align: end !important; + -ms-flex-align: end !important; + align-items: flex-end !important; } + .align-items-xl-center { + -webkit-box-align: center !important; + -ms-flex-align: center !important; + align-items: center !important; } + .align-items-xl-baseline { + -webkit-box-align: baseline !important; + -ms-flex-align: baseline !important; + align-items: baseline !important; } + .align-items-xl-stretch { + -webkit-box-align: stretch !important; + -ms-flex-align: stretch !important; + align-items: stretch !important; } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; } + .align-self-xl-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; } } + +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-none { + float: none !important; } + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; } + .float-sm-right { + float: right !important; } + .float-sm-none { + float: none !important; } } + +@media (min-width: 768px) { + .float-md-left { + float: left !important; } + .float-md-right { + float: right !important; } + .float-md-none { + float: none !important; } } + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; } + .float-lg-right { + float: right !important; } + .float-lg-none { + float: none !important; } } + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; } + .float-xl-right { + float: right !important; } + .float-xl-none { + float: none !important; } } + +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + +.position-static { + position: static !important; } + +.position-relative { + position: relative !important; } + +.position-absolute { + position: absolute !important; } + +.position-fixed { + position: fixed !important; } + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; } + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; } + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; } + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; } } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; } + +.shadow-sm { + -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } + +.shadow { + -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } + +.shadow-lg { + -webkit-box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; } + +.shadow-none { + -webkit-box-shadow: none !important; + box-shadow: none !important; } + +.w-25 { + width: 25% !important; } + +.w-50 { + width: 50% !important; } + +.w-75 { + width: 75% !important; } + +.w-100 { + width: 100% !important; } + +.w-auto { + width: auto !important; } + +.h-25 { + height: 25% !important; } + +.h-50 { + height: 50% !important; } + +.h-75 { + height: 75% !important; } + +.h-100 { + height: 100% !important; } + +.h-auto { + height: auto !important; } + +.mw-100 { + max-width: 100% !important; } + +.mh-100 { + max-height: 100% !important; } + +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); } + +.m-0 { + margin: 0 !important; } + +.mt-0, +.my-0 { + margin-top: 0 !important; } + +.mr-0, +.mx-0 { + margin-right: 0 !important; } + +.mb-0, +.my-0 { + margin-bottom: 0 !important; } + +.ml-0, +.mx-0 { + margin-left: 0 !important; } + +.m-1 { + margin: 0.25rem !important; } + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; } + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; } + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; } + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; } + +.m-2 { + margin: 0.5rem !important; } + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; } + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; } + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; } + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; } + +.m-3 { + margin: 1rem !important; } + +.mt-3, +.my-3 { + margin-top: 1rem !important; } + +.mr-3, +.mx-3 { + margin-right: 1rem !important; } + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; } + +.ml-3, +.mx-3 { + margin-left: 1rem !important; } + +.m-4 { + margin: 1.5rem !important; } + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; } + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; } + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; } + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; } + +.m-5 { + margin: 3rem !important; } + +.mt-5, +.my-5 { + margin-top: 3rem !important; } + +.mr-5, +.mx-5 { + margin-right: 3rem !important; } + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; } + +.ml-5, +.mx-5 { + margin-left: 3rem !important; } + +.p-0 { + padding: 0 !important; } + +.pt-0, +.py-0 { + padding-top: 0 !important; } + +.pr-0, +.px-0 { + padding-right: 0 !important; } + +.pb-0, +.py-0 { + padding-bottom: 0 !important; } + +.pl-0, +.px-0 { + padding-left: 0 !important; } + +.p-1 { + padding: 0.25rem !important; } + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; } + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; } + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; } + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; } + +.p-2 { + padding: 0.5rem !important; } + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; } + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; } + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; } + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; } + +.p-3 { + padding: 1rem !important; } + +.pt-3, +.py-3 { + padding-top: 1rem !important; } + +.pr-3, +.px-3 { + padding-right: 1rem !important; } + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; } + +.pl-3, +.px-3 { + padding-left: 1rem !important; } + +.p-4 { + padding: 1.5rem !important; } + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; } + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; } + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; } + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; } + +.p-5 { + padding: 3rem !important; } + +.pt-5, +.py-5 { + padding-top: 3rem !important; } + +.pr-5, +.px-5 { + padding-right: 3rem !important; } + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; } + +.pl-5, +.px-5 { + padding-left: 3rem !important; } + +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + +.m-auto { + margin: auto !important; } + +.mt-auto, +.my-auto { + margin-top: auto !important; } + +.mr-auto, +.mx-auto { + margin-right: auto !important; } + +.mb-auto, +.my-auto { + margin-bottom: auto !important; } + +.ml-auto, +.mx-auto { + margin-left: auto !important; } + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; } + .m-sm-1 { + margin: 0.25rem !important; } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; } + .m-sm-2 { + margin: 0.5rem !important; } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; } + .m-sm-3 { + margin: 1rem !important; } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; } + .m-sm-4 { + margin: 1.5rem !important; } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; } + .m-sm-5 { + margin: 3rem !important; } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; } + .p-sm-0 { + padding: 0 !important; } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; } + .p-sm-1 { + padding: 0.25rem !important; } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; } + .p-sm-2 { + padding: 0.5rem !important; } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; } + .p-sm-3 { + padding: 1rem !important; } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; } + .p-sm-4 { + padding: 1.5rem !important; } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; } + .p-sm-5 { + padding: 3rem !important; } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; } + .m-sm-n1 { + margin: -0.25rem !important; } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + .m-sm-n2 { + margin: -0.5rem !important; } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + .m-sm-n3 { + margin: -1rem !important; } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + .m-sm-n4 { + margin: -1.5rem !important; } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + .m-sm-n5 { + margin: -3rem !important; } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } + .m-sm-auto { + margin: auto !important; } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; } } + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; } + .m-md-1 { + margin: 0.25rem !important; } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; } + .m-md-2 { + margin: 0.5rem !important; } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; } + .m-md-3 { + margin: 1rem !important; } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; } + .m-md-4 { + margin: 1.5rem !important; } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; } + .m-md-5 { + margin: 3rem !important; } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; } + .p-md-0 { + padding: 0 !important; } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; } + .p-md-1 { + padding: 0.25rem !important; } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; } + .p-md-2 { + padding: 0.5rem !important; } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; } + .p-md-3 { + padding: 1rem !important; } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; } + .p-md-4 { + padding: 1.5rem !important; } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; } + .p-md-5 { + padding: 3rem !important; } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; } + .m-md-n1 { + margin: -0.25rem !important; } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + .m-md-n2 { + margin: -0.5rem !important; } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + .m-md-n3 { + margin: -1rem !important; } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + .m-md-n4 { + margin: -1.5rem !important; } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + .m-md-n5 { + margin: -3rem !important; } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } + .m-md-auto { + margin: auto !important; } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; } } + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; } + .m-lg-1 { + margin: 0.25rem !important; } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; } + .m-lg-2 { + margin: 0.5rem !important; } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; } + .m-lg-3 { + margin: 1rem !important; } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; } + .m-lg-4 { + margin: 1.5rem !important; } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; } + .m-lg-5 { + margin: 3rem !important; } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; } + .p-lg-0 { + padding: 0 !important; } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; } + .p-lg-1 { + padding: 0.25rem !important; } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; } + .p-lg-2 { + padding: 0.5rem !important; } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; } + .p-lg-3 { + padding: 1rem !important; } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; } + .p-lg-4 { + padding: 1.5rem !important; } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; } + .p-lg-5 { + padding: 3rem !important; } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; } + .m-lg-n1 { + margin: -0.25rem !important; } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + .m-lg-n2 { + margin: -0.5rem !important; } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + .m-lg-n3 { + margin: -1rem !important; } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + .m-lg-n4 { + margin: -1.5rem !important; } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + .m-lg-n5 { + margin: -3rem !important; } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } + .m-lg-auto { + margin: auto !important; } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; } } + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; } + .m-xl-1 { + margin: 0.25rem !important; } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; } + .m-xl-2 { + margin: 0.5rem !important; } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; } + .m-xl-3 { + margin: 1rem !important; } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; } + .m-xl-4 { + margin: 1.5rem !important; } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; } + .m-xl-5 { + margin: 3rem !important; } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; } + .p-xl-0 { + padding: 0 !important; } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; } + .p-xl-1 { + padding: 0.25rem !important; } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; } + .p-xl-2 { + padding: 0.5rem !important; } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; } + .p-xl-3 { + padding: 1rem !important; } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; } + .p-xl-4 { + padding: 1.5rem !important; } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; } + .p-xl-5 { + padding: 3rem !important; } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; } + .m-xl-n1 { + margin: -0.25rem !important; } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + .m-xl-n2 { + margin: -0.5rem !important; } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + .m-xl-n3 { + margin: -1rem !important; } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + .m-xl-n4 { + margin: -1.5rem !important; } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + .m-xl-n5 { + margin: -3rem !important; } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } + .m-xl-auto { + margin: auto !important; } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; } } + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } + +.text-justify { + text-align: justify !important; } + +.text-wrap { + white-space: normal !important; } + +.text-nowrap { + white-space: nowrap !important; } + +.text-truncate { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; } + +.text-left { + text-align: left !important; } + +.text-right { + text-align: right !important; } + +.text-center { + text-align: center !important; } + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; } + .text-sm-right { + text-align: right !important; } + .text-sm-center { + text-align: center !important; } } + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; } + .text-md-right { + text-align: right !important; } + .text-md-center { + text-align: center !important; } } + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; } + .text-lg-right { + text-align: right !important; } + .text-lg-center { + text-align: center !important; } } + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; } + .text-xl-right { + text-align: right !important; } + .text-xl-center { + text-align: center !important; } } + +.text-lowercase { + text-transform: lowercase !important; } + +.text-uppercase { + text-transform: uppercase !important; } + +.text-capitalize { + text-transform: capitalize !important; } + +.font-weight-light { + font-weight: 300 !important; } + +.font-weight-lighter { + font-weight: lighter !important; } + +.font-weight-normal { + font-weight: 400 !important; } + +.font-weight-bold { + font-weight: 700 !important; } + +.font-weight-bolder { + font-weight: bolder !important; } + +.font-italic { + font-style: italic !important; } + +.text-white { + color: #fff !important; } + +.text-primary { + color: #007bff !important; } + +a.text-primary:hover, a.text-primary:focus { + color: #0056b3 !important; } + +.text-secondary { + color: #6c757d !important; } + +a.text-secondary:hover, a.text-secondary:focus { + color: #494f54 !important; } + +.text-success { + color: #28a745 !important; } + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; } + +.text-info { + color: #17a2b8 !important; } + +a.text-info:hover, a.text-info:focus { + color: #0f6674 !important; } + +.text-warning { + color: #ffc107 !important; } + +a.text-warning:hover, a.text-warning:focus { + color: #ba8b00 !important; } + +.text-danger { + color: #dc3545 !important; } + +a.text-danger:hover, a.text-danger:focus { + color: #a71d2a !important; } + +.text-light { + color: #f8f9fa !important; } + +a.text-light:hover, a.text-light:focus { + color: #cbd3da !important; } + +.text-dark { + color: #343a40 !important; } + +a.text-dark:hover, a.text-dark:focus { + color: #121416 !important; } + +.text-body { + color: #212529 !important; } + +.text-muted { + color: #6c757d !important; } + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; } + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; } + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; } + +.text-decoration-none { + text-decoration: none !important; } + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; } + +.text-reset { + color: inherit !important; } + +.visible { + visibility: visible !important; } + +.invisible { + visibility: hidden !important; } + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; } + a:not(.btn) { + text-decoration: underline; } + abbr[title]::after { + content: " (" attr(title) ")"; } + pre { + white-space: pre-wrap !important; } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; } + thead { + display: table-header-group; } + tr, + img { + page-break-inside: avoid; } + p, + h2, + h3 { + orphans: 3; + widows: 3; } + h2, + h3 { + page-break-after: avoid; } + @page { + size: a3; } + body { + min-width: 992px !important; } + .container { + min-width: 992px !important; } + .navbar { + display: none; } + .badge { + border: 1px solid #000; } + .table { + border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; } + .table-dark { + color: inherit; } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; } + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; } } + +body { + font-family: "Lato", Arial, sans-serif; + font-size: 16px; + line-height: 1.8; + font-weight: normal; + background: #f8f9fd; + color: gray; } + +a { + -webkit-transition: .3s all ease; + -o-transition: .3s all ease; + transition: .3s all ease; + color: #c62f3d; } + a:hover, a:focus { + text-decoration: none !important; + outline: none !important; + -webkit-box-shadow: none; + box-shadow: none; } + a:hover, a:active, a:focus { + color: #c62f3d; + outline: none !important; + text-decoration: none !important; } + +h1, h2, h3, h4, h5, +.h1, .h2, .h3, .h4, .h5 { + line-height: 1.5; + font-weight: 400; + font-family: "Lato", Arial, sans-serif; + color: #000; } + +.bg-primary { + background: #c62f3d !important; } + +.ftco-section { + padding: 7em 0; } + +.ftco-no-pt { + padding-top: 0; } + +.ftco-no-pb { + padding-bottom: 0; } + +.heading-section { + font-size: 28px; + color: #000; } + +.img { + background-size: cover; + background-repeat: no-repeat; + background-position: center center; } + +.wrap { + width: 100%; + overflow: hidden; + background: #fff; + border-radius: 5px; + -webkit-box-shadow: 0px 10px 34px -15px rgba(0, 0, 0, 0.24); + -moz-box-shadow: 0px 10px 34px -15px rgba(0, 0, 0, 0.24); + box-shadow: 0px 10px 34px -15px rgba(0, 0, 0, 0.24); } + .wrap .img { + height: 200px; } + +.login-wrap { + position: relative; } + .login-wrap h3 { + font-weight: 300; } + +.form-group { + position: relative; + z-index: 0; + margin-bottom: 20px !important; } + .form-group a { + color: gray; } + +.form-control { + height: 48px; + background: #fff; + color: #000; + font-size: 16px; + border-radius: 5px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid rgba(0, 0, 0, 0.1); } + .form-control::-webkit-input-placeholder { + /* Chrome/Opera/Safari */ + color: rgba(0, 0, 0, 0.2) !important; } + .form-control::-moz-placeholder { + /* Firefox 19+ */ + color: rgba(0, 0, 0, 0.2) !important; } + .form-control:-ms-input-placeholder { + /* IE 10+ */ + color: rgba(0, 0, 0, 0.2) !important; } + .form-control:-moz-placeholder { + /* Firefox 18- */ + color: rgba(0, 0, 0, 0.2) !important; } + .form-control:focus, .form-control:active { + outline: none !important; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid #c62f3d; } + +.field-icon { + position: absolute; + top: 50%; + right: 15px; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + color: rgba(0, 0, 0, 0.3); } + +.form-control-placeholder { + position: absolute; + top: 2px; + padding: 7px 0 0 15px; + -webkit-transition: all 400ms; + -o-transition: all 400ms; + transition: all 400ms; + opacity: .6; } + +.form-control:focus + .form-control-placeholder, +.form-control:valid + .form-control-placeholder { + -webkit-transform: translate3d(0, -120%, 0); + transform: translate3d(0, -120%, 0); + padding: 7px 0 0 0; + opacity: 1; + text-transform: uppercase; + font-size: 12px; + letter-spacing: 1px; + color: #c62f3d; + font-weight: 700; } + +.social-media { + position: relative; + width: 100%; } + .social-media .social-icon { + display: block; + width: 40px; + height: 40px; + background: transparent; + border: 1px solid rgba(0, 0, 0, 0.05); + font-size: 16px; + margin-right: 5px; + border-radius: 50%; } + .social-media .social-icon span { + color: #999999; } + .social-media .social-icon:hover, .social-media .social-icon:focus { + background: #c62f3d; } + .social-media .social-icon:hover span, .social-media .social-icon:focus span { + color: #fff; } + +.checkbox-wrap { + display: block; + position: relative; + padding-left: 30px; + margin-bottom: 12px; + cursor: pointer; + font-size: 16px; + font-weight: 500; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +/* Hide the browser's default checkbox */ +.checkbox-wrap input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; } + +/* Create a custom checkbox */ +.checkmark { + position: absolute; + top: 0; + left: 0; } + +/* Create the checkmark/indicator (hidden when not checked) */ +.checkmark:after { + content: "\f0c8"; + font-family: "FontAwesome"; + position: absolute; + color: rgba(0, 0, 0, 0.1); + font-size: 20px; + margin-top: -4px; + -webkit-transition: 0.3s; + -o-transition: 0.3s; + transition: 0.3s; } + @media (prefers-reduced-motion: reduce) { + .checkmark:after { + -webkit-transition: none; + -o-transition: none; + transition: none; } } + +/* Show the checkmark when checked */ +.checkbox-wrap input:checked ~ .checkmark:after { + display: block; + content: "\f14a"; + font-family: "FontAwesome"; + color: rgba(0, 0, 0, 0.2); } + +/* Style the checkmark/indicator */ +.checkbox-primary { + color: #c62f3d; } + .checkbox-primary input:checked ~ .checkmark:after { + color: #c62f3d; } + +.btn { + cursor: pointer; + -webkit-box-shadow: none !important; + box-shadow: none !important; + font-size: 15px; + padding: 10px 20px; } + .btn:hover, .btn:active, .btn:focus { + outline: none; } + .btn.btn-primary { + background: #c62f3d !important; + border: 1px solid #c62f3d !important; + color: #fff !important; } + .btn.btn-primary:hover { + border: 1px solid #c62f3d; + background: transparent; + color: #c62f3d; } + .btn.btn-primary.btn-outline-primary { + border: 1px solid #c62f3d; + background: transparent; + color: #c62f3d; } + .btn.btn-primary.btn-outline-primary:hover { + border: 1px solid transparent; + background: #c62f3d; + color: #fff; } diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html new file mode 100644 index 000000000..1b25bfb2c --- /dev/null +++ b/src/app/login/login.component.html @@ -0,0 +1,58 @@ + + + + Login 05 + + + + + + + +
+
+
+
+

Iniciar sesión

+
+
+
+
+
+
+ +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts new file mode 100644 index 000000000..b39696d88 --- /dev/null +++ b/src/app/login/login.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts new file mode 100644 index 000000000..2043cae77 --- /dev/null +++ b/src/app/login/login.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { AuthService } from '../services/auth.service'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'] +}) +export class LoginComponent implements OnInit { + + email: string; + password: string; + username: string; + + constructor(public authService: AuthService, public router: Router) {} + ngOnInit() { + localStorage.removeItem('jwt'); + localStorage.removeItem('userId'); + + } + async login(username: string, password: string) { + try { + + await this.authService.login(username, password).toPromise(); + + // navegar al componente de la página principal si la respuesta es exitosa + + } catch (error) { + console.error(error); + } + } + + + +} diff --git a/src/app/maps/maps.component.css b/src/app/maps/maps.component.css index e69de29bb..24e57642f 100644 --- a/src/app/maps/maps.component.css +++ b/src/app/maps/maps.component.css @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; + } \ No newline at end of file diff --git a/src/app/maps/maps.component.html b/src/app/maps/maps.component.html index f37bd2dea..b9bab9ed6 100644 --- a/src/app/maps/maps.component.html +++ b/src/app/maps/maps.component.html @@ -1,9 +1,2 @@
- - - - -
diff --git a/src/app/notifications/notifications.component.css b/src/app/notifications/notifications.component.css index e69de29bb..24e57642f 100644 --- a/src/app/notifications/notifications.component.css +++ b/src/app/notifications/notifications.component.css @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; + } \ No newline at end of file diff --git a/src/app/notifications/notifications.component.html b/src/app/notifications/notifications.component.html index 09bb55ee5..1ed8c8813 100644 --- a/src/app/notifications/notifications.component.html +++ b/src/app/notifications/notifications.component.html @@ -1,86 +1,9 @@ -
-
-
-
-

Notifications

-

Handcrafted by our friend Robert McIntosh. Please checkout the full documentation.

-
-
-
-
-
Notifications Style
-
- This is a plain notification -
-
- - This is a notification with close button. -
-
- - - This is a notification with close button and icon. -
-
- - - This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style. -
-
-
-
Notification states
-
- - Info - This is a regular notification made with ".alert-info" -
-
- - Success - This is a regular notification made with ".alert-success" -
-
- - Warning - This is a regular notification made with ".alert-warning" -
-
- - Danger - This is a regular notification made with ".alert-danger" -
-
-
-
-
-
-
-
-
Notifications Places -

Click to view notifications

-
-
-
-
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
- -
-
-
-
-
+
+
+
+
+

Notifications

+
+
diff --git a/src/app/pagination/pagination.component.html b/src/app/pagination/pagination.component.html new file mode 100644 index 000000000..52afa9352 --- /dev/null +++ b/src/app/pagination/pagination.component.html @@ -0,0 +1,16 @@ +
+ +
+ \ No newline at end of file diff --git a/src/app/tables/tables.component.css b/src/app/pagination/pagination.component.scss similarity index 100% rename from src/app/tables/tables.component.css rename to src/app/pagination/pagination.component.scss diff --git a/src/app/pagination/pagination.component.spec.ts b/src/app/pagination/pagination.component.spec.ts new file mode 100644 index 000000000..88519bdc1 --- /dev/null +++ b/src/app/pagination/pagination.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PaginationComponent } from './pagination.component'; + +describe('PaginationComponent', () => { + let component: PaginationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PaginationComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(PaginationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pagination/pagination.component.ts b/src/app/pagination/pagination.component.ts new file mode 100644 index 000000000..43a411e47 --- /dev/null +++ b/src/app/pagination/pagination.component.ts @@ -0,0 +1,52 @@ + import { Component, OnInit } from '@angular/core'; + + @Component({ + selector: 'app-pagination', + templateUrl: './pagination.component.html', + styleUrls: ['./pagination.component.scss'] + }) + export class PaginationComponent implements OnInit { + + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + token: any; + response: any; + currentPage = 1; + pageSize = 5; + totalPages: number; + pages: number[]; + tableData1: any; + + constructor() { } + + ngOnInit(): void { + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.calculatePageData(); + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + numFDS : item.numFDS, + numMatrinoniosVivieron : item.numMatrinoniosVivieron, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numSacerdotesVivieron: item.numSacerdotesVivieron, + numReligiososVivieron: item.numReligiososVivieron + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + } diff --git a/src/app/perfil/perfil.component.css b/src/app/perfil/perfil.component.css new file mode 100644 index 000000000..201d955e3 --- /dev/null +++ b/src/app/perfil/perfil.component.css @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 300px; + } \ No newline at end of file diff --git a/src/app/perfil/perfil.component.html b/src/app/perfil/perfil.component.html new file mode 100644 index 000000000..b16cb40cc --- /dev/null +++ b/src/app/perfil/perfil.component.html @@ -0,0 +1,133 @@ + + + + + + + + +
+
+
+
+
+
+

Perfil de usuario

+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+ + + + + diff --git a/src/app/perfil/perfil.component.spec.ts b/src/app/perfil/perfil.component.spec.ts new file mode 100644 index 000000000..c427ac98a --- /dev/null +++ b/src/app/perfil/perfil.component.spec.ts @@ -0,0 +1,26 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { PerfilComponent } from './perfil.component'; + +describe('PerfilComponent', () => { + let component: PerfilComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PerfilComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PerfilComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/perfil/perfil.component.ts b/src/app/perfil/perfil.component.ts new file mode 100644 index 000000000..f3fea51c6 --- /dev/null +++ b/src/app/perfil/perfil.component.ts @@ -0,0 +1,263 @@ +import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable, catchError, map } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; + +@Component({ + selector: 'app-perfil', + templateUrl: './perfil.component.html', + styleUrls: ['./perfil.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush + +}) +export class PerfilComponent implements OnInit { + + perfilForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + roles: any[] = []; + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + creationDate: string; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.perfilForm = this.formBuilder.group({ + id: [null], + name: [null, Validators.required], + creationDate: [null, Validators.required], + lastname: [null, Validators.required], + username: [null, Validators.required], + password: [null, Validators.required], + document: [null, Validators.required], + state: [null, Validators.required], + email: [null, Validators.required], + telefono: [null, Validators.required], + 'select-rol': ['', Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + + let token = localStorage.getItem('jwt'); + + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + let userId = localStorage.getItem('userId'); + + this.obtenerDatosUsuario(userId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + let fecha = new Date(data.response.creationDate); + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.perfilForm.controls['creationDate'].setValue(fechaFormateada); + this.perfilForm.controls['name'].setValue(data.response.name); + this.perfilForm.controls['lastname'].setValue(data.response.lastname); + this.perfilForm.controls['username'].setValue(data.response.username); + this.perfilForm.controls['password'].setValue(data.response.password); + this.perfilForm.controls['document'].setValue(data.response.document); + this.perfilForm.controls['email'].setValue(data.response.email); + this.perfilForm.controls['telefono'].setValue(data.response.telefono); + + + // Gestion de paises + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + const rol = data.response.roles[0].id; + + this.perfilForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.perfilForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.perfilForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + this.obtenerDatosRol().subscribe((data: any) => { + const roles = data.response; + const selectRol = document.getElementById('select-rol') as HTMLSelectElement; + + selectRol.innerHTML = ''; + + roles.forEach((rol: any) => { + const option = document.createElement('option'); + option.value = rol.id; + option.text = rol.name; + selectRol.appendChild(option); + }); + this.perfilForm.controls['select-rol'].setValue(rol); + }); + + }); + } + obtenerDatosUsuario(id: string): Observable { + const params = { id: id }; + const url = `https://encuentro-matrimonial-backend.herokuapp.com/user/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + return response.pipe( + map((data: any) => { + console.log(data); // aquí puedes imprimir la respuesta si lo deseas + return data; + }), + catchError(error => { + console.error(error); + throw error; + }) + ); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarUsuario(); + } + }) + } + editarUsuario() { + const id = localStorage.getItem('userId'); + const name = (document.getElementById('name')).value; + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const creationDate = fechaObjeto.toISOString(); + const lastname = (document.getElementById('lastname')).value; + const username = (document.getElementById('username')).value; + const password = (document.getElementById('password')).value; + const doc = (document.getElementById('document')).value; + const email = (document.getElementById('email')).value; + const telefono = (document.getElementById('telefono')).value; + + const ciudadSeleccionada = parseInt((document.getElementById('select-ciudad')).value, 10); + const state = true; + const rolSeleccionado = parseInt((document.getElementById('select-rol')).value, 10); + + + const jsonUsuario = { + id, + name, + creationDate, + lastname, + username, + password, + document: doc, + state, + email, + telefono, + roles: [ + { + id: rolSeleccionado, + } + ], + ciudad: { + id: ciudadSeleccionada + }, + }; + console.log(jsonUsuario); + + const nuevoUsuario = JSON.stringify(jsonUsuario); // Convertir el objeto en una cadena JSON + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/user/updateUsuario', nuevoUsuario, this.httpOptions) + .subscribe(data => { + alert('Usuario Actualizado exitosamente'); + this.router.navigate(['/usuariosGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.perfilForm.controls['select-ciudad'].reset(); + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + obtenerDatosRol(){ + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/rol/getRoles?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } +} diff --git a/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.css b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.css new file mode 100644 index 000000000..74d772980 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.css @@ -0,0 +1,44 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.html b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.html new file mode 100644 index 000000000..01f0abc78 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.html @@ -0,0 +1,105 @@ +
+
+
+
+
+
+
+
+

Cuarto pilar: El fin de semana

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
Fecha#Serv. Post-Encuentro activos#FDS Serv. Post-Encuentro P.#Matrim. Vivi. Serv. Post-Encuentro#Comuni. de apoyoAcciones
{{row.fechaCreacion}}{{row.numServidoresPostActivos}}{{row.numFdsPostPeriodo}}{{row.numMatrimoiosComunidad}}{{row.numComunidadApoyo}} + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + +
NombreRealizadoProyectado
{{row.key}}{{row.value}} +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.spec.ts b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.spec.ts new file mode 100644 index 000000000..bad35b0e4 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { CuartoPilarGridComponent } from './cuartoPilarGrid.component'; + +describe('CuartoPilarGridComponent', () => { + let component: CuartoPilarGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CuartoPilarGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CuartoPilarGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.ts b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.ts new file mode 100644 index 000000000..094d1b657 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/cuartoPilarGrid.component.ts @@ -0,0 +1,320 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-cuartoPilarGrid', + templateUrl: './cuartoPilarGrid.component.html', + styleUrls: ['./cuartoPilarGrid.component.css'] +}) + +export class CuartoPilarGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + this.tableData2 = { headerRow: [], dataRows: [] }; + } + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + numComunidadApoyo : item.numComunidadApoyo, + numFdsPostPeriodo : item.numFdsPostPeriodo, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numMatrimoiosComunidad: item.numMatrimoiosComunidad, + numMatrimonioVivieron: item.numMatrimonioVivieron, + numSacerdotesComunidad: item.numSacerdotesComunidad, + numServiciosComunidad: item.numServiciosComunidad, + numServidoresPostActivos: item.numServidoresPostActivos, + + } + }); + + const responseData2 = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData2.slice(0, 5).map(item => { + return { + key: item.key, + value : item.value, + } + }); + + + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + } + }); + + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + numComunidadApoyo : item.numComunidadApoyo, + numFdsPostPeriodo : item.numFdsPostPeriodo, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numMatrimoiosComunidad: item.numMatrimoiosComunidad, + numMatrimonioVivieron: item.numMatrimonioVivieron, + numSacerdotesComunidad: item.numSacerdotesComunidad, + numServiciosComunidad: item.numServiciosComunidad, + numServidoresPostActivos: item.numServidoresPostActivos, + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + editRow(row) { + const elementId = row.id; + console.log(elementId); + this.router.navigate(['/editarCuartoPilar', elementId]); + + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/delete?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + this.getTableData2(); + }); + } + + public getTableData() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + numComunidadApoyo : item.numComunidadApoyo, + numFdsPostPeriodo : item.numFdsPostPeriodo, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numMatrimoiosComunidad: item.numMatrimoiosComunidad, + numMatrimonioVivieron: item.numMatrimonioVivieron, + numSacerdotesComunidad: item.numSacerdotesComunidad, + numServiciosComunidad: item.numServiciosComunidad, + numServidoresPostActivos: item.numServidoresPostActivos, + } + }); + + this.data = responseData; + }); + } + + public getTableData2() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData.map(item => { + return { + key: item.key, + value : item.value, + } + }); + + this.data = responseData; + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + + generateExcel(){ + let userId = localStorage.getItem('userId'); + // Realizar la consulta y obtener los datos en un arreglo + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = [ + 'Fecha de Creación', + 'Num. Servidores Post Activos', + 'Num. FDS Post Periodo', + 'Num. Matrimonios Vivieron', + 'Num. Comunidad Apoyo', + 'Num. Servicios Comunidad', + 'Num. Matrimonios Comunidad', + 'Num. Sacerdotes Comunidad', + 'Num. Religiosos Comunidad' + ]; + + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.numServidoresPostActivos, + item.numFdsPostPeriodo, + item.numMatrimonioVivieron, + item.numComunidadApoyo, + item.numServiciosComunidad, + item.numMatrimoiosComunidad, + item.numSacerdotesComunidad, + item.numReligiososComunidad + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'CuartoPilar.xlsx'; + link.click(); + }) + } + // Función para convertir una cadena a un arreglo de bytes + s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; + } + filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + id: item.id, + numComunidadApoyo : item.numComunidadApoyo, + numFdsPostPeriodo : item.numFdsPostPeriodo, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), numMatrimoiosComunidad: item.numMatrimoiosComunidad, + numMatrimonioVivieron: item.numMatrimonioVivieron, + numSacerdotesComunidad: item.numSacerdotesComunidad, + numServiciosComunidad: item.numServiciosComunidad, + numServidoresPostActivos: item.numServidoresPostActivos, + + + + }; + }); + } + } + + diff --git a/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.css b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.html b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.html new file mode 100644 index 000000000..e178342a6 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.html @@ -0,0 +1,138 @@ + + + + + + + + +
+
+
+
+
+
+

Editar Cuarto pilar

+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.spec.ts b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.spec.ts new file mode 100644 index 000000000..4410b9fea --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { EditarCuartoPilarComponent } from './editarCuartoPilar.component'; + +describe('EditarCuartoPilarComponent', () => { + let component: EditarCuartoPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditarCuartoPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditarCuartoPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.ts b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.ts new file mode 100644 index 000000000..e767fdec4 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/editarCuartoPilar/editarCuartoPilar.component.ts @@ -0,0 +1,258 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-editarCuartoPilar', + templateUrl: './editarCuartoPilar.component.html', + styleUrls: ['./editarCuartoPilar.component.css'] +}) +export class EditarCuartoPilarComponent implements OnInit { + + editarCuartoPilarForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarCuartoPilarForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + numServidoresPostActivos: [null, Validators.required], + numFdsPostPeriodo: [null, Validators.required], + numMatrimonioVivieron: [null, Validators.required], + numComunidadApoyo: [null, Validators.required], + numServiciosComunidad: [null, Validators.required], + numMatrimoiosComunidad: [null, Validators.required], + numSacerdotesComunidad: [null, Validators.required], + numReligiososComunidad: [null, Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + + + }); + } + ngOnInit() { + + + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerDatosDelPilar(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + + let fecha = new Date(data.response.fechaCreacion); + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarCuartoPilarForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarCuartoPilarForm.controls['numServidoresPostActivos'].setValue(data.response.numServidoresPostActivos); + this.editarCuartoPilarForm.controls['numFdsPostPeriodo'].setValue(data.response.numFdsPostPeriodo); + this.editarCuartoPilarForm.controls['numMatrimonioVivieron'].setValue(data.response.numMatrimonioVivieron); + this.editarCuartoPilarForm.controls['numComunidadApoyo'].setValue(data.response.numComunidadApoyo); + this.editarCuartoPilarForm.controls['numServiciosComunidad'].setValue(data.response.numServiciosComunidad); + this.editarCuartoPilarForm.controls['numMatrimoiosComunidad'].setValue(data.response.numMatrimoiosComunidad); + this.editarCuartoPilarForm.controls['numSacerdotesComunidad'].setValue(data.response.numSacerdotesComunidad); + this.editarCuartoPilarForm.controls['numReligiososComunidad'].setValue(data.response.numReligiososComunidad); + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + console.log(pais.id) + this.editarCuartoPilarForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarCuartoPilarForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + console.log(ciudades); + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarCuartoPilarForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + console.log(data.response); + + this.datosCargados = true; + console.log(this.datosCargados); + }); + + + } + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + obtenerDatosDelPilar(id: string): Observable { + const params = { id: id }; + console.log(this.token); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarPilar(); + } + }) + } + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarPilar() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numServidoresPostActivos = (document.getElementById('numServidoresPostActivos')).value; + const numFdsPostPeriodo = (document.getElementById('numFdsPostPeriodo')).value; + const numMatrimonioVivieron = (document.getElementById('numMatrimonioVivieron')).value; + const numComunidadApoyo = (document.getElementById('numComunidadApoyo')).value; + const numServiciosComunidad = (document.getElementById('numServiciosComunidad')).value; + const numMatrimoiosComunidad = (document.getElementById('numMatrimoiosComunidad')).value; + const numSacerdotesComunidad = (document.getElementById('numSacerdotesComunidad')).value; + const numReligiososComunidad = (document.getElementById('numReligiososComunidad')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const editCuartoPilar = { + id, + fechaCreacion, + numServidoresPostActivos, + numFdsPostPeriodo, + numMatrimonioVivieron, + numComunidadApoyo, + numServiciosComunidad, + numMatrimoiosComunidad, + numSacerdotesComunidad, + numReligiososComunidad, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonCuartoPilar = JSON.stringify(editCuartoPilar); // Convertir el objeto en una cadena JSON + console.log(jsonCuartoPilar); + console.log(this.httpOptions); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/update', jsonCuartoPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/cuartoPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarCuartoPilarForm.controls['select-ciudad'].reset(); + + }); + } + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.css b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.html b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.html new file mode 100644 index 000000000..c3a227f2c --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.html @@ -0,0 +1,125 @@ +
+
+
+
+
+
+

Nuevo cuarto pilar

+
+
+
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
+
diff --git a/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.spec.ts b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.spec.ts new file mode 100644 index 000000000..618651cbf --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoCuartoPilarComponent } from './nuevoCuartoPilar.component'; + +describe('NuevoPrimerPilarComponent', () => { + let component: NuevoCuartoPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoCuartoPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoCuartoPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.ts b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.ts new file mode 100644 index 000000000..013228de5 --- /dev/null +++ b/src/app/pilares/cuartoPilarGrid/nuevoCuartoPilar/nuevoCuartoPilar.component.ts @@ -0,0 +1,159 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-nuevoCuartoPilar', + templateUrl: './nuevoCuartoPilar.component.html', + styleUrls: ['./nuevoCuartoPilar.component.css'] +}) +export class NuevoCuartoPilarComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newPilar() { + const fecha = (document.getElementById("fecha") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numServidoresPostActivos = (document.getElementById('numServidoresPostActivos')).value; + const numFdsPostPeriodo = (document.getElementById('numFdsPostPeriodo')).value; + const numMatrimonioVivieron = (document.getElementById('numMatrimonioVivieron')).value; + const numComunidadApoyo = (document.getElementById('numComunidadApoyo')).value; + const numServiciosComunidad = (document.getElementById('numServiciosComunidad')).value; + const numMatrimoiosComunidad = (document.getElementById('numMatrimoiosComunidad')).value; + const numSacerdotesComunidad = (document.getElementById('numSacerdotesComunidad')).value; + const numReligiososComunidad = (document.getElementById('numReligiososComunidad')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const jsonCuartoPilar = { + fechaCreacion, + numServidoresPostActivos, + numFdsPostPeriodo, + numMatrimonioVivieron, + numComunidadApoyo, + numServiciosComunidad, + numMatrimoiosComunidad, + numSacerdotesComunidad, + numReligiososComunidad, + ciudad: { + id: ciudadSeleccionada + }, + }; + + const jsonSegundoPilar = JSON.stringify(jsonCuartoPilar); // Convertir el objeto en una cadena JSON + console.log(jsonSegundoPilar); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/cuartoPilar/create', jsonSegundoPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/cuartoPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } +} diff --git a/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.css b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.html b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.html new file mode 100644 index 000000000..2c59fcfcd --- /dev/null +++ b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.html @@ -0,0 +1,92 @@ + +
+
+
+
+
+
+

Editar primer pilar

+
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ diff --git a/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.spec.ts b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.spec.ts new file mode 100644 index 000000000..42a9410f4 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { EditarPrimerPilarComponent } from './editarPrimerPilar.component'; + +describe('EditarPrimerPilarComponent', () => { + let component: EditarPrimerPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditarPrimerPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditarPrimerPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.ts b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.ts new file mode 100644 index 000000000..d38724cf6 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/editarPrimerPilar/editarPrimerPilar.component.ts @@ -0,0 +1,234 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import {FormBuilder, FormControl, FormGroup, NgForm , Validators} from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + +@Component({ + selector: 'app-editarPrimerPilar', + templateUrl: './editarPrimerPilar.component.html', + styleUrls: ['./editarPrimerPilar.component.css'] +}) +export class EditarPrimerPilarComponent implements OnInit { + + editarPrimerPilarForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarPrimerPilarForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + numFDS: [null, Validators.required], + numMatrinoniosVivieron: [null, Validators.required], + numSacerdotesVivieron: [null, Validators.required], + numReligiososVivieron: [null, Validators.required], + + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerDatosDelPilar(elementId).subscribe(data => { + let fecha = new Date(data.response.fechaCreacion); + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarPrimerPilarForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarPrimerPilarForm.controls['numFDS'].setValue(data.response.numMatrinoniosVivieron); + this.editarPrimerPilarForm.controls['numMatrinoniosVivieron'].setValue(data.response.numMatrinoniosVivieron); + this.editarPrimerPilarForm.controls['numSacerdotesVivieron'].setValue(data.response.numSacerdotesVivieron); + this.editarPrimerPilarForm.controls['numReligiososVivieron'].setValue(data.response.numReligiososVivieron); + + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + this.editarPrimerPilarForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarPrimerPilarForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + console.log(ciudades); + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarPrimerPilarForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + }); + } + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + obtenerDatosDelPilar(id: string): Observable { + const params = { id: id }; + console.log(this.token); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarPilar() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numFDS = (document.getElementById('numFDS')).value; + const numMatrinoniosVivieron = (document.getElementById('numMatrinoniosVivieron')).value; + const numSacerdotesVivieron = (document.getElementById('numSacerdotesVivieron')).value; + const numReligiososVivieron = (document.getElementById('numReligiososVivieron')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const editPrimerPilar = { + id, + fechaCreacion, + numFDS, + numMatrinoniosVivieron, + numSacerdotesVivieron, + numReligiososVivieron, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonPrimerPilar = JSON.stringify(editPrimerPilar); // Convertir el objeto en una cadena JSON + console.log(jsonPrimerPilar); + console.log(this.httpOptions); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/create', jsonPrimerPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/primerPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarPrimerPilarForm.controls['select-ciudad'].reset(); + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.css b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.css new file mode 100644 index 000000000..bb35bd300 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.css @@ -0,0 +1,22 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.html b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.html new file mode 100644 index 000000000..bf0eed38d --- /dev/null +++ b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.html @@ -0,0 +1,94 @@ + +
+
+
+
+
+
+

Nuevo primer pilar

+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+ +
+
+ + +
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+
+
+
+
+
+
+
+
+ diff --git a/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.spec.ts b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.spec.ts new file mode 100644 index 000000000..3052bdf23 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoPrimerPilarComponent } from './nuevoPrimerPilar.component'; + +describe('NuevoPrimerPilarComponent', () => { + let component: NuevoPrimerPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoPrimerPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoPrimerPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.ts b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.ts new file mode 100644 index 000000000..2886b9287 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/nuevoPrimerPilar/nuevoPrimerPilar.component.ts @@ -0,0 +1,153 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-nuevoPrimerPilar', + templateUrl: './nuevoPrimerPilar.component.html', + styleUrls: ['./nuevoPrimerPilar.component.css'] +}) +export class NuevoPrimerPilarComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newPilar() { + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numFDS = (document.getElementById('numFDS')).value; + const numMatrinoniosVivieron = (document.getElementById('numMatrinoniosVivieron')).value; + const numSacerdotesVivieron = (document.getElementById('numSacerdotesVivieron')).value; + const numReligiososVivieron = (document.getElementById('numReligiososVivieron')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const newPrimerPilar = { + fechaCreacion, + numFDS, + numMatrinoniosVivieron, + numSacerdotesVivieron, + numReligiososVivieron, + ciudadSeleccionada, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonPrimerPilar = JSON.stringify(newPrimerPilar); // Convertir el objeto en una cadena JSON + console.log(jsonPrimerPilar); + console.log(this.httpOptions); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/create', jsonPrimerPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/primerPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } + +} \ No newline at end of file diff --git a/src/app/pilares/primerPilarGrid/primerPilarGrid.component.css b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.css new file mode 100644 index 000000000..74d772980 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.css @@ -0,0 +1,44 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/pilares/primerPilarGrid/primerPilarGrid.component.html b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.html new file mode 100644 index 000000000..a71b92748 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.html @@ -0,0 +1,104 @@ + +
+
+
+
+
+
+
+
+

Primer pilar: El fin de semana

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
FechaNúmero de FDSNúmero de matrimonios vivieronNúmero de sacerdotes vivieronAcciones
{{row.fechaCreacion}}{{row.numFDS}}{{row.numMatrinoniosVivieron}}{{row.numSacerdotesVivieron}} + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + +
NombreRealizadoProyectado
{{row.key}}{{row.value}} +
+
+
+
+
+
+
+ diff --git a/src/app/pilares/primerPilarGrid/primerPilarGrid.component.spec.ts b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.spec.ts new file mode 100644 index 000000000..87d567e79 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.spec.ts @@ -0,0 +1,28 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {Router} from '@angular/router'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { PrimerPilarGridComponent } from './primerPilarGrid.component'; + +describe('PrimerPilarGridComponent', () => { + let component: PrimerPilarGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PrimerPilarGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PrimerPilarGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/primerPilarGrid/primerPilarGrid.component.ts b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.ts new file mode 100644 index 000000000..f3bd554d4 --- /dev/null +++ b/src/app/pilares/primerPilarGrid/primerPilarGrid.component.ts @@ -0,0 +1,310 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-primerPilarGrid', + templateUrl: './primerPilarGrid.component.html', + styleUrls: ['./primerPilarGrid.component.css'], +}) + +export class PrimerPilarGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + @ViewChild('row') row: any; + httpOptions: any; + token: any; + response: any; + + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + this.tableData2 = { headerRow: [], dataRows: [] }; + + } + + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + numFDS : item.numFDS, + numMatrinoniosVivieron : item.numMatrinoniosVivieron, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }).split('/').join('-'), + numSacerdotesVivieron: item.numSacerdotesVivieron, + numReligiososVivieron: item.numReligiososVivieron, + + } + }); + + const responseData2 = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData2.slice(0, 5).map(item => { + return { + key: item.key, + value : item.value, + } + + }); + + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + }); + + + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + numFDS : item.numFDS, + numMatrinoniosVivieron : item.numMatrinoniosVivieron, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numSacerdotesVivieron: item.numSacerdotesVivieron, + numReligiososVivieron: item.numReligiososVivieron + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/delete?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + this.getTableData2(); + this.setCurrentPage(1); + }); + } + + + editRow(row) { + const elementId = row.id; + console.log(elementId); + this.router.navigate(['/editarPrimerPilar', elementId]); + + } + + public getTableData() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + numFDS : item.numFDS, + numMatrinoniosVivieron : item.numMatrinoniosVivieron, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numSacerdotesVivieron: item.numSacerdotesVivieron, + numReligiososVivieron: item.numReligiososVivieron + } + }); + + this.data = responseData; + }); + } + + public getTableData2() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData.map(item => { + return { + key: item.key, + value : item.value, + } + }); + + this.data = responseData; + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + + // Función para generar el archivo Excel + generateExcel() { + let userId = localStorage.getItem('userId'); + + // Realizar la consulta y obtener los datos en un arreglo + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = ['ID', 'Fecha de Creación', 'Num. FDS', 'Num. Matrimonios Vivieron', 'Num. Sacerdotes Vivieron', 'Num. Religiosos/as Vivieron']; + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + const responseData2 = data['totalResponse']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.numFDS, + item.numMatrinoniosVivieron, + item.numSacerdotesVivieron, + item.numReligiososVivieron + ]; + rows.push(row); + }); + responseData2.forEach(item => { + const row = [ + item.key, + item.value, + + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'Primer Pilar.xlsx'; + link.click(); + }); + } + + // Función para convertir una cadena a un arreglo de bytes + s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; + } + filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + id: item.id, + numFDS: item.numFDS, + numMatrinoniosVivieron: item.numMatrinoniosVivieron, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), + numSacerdotesVivieron: item.numSacerdotesVivieron, + numReligiososVivieron: item.numReligiososVivieron, + isVisible: true + }; + }); + } + +} \ No newline at end of file diff --git a/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.css b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.html b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.html new file mode 100644 index 000000000..b1d4df6dc --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.html @@ -0,0 +1,133 @@ + +
+
+
+
+
+
+

Editar segundo pilar

+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ diff --git a/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.spec.ts b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.spec.ts new file mode 100644 index 000000000..569b9d6a8 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { EditarSegundoPilarComponent } from './editarSegundoPilar.component'; + +describe('EditarSegundoPilarComponent', () => { + let component: EditarSegundoPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditarSegundoPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditarSegundoPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.ts b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.ts new file mode 100644 index 000000000..8ccd2fbff --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/editarSegundoPilar/editarSegundoPilar.component.ts @@ -0,0 +1,263 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + + +@Component({ + selector: 'app-editarSegundoPilar', + templateUrl: './editarSegundoPilar.component.html', + styleUrls: ['./editarSegundoPilar.component.css'] +}) +export class EditarSegundoPilarComponent implements OnInit { + + editarSegundoPilarForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarSegundoPilarForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + numMatrimosServidoresActivos: [null, Validators.required], + numSacerdotesServidoresActivos: [null, Validators.required], + numMatrimosServidoresProfundoActivos: [null, Validators.required], + numSacerdotesServidoresprofundoActivos: [null, Validators.required], + numFdsProfundosPeriodo: [null, Validators.required], + numReligiosasVivieron: [null, Validators.required], + numMatrimosVivieronProfundo: [null, Validators.required], + numSacerdotesVivieronProfundo: [null, Validators.required], + numMatrimosDebutaronProfundo: [null, Validators.required], + numSacerdotesDebutaronProfundo: [null, Validators.required], + + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + + + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerDatosDelPilar(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + + let fecha = new Date(data.response.fechaCreacion); + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarSegundoPilarForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarSegundoPilarForm.controls['numMatrimosServidoresActivos'].setValue(data.response.numMatrimosServidoresActivos); + this.editarSegundoPilarForm.controls['numSacerdotesServidoresActivos'].setValue(data.response.numSacerdotesServidoresActivos); + this.editarSegundoPilarForm.controls['numMatrimosServidoresProfundoActivos'].setValue(data.response.numMatrimosServidoresProfundoActivos); + this.editarSegundoPilarForm.controls['numSacerdotesServidoresprofundoActivos'].setValue(data.response.numSacerdotesServidoresprofundoActivos); + this.editarSegundoPilarForm.controls['numFdsProfundosPeriodo'].setValue(data.response.numFdsProfundosPeriodo); + this.editarSegundoPilarForm.controls['numMatrimosVivieronProfundo'].setValue(data.response.numMatrimosVivieronProfundo); + this.editarSegundoPilarForm.controls['numSacerdotesVivieronProfundo'].setValue(data.response.numSacerdotesVivieronProfundo); + this.editarSegundoPilarForm.controls['numMatrimosDebutaronProfundo'].setValue(data.response.numMatrimosDebutaronProfundo); + this.editarSegundoPilarForm.controls['numSacerdotesDebutaronProfundo'].setValue(data.response.numSacerdotesDebutaronProfundo); + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + console.log(pais.id) + this.editarSegundoPilarForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarSegundoPilarForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + console.log(ciudades); + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarSegundoPilarForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + console.log(data.response); + + this.datosCargados = true; + console.log(this.datosCargados); + }); + + } + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + obtenerDatosDelPilar(id: string): Observable { + const params = { id: id }; + console.log(this.token); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarPilar() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numMatrimosServidoresActivos = (document.getElementById('numMatrimosServidoresActivos')).value; + const numSacerdotesServidoresActivos = (document.getElementById('numSacerdotesServidoresActivos')).value; + const numMatrimosServidoresProfundoActivos = (document.getElementById('numMatrimosServidoresProfundoActivos')).value; + const numSacerdotesServidoresprofundoActivos = (document.getElementById('numSacerdotesServidoresprofundoActivos')).value; + const numFdsProfundosPeriodo = (document.getElementById('numFdsProfundosPeriodo')).value; + const numMatrimosVivieronProfundo = (document.getElementById('numMatrimosVivieronProfundo')).value; + const numSacerdotesVivieronProfundo = (document.getElementById('numSacerdotesVivieronProfundo')).value; + const numMatrimosDebutaronProfundo = (document.getElementById('numMatrimosDebutaronProfundo')).value; + const numSacerdotesDebutaronProfundo = (document.getElementById('numSacerdotesDebutaronProfundo')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + + const newSegundoPilar = { + id, + fechaCreacion, + numMatrimosServidoresActivos, + numSacerdotesServidoresActivos, + numMatrimosServidoresProfundoActivos, + numSacerdotesServidoresprofundoActivos, + numFdsProfundosPeriodo, + numMatrimosVivieronProfundo, + numSacerdotesVivieronProfundo, + numMatrimosDebutaronProfundo, + numSacerdotesDebutaronProfundo, + ciudad: { + id: ciudadSeleccionada + }, + }; + + const jsonSegundoPilar = JSON.stringify(newSegundoPilar); // Convertir el objeto en una cadena JSON + console.log(jsonSegundoPilar); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/create', jsonSegundoPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/segundoPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarSegundoPilarForm.controls['select-ciudad'].reset(); + + }); + } + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.css b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.html b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.html new file mode 100644 index 000000000..670228387 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.html @@ -0,0 +1,132 @@ +
+
+
+
+
+
+

Nuevo segundo pilar

+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
diff --git a/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.spec.ts b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.spec.ts new file mode 100644 index 000000000..86437afb3 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoSegundoPilarComponent } from './nuevoSegundoPilar.component'; + +describe('NuevoPrimerPilarComponent', () => { + let component: NuevoSegundoPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoSegundoPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoSegundoPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.ts b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.ts new file mode 100644 index 000000000..d71e3174b --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/nuevoSegundoPilar/nuevoSegundoPilar.component.ts @@ -0,0 +1,160 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-nuevoSegundoPilar', + templateUrl: './nuevoSegundoPilar.component.html', + styleUrls: ['./nuevoSegundoPilar.component.css'] +}) +export class NuevoSegundoPilarComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newPilar() { + const fecha = (document.getElementById("fecha") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numMatrimosServidoresActivos = (document.getElementById('MatrimoniosServidores')).value; + const numSacerdotesServidoresActivos = (document.getElementById('SacerdotesServidores')).value; + const numMatrimosServidoresProfundoActivos = (document.getElementById('MatrimoniosProfundosServidores')).value; + const numSacerdotesServidoresprofundoActivos = (document.getElementById('SacerdotesProfundosServidores')).value; + const numFdsProfundosPeriodo = (document.getElementById('FdSProfundosPeriodo')).value; + const numMatrimosVivieronProfundo = (document.getElementById('MatrimoniosProfundosVividos')).value; + const numSacerdotesVivieronProfundo = (document.getElementById('SacerdotesProfundosVividos')).value; + const numMatrimosDebutaronProfundo = (document.getElementById('MatrimoniosProfundosDebutados')).value; + const numSacerdotesDebutaronProfundo = (document.getElementById('SacerdotesProfundosDebutados')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const newSegundoPilar = { + fechaCreacion, + numMatrimosServidoresActivos, + numSacerdotesServidoresActivos, + numMatrimosServidoresProfundoActivos, + numSacerdotesServidoresprofundoActivos, + numFdsProfundosPeriodo, + numMatrimosVivieronProfundo, + numSacerdotesVivieronProfundo, + numMatrimosDebutaronProfundo, + numSacerdotesDebutaronProfundo, + ciudad: { + id: ciudadSeleccionada + }, + }; + + const jsonSegundoPilar = JSON.stringify(newSegundoPilar); // Convertir el objeto en una cadena JSON + console.log(jsonSegundoPilar); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/create', jsonSegundoPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/segundoPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } +} diff --git a/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.css b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.css new file mode 100644 index 000000000..74d772980 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.css @@ -0,0 +1,44 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.html b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.html new file mode 100644 index 000000000..ca6db0814 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.html @@ -0,0 +1,115 @@ +
+
+
+
+
+
+
+
+

Segundo pilar: El fin de semana

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fecha#Matrim. FdS Activo#Sacer. FdS Activo#Matrim. FdSP Activo#Sacer. FdSP Activo#FdSP#Matrim. Vivi FdSP#Sacer. Vivi FdSP#Matrim. Debut. Después FdSP'#Sacer. Debut. Después FdSPAcciones
{{row.fechaCreacion}}{{row.numFdsProfundosPeriodo}}{{row.numMatrimosDebutaronProfundo}}{{row.numMatrimosServidoresActivos}}{{row.numMatrimosServidoresProfundoActivos}}{{row.numMatrimosVivieronProfundo}}{{row.numSacerdotesDebutaronProfundo}}{{row.numMatrimosServidoresProfundoActivos}}{{row.numSacerdotesServidoresActivos}}{{row.numSacerdotesServidoresprofundoActivos}} + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + +
NombreRealizadoProyectado
{{row.key}}{{row.value}} +
+
+
+
+ +
+
+
diff --git a/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.spec.ts b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.spec.ts new file mode 100644 index 000000000..211fd426d --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { SegundoPilarGridComponent } from './segundoPilarGrid.component'; + +describe('PrimerPilarGridComponent', () => { + let component: SegundoPilarGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SegundoPilarGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SegundoPilarGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.ts b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.ts new file mode 100644 index 000000000..1aa424802 --- /dev/null +++ b/src/app/pilares/segundoPilarGrid/segundoPilarGrid.component.ts @@ -0,0 +1,344 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-segundoPilarGrid', + templateUrl: './segundoPilarGrid.component.html', + styleUrls: ['./segundoPilarGrid.component.css'] +}) + +export class SegundoPilarGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + this.tableData2 = { headerRow: [], dataRows: [] }; + } + + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numFdsProfundosPeriodo: item.numFdsProfundosPeriodo, + numMatrimosDebutaronProfundo: item.numMatrimosDebutaronProfundo, + numMatrimosServidoresActivos: item.numMatrimosServidoresActivos, + numMatrimosServidoresProfundoActivos: item.numMatrimosServidoresProfundoActivos, + numMatrimosVivieronProfundo: item.numMatrimosVivieronProfundo, + numSacerdotesDebutaronProfundo: item.numSacerdotesDebutaronProfundo, + numSacerdotesServidoresActivos: item.numSacerdotesServidoresActivos, + numSacerdotesServidoresprofundoActivos: item.numSacerdotesServidoresprofundoActivos, + numSacerdotesVivieronProfundo: item.numSacerdotesVivieronProfundo + } + }); + } + + const responseData2 = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData2.slice(0, 5).map(item => { + return { + key: item.key, + value : item.value, + } + }); + + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + // Actualizar los datos de la página actual + this.setCurrentPage(1); + }); + + } + + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numFdsProfundosPeriodo: item.numFdsProfundosPeriodo, + numMatrimosDebutaronProfundo: item.numMatrimosDebutaronProfundo, + numMatrimosServidoresActivos: item.numMatrimosServidoresActivos, + numMatrimosServidoresProfundoActivos: item.numMatrimosServidoresProfundoActivos, + numMatrimosVivieronProfundo: item.numMatrimosVivieronProfundo, + numSacerdotesDebutaronProfundo: item.numSacerdotesDebutaronProfundo, + numSacerdotesServidoresActivos: item.numSacerdotesServidoresActivos, + numSacerdotesServidoresprofundoActivos: item.numSacerdotesServidoresprofundoActivos, + numSacerdotesVivieronProfundo: item.numSacerdotesVivieronProfundo, + isVisible: true + + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + editRow(row) { + const elementId = row.id; + console.log(elementId); + // Navegar a la página de edición del primer pilar, pasando el ID como parámetro + this.router.navigate(['/editarSegundoPilar', elementId]); + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/delete?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + this.getTableData2(); + this.setCurrentPage(1); + + }); + } + + public getTableData() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numFdsProfundosPeriodo: item.numFdsProfundosPeriodo, + numMatrimosDebutaronProfundo: item.numMatrimosDebutaronProfundo, + numMatrimosServidoresActivos: item.numMatrimosServidoresActivos, + numMatrimosServidoresProfundoActivos: item.numMatrimosServidoresProfundoActivos, + numMatrimosVivieronProfundo: item.numMatrimosVivieronProfundo, + numSacerdotesDebutaronProfundo: item.numSacerdotesDebutaronProfundo, + numSacerdotesServidoresActivos: item.numSacerdotesServidoresActivos, + numSacerdotesServidoresprofundoActivos: item.numSacerdotesServidoresprofundoActivos, + numSacerdotesVivieronProfundo: item.numSacerdotesVivieronProfundo + } + }); + } + this.data = responseData; + }); + } + + public getTableData2() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData.map(item => { + return { + key: item.key, + value : item.value, + } + }); + + this.data = responseData; + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + + generateExcel(){ + let userId = localStorage.getItem('userId'); + // Realizar la consulta y obtener los datos en un arreglo + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/segundoPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = [ + 'ID', + 'Fecha de Creación', + 'Num. Matrimos Servidores Activos', + 'Num. Sacerdotes Servidores Activos', + 'Num. Matrimos Servidores Profundo Activos', + 'Num. Sacerdotes Servidores Profundo Activos', + 'Num. FDS Profundos en el Periodo', + 'Num. Matrimos Vivieron Profundo', + 'Num. Sacerdotes Vivieron Profundo', + 'Num. Matrimos Debutaron Profundo', + 'Num. Sacerdotes Debutaron Profundo' + ]; + + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.numMatrimosServidoresActivos, + item.numSacerdotesServidoresActivos, + item.numMatrimosServidoresProfundoActivos, + item.numSacerdotesServidoresprofundoActivos, + item.numFdsProfundosPeriodo, + item.numMatrimosVivieronProfundo, + item.numSacerdotesVivieronProfundo, + item.numMatrimosDebutaronProfundo, + item.numSacerdotesDebutaronProfundo, + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'SegundoPilar.xlsx'; + link.click(); + }) + } + // Función para convertir una cadena a un arreglo de bytes + s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; + } + + filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + id: item.id, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), + numFdsProfundosPeriodo: item.numFdsProfundosPeriodo, + numMatrimosDebutaronProfundo: item.numMatrimosDebutaronProfundo, + numMatrimosServidoresActivos: item.numMatrimosServidoresActivos, + numMatrimosServidoresProfundoActivos: item.numMatrimosServidoresProfundoActivos, + numMatrimosVivieronProfundo: item.numMatrimosVivieronProfundo, + numSacerdotesDebutaronProfundo: item.numSacerdotesDebutaronProfundo, + numSacerdotesServidoresActivos: item.numSacerdotesServidoresActivos, + numSacerdotesServidoresprofundoActivos: item.numSacerdotesServidoresprofundoActivos, + numSacerdotesVivieronProfundo: item.numSacerdotesVivieronProfundo, + + }; + }); + } + +} diff --git a/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.css b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.html b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.html new file mode 100644 index 000000000..1fcef9fa3 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.html @@ -0,0 +1,100 @@ + +
+
+
+
+
+
+

Editar Tercer pilar

+
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ diff --git a/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.spec.ts b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.spec.ts new file mode 100644 index 000000000..6729cc7d3 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { EditarTercerPilarComponent } from './editarTercerPilar.component'; + +describe('EditarTercerPilarComponent', () => { + let component: EditarTercerPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditarTercerPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditarTercerPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.ts b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.ts new file mode 100644 index 000000000..605a8c634 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/editarTercerPilar/editarTercerPilar.component.ts @@ -0,0 +1,240 @@ +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-editarTercerPilar', + templateUrl: './editarTercerPilar.component.html', + styleUrls: ['./editarTercerPilar.component.css'] +}) +export class EditarTercerPilarComponent implements OnInit { + + editarTercerPilarForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + fechaCreacion: string; + rolId: number; + mostrarBotonGuardar: boolean = false; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.editarTercerPilarForm = this.formBuilder.group({ + id: [null], + fechaCreacion: [null, Validators.required], + numRegiones: [null, Validators.required], + numDiocesisEstablecidas: [null, Validators.required], + numDiocesisContacto: [null, Validators.required], + numDiocesisExpansion: [null, Validators.required], + numDiocesisEclisiastica: [null, Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + + + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + this.rolId = parseInt(rolIdString, 10); + this.mostrarBotonGuardar = this.actualizarMostrarBotonGuardar(this.rolId); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerDatosDelPilar(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + + let fecha = new Date(data.response.fechaCreacion); + let fechaFormateada = fecha.toISOString().substring(0, 10); + this.editarTercerPilarForm.controls['fechaCreacion'].setValue(fechaFormateada); + this.editarTercerPilarForm.controls['numRegiones'].setValue(data.response.numRegiones); + this.editarTercerPilarForm.controls['numDiocesisEstablecidas'].setValue(data.response.numDiocesisEstablecidas); + this.editarTercerPilarForm.controls['numDiocesisContacto'].setValue(data.response.numDiocesisContacto); + this.editarTercerPilarForm.controls['numDiocesisExpansion'].setValue(data.response.numDiocesisExpansion); + this.editarTercerPilarForm.controls['numDiocesisEclisiastica'].setValue(data.response.numDiocesisEclisiastica); + + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + + console.log(pais.id) + this.editarTercerPilarForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.editarTercerPilarForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + console.log(ciudades); + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.editarTercerPilarForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + }); + + } + actualizarMostrarBotonGuardar(rol: number): boolean { + console.log(rol); + const mostrarBoton = rol !== 1; + console.log(mostrarBoton); + return mostrarBoton; + } + obtenerDatosDelPilar(id: string): Observable { + const params = { id: id }; + console.log(this.token); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + + return response + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.editarPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarPilar() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numRegiones = (document.getElementById('numRegiones')).value; + const numDiocesisEstablecidas = (document.getElementById('numDiocesisEstablecidas')).value; + const numDiocesisContacto = (document.getElementById('numDiocesisContacto')).value; + const numDiocesisExpansion = (document.getElementById('numDiocesisExpansion')).value; + const numDiocesisEclisiastica = (document.getElementById('numDiocesisEclisiastica')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const editTercerPilar = { + id, + fechaCreacion, + numRegiones, + numDiocesisEstablecidas, + numDiocesisContacto, + numDiocesisExpansion, + numDiocesisEclisiastica, + ciudad: { + id: ciudadSeleccionada + }, + }; + const jsonTrecerPilar = JSON.stringify(editTercerPilar); // Convertir el objeto en una cadena JSON + console.log(jsonTrecerPilar); + console.log(this.httpOptions); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/update', jsonTrecerPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/tercerPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.editarTercerPilarForm.controls['select-ciudad'].reset(); + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + + return response + } +} \ No newline at end of file diff --git a/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.css b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.html b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.html new file mode 100644 index 000000000..3489cdfc5 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.html @@ -0,0 +1,99 @@ +
+
+
+
+
+
+

Nuevo tercer pilar

+
+ +
+
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.spec.ts b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.spec.ts new file mode 100644 index 000000000..faf45c975 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { NuevoTercerPilarComponent } from './nuevoTercerPilar.component'; + +describe('NuevoTercerPilarComponent', () => { + let component: NuevoTercerPilarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NuevoTercerPilarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NuevoTercerPilarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.ts b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.ts new file mode 100644 index 000000000..cbbc3c386 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/nuevoTercerPilar/nuevoTercerPilar.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-nuevoTercerPilar', + templateUrl: './nuevoTercerPilar.component.html', + styleUrls: ['./nuevoTercerPilar.component.css'] +}) +export class NuevoTercerPilarComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog,) {} + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newPilar(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newPilar() { + const fecha = (document.getElementById("fecha") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const fechaCreacion = fechaObjeto.toISOString(); + const numRegiones = (document.getElementById('numRegiones')).value; + const numDiocesisEstablecidas = (document.getElementById('numDiocesisEstablecidas')).value; + const numDiocesisContacto = (document.getElementById('numDiocesisContacto')).value; + const numDiocesisExpansion = (document.getElementById('numDiocesisExpansion')).value; + const numDiocesisEclisiastica = (document.getElementById('numDiocesisEclisiastica')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const newTercerPilar = { + fechaCreacion, + numRegiones, + numDiocesisEstablecidas, + numDiocesisContacto, + numDiocesisExpansion, + numDiocesisEclisiastica, + ciudad: { + id: ciudadSeleccionada + }, + }; + + const jsonSegundoPilar = JSON.stringify(newTercerPilar); // Convertir el objeto en una cadena JSON + console.log(jsonSegundoPilar); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/create', jsonSegundoPilar, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/tercerPilarGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } +} diff --git a/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.css b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.css new file mode 100644 index 000000000..bec64574a --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.css @@ -0,0 +1,54 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .boton-rojo2{ + background-color: #ff0000; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + + } + + .pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; + } + + .pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; + } + + .table-responsive.table-full-width th { + color: black; + font-weight: bold; + } \ No newline at end of file diff --git a/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.html b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.html new file mode 100644 index 000000000..54c2a3009 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.html @@ -0,0 +1,105 @@ +
+
+
+
+
+
+
+
+

Tercer pilar: El fin de semana

+
+
+ +
+
+
+
+
+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
Fecha#Regiones#Diócesis Establecidas#Diócesis de Contacto#Diócesis de ExpansionAcciones
{{row.fechaCreacion}}{{row.numRegiones}}{{row.numDiocesisEstablecidas}}{{row.numDiocesisContacto}}{{row.numDiocesisExpansion}} + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + +
NombreRealizadoProyectado
{{row.key}}{{row.value}} +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.spec.ts b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.spec.ts new file mode 100644 index 000000000..5360d1d4a --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { TercerPilarGridComponent } from './tercerPilarGrid.component'; + +describe('TercerPilarGridComponent', () => { + let component: TercerPilarGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TercerPilarGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TercerPilarGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.ts b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.ts new file mode 100644 index 000000000..65b4b6790 --- /dev/null +++ b/src/app/pilares/tercerPilarGrid/tercerPilarGrid.component.ts @@ -0,0 +1,305 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import * as XLSX from 'xlsx'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-tercerPilarGrid', + templateUrl: './tercerPilarGrid.component.html', + styleUrls: ['./tercerPilarGrid.component.css'] +}) + +export class TercerPilarGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + currentPage = 1; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + this.tableData2 = { headerRow: [], dataRows: [] }; + } + + ngOnInit() { + + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + if (responseData) { + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + return { + id: item.id, + numDiocesisContacto : item.numDiocesisContacto, + numDiocesisEclisiastica : item.numDiocesisEclisiastica, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numDiocesisEstablecidas: item.numDiocesisEstablecidas, + numDiocesisExpansion: item.numDiocesisExpansion, + numRegiones: item.numDiocesisExpansion, + } + }); + + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + } + + const responseData2 = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData2.slice(0, 5).map(item => { + return { + key: item.key, + value : item.value, + } + }); + + }); + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + return { + id: item.id, + numDiocesisContacto : item.numDiocesisContacto, + numDiocesisEclisiastica : item.numDiocesisEclisiastica, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numDiocesisEstablecidas: item.numDiocesisEstablecidas, + numDiocesisExpansion: item.numDiocesisExpansion, + numRegiones: item.numDiocesisExpansion + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + editRow(row) { + const elementId = row.id; + console.log(elementId); + this.router.navigate(['/editarTercerPilar', elementId]); + + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + console.log(this.httpOptions); + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/delete?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + + // Actualizar la tabla llamando la función getTableData() + this.getTableData(); + this.getTableData2(); + this.setCurrentPage(1); + }); + } + + public getTableData() { + let userId = localStorage.getItem('userId'); + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id: item.id, + numDiocesisContacto : item.numDiocesisContacto, + numDiocesisEclisiastica : item.numDiocesisEclisiastica, + fechaCreacion: new Date(new Date(item.fechaCreacion).getTime() + 86400000).toLocaleDateString('es-ES', {year: 'numeric', month: '2-digit', day: '2-digit'}).split('/').join('-'), + numDiocesisEstablecidas: item.numDiocesisEstablecidas, + numDiocesisExpansion: item.numDiocesisExpansion, + numRegiones: item.numDiocesisExpansion + } + }); + + this.data = responseData; + }); + } + + public getTableData2() { + let userId = localStorage.getItem('userId'); + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/primerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(response => { + console.log(response); // ver los datos obtenidos en la consola + const responseData = response['totalResponse']; // acceder al array 'response' dentro de la respuesta + this.tableData2.dataRows = responseData.map(item => { + return { + key: item.key, + value : item.value, + } + }); + + this.data = responseData; + }); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDownloadDialogComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.generateExcel(); + } + }) + } + // Función para generar el archivo Excel + generateExcel() { + let userId = localStorage.getItem('userId'); + + // Realizar la consulta y obtener los datos en un arreglo + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/pilar/tercerPilar/getAll?id=${userId}`, this.httpOptions) + .subscribe(data => { + const rows = []; + + // Agregar los encabezados como primera fila + const headers = [ + 'ID' , + 'Número de diócesis de contacto', + 'Número de diócesis eclesiásticas', + 'Fecha de creación', + 'Número de diócesis establecidas', + 'Número de diócesis en expansión', + 'Número de regiones' + ] + rows.push(headers); + console.log(data) + const responseData = data['response']; // acceder al array 'response' dentro de la respuesta + + responseData.forEach(item => { + const row = [ + item.id, + item.numDiocesisContacto, + item.numDiocesisEclisiastica, + new Date(item.fechaCreacion).toLocaleDateString('es-ES'), + item.numDiocesisEstablecidas, + item.numDiocesisExpansion, + item.numRegiones + ]; + rows.push(row); + }); + // Crear una nueva hoja de cálculo de Excel + const worksheet = XLSX.utils.aoa_to_sheet(rows); + + // Crear un libro de Excel y agregar la hoja de cálculo + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1'); + + // Convertir el libro de Excel a un archivo binario y descargarlo + const file = XLSX.write(workbook, { type: 'binary', bookType: 'xlsx' }); + const blob = new Blob([this.s2ab(file)], { type: 'application/octet-stream' }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = 'TercerPilar.xlsx'; + link.click(); + }); +} + +// Función para convertir una cadena a un arreglo de bytes +s2ab(s: string) { + const buf = new ArrayBuffer(s.length); + const view = new Uint8Array(buf); + for (let i = 0; i < s.length; i++) { + view[i] = s.charCodeAt(i) & 0xff; + } + return buf; +} +filterByDate(selectedDate: string) { + const selectedDateObj = new Date(selectedDate); + const selectedYear = selectedDateObj.getFullYear(); + const selectedMonth = selectedDateObj.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const selectedDay = selectedDateObj.getDate(); + + const filteredData = this.data.filter(item => { + const itemDate = new Date(item.fechaCreacion); + const itemYear = itemDate.getFullYear(); + const itemMonth = itemDate.getMonth() + 1; // Los meses en JavaScript van de 0 a 11 + const itemDay = itemDate.getDate(); + + return itemYear === selectedYear && itemMonth === selectedMonth && itemDay === selectedDay; + }); + + this.totalPages = Math.ceil(filteredData.length / this.pageSize); // Actualizar el número total de páginas + + // Verificar si la página actual es mayor al nuevo número total de páginas y ajustarla si es necesario + if (this.currentPage > this.totalPages) { + this.currentPage = this.totalPages; + } + + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + + this.tableData1.dataRows = filteredData.slice(start, end).map(item => { + const fechaCreacion = new Date(item.fechaCreacion); + fechaCreacion.setDate(fechaCreacion.getDate() + 1); + + return { + + id: item.id, + numDiocesisContacto : item.numDiocesisContacto, + numDiocesisEclisiastica : item.numDiocesisEclisiastica, + fechaCreacion: fechaCreacion + .toLocaleDateString('es-ES', { year: 'numeric', month: '2-digit', day: '2-digit' }) + .split('/') + .join('-'), numDiocesisEstablecidas: item.numDiocesisEstablecidas, + numDiocesisExpansion: item.numDiocesisExpansion, + numRegiones: item.numDiocesisExpansion, + + + }; + }); +} + + +} diff --git a/src/app/register/register.component.css b/src/app/register/register.component.css new file mode 100644 index 000000000..526c216a5 --- /dev/null +++ b/src/app/register/register.component.css @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } \ No newline at end of file diff --git a/src/app/register/register.component.html b/src/app/register/register.component.html new file mode 100644 index 000000000..4ece49096 --- /dev/null +++ b/src/app/register/register.component.html @@ -0,0 +1,130 @@ + + +
+
+

Register

+ + + + +
+
+ diff --git a/src/app/register/register.component.spec.ts b/src/app/register/register.component.spec.ts new file mode 100644 index 000000000..2a64098d1 --- /dev/null +++ b/src/app/register/register.component.spec.ts @@ -0,0 +1,27 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { RegisterComponent } from './register.component'; + +describe('RegisterComponent', () => { + let component: RegisterComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RegisterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegisterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/register/register.component.ts b/src/app/register/register.component.ts new file mode 100644 index 000000000..cd0be3bee --- /dev/null +++ b/src/app/register/register.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-register', + templateUrl: './register.component.html', + styleUrls: ['./register.component.css'] +}) +export class RegisterComponent implements OnInit { + + email: string; + password: string; + confirmPassword: string; + + constructor() {} + + register() { + + } + ngOnInit() { + } + +} diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts new file mode 100644 index 000000000..f9d3287a6 --- /dev/null +++ b/src/app/services/auth.service.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, throwError, of } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; +import { Router } from '@angular/router'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfimLoginErrorComponent } from 'app/shared/confim-login-error/confim-login-error.component'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + private baseUrl = 'https://encuentro-matrimonial-backend.herokuapp.com'; + public isAuthenticated = false; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + openDialogCredenciales():void{ + const dialogRef = this.dialog.open(ConfimLoginErrorComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + login(username: string, password: string) { + return this.http.post(`${this.baseUrl}/login`, { username, password }).pipe( + map(response => { + // Guardar el token en local storage + if (response.code == "401"){ + this.openDialogCredenciales(); + }else { + this.router.navigate(['/dashboard']); + + } + localStorage.setItem('jwt', response.jwt); + localStorage.setItem('userId', response.usuario.id); + localStorage.setItem('rolId', response.usuario.roles[0].id); + console.log(response.usuario.roles[0].id); + // Establecer isAuthenticated en true + this.isAuthenticated = true; + return this.isAuthenticated; + }), + catchError(error => { + if (error.status === 401) { + this.isAuthenticated = false; + return of(this.isAuthenticated); + } + return throwError(error); + }) + ) + } +} + + // Resto de métodos de la clase AuthService + \ No newline at end of file diff --git a/src/app/shared/confim-login-error/confim-login-error.component.html b/src/app/shared/confim-login-error/confim-login-error.component.html new file mode 100644 index 000000000..4c9d5d3ee --- /dev/null +++ b/src/app/shared/confim-login-error/confim-login-error.component.html @@ -0,0 +1,7 @@ +
{{message}}
+

+
Credenciales incorrectas, por favor validar.
+

+
+
+
diff --git a/src/app/shared/confim-login-error/confim-login-error.component.scss b/src/app/shared/confim-login-error/confim-login-error.component.scss new file mode 100644 index 000000000..27a8d8f4e --- /dev/null +++ b/src/app/shared/confim-login-error/confim-login-error.component.scss @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } \ No newline at end of file diff --git a/src/app/shared/confim-login-error/confim-login-error.component.spec.ts b/src/app/shared/confim-login-error/confim-login-error.component.spec.ts new file mode 100644 index 000000000..161ed714b --- /dev/null +++ b/src/app/shared/confim-login-error/confim-login-error.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfimLoginErrorComponent } from './confim-login-error.component'; + +describe('ConfimLoginErrorComponent', () => { + let component: ConfimLoginErrorComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ConfimLoginErrorComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ConfimLoginErrorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/confim-login-error/confim-login-error.component.ts b/src/app/shared/confim-login-error/confim-login-error.component.ts new file mode 100644 index 000000000..eba0c6f72 --- /dev/null +++ b/src/app/shared/confim-login-error/confim-login-error.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, Inject, INJECTOR } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confim-login-error', + templateUrl: './confim-login-error.component.html', + styleUrls: ['./confim-login-error.component.scss'] +}) +export class ConfimLoginErrorComponent implements OnInit { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public message: string) { } + + ngOnInit(): void { + } + + + onClickNo(): void { + this.dialogRef.close(); + + } +} diff --git a/src/app/shared/confirm-creation/confirm-creation.component.html b/src/app/shared/confirm-creation/confirm-creation.component.html new file mode 100644 index 000000000..7c1266c73 --- /dev/null +++ b/src/app/shared/confirm-creation/confirm-creation.component.html @@ -0,0 +1,7 @@ +
{{message}}
+

+
Accion realizada correctamente.
+

+
+
+
diff --git a/src/app/shared/confirm-creation/confirm-creation.component.scss b/src/app/shared/confirm-creation/confirm-creation.component.scss new file mode 100644 index 000000000..27a8d8f4e --- /dev/null +++ b/src/app/shared/confirm-creation/confirm-creation.component.scss @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } \ No newline at end of file diff --git a/src/app/shared/confirm-creation/confirm-creation.component.spec.ts b/src/app/shared/confirm-creation/confirm-creation.component.spec.ts new file mode 100644 index 000000000..397006c90 --- /dev/null +++ b/src/app/shared/confirm-creation/confirm-creation.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmCreationComponent } from './confirm-creation.component'; + +describe('ConfirmCreationComponent', () => { + let component: ConfirmCreationComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ConfirmCreationComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ConfirmCreationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/confirm-creation/confirm-creation.component.ts b/src/app/shared/confirm-creation/confirm-creation.component.ts new file mode 100644 index 000000000..d96c85e32 --- /dev/null +++ b/src/app/shared/confirm-creation/confirm-creation.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, Inject, INJECTOR } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confirm-creation', + templateUrl: './confirm-creation.component.html', + styleUrls: ['./confirm-creation.component.scss'] +}) +export class ConfirmCreationComponent implements OnInit { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public message: string) { } + + ngOnInit(): void { + } + + onClickNo(): void { + this.dialogRef.close(); + + } + +} diff --git a/src/app/shared/confirm-delete/confirm-delete.component.html b/src/app/shared/confirm-delete/confirm-delete.component.html new file mode 100644 index 000000000..d14d89b47 --- /dev/null +++ b/src/app/shared/confirm-delete/confirm-delete.component.html @@ -0,0 +1,9 @@ +
{{message}}
+

+
¿Deseas eliminar este elemento?
+

+
+
+

 

+
+
diff --git a/src/app/shared/confirm-delete/confirm-delete.component.scss b/src/app/shared/confirm-delete/confirm-delete.component.scss new file mode 100644 index 000000000..27a8d8f4e --- /dev/null +++ b/src/app/shared/confirm-delete/confirm-delete.component.scss @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } \ No newline at end of file diff --git a/src/app/shared/confirm-delete/confirm-delete.component.spec.ts b/src/app/shared/confirm-delete/confirm-delete.component.spec.ts new file mode 100644 index 000000000..b0e681eb9 --- /dev/null +++ b/src/app/shared/confirm-delete/confirm-delete.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmDeleteComponent } from './confirm-delete.component'; + +describe('ConfirmDeleteComponent', () => { + let component: ConfirmDeleteComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ConfirmDeleteComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ConfirmDeleteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/confirm-delete/confirm-delete.component.ts b/src/app/shared/confirm-delete/confirm-delete.component.ts new file mode 100644 index 000000000..c050994e6 --- /dev/null +++ b/src/app/shared/confirm-delete/confirm-delete.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit, Inject, INJECTOR } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confirm-delete', + templateUrl: './confirm-delete.component.html', + styleUrls: ['./confirm-delete.component.scss'] +}) +export class ConfirmDeleteComponent implements OnInit { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public message: string) { } + + ngOnInit(): void { + } + + onClickNo(): void { + this.dialogRef.close(); + + } +} diff --git a/src/app/shared/confirm-dialog/confirm-dialog.component.html b/src/app/shared/confirm-dialog/confirm-dialog.component.html new file mode 100644 index 000000000..22ddba088 --- /dev/null +++ b/src/app/shared/confirm-dialog/confirm-dialog.component.html @@ -0,0 +1,9 @@ +
{{message}}
+

+
Si creas este registro, este sera visible para los demas miembros de la organización.
+

+
+
+

 

+
+
diff --git a/src/app/shared/confirm-dialog/confirm-dialog.component.scss b/src/app/shared/confirm-dialog/confirm-dialog.component.scss new file mode 100644 index 000000000..e3dbc0e7a --- /dev/null +++ b/src/app/shared/confirm-dialog/confirm-dialog.component.scss @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } \ No newline at end of file diff --git a/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts b/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts new file mode 100644 index 000000000..22434c50d --- /dev/null +++ b/src/app/shared/confirm-dialog/confirm-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmDialogComponent } from './confirm-dialog.component'; + +describe('ConfirmDialogComponent', () => { + let component: ConfirmDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ConfirmDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ConfirmDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/confirm-dialog/confirm-dialog.component.ts b/src/app/shared/confirm-dialog/confirm-dialog.component.ts new file mode 100644 index 000000000..67e429296 --- /dev/null +++ b/src/app/shared/confirm-dialog/confirm-dialog.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, Inject, INJECTOR } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confirm-dialog', + templateUrl: './confirm-dialog.component.html', + styleUrls: ['./confirm-dialog.component.scss'] +}) +export class ConfirmDialogComponent implements OnInit { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public message: string) { } + + ngOnInit(): void { + } + + onClickNo(): void { + this.dialogRef.close(); + + } + +} diff --git a/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.html b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.html new file mode 100644 index 000000000..a037ff39f --- /dev/null +++ b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.html @@ -0,0 +1,8 @@ +
{{message}}
+

+
Su archivo será descargado en un momento
+

+
+
+ +
\ No newline at end of file diff --git a/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.scss b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.scss new file mode 100644 index 000000000..27a8d8f4e --- /dev/null +++ b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.scss @@ -0,0 +1,18 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } + .boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 1px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 100%; + } \ No newline at end of file diff --git a/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.spec.ts b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.spec.ts new file mode 100644 index 000000000..7cfdbb2de --- /dev/null +++ b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmDownloadDialogComponent } from './confirm-download-dialog.component'; + +describe('ConfirmDownloadDialogComponent', () => { + let component: ConfirmDownloadDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ConfirmDownloadDialogComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ConfirmDownloadDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.ts b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.ts new file mode 100644 index 000000000..d97f53b0d --- /dev/null +++ b/src/app/shared/confirm-download-dialog/confirm-download-dialog.component.ts @@ -0,0 +1,22 @@ + +import { Component, OnInit, Inject, INJECTOR } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; + +@Component({ + selector: 'app-confirm-download-dialog', + templateUrl: './confirm-download-dialog.component.html', + styleUrls: ['./confirm-download-dialog.component.scss'] +}) +export class ConfirmDownloadDialogComponent implements OnInit { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public message: string) { } + + ngOnInit(): void { + } + + onClickNo(): void { + this.dialogRef.close(); + + } + +} diff --git a/src/app/shared/footer/footer.component.html b/src/app/shared/footer/footer.component.html index 12fe1788b..75f34ec89 100644 --- a/src/app/shared/footer/footer.component.html +++ b/src/app/shared/footer/footer.component.html @@ -1,31 +1,5 @@ diff --git a/src/app/shared/navbar/navbar.component.html b/src/app/shared/navbar/navbar.component.html index 6a5aca258..7ea88cac7 100644 --- a/src/app/shared/navbar/navbar.component.html +++ b/src/app/shared/navbar/navbar.component.html @@ -10,67 +10,7 @@ {{getTitle()}}
diff --git a/src/app/sidebar/sidebar.component.css b/src/app/sidebar/sidebar.component.css new file mode 100644 index 000000000..0f0c6bdf3 --- /dev/null +++ b/src/app/sidebar/sidebar.component.css @@ -0,0 +1,25 @@ +/* Dropdown Content (Hidden by Default) */ +.dropdown-content { + display: none; + position: absolute; + margin-left: 12%; + background-color: #f1f1f1; + width: 200px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; + padding-bottom:12px; + } + + /* Links inside the dropdown */ + .dropdown-content a { + color: black; + text-decoration: none; + display: block; + font-size: 8px; + } + + /* Change color of dropdown links on hover */ + .dropdown-content a:hover {background-color: #dddddd00;} + + /* Show the dropdown menu on hover */ + .dropdown:hover .dropdown-content {display: block;} \ No newline at end of file diff --git a/src/app/sidebar/sidebar.component.html b/src/app/sidebar/sidebar.component.html index 817b194c6..8d3dbd5ba 100644 --- a/src/app/sidebar/sidebar.component.html +++ b/src/app/sidebar/sidebar.component.html @@ -1,78 +1,22 @@ \ No newline at end of file diff --git a/src/app/sidebar/sidebar.component.ts b/src/app/sidebar/sidebar.component.ts index dec9a9c67..600d4ef43 100644 --- a/src/app/sidebar/sidebar.component.ts +++ b/src/app/sidebar/sidebar.component.ts @@ -1,22 +1,38 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; declare const $: any; declare interface RouteInfo { - path: string; + path?: string; title: string; - icon: string; + icon?: string; class: string; + tooltip?: string; // Tooltip text + type?: 'link' | 'dropDown' | 'icon' | 'separator' | 'extLink'; + sub?: IChildItem[]; } + +interface IChildItem { + path?: string; + title: string; + icon: string; + class: string; + type?: string; + sub?: IChildItem[]; +} + export const ROUTES: RouteInfo[] = [ - { path: '/dashboard', title: 'Dashboard', icon: 'pe-7s-graph', class: '' }, - { path: '/user', title: 'User Profile', icon:'pe-7s-user', class: '' }, - { path: '/table', title: 'Table List', icon:'pe-7s-note2', class: '' }, - { path: '/typography', title: 'Typography', icon:'pe-7s-news-paper', class: '' }, - { path: '/icons', title: 'Icons', icon:'pe-7s-science', class: '' }, - { path: '/maps', title: 'Maps', icon:'pe-7s-map-marker', class: '' }, - { path: '/notifications', title: 'Notifications', icon:'pe-7s-bell', class: '' }, - { path: '/upgrade', title: 'Upgrade to PRO', icon:'pe-7s-rocket', class: 'active-pro' }, -]; + { path: '/usuariosGrid', title: 'Lista usuarios', icon:'pe-7s-add-user', class: '', type:'link' }, + { path: '/primerPilarGrid', title: 'Pilares', icon:'', class: '', type:'link', }, + { path: '/primerPilarGrid', title: 'Primer pilar', icon:'pe-7s-plugin', class: '', type:'link' }, + { path: '/segundoPilarGrid', title: 'Segundo pilar', icon:'pe-7s-plugin', class: '', type:'link' }, + { path: '/tercerPilarGrid', title: 'Tercer pilar', icon:'pe-7s-plugin', class: '', type:'link' }, + { path: '/cuartoPilarGrid', title: 'Cuarto pilar', icon:'pe-7s-plugin', class: '', type:'link' }, + { path: '/matrimoniosGrid', title: 'Formación', icon:'', class: '', type:'link' }, + { path: '/matrimoniosGrid', title: 'Matrimonios', icon:'pe-7s-leaf', class: '', type:'link' }, + { path: '/sacerdotesGrid', title: 'Sacerdotes', icon:'pe-7s-id', class: '', type:'link' }, + { path: '/login', title: 'Cerrar sesión', icon:'pe-7s-power', class: '', type:'link' }, + ] @Component({ selector: 'app-sidebar', @@ -24,6 +40,7 @@ export const ROUTES: RouteInfo[] = [ }) export class SidebarComponent implements OnInit { menuItems: any[]; + openSidebar: boolean = true; constructor() { } diff --git a/src/app/sidebar/sidebar.module.ts b/src/app/sidebar/sidebar.module.ts index 4db88fa7a..dfc21e8aa 100644 --- a/src/app/sidebar/sidebar.module.ts +++ b/src/app/sidebar/sidebar.module.ts @@ -7,6 +7,7 @@ import { SidebarComponent } from './sidebar.component'; imports: [ RouterModule, CommonModule ], declarations: [ SidebarComponent ], exports: [ SidebarComponent ] + }) export class SidebarModule {} diff --git a/src/app/styles.css b/src/app/styles.css new file mode 100644 index 000000000..b65fdb43f --- /dev/null +++ b/src/app/styles.css @@ -0,0 +1,54 @@ + +* { + box-sizing: border-box; + } + html, + body { + background: #ecf0f3; + } + h1 { + margin: 0; + padding: 0; + } + .custom-form { + min-width: 300px; + max-width: 60%; + margin: 0px auto; + background: rgba(255, 255, 255, 0.15); + padding: 2rem 3rem; + margin: auto; + border-radius: 2.5rem; + background-color: #ecf0f3; + box-shadow: 13px 13px 20px #cbced1, -13px -13px 20px #ffffff; + color: black; + margin-top: 10rem; + } + .custom-form input { + display: block; + margin: 2rem 0; + width: 100%; + border-radius: 0.5rem; + padding: 1rem; + border: none; + box-shadow: inset -5px -5px 15px rgba(255, 255, 255, 0.8), inset 5px 5px 10px + rgba(0, 0, 0, 0.1); + border: 0 none; + background: #ebf5fc; + } + .custom-form button { + text-transform: uppercase; + letter-spacing: 0.15em; + border: none; + font-size: 0.875rem; + color: #ffffff; + font-weight: bold; + background-color: #bcd8c1; + width: 100%; + display: block; + padding: 0.875rem 1rem; + border-radius: 1.5rem; + box-shadow: 3px 3px 8px #b1b1b1, -3px -3px 8px #ffffff; + cursor: pointer; + } + + @import "@angular/material/prebuilt-themes/indigo-pink.css" \ No newline at end of file diff --git a/src/app/tables/tables.component.html b/src/app/tables/tables.component.html index e596186b5..28772e5ec 100644 --- a/src/app/tables/tables.component.html +++ b/src/app/tables/tables.component.html @@ -4,8 +4,27 @@
-

Striped Table with Hover

-

Here is a subtitle for this table

+

Primer pilar: El fin de semana Descargar base

+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
@@ -24,28 +43,7 @@

Striped Table with Hover

-
-
-
-

Table on Plain Background

-

Here is a subtitle for this table

-
-
-
- - - - - - - - - - -
{{ cell }}
{{cell}}
-
-
-
+
diff --git a/src/app/typography/typography.component.html b/src/app/typography/typography.component.html deleted file mode 100644 index 7d6d835cd..000000000 --- a/src/app/typography/typography.component.html +++ /dev/null @@ -1,82 +0,0 @@ -
-
-
-
-
-
-

Light Bootstrap Table Heading

-

Created using Roboto Font Family

-
-
- -
-

Header 1

Light Bootstrap Table Heading

-
- -
-

Header 2

Light Bootstrap Table Heading

-
-
-

Header 3

Light Bootstrap Table Heading

-
-
-

Header 4

Light Bootstrap Table Heading

-
-
-

Header 5

Light Bootstrap Table Heading
-
-
-

Header 6

Light Bootstrap Table Heading
-
-
-

ParagraphLorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.

-
-
-

Quote

-
-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam. -

- - Steve Jobs, CEO Apple - -
-
- -
-

Muted Text

-

- Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet. -

-
-
- -

Coloured Text -

-

- Text Primary - Light Bootstrap Table Heading and complex bootstrap dashboard you've ever seen on the internet. -

-

- Text Info - Light Bootstrap Table Heading and complex bootstrap dashboard you've ever seen on the internet. -

-

- Text Success - Light Bootstrap Table Heading and complex bootstrap dashboard you've ever seen on the internet. -

-

- Text Warning - Light Bootstrap Table Heading and complex bootstrap dashboard you've ever seen on the internet. -

-

- Text Danger - Light Bootstrap Table Heading and complex bootstrap dashboard you've ever seen on the internet. -

-
-
-

Small Tag

Header with small subtitle
".small" is a tag for the headers

-
-
-
-
-
-
-
diff --git a/src/app/typography/typography.component.ts b/src/app/typography/typography.component.ts deleted file mode 100644 index b2439d662..000000000 --- a/src/app/typography/typography.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-typography', - templateUrl: './typography.component.html', - styleUrls: ['./typography.component.css'] -}) -export class TypographyComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/src/app/upgrade/upgrade.component.css b/src/app/upgrade/upgrade.component.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/upgrade/upgrade.component.html b/src/app/upgrade/upgrade.component.html deleted file mode 100644 index cd5be50ce..000000000 --- a/src/app/upgrade/upgrade.component.html +++ /dev/null @@ -1,83 +0,0 @@ -
-
-
-
-
-
-

Light Bootstrap Dashboard PRO Angular

-

Looking for more components? Please check our Premium Version of Light Bootstrap Dashboard Angular.

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FreePRO
Components16115+
Plugins414+
Example Pages422+
Documentation - - - -
SASS Files
Login/Register/Lock Pages
Premium Support
FreeJust $49
- Current Version - - Upgrade to PRO -
- -
-
-
-
- -
-
diff --git a/src/app/upgrade/upgrade.component.ts b/src/app/upgrade/upgrade.component.ts deleted file mode 100644 index 661f4cba0..000000000 --- a/src/app/upgrade/upgrade.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-upgrade', - templateUrl: './upgrade.component.html', - styleUrls: ['./upgrade.component.css'] -}) -export class UpgradeComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/src/app/typography/typography.component.css b/src/app/user tables/tables.component.css similarity index 100% rename from src/app/typography/typography.component.css rename to src/app/user tables/tables.component.css diff --git a/src/app/user tables/tables.component.html b/src/app/user tables/tables.component.html new file mode 100644 index 000000000..98c7a5422 --- /dev/null +++ b/src/app/user tables/tables.component.html @@ -0,0 +1,51 @@ +
+
+
+
+
+
+ +

Primer pilar: El fin de semana Descargar base

+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + +
{{ cell }}
{{cell}}
+ +
+
+
+ +
+
+
diff --git a/src/app/tables/tables.component.spec.ts b/src/app/user tables/tables.component.spec.ts similarity index 100% rename from src/app/tables/tables.component.spec.ts rename to src/app/user tables/tables.component.spec.ts diff --git a/src/app/tables/tables.component.ts b/src/app/user tables/tables.component.ts similarity index 64% rename from src/app/tables/tables.component.ts rename to src/app/user tables/tables.component.ts index f0f41c064..6bd6a384b 100644 --- a/src/app/tables/tables.component.ts +++ b/src/app/user tables/tables.component.ts @@ -8,7 +8,8 @@ declare interface TableData { @Component({ selector: 'app-tables', templateUrl: './tables.component.html', - styleUrls: ['./tables.component.css'] + styleUrls: ['./tables.component.css'] + }) export class TablesComponent implements OnInit { public tableData1: TableData; @@ -18,14 +19,18 @@ export class TablesComponent implements OnInit { ngOnInit() { this.tableData1 = { - headerRow: [ 'ID', 'Name', 'Country', 'City', 'Salary'], + headerRow: [ 'Fecha', '#FDS', '#Matrimonios', '#Sacerdotes', '#Religiosos', '#Religiosas'], dataRows: [ - ['1', 'Dakota Rice', 'Niger', 'Oud-Turnhout', '$36,738'], - ['2', 'Minerva Hooper', 'Curaçao', 'Sinaai-Waas', '$23,789'], - ['3', 'Sage Rodriguez', 'Netherlands', 'Baileux', '$56,142'], - ['4', 'Philip Chaney', 'Korea, South', 'Overland Park', '$38,735'], - ['5', 'Doris Greene', 'Malawi', 'Feldkirchen in Kärnten', '$63,542'], - ['6', 'Mason Porter', 'Chile', 'Gloucester', '$78,615'] + ['00/0000', '110', '1', '1', '1', '2'], + ['00/0000', '210', '2', '2', '3', '3'], + ['00/0000', '410', '3', '3', '4', '4'], + ['00/0000', '500', '4', '5', '2', '5'], + ['00/0000', '610', '1', '3', '1', '3'], + ['00/0000', '810', '3', '1', '3', '4'], + ['00/0000', '910', '4', '1', '1', '5'], + ['00/0000', '718', '5', '3', '2', '1'] + + ] }; this.tableData2 = { diff --git a/src/app/user/user.component.css b/src/app/user/user.component.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/user/user.component.ts b/src/app/user/user.component.ts deleted file mode 100644 index 204ccd28e..000000000 --- a/src/app/user/user.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-user', - templateUrl: './user.component.html', - styleUrls: ['./user.component.css'] -}) -export class UserComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/src/app/usuarios/usuariosCrear/usuarios.component.css b/src/app/usuarios/usuariosCrear/usuarios.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/usuarios/usuariosCrear/usuarios.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/usuarios/usuariosCrear/usuarios.component.html b/src/app/usuarios/usuariosCrear/usuarios.component.html new file mode 100644 index 000000000..22be53dd2 --- /dev/null +++ b/src/app/usuarios/usuariosCrear/usuarios.component.html @@ -0,0 +1,103 @@ +
+
+
+
+
+
+

Crear Usuario

+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
diff --git a/src/app/user/user.component.spec.ts b/src/app/usuarios/usuariosCrear/usuarios.component.spec.ts similarity index 63% rename from src/app/user/user.component.spec.ts rename to src/app/usuarios/usuariosCrear/usuarios.component.spec.ts index ccba791de..1f93c412a 100644 --- a/src/app/user/user.component.spec.ts +++ b/src/app/usuarios/usuariosCrear/usuarios.component.spec.ts @@ -3,21 +3,21 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; -import { UserComponent } from './user.component'; +import { UsuariosComponent } from './usuarios.component'; -describe('UserComponent', () => { - let component: UserComponent; - let fixture: ComponentFixture; +describe('UsuariosComponent', () => { + let component: UsuariosComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ UserComponent ] + declarations: [ UsuariosComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(UserComponent); + fixture = TestBed.createComponent(UsuariosComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/usuarios/usuariosCrear/usuarios.component.ts b/src/app/usuarios/usuariosCrear/usuarios.component.ts new file mode 100644 index 000000000..ec23572e3 --- /dev/null +++ b/src/app/usuarios/usuariosCrear/usuarios.component.ts @@ -0,0 +1,178 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-usuarios', + templateUrl: './usuarios.component.html', + styleUrls: ['./usuarios.component.css'] +}) +export class UsuariosComponent implements OnInit { + + httpOptions: any; + token: any; + ciudades: any[]; + paises: any[]; + selectedCiudad: string; + selectedPais: string; + roles: any[] = []; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) {} + + ngOnInit() { + let token = localStorage.getItem('jwt'); + console.log(token); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + // Obtener los datos de roles + this.obtenerDatosRol().subscribe((data) => { + this.roles = data.response; + }); + // Obtener los datos del país + this.obtenerDatosPais().subscribe((data) => { + // Obtener la respuesta del JSON + const response = data.response; + // Obtener el select del HTML + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + // Crear un option por cada país en la respuesta del JSON + response.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + }); + } + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + this.newUsuario(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + newUsuario() { + const currentDate = new Date(); + + const name = (document.getElementById('name')).value; + const lastname = (document.getElementById('lastname')).value; + const username = (document.getElementById('nombreUsuario')).value; + const password = (document.getElementById('password')).value; + const doc = (document.getElementById('document')).value; + currentDate.setDate(currentDate.getDate() - 1); + const creationDate = currentDate.toISOString(); + const state = true; + const selectRol = document.getElementById('select-rol') as HTMLSelectElement; + const rolSelecionado = selectRol.value;; + const email = (document.getElementById('email')).value; + const telefono = (document.getElementById('telefono')).value; + const ciudadSeleccionada = (document.getElementById('select-ciudad')).value; + + const jsonUsuario = { + name, + lastname, + username, + password, + document: doc, + creationDate, + state, + email, + telefono, + ciudad: { + id: ciudadSeleccionada + }, + roles: [{ + id: rolSelecionado, + }] + }; + + const nuevoUsuario = JSON.stringify(jsonUsuario); // Convertir el objeto en una cadena JSON + console.log(nuevoUsuario); + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/user/createUsuario', nuevoUsuario, this.httpOptions) + .subscribe(data => { + console.log(data); + this.openDialogConfirm(); + this.router.navigate(['/usuariosGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + console.log('httpOptions no está definido'); + } + } + + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + // Limpiar el select de ciudades + selectCiudad.innerHTML = ''; + + // Crear un option por cada ciudad en la respuesta del JSON + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + }); + } + + obtenerDatosCiudad(id: string) { + const params = { id: id }; + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + return this.http.get(url, this.httpOptions); + } + + obtenerDatosRol(): Observable { + console.log(this.token); + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/rol/getRoles?id=${userId}`; + return this.http.get(url, this.httpOptions); + } + + +} diff --git a/src/app/usuarios/usuariosEditar/usuariosEditar.component.css b/src/app/usuarios/usuariosEditar/usuariosEditar.component.css new file mode 100644 index 000000000..53d51aa1c --- /dev/null +++ b/src/app/usuarios/usuariosEditar/usuariosEditar.component.css @@ -0,0 +1,21 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + .letra{ + color: black; + } \ No newline at end of file diff --git a/src/app/usuarios/usuariosEditar/usuariosEditar.component.html b/src/app/usuarios/usuariosEditar/usuariosEditar.component.html new file mode 100644 index 000000000..fedfe8fe1 --- /dev/null +++ b/src/app/usuarios/usuariosEditar/usuariosEditar.component.html @@ -0,0 +1,120 @@ + +
+
+
+
+
+
+

Editar Usuario

+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
diff --git a/src/app/usuarios/usuariosEditar/usuariosEditar.component.spec.ts b/src/app/usuarios/usuariosEditar/usuariosEditar.component.spec.ts new file mode 100644 index 000000000..0ae58b96e --- /dev/null +++ b/src/app/usuarios/usuariosEditar/usuariosEditar.component.spec.ts @@ -0,0 +1,26 @@ +/* tslint:disable:no-unused-variable */ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { UsuariosEditarComponent } from './usuariosEditar.component'; + +describe('UsuariosEditarComponent', () => { + let component: UsuariosEditarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UsuariosEditarComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UsuariosEditarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/usuarios/usuariosEditar/usuariosEditar.component.ts b/src/app/usuarios/usuariosEditar/usuariosEditar.component.ts new file mode 100644 index 000000000..79a907a9d --- /dev/null +++ b/src/app/usuarios/usuariosEditar/usuariosEditar.component.ts @@ -0,0 +1,276 @@ +import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { Observable, catchError, map } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { FormBuilder, FormGroup, Validators} from '@angular/forms'; +import { DatePipe } from '@angular/common'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDialogComponent } from 'app/shared/confirm-dialog/confirm-dialog.component'; +import { ConfirmCreationComponent } from 'app/shared/confirm-creation/confirm-creation.component'; + + +@Component({ + selector: 'app-usuariosEditar', + templateUrl: './usuariosEditar.component.html', + styleUrls: ['./usuariosEditar.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush + +}) +export class UsuariosEditarComponent implements OnInit { + + usuariosEditarForm: FormGroup; + httpOptions: any; + token: any; + response: any; + datosCargados: boolean; + @ViewChild('fechaInput') fechaInput: ElementRef; + + ciudades: any[]; // Declarar la propiedad 'ciudades' + paises: any[]; // Declarar la propiedad 'paises' + selectedCiudad: string; + selectedPais: string; + data: any; + pais: any; // cambia a tipo any + creationDate: string; + roles: any[] = []; + + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog, + private activatedRoute: ActivatedRoute, private formBuilder: FormBuilder) { + this.usuariosEditarForm = this.formBuilder.group({ + id: [null], + name: [null, Validators.required], + creationDate: [null, Validators.required], + lastname: [null, Validators.required], + username: [null, Validators.required], + password: [null, Validators.required], + document: [null, Validators.required], + state: [null, Validators.required], + email: [null, Validators.required], + telefono: [null, Validators.required], + 'select-rol': ['', Validators.required], + 'select-pais': ['', Validators.required], + 'select-ciudad': ['', Validators.required] + }); + } + ngOnInit() { + + let token = localStorage.getItem('jwt'); + let rolIdString = localStorage.getItem('rolId'); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + const elementId = this.activatedRoute.snapshot.paramMap.get('id'); + + this.obtenerDatosUsuario(elementId).subscribe(data => { + // Asignar los datos del elemento al formulario utilizando setValue() + let fecha = new Date(data.response.creationDate); + fecha.setDate(fecha.getDate() - 1); + let fechaFormateada = fecha.toISOString().substring(0, 10);; + this.usuariosEditarForm.controls['creationDate'].setValue(fechaFormateada); + this.usuariosEditarForm.controls['name'].setValue(data.response.name); + this.usuariosEditarForm.controls['lastname'].setValue(data.response.lastname); + this.usuariosEditarForm.controls['username'].setValue(data.response.username); + this.usuariosEditarForm.controls['password'].setValue(data.response.password); + this.usuariosEditarForm.controls['document'].setValue(data.response.document); + this.usuariosEditarForm.controls['email'].setValue(data.response.email); + this.usuariosEditarForm.controls['telefono'].setValue(data.response.telefono); + + + // Gestion de paises y roles + const pais = data.response.ciudad.pais; + const ciudad = data.response.ciudad; + const rol = data.response.roles[0].id; + + this.usuariosEditarForm.controls['select-pais'].setValue(pais.id); + + this.obtenerDatosPais(pais.id).subscribe((data: any) => { + const paises = data.response; + const selectPais = document.getElementById('select-pais') as HTMLSelectElement; + + selectPais.innerHTML = ''; + + paises.forEach((pais: any) => { + const option = document.createElement('option'); + option.value = pais.id; + option.text = pais.name; + selectPais.appendChild(option); + }); + + // Establecemos el país seleccionado en el select del país + this.usuariosEditarForm.controls['select-pais'].setValue(pais.id); + }); + + this.obtenerDatosCiudad(pais.id).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // Establecemos la ciudad seleccionada en el select de la ciudad + this.usuariosEditarForm.controls['select-ciudad'].setValue(ciudad.id); + }); + + this.obtenerDatosRol().subscribe((data: any) => { + const roles = data.response; + const selectRol = document.getElementById('select-rol') as HTMLSelectElement; + + selectRol.innerHTML = ''; + + roles.forEach((rol: any) => { + const option = document.createElement('option'); + option.value = rol.id; + option.text = rol.name; + selectRol.appendChild(option); + }); + this.usuariosEditarForm.controls['select-rol'].setValue(rol); + }); + + }); + } + obtenerDatosUsuario(id: string): Observable { + const params = { id: id }; + const url = `https://encuentro-matrimonial-backend.herokuapp.com/user/get?id=${params.id}`; + const response = this.http.get(url, this.httpOptions); + return response.pipe( + map((data: any) => { + return data; + }), + catchError(error => { + console.error(error); + throw error; + }) + ); + } + + openDialog():void{ + const dialogRef = this.dialog.open(ConfirmDialogComponent,{ + data: "¿Estás seguro que la informacion ingresada es correcta?" + }); + dialogRef.afterClosed().subscribe(res => { + if(res){ + this.editarUsuario(); + } + }) + } + + openDialogConfirm():void{ + const dialogRef = this.dialog.open(ConfirmCreationComponent,{ + data: "" + }); + + dialogRef.afterClosed().subscribe(res => { + console.log(res); + if(res){ + close; + } + }) + } + + editarUsuario() { + const id = this.activatedRoute.snapshot.paramMap.get('id'); + const name = (document.getElementById('name')).value; + const fecha = (document.getElementById("fechaCreacion") as HTMLInputElement).value; + const fechaObjeto = new Date(fecha); + const creationDate = fechaObjeto.toISOString(); + const lastname = (document.getElementById('lastname')).value; + const username = (document.getElementById('username')).value; + const password = (document.getElementById('password')).value; + const doc = (document.getElementById('document')).value; + const email = (document.getElementById('email')).value; + const telefono = (document.getElementById('telefono')).value; + + const ciudadSeleccionada = parseInt((document.getElementById('select-ciudad')).value, 10); + const state = true; + const rolSeleccionado = parseInt((document.getElementById('select-rol')).value, 10); + + const jsonUsuario = { + id, + name, + lastname, + username, + creationDate, + password, + document: doc, + email, + telefono, + state, + roles: [ + { + id: rolSeleccionado, + } + ], + ciudad: { + id: ciudadSeleccionada + }, + }; + + const nuevoUsuario = JSON.stringify(jsonUsuario); // Convertir el objeto en una cadena JSON + + if (this.httpOptions) { + this.http.post('https://encuentro-matrimonial-backend.herokuapp.com/user/updateUsuario', nuevoUsuario, this.httpOptions) + .subscribe(data => { + this.openDialogConfirm(); + this.router.navigate(['/usuariosGrid']); + }, error => { + console.error(error); + }); + } else { + alert('httpOptions no está definido, intente iniciar sesion nuevamente'); + } + } + onSelectPais(idPais: string) { + this.obtenerDatosCiudad(idPais).subscribe((data: any) => { + const ciudades = data.response; + const selectCiudad = document.getElementById('select-ciudad') as HTMLSelectElement; + + selectCiudad.innerHTML = ''; + + ciudades.forEach((ciudad: any) => { + const option = document.createElement('option'); + option.value = ciudad.id; + option.text = ciudad.name; + selectCiudad.appendChild(option); + }); + selectCiudad.disabled = false; + + // reiniciar el selector de ciudades + this.usuariosEditarForm.controls['select-ciudad'].reset(); + + }); + } + + obtenerDatosCiudad(id: string) { + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getCiudadPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosPais(id: string){ + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/ubicacion/getPaises?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } + + obtenerDatosRol(){ + let userId = localStorage.getItem('userId'); + const url = `https://encuentro-matrimonial-backend.herokuapp.com/rol/getRoles?id=${userId}`; + const response = this.http.get(url, this.httpOptions); + return response + } +} diff --git a/src/app/usuarios/usuariosGrid.component.css b/src/app/usuarios/usuariosGrid.component.css new file mode 100644 index 000000000..b0c37ef55 --- /dev/null +++ b/src/app/usuarios/usuariosGrid.component.css @@ -0,0 +1,61 @@ +.boton-rojo { + background-color: #cd4042; /* color rojo */ + color: #ffffff; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; +} +.boton-gris { + background-color: #cccccc; /* color gris */ + color: #020202; /* color de texto blanco */ + border-radius: 18px; /* bordes redondeados */ + padding: 10px 30px; /* espaciado interno del botón */ + border: none; /* sin borde */ + width: 100%; + max-width: 200px; + } + + .btn-buscar { + background-color: white; + border: 2px solid #cd4042; + border-radius: 18px; + color: #cd4042; + /*font-size: 18px;*/ + padding: 10px 30px; + max-width: 200px; + cursor: pointer; + transition: all 0.3s ease; + } + + .btn-buscar:hover { + background-color: #cd4042; + color: white; + } + +.pagination { + display: flex; + padding-left: 0px; + list-style: none; + border-radius: 0.25rem; + justify-content: center; + +} + +.pagination .page-link { + color: #000000 !important; + background-color: white !important; + border-color: white !important; +} + +.pagination .page-item.active .page-link { + color: white !important; + background-color: #cd4042 !important; + border-color: white !important; +} + +.table-responsive.table-full-width th { + color: black; + font-weight: bold; +} \ No newline at end of file diff --git a/src/app/usuarios/usuariosGrid.component.html b/src/app/usuarios/usuariosGrid.component.html new file mode 100644 index 000000000..fbc7d07bf --- /dev/null +++ b/src/app/usuarios/usuariosGrid.component.html @@ -0,0 +1,86 @@ + +
+
+
+
+
+
+
+
+

Usuarios

+
+
+ +
+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + +
NombreDocumentoPaisCiudadAcciones
{{row.name}}{{row.document}}{{row.ciudad }} {{row.pais }} + + +
+ +
+
+
+ +
+
+
+ diff --git a/src/app/usuarios/usuariosGrid.component.spec.ts b/src/app/usuarios/usuariosGrid.component.spec.ts new file mode 100644 index 000000000..30ed7d043 --- /dev/null +++ b/src/app/usuarios/usuariosGrid.component.spec.ts @@ -0,0 +1,28 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {Router} from '@angular/router'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { UsuariosGridComponent } from './usuariosGrid.component'; + +describe('UsuariosGridComponent', () => { + let component: UsuariosGridComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ UsuariosGridComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UsuariosGridComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/usuarios/usuariosGrid.component.ts b/src/app/usuarios/usuariosGrid.component.ts new file mode 100644 index 000000000..3123595e7 --- /dev/null +++ b/src/app/usuarios/usuariosGrid.component.ts @@ -0,0 +1,174 @@ +import { Component, OnInit } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Router } from '@angular/router'; +import { MatDialog } from '@angular/material/dialog'; +import { ConfirmDownloadDialogComponent } from 'app/shared/confirm-download-dialog/confirm-download-dialog.component'; +import { ConfirmDeleteComponent } from 'app/shared/confirm-delete/confirm-delete.component'; + +declare interface TableData { + headerRow: string[]; + dataRows: string[][]; +} + +@Component({ + selector: 'app-usuariosGrid', + templateUrl: './usuariosGrid.component.html', + styleUrls: ['./usuariosGrid.component.css'], +}) + +export class UsuariosGridComponent implements OnInit { + public tableData1: TableData; + public tableData2: TableData; + data: any; // variable para almacenar los datos obtenidos de la llamada + httpOptions: any; + pageSize = 5; // Tamaño de página deseado + totalRecords = 20; // Número total de registros + // Calcula el número total de páginas + totalPages = Math.ceil(this.totalRecords / this.pageSize); + // Genera el array de páginas + pages = Array(this.totalPages).fill(0).map((x, i) => i + 1); + currentPage = 1; + searchText= ""; + + constructor(private http: HttpClient, private router: Router, public dialog: MatDialog) { + this.tableData1 = { headerRow: [], dataRows: [] }; + } + + ngOnInit() { + let token = localStorage.getItem('jwt'); + let userId = localStorage.getItem('userId'); + + this.httpOptions = { + headers: new HttpHeaders({ + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + }) + }; + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/user/getUsuarios?id=${userId}`, this.httpOptions) + .subscribe(response => { + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + + this.tableData1.dataRows = responseData.slice(0, 5).map(item => { + const currentDate = new Date(item.creationDate); + currentDate.setDate(currentDate.getDate() - 1); + const modifiedCreationDate = currentDate.toISOString(); + return { + id : item.id, + name : item.name, + document : item.document, + ciudad: item.ciudad.name, + pais: item.ciudad.pais.name + } + }); + console.log(this.tableData1.dataRows); + this.data = responseData; + // Calcular el número total de páginas + this.totalPages = Math.ceil(this.data.length / this.pageSize); + + // Generar un array con las páginas + this.pages = Array.from({ length: this.totalPages }, (_, i) => i + 1); + + // Actualizar los datos de la página actual + this.setCurrentPage(1); + }); + } + setCurrentPage(page: number) { + this.currentPage = page; + const start = (page - 1) * 5; + const end = start + 5; + + this.tableData1.dataRows = this.data.slice(start, end).map(item => { + const currentDate = new Date(item.creationDate); + currentDate.setDate(currentDate.getDate() - 1); + const modifiedCreationDate = currentDate.toISOString(); + return { + id : item.id, + name : item.name, + document : item.document, + ciudad: item.ciudad.name, + pais: item.ciudad.pais.name + } + }); + } + calculatePageData() { + const start = (this.currentPage - 1) * this.pageSize; + const end = start + this.pageSize; + this.tableData1.dataRows = this.data.slice(start, end); + } + editRow(row) { + const id = row.id; + this.router.navigate(['/usuariosEditar', id]); + + } + openDialogDelete(row):void{ + const dialogRef = this.dialog.open(ConfirmDeleteComponent,{ + }); + dialogRef.afterClosed().subscribe(res => { + if(res){ + this.deleteRow(row); + } + }) + } + public deleteRow(row) { + const params = { id: row.id }; + const token = localStorage.getItem('jwt'); + const httpOptions = { + headers: new HttpHeaders({ + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }) + }; + const response = this.http.post(`https://encuentro-matrimonial-backend.herokuapp.com/user/deleteUsuario?id=${params.id}`, {}, httpOptions); + + response.subscribe((result: any) => { + this.setCurrentPage(1); + this.getTableData(); + }); + } + + public getTableData() { + let userId = localStorage.getItem('userId'); + + this.http.get(`https://encuentro-matrimonial-backend.herokuapp.com/user/getUsuarios?id=${userId}`, this.httpOptions) + .subscribe(response => { + const responseData = response['response']; // acceder al array 'response' dentro de la respuesta + this.tableData1.dataRows = responseData.map(item => { + return { + id : item.id, + name : item.name, + document : item.document, + ciudad: item.ciudad.name, + pais: item.ciudad.pais.name + } + }); + + this.data = responseData; + }); + } + filterByUsername(searchText: string) { + this.searchText = searchText.trim().toLowerCase(); + + if (this.searchText === '') { + // Si el campo de búsqueda está vacío, mostrar todos los resultados + this.tableData1.dataRows = this.data.map(item => ({ + id : item.id, + name : item.name, + document : item.document, + ciudad: item.ciudad.name, + pais: item.ciudad.pais.name + })); + } else { + // Realizar la búsqueda por username y filtrar los resultados + this.tableData1.dataRows = this.data.filter(item => + item.name.toLowerCase().includes(this.searchText) + ).map(item => ({ + id : item.id, + name : item.name, + document : item.document, + ciudad: item.ciudad.name, + pais: item.ciudad.pais.name + })); + } + } +} diff --git a/src/assets/css/demo.css b/src/assets/css/demo.css index 0aa24c3d6..a11a4f35e 100644 --- a/src/assets/css/demo.css +++ b/src/assets/css/demo.css @@ -1,18 +1,4 @@ -/*! - ========================================================= - * Light Bootstrap Dashboard Angular - v1.5.1 - ========================================================= - - * Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2 - * Copyright 2016 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - */ @media (min-width: 992px){ .typo-line{ padding-left: 140px; @@ -68,7 +54,7 @@ bottom: 10px; } .sidebar .nav > li.active-pro a{ - background: rgba(255, 255, 255, 0.14); + background: rgba(255, 255, 255, 0.103); opacity: 1; color: #FFFFFF; } @@ -77,3 +63,8 @@ .table-upgrade td:nth-child(3){ text-align: center; } + +.imagenem{ + width: 5000; + +} diff --git a/src/assets/css/pe-icon-7-stroke.css b/src/assets/css/pe-icon-7-stroke.css index 44bcbaa63..31233068f 100644 --- a/src/assets/css/pe-icon-7-stroke.css +++ b/src/assets/css/pe-icon-7-stroke.css @@ -18,8 +18,6 @@ font-variant: normal; text-transform: none; line-height: 1; - - /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } diff --git a/src/assets/img/sidebar-5.jpg b/src/assets/img/a.jpg similarity index 100% rename from src/assets/img/sidebar-5.jpg rename to src/assets/img/a.jpg diff --git a/src/assets/img/encuentro_logo.png b/src/assets/img/encuentro_logo.png new file mode 100644 index 000000000..3bd9b1f3b Binary files /dev/null and b/src/assets/img/encuentro_logo.png differ diff --git a/src/assets/img/encuentro_logo2.png b/src/assets/img/encuentro_logo2.png new file mode 100644 index 000000000..ab16fc842 Binary files /dev/null and b/src/assets/img/encuentro_logo2.png differ diff --git a/src/assets/img/encuentro_logo3.png b/src/assets/img/encuentro_logo3.png new file mode 100644 index 000000000..1b7fa970a Binary files /dev/null and b/src/assets/img/encuentro_logo3.png differ diff --git a/src/assets/img/encuentro_logo_login.png b/src/assets/img/encuentro_logo_login.png new file mode 100644 index 000000000..85d0a6e4b Binary files /dev/null and b/src/assets/img/encuentro_logo_login.png differ diff --git a/src/assets/img/encuentro_logos3.png b/src/assets/img/encuentro_logos3.png new file mode 100644 index 000000000..cb5d5853b Binary files /dev/null and b/src/assets/img/encuentro_logos3.png differ diff --git a/src/assets/img/favicon.png b/src/assets/img/favicon.png new file mode 100644 index 000000000..5e7a488ee Binary files /dev/null and b/src/assets/img/favicon.png differ diff --git a/src/assets/img/loginFondo.PNG b/src/assets/img/loginFondo.PNG new file mode 100644 index 000000000..c5e6db381 Binary files /dev/null and b/src/assets/img/loginFondo.PNG differ diff --git a/src/assets/img/logo-inicio.jpg b/src/assets/img/logo-inicio.jpg new file mode 100644 index 000000000..ea33a7a8b Binary files /dev/null and b/src/assets/img/logo-inicio.jpg differ diff --git a/src/assets/img/opt_lbd_angular_thumbnail.jpg b/src/assets/img/opt_lbd_angular_thumbnail.jpg deleted file mode 100644 index 4a20ea4ae..000000000 Binary files a/src/assets/img/opt_lbd_angular_thumbnail.jpg and /dev/null differ diff --git a/src/assets/img/sidebar-5.png b/src/assets/img/sidebar-5.png new file mode 100644 index 000000000..122af40a3 Binary files /dev/null and b/src/assets/img/sidebar-5.png differ diff --git a/src/assets/sass/lbd/_navbars.scss b/src/assets/sass/lbd/_navbars.scss index 4041b6376..8f888cbeb 100644 --- a/src/assets/sass/lbd/_navbars.scss +++ b/src/assets/sass/lbd/_navbars.scss @@ -44,14 +44,14 @@ .notification{ position: absolute; - background-color: #FB404B; + background-color: #cd4042; text-align: center; border-radius: 10px; min-width: 18px; padding: 0 5px; height: 18px; font-size: 12px; - color: #FFFFFF; + color: #ffffff00; font-weight: bold; line-height: 18px; top: 0px; diff --git a/src/assets/sass/lbd/_sidebar-and-main-panel.scss b/src/assets/sass/lbd/_sidebar-and-main-panel.scss index 67b9bb86b..872c92159 100644 --- a/src/assets/sass/lbd/_sidebar-and-main-panel.scss +++ b/src/assets/sass/lbd/_sidebar-and-main-panel.scss @@ -97,7 +97,7 @@ li{ > a{ - color: #FFFFFF; + color: #ffffff00; margin: 5px 15px; opacity: .86; border-radius: 4px; @@ -110,7 +110,7 @@ } &.active > a{ - color: #FFFFFF; + color: #ffffff00; opacity: 1; background: rgba(255,255,255,0.23); diff --git a/src/assets/sass/light-bootstrap-dashboard.scss b/src/assets/sass/light-bootstrap-dashboard.scss index d14bfb7b4..3f8e28522 100644 --- a/src/assets/sass/light-bootstrap-dashboard.scss +++ b/src/assets/sass/light-bootstrap-dashboard.scss @@ -1,24 +1,9 @@ -/*! - ========================================================= - * Light Bootstrap Dashboard Angular - v1.9.0 - ========================================================= - - * Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2 - * Copyright 2020 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - */ @import "lbd/variables"; @import "lbd/mixins"; @import "lbd/typography"; -// Core CSS @import "lbd/misc"; @import "lbd/sidebar-and-main-panel"; @import "lbd/buttons"; @@ -31,7 +16,6 @@ @import "lbd/navbars"; @import "lbd/footers"; -// Fancy Stuff @import "lbd/dropdown"; @import "lbd/cards"; @import "lbd/chartist"; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 00313f166..ffe8aed76 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,8 +1,3 @@ -// The file contents for the current environment will overwrite these during build. -// The build system defaults to the dev environment which uses `environment.ts`, but if you do -// `ng build --env=prod` then `environment.prod.ts` will be used instead. -// The list of which env maps to which file can be found in `angular-cli.json`. - export const environment = { production: false }; diff --git a/src/favicon.png b/src/favicon.png new file mode 100644 index 000000000..5e7a488ee Binary files /dev/null and b/src/favicon.png differ diff --git a/src/index.html b/src/index.html index e15526114..e2f177554 100644 --- a/src/index.html +++ b/src/index.html @@ -1,37 +1,24 @@ - - + - Light Bootstrap Dashboard by Creative Tim + Encuentro Matrimonial Mundial - + + - - - - + + + + - + - +
loading
+
diff --git a/src/main.ts b/src/main.ts index 5887852d3..a9ca1caf8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,18 +1,3 @@ -/*! - - ========================================================= - * Light Bootstrap Dashboard Angular - v1.9.0 - ========================================================= - - * Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard-angular2 - * Copyright 2020 Creative Tim (http://www.creative-tim.com) - * Licensed under MIT - - ========================================================= - - * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - */ import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; diff --git a/src/polyfills.ts b/src/polyfills.ts index d39747f58..a69f1e85f 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -1,23 +1,2 @@ -// This file includes polyfills needed by Angular and is loaded before the app. -// You can add your own extra polyfills to this file. import 'zone.js/dist/zone'; - -// If you need to support the browsers/features below, uncomment the import -// and run `npm install import-name-here'; -// Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html - -// Needed for: IE9 -// import 'classlist.js'; - -// Animations -// Needed for: All but Chrome and Firefox, Not supported in IE9 -// import 'web-animations-js'; - -// Date, currency, decimal and percent pipes -// Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 -// import 'intl'; - -// NgClass on SVG elements -// Needed for: IE10, IE11 -// import 'classlist.js'; (window as any)['global'] = window; diff --git a/src/styles.css b/src/styles.css index 90d4ee007..17ae19c06 100644 --- a/src/styles.css +++ b/src/styles.css @@ -1 +1,51 @@ -/* You can add global styles to this file, and also import other style files */ +* { + box-sizing: border-box; + } + html, + body { + background: #ecf0f3; + } + h1 { + margin: 0; + padding: 0; + } + .custom-form { + min-width: 300px; + max-width: 60%; + margin: 0px auto; + background: rgba(255, 255, 255, 0.15); + padding: 2rem 3rem; + margin: auto; + border-radius: 2.5rem; + background-color: #ecf0f3; + box-shadow: 13px 13px 20px #cbced1, -13px -13px 20px #ffffff; + color: black; + margin-top: 10rem; + } + .custom-form input { + display: block; + margin: 2rem 0; + width: 100%; + border-radius: 0.5rem; + padding: 1rem; + border: none; + box-shadow: inset -5px -5px 15px rgba(255, 255, 255, 0.8), inset 5px 5px 10px + rgba(0, 0, 0, 0.1); + border: 0 none; + background: #ebf5fc; + } + .custom-form button { + text-transform: uppercase; + letter-spacing: 0.15em; + border: none; + font-size: 0.875rem; + color: #ffffff; + font-weight: bold; + background-color: #bcd8c1; + width: 100%; + display: block; + padding: 0.875rem 1rem; + border-radius: 1.5rem; + box-shadow: 3px 3px 8px #b1b1b1, -3px -3px 8px #ffffff; + cursor: pointer; + } \ No newline at end of file diff --git a/src/test.ts b/src/test.ts index 9bf72267e..cf2924f5f 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,5 +1,3 @@ -// This file is required by karma.conf.js and loads recursively all the .spec and framework files - import 'zone.js/dist/long-stack-trace-zone'; import 'zone.js/dist/proxy.js'; import 'zone.js/dist/sync-test'; @@ -12,21 +10,15 @@ import { platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. declare var __karma__: any; declare var require: any; -// Prevent Karma from running prematurely. __karma__.loaded = function () {}; -// First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() ); -// Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. context.keys().map(context); -// Finally, start Karma to run the tests. __karma__.start();