mirror of https://github.com/Squidex/squidex.git
59 changed files with 775 additions and 304 deletions
@ -0,0 +1,35 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Sebastian Stehle. All rights reserved |
||||
|
*/ |
||||
|
|
||||
|
import { Directive, ElementRef, HostListener, OnInit, Renderer } from '@angular/core'; |
||||
|
|
||||
|
@Directive({ |
||||
|
selector: '[sqxSquare]' |
||||
|
}) |
||||
|
export class SquareDirective implements OnInit { |
||||
|
|
||||
|
constructor( |
||||
|
private readonly element: ElementRef, |
||||
|
private readonly renderer: Renderer |
||||
|
) { |
||||
|
} |
||||
|
|
||||
|
public ngOnInit() { |
||||
|
this.resize(); |
||||
|
} |
||||
|
|
||||
|
@HostListener('resize') |
||||
|
public onResize() { |
||||
|
this.resize(); |
||||
|
} |
||||
|
|
||||
|
private resize() { |
||||
|
const size = this.element.nativeElement.getBoundingClientRect(); |
||||
|
|
||||
|
this.renderer.setElementStyle(this.element.nativeElement, 'height', size.width + 'px'); |
||||
|
} |
||||
|
} |
||||
@ -1,3 +1,11 @@ |
|||||
<div class="assets-container"> |
<div class="assets-container" (sqxFileDrop)="addFiles($event)" dnd-droppable (onDropSuccess)="onAssetDropped($event.dragData)"> |
||||
|
<div class="row"> |
||||
|
<sqx-asset class="col-4" *ngFor="let file of newAssets" [initFile]="file" |
||||
|
(failed)="onAssetFailed(file)" |
||||
|
(loaded)="onAssetLoaded(file, $event)"> |
||||
|
</sqx-asset> |
||||
|
<sqx-asset class="col-4" *ngFor="let asset of oldAssets" [asset]="asset" [closeMode]="true" |
||||
|
(closing)="onAssetRemoving($event)"> |
||||
|
</sqx-asset> |
||||
|
</div> |
||||
</div> |
</div> |
||||
@ -0,0 +1,159 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Sebastian Stehle. All rights reserved |
||||
|
*/ |
||||
|
|
||||
|
import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core'; |
||||
|
import { Observable, Subscription } from 'rxjs'; |
||||
|
|
||||
|
import { UsersProviderService } from './../declarations-base'; |
||||
|
|
||||
|
class UserAsyncPipe implements OnDestroy { |
||||
|
private lastUserId: string; |
||||
|
private lastValue: string; |
||||
|
private subscription: Subscription; |
||||
|
|
||||
|
constructor( |
||||
|
private readonly users: UsersProviderService, |
||||
|
private readonly changeDetector: ChangeDetectorRef |
||||
|
) { |
||||
|
} |
||||
|
|
||||
|
public ngOnDestroy() { |
||||
|
if (this.subscription) { |
||||
|
this.subscription.unsubscribe(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected transformInternal(userId: string, transform: (users: UsersProviderService) => Observable<string>): string { |
||||
|
if (this.lastUserId !== userId) { |
||||
|
this.lastUserId = userId; |
||||
|
|
||||
|
if (this.subscription) { |
||||
|
this.subscription.unsubscribe(); |
||||
|
} |
||||
|
|
||||
|
this.subscription = transform(this.users).subscribe(value => { |
||||
|
this.lastValue = value; |
||||
|
|
||||
|
this.changeDetector.markForCheck(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
return this.lastValue; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userName', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserNamePipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string, placeholder = 'Me'): string { |
||||
|
return super.transformInternal(userId, users => users.getUser(userId, placeholder).map(u => u.displayName)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userNameRef', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserNameRefPipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string, placeholder = 'Me'): string { |
||||
|
return super.transformInternal(userId, users => { |
||||
|
const parts = userId.split(':'); |
||||
|
|
||||
|
if (parts[0] === 'subject') { |
||||
|
return users.getUser(parts[1], placeholder).map(u => u.displayName); |
||||
|
} else { |
||||
|
if (parts[1].endsWith('client')) { |
||||
|
return Observable.of(parts[1]); |
||||
|
} else { |
||||
|
return Observable.of(`${parts[1]}-client`); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userEmail', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserEmailPipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string): string { |
||||
|
return super.transformInternal(userId, users => users.getUser(userId).map(u => u.email)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userEmailRef', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserEmailRefPipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string): string { |
||||
|
return super.transformInternal(userId, users => { |
||||
|
const parts = userId.split(':'); |
||||
|
|
||||
|
if (parts[0] === 'subject') { |
||||
|
return users.getUser(parts[1]).map(u => u.email); |
||||
|
} else { |
||||
|
return null; |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userPicture', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserPicturePipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string): string { |
||||
|
return super.transformInternal(userId, users => users.getUser(userId).map(u => u.pictureUrl)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Pipe({ |
||||
|
name: 'userPictureRef', |
||||
|
pure: false |
||||
|
}) |
||||
|
export class UserPictureRefPipe extends UserAsyncPipe implements PipeTransform { |
||||
|
constructor(users: UsersProviderService, changeDetector: ChangeDetectorRef) { |
||||
|
super(users, changeDetector); |
||||
|
} |
||||
|
|
||||
|
public transform(userId: string): string { |
||||
|
return super.transformInternal(userId, users => { |
||||
|
const parts = userId.split(':'); |
||||
|
|
||||
|
if (parts[0] === 'subject') { |
||||
|
return users.getUser(parts[1]).map(u => u.pictureUrl); |
||||
|
} else { |
||||
|
return Observable.of('/images/client.png'); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Sebastian Stehle. All rights reserved |
||||
|
*/ |
||||
|
|
||||
|
export * from './guards/app-must-exist.guard'; |
||||
|
export * from './guards/must-be-authenticated.guard'; |
||||
|
export * from './guards/must-be-not-authenticated.guard'; |
||||
|
export * from './guards/resolve-app-languages.guard'; |
||||
|
export * from './guards/resolve-content.guard'; |
||||
|
export * from './guards/resolve-published-schema.guard'; |
||||
|
export * from './guards/resolve-schema.guard'; |
||||
|
|
||||
|
export * from './services/app-contributors.service'; |
||||
|
export * from './services/app-clients.service'; |
||||
|
export * from './services/app-languages.service'; |
||||
|
export * from './services/apps-store.service'; |
||||
|
export * from './services/apps.service'; |
||||
|
export * from './services/assets.service'; |
||||
|
export * from './services/auth.service'; |
||||
|
export * from './services/contents.service'; |
||||
|
export * from './services/event-consumers.service'; |
||||
|
export * from './services/help.service'; |
||||
|
export * from './services/history.service'; |
||||
|
export * from './services/languages.service'; |
||||
|
export * from './services/schemas.service'; |
||||
|
export * from './services/users-provider.service'; |
||||
|
export * from './services/users.service'; |
||||
|
|
||||
|
export * from './utils/file-helper'; |
||||
|
export * from './utils/messages'; |
||||
|
|
||||
|
export * from 'framework'; |
||||
Loading…
Reference in new issue