Add account settings new design

This commit is contained in:
Chocobozzz 2017-12-01 17:38:26 +01:00
parent 2bbb34127f
commit c30745f342
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
34 changed files with 263 additions and 256 deletions

View File

@ -1,14 +1,12 @@
import { Injectable } from '@angular/core'
import { HttpClient, HttpParams } from '@angular/common/http' import { HttpClient, HttpParams } from '@angular/common/http'
import { Observable } from 'rxjs/Observable' import { Injectable } from '@angular/core'
import { BytesPipe } from 'ngx-pipes'
import { SortMeta } from 'primeng/components/common/sortmeta'
import 'rxjs/add/operator/catch' import 'rxjs/add/operator/catch'
import 'rxjs/add/operator/map' import 'rxjs/add/operator/map'
import { Observable } from 'rxjs/Observable'
import { SortMeta } from 'primeng/components/common/sortmeta' import { ResultList, UserCreate, UserUpdate } from '../../../../../../shared'
import { BytesPipe } from 'angular-pipes/src/math/bytes.pipe' import { RestExtractor, RestPagination, RestService, User } from '../../../shared'
import { RestExtractor, User, RestPagination, RestService } from '../../../shared'
import { UserCreate, UserUpdate, ResultList } from '../../../../../../shared'
@Injectable() @Injectable()
export class UserService { export class UserService {

View File

@ -1,24 +0,0 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<form role="form" (ngSubmit)="changePassword()" [formGroup]="form">
<div class="form-group">
<label for="new-password">New password</label>
<input
type="password" class="form-control" id="new-password"
formControlName="new-password"
>
<div *ngIf="formErrors['new-password']" class="alert alert-danger">
{{ formErrors['new-password'] }}
</div>
</div>
<div class="form-group">
<label for="name">Confirm new password</label>
<input
type="password" class="form-control" id="new-confirmed-password"
formControlName="new-confirmed-password"
>
</div>
<input type="submit" value="Change password" class="btn btn-default" [disabled]="!form.valid">
</form>

View File

@ -1,16 +0,0 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<form role="form" (ngSubmit)="updateDetails()" [formGroup]="form">
<div class="form-group">
<input
type="checkbox" id="displayNSFW"
formControlName="displayNSFW"
>
<label for="displayNSFW">Display videos that contain mature or explicit content</label>
<div *ngIf="formErrors['displayNSFW']" class="alert alert-danger">
{{ formErrors['displayNSFW'] }}
</div>
</div>
<input type="submit" value="Update" class="btn btn-default" [disabled]="!form.valid">
</form>

View File

@ -5,17 +5,33 @@ import { MetaGuard } from '@ngx-meta/core'
import { LoginGuard } from '../core' import { LoginGuard } from '../core'
import { AccountComponent } from './account.component' import { AccountComponent } from './account.component'
import { AccountSettingsComponent } from './account-settings/account-settings.component'
const accountRoutes: Routes = [ const accountRoutes: Routes = [
{ {
path: 'account', path: 'account',
component: AccountComponent, component: AccountComponent,
canActivate: [ MetaGuard, LoginGuard ], canActivateChild: [ MetaGuard, LoginGuard ],
children: [
{
path: 'settings',
component: AccountSettingsComponent,
data: { data: {
meta: { meta: {
title: 'My account' title: 'Account settings'
} }
} }
},
// {
// path: 'videos',
// component: AccountVideosComponent,
// data: {
// meta: {
// title: 'Account videos'
// }
// }
// }
]
} }
] ]

View File

@ -0,0 +1,18 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<form role="form" (ngSubmit)="changePassword()" [formGroup]="form">
<input
type="password" class="form-control" id="new-password" placeholder="Old password"
formControlName="new-password"
>
<div *ngIf="formErrors['new-password']" class="alert alert-danger">
{{ formErrors['new-password'] }}
</div>
<input
type="password" id="new-confirmed-password" placeholder="New password"
formControlName="new-confirmed-password"
>
<input type="submit" value="Change password" [disabled]="!form.valid">
</form>

View File

@ -0,0 +1,9 @@
input[type=password] {
@include peertube-input-text(340px);
display: block;
margin-bottom: 10px;
}
input[type=submit] {
@include peertube-button;
}

View File

@ -1,16 +1,13 @@
import { Component, OnInit } from '@angular/core' import { Component, OnInit } from '@angular/core'
import { FormBuilder, FormGroup } from '@angular/forms' import { FormBuilder, FormGroup } from '@angular/forms'
import { Router } from '@angular/router'
import { NotificationsService } from 'angular2-notifications' import { NotificationsService } from 'angular2-notifications'
import { FormReactive, USER_PASSWORD, UserService } from '../../../shared'
import { FormReactive, UserService, USER_PASSWORD } from '../../shared'
@Component({ @Component({
selector: 'my-account-change-password', selector: 'my-account-change-password',
templateUrl: './account-change-password.component.html' templateUrl: './account-change-password.component.html',
styleUrls: [ './account-change-password.component.scss' ]
}) })
export class AccountChangePasswordComponent extends FormReactive implements OnInit { export class AccountChangePasswordComponent extends FormReactive implements OnInit {
error: string = null error: string = null

View File

@ -0,0 +1,14 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<form role="form" (ngSubmit)="updateDetails()" [formGroup]="form">
<input
type="checkbox" id="displayNSFW"
formControlName="displayNSFW"
>
<label for="displayNSFW">Display videos that contain mature or explicit content</label>
<div *ngIf="formErrors['displayNSFW']" class="alert alert-danger">
{{ formErrors['displayNSFW'] }}
</div>
<input type="submit" value="Update" [disabled]="!form.valid">
</form>

View File

@ -0,0 +1,11 @@
label {
font-size: 15px;
font-weight: $font-regular;
margin-left: 5px;
}
input[type=submit] {
@include peertube-button;
display: block;
}

View File

@ -1,21 +1,14 @@
import { Component, OnInit, Input } from '@angular/core' import { Component, Input, OnInit } from '@angular/core'
import { FormBuilder, FormGroup } from '@angular/forms' import { FormBuilder, FormGroup } from '@angular/forms'
import { Router } from '@angular/router'
import { NotificationsService } from 'angular2-notifications' import { NotificationsService } from 'angular2-notifications'
import { UserUpdateMe } from '../../../../../../shared'
import { AuthService } from '../../core' import { AuthService } from '../../../core'
import { import { FormReactive, User, UserService } from '../../../shared'
FormReactive,
User,
UserService,
USER_PASSWORD
} from '../../shared'
import { UserUpdateMe } from '../../../../../shared'
@Component({ @Component({
selector: 'my-account-details', selector: 'my-account-details',
templateUrl: './account-details.component.html' templateUrl: './account-details.component.html',
styleUrls: [ './account-details.component.scss' ]
}) })
export class AccountDetailsComponent extends FormReactive implements OnInit { export class AccountDetailsComponent extends FormReactive implements OnInit {

View File

@ -0,0 +1,9 @@
<div class="user-info">
{{ user.username }}
</div>
<div class="account-title">Account settings</div>
<my-account-change-password></my-account-change-password>
<div class="account-title">Filtering</div>
<my-account-details [user]="user"></my-account-details>

View File

@ -0,0 +1,13 @@
.user-info {
font-size: 20px;
font-weight: $font-bold;
}
.account-title {
text-transform: uppercase;
color: $orange-color;
font-weight: $font-bold;
font-size: 13px;
margin-top: 55px;
margin-bottom: 30px;
}

View File

@ -0,0 +1,18 @@
import { Component, OnInit } from '@angular/core'
import { User } from '../../shared'
import { AuthService } from '../../core'
@Component({
selector: 'my-account-settings',
templateUrl: './account-settings.component.html',
styleUrls: [ './account-settings.component.scss' ]
})
export class AccountSettingsComponent implements OnInit {
user: User = null
constructor (private authService: AuthService) {}
ngOnInit () {
this.user = this.authService.getUser()
}
}

View File

@ -1,25 +1,11 @@
<div class="row"> <div class="row">
<div class="content-padding"> <div class="sub-menu">
<h3>Account</h3> <a routerLink="/account/settings" routerLinkActive="active" class="title-page">My account</a>
<div class="col-md-6 col-sm-12"> <a routerLink="/account/videos" routerLinkActive="active" class="title-page">My videos</a>
<div class="panel panel-default">
<div class="panel-heading">Change password</div>
<div class="panel-body">
<my-account-change-password></my-account-change-password>
</div>
</div>
</div> </div>
<div class="col-md-6 col-sm-12"> <div class="margin-content">
<div class="panel panel-default"> <router-outlet></router-outlet>
<div class="panel-heading">Update my informations</div>
<div class="panel-body">
<my-account-details [user]="user"></my-account-details>
</div>
</div>
</div>
</div> </div>
</div> </div>

View File

@ -1,3 +0,0 @@
.panel {
margin-top: 40px;
}

View File

@ -1,28 +1,8 @@
import { Component, OnInit } from '@angular/core' import { Component } from '@angular/core'
import { FormBuilder, FormGroup } from '@angular/forms'
import { Router } from '@angular/router'
import { NotificationsService } from 'angular2-notifications'
import { AuthService } from '../core'
import {
FormReactive,
User,
UserService,
USER_PASSWORD
} from '../shared'
@Component({ @Component({
selector: 'my-account', selector: 'my-account',
templateUrl: './account.component.html', templateUrl: './account.component.html',
styleUrls: [ './account.component.scss' ] styleUrls: [ './account.component.scss' ]
}) })
export class AccountComponent implements OnInit { export class AccountComponent {}
user: User = null
constructor (private authService: AuthService) {}
ngOnInit () {
this.user = this.authService.getUser()
}
}

View File

@ -1,11 +1,11 @@
import { NgModule } from '@angular/core' import { NgModule } from '@angular/core'
import { AccountRoutingModule } from './account-routing.module'
import { AccountComponent } from './account.component'
import { AccountChangePasswordComponent } from './account-change-password'
import { AccountDetailsComponent } from './account-details'
import { AccountService } from './account.service'
import { SharedModule } from '../shared' import { SharedModule } from '../shared'
import { AccountRoutingModule } from './account-routing.module'
import { AccountChangePasswordComponent } from './account-settings/account-change-password/account-change-password.component'
import { AccountDetailsComponent } from './account-settings/account-details/account-details.component'
import { AccountSettingsComponent } from './account-settings/account-settings.component'
import { AccountComponent } from './account.component'
import { AccountService } from './account.service'
@NgModule({ @NgModule({
imports: [ imports: [
@ -15,6 +15,7 @@ import { SharedModule } from '../shared'
declarations: [ declarations: [
AccountComponent, AccountComponent,
AccountSettingsComponent,
AccountChangePasswordComponent, AccountChangePasswordComponent,
AccountDetailsComponent AccountDetailsComponent
], ],

View File

@ -2,14 +2,6 @@
min-height: calc(100vh - #{$header-height} - #{$footer-height} - #{$footer-margin}); min-height: calc(100vh - #{$header-height} - #{$footer-height} - #{$footer-margin});
} }
.main-col {
margin-left: $menu-width;
&.expanded {
margin-left: 0;
}
}
.sub-header-container { .sub-header-container {
margin-top: $header-height; margin-top: $header-height;
} }

View File

@ -1,7 +1,7 @@
<menu> <menu>
<div *ngIf="isLoggedIn" class="logged-in-block"> <div *ngIf="isLoggedIn" class="logged-in-block">
<div class="logged-in-info"> <div class="logged-in-info">
<div class="logged-in-username">{{ user.username }}</div> <a routerLink="/account/settings" class="logged-in-username">{{ user.username }}</a>
<div class="logged-in-email">{{ user.email }}</div> <div class="logged-in-email">{{ user.email }}</div>
</div> </div>

View File

@ -28,6 +28,10 @@ menu {
.logged-in-username { .logged-in-username {
font-size: 16px; font-size: 16px;
font-weight: $font-semibold; font-weight: $font-semibold;
color: $menu-color;
cursor: pointer;
@include disable-default-a-behaviour;
} }
.logged-in-email { .logged-in-email {
@ -57,6 +61,12 @@ menu {
width: 190px; width: 190px;
border-radius: 3px; border-radius: 3px;
text-align: center; text-align: center;
color: $menu-color;
display: block;
cursor: pointer;
margin-bottom: 15px;
@include disable-default-a-behaviour;
&.login-button { &.login-button {
background-color: $orange-color; background-color: $orange-color;
@ -82,6 +92,13 @@ menu {
a { a {
display: flex; display: flex;
color: $menu-color;
cursor: pointer;
height: 22px;
line-height: 22px;
font-size: 16px;
margin-bottom: 15px;
@include disable-default-a-behaviour;
.icon { .icon {
width: 22px; width: 22px;
@ -113,16 +130,4 @@ menu {
} }
} }
} }
a {
color: $menu-color;
height: 22px;
line-height: 22px;
display: block;
font-size: 16px;
cursor: pointer;
margin-bottom: 15px;
@include disable-default-a-behaviour;
}
} }

View File

@ -1,13 +1,7 @@
#search-video { #search-video {
display: inline-block; @include peertube-input-text($search-input-width);
height: $button-height;
width: $search-input-width;
margin-right: 15px; margin-right: 15px;
padding-right: 25px; // For the search icon padding-right: 25px; // For the search icon
background: #fff;
border: 1px solid #C6C6C6;
border-radius: 3px;
padding-left: 15px;
&::placeholder { &::placeholder {
color: #000; color: #000;
@ -29,19 +23,9 @@
} }
.upload-button { .upload-button {
display: inline-block; @include peertube-button-link;
color: #fff;
font-weight: $font-semibold;
font-size: 15px;
height: $button-height;
line-height: $button-height;
border-radius: 3px;
text-align: center;
margin-right: 25px;
background-color: $orange-color;
padding: 0 17px 0 13px;
@include disable-default-a-behaviour; margin-right: 25px;
.icon.icon-upload { .icon.icon-upload {
display: inline-block; display: inline-block;

View File

@ -1,4 +1,3 @@
export * from './my-videos.component'
export * from './video-recently-added.component' export * from './video-recently-added.component'
export * from './video-trending.component' export * from './video-trending.component'
export * from './shared' export * from './shared'

View File

@ -1,36 +0,0 @@
import { Component, OnDestroy, OnInit } from '@angular/core'
import { ActivatedRoute, Router } from '@angular/router'
import { NotificationsService } from 'angular2-notifications'
import { AbstractVideoList } from './shared'
import { VideoService } from '../shared'
@Component({
selector: 'my-videos',
styleUrls: [ './shared/abstract-video-list.scss' ],
templateUrl: './shared/abstract-video-list.html'
})
export class MyVideosComponent extends AbstractVideoList implements OnInit, OnDestroy {
constructor (
protected router: Router,
protected route: ActivatedRoute,
protected notificationsService: NotificationsService,
private videoService: VideoService
) {
super()
}
ngOnInit () {
super.ngOnInit()
}
ngOnDestroy () {
super.ngOnDestroy()
}
getVideosObservable () {
return this.videoService.getMyVideos(this.pagination, this.sort)
}
}

View File

@ -1,18 +1,19 @@
<div class="title-page"> <div class="margin-content">
<div class="title-page title-page-single">
{{ titlePage }} {{ titlePage }}
</div> </div>
<div <div
class="videos-miniatures"
infiniteScroll infiniteScroll
[infiniteScrollUpDistance]="1.5" [infiniteScrollUpDistance]="1.5"
[infiniteScrollDistance]="0.5" [infiniteScrollDistance]="0.5"
(scrolled)="onNearOfBottom()" (scrolled)="onNearOfBottom()"
(scrolledUp)="onNearOfTop()" (scrolledUp)="onNearOfTop()"
> >
<my-video-miniature <my-video-miniature
class="ng-animate" class="ng-animate"
*ngFor="let video of videos" [video]="video" [user]="user" [currentSort]="sort" *ngFor="let video of videos" [video]="video" [user]="user" [currentSort]="sort"
> >
</my-video-miniature> </my-video-miniature>
</div>
</div> </div>

View File

@ -1,23 +0,0 @@
.videos-info {
@media screen and (max-width: 400px) {
margin-left: 0;
}
border-bottom: 1px solid #f1f1f1;
height: 40px;
line-height: 40px;
.videos-total-results {
font-size: 13px;
}
my-loader {
display: inline-block;
margin-left: 5px;
}
}
pagination {
display: block;
text-align: center;
}

View File

@ -36,8 +36,10 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
} }
ngOnDestroy () { ngOnDestroy () {
if (this.subActivatedRoute) {
this.subActivatedRoute.unsubscribe() this.subActivatedRoute.unsubscribe()
} }
}
onNearOfTop () { onNearOfTop () {
if (this.pagination.currentPage > 1) { if (this.pagination.currentPage > 1) {

View File

@ -1,7 +1,6 @@
import { NgModule } from '@angular/core' import { NgModule } from '@angular/core'
import { RouterModule, Routes } from '@angular/router' import { RouterModule, Routes } from '@angular/router'
import { MetaGuard } from '@ngx-meta/core' import { MetaGuard } from '@ngx-meta/core'
import { MyVideosComponent } from './video-list'
import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component' import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component'
import { VideoTrendingComponent } from './video-list/video-trending.component' import { VideoTrendingComponent } from './video-list/video-trending.component'
import { VideosComponent } from './videos.component' import { VideosComponent } from './videos.component'
@ -17,15 +16,6 @@ const videosRoutes: Routes = [
pathMatch: 'full', pathMatch: 'full',
redirectTo: 'recently-added' redirectTo: 'recently-added'
}, },
{
path: 'mine',
component: MyVideosComponent,
data: {
meta: {
title: 'My videos'
}
}
},
{ {
path: 'trending', path: 'trending',
component: VideoTrendingComponent, component: VideoTrendingComponent,

View File

@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'
import { InfiniteScrollModule } from 'ngx-infinite-scroll' import { InfiniteScrollModule } from 'ngx-infinite-scroll'
import { SharedModule } from '../shared' import { SharedModule } from '../shared'
import { VideoService } from './shared' import { VideoService } from './shared'
import { MyVideosComponent, VideoMiniatureComponent } from './video-list' import { VideoMiniatureComponent } from './video-list'
import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component' import { VideoRecentlyAddedComponent } from './video-list/video-recently-added.component'
import { VideoTrendingComponent } from './video-list/video-trending.component' import { VideoTrendingComponent } from './video-list/video-trending.component'
import { VideosRoutingModule } from './videos-routing.module' import { VideosRoutingModule } from './videos-routing.module'
@ -20,7 +20,6 @@ import { VideosComponent } from './videos.component'
VideoTrendingComponent, VideoTrendingComponent,
VideoRecentlyAddedComponent, VideoRecentlyAddedComponent,
MyVideosComponent,
VideoMiniatureComponent VideoMiniatureComponent
], ],

View File

@ -4,3 +4,38 @@
outline: none !important; outline: none !important;
} }
} }
@mixin peertube-input-text($width) {
display: inline-block;
height: $button-height;
width: $width;
background: #fff;
border: 1px solid #C6C6C6;
border-radius: 3px;
padding-left: 15px;
&::placeholder {
color: #585858;
}
}
@mixin peertube-button {
border: none;
color: #fff;
font-weight: $font-semibold;
font-size: 15px;
height: $button-height;
line-height: $button-height;
border-radius: 3px;
text-align: center;
background-color: $orange-color;
padding: 0 17px 0 13px;
cursor: pointer;
}
@mixin peertube-button-link {
display: inline-block;
@include peertube-button;
@include disable-default-a-behaviour;
}

View File

@ -8,6 +8,8 @@ $orange-color: #F1680D;
$black-background: #000; $black-background: #000;
$grey-background: #f6f2f2; $grey-background: #f6f2f2;
$expanded-horizontal-margins: 150px;
$button-height: 30px; $button-height: 30px;
$header-height: 50px; $header-height: 50px;

View File

@ -33,15 +33,51 @@ input.readonly {
} }
.main-col { .main-col {
padding: 30px; margin-left: $menu-width;
.title-page { .title-page {
color: #000;
font-size: 16px; font-size: 16px;
font-weight: $font-bold;
display: inline-block; display: inline-block;
margin-right: 55px;
font-weight: $font-semibold;
@include disable-default-a-behaviour;
&.active, &.title-page-single {
border-bottom: 2px solid $orange-color; border-bottom: 2px solid $orange-color;
font-weight: $font-bold;
margin-top: 30px;
margin-bottom: 25px; margin-bottom: 25px;
} }
}
.margin-content {
margin-left: 10px;
margin-right: 10px;
}
.sub-menu {
background-color: #F7F7F7;
width: 100%;
height: 81px;
margin-bottom: 30px;
display: flex;
align-items: center;
}
// Override some properties if the main content is expanded (no menu on the left)
&.expanded {
margin-left: 0;
.margin-content {
margin-left: $expanded-horizontal-margins;
margin-right: $expanded-horizontal-margins;
}
.sub-menu {
padding-left: $expanded-horizontal-margins;
}
}
} }
// On small screen, menu is absolute and displayed over the page // On small screen, menu is absolute and displayed over the page

View File

@ -1,4 +1,5 @@
@import '_variables.scss'; @import '_variables.scss';
@import '_mixins.scss';
$bootstrap-sass-asset-helper: false !default; $bootstrap-sass-asset-helper: false !default;
// //