modulo vacaciones

parents
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
## [2.5.0] - 2020-10-07
### Updates
- update to Angular 10
- update all dependencies to match Angular 10 version
## [2.4.0] - 2020-03-05
### Updates
- update to Angular 9
- update all dependencies to match Angular 9 version
## [2.3.0] - 2019-06-11
### Updates
- update to Angular 8
- update all dependencies to match Angular 8 version
```
@agm/core 1.0.0-beta.5 → 1.0.0-beta.6
@angular/animations 7.0.2 → 8.0.0
@angular/cdk 7.0.2 → 8.0.1
@angular/common 7.0.2 → 8.0.0
@angular/compiler 7.0.2 → 8.0.0
@angular/core 7.0.2 → 8.0.0
@angular/forms 7.0.2 → 8.0.0
@angular/http 7.0.2 → 7.2.15
@angular/material 7.0.2 → 8.0.1
@angular/platform-browser 7.0.2 → 8.0.0
@angular/platform-browser-dynamic 7.0.2 → 8.0.0
@angular/platform-server 7.0.2 → 8.0.0
@angular/router 7.0.2 → 8.0.0
ajv 6.4.0 → 6.10.0
bootstrap 4.1.0 → 4.3.1
bootstrap-material-design 4.1.1 → 4.1.2
chartist 0.11.0 → 0.11.2
core-js 2.4.1 → 3.1.3
express 4.16.3 → 4.17.1
googleapis 28.1.0 → 40.0.0
jquery 3.2.1 → 3.4.1
moment 2.22.1 → 2.24.0
perfect-scrollbar 1.1.0 → 1.4.0
popper.js 1.14.3 → 1.15.0
rxjs 6.3.3 → 6.5.2
rxjs-compat 6.3.3 → 6.5.2
zone.js 0.8.26 → 0.9.1
@angular-devkit/build-angular 0.6.3 → 0.800.2
@angular/cli 7.0.2 → 8.0.2
@angular/compiler-cli 7.0.2 → 8.0.0
@angular/language-service 7.0.2 → 8.0.0
@types/bootstrap 3.3.32 → 4.3.0
@types/chartist 0.9.34 → 0.9.46
@types/googlemaps 3.30.8 → 3.36.4
@types/jasmine 2.5.38 → 3.3.13
@types/jquery 1.10.31 → 3.3.29
@types/node 6.0.73 → 12.0.7
codelyzer 4.2.1 → 5.1.0
jasmine-core 3.3.0 → 3.4.0
karma 2.0.0 → 4.1.0
karma-cli 1.0.1 → 2.0.0
karma-coverage-istanbul-reporter 1.4.2 → 2.0.5
karma-jasmine 1.1.1 → 2.0.1
karma-jasmine-html-reporter 1.4.0 → 1.4.2
protractor 5.3.1 → 5.4.2
ts-node 5.0.1 → 8.2.0
tslint 5.9.1 → 5.17.0
typescript 3.1.6 → 3.4.5
```
### Bug fixing
- browser console error
```
href="#pablo" -> href="javascript:void(0)"
href="#" -> href="javascript:void(0)"
```
- form-validation error from the `_forms.scss` file
```
@include form-validation-state("valid", $label-color); -> @include form-validation-state("valid", $label-color, $form-feedback-icon-valid);
```
- added hash for google url validation
## [2.2.0] - 2018-11-14
### Changes
- update to Angular 7
- update all dependencies to match Angular 7 version
## [2.1.1] - 2018-05-23
### Fixes
- changed some links
## [2.1.0] - 2018-04-27
### Fixes
- changed file structure
- moved documentation online
## [2.0.0] - 2018-04-20
### Fixes
- added bootstrap 4
- added angular 5
## [1.4.2] - 2017-10-01
### Fixes
- added Perfect Scrollbar
- added scrollTop on route change
- added closeSidebar on mobile
- autocompile scss files
- fixes for IE
- update package dependencies to 4.4.4
## [1.4.1] - 2017-09-19
### Material
- added material.init()
- fixed input float problem
- fixed checkboxes in tabs
## [1.4.0] - 2017-08-23
### Changes for Angular 4
- added angular-cli
- update to Angular 4
## [v1.3.0] 2017-08-23
### skipped for sync with Angular 4 version convention
## [1.2.0] - 2017-04-05
### Added
- added Upgrade to PRO page
- update package
- made sidebar dynamic
## [1.1.1] - 2017-03-21
### Added
- added "@types/core-js": "0.9.35" in package
## [1.1.0] - 2017-03-20
### small fix
## [1.0.0] - 2017-01-30
### initial Release
<!--
IMPORTANT: Please use the following link to create a new issue:
https://www.creative-tim.com/new-issue/material-dashboard-angular2
**If your issue was not created using the app above, it will be closed immediately.**
-->
<!--
Love Creative Tim? Do you need Angular, React, Vuejs or HTML? You can visit:
👉 https://www.creative-tim.com/bundles
👉 https://www.creative-tim.com
-->
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.
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"material-dashboard-angular": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"assets": [
"src/assets",
"src/favicon.ico"
],
"styles": [
"node_modules/perfect-scrollbar/css/perfect-scrollbar.css",
"src/assets/scss/material-dashboard.scss",
"src/assets/css/demo.css",
"node_modules/primeicons/primeicons.css",
"node_modules/primeng/resources/themes/saga-blue/theme.css",
"node_modules/primeng/resources/primeng.min.css"
],
"scripts": [
"node_modules/jquery/dist/jquery.js",
"node_modules/popper.js/dist/umd/popper.js",
"node_modules/bootstrap-material-design/dist/js/bootstrap-material-design.min.js",
"node_modules/arrive/src/arrive.js",
"node_modules/moment/moment.js",
"node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js",
"node_modules/bootstrap-notify/bootstrap-notify.js",
"node_modules/chartist/dist/chartist.js"
],
"allowedCommonJsDependencies" : [
"rxjs/add/operator/filter",
"jquery",
"chartist"
]
},
"configurations": {
"production": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "material-dashboard-angular:build"
},
"configurations": {
"production": {
"browserTarget": "material-dashboard-angular:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "material-dashboard-angular:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"scripts": [
"node_modules/jquery/dist/jquery.js",
"node_modules/popper.js/dist/umd/popper.js",
"node_modules/bootstrap-material-design/dist/js/bootstrap-material-design.min.js",
"node_modules/arrive/src/arrive.js",
"node_modules/moment/moment.js",
"node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js",
"node_modules/bootstrap-notify/bootstrap-notify.js",
"node_modules/chartist/dist/chartist.js"
],
"styles": [
"node_modules/perfect-scrollbar/css/perfect-scrollbar.css",
"src/assets/scss/material-dashboard.scss",
"src/assets/css/demo.css",
"node_modules/primeicons/primeicons.css",
"node_modules/primeng/resources/themes/saga-blue/theme.css",
"node_modules/primeng/resources/primeng.min.css"
],
"assets": [
"src/assets",
"src/favicon.ico"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": []
}
}
}
},
"material-dashboard-angular-e2e": {
"root": "",
"sourceRoot": "",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "./protractor.conf.js",
"devServerTarget": "material-dashboard-angular:serve"
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"e2e/tsconfig.e2e.json"
],
"exclude": []
}
}
}
}
},
"defaultProject": "material-dashboard-angular",
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
},
"cli": {
"analytics": false
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* arrive.js
* v2.4.1
* https://github.com/uzairfarooq/arrive
* MIT licensed
*
* Copyright (c) 2014-2017 Uzair Farooq
*/
var Arrive=function(e,t,n){"use strict";function r(e,t,n){l.addMethod(t,n,e.unbindEvent),l.addMethod(t,n,e.unbindEventWithSelectorOrCallback),l.addMethod(t,n,e.unbindEventWithSelectorAndCallback)}function i(e){e.arrive=f.bindEvent,r(f,e,"unbindArrive"),e.leave=d.bindEvent,r(d,e,"unbindLeave")}if(e.MutationObserver&&"undefined"!=typeof HTMLElement){var o=0,l=function(){var t=HTMLElement.prototype.matches||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector;return{matchesSelector:function(e,n){return e instanceof HTMLElement&&t.call(e,n)},addMethod:function(e,t,r){var i=e[t];e[t]=function(){return r.length==arguments.length?r.apply(this,arguments):"function"==typeof i?i.apply(this,arguments):n}},callCallbacks:function(e,t){t&&t.options.onceOnly&&1==t.firedElems.length&&(e=[e[0]]);for(var n,r=0;n=e[r];r++)n&&n.callback&&n.callback.call(n.elem,n.elem);t&&t.options.onceOnly&&1==t.firedElems.length&&t.me.unbindEventWithSelectorAndCallback.call(t.target,t.selector,t.callback)},checkChildNodesRecursively:function(e,t,n,r){for(var i,o=0;i=e[o];o++)n(i,t,r)&&r.push({callback:t.callback,elem:i}),i.childNodes.length>0&&l.checkChildNodesRecursively(i.childNodes,t,n,r)},mergeArrays:function(e,t){var n,r={};for(n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);for(n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);return r},toElementsArray:function(t){return n===t||"number"==typeof t.length&&t!==e||(t=[t]),t}}}(),c=function(){var e=function(){this._eventsBucket=[],this._beforeAdding=null,this._beforeRemoving=null};return e.prototype.addEvent=function(e,t,n,r){var i={target:e,selector:t,options:n,callback:r,firedElems:[]};return this._beforeAdding&&this._beforeAdding(i),this._eventsBucket.push(i),i},e.prototype.removeEvent=function(e){for(var t,n=this._eventsBucket.length-1;t=this._eventsBucket[n];n--)if(e(t)){this._beforeRemoving&&this._beforeRemoving(t);var r=this._eventsBucket.splice(n,1);r&&r.length&&(r[0].callback=null)}},e.prototype.beforeAdding=function(e){this._beforeAdding=e},e.prototype.beforeRemoving=function(e){this._beforeRemoving=e},e}(),a=function(t,r){var i=new c,o=this,a={fireOnAttributesModification:!1};return i.beforeAdding(function(n){var i,l=n.target;(l===e.document||l===e)&&(l=document.getElementsByTagName("html")[0]),i=new MutationObserver(function(e){r.call(this,e,n)});var c=t(n.options);i.observe(l,c),n.observer=i,n.me=o}),i.beforeRemoving(function(e){e.observer.disconnect()}),this.bindEvent=function(e,t,n){t=l.mergeArrays(a,t);for(var r=l.toElementsArray(this),o=0;o<r.length;o++)i.addEvent(r[o],e,t,n)},this.unbindEvent=function(){var e=l.toElementsArray(this);i.removeEvent(function(t){for(var r=0;r<e.length;r++)if(this===n||t.target===e[r])return!0;return!1})},this.unbindEventWithSelectorOrCallback=function(e){var t,r=l.toElementsArray(this),o=e;t="function"==typeof e?function(e){for(var t=0;t<r.length;t++)if((this===n||e.target===r[t])&&e.callback===o)return!0;return!1}:function(t){for(var i=0;i<r.length;i++)if((this===n||t.target===r[i])&&t.selector===e)return!0;return!1},i.removeEvent(t)},this.unbindEventWithSelectorAndCallback=function(e,t){var r=l.toElementsArray(this);i.removeEvent(function(i){for(var o=0;o<r.length;o++)if((this===n||i.target===r[o])&&i.selector===e&&i.callback===t)return!0;return!1})},this},s=function(){function e(e){var t={attributes:!1,childList:!0,subtree:!0};return e.fireOnAttributesModification&&(t.attributes=!0),t}function t(e,t){e.forEach(function(e){var n=e.addedNodes,i=e.target,o=[];null!==n&&n.length>0?l.checkChildNodesRecursively(n,t,r,o):"attributes"===e.type&&r(i,t,o)&&o.push({callback:t.callback,elem:i}),l.callCallbacks(o,t)})}function r(e,t){return l.matchesSelector(e,t.selector)&&(e._id===n&&(e._id=o++),-1==t.firedElems.indexOf(e._id))?(t.firedElems.push(e._id),!0):!1}var i={fireOnAttributesModification:!1,onceOnly:!1,existing:!1};f=new a(e,t);var c=f.bindEvent;return f.bindEvent=function(e,t,r){n===r?(r=t,t=i):t=l.mergeArrays(i,t);var o=l.toElementsArray(this);if(t.existing){for(var a=[],s=0;s<o.length;s++)for(var u=o[s].querySelectorAll(e),f=0;f<u.length;f++)a.push({callback:r,elem:u[f]});if(t.onceOnly&&a.length)return r.call(a[0].elem,a[0].elem);setTimeout(l.callCallbacks,1,a)}c.call(this,e,t,r)},f},u=function(){function e(){var e={childList:!0,subtree:!0};return e}function t(e,t){e.forEach(function(e){var n=e.removedNodes,i=[];null!==n&&n.length>0&&l.checkChildNodesRecursively(n,t,r,i),l.callCallbacks(i,t)})}function r(e,t){return l.matchesSelector(e,t.selector)}var i={};d=new a(e,t);var o=d.bindEvent;return d.bindEvent=function(e,t,r){n===r?(r=t,t=i):t=l.mergeArrays(i,t),o.call(this,e,t,r)},d},f=new s,d=new u;t&&i(t.fn),i(HTMLElement.prototype),i(NodeList.prototype),i(HTMLCollection.prototype),i(HTMLDocument.prototype),i(Window.prototype);var h={};return r(f,h,"unbindAllArrive"),r(d,h,"unbindAllLeave"),h}}(window,"undefined"==typeof jQuery?null:jQuery,void 0);
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
type = ['','info','success','warning','danger'];
demo = {
initPickColor: function(){
$('.pick-class-label').click(function(){
var new_class = $(this).attr('new-class');
var old_class = $('#display-buttons').attr('data-class');
var display_div = $('#display-buttons');
if(display_div.length) {
var display_buttons = display_div.find('.btn');
display_buttons.removeClass(old_class);
display_buttons.addClass(new_class);
display_div.attr('data-class', new_class);
}
});
},
initFormExtendedDatetimepickers: function(){
$('.datetimepicker').datetimepicker({
icons: {
time: "fa fa-clock-o",
date: "fa fa-calendar",
up: "fa fa-chevron-up",
down: "fa fa-chevron-down",
previous: 'fa fa-chevron-left',
next: 'fa fa-chevron-right',
today: 'fa fa-screenshot',
clear: 'fa fa-trash',
close: 'fa fa-remove'
}
});
},
initDocumentationCharts: function(){
/* ----------========== Daily Sales Chart initialization For Documentation ==========---------- */
dataDailySalesChart = {
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
series: [
[12, 17, 7, 17, 23, 18, 38]
]
};
optionsDailySalesChart = {
lineSmooth: Chartist.Interpolation.cardinal({
tension: 0
}),
low: 0,
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
chartPadding: { top: 0, right: 0, bottom: 0, left: 0},
}
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
md.startAnimationForLineChart(dailySalesChart);
},
initDashboardPageCharts: function(){
/* ----------========== Daily Sales Chart initialization ==========---------- */
dataDailySalesChart = {
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
series: [
[12, 17, 7, 17, 23, 18, 38]
]
};
optionsDailySalesChart = {
lineSmooth: Chartist.Interpolation.cardinal({
tension: 0
}),
low: 0,
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
chartPadding: { top: 0, right: 0, bottom: 0, left: 0},
}
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
md.startAnimationForLineChart(dailySalesChart);
/* ----------========== Completed Tasks Chart initialization ==========---------- */
dataCompletedTasksChart = {
labels: ['12am', '3pm', '6pm', '9pm', '12pm', '3am', '6am', '9am'],
series: [
[230, 750, 450, 300, 280, 240, 200, 190]
]
};
optionsCompletedTasksChart = {
lineSmooth: Chartist.Interpolation.cardinal({
tension: 0
}),
low: 0,
high: 1000, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
chartPadding: { top: 0, right: 0, bottom: 0, left: 0}
}
var completedTasksChart = new Chartist.Line('#completedTasksChart', dataCompletedTasksChart, optionsCompletedTasksChart);
// start animation for the Completed Tasks Chart - Line Chart
md.startAnimationForLineChart(completedTasksChart);
/* ----------========== Emails Subscription Chart initialization ==========---------- */
var dataEmailsSubscriptionChart = {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
series: [
[542, 443, 320, 780, 553, 453, 326, 434, 568, 610, 756, 895]
]
};
var optionsEmailsSubscriptionChart = {
axisX: {
showGrid: false
},
low: 0,
high: 1000,
chartPadding: { top: 0, right: 5, bottom: 0, left: 0}
};
var responsiveOptions = [
['screen and (max-width: 640px)', {
seriesBarDistance: 5,
axisX: {
labelInterpolationFnc: function (value) {
return value[0];
}
}
}]
];
var emailsSubscriptionChart = Chartist.Bar('#emailsSubscriptionChart', dataEmailsSubscriptionChart, optionsEmailsSubscriptionChart, responsiveOptions);
//start animation for the Emails Subscription Chart
md.startAnimationForBarChart(emailsSubscriptionChart);
},
initGoogleMaps: function(){
var myLatlng = new google.maps.LatLng(40.748817, -73.985428);
var mapOptions = {
zoom: 13,
center: myLatlng,
scrollwheel: false, //we disable de scroll over the map, it is a really annoing when you scroll through page
styles: [{"featureType":"water","stylers":[{"saturation":43},{"lightness":-11},{"hue":"#0088ff"}]},{"featureType":"road","elementType":"geometry.fill","stylers":[{"hue":"#ff0000"},{"saturation":-100},{"lightness":99}]},{"featureType":"road","elementType":"geometry.stroke","stylers":[{"color":"#808080"},{"lightness":54}]},{"featureType":"landscape.man_made","elementType":"geometry.fill","stylers":[{"color":"#ece2d9"}]},{"featureType":"poi.park","elementType":"geometry.fill","stylers":[{"color":"#ccdca1"}]},{"featureType":"road","elementType":"labels.text.fill","stylers":[{"color":"#767676"}]},{"featureType":"road","elementType":"labels.text.stroke","stylers":[{"color":"#ffffff"}]},{"featureType":"poi","stylers":[{"visibility":"off"}]},{"featureType":"landscape.natural","elementType":"geometry.fill","stylers":[{"visibility":"on"},{"color":"#b8cb93"}]},{"featureType":"poi.park","stylers":[{"visibility":"on"}]},{"featureType":"poi.sports_complex","stylers":[{"visibility":"on"}]},{"featureType":"poi.medical","stylers":[{"visibility":"on"}]},{"featureType":"poi.business","stylers":[{"visibility":"simplified"}]}]
}
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var marker = new google.maps.Marker({
position: myLatlng,
title:"Hello World!"
});
// To add the marker to the map, call setMap();
marker.setMap(map);
},
showNotification: function(from, align){
color = Math.floor((Math.random() * 4) + 1);
$.notify({
icon: "notifications",
message: "Welcome to <b>Material Dashboard</b> - a beautiful freebie for every web developer."
},{
type: type[color],
timer: 4000,
placement: {
from: from,
align: align
}
});
}
}
var mobile_menu_visible = 0,
mobile_menu_initialized = false,
toggle_initialized = false,
bootstrap_nav_initialized = false;
$(document).ready(function(){
$sidebar = $('.sidebar');
window_width = $(window).width();
mda.initSidebarCheck();
});
$(window).resize(function(){
mda.initSidebarCheck();
});
mda = {
initSidebarCheck: function(){
if($(window).width() <= 991){
if($sidebar.length != 0){
mda.initRightMenu();
} else{
mda.initBootstrapNavbarMenu();
}
}
},
initRightMenu: debounce(function(){
$sidebar_wrapper = $('.sidebar-wrapper');
if(!mobile_menu_initialized){
$navbar = $('nav').find('.navbar-collapse').first().clone(true);
nav_content = '';
mobile_menu_content = '';
$navbar.children('ul').each(function(){
content_buff = $(this).html();
nav_content = nav_content + content_buff;
});
nav_content = '<ul class="nav nav-mobile-menu">' + nav_content + '</ul>';
$navbar_form = $('nav').find('.navbar-form').clone(true);
$sidebar_nav = $sidebar_wrapper.find('.nav-container');
// insert the navbar form before the sidebar list
$nav_content = $(nav_content);
$nav_content.insertBefore($sidebar_nav);
$navbar_form.insertBefore($nav_content);
$(".sidebar-wrapper .dropdown .dropdown-menu > li > a").click(function(event) {
event.stopPropagation();
});
mobile_menu_initialized = true;
} else {
if($(window).width() > 991){
// reset all the additions that we made for the sidebar wrapper only if the screen is bigger than 991px
$sidebar_wrapper.find('.navbar-form').remove();
$sidebar_wrapper.find('.nav-mobile-menu').remove();
mobile_menu_initialized = false;
}
}
if(!toggle_initialized){
$toggle = $('.navbar-toggle');
$toggle.click(function (){
if(mobile_menu_visible == 1) {
$('html').removeClass('nav-open');
$('.close-layer').remove();
setTimeout(function(){
$toggle.removeClass('toggled');
}, 400);
mobile_menu_visible = 0;;
} else {
setTimeout(function(){
$toggle.addClass('toggled');
}, 430);
$layer = $('<div class="close-layer"></div>');
$layer.appendTo(".wrapper");
setTimeout(function(){
$layer.addClass('visible');
}, 100);
$layer.click(function() {
$('html').removeClass('nav-open');
mobile_menu_visible = 0;
$layer.removeClass('visible');
setTimeout(function(){
$layer.remove();
$toggle.removeClass('toggled');
}, 400);
});
$('html').addClass('nav-open');
mobile_menu_visible = 1;
}
});
toggle_initialized = true;
}
},200),
initBootstrapNavbarMenu: debounce(function(){
if(!bootstrap_nav_initialized){
$navbar = $('nav').find('.navbar-collapse').first().clone(true);
nav_content = '';
mobile_menu_content = '';
//add the content from the regular header to the mobile menu
$navbar.children('ul').each(function(){
content_buff = $(this).html();
nav_content = nav_content + content_buff;
});
nav_content = '<ul class="nav nav-mobile-menu">' + nav_content + '</ul>';
$navbar.html(nav_content);
$navbar.addClass('bootstrap-navbar');
// append it to the body, so it will come from the right side of the screen
$('body').append($navbar);
$toggle = $('.navbar-toggle');
$navbar.find('a').removeClass('btn btn-round btn-default');
$navbar.find('button').removeClass('btn-round btn-fill btn-info btn-primary btn-success btn-danger btn-warning btn-neutral');
$navbar.find('button').addClass('btn-simple btn-block');
$toggle.click(function (){
if(mobile_menu_visible == 1) {
$('html').removeClass('nav-open');
$('.close-layer').remove();
setTimeout(function(){
$toggle.removeClass('toggled');
}, 400);
mobile_menu_visible = 0;
} else {
setTimeout(function(){
$toggle.addClass('toggled');
}, 430);
$layer = $('<div class="close-layer"></div>');
$layer.appendTo(".wrapper-full-page");
setTimeout(function(){
$layer.addClass('visible');
}, 100);
$layer.click(function() {
$('html').removeClass('nav-open');
mobile_menu_visible = 0;
$layer.removeClass('visible');
setTimeout(function(){
$layer.remove();
$toggle.removeClass('toggled');
}, 400);
});
$('html').addClass('nav-open');
mobile_menu_visible = 1;
}
});
bootstrap_nav_initialized = true;
}
}, 500),
}
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
timeout = null;
if (!immediate) func.apply(context, args);
}, wait);
if (immediate && !timeout) func.apply(context, args);
};
};
This diff is collapsed.
/*!
=========================================================
* Material Dashboard Angular 2 - V1.2.0
=========================================================
* Product Page: https://www.creative-tim.com/product/material-dashboard-angular2
* Copyright 2017 Creative Tim (https://www.creative-tim.com)
* Licensed under MIT (https://github.com/creativetimofficial/material-dashboard-angular/blob/master/LICENSE.md)
=========================================================
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
var searchVisible = 0;
var transparent = true;
var transparentDemo = true;
var fixedTop = false;
var seq = 0, delays = 80, durations = 500;
var seq2 = 0, delays2 = 80, durations2 = 500;
$(document).ready(function(){
$sidebar = $('.sidebar');
$.material.init();
window_width = $(window).width();
// check if there is an image set for the sidebar's background
// Activate the tooltips
$('[rel="tooltip"]').tooltip();
$('.form-control').on("focus", function(){
$(this).parent('.input-group').addClass("input-group-focus");
}).on("blur", function(){
$(this).parent(".input-group").removeClass("input-group-focus");
});
});
// activate collapse right menu when the windows is resized
$(window).resize(function(){
// reset the seq for charts drawing animations
seq = seq2 = 0;
});
md = {
misc:{
navbar_menu_visible: 0,
active_collapse: true,
disabled_collapse_init: 0,
},
checkScrollForTransparentNavbar: debounce(function() {
if($(document).scrollTop() > 381 ) {
if(transparent) {
transparent = false;
$('.navbar-color-on-scroll').removeClass('navbar-transparent');
$('.navbar-title').removeClass('hidden');
}
} else {
if( !transparent ) {
transparent = true;
$('.navbar-color-on-scroll').addClass('navbar-transparent');
$('.navbar-title').addClass('hidden');
}
}
}, 17),
startAnimationForLineChart: function(chart){
chart.on('draw', function(data) {
if(data.type === 'line' || data.type === 'area') {
data.element.animate({
d: {
begin: 600,
dur: 700,
from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(),
to: data.path.clone().stringify(),
easing: Chartist.Svg.Easing.easeOutQuint
}
});
} else if(data.type === 'point') {
seq++;
data.element.animate({
opacity: {
begin: seq * delays,
dur: durations,
from: 0,
to: 1,
easing: 'ease'
}
});
}
});
seq = 0;
},
startAnimationForBarChart: function(chart){
chart.on('draw', function(data) {
if(data.type === 'bar'){
seq2++;
data.element.animate({
opacity: {
begin: seq2 * delays2,
dur: durations2,
from: 0,
to: 1,
easing: 'ease'
}
});
}
});
seq2 = 0;
}
}
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
timeout = null;
if (!immediate) func.apply(context, args);
}, wait);
if (immediate && !timeout) func.apply(context, args);
};
};
!function(t){function o(t){return"undefined"==typeof t.which?!0:"number"==typeof t.which&&t.which>0?!t.ctrlKey&&!t.metaKey&&!t.altKey&&8!=t.which&&9!=t.which&&13!=t.which&&16!=t.which&&17!=t.which&&20!=t.which&&27!=t.which:!1}function i(o){var i=t(o);i.prop("disabled")||i.closest(".form-group").addClass("is-focused")}function n(o){o.closest("label").hover(function(){var o=t(this).find("input");o.prop("disabled")||i(o)},function(){e(t(this).find("input"))})}function e(o){t(o).closest(".form-group").removeClass("is-focused")}t.expr[":"].notmdproc=function(o){return t(o).data("mdproc")?!1:!0},t.material={options:{validate:!0,input:!0,ripples:!0,checkbox:!0,togglebutton:!0,radio:!0,arrive:!0,autofill:!1,withRipples:[".btn:not(.btn-link)",".card-image",".navbar a:not(.withoutripple)",".footer a:not(.withoutripple)",".dropdown-menu a",".nav-tabs a:not(.withoutripple)",".withripple",".pagination li:not(.active):not(.disabled) a:not(.withoutripple)"].join(","),inputElements:"input.form-control, textarea.form-control, select.form-control",checkboxElements:".checkbox > label > input[type=checkbox]",togglebuttonElements:".togglebutton > label > input[type=checkbox]",radioElements:".radio > label > input[type=radio]"},checkbox:function(o){var i=t(o?o:this.options.checkboxElements).filter(":notmdproc").data("mdproc",!0).after("<span class='checkbox-material'><span class='check'></span></span>");n(i)},togglebutton:function(o){var i=t(o?o:this.options.togglebuttonElements).filter(":notmdproc").data("mdproc",!0).after("<span class='toggle'></span>");n(i)},radio:function(o){var i=t(o?o:this.options.radioElements).filter(":notmdproc").data("mdproc",!0).after("<span class='circle'></span><span class='check'></span>");n(i)},input:function(o){t(o?o:this.options.inputElements).filter(":notmdproc").data("mdproc",!0).each(function(){var o=t(this),i=o.closest(".form-group");0===i.length&&(o.wrap("<div class='form-group'></div>"),i=o.closest(".form-group")),o.attr("data-hint")&&(o.after("<p class='help-block'>"+o.attr("data-hint")+"</p>"),o.removeAttr("data-hint"));var n={"input-lg":"form-group-lg","input-sm":"form-group-sm"};if(t.each(n,function(t,n){o.hasClass(t)&&(o.removeClass(t),i.addClass(n))}),o.hasClass("floating-label")){var e=o.attr("placeholder");o.attr("placeholder",null).removeClass("floating-label");var a=o.attr("id"),r="";a&&(r="for='"+a+"'"),i.addClass("label-floating"),o.after("<label "+r+"class='control-label'>"+e+"</label>")}(null===o.val()||"undefined"==o.val()||""===o.val())&&i.addClass("is-empty"),i.append("<span class='material-input'></span>"),i.find("input[type=file]").length>0&&i.addClass("is-fileinput")})},attachInputEventHandlers:function(){var n=this.options.validate;t(document).on("change",".checkbox input[type=checkbox]",function(){t(this).blur()}).on("keydown paste",".form-control",function(i){o(i)&&t(this).closest(".form-group").removeClass("is-empty")}).on("keyup change",".form-control",function(){var o=t(this),i=o.closest(".form-group"),e="undefined"==typeof o[0].checkValidity||o[0].checkValidity();""===o.val()?i.addClass("is-empty"):i.removeClass("is-empty"),n&&(e?i.removeClass("has-error"):i.addClass("has-error"))}).on("focus",".form-control, .form-group.is-fileinput",function(){i(this)}).on("blur",".form-control, .form-group.is-fileinput",function(){e(this)}).on("change",".form-group input",function(){var o=t(this);if("file"!=o.attr("type")){var i=o.closest(".form-group"),n=o.val();n?i.removeClass("is-empty"):i.addClass("is-empty")}}).on("change",".form-group.is-fileinput input[type='file']",function(){var o=t(this),i=o.closest(".form-group"),n="";t.each(this.files,function(t,o){n+=o.name+", "}),n=n.substring(0,n.length-2),n?i.removeClass("is-empty"):i.addClass("is-empty"),i.find("input.form-control[readonly]").val(n)})},ripples:function(o){t(o?o:this.options.withRipples).ripples()},autofill:function(){var o=setInterval(function(){t("input[type!=checkbox]").each(function(){var o=t(this);o.val()&&o.val()!==o.attr("value")&&o.trigger("change")})},100);setTimeout(function(){clearInterval(o)},1e4)},attachAutofillEventHandlers:function(){var o;t(document).on("focus","input",function(){var i=t(this).parents("form").find("input").not("[type=file]");o=setInterval(function(){i.each(function(){var o=t(this);o.val()!==o.attr("value")&&o.trigger("change")})},100)}).on("blur",".form-group input",function(){clearInterval(o)})},init:function(o){this.options=t.extend({},this.options,o);var i=t(document);t.fn.ripples&&this.options.ripples&&this.ripples(),this.options.input&&(this.input(),this.attachInputEventHandlers()),this.options.checkbox&&this.checkbox(),this.options.togglebutton&&this.togglebutton(),this.options.radio&&this.radio(),this.options.autofill&&(this.autofill(),this.attachAutofillEventHandlers()),document.arrive&&this.options.arrive&&(t.fn.ripples&&this.options.ripples&&i.arrive(this.options.withRipples,function(){t.material.ripples(t(this))}),this.options.input&&i.arrive(this.options.inputElements,function(){t.material.input(t(this))}),this.options.checkbox&&i.arrive(this.options.checkboxElements,function(){t.material.checkbox(t(this))}),this.options.radio&&i.arrive(this.options.radioElements,function(){t.material.radio(t(this))}),this.options.togglebutton&&i.arrive(this.options.togglebuttonElements,function(){t.material.togglebutton(t(this))}))}}}(jQuery),function(t,o,i,n){"use strict";function e(o,i){r=this,this.element=t(o),this.options=t.extend({},s,i),this._defaults=s,this._name=a,this.init()}var a="ripples",r=null,s={};e.prototype.init=function(){var i=this.element;i.on("mousedown touchstart",function(n){if(!r.isTouch()||"mousedown"!==n.type){i.find(".ripple-container").length||i.append('<div class="ripple-container"></div>');var e=i.children(".ripple-container"),a=r.getRelY(e,n),s=r.getRelX(e,n);if(a||s){var l=r.getRipplesColor(i),p=t("<div></div>");p.addClass("ripple").css({left:s,top:a,"background-color":l}),e.append(p),function(){return o.getComputedStyle(p[0]).opacity}(),r.rippleOn(i,p),setTimeout(function(){r.rippleEnd(p)},500),i.on("mouseup mouseleave touchend",function(){p.data("mousedown","off"),"off"===p.data("animating")&&r.rippleOut(p)})}}})},e.prototype.getNewSize=function(t,o){return Math.max(t.outerWidth(),t.outerHeight())/o.outerWidth()*2.5},e.prototype.getRelX=function(t,o){var i=t.offset();return r.isTouch()?(o=o.originalEvent,1===o.touches.length?o.touches[0].pageX-i.left:!1):o.pageX-i.left},e.prototype.getRelY=function(t,o){var i=t.offset();return r.isTouch()?(o=o.originalEvent,1===o.touches.length?o.touches[0].pageY-i.top:!1):o.pageY-i.top},e.prototype.getRipplesColor=function(t){var i=t.data("ripple-color")?t.data("ripple-color"):o.getComputedStyle(t[0]).color;return i},e.prototype.hasTransitionSupport=function(){var t=i.body||i.documentElement,o=t.style,e=o.transition!==n||o.WebkitTransition!==n||o.MozTransition!==n||o.MsTransition!==n||o.OTransition!==n;return e},e.prototype.isTouch=function(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},e.prototype.rippleEnd=function(t){t.data("animating","off"),"off"===t.data("mousedown")&&r.rippleOut(t)},e.prototype.rippleOut=function(t){t.off(),r.hasTransitionSupport()?t.addClass("ripple-out"):t.animate({opacity:0},100,function(){t.trigger("transitionend")}),t.on("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){t.remove()})},e.prototype.rippleOn=function(t,o){var i=r.getNewSize(t,o);r.hasTransitionSupport()?o.css({"-ms-transform":"scale("+i+")","-moz-transform":"scale("+i+")","-webkit-transform":"scale("+i+")",transform:"scale("+i+")"}).addClass("ripple-on").data("animating","on").data("mousedown","on"):o.animate({width:2*Math.max(t.outerWidth(),t.outerHeight()),height:2*Math.max(t.outerWidth(),t.outerHeight()),"margin-left":-1*Math.max(t.outerWidth(),t.outerHeight()),"margin-top":-1*Math.max(t.outerWidth(),t.outerHeight()),opacity:.2},500,function(){o.trigger("transitionend")})},t.fn.ripples=function(o){return this.each(function(){t.data(this,"plugin_"+a)||t.data(this,"plugin_"+a,new e(this,o))})}}(jQuery,window,document);
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="apple-touch-icon" sizes="76x76" href="../src/assets/img/apple-icon.png" />
<link rel="icon" type="image/png" href="../src/assets/img/favicon.png" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title>Material Dashboard Angular by Creative Tim</title>
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
<meta name="viewport" content="width=device-width" />
<!-- Material Dashboard CSS -->
<link href="css/material-dashboard.css" rel="stylesheet" />
<!-- CSS for Demo Purpose, don't include it in your project -->
<!-- Fonts and icons -->
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons" />
<link href="css/demo-documentation.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
<style>
pre.prettyprint {
background-color: #eee;
border: 0px;
margin-bottom: 60px;
margin-top: 30px;
padding: 20px;
text-align: left;
}
.atv,
.str {
color: #05AE0E;
}
.tag,
.pln,
.kwd {
color: #3472F7;
}
.atn {
color: #2C93FF;
}
.pln {
color: #333;
}
.com {
color: #999;
}
.space-top {
margin-top: 50px;
}
.area-line {
border: 1px solid #999;
border-left: 0;
border-right: 0;
color: #666;
display: block;
margin-top: 20px;
padding: 8px 0;
text-align: center;
}
.area-line a {
color: #666;
}
.container-fluid {
padding-right: 15px;
padding-left: 15px;
}
</style>
<!-- Fonts and icons -->
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons" />
</head>
<body class="offline-doc index-page">
<nav class="navbar navbar-color-on-scroll navbar-transparent fixed-top navbar-expand-lg " color-on-scroll="100" id="sectionsNav">
<div class="container">
<div class="navbar-translate">
<a class="navbar-brand">Material Dashboard Angular - Docs </a>
<button class="navbar-toggler" type="button" data-toggle="collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
<span class="navbar-toggler-icon"></span>
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="collapse navbar-collapse">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="https://github.com/creativetimofficial/material-dashboard-angular2/issues">Have an issue?</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="page-header header-filter clear-filter" style="background-image: url('../src/assets/img/cover.jpeg'); background-size: cover">
<div class="container">
<div class="col-md-8 ml-auto mr-auto">
<div class="brand">
<h1>Material Dashboard Angular
</h1>
<h3 class="title">Documentation v2.5.0</h3>
<br/>
<a href="https://demos.creative-tim.com/material-dashboard-angular2/documentation/tutorial" class="btn btn-white btn-round">View documentation</a>
</div>
</div>
</div>
</div>
<footer class="footer ">
<div class="container">
<nav class="pull-left">
<ul>
<li>
<a href="https://www.creative-tim.com">
Creative Tim
</a>
</li>
<li>
<a href="http://presentation.creative-tim.com">
About Us
</a>
</li>
<li>
<a href="http://blog.creative-tim.com">
Blog
</a>
</li>
<li>
<a href="https://www.creative-tim.com/license">
Licenses
</a>
</li>
</ul>
</nav>
<div class="copyright pull-right">
&copy; <script>document.write(new Date().getFullYear())</script>, made with <i class="material-icons">favorite</i> by <a href="https://www.creative-tim.com" target="_blank">Creative Tim</a> for a better web.
</div>
</div>
</footer>
</html>
import { MaterialDashboardAngularPage } from './app.po';
describe('material-dashboard-angular App', () => {
let page: MaterialDashboardAngularPage;
beforeEach(() => {
page = new MaterialDashboardAngularPage();
});
it('should display message saying app works', () => {
page.navigateTo();
expect(page.getParagraphText()).toEqual('app works!');
});
});
import { browser, element, by } from 'protractor';
export class MaterialDashboardAngularPage {
navigateTo() {
return browser.get('/');
}
getParagraphText() {
return element(by.css('app-root h1')).getText();
}
}
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"module": "commonjs",
"target": "es5",
"types":[
"jasmine",
"node"
]
}
}
// 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({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage-istanbul-reporter'),
require('@angular-devkit/build-angular/plugins/karma')
],
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
files: [
],
preprocessors: {
},
mime: {
'text/x-typescript': ['ts','tsx']
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ],
fixWebpackSourcePaths: true
},
angularCli: {
environment: 'dev'
},
reporters: config.angularCli && config.angularCli.codeCoverage
? ['progress', 'coverage-istanbul']
: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false
});
};
This diff is collapsed.
{
"name": "material-dashboard-angular",
"version": "2.5.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 && ng serve -o"
},
"engines": {
"node": "6.11.1",
"npm": "3.10.9"
},
"private": true,
"dependencies": {
"@agm/core": "^1.1.0",
"@angular/animations": "10.1.4",
"@angular/cdk": "10.2.4",
"@angular/common": "10.1.4",
"@angular/compiler": "10.1.4",
"@angular/core": "10.1.4",
"@angular/forms": "10.1.4",
"@angular/material": "10.2.4",
"@angular/platform-browser": "10.1.4",
"@angular/platform-browser-dynamic": "10.1.4",
"@angular/platform-server": "10.1.4",
"@angular/router": "10.1.4",
"ajv": "6.12.5",
"angular-oauth2-oidc": "^10.0.3",
"arrive": "2.4.1",
"bootstrap": "4.5.2",
"bootstrap-material-design": "4.1.3",
"bootstrap-notify": "3.1.3",
"chartist": "0.11.4",
"classlist.js": "1.1.20150312",
"core-js": "3.6.5",
"eslint": "^7.10.0",
"express": "4.17.1",
"googleapis": "61.0.0",
"hammerjs": "2.0.8",
"jquery": "3.5.1",
"jspdf": "^2.3.1",
"jspdf-autotable": "^3.5.20",
"moment": "2.29.1",
"ng-uikit-pro-standard": "^1.0.0",
"ng2-pdf-viewer": "^7.0.1",
"ngx-spinner": "^10.0.1",
"pdfmake": "^0.1.68",
"perfect-scrollbar": "1.5.0",
"popper.js": "1.16.1",
"primeicons": "^2.0.0",
"primeng": "^11.2.3",
"rxjs": "6.6.3",
"rxjs-compat": "6.6.3",
"sweetalert2": "^10.10.2",
"web-animations-js": "2.3.2",
"xlsx": "^0.16.9",
"zone.js": "0.11.1",
"md5-typescript": "^1.0.5"
},
"devDependencies": {
"@angular-devkit/build-angular": "0.1001.4",
"@angular/cli": "10.1.4",
"@angular/compiler-cli": "10.1.4",
"@angular/language-service": "10.1.4",
"@types/bootstrap": "4.5.0",
"@types/chartist": "0.11.0",
"@types/googlemaps": "3.39.14",
"@types/jasmine": "3.5.14",
"@types/jquery": "3.5.2",
"@types/node": "14.11.5",
"codelyzer": "6.0.1",
"jasmine-core": "3.6.0",
"jasmine-spec-reporter": "6.0.0",
"karma": "5.2.3",
"karma-chrome-launcher": "3.1.0",
"karma-cli": "2.0.0",
"karma-coverage-istanbul-reporter": "3.0.3",
"karma-jasmine": "4.0.1",
"karma-jasmine-html-reporter": "1.5.4",
"protractor": "7.0.0",
"ts-node": "9.0.0",
"tslint": "6.1.3",
"typescript": "4.0.3"
}
}
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
beforeLaunch: function() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
},
onPrepare() {
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
}
};
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
}).compileComponents();
}));
it('should create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it(`should have as title 'app works!'`, async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('app works!');
}));
it('should render title in a h1 tag', async(() => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('app works!');
}));
});
import { Component, OnInit} from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from './services/auth.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
public isLoggedIn = false;
constructor(private authService: AuthService, private router: Router) {
}
ngOnInit() {
this.isLoggedIn = this.authService.isLoggedIn();
if (!this.isLoggedIn) {
this.login();
}
}
login() {
this.authService.obtainAccessToken();
}
}
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule } from '@angular/router';
import { AppRoutingModule } from './app.routing';
import { ComponentsModule } from './components/components.module';
import { AppComponent } from './app.component';
import { DashboardComponent } from './dashboard/dashboard.component';
import { TableListComponent } from './table-list/table-list.component';
import { TypographyComponent } from './typography/typography.component';
import { IconsComponent } from './icons/icons.component';
import { UpgradeComponent } from './upgrade/upgrade.component';
import {
AgmCoreModule
} from '@agm/core';
import { AdminLayoutComponent } from './layouts/admin-layout/admin-layout.component';
import { AdminService } from './services/admin.service';
import { ButtonModule } from 'primeng/button';
import { ToastModule } from 'primeng/toast';
import { DynamicDialogModule } from 'primeng/dynamicdialog';
import { TableModule } from 'primeng/table';
import { NgxSpinnerModule } from 'ngx-spinner';
import { OAuthModule } from 'angular-oauth2-oidc';
import { AuthService } from './services/auth.service';
import { SessionDataService } from './services/session-data.service';
import { PagosComponent } from './pagos/pagos.component';
//import { PlanVacacionesUthComponent } from './pages/plan-vacaciones-uth/plan-vacaciones-uth.component';
//import { WfPermisosUthComponent } from './pages/wf-permisos-uth/wf-permisos-uth.component';
@NgModule({
imports: [
BrowserAnimationsModule,
FormsModule,
ReactiveFormsModule,
HttpClientModule,
ComponentsModule,
RouterModule,
AppRoutingModule,
NgxSpinnerModule,
AgmCoreModule.forRoot({
apiKey: 'YOUR_GOOGLE_MAPS_API_KEY'
}), ButtonModule,
ToastModule,
DynamicDialogModule,
TableModule,
OAuthModule.forRoot(),
],
declarations: [
AppComponent,
AdminLayoutComponent,
PagosComponent,
// PlanVacacionesUthComponent,
//WfPermisosUthComponent
],
providers: [AdminService, AuthService, SessionDataService],
bootstrap: [ AppComponent ]
})
export class AppModule { }
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';
const routes: Routes = [
{
path: '',
redirectTo: '****',
pathMatch: 'full',
},{
path: '',
component: AdminLayoutComponent,
children: [{
path: '',
loadChildren: './layouts/admin-layout/admin-layout.module#AdminLayoutModule'
}]
}
];
@NgModule({
imports: [
CommonModule,
BrowserModule,
RouterModule.forRoot(routes, {
useHash: true
})
],
exports: [
],
})
export class AppRoutingModule { }
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { FooterComponent } from './footer/footer.component';
import { NavbarComponent } from './navbar/navbar.component';
import { SidebarComponent } from './sidebar/sidebar.component';
@NgModule({
imports: [
CommonModule,
RouterModule,
],
declarations: [
FooterComponent,
NavbarComponent,
SidebarComponent,
],
exports: [
FooterComponent,
NavbarComponent,
SidebarComponent,
]
})
export class ComponentsModule { }
<!-- Footer -->
<footer class="footer">
<div class="container-fluid">
<!-- Copyright -->
<div class="copyright text-center">
Universidad de las Fuerzas Armadas ESPE {{test | date: 'yyyy'}},<br>Versión: {{version}} &copy; Todos los derechos reservados.
</div>
<!-- Copyright -->
</div>
</footer>
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FooterComponent } from './footer.component';
describe('FooterComponent', () => {
let component: FooterComponent;
let fixture: ComponentFixture<FooterComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FooterComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(FooterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import {version} from '../../../../package.json'
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.css']
})
export class FooterComponent implements OnInit {
test: Date = new Date();
public version: string = version;
constructor() {
console.log('footer');
}
ngOnInit() {
}
}
<nav class="navbar navbar-expand-lg navbar-brand navbar-absolute fixed-top">
<div class="container-fluid">
<div class="navbar-wrapper">
<a class="navbar-brand">
</a>
</div>
<button mat-raised-button class="navbar-toggler" type="button" (click)="sidebarToggle()">
<span class="sr-only">Toggle navigation</span>
<span class="navbar-toggler-icon icon-bar"></span>
<span class="navbar-toggler-icon icon-bar"></span>
<span class="navbar-toggler-icon icon-bar"></span>
</button>
<div class="collapse navbar-collapse justify-content-end" id="navigation">
<ul class="navbar-nav">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
{{usuario.nombres}} <br>
{{usuario.id}} <br>
<!-- {{usuario.pidm}} -->
</a>
<ul class="dropdown-menu">
<li><a [routerLink]="['/person']">Mi Perfil</a></li>
<li><a (click)="logout()">Cerrar Sesión</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NavbarComponent } from './navbar.component';
describe('NavbarComponent', () => {
let component: NavbarComponent;
let fixture: ComponentFixture<NavbarComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ NavbarComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(NavbarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, ElementRef } from '@angular/core';
import { ROUTES } from '../sidebar/sidebar.component';
import { Location, LocationStrategy, PathLocationStrategy } from '@angular/common';
import { Router } from '@angular/router';
import { AdminService } from 'app/services/admin.service';
import { AuthService } from 'app/services/auth.service';
import { SessionDataService } from 'app/services/session-data.service';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
private listTitles: any[];
location: Location;
mobile_menu_visible: any = 0;
private toggleButton: any;
private sidebarVisible: boolean;
public usuarioData: any;
idpidm;
constructor(private sessionData: SessionDataService, location: Location, private element: ElementRef, private router: Router,
private adminService: AdminService, private authService: AuthService) {
console.log('navbar');
this.location = location;
this.sidebarVisible = false;
console.log(sessionData.sessionData);
}
get usuario(){
return this.sessionData.sessionData;
}
ngOnInit() {
this.listTitles = ROUTES.filter(listTitle => listTitle);
const navbar: HTMLElement = this.element.nativeElement;
this.toggleButton = navbar.getElementsByClassName('navbar-toggler')[0];
this.router.events.subscribe((event) => {
this.sidebarClose();
var $layer: any = document.getElementsByClassName('close-layer')[0];
if ($layer) {
$layer.remove();
this.mobile_menu_visible = 0;
}
});
}
logout() {
this.authService.logout();
}
sidebarOpen() {
const toggleButton = this.toggleButton;
const body = document.getElementsByTagName('body')[0];
setTimeout(function () {
toggleButton.classList.add('toggled');
}, 500);
body.classList.add('nav-open');
this.sidebarVisible = true;
};
sidebarClose() {
const body = document.getElementsByTagName('body')[0];
this.toggleButton.classList.remove('toggled');
this.sidebarVisible = false;
body.classList.remove('nav-open');
};
sidebarToggle() {
// const toggleButton = this.toggleButton;
// const body = document.getElementsByTagName('body')[0];
var $toggle = document.getElementsByClassName('navbar-toggler')[0];
if (this.sidebarVisible === false) {
this.sidebarOpen();
} else {
this.sidebarClose();
}
const body = document.getElementsByTagName('body')[0];
if (this.mobile_menu_visible == 1) {
// $('html').removeClass('nav-open');
body.classList.remove('nav-open');
if ($layer) {
$layer.remove();
}
setTimeout(function () {
$toggle.classList.remove('toggled');
}, 400);
this.mobile_menu_visible = 0;
} else {
setTimeout(function () {
$toggle.classList.add('toggled');
}, 430);
var $layer = document.createElement('div');
$layer.setAttribute('class', 'close-layer');
if (body.querySelectorAll('.main-panel')) {
document.getElementsByClassName('main-panel')[0].appendChild($layer);
} else if (body.classList.contains('off-canvas-sidebar')) {
document.getElementsByClassName('wrapper-full-page')[0].appendChild($layer);
}
setTimeout(function () {
$layer.classList.add('visible');
}, 100);
$layer.onclick = function () { //asign a function
body.classList.remove('nav-open');
this.mobile_menu_visible = 0;
$layer.classList.remove('visible');
setTimeout(function () {
$layer.remove();
$toggle.classList.remove('toggled');
}, 400);
}.bind(this);
body.classList.add('nav-open');
this.mobile_menu_visible = 1;
}
};
getTitle() {
var titlee = this.location.prepareExternalUrl(this.location.path());
if (titlee.charAt(0) === '#') {
titlee = titlee.slice(1);
}
for (var item = 0; item < this.listTitles.length; item++) {
if (this.listTitles[item].path === titlee) {
return this.listTitles[item].title;
}
}
return 'Dashboard';
}
}
<div class="logo">
<img class="mx-auto d-block" src="../../../assets/img/Espe-Angular-Logo.png" alt="Logo - ESPE" />
</div>
<div class="sidebar-wrapper">
<div *ngIf="isMobileMenu()">
<form class="navbar-form">
<span class="bmd-form-group">
</span>
</form>
<ul class="nav navbar-nav nav-mobile-menu">
<li class="nav-item">
<a class="nav-link" href="javascript:void(0)">
<i class="material-icons">info</i>
<p>
</p>
</a>
</li>
</ul>
</div>
<ul class="nav">
<li routerLinkActive="active" *ngFor="let m of menuItems" class="{{m.clase}} nav-item">
<a class="nav-link" [routerLink]="[m.url]">
<i class="material-icons">{{m.icono}}</i>
<p>{{m.opcion}}</p>
</a>
</li>
</ul>
<ul class="nav">
<li routerLinkActive="active" *ngFor="let menuItem of menuItems2" class="{{menuItem.class}} nav-item">
<a class="nav-link" [routerLink]="[menuItem.path]">
<i class="material-icons">{{menuItem.icon}}</i>
<p>{{menuItem.title}}</p>
</a>
</li>
</ul>
</div>
\ No newline at end of file
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SidebarComponent } from './sidebar.component';
describe('SidebarComponent', () => {
let component: SidebarComponent;
let fixture: ComponentFixture<SidebarComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ SidebarComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(SidebarComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { MenuConstants } from 'app/constants/MenuConstants';
import { AdminService } from 'app/services/admin.service';
import { SessionDataService } from 'app/services/session-data.service';
import { environment } from 'environments/environment';
declare const $: any;
export const ROUTES = [
// { path: '/typography', title: 'typography', icon: 'person', class: '' },
//{ path: '/icons', title: 'icons', icon: 'person', class: '' },
// { path: '/datosPersonales', title: 'Datos', icon: 'search', class: '' },
//// { path: '/table-list', title: 'table list', icon: 'search', class: '' },
//{ path: '', title: 'TALENTO HUMANO ', icon: 'supervised_user_circle'},
// { path: '/gestion_permisos', title: 'Gestión Permisos', icon: 'search', class: '' },
// { path: '/wf_permisos_uth', title: 'WorkFlow Permisos UTH ', icon: 'search', class: '' },
// { path: '/plan_vacaciones_uth', title: 'Plan Vacaciones Director', icon: 'search', class: '' },
//{path: '', title: 'EMPLEADO', icon: 'person', class: '' },
//{ path: '/permisos_empleados', title: 'Permisos Empleados', icon: 'search', class: '' },
//{ path: '/wf_permisos', title: 'WorkFlow Permisos ', icon: 'search', class: '' },
// { path: '/plan_vacaciones', title: 'Plan Vacaciones', icon: 'search', class: '' },
// { path: '/mis-reportes', title: 'Excel 11', icon: 'search', class: '' },
//{ path: '', title: 'MANTENIMIENTO', icon:'business'},
//{ path: '/tipo_permisos', title: 'Tipo de Permisos', icon: 'search', class: '' },
//{ path: '/tipo_novedades', title: 'Tipo de Novedades', icon: 'search', class: '' },
];
@Component({
selector: 'app-sidebar',
templateUrl: './sidebar.component.html',
styleUrls: ['./sidebar.component.css']
})
export class SidebarComponent implements OnInit {
menuItems: any[];
menuItems2: any[];
constructor(private adminService: AdminService,private userData:SessionDataService) {
//this.getmenu();
console.log('sidebar');
}
get usuario(){
return this.userData.sessionData.id
}
ngOnInit() {
this.menuItems2 = ROUTES.filter(menuItem => menuItem);
setTimeout(() => {
this.getmenu();
}, 1000);
}
isMobileMenu() {
if ($(window).width() > 991) {
return false;
}
return true;
};
getmenu() {
this.adminService.findDataUser(this.usuario, environment.CODE_USERS).subscribe(
data => {
console.log(data);
if (!data.message) {
console
this.menuItems = Array.from(
new Set(data.opciones.map(x => x.opcion))
).map(datos => {
return {
opcion: data.opciones.find(s => s.opcion === datos).opcion,
url: data.opciones.find(s => s.opcion === datos).url,
icono: data.opciones.find(s => s.opcion === datos).icono,
clase: data.opciones.find(s => s.opcion === datos).clase
};
});
}
},
error => {
console.log(error);
}
);
}
}
import { AuthConfig } from 'angular-oauth2-oidc';
import { environment } from '../../environments/environment';
export const authConfig: AuthConfig = {
issuer: environment.sso.serverUrl.concat(environment.sso.issuer),
redirectUri: environment.sso.redirectUri,
clientId: environment.sso.clientId,
scope: environment.sso.scope,
tokenEndpoint: environment.sso.serverUrl.concat(environment.sso.tokenEndpoint),
userinfoEndpoint: environment.sso.serverUrl.concat(environment.sso.userinfoEndpoint),
showDebugInformation: environment.sso.showDebugInformation,
loginUrl: environment.sso.serverUrl.concat(environment.sso.authorizationEndpoint),
logoutUrl: environment.sso.serverUrl.concat(environment.sso.logout),
requireHttps: environment.sso.requireHttps,
disableAtHashCheck: true,
postLogoutRedirectUri: environment.sso.postredirectUrL,
responseType: environment.sso.responseType
};
export class MenuConstants {
public static SISTEMA = 'url';
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { DashboardComponent } from './dashboard.component';
describe('DashboardComponent', () => {
let component: DashboardComponent;
let fixture: ComponentFixture<DashboardComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ DashboardComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DashboardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import * as Chartist from 'chartist';
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit {
constructor() { }
startAnimationForLineChart(chart){
let seq: any, delays: any, durations: any;
seq = 0;
delays = 80;
durations = 500;
chart.on('draw', function(data) {
if(data.type === 'line' || data.type === 'area') {
data.element.animate({
d: {
begin: 600,
dur: 700,
from: data.path.clone().scale(1, 0).translate(0, data.chartRect.height()).stringify(),
to: data.path.clone().stringify(),
easing: Chartist.Svg.Easing.easeOutQuint
}
});
} else if(data.type === 'point') {
seq++;
data.element.animate({
opacity: {
begin: seq * delays,
dur: durations,
from: 0,
to: 1,
easing: 'ease'
}
});
}
});
seq = 0;
};
startAnimationForBarChart(chart){
let seq2: any, delays2: any, durations2: any;
seq2 = 0;
delays2 = 80;
durations2 = 500;
chart.on('draw', function(data) {
if(data.type === 'bar'){
seq2++;
data.element.animate({
opacity: {
begin: seq2 * delays2,
dur: durations2,
from: 0,
to: 1,
easing: 'ease'
}
});
}
});
seq2 = 0;
};
ngOnInit() {
/* ----------========== Daily Sales Chart initialization For Documentation ==========---------- */
const dataDailySalesChart: any = {
labels: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
series: [
[12, 17, 7, 17, 23, 18, 38]
]
};
const optionsDailySalesChart: any = {
lineSmooth: Chartist.Interpolation.cardinal({
tension: 0
}),
low: 0,
high: 50, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
chartPadding: { top: 0, right: 0, bottom: 0, left: 0},
}
var dailySalesChart = new Chartist.Line('#dailySalesChart', dataDailySalesChart, optionsDailySalesChart);
this.startAnimationForLineChart(dailySalesChart);
/* ----------========== Completed Tasks Chart initialization ==========---------- */
const dataCompletedTasksChart: any = {
labels: ['12p', '3p', '6p', '9p', '12p', '3a', '6a', '9a'],
series: [
[230, 750, 450, 300, 280, 240, 200, 190]
]
};
const optionsCompletedTasksChart: any = {
lineSmooth: Chartist.Interpolation.cardinal({
tension: 0
}),
low: 0,
high: 1000, // creative tim: we recommend you to set the high sa the biggest value + something for a better look
chartPadding: { top: 0, right: 0, bottom: 0, left: 0}
}
var completedTasksChart = new Chartist.Line('#completedTasksChart', dataCompletedTasksChart, optionsCompletedTasksChart);
// start animation for the Completed Tasks Chart - Line Chart
this.startAnimationForLineChart(completedTasksChart);
/* ----------========== Emails Subscription Chart initialization ==========---------- */
var datawebsiteViewsChart = {
labels: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],
series: [
[542, 443, 320, 780, 553, 453, 326, 434, 568, 610, 756, 895]
]
};
var optionswebsiteViewsChart = {
axisX: {
showGrid: false
},
low: 0,
high: 1000,
chartPadding: { top: 0, right: 5, bottom: 0, left: 0}
};
var responsiveOptions: any[] = [
['screen and (max-width: 640px)', {
seriesBarDistance: 5,
axisX: {
labelInterpolationFnc: function (value) {
return value[0];
}
}
}]
];
var websiteViewsChart = new Chartist.Bar('#websiteViewsChart', datawebsiteViewsChart, optionswebsiteViewsChart, responsiveOptions);
//start animation for the Emails Subscription Chart
this.startAnimationForBarChart(websiteViewsChart);
}
}
<div class="main-content">
<div class="container-fluid">
<div class="card">
<div class="card-header card-header-danger">
<h4 class="card-title">Espemático</h4>
<p class="card-category">Sistema de Documentos ESPE.</p>
</div>
<div class="card-body">
<div class="row">
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
<h2>DATOS NO ENCONTRADOS:</h2>
<div class="alert alert-primary">
<button mat-button type="button" class="close" data-dismiss="alert" aria-label="Close">
<i class="material-icons">close</i>
</button>
<span>
<b> PRIMERO - </b> Usted es un estudiante antiguo </span>
</div>
<div class="alert alert-primary">
<button mat-button type="button" class="close" data-dismiss="alert" aria-label="Close">
<i class="material-icons">close</i>
</button>
<span>
<b> SEGUNDO - </b> No se migró la información a la Base de datos.</span>
</div>
<div class="alert alert-primary">
<button mat-button type="button" class="close" data-dismiss="alert" aria-label="Close">
<i class="material-icons">close</i>
</button>
<span>
<b> TERCERO - </b> Se eliminaron datos o no se encuentra registrado en el sistema
.</span>
</div>
</div>
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
<img src="../../assets/img/mensajes/imformacion.png" alt=""
class="img img-fluid pull-center" >
</div>
</div>
</div>
</div>
</div>
</div>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ErrorComponent } from './error.component';
describe('ErrorComponent', () => {
let component: ErrorComponent;
let fixture: ComponentFixture<ErrorComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ErrorComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ErrorComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-error',
templateUrl: './error.component.html',
styleUrls: ['./error.component.css']
})
export class ErrorComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}
<div class="main-content">
<div class="container-fluid">
<div class="card card-plain">
<div class="card-header card-header-danger">
<h4 class="card-title">Material Design Icons</h4>
<p class="card-category">Handcrafted by our friends from
<a target="_blank" href="https://design.google.com/icons/">Google</a>
</p>
</div>
<div class="row">
<div class="col-md-12">
<div class="card-body">
<div class="iframe-container d-none d-lg-block">
<iframe src="https://design.google.com/icons/">
<p>Your browser does not support iframes.</p>
</iframe>
</div>
<div class="col-md-12 d-none d-sm-block d-md-block d-lg-none d-block d-sm-none text-center ml-auto mr-auto">
<h5>The icons are visible on Desktop mode inside an iframe. Since the iframe is not working on Mobile and Tablets please visit the icons on their original page on Google. Check the
<a href="https://design.google.com/icons/" target="_blank">Material Icons</a>
</h5>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IconsComponent } from './icons.component';
describe('IconsComponent', () => {
let component: IconsComponent;
let fixture: ComponentFixture<IconsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IconsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IconsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-icons',
templateUrl: './icons.component.html',
styleUrls: ['./icons.component.css']
})
export class IconsComponent implements OnInit {
constructor() {
console.log('icons');
}
ngOnInit() {
}
}
import { StringFormatDefinition } from "ajv";
export interface SessionData {
id: string;
cedula: string;
pidm: string;
nombres: string;
correoInstitucional: string;
correoPersonal: string;
}
export interface SessionData {
id_banner: string;
apellidos: string;
nombres: string;
cedula: string;
fecha_nacimiento: Date;
sexo: string;
genero: string;
estado_civil: string;
grupo_sanguineo: string;
religion: string;
prefijo: null;
titulo: string;
code_orgn: string;
fecha_original: Date;
nacionalidad: string;
identificacion_etnia: string;
pais_dn: string;
provincia_dn: string;
canton_dn: string;
parroquia_dn: string;
pais_pr: string;
provincia_pr: string;
canton_pr: string;
parroquia_pr: string;
calle_principal: string;
calle_secundaria: string;
referencia: string;
tipo_parroquia: string;
plurinacionalidad: string;
telefono: string;
celular: string;
extension: string;
correo_institucional: string;
correo_personal: string;
contacto_nombre: string;
contacto_parentesco: string;
contacto_telefono: string;
contacto_celular: string;
contacto_direccion: string;
status: string;
tipo_empleado: string;
seccion: string;
ubicacion: string;
departamento: string;
campus: string;
provincia_campus: string;
canton_campus: string;
direccion_campus: string;
puesto: null;
}
export interface DatosPersonales {
cedula?:string;
nombres?:string;
correoInstitucional?:string;
correoPersonal?:string;
pidm?:number;
}
\ No newline at end of file
import { DatePipe, Time } from "@angular/common";
export interface GestionPermisos{
'code':number;
'pidm':number;
'fechadia':DatePipe;
'hentrada':DatePipe;
'hsalida':DatePipe;
'hora':number;
'minutos':number;
'minatraso':number;
'justificacion':number;
'vacaciones':number;
'saldovacaciones':number;
'id1wf':string;
'id2wf':string;
'usercrea':string;
'usermodif':string;
'fechacrea':Date;
'fechamodif': Date;
'code_tpermiso': number;
'pdf': Blob;
'code_tpermisouth': number;
}
export interface Notificaciones{
id:number,
sistema:String
dateCreate:Date;
}
export interface Novedades{
'code'?:number;
'descripcion':string;
'estado':string;
'usercrea':string;
'usermodif'?:string;
'fechacrea'?:Date;
'fechamodif'?:Date ;
}
\ No newline at end of file
export interface Periodo{
idpidm:number,
estado:String
eclscode:String;
}
export interface Permisos {
'code':number;
'descripcion':string;
'tipoempleado' :string;
'estado':string;
'diasdesde': number;
'diashasta': number;
'usercrea':string;
'usermodif':string;
'fechacrea':Date;
'fechamodif':Date ;
'adjunto':string;
}
\ No newline at end of file
import { DatePipe, Time } from "@angular/common";
export interface PlanVacaciones{
'code': Number;
'pidm': Number;
'anio': Number;
'fechaini': DatePipe;
'fechafin': DatePipe;
'fecharet': DatePipe;
'totaldias': Number;
'estado': String;
'usercrea': String;
'usermodif': String;
'fechacrea': Date;
'fechamodif': Date;
}
\ No newline at end of file
import { DatePipe, Time } from "@angular/common";
export interface PlanVacacionesDirector{
'code': Number;
'nombres': String;
'pidm': Number;
'anio': Number;
'fechaini': DatePipe;
'fechafin': DatePipe;
'fecharet': DatePipe;
'totaldias': Number;
'estado': String;
'usercrea': String;
'usermodif': String;
'fechacrea': Date;
'fechamodif': Date;
'saldo': String;
}
\ No newline at end of file
import { DatePipe, Time } from "@angular/common";
export interface SaldoVacaciones{
periodo?:number;
pidm?:number;
nombres?:String;
totalminutosAcumulados?:number;
totalminutosTomados?:number;
totalminutosSaldo?:number;
totalminutosFeriado?:number;
totalminutosLiquidacion?:number;
saldo?:String ;
}
\ No newline at end of file
import { DatePipe, Time } from "@angular/common";
export interface WfPermisos {
'id_flujo':string;
'fecha_formulario':string;
'id_usuario':string;
'tipo_empleado':string;
'nombres':string;
'nro_tarjeta':number;
'dependencia':string;
'motivo':string;
'dia_desde':DatePipe;
'dia_hasta':DatePipe;
'dia_total':number;
'hora_desde':DatePipe;
'hora_hasta':DatePipe;
'hora_total':number;
'jefe':string;
'nombre_flujo':string;
'fecha_flujo':DatePipe;
'cedula':string;
'logon':string;
'estado':string;
'comentario':string;
'fecha_anulado':string;
'fecha_ajefe':string;
'fecha_athumano':string;
'motivo_uth':string;
'pdf': Blob;
'nombre_pdf':string;
'total_minutos':number;
}
\ No newline at end of file
<div class="wrapper">
<div class="sidebar" data-color="green" data-background-color="white" data-image="./assets/img/sidebar-4.jpg">
<app-sidebar></app-sidebar>
<div class="sidebar-background" style="background-image: url(./assets/img/sidebar-4.jpg)"></div>
</div>
<div class="main-panel">
<app-navbar></app-navbar>
<router-outlet></router-outlet>
<div *ngIf="isMaps('maps')">
<app-footer></app-footer>
</div>
</div>
</div>
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AdminLayoutComponent } from './admin-layout.component';
describe('AdminLayoutComponent', () => {
let component: AdminLayoutComponent;
let fixture: ComponentFixture<AdminLayoutComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ AdminLayoutComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AdminLayoutComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { Location, LocationStrategy, PathLocationStrategy, PopStateEvent } from '@angular/common';
import 'rxjs/add/operator/filter';
import { NavbarComponent } from '../../components/navbar/navbar.component';
import { Router, NavigationEnd, NavigationStart } from '@angular/router';
import { Subscription } from 'rxjs/Subscription';
import PerfectScrollbar from 'perfect-scrollbar';
import * as $ from "jquery";
@Component({
selector: 'app-admin-layout',
templateUrl: './admin-layout.component.html',
styleUrls: ['./admin-layout.component.scss']
})
export class AdminLayoutComponent implements OnInit {
private _router: Subscription;
private lastPoppedUrl: string;
private yScrollStack: number[] = [];
constructor( public location: Location, private router: Router) {}
ngOnInit() {
const isWindows = navigator.platform.indexOf('Win') > -1 ? true : false;
if (isWindows && !document.getElementsByTagName('body')[0].classList.contains('sidebar-mini')) {
// 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');
}
const elemMainPanel = <HTMLElement>document.querySelector('.main-panel');
const elemSidebar = <HTMLElement>document.querySelector('.sidebar .sidebar-wrapper');
this.location.subscribe((ev:PopStateEvent) => {
this.lastPoppedUrl = ev.url;
});
this.router.events.subscribe((event:any) => {
if (event instanceof NavigationStart) {
if (event.url != this.lastPoppedUrl)
this.yScrollStack.push(window.scrollY);
} else if (event instanceof NavigationEnd) {
if (event.url == this.lastPoppedUrl) {
this.lastPoppedUrl = undefined;
window.scrollTo(0, this.yScrollStack.pop());
} else
window.scrollTo(0, 0);
}
});
this._router = this.router.events.filter(event => event instanceof NavigationEnd).subscribe((event: NavigationEnd) => {
elemMainPanel.scrollTop = 0;
elemSidebar.scrollTop = 0;
});
if (window.matchMedia(`(min-width: 960px)`).matches && !this.isMac()) {
let ps = new PerfectScrollbar(elemMainPanel);
ps = new PerfectScrollbar(elemSidebar);
}
const window_width = $(window).width();
let $sidebar = $('.sidebar');
let $sidebar_responsive = $('body > .navbar-collapse');
let $sidebar_img_container = $sidebar.find('.sidebar-background');
if(window_width > 767){
if($('.fixed-plugin .dropdown').hasClass('show-dropdown')){
$('.fixed-plugin .dropdown').addClass('open');
}
}
$('.fixed-plugin a').click(function(event){
// Alex if we click on switch, stop propagation of the event, so the dropdown will not be hide, otherwise we set the section active
if($(this).hasClass('switch-trigger')){
if(event.stopPropagation){
event.stopPropagation();
}
else if(window.event){
window.event.cancelBubble = true;
}
}
});
$('.fixed-plugin .badge').click(function(){
let $full_page_background = $('.full-page-background');
$(this).siblings().removeClass('active');
$(this).addClass('active');
var new_color = $(this).data('color');
if($sidebar.length !== 0){
$sidebar.attr('data-color', new_color);
}
if($sidebar_responsive.length != 0){
$sidebar_responsive.attr('data-color',new_color);
}
});
$('.fixed-plugin .img-holder').click(function(){
let $full_page_background = $('.full-page-background');
$(this).parent('li').siblings().removeClass('active');
$(this).parent('li').addClass('active');
var new_image = $(this).find("img").attr('src');
if($sidebar_img_container.length !=0 ){
$sidebar_img_container.fadeOut('fast', function(){
$sidebar_img_container.css('background-image','url("' + new_image + '")');
$sidebar_img_container.fadeIn('fast');
});
}
if($full_page_background.length != 0){
$full_page_background.fadeOut('fast', function(){
$full_page_background.css('background-image','url("' + new_image + '")');
$full_page_background.fadeIn('fast');
});
}
if($sidebar_responsive.length != 0){
$sidebar_responsive.css('background-image','url("' + new_image + '")');
}
});
}
ngAfterViewInit() {
this.runOnRouteChange();
}
isMaps(path){
var titlee = this.location.prepareExternalUrl(this.location.path());
titlee = titlee.slice( 1 );
if(path == titlee){
return false;
}
else {
return true;
}
}
runOnRouteChange(): void {
if (window.matchMedia(`(min-width: 960px)`).matches && !this.isMac()) {
const elemMainPanel = <HTMLElement>document.querySelector('.main-panel');
const ps = new PerfectScrollbar(elemMainPanel);
ps.update();
}
}
isMac(): boolean {
let bool = false;
if (navigator.platform.toUpperCase().indexOf('MAC') >= 0 || navigator.platform.toUpperCase().indexOf('IPAD') >= 0) {
bool = true;
}
return bool;
}
}
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatNativeDateModule, MatRippleModule } from '@angular/material/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip';
import {MatExpansionModule} from '@angular/material/expansion';
import { RouterModule } from '@angular/router';
import { NgxSpinnerModule } from 'ngx-spinner';
import { ButtonModule } from 'primeng/button';
import { DynamicDialogModule } from 'primeng/dynamicdialog';
import { TableModule } from 'primeng/table';
import { ToastModule } from 'primeng/toast';
//import { DashboardComponent } from '../../dashboard/dashboard.component';
//import { IconsComponent } from '../../icons/icons.component';
import { TableListComponent } from '../../table-list/table-list.component';
//import { TypographyComponent } from '../../typography/typography.component';
import { UpgradeComponent } from '../../upgrade/upgrade.component';
import { AdminLayoutRoutes } from './admin-layout.routing';
import { DialogModule } from 'primeng/dialog';
import { DropdownModule } from 'primeng/dropdown';
import { RadioButtonModule } from 'primeng/radiobutton';
import { MisReportesComponent } from '../../pages/mis-reportes/mis-reportes.component';
import {PermisosComponent} from '../../pages/permisos/permisos.component';
import {NovedadesComponent} from '../../pages/novedades/novedades.component';
//import { GestionPermisosComponent } from '../../pages/gestionPermisos/gestionPermisos.component';
import { PdfViewerModule } from 'ng2-pdf-viewer';
//import {PermisosEmpleadosComponent} from '../../pages/permisosEmpleados/permisosEmpleados.component';
import { PlanVacacionesComponent } from '../../pages/planVacaciones/planVacaciones.component';
//import {PermisosEmpleadosComponent} from '../../pages/permisosEmpleados/permisosEmpleados.component';
import { PlanVacacionesUthComponent } from '../../pages/plan-vacaciones-uth/plan-vacaciones-uth.component';
import {FileUploadModule} from 'primeng/fileupload';
//import {HttpClientModule} from '@angular/common/http';
import { PermisosEmpleadosComponent } from '../../pages/permisos-empleados/permisos-empleados.component';
// import {InputNumberModule} from 'primeng/inputnumber';
import {BlockUIModule} from 'primeng/blockui';
import { MatRadioModule } from '@angular/material/radio';
import { WfPermisosComponent } from '../../pages/wf-permisos/wf-permisos.component';
import { WfPermisosUthComponent } from '../../pages/wf-permisos-uth/wf-permisos-uth.component';
import {MatDatepickerModule} from '@angular/material/datepicker';
import { HttpClientModule } from '@angular/common/http';
import { ErrorComponent } from 'app/error/error.component';
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(AdminLayoutRoutes),
FormsModule,
ReactiveFormsModule,
NgxSpinnerModule,
MatButtonModule,
MatRippleModule,
MatFormFieldModule,
MatInputModule,
MatExpansionModule,
MatRadioModule,
MatSelectModule,
MatTooltipModule,
ButtonModule,
ToastModule,
DynamicDialogModule,
TableModule,
DialogModule,
DropdownModule,
RadioButtonModule,
BlockUIModule,
FileUploadModule,
MatDatepickerModule,
HttpClientModule,
MatNativeDateModule ,
PdfViewerModule
// InputNumberModule,
],
declarations: [
// DashboardComponent,
TableListComponent,
//TypographyComponent,
//IconsComponent,
// UpgradeComponent,
//ErrorComponent,
MisReportesComponent,
PermisosComponent,
NovedadesComponent,
// GestionPermisosComponent,
PlanVacacionesComponent,
PermisosEmpleadosComponent,
WfPermisosComponent,
WfPermisosUthComponent,
PlanVacacionesUthComponent
],
})
export class AdminLayoutModule { }
import { Routes } from '@angular/router';
import { DashboardComponent } from '../../dashboard/dashboard.component';
import { TableListComponent } from '../../table-list/table-list.component';
import { TypographyComponent } from '../../typography/typography.component';
import { IconsComponent } from '../../icons/icons.component';
import { UpgradeComponent } from '../../upgrade/upgrade.component';
import { DatosPersonalesComponent } from 'app/pages/datos-personales/datos-personales.component';
import { MisReportesComponent } from 'app/pages/mis-reportes/mis-reportes.component';
import { PermisosComponent } from 'app/pages/permisos/permisos.component';
import { NovedadesComponent } from 'app/pages/novedades/novedades.component';
//import { GestionPermisosComponent } from 'app/pages/gestionPermisos/gestionPermisos.component';
import {PlanVacacionesComponent} from 'app/pages/planVacaciones/planVacaciones.component';
import { PermisosEmpleadosComponent } from 'app/pages/permisos-empleados/permisos-empleados.component';
import { WfPermisosComponent } from 'app/pages/wf-permisos/wf-permisos.component';
import { WfPermisosUthComponent } from 'app/pages/wf-permisos-uth/wf-permisos-uth.component';
import { PlanVacacionesUthComponent } from 'app/pages/plan-vacaciones-uth/plan-vacaciones-uth.component';
export const AdminLayoutRoutes: Routes = [
// { path: 'dashboard', component: DashboardComponent },
// { path: 'typography', component: TypographyComponent },
// { path: 'icons', component: IconsComponent },
// { path: 'upgrade', component: UpgradeComponent },
// { path: 'datosPersonales', component: DatosPersonalesComponent },
// { path: 'mis-reportes', component: MisReportesComponent },
{ path: 'table-list', component: TableListComponent },
{ path: 'tipo_permisos', component: PermisosComponent },
{ path: 'tipo_novedades', component: NovedadesComponent },
// { path: 'gestion_permisos', component: GestionPermisosComponent },
{ path: 'plan_vacaciones', component: PlanVacacionesComponent },
{ path: 'plan_vacaciones_uth', component: PlanVacacionesUthComponent },
{ path: 'permisos_empleados', component: PermisosEmpleadosComponent },
{ path: 'wf_permisos', component: WfPermisosComponent },
{ path: 'wf_permisos_uth', component: WfPermisosUthComponent }
];
<div class="main-content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="container-fluid">
<div class="row">
<div class="col-md-4">
<dl>
<dt>
prueba
</dt>
<dd>
A description list is perfect for defining terms.
</dd>
<dt>
Euismod
</dt>
<dd>
Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.
</dd>
<dd>
Donec id elit non mi porta gravida at eget metus.
</dd>
<dt>
Malesuada porta
</dt>
<dd>
Etiam porta sem malesuada magna mollis euismod.
</dd>
<dt>
Felis euismod semper eget lacinia
</dt>
<dd>
Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
</dd>
</dl>
</div>
<div class="col-md-4">
<!-- <p-table [value]="notificacion">
<ng-template pTemplate="header">
<tr>
<th>Code</th>
<th>Name</th>
<th>Category</th>
<th>Quantity</th>
</tr>
</ng-template>
<ng-template pTemplate="body" let-product>
<tr>
<td>{{product.id}}</td>
<td>{{product.name}}</td>
<td>{{product.category}}</td>
<td>{{product.quantity}}</td>
</tr>
</ng-template>
</p-table> -->
</div>
<div class="col-md-4">
<img alt="Bootstrap Image Preview" src="https://www.layoutit.com/img/sports-q-c-140-140-3.jpg" class="rounded-circle" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
\ No newline at end of file
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DatosPersonalesComponent } from './datos-personales.component';
describe('DatosPersonalesComponent', () => {
let component: DatosPersonalesComponent;
let fixture: ComponentFixture<DatosPersonalesComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ DatosPersonalesComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DatosPersonalesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { Notificaciones } from 'app/interfaces/notificacion.interface';
import { AdminService } from 'app/services/admin.service';
@Component({
selector: 'app-datos-personales',
templateUrl: './datos-personales.component.html',
styleUrls: ['./datos-personales.component.css']
})
export class DatosPersonalesComponent implements OnInit {
notificacion:Notificaciones[]=[];
constructor(private adminService: AdminService) {
this.adminService.get('notificacion').subscribe(
data=>{
data
this.notificacion = data
console.log(data);
}
)
this.adminService.getdata('datos','17096165671').subscribe(
data=>{
console.log(data);
console.log('1');
}
)
console.log('1');
console.log('1');
console.log('4');
console.log('5');
}
ngOnInit(): void {
}
}
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MisReportesComponent } from './mis-reportes.component';
describe('MisReportesComponent', () => {
let component: MisReportesComponent;
let fixture: ComponentFixture<MisReportesComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ MisReportesComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(MisReportesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment