diff --git a/vripper-gui/src/main/kotlin/me/vripper/gui/view/popup/RenameView.kt b/vripper-gui/src/main/kotlin/me/vripper/gui/view/popup/RenameView.kt
new file mode 100644
index 0000000..f1b7265
--- /dev/null
+++ b/vripper-gui/src/main/kotlin/me/vripper/gui/view/popup/RenameView.kt
@@ -0,0 +1,42 @@
+package me.vripper.gui.view.popup
+
+import javafx.beans.property.SimpleStringProperty
+import javafx.geometry.Pos
+import javafx.scene.control.TextField
+import javafx.scene.layout.Priority
+import javafx.scene.layout.VBox
+import me.vripper.gui.controller.PostController
+import tornadofx.*
+
+class RenameView : Fragment("Rename download post") {
+
+ val postId: Long by param()
+ val name: String by param()
+ private val textAreaProperty = SimpleStringProperty()
+ private val postController: PostController by inject()
+ lateinit var input: TextField
+
+ override fun onDock() {
+ textAreaProperty.value = name
+ }
+
+ override val root = vbox(alignment = Pos.CENTER_RIGHT) {
+ padding = insets(all = 5)
+ spacing = 5.0
+ input = textfield {
+ VBox.setVgrow(this, Priority.ALWAYS)
+ bind(textAreaProperty)
+ }
+ button("Ok") {
+ imageview("search.png") {
+ fitWidth = 18.0
+ fitHeight = 18.0
+ }
+ disableWhen(textAreaProperty.isEmpty)
+ action {
+ postController.rename(postId, textAreaProperty.value)
+ close()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/vripper-gui/src/main/resources/edit.png b/vripper-gui/src/main/resources/edit.png
new file mode 100644
index 0000000..4e14978
Binary files /dev/null and b/vripper-gui/src/main/resources/edit.png differ
diff --git a/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.html b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.html
new file mode 100644
index 0000000..d2c05af
--- /dev/null
+++ b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.html
@@ -0,0 +1,13 @@
+
Confirmation
+
+
+
+
+
+
+
diff --git a/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.scss b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.spec.ts b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.spec.ts
new file mode 100644
index 0000000..14a40c0
--- /dev/null
+++ b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { RenameDialogComponent } from './rename-dialog.component';
+
+describe('ConfirmComponent', () => {
+ let component: RenameDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [RenameDialogComponent],
+ });
+ fixture = TestBed.createComponent(RenameDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.ts b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.ts
new file mode 100644
index 0000000..b5bf54c
--- /dev/null
+++ b/vripper-web-ui/src/app/rename-dialog/rename-dialog.component.ts
@@ -0,0 +1,53 @@
+import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import {
+ MAT_DIALOG_DATA,
+ MatDialogModule,
+ MatDialogRef,
+} from '@angular/material/dialog';
+import { MatButtonModule } from '@angular/material/button';
+import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatInputModule } from '@angular/material/input';
+
+export interface RenameDialogData {
+ postId: number;
+ name: string;
+}
+
+export interface RenameDialogResult {
+ postId: number;
+ name: string;
+}
+
+@Component({
+ selector: 'app-rename-dialog',
+ standalone: true,
+ imports: [
+ CommonModule,
+ MatDialogModule,
+ MatButtonModule,
+ FormsModule,
+ MatFormFieldModule,
+ MatInputModule,
+ ReactiveFormsModule,
+ ],
+ templateUrl: './rename-dialog.component.html',
+ styleUrls: ['./rename-dialog.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class RenameDialogComponent {
+ formControl = new FormControl(this.data.name);
+
+ constructor(
+ public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data: RenameDialogData
+ ) {}
+
+ confirm() {
+ this.dialogRef.close({
+ postId: this.data.postId,
+ name: this.formControl.value,
+ } as RenameDialogResult);
+ }
+}
diff --git a/vripper-web/src/main/kotlin/me/vripper/web/restendpoints/domain/RenameRequest.kt b/vripper-web/src/main/kotlin/me/vripper/web/restendpoints/domain/RenameRequest.kt
new file mode 100644
index 0000000..2bd3613
--- /dev/null
+++ b/vripper-web/src/main/kotlin/me/vripper/web/restendpoints/domain/RenameRequest.kt
@@ -0,0 +1,3 @@
+package me.vripper.web.restendpoints.domain
+
+data class RenameRequest(val postId: Long, val name: String)