Add deepCopy utility and enforce required fields in particle forms

This commit is contained in:
akastijn 2025-12-27 22:06:45 +01:00
parent 9b8c4891f4
commit dc1b29e52c
3 changed files with 23 additions and 5 deletions

View File

@ -7,18 +7,18 @@
<div class="form-row"> <div class="form-row">
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>Particle Name</mat-label> <mat-label>Particle Name</mat-label>
<input matInput [(ngModel)]="particleData.particle_name" placeholder="Enter particle name"> <input required matInput [(ngModel)]="particleData.particle_name" placeholder="Enter particle name">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>Display Name</mat-label> <mat-label>Display Name</mat-label>
<input matInput [(ngModel)]="particleData.display_name" placeholder="Enter display name"> <input required matInput [(ngModel)]="particleData.display_name" placeholder="Enter display name">
</mat-form-field> </mat-form-field>
</div> </div>
<div class="form-row"> <div class="form-row">
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>Permission name</mat-label> <mat-label>Permission name</mat-label>
<input matInput [(ngModel)]="particleData.permission" placeholder="Enter permission"> <input required matInput [(ngModel)]="particleData.permission" placeholder="Enter permission">
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>Package name</mat-label> <mat-label>Package name</mat-label>
@ -37,14 +37,14 @@
</mat-form-field> </mat-form-field>
<mat-form-field appearance="outline"> <mat-form-field appearance="outline">
<mat-label>Display Item</mat-label> <mat-label>Display Item</mat-label>
<input matInput [(ngModel)]="particleData.display_item" placeholder="Enter display item"> <input required matInput [(ngModel)]="particleData.display_item" placeholder="Enter display item">
</mat-form-field> </mat-form-field>
</div> </div>
<div class="form-row"> <div class="form-row">
<mat-form-field appearance="outline" class="lore-double"> <mat-form-field appearance="outline" class="lore-double">
<mat-label>Lore</mat-label> <mat-label>Lore</mat-label>
<textarea matInput [(ngModel)]="particleData.lore" placeholder="Enter lore"></textarea> <textarea required matInput [(ngModel)]="particleData.lore" placeholder="Enter lore"></textarea>
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -3,6 +3,7 @@ import * as THREE from 'three';
import {RendererService} from './renderer.service'; import {RendererService} from './renderer.service';
import {Particle, ParticleData, ParticleInfo, ParticleType} from '../models/particle.model'; import {Particle, ParticleData, ParticleInfo, ParticleType} from '../models/particle.model';
import {IntersectionPlaneService, PlaneOrientation} from './intersection-plane.service'; import {IntersectionPlaneService, PlaneOrientation} from './intersection-plane.service';
import {deepCopy} from '../../../util/deep-copy.util';
/** /**
* Service responsible for managing particles in the scene * Service responsible for managing particles in the scene
@ -281,6 +282,13 @@ export class ParticleManagerService {
* Generates JSON output of the particle data * Generates JSON output of the particle data
*/ */
generateJson(): string { generateJson(): string {
const particleData = deepCopy(this.particleData)
if (this.particleData.package_permission) {
particleData.package_permission = 'apart.set.' + this.particleData.package_permission.toLowerCase().replace(' ', '-');
} else {
particleData.package_permission = 'apart.set.none';
}
particleData.permission = 'apart.particle.' + this.particleData.permission.toLowerCase().replace(' ', '-');
return JSON.stringify(this.particleData, null, 2); return JSON.stringify(this.particleData, null, 2);
} }

View File

@ -0,0 +1,10 @@
export function deepCopy<T>(obj: T): T {
// Structured cloning
if (typeof globalThis?.structuredClone === 'function') {
// @ts-ignore
return globalThis.structuredClone(obj) as T;
}
// Normal objects
return JSON.parse(JSON.stringify(obj)) as T;
}