Implementation of categoryId edition.
This commit is contained in:
@@ -16,15 +16,22 @@
|
|||||||
<mat-label>Description</mat-label>
|
<mat-label>Description</mat-label>
|
||||||
<input matInput type="text" formControlName="description" />
|
<input matInput type="text" formControlName="description" />
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
<mat-form-field>
|
||||||
|
<mat-label>Category</mat-label>
|
||||||
|
<mat-select formControlName="categoryId">
|
||||||
|
@for (category of categories$ | async; track category) {
|
||||||
|
<mat-option [value]="category.id">
|
||||||
|
{{ category.name }}
|
||||||
|
</mat-option>
|
||||||
|
}
|
||||||
|
</mat-select>
|
||||||
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="picture-container">
|
<div class="picture-container">
|
||||||
@if (publication.illustrationId.length) {
|
<img [src]="publication.illustrationId.length ? '/api/pictures/' + publication.illustrationId : '/assets/images/default-picture.png'"
|
||||||
<img src="/api/pictures/{{publication.illustrationId}}" (click)="displayPictureSectionDialog()" matTooltip="Click to change illustration"/>
|
(click)="displayPictureSectionDialog()"
|
||||||
} @else {
|
matTooltip="Click to change illustration"/>
|
||||||
<img src="/assets/images/default-picture.png" (click)="displayPictureSectionDialog()" matTooltip="Click to change illustration"/>
|
|
||||||
}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { CommonModule, Location } from "@angular/common";
|
import { CommonModule, Location } from "@angular/common";
|
||||||
import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, Output } from "@angular/core";
|
import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, OnInit, Output } from "@angular/core";
|
||||||
import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from "@angular/forms";
|
import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from "@angular/forms";
|
||||||
import { MatDialogModule } from "@angular/material/dialog";
|
import { MatDialogModule } from "@angular/material/dialog";
|
||||||
import { MatIconModule } from "@angular/material/icon";
|
import { MatIconModule } from "@angular/material/icon";
|
||||||
@@ -7,11 +7,14 @@ import { MatInputModule } from "@angular/material/input";
|
|||||||
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
||||||
import { MatTabsModule } from "@angular/material/tabs";
|
import { MatTabsModule } from "@angular/material/tabs";
|
||||||
import { MatTooltipModule } from "@angular/material/tooltip";
|
import { MatTooltipModule } from "@angular/material/tooltip";
|
||||||
import { map, Observable, of, Subscription } from "rxjs";
|
import { filter, map, Observable, of, Subscription } from "rxjs";
|
||||||
import { Publication } from "../../core/rest-services/publications/model/publication";
|
import { Publication } from "../../core/rest-services/publications/model/publication";
|
||||||
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
||||||
import { SubmitButtonComponent } from "../submit-button/submit-button.component";
|
import { SubmitButtonComponent } from "../submit-button/submit-button.component";
|
||||||
import { PublicationEditionService } from "./publication-edition.service";
|
import { PublicationEditionService } from "./publication-edition.service";
|
||||||
|
import { MatSelectModule } from "@angular/material/select";
|
||||||
|
import { CategoryService } from "../../core/service/category.service";
|
||||||
|
import { Category } from "../../core/rest-services/category/model/category";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-publication-edition',
|
selector: 'app-publication-edition',
|
||||||
@@ -24,6 +27,7 @@ import { PublicationEditionService } from "./publication-edition.service";
|
|||||||
MatIconModule,
|
MatIconModule,
|
||||||
MatInputModule,
|
MatInputModule,
|
||||||
MatProgressSpinnerModule,
|
MatProgressSpinnerModule,
|
||||||
|
MatSelectModule,
|
||||||
MatTabsModule,
|
MatTabsModule,
|
||||||
MatTooltipModule,
|
MatTooltipModule,
|
||||||
PictureSelectionDialog,
|
PictureSelectionDialog,
|
||||||
@@ -42,6 +46,7 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy {
|
|||||||
@Output()
|
@Output()
|
||||||
publicationSave = new EventEmitter<Publication>();
|
publicationSave = new EventEmitter<Publication>();
|
||||||
|
|
||||||
|
private readonly categoryService = inject(CategoryService);
|
||||||
private readonly formBuilder = inject(FormBuilder);
|
private readonly formBuilder = inject(FormBuilder);
|
||||||
private readonly location = inject(Location);
|
private readonly location = inject(Location);
|
||||||
private readonly publicationEditionService = inject(PublicationEditionService);
|
private readonly publicationEditionService = inject(PublicationEditionService);
|
||||||
@@ -64,6 +69,30 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy {
|
|||||||
return this.publicationEditionService.isPreviewing$;
|
return this.publicationEditionService.isPreviewing$;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get categories$(): Observable<Category[]> {
|
||||||
|
return this.categoryService.categories$
|
||||||
|
.pipe(
|
||||||
|
map(categories =>
|
||||||
|
categories.filter(category => category.subCategories.length == 0)
|
||||||
|
.sort(this.byNameAscComparator())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private byNameAscComparator(): (categoryA: Category, categoryB: Category) => number {
|
||||||
|
return (categoryA, categoryB) => this.compareStrings(categoryA.name, categoryB.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private compareStrings(stringA: string, stringB: string): number {
|
||||||
|
if (stringA < stringB) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (stringA > stringB) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ngOnChanges(): void {
|
ngOnChanges(): void {
|
||||||
this.ngOnDestroy();
|
this.ngOnDestroy();
|
||||||
|
|
||||||
@@ -93,6 +122,12 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy {
|
|||||||
this.subscriptions.push(fieldSubscription);
|
this.subscriptions.push(fieldSubscription);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const categoryIdChangeSubscription = this.publicationEditionForm.controls['categoryId'].valueChanges
|
||||||
|
.subscribe(newCategoryId => {
|
||||||
|
this.publicationEditionService.editCategoryId(newCategoryId);
|
||||||
|
});
|
||||||
|
this.subscriptions.push(categoryIdChangeSubscription);
|
||||||
|
|
||||||
const publicationSubscription = this.publicationEditionService.state$.subscribe(state => {
|
const publicationSubscription = this.publicationEditionService.state$.subscribe(state => {
|
||||||
this.publicationInEdition = state.publication;
|
this.publicationInEdition = state.publication;
|
||||||
this.publicationEditionForm.controls['title'].setValue(this.publication.title, { emitEvent: false });
|
this.publicationEditionForm.controls['title'].setValue(this.publication.title, { emitEvent: false });
|
||||||
|
|||||||
@@ -139,6 +139,12 @@ export class PublicationEditionService implements OnDestroy {
|
|||||||
this._save(state);
|
this._save(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editCategoryId(categoryId: string): void {
|
||||||
|
const state = this._state;
|
||||||
|
state.publication.categoryId = categoryId;
|
||||||
|
this._save(state);
|
||||||
|
}
|
||||||
|
|
||||||
editText(text: string): void {
|
editText(text: string): void {
|
||||||
const state = this._state;
|
const state = this._state;
|
||||||
state.publication.text = text;
|
state.publication.text = text;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
transition: left .2s ease-in-out;
|
transition: left .2s ease-in-out;
|
||||||
width: $categoriesMenuWidth;
|
width: $categoriesMenuWidth;
|
||||||
z-index: 2;
|
z-index: 3;
|
||||||
padding: 1em 0;
|
padding: 1em 0;
|
||||||
|
|
||||||
&.displayed {
|
&.displayed {
|
||||||
@@ -77,6 +77,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: #000;
|
background-color: #000;
|
||||||
opacity: .2;
|
opacity: .2;
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
&.displayed {
|
&.displayed {
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
Reference in New Issue
Block a user