diff --git a/src/main/angular/src/app/api/bulk/BulkService.ts b/src/main/angular/src/app/api/bulk/BulkService.ts
index 4a7c526..ca02c0c 100644
--- a/src/main/angular/src/app/api/bulk/BulkService.ts
+++ b/src/main/angular/src/app/api/bulk/BulkService.ts
@@ -66,6 +66,10 @@ export class BulkService implements ISearchService {
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 {
this.api.putReturnItem("BulkEntry/" + entry.id + "/set/" + key, value, next);
}
diff --git a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html
index d622ead..d762c07 100644
--- a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html
+++ b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.html
@@ -8,6 +8,7 @@
Bezeichnung |
|
|
+ |
@@ -24,6 +25,10 @@
+ |
+
+ |
+
|
diff --git a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts
index 361146f..4740b21 100644
--- a/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts
+++ b/src/main/angular/src/app/pages/bulk/list/bulk-list.component.ts
@@ -1,7 +1,7 @@
import {Component, OnInit} from '@angular/core';
import {BulkService} from "../../../api/bulk/BulkService";
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({
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 {
if (confirm("Zeitplan \"" + bulk.name + "\" wirklich löschen?")) {
this.bulkService.delete(bulk, () => this.remove(bulk));
}
}
+ protected readonly faCopy = faCopy;
}
diff --git a/src/main/angular/src/environments/environment.ts b/src/main/angular/src/environments/environment.ts
index 5e41d22..eb18ddd 100644
--- a/src/main/angular/src/environments/environment.ts
+++ b/src/main/angular/src/environments/environment.ts
@@ -4,7 +4,7 @@
import {getBaseUrl} from "./UrlHelper";
-const PROD: boolean = true;
+const PROD: boolean = false;
export const environment = {
production: false,
diff --git a/src/main/java/de/ph87/homeautomation/bulk/Bulk.java b/src/main/java/de/ph87/homeautomation/bulk/Bulk.java
index fcb64a2..45eadfa 100644
--- a/src/main/java/de/ph87/homeautomation/bulk/Bulk.java
+++ b/src/main/java/de/ph87/homeautomation/bulk/Bulk.java
@@ -1,14 +1,10 @@
package de.ph87.homeautomation.bulk;
-import de.ph87.homeautomation.bulk.entry.BulkEntry;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
+import de.ph87.homeautomation.bulk.entry.*;
+import lombok.*;
import javax.persistence.*;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
@Entity
@Getter
@@ -16,33 +12,39 @@ import java.util.List;
@NoArgsConstructor
@SuppressWarnings("FieldMayBeFinal")
public class Bulk {
-
+
@Id
@GeneratedValue
private long id;
-
+
@Version
private long version;
-
+
@Setter
private boolean enabled;
-
+
@Setter
@Column(nullable = false, unique = true)
private String name;
-
+
@ToString.Exclude
@OneToMany(cascade = CascadeType.ALL)
private List entries = new ArrayList<>();
-
+
@ToString.Include
public int entryCount() {
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) {
this.enabled = dto.isEnabled();
this.name = dto.getName();
}
-
+
}
diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkController.java b/src/main/java/de/ph87/homeautomation/bulk/BulkController.java
index c690841..5d5975d 100644
--- a/src/main/java/de/ph87/homeautomation/bulk/BulkController.java
+++ b/src/main/java/de/ph87/homeautomation/bulk/BulkController.java
@@ -1,12 +1,11 @@
package de.ph87.homeautomation.bulk;
-import de.ph87.homeautomation.shared.ISearchController;
-import de.ph87.homeautomation.shared.SearchResult;
-import lombok.RequiredArgsConstructor;
-import org.springframework.data.domain.Page;
+import de.ph87.homeautomation.shared.*;
+import lombok.*;
+import org.springframework.data.domain.*;
import org.springframework.web.bind.annotation.*;
-import java.util.List;
+import java.util.*;
@RestController
@RequestMapping("bulk")
@@ -26,22 +25,27 @@ public class BulkController implements ISearchController {
public Page filter(@RequestBody final BulkFilter filter) {
return bulkReader.filter(filter);
}
-
+
@GetMapping("delete/{id}")
public void delete(@PathVariable final long id) {
bulkWriter.delete(id);
}
-
+
@GetMapping("run/{id}")
public void run(@PathVariable final long id) {
bulkWriter.run(id);
}
-
+
+ @GetMapping("duplicate/{id}")
+ public BulkDto duplicate(@PathVariable final long id) {
+ return bulkWriter.duplicate(id);
+ }
+
@PostMapping("set/{id}/name")
public BulkDto name(@PathVariable final long id, @RequestBody final String name) {
return bulkWriter.set(id, bulk -> bulk.setName(name));
}
-
+
@PostMapping("set/{id}/enabled")
public BulkDto enabled(@PathVariable final long id, @RequestBody final boolean enabled) {
return bulkWriter.set(id, bulk -> bulk.setEnabled(enabled));
diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java b/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java
index 522ca4c..180fe96 100644
--- a/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java
+++ b/src/main/java/de/ph87/homeautomation/bulk/BulkRepository.java
@@ -1,19 +1,19 @@
package de.ph87.homeautomation.bulk;
-import de.ph87.homeautomation.property.Property;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import de.ph87.homeautomation.property.*;
+import org.springframework.data.jpa.repository.*;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
public interface BulkRepository extends JpaRepository, JpaSpecificationExecutor {
-
+
@Deprecated(since = "Use 'filter' instead", forRemoval = true)
List findAllByNameLikeIgnoreCase(String term);
-
+
Optional findByEntries_Id(long id);
-
+
List findDistinctByEntries_Property(Property property);
-
+
+ boolean existsByName(String name);
+
}
diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java b/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java
index 87fc401..0ff6f87 100644
--- a/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java
+++ b/src/main/java/de/ph87/homeautomation/bulk/BulkWriter.java
@@ -1,52 +1,65 @@
package de.ph87.homeautomation.bulk;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
+import lombok.*;
+import lombok.extern.slf4j.*;
+import org.springframework.stereotype.*;
+import org.springframework.transaction.annotation.*;
-import java.util.function.Consumer;
+import java.util.function.*;
@Slf4j
@Service
@Transactional
@RequiredArgsConstructor
public class BulkWriter {
-
+
private final BulkRepository bulkRepository;
-
+
private final BulkReader bulkReader;
-
+
private final BulkMapper bulkMapper;
-
+
private final BulkExecutor bulkExecutor;
-
+
public Bulk create(final BulkCreateDto dto) {
final Bulk bulk = bulkRepository.save(new Bulk(dto));
log.info("Bulk created: {}", bulk);
return bulk;
}
-
+
public void delete(final long id) {
final Bulk bulk = bulkReader.getById(id);
bulkRepository.delete(bulk);
log.info("Bulk deleted: {}", bulk);
}
-
+
public void run(final long id) {
final Bulk bulk = bulkReader.getById(id);
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 consumer) {
final Bulk bulk = bulkReader.getById(id);
consumer.accept(bulk);
log.info("Changed Bulk: {}", bulk);
return bulkMapper.toDto(bulk);
}
-
+
public BulkDto createDto(final BulkCreateDto dto) {
return bulkMapper.toDto(create(dto));
}
-
+
}
diff --git a/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java b/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java
index 898c43f..3672c6e 100644
--- a/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java
+++ b/src/main/java/de/ph87/homeautomation/bulk/entry/BulkEntry.java
@@ -1,10 +1,7 @@
package de.ph87.homeautomation.bulk.entry;
-import de.ph87.homeautomation.property.Property;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
+import de.ph87.homeautomation.property.*;
+import lombok.*;
import javax.persistence.*;
@@ -13,32 +10,39 @@ import javax.persistence.*;
@ToString
@NoArgsConstructor
public class BulkEntry {
-
+
@Id
@GeneratedValue
private long id;
-
+
@Version
private long version;
-
+
@Setter
private boolean enabled;
-
+
@Setter
private int position;
-
+
@Setter
@ManyToOne
private Property property;
-
+
@Setter
@Column(name = "value_")
private double value;
-
+
public BulkEntry(final BulkEntryCreateDto dto, final Property property) {
this.position = dto.getPosition();
this.property = property;
this.value = dto.getValue();
}
-
+
+ @SuppressWarnings("CopyConstructorMissesField")
+ public BulkEntry(final BulkEntry original) {
+ this.position = original.getPosition();
+ this.property = original.getProperty();
+ this.value = original.getValue();
+ }
+
}