<!DOCTYPE html>
<html>
<head>
<base href="." />
<script type="text/javascript" charset="utf-8">
window.window.AngularVersionForThisPlunker = 'latest'
</script>
<title>angular playground</title>
<link rel="stylesheet" href="style.css" />
<script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script>
<script src="https://unpkg.com/zone.js/dist/zone.js"></script>
<script src="https://unpkg.com/zone.js/dist/long-stack-trace-zone.js"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
<script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import('app')
.catch(console.error.bind(console));
</script>
</head>
<body>
<my-app>
loading...
</my-app>
</body>
</html>
/* Styles go here */
### Angular Starter Plunker - Typescript
var angularVersion;
if(window.AngularVersionForThisPlunker === 'latest'){
angularVersion = ''; //picks up latest
}
else {
angularVersion = '@' + window.AngularVersionForThisPlunker;
}
System.config({
//use typescript for compilation
transpiler: 'typescript',
//typescript compiler options
typescriptOptions: {
emitDecoratorMetadata: true
},
paths: {
'npm:': 'https://unpkg.com/'
},
//map tells the System loader where to look for things
map: {
'app': './src',
'@angular/core': 'npm:@angular/core'+ angularVersion + '/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common' + angularVersion + '/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler' + angularVersion + '/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic' + angularVersion + '/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http' + angularVersion + '/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router' + angularVersion +'/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms' + angularVersion + '/bundles/forms.umd.js',
'@angular/animations': 'npm:@angular/animations' + angularVersion + '/bundles/animations.umd.js',
'@angular/platform-browser/animations': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser-animations.umd.js',
'@angular/animations/browser': 'npm:@angular/animations' + angularVersion + '/bundles/animations-browser.umd.js',
'@angular/core/testing': 'npm:@angular/core' + angularVersion + '/bundles/core-testing.umd.js',
'@angular/common/testing': 'npm:@angular/common' + angularVersion + '/bundles/common-testing.umd.js',
'@angular/compiler/testing': 'npm:@angular/compiler' + angularVersion + '/bundles/compiler-testing.umd.js',
'@angular/platform-browser/testing': 'npm:@angular/platform-browser' + angularVersion + '/bundles/platform-browser-testing.umd.js',
'@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic' + angularVersion + '/bundles/platform-browser-dynamic-testing.umd.js',
'@angular/http/testing': 'npm:@angular/http' + angularVersion + '/bundles/http-testing.umd.js',
'@angular/router/testing': 'npm:@angular/router' + angularVersion + '/bundles/router-testing.umd.js',
'tslib': 'npm:tslib@1.6.1',
'rxjs': 'npm:rxjs',
'typescript': 'npm:typescript@2.2.1/lib/typescript.js',
'angularfire2': 'npm:angularfire2',
'firebase': 'npm:firebase@3.7.1'
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
},
angularfire2: {
main: 'angularfire2.js'
},
firebase: {
main: 'firebase.js'
}
}
});
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { Router, NavigationStart } from '@angular/router'
@Component({
selector: 'my-app',
templateUrl: 'src/app.component.html'
})
export class App {
public titulo: string;
public currentRoute: string;
constructor( private _router: Router){
this.titulo = "ALBUMS";
_router.events.subscribe(event => {
if(event instanceof NavigationStart) {
this.currentRoute = event.url;
}
});
console.log(this._router.url);
}
}
import { Component } from '@angular/core';
@Component({
selector: 'home',
templateUrl: './src/home.component.html'
})
export class HomeComponent{
public titulo: string;
constructor(){
this.titulo = "Webapp de conexión con Firebase";
}
}
<div class="col-lg-10 col-lg-offset-1">
<header class="col-lg-12">
<h1>{{titulo}}</h1>
</header>
<nav class="col-lg-12" *ngIf="currentRoute == '/admin' || currentRoute == '/home' || currentRoute == '/'">
<ul>
<li><a [routerLink]="['/home']">Home</a></li>
<li><a [routerLink]="['/admin']">Admin</a></li>
</ul>
</nav>
<section class="col-lg-12">
<router-outlet></router-outlet>
</section>
<footer class="col-lg-12">
Prueba4-firebase
</footer>
</div>
<h1>{{titulo}}</h1>
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
//componentes
import {HomeComponent} from './home.component';
import {AdminComponent} from './admin.component';
import {AlbumEditComponent} from './album-edit.component';
import {AlbumDetailComponent} from './album-detail.component';
const appRoutes: Routes = [
{path: '', component: HomeComponent},
{path: 'home', component: HomeComponent},
{path: 'admin', component: AdminComponent, children: [
{path: 'editar-producto/:id', component: AlbumEditComponent }]},
{path: 'albums/:id', component: AlbumDetailComponent},
{path: '**', component: HomeComponent}
];
export const appRoutingProviders: any[] = [];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';
import { App } from './app.component';
import {routing, appRoutingProviders} from './app.routing';
import {HomeComponent} from './home.component';
import {AdminComponent} from './admin.component';
import {AlbumEditComponent} from './album-edit.component';
import {AlbumDetailComponent} from './album-detail.component';
import { AngularFireModule } from 'angularfire2';
import { AngularFireDatabaseModule } from 'angularfire2/database';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFireAuth } from 'angularfire2/auth';
import {KeysPipe} from './iterareObject.pipe';
export const firebaseConfig = {
apiKey: "AIzaSyCsRq9FXhqcnYPSkfuTeFjFsxrmihQNhso",
authDomain: "prueba5-firebase-649c0.firebaseapp.com",
databaseURL: "https://prueba5-firebase-649c0.firebaseio.com",
projectId: "prueba5-firebase-649c0",
storageBucket: "prueba5-firebase-649c0.appspot.com",
messagingSenderId: "305625196867"
};
@NgModule({
declarations: [
App, HomeComponent, AdminComponent, AlbumEditComponent, AlbumDetailComponent, KeysPipe
],
imports: [
BrowserModule,
FormsModule,
HttpModule,
routing,
AngularFireModule.initializeApp(firebaseConfig),
AngularFireDatabaseModule,
AngularFireAuthModule
],
providers: [appRoutingProviders,AngularFireAuth],
bootstrap: [App]
})
export class AppModule { }
import { Component, Input } from '@angular/core';
import {AlbumService} from './album.service';
import { AngularFireAuth } from 'angularfire2/auth';
import { FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2/database';
import * as firebase from 'firebase/app';
import { Observable } from 'rxjs/Observable';
import { Router, ActivatedRoute, NavigationStart } from '@angular/router';
import 'rxjs/add/operator/pairwise';
@Component({
selector: 'admin',
templateUrl: './src/admin.component.html',
providers: [AlbumService, AngularFireAuth]
})
export class AdminComponent {
public titulo: string;
public user: Observable<firebase.User>;
public albums: FirebaseObjectObservable<any>;
public currentRoute: string;
public currentRoute2: string;
public users: string;
public mundos: Array<any> = [];
public mundo: Array<string>;
@Input() selectedAlbum;
public albums2: string;
public albums3: FirebaseObjectObservable<any>
public lookOver: boolean;
constructor(private albumService: AlbumService, private router: Router, private _route: ActivatedRoute){
this.titulo = "Página del administrador";
this.user = this.albumService.user;
this.lookOver = false;
this.currentRoute2 = this.router.url;
this.router.events.subscribe(event => {
if (this.currentRoute === undefined){
this.lookOver = true;
}
if(event instanceof NavigationStart) {
this.currentRoute = event.url;
if (this.currentRoute === undefined || this.currentRoute === '/admin'){//(this.currentRoute === undefined && this.currentRoute2 === '/admin') || (this.currentRoute === '/admin' && this.currentRoute2 === '/admin')){
this.lookOver = true;
} else if (this.currentRoute === "/admin/editar-producto/Arvahall"){
this.lookOver = false;
}
}
// NavigationEnd
// NavigationCancel
// NavigationError
// RoutesRecognized
});
console.log(this._route.snapshot.url[0].path);
this.albums = this.albumService.getAlbums();
console.log(this.albums);
this.albums.subscribe(data => {
this.albums3 = data;
console.log(this.albums3);
})
console.log(this.currentRoute);
}
ngOnInit(){
console.log(this.currentRoute2);
console.log(this.currentRoute);
console.log(this.user);
}
}
<div>
<div *ngIf="albums">
<div *ngFor="let album of (albums3 | keys)" >
{{album.key}} - {{album?.title}}
<a [routerLink]="['./editar-producto',album.key]" >Editar</a>
</div>
</div>
<div *ngIf="lookOver">
<h3>{{titulo}}</h3>
<form #formAlbum="ngForm" class="col-lg-12" (ngSubmit)="submitForm(newArtist.value,newTitle.value,newDescription.value);
newTitle.value='';newArtist.value='';newDescription.value=''">
<div class="col-lg-6">
<div>
<label>Titulo</label>
<input #newTitle="ngModel" name="title" [ngModel]="selectedAlbum?.title" (ngModelChange)="selectedAlbum.title = $event">
</div>
<div>
<label>Artist</label>
<input #newArtist name="artist" [ngModel]="selectedAlbum?.artist" (ngModelChange)="selectedAlbum.artist = $event">
</div>
<div>
<label>Description</label>
<textarea #newDescription name="description" [ngModel]="selectedAlbum?.description" (ngModelChange)="selectedAlbum.description = $event"></textarea>
</div>
<div>
<input type="submit" value="Guardar"/>
<button (click)="beginUpdatingAlbum(selectedAlbum)">Update</button>
</div>
</div>
</form>
</div>
</div>
<hr/>
<router-outlet></router-outlet>
import { Injectable } from '@angular/core';
import { Router, CanActivate } from '@angular/router';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router) { }
canActivate() {
console.log(localStorage.getItem('nombre'));
if (localStorage.getItem('nombre')) {
// logged in so return true
return true;
}
// not logged in so redirect to login page
this.router.navigate(['/home']);
return false;
}
}
import {Injectable} from '@angular/core';
import {Album} from '../models/Album';
import {AngularFireDatabase, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2/database';
import { Observable } from 'rxjs/Observable';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
@Injectable()
export class AlbumService{
public albums: FirebaseObjectObservable<any>;
public user: Observable<firebase.User>;
constructor(private database: AngularFireDatabase, public afAuth: AngularFireAuth){
this.user = afAuth.authState;
console.log(this.user);
}
getAlbums(){
this.albums = this.database.object('/');
return this.albums;
}
/*addAlbum(newAlbum: Album){
this.albums.push(newAlbum);
}*/
//2º parte
getAlbumById(albumId: string){
return this.database.object('/albums/' + albumId);
}
updateAlbum(localUpdatedAlbum){
var albumEntryInFirebase = this.getAlbumById(localUpdatedAlbum.$key);
console.log(albumEntryInFirebase);
albumEntryInFirebase.update({title: localUpdatedAlbum.title,
artist: localUpdatedAlbum.artist,
description: localUpdatedAlbum.description});
}
deleteAlbum(localAlbumToDelete){
var albumEntryInFirebase = this.getAlbumById(localAlbumToDelete.$key);
albumEntryInFirebase.remove();
}
}
import { Component, Input, ViewChild, OnInit, AfterViewInit } from '@angular/core';
import { Router, ActivatedRoute, Params, NavigationStart } from '@angular/router';
import {AlbumService} from './album.service';
import {Album} from '../models/Album';
import { AngularFireAuth } from 'angularfire2/auth';
import {AngularFireDatabase, FirebaseObjectObservable } from 'angularfire2/database';
@Component({
selector: 'album-edit',
templateUrl: './src/album-edit.component.html',
providers: [AlbumService, AngularFireAuth]
})
export class AlbumEditComponent implements OnInit, AfterViewInit {
@ViewChild("commentForm") form;
// http://stackoverflow.com/questions/34615425/how-to-watch-for-form-changes-in-angular-2
firebaseInitComplete = false;
model: FirebaseObjectObservable<any>
firebaseForm: FirebaseObjectObservable<any>;
public albumId: string;
@Input() selectedAlbum;
public currentRoute: string;
public currentRoute2: string;
constructor(private af: AngularFireDatabase,private _route: ActivatedRoute,private albumService: AlbumService
, private router: Router ) {
this.currentRoute2 = this.router.url;
router.events.subscribe(event => {
if(event instanceof NavigationStart) {
this.currentRoute = event.url;
}
// NavigationEnd
// NavigationCancel
// NavigationError
// RoutesRecognized
});
}
ngAfterViewInit() {
this.form.control.valueChanges
.subscribe(values => {
// If we haven't get the initial value from firebase yet,
// values will be empty strings. And we don't want to overwrite
// real firebase value with empty string on page load
if (!this.firebaseInitComplete) { return; }
// If this is a change after page load (getting initial firebase value) update it on firebase to enable 3-way binding
this.firebaseForm.update(values);
});
}
ngOnInit() {
this._route.params.forEach((urlParameters) => {
this.albumId = urlParameters['id'];
});
this.selectedAlbum = this.getAlbumById(this.albumId).$ref.key;
console.log(this.selectedAlbum);
this.firebaseForm = this.af.object("/"+this.selectedAlbum+"/config/");
// Listen to changes on server
console.log(this.firebaseForm);
this.firebaseForm.subscribe(data => {
this.firebaseInitComplete = true; // Mark first data retrieved from server
this.model = data;
console.log(this.model);
});
console.log(this.currentRoute2);
}
getAlbumById(albumId: string){
var objeto = this.af.object('/Arvahall/' + albumId);
console.log(objeto);
return objeto;
}
}
<h1>{{titulo}}</h1>
<!--<form #formEdit="ngForm" (ngSubmit)="beginUpdatingAlbum(selectedAlbum)" >
<div>
<label>Titulo</label>
<input #title="ngModel" name="title" [ngModel]="selectedAlbum?.title" (ngModelChange)="selectedAlbum.title = $event"/>
</div>
<div>
<label>Artista</label>
<input #artista="ngModel" name="artista" [ngModel]="selectedAlbum?.artist" (ngModelChange)="selectedAlbum.artist = $event"/>
</div>
<div>
<label>Descripción</label>
<textarea #description="ngModel" name="description" [ngModel]="selectedAlbum?.description" (ngModelChange)="selectedAlbum.description = $event"></textarea>
</div>
<div>
<input type="submit" value="Guardar"/>
<button (click)="beginDeletingAlbum(selectedAlbum)">Borrar</button>
</div>
</form>
<div><a [routerLink]="['/admin']">Volver a admin</a></div>-->
<form (ngSubmit)="onSubmit()" #commentForm="ngForm">
<input [(ngModel)]="model.suministros" type="input" name="suministros" required>
</form>
<div><a [routerLink]="['/admin']">Volver a admin</a></div>
import { Component } from '@angular/core';
import {ActivatedRoute } from '@angular/router';
import {AlbumService} from './album.service';
import { AngularFireAuth } from 'angularfire2/auth';
import { FirebaseObjectObservable } from 'angularfire2/database';
@Component ({
selector: 'album-detail',
templateUrl: './src/album-detail.component.html',
providers: [AlbumService, AngularFireAuth]
})
export class AlbumDetailComponent{
public albumId: string;
public albumToDisplay;
constructor(private route: ActivatedRoute, private albumService: AlbumService) { }
ngOnInit() {
this.route.params.forEach((urlParameters) => {
this.albumId = urlParameters['id'];
});
this.albumToDisplay = this.albumService.getAlbumById(this.albumId);
}
}
<div>
<h3>{{(albumToDisplay | async)?.title}}</h3>
<h4>{{(albumToDisplay | async)?.artist}}</h4>
<p>{{(albumToDisplay | async)?.description}}</p>
</div>
<album-edit></album-edit>
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
transform(value, args:string[]) : any {
let keys = [];
for (let key in value) {
keys.push({key: key, value: value[key]});
}
return keys;
}
}