Bulk duplicate

This commit is contained in:
Patrick Haßel 2023-07-05 23:45:27 +02:00
parent 449e58b8ec
commit f6acfd83d1
9 changed files with 100 additions and 63 deletions

View File

@ -66,6 +66,10 @@ export class BulkService implements ISearchService {
this.api.getReturnItem("bulk/run/" + bulk.id, _ => _, next); this.api.getReturnItem("bulk/run/" + bulk.id, _ => _, next);
} }
duplicate(bulk: Bulk, next: (item: Bulk) => void): void {
this.api.getReturnItem("bulk/duplicate/" + bulk.id, _ => _, next);
}
setEntry(entry: BulkEntry, key: string, value: any, next: (result: BulkEntry) => void = NO_OP): void { setEntry(entry: BulkEntry, key: string, value: any, next: (result: BulkEntry) => void = NO_OP): void {
this.api.putReturnItem("BulkEntry/" + entry.id + "/set/" + key, value, next); this.api.putReturnItem("BulkEntry/" + entry.id + "/set/" + key, value, next);
} }

View File

@ -8,6 +8,7 @@
<th>Bezeichnung</th> <th>Bezeichnung</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th>
</tr> </tr>
<tr *ngFor="let bulk of bulks.sort(Bulk.compareName); trackBy: Bulk.trackBy"> <tr *ngFor="let bulk of bulks.sort(Bulk.compareName); trackBy: Bulk.trackBy">
@ -24,6 +25,10 @@
<fa-icon title="Ausführen" [icon]="faPlay"></fa-icon> <fa-icon title="Ausführen" [icon]="faPlay"></fa-icon>
</td> </td>
<td class="duplicate" (click)="duplicate(bulk)">
<fa-icon title="Duplizieren" [icon]="faCopy"></fa-icon>
</td>
<td class="delete" (click)="delete(bulk)"> <td class="delete" (click)="delete(bulk)">
<fa-icon title="Löschen" [icon]="faTimes"></fa-icon> <fa-icon title="Löschen" [icon]="faTimes"></fa-icon>
</td> </td>

View File

@ -1,7 +1,7 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {BulkService} from "../../../api/bulk/BulkService"; import {BulkService} from "../../../api/bulk/BulkService";
import {Bulk} from "../../../api/bulk/Bulk"; import {Bulk} from "../../../api/bulk/Bulk";
import {faCheckCircle, faCircle, faPlayCircle, faTimesCircle} from "@fortawesome/free-regular-svg-icons"; import {faCheckCircle, faCircle, faCopy, faPlayCircle, faTimesCircle} from "@fortawesome/free-regular-svg-icons";
@Component({ @Component({
selector: 'app-bulk-list', selector: 'app-bulk-list',
@ -60,10 +60,15 @@ export class BulkListComponent implements OnInit {
} }
} }
duplicate(bulk: Bulk): void {
this.bulkService.duplicate(bulk, bulk => this.addOrReplace(bulk));
}
delete(bulk: Bulk): void { delete(bulk: Bulk): void {
if (confirm("Zeitplan \"" + bulk.name + "\" wirklich löschen?")) { if (confirm("Zeitplan \"" + bulk.name + "\" wirklich löschen?")) {
this.bulkService.delete(bulk, () => this.remove(bulk)); this.bulkService.delete(bulk, () => this.remove(bulk));
} }
} }
protected readonly faCopy = faCopy;
} }

View File

@ -4,7 +4,7 @@
import {getBaseUrl} from "./UrlHelper"; import {getBaseUrl} from "./UrlHelper";
const PROD: boolean = true; const PROD: boolean = false;
export const environment = { export const environment = {
production: false, production: false,

View File

@ -1,14 +1,10 @@
package de.ph87.homeautomation.bulk; package de.ph87.homeautomation.bulk;
import de.ph87.homeautomation.bulk.entry.BulkEntry; import de.ph87.homeautomation.bulk.entry.*;
import lombok.Getter; import lombok.*;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*; import javax.persistence.*;
import java.util.ArrayList; import java.util.*;
import java.util.List;
@Entity @Entity
@Getter @Getter
@ -40,6 +36,12 @@ public class Bulk {
return entries.size(); return entries.size();
} }
public Bulk(final Bulk original, final String name) {
this.enabled = original.isEnabled();
this.name = name;
this.entries = original.getEntries().stream().map(BulkEntry::new).toList();
}
public Bulk(final BulkCreateDto dto) { public Bulk(final BulkCreateDto dto) {
this.enabled = dto.isEnabled(); this.enabled = dto.isEnabled();
this.name = dto.getName(); this.name = dto.getName();

View File

@ -1,12 +1,11 @@
package de.ph87.homeautomation.bulk; package de.ph87.homeautomation.bulk;
import de.ph87.homeautomation.shared.ISearchController; import de.ph87.homeautomation.shared.*;
import de.ph87.homeautomation.shared.SearchResult; import lombok.*;
import lombok.RequiredArgsConstructor; import org.springframework.data.domain.*;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.*;
@RestController @RestController
@RequestMapping("bulk") @RequestMapping("bulk")
@ -37,6 +36,11 @@ public class BulkController implements ISearchController {
bulkWriter.run(id); bulkWriter.run(id);
} }
@GetMapping("duplicate/{id}")
public BulkDto duplicate(@PathVariable final long id) {
return bulkWriter.duplicate(id);
}
@PostMapping("set/{id}/name") @PostMapping("set/{id}/name")
public BulkDto name(@PathVariable final long id, @RequestBody final String name) { public BulkDto name(@PathVariable final long id, @RequestBody final String name) {
return bulkWriter.set(id, bulk -> bulk.setName(name)); return bulkWriter.set(id, bulk -> bulk.setName(name));

View File

@ -1,11 +1,9 @@
package de.ph87.homeautomation.bulk; package de.ph87.homeautomation.bulk;
import de.ph87.homeautomation.property.Property; import de.ph87.homeautomation.property.*;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.*;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.List; import java.util.*;
import java.util.Optional;
public interface BulkRepository extends JpaRepository<Bulk, Long>, JpaSpecificationExecutor<Bulk> { public interface BulkRepository extends JpaRepository<Bulk, Long>, JpaSpecificationExecutor<Bulk> {
@ -16,4 +14,6 @@ public interface BulkRepository extends JpaRepository<Bulk, Long>, JpaSpecificat
List<Bulk> findDistinctByEntries_Property(Property property); List<Bulk> findDistinctByEntries_Property(Property property);
boolean existsByName(String name);
} }

View File

@ -1,11 +1,11 @@
package de.ph87.homeautomation.bulk; package de.ph87.homeautomation.bulk;
import lombok.RequiredArgsConstructor; import lombok.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.*;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.*;
import java.util.function.Consumer; import java.util.function.*;
@Slf4j @Slf4j
@Service @Service
@ -38,6 +38,19 @@ public class BulkWriter {
bulkExecutor.execute(bulk); bulkExecutor.execute(bulk);
} }
public BulkDto duplicate(final long id) {
final Bulk original = bulkReader.getById(id);
int number = 1;
while (true) {
final String copyName = original.getName() + " Kopie " + number;
if (!bulkRepository.existsByName(copyName)) {
final Bulk copy = bulkRepository.save(new Bulk(original, copyName));
log.info("Bulk duplicated: {}", copy);
return bulkMapper.toDto(copy);
}
}
}
public BulkDto set(final long id, final Consumer<Bulk> consumer) { public BulkDto set(final long id, final Consumer<Bulk> consumer) {
final Bulk bulk = bulkReader.getById(id); final Bulk bulk = bulkReader.getById(id);
consumer.accept(bulk); consumer.accept(bulk);

View File

@ -1,10 +1,7 @@
package de.ph87.homeautomation.bulk.entry; package de.ph87.homeautomation.bulk.entry;
import de.ph87.homeautomation.property.Property; import de.ph87.homeautomation.property.*;
import lombok.Getter; import lombok.*;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*; import javax.persistence.*;
@ -41,4 +38,11 @@ public class BulkEntry {
this.value = dto.getValue(); this.value = dto.getValue();
} }
@SuppressWarnings("CopyConstructorMissesField")
public BulkEntry(final BulkEntry original) {
this.position = original.getPosition();
this.property = original.getProperty();
this.value = original.getValue();
}
} }