From e380ebde030297597e8f561e0b16ced6d7538eb8 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Tue, 21 Apr 2026 11:05:50 +0200 Subject: [PATCH 1/6] Updated database with a new placedobjectType --- .../database/drizzle/0002_bright_doomsday.sql | 1 + .../database/drizzle/meta/0002_snapshot.json | 1018 +++++++++++++++++ backend/database/drizzle/meta/_journal.json | 7 + backend/database/src/schema.ts | 2 +- 4 files changed, 1027 insertions(+), 1 deletion(-) create mode 100644 backend/database/drizzle/0002_bright_doomsday.sql create mode 100644 backend/database/drizzle/meta/0002_snapshot.json diff --git a/backend/database/drizzle/0002_bright_doomsday.sql b/backend/database/drizzle/0002_bright_doomsday.sql new file mode 100644 index 00000000..c92e4d27 --- /dev/null +++ b/backend/database/drizzle/0002_bright_doomsday.sql @@ -0,0 +1 @@ +ALTER TYPE "public"."PlacedObjectType" ADD VALUE 'text' BEFORE 'vrPortal'; \ No newline at end of file diff --git a/backend/database/drizzle/meta/0002_snapshot.json b/backend/database/drizzle/meta/0002_snapshot.json new file mode 100644 index 00000000..98115489 --- /dev/null +++ b/backend/database/drizzle/meta/0002_snapshot.json @@ -0,0 +1,1018 @@ +{ + "id": "99e462b0-daaf-4acd-a137-aa58707577b8", + "prevId": "00da352d-b6ec-4613-9e4c-828f27056153", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.Assets": { + "name": "Assets", + "schema": "", + "columns": { + "assetId": { + "name": "assetId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "assetType": { + "name": "assetType", + "type": "AssetType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "originalFileName": { + "name": "originalFileName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "generatedName": { + "name": "generatedName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size": { + "name": "size", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "mimeType": { + "name": "mimeType", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "showInUserLibrary": { + "name": "showInUserLibrary", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "assetFileExtension": { + "name": "assetFileExtension", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "ownerUserId": { + "name": "ownerUserId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "Assets_ownerUserId_Users_userId_fk": { + "name": "Assets_ownerUserId_Users_userId_fk", + "tableFrom": "Assets", + "tableTo": "Users", + "columnsFrom": [ + "ownerUserId" + ], + "columnsTo": [ + "userId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "Assets_generatedName_unique": { + "name": "Assets_generatedName_unique", + "nullsNotDistinct": false, + "columns": [ + "generatedName" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.CameraPortals": { + "name": "CameraPortals", + "schema": "", + "columns": { + "fromCameraId": { + "name": "fromCameraId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "toCameraId": { + "name": "toCameraId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "x": { + "name": "x", + "type": "double precision", + "primaryKey": false, + "notNull": true + }, + "y": { + "name": "y", + "type": "double precision", + "primaryKey": false, + "notNull": true + }, + "distance": { + "name": "distance", + "type": "double precision", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "CameraPortals_fromCameraId_Cameras_cameraId_fk": { + "name": "CameraPortals_fromCameraId_Cameras_cameraId_fk", + "tableFrom": "CameraPortals", + "tableTo": "Cameras", + "columnsFrom": [ + "fromCameraId" + ], + "columnsTo": [ + "cameraId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "CameraPortals_toCameraId_Cameras_cameraId_fk": { + "name": "CameraPortals_toCameraId_Cameras_cameraId_fk", + "tableFrom": "CameraPortals", + "tableTo": "Cameras", + "columnsFrom": [ + "toCameraId" + ], + "columnsTo": [ + "cameraId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "cameraPortals_pkey": { + "name": "cameraPortals_pkey", + "columns": [ + "fromCameraId", + "toCameraId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.Cameras": { + "name": "Cameras", + "schema": "", + "columns": { + "cameraId": { + "name": "cameraId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "streamId": { + "name": "streamId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "senderId": { + "name": "senderId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "cameraType": { + "name": "cameraType", + "type": "CameraType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'panoramic360'" + }, + "viewOriginX": { + "name": "viewOriginX", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 0.5 + }, + "viewOriginY": { + "name": "viewOriginY", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 0.5 + }, + "fovStart": { + "name": "fovStart", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "fovEnd": { + "name": "fovEnd", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "orientation": { + "name": "orientation", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "cameras_name_streamId_key": { + "name": "cameras_name_streamId_key", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "streamId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cameras_senderId_streamId_key": { + "name": "cameras_senderId_streamId_key", + "columns": [ + { + "expression": "streamId", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "senderId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "Cameras_streamId_Streams_streamId_fk": { + "name": "Cameras_streamId_Streams_streamId_fk", + "tableFrom": "Cameras", + "tableTo": "Streams", + "columnsFrom": [ + "streamId" + ], + "columnsTo": [ + "streamId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.Permissions": { + "name": "Permissions", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "targetType": { + "name": "targetType", + "type": "PermissionTargetType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "targetId": { + "name": "targetId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "permissionLevel": { + "name": "permissionLevel", + "type": "PermissionLevel", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'view'" + } + }, + "indexes": {}, + "foreignKeys": { + "Permissions_userId_Users_userId_fk": { + "name": "Permissions_userId_Users_userId_fk", + "tableFrom": "Permissions", + "tableTo": "Users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "userId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": { + "permissions_pkey": { + "name": "permissions_pkey", + "columns": [ + "userId", + "targetType", + "targetId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.PlacedObjects": { + "name": "PlacedObjects", + "schema": "", + "columns": { + "placedObjectId": { + "name": "placedObjectId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "vrSpaceId": { + "name": "vrSpaceId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "PlacedObjectType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "objectId": { + "name": "objectId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "objectSettings": { + "name": "objectSettings", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "position": { + "name": "position", + "type": "real[]", + "primaryKey": false, + "notNull": true + }, + "orientation": { + "name": "orientation", + "type": "real[]", + "primaryKey": false, + "notNull": false + }, + "scale": { + "name": "scale", + "type": "real[]", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "PlacedObjects_vrSpaceId_VrSpaces_vrSpaceId_fk": { + "name": "PlacedObjects_vrSpaceId_VrSpaces_vrSpaceId_fk", + "tableFrom": "PlacedObjects", + "tableTo": "VrSpaces", + "columnsFrom": [ + "vrSpaceId" + ], + "columnsTo": [ + "vrSpaceId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "sid": { + "name": "sid", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "sess": { + "name": "sess", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "expire": { + "name": "expire", + "type": "timestamp(6)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "Session_sid_key": { + "name": "Session_sid_key", + "columns": [ + { + "expression": "sid", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "IDX_session_expire": { + "name": "IDX_session_expire", + "columns": [ + { + "expression": "expire", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.Streams": { + "name": "Streams", + "schema": "", + "columns": { + "streamId": { + "name": "streamId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ownerUserId": { + "name": "ownerUserId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "streamStartTime": { + "name": "streamStartTime", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + }, + "streamAutoStart": { + "name": "streamAutoStart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "streamManuallyStarted": { + "name": "streamManuallyStarted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "streamManuallyEnded": { + "name": "streamManuallyEnded", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "visibility": { + "name": "visibility", + "type": "Visibility", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'public'" + }, + "mainCameraId": { + "name": "mainCameraId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "Stream_name_key": { + "name": "Stream_name_key", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "Streams_ownerUserId_Users_userId_fk": { + "name": "Streams_ownerUserId_Users_userId_fk", + "tableFrom": "Streams", + "tableTo": "Users", + "columnsFrom": [ + "ownerUserId" + ], + "columnsTo": [ + "userId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "Streams_mainCameraId_Cameras_cameraId_fk": { + "name": "Streams_mainCameraId_Cameras_cameraId_fk", + "tableFrom": "Streams", + "tableTo": "Cameras", + "columnsFrom": [ + "mainCameraId" + ], + "columnsTo": [ + "cameraId" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.Users": { + "name": "Users", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "Role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'user'" + }, + "avatarDesign": { + "name": "avatarDesign", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "User_username_key": { + "name": "User_username_key", + "columns": [ + { + "expression": "username", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.VrSpaces": { + "name": "VrSpaces", + "schema": "", + "columns": { + "vrSpaceId": { + "name": "vrSpaceId", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ownerUserId": { + "name": "ownerUserId", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "worldModelAssetId": { + "name": "worldModelAssetId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "navMeshAssetId": { + "name": "navMeshAssetId", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "panoramicPreview": { + "name": "panoramicPreview", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "visibility": { + "name": "visibility", + "type": "Visibility", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'public'" + }, + "worldModelScale": { + "name": "worldModelScale", + "type": "double precision", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "spawnPosition": { + "name": "spawnPosition", + "type": "real[]", + "primaryKey": false, + "notNull": false + }, + "spawnRadius": { + "name": "spawnRadius", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "skyColor": { + "name": "skyColor", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp (3)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "VrSpaces_ownerUserId_Users_userId_fk": { + "name": "VrSpaces_ownerUserId_Users_userId_fk", + "tableFrom": "VrSpaces", + "tableTo": "Users", + "columnsFrom": [ + "ownerUserId" + ], + "columnsTo": [ + "userId" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "VrSpaces_worldModelAssetId_Assets_assetId_fk": { + "name": "VrSpaces_worldModelAssetId_Assets_assetId_fk", + "tableFrom": "VrSpaces", + "tableTo": "Assets", + "columnsFrom": [ + "worldModelAssetId" + ], + "columnsTo": [ + "assetId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "VrSpaces_navMeshAssetId_Assets_assetId_fk": { + "name": "VrSpaces_navMeshAssetId_Assets_assetId_fk", + "tableFrom": "VrSpaces", + "tableTo": "Assets", + "columnsFrom": [ + "navMeshAssetId" + ], + "columnsTo": [ + "assetId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "VrSpaces_panoramicPreview_Assets_assetId_fk": { + "name": "VrSpaces_panoramicPreview_Assets_assetId_fk", + "tableFrom": "VrSpaces", + "tableTo": "Assets", + "columnsFrom": [ + "panoramicPreview" + ], + "columnsTo": [ + "assetId" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.AssetType": { + "name": "AssetType", + "schema": "public", + "values": [ + "image", + "video", + "model", + "navmesh", + "document" + ] + }, + "public.CameraType": { + "name": "CameraType", + "schema": "public", + "values": [ + "panoramic360", + "normal" + ] + }, + "public.PermissionLevel": { + "name": "PermissionLevel", + "schema": "public", + "values": [ + "admin", + "edit", + "view" + ] + }, + "public.PermissionTargetType": { + "name": "PermissionTargetType", + "schema": "public", + "values": [ + "stream", + "vrSpace" + ] + }, + "public.PlacedObjectType": { + "name": "PlacedObjectType", + "schema": "public", + "values": [ + "asset", + "text", + "vrPortal", + "streamPortal", + "externalLinkPortal", + "pointLight", + "directionalLight", + "ambientLight" + ] + }, + "public.Role": { + "name": "Role", + "schema": "public", + "values": [ + "god", + "superadmin", + "admin", + "moderator", + "user", + "guest" + ] + }, + "public.Visibility": { + "name": "Visibility", + "schema": "public", + "values": [ + "private", + "unlisted", + "public" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/backend/database/drizzle/meta/_journal.json b/backend/database/drizzle/meta/_journal.json index dcf1dd8b..6173226a 100644 --- a/backend/database/drizzle/meta/_journal.json +++ b/backend/database/drizzle/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1740761650572, "tag": "0001_dapper_proteus", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1776761124288, + "tag": "0002_bright_doomsday", + "breakpoints": true } ] } \ No newline at end of file diff --git a/backend/database/src/schema.ts b/backend/database/src/schema.ts index e221f368..0f4cba51 100644 --- a/backend/database/src/schema.ts +++ b/backend/database/src/schema.ts @@ -10,7 +10,7 @@ export const CameraTypeEnum = pgEnum("CameraType", ['panoramic360', 'normal']) export const AssetTypeEnum = pgEnum("AssetType", ['image', 'video', 'model', 'navmesh', 'document']); // export type AssetTypes = typeof AssetTypeEnum.enumValues[number]; -export const PlacedObjectTypeEnum = pgEnum("PlacedObjectType", ['asset', 'vrPortal', 'streamPortal', 'externalLinkPortal', 'pointLight', 'directionalLight', 'ambientLight']); +export const PlacedObjectTypeEnum = pgEnum("PlacedObjectType", ['asset', 'text', 'vrPortal', 'streamPortal', 'externalLinkPortal', 'pointLight', 'directionalLight', 'ambientLight']); // export const PortalType = pgEnum("PortalType", ['vrSpace', 'stream', 'externalUrl']); export const RoleEnum = pgEnum("Role", ['god', 'superadmin', 'admin', 'moderator', 'user', 'guest']) export const VisibilityEnum = pgEnum("Visibility", ['private', 'unlisted', 'public']) From ba56139888ae75114de86721f5c6412121fe9756 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Tue, 21 Apr 2026 11:26:37 +0200 Subject: [PATCH 2/6] Added textbox component --- app/src/components/entities/TextBox.vue | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 app/src/components/entities/TextBox.vue diff --git a/app/src/components/entities/TextBox.vue b/app/src/components/entities/TextBox.vue new file mode 100644 index 00000000..820a7590 --- /dev/null +++ b/app/src/components/entities/TextBox.vue @@ -0,0 +1,54 @@ + + + \ No newline at end of file From 0376cc104660254277ad98fa6b64af7efc217083 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Mon, 27 Apr 2026 07:51:38 +0200 Subject: [PATCH 3/6] Fixed problem with textboxes not appearing to be placed where they are supposed to be --- app/src/components/entities/TextBox.vue | 66 +++++++++++-------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/app/src/components/entities/TextBox.vue b/app/src/components/entities/TextBox.vue index 820a7590..854fb302 100644 --- a/app/src/components/entities/TextBox.vue +++ b/app/src/components/entities/TextBox.vue @@ -1,54 +1,46 @@ \ No newline at end of file From 184d162a9b4fda0ac5ab41fb7cfc6ba7100fadc7 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Mon, 27 Apr 2026 07:52:06 +0200 Subject: [PATCH 4/6] Added textbox to vrspace preview --- app/src/views/user/VrSpaceSettingsView.vue | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/src/views/user/VrSpaceSettingsView.vue b/app/src/views/user/VrSpaceSettingsView.vue index ce9bc12d..b44948c3 100644 --- a/app/src/views/user/VrSpaceSettingsView.vue +++ b/app/src/views/user/VrSpaceSettingsView.vue @@ -237,6 +237,10 @@ +
@@ -280,6 +284,10 @@ @click="selectedPlacedObject = placedObject" class="editable-object" :scale="placedObject.scale ? arrToCoordString(placedObject.scale) : ''" :asset="placedObject.asset" /> + @@ -431,6 +439,7 @@ import type { RouterOutputs } from '@/modules/trpcClient'; import AssetLibrary from '@/components/lobby/AssetLibrary.vue'; import { uploadFileData } from '@/modules/utils'; import VrSpacePortal from '@/components/entities/VrSpacePortal.vue'; +import TextBox from '@/components/entities/TextBox.vue' import AutoComplete from '@/components/AutoComplete.vue'; import { useCurrentCursorIntersection, useSelectedPlacedObject, useCurrentlyMovedObject, isAsset } from '@/composables/vrSpaceComposables'; import { THREE, type Entity } from 'aframe'; @@ -491,6 +500,11 @@ const hasAdminRights = computed(() => { return isSuperAdminOrHigher || isOwner || hasAdminPermission; }) +function createTextbox() { + currentlyMovedObject.value = { type: 'text' as any }; // Fake for placement mode + setCursorMode('place-asset'); +} + const tabs = computed(() => { let tabList = [ { label: 'Mediabibliotek', iconName: 'collections' }, @@ -653,6 +667,27 @@ async function placeMovedObject() { }, 'placing an asset') currentlyMovedObject.value = undefined; return; + } else if (currentlyMovedObject.value?.type === 'text') { + console.log('✅ Creating TEXTBOX!'); + await vrSpaceStore.upsertPlacedObject({ + vrSpaceId: props.vrSpaceId, + type: 'text', + objectSettings: { + text: 'Ny textbox', + fontSize: 0.5, + color: '#ffffff', + maxWidth: 4, + }, + position, + orientation: rotation, + scale: [2, 2, 2], + }); + const newTextbox = vrSpaceStore.currentVrSpace?.dbData.placedObjects.find(p => p.placedObjectId === newTextboxId); + selectedPlacedObject.value = newTextbox; + + currentlyMovedObject.value = undefined; + setCursorMode('select-objects'); + return; } else { console.log('placed an already placedObject, should update the DB'); await vrSpaceStore.upsertPlacedObject({ From 9c3b77a52672d8d2aa6703fc468c4fa9e61702c4 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Thu, 30 Apr 2026 08:34:16 +0200 Subject: [PATCH 5/6] Added more options to select-objects to be able to select textbox --- app/src/composables/vrSpaceComposables.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/composables/vrSpaceComposables.ts b/app/src/composables/vrSpaceComposables.ts index bb077beb..5a7c23a1 100644 --- a/app/src/composables/vrSpaceComposables.ts +++ b/app/src/composables/vrSpaceComposables.ts @@ -53,7 +53,7 @@ const currentRaycastSelectorArray = computed(() => { return ['.raycastable-surface']; case 'select-objects': - return ['.editable-object', '.clickable'] + return ['.editable-object', '.clickable', '.editable-object *', '.clickable *'] default: return ['.clickable']; From bf76734ec5f20bdac570ebf75af3f0cfcc3bb6f7 Mon Sep 17 00:00:00 2001 From: Darkdusk Date: Thu, 30 Apr 2026 08:35:34 +0200 Subject: [PATCH 6/6] Added textbox to the render of selected objects. Also added a few debug lines to find out why textbox still isn't rendering --- app/src/views/user/VrSpaceSettingsView.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/views/user/VrSpaceSettingsView.vue b/app/src/views/user/VrSpaceSettingsView.vue index b44948c3..101f4879 100644 --- a/app/src/views/user/VrSpaceSettingsView.vue +++ b/app/src/views/user/VrSpaceSettingsView.vue @@ -301,6 +301,10 @@ :position="arrToCoordString(transformedSelectedObject.position)" class="selectable-object" :scale="transformedSelectedObject.scale ? arrToCoordString(transformedSelectedObject.scale) : ''" :asset="transformedSelectedObject.asset" /> + @@ -389,6 +393,9 @@ type="radio" value="selfPlacement" aria-label="Hoppa in i scenen" class="btn btn-sm btn-primary" v-model="currentRaycastReason"> -->
{{ currentCursorMode }}
+
selected: {{ selectedPlacedObject?.type }} ({{ selectedPlacedObject?.placedObjectId?.slice(-4) }})
+
transformed: {{ transformedSelectedObject?.type }}
+
notEditing count: {{ placedObjectsNotBeingEdited.length }}