Fix bug of preview content.
This commit is contained in:
@@ -1,29 +1,22 @@
|
|||||||
package org.codiki.exposition.publication;
|
package org.codiki.exposition.publication;
|
||||||
|
|
||||||
|
import org.codiki.application.publication.PublicationUseCases;
|
||||||
|
import org.codiki.domain.publication.exception.NoPublicationSearchResultException;
|
||||||
|
import org.codiki.domain.publication.exception.PublicationNotFoundException;
|
||||||
|
import org.codiki.domain.publication.model.Publication;
|
||||||
|
import org.codiki.domain.publication.model.PublicationEditionRequest;
|
||||||
|
import org.codiki.exposition.publication.model.PreviewContentRequest;
|
||||||
|
import org.codiki.exposition.publication.model.PreviewContentResponse;
|
||||||
|
import org.codiki.exposition.publication.model.PublicationDto;
|
||||||
|
import org.codiki.exposition.publication.model.PublicationEditionRequestDto;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import static org.springframework.http.HttpStatus.CREATED;
|
import static org.springframework.http.HttpStatus.CREATED;
|
||||||
import static org.springframework.http.HttpStatus.NO_CONTENT;
|
import static org.springframework.http.HttpStatus.NO_CONTENT;
|
||||||
import static org.springframework.util.ObjectUtils.isEmpty;
|
import static org.springframework.util.ObjectUtils.isEmpty;
|
||||||
import org.codiki.application.publication.PublicationUseCases;
|
|
||||||
import org.codiki.domain.publication.exception.NoPublicationSearchResultException;
|
|
||||||
import org.codiki.domain.publication.exception.PublicationNotFoundException;
|
|
||||||
import org.codiki.domain.publication.model.Publication;
|
|
||||||
import org.codiki.domain.publication.model.PublicationEditionRequest;
|
|
||||||
import org.codiki.exposition.publication.model.PreviewContentRequest;
|
|
||||||
import org.codiki.exposition.publication.model.PublicationDto;
|
|
||||||
import org.codiki.exposition.publication.model.PublicationEditionRequestDto;
|
|
||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/publications")
|
@RequestMapping("/api/publications")
|
||||||
@@ -93,8 +86,9 @@ public class PublicationController {
|
|||||||
return publications;
|
return publications;
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/preview")
|
@PostMapping(value = "/preview")
|
||||||
public String previewPublicationContent(@RequestBody PreviewContentRequest request) {
|
public PreviewContentResponse previewPublicationContent(@RequestBody PreviewContentRequest request) {
|
||||||
return publicationUseCases.previewContent(request.text());
|
String previewContent = publicationUseCases.previewContent(request.text());
|
||||||
|
return new PreviewContentResponse(previewContent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package org.codiki.exposition.publication.model;
|
||||||
|
|
||||||
|
public record PreviewContentResponse(
|
||||||
|
String text
|
||||||
|
) {}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
meta {
|
||||||
|
name: Preview content
|
||||||
|
type: http
|
||||||
|
seq: 7
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
url: {{url}}/api/publications/preview
|
||||||
|
body: json
|
||||||
|
auth: bearer
|
||||||
|
}
|
||||||
|
|
||||||
|
auth:bearer {
|
||||||
|
token: {{bearerToken}}
|
||||||
|
}
|
||||||
|
|
||||||
|
body:json {
|
||||||
|
{
|
||||||
|
"text" : "[h1]Test[/h1]"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
vars {
|
vars {
|
||||||
url: http://localhost:8987
|
url: http://localhost:8987
|
||||||
publicationId: ec76602f-5501-4091-868e-b471611e63de
|
publicationId: ec76602f-5501-4091-868e-b471611e63de
|
||||||
bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTA4Mzc2ODQsInBzZXVkbyI6IlN0YW5kYXJkIHVzZXIiLCJlbWFpbCI6InN0YW5kYXJkLnVzZXJAY29kaWtpLm9yZyIsInJvbGVzIjoiU1RBTkRBUkQifQ.2HggC3T_4I14IpW02DZJiYfgYwc074kU8Y4AmuGf1mZzv0U8OUxpAw_xEhnKtn8NcaCozz_2vFv4o_CaBqS8Ag
|
bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMWQ1NTdhNi04OGIxLTQyNzQtOTk0ZS1mOWE5YTYwOTc5OTciLCJleHAiOjE3MjY5NTExNTgsInBob3RvSWQiOiI2MjhkYTFhNy0wNzAyLTRlNDktOGIwNi00ZDg2MGE2YTNkZTUiLCJwc2V1ZG8iOiJUYWtpZ3VjaGkiLCJlbWFpbCI6ImZsb3JpYW4udGhpZXJyeTcyQGdtYWlsLmNvbSIsInJvbGVzIjoiU1RBTkRBUkQifQ.4OQglB0cT2hTMO7_Bfxj7nQPYi42e0Gh06jmHj2q-SQTM6Md70Ii_BiKR__GxY14bahPAjLcIWfAYS2A0Tc1Vw
|
||||||
categoryId: 172fa901-3f4b-4540-92f3-1c15820e8ec9
|
categoryId: 172fa901-3f4b-4540-92f3-1c15820e8ec9
|
||||||
pictureId: 65b660b7-66bb-4e4a-a62c-fd0ca101f972
|
pictureId: 65b660b7-66bb-4e4a-a62c-fd0ca101f972
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
<h1>{{ publication.title }}</h1>
|
<h1>{{ publication.title }}</h1>
|
||||||
<h2>{{ publication.description }}</h2>
|
<h2>{{ publication.description }}</h2>
|
||||||
</header>
|
</header>
|
||||||
<main [innerHTML]="publication.parsedText"></main>
|
<main [innerHTML]="publicationInEdition.parsedText"></main>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import { CommonModule, Location } from "@angular/common";
|
import { CommonModule, Location } from "@angular/common";
|
||||||
import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, OnInit, Output } from "@angular/core";
|
import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, 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";
|
||||||
import { MatInputModule } from "@angular/material/input";
|
import { MatInputModule } from "@angular/material/input";
|
||||||
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
import { MatProgressSpinnerModule } from "@angular/material/progress-spinner";
|
||||||
|
import { MatSelectModule } from "@angular/material/select";
|
||||||
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 { filter, map, Observable, of, Subscription } from "rxjs";
|
import { map, Observable, of, Subscription } from "rxjs";
|
||||||
import { Publication } from "../../core/rest-services/publications/model/publication";
|
|
||||||
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
|
||||||
import { SubmitButtonComponent } from "../submit-button/submit-button.component";
|
|
||||||
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";
|
import { Category } from "../../core/rest-services/category/model/category";
|
||||||
|
import { Publication } from "../../core/rest-services/publications/model/publication";
|
||||||
|
import { CategoryService } from "../../core/service/category.service";
|
||||||
|
import { SubmitButtonComponent } from "../submit-button/submit-button.component";
|
||||||
|
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
||||||
|
import { PublicationEditionService } from "./publication-edition.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-publication-edition',
|
selector: 'app-publication-edition',
|
||||||
@@ -46,11 +46,11 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy {
|
|||||||
@Output()
|
@Output()
|
||||||
publicationSave = new EventEmitter<Publication>();
|
publicationSave = new EventEmitter<Publication>();
|
||||||
|
|
||||||
|
publicationInEdition!: Publication;
|
||||||
private readonly categoryService = inject(CategoryService);
|
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);
|
||||||
private publicationInEdition!: Publication;
|
|
||||||
private subscriptions: Subscription[] = [];
|
private subscriptions: Subscription[] = [];
|
||||||
|
|
||||||
publicationEditionForm: FormGroup = this.formBuilder.group({
|
publicationEditionForm: FormGroup = this.formBuilder.group({
|
||||||
@@ -129,12 +129,13 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy {
|
|||||||
this.subscriptions.push(categoryIdChangeSubscription);
|
this.subscriptions.push(categoryIdChangeSubscription);
|
||||||
|
|
||||||
const publicationSubscription = this.publicationEditionService.state$.subscribe(state => {
|
const publicationSubscription = this.publicationEditionService.state$.subscribe(state => {
|
||||||
|
console.log(state.publication.parsedText.substring(0, 15));
|
||||||
this.publicationInEdition = state.publication;
|
this.publicationInEdition = state.publication;
|
||||||
this.publicationEditionForm.controls['title'].setValue(this.publication.title, { emitEvent: false });
|
this.publicationEditionForm.controls['title'].setValue(this.publicationInEdition.title, { emitEvent: false });
|
||||||
this.publicationEditionForm.controls['description'].setValue(this.publication.description, { emitEvent: false });
|
this.publicationEditionForm.controls['description'].setValue(this.publicationInEdition.description, { emitEvent: false });
|
||||||
this.publicationEditionForm.controls['text'].setValue(this.publication.text, { emitEvent: false });
|
this.publicationEditionForm.controls['text'].setValue(this.publicationInEdition.text, { emitEvent: false });
|
||||||
this.publicationEditionForm.controls['illustrationId'].setValue(this.publication.illustrationId, { emitEvent: false });
|
this.publicationEditionForm.controls['illustrationId'].setValue(this.publicationInEdition.illustrationId, { emitEvent: false });
|
||||||
this.publicationEditionForm.controls['categoryId'].setValue(this.publication.categoryId, { emitEvent: false });
|
this.publicationEditionForm.controls['categoryId'].setValue(this.publicationInEdition.categoryId, { emitEvent: false });
|
||||||
});
|
});
|
||||||
this.subscriptions.push(publicationSubscription);
|
this.subscriptions.push(publicationSubscription);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { PublicationRestService } from "../../core/rest-services/publications/pu
|
|||||||
import { copy } from "../../core/utils/ObjectUtils";
|
import { copy } from "../../core/utils/ObjectUtils";
|
||||||
import { CodeBlockDialog } from "./code-block-dialog/code-block-dialog.component";
|
import { CodeBlockDialog } from "./code-block-dialog/code-block-dialog.component";
|
||||||
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component";
|
||||||
|
import { PreviewContentRequest } from "../../core/rest-services/publications/model/preview";
|
||||||
|
|
||||||
declare let Prism: any;
|
declare let Prism: any;
|
||||||
|
|
||||||
@@ -268,9 +269,12 @@ export class PublicationEditionService implements OnDestroy {
|
|||||||
const state = this._state;
|
const state = this._state;
|
||||||
|
|
||||||
this.isPreviewingSubject.next(true);
|
this.isPreviewingSubject.next(true);
|
||||||
this.publicationRestService.preview(state.publication.text)
|
const request: PreviewContentRequest = {
|
||||||
.then(parsedText => {
|
text: state.publication.text
|
||||||
state.publication.parsedText = parsedText;
|
};
|
||||||
|
this.publicationRestService.preview(request)
|
||||||
|
.then(response => {
|
||||||
|
state.publication.parsedText = response.text;
|
||||||
this._save(state);
|
this._save(state);
|
||||||
setTimeout(() => Prism.highlightAll(), 1000);
|
setTimeout(() => Prism.highlightAll(), 1000);
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export interface PreviewContentRequest {
|
||||||
|
text: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PreviewContentResponse {
|
||||||
|
text: string;
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ import { HttpClient, HttpParams } from '@angular/common/http';
|
|||||||
import { Injectable, inject } from '@angular/core';
|
import { Injectable, inject } from '@angular/core';
|
||||||
import { last, lastValueFrom } from 'rxjs';
|
import { last, lastValueFrom } from 'rxjs';
|
||||||
import { Publication } from './model/publication';
|
import { Publication } from './model/publication';
|
||||||
|
import { PreviewContentRequest, PreviewContentResponse } from './model/preview';
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
@@ -31,9 +32,8 @@ export class PublicationRestService {
|
|||||||
return lastValueFrom(this.httpClient.get<Publication[]>('/api/publications', { params }));
|
return lastValueFrom(this.httpClient.get<Publication[]>('/api/publications', { params }));
|
||||||
}
|
}
|
||||||
|
|
||||||
preview(publicationText: string): Promise<string> {
|
preview(request: PreviewContentRequest): Promise<PreviewContentResponse> {
|
||||||
const request = { text: publicationText };
|
return lastValueFrom(this.httpClient.post<PreviewContentResponse>('/api/publications/preview', request));
|
||||||
return lastValueFrom(this.httpClient.post<string>('/api/publications/preview', request));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(publicationId: string): Promise<void> {
|
delete(publicationId: string): Promise<void> {
|
||||||
|
|||||||
Reference in New Issue
Block a user