From 64e067eb59c706fb204507df2e1725108794f68c Mon Sep 17 00:00:00 2001 From: lexx Date: Tue, 13 Jan 2026 18:20:01 +0200 Subject: [PATCH] files --- .../RecordEditEntry/RecordEditEntry.svelte | 2 + .../entry/RecordEditEntry/RecordForm.svelte | 10 +++- .../RecordEditEntry/fields/FileField.svelte | 40 +++++++-------- src/Core/Data/RecordFilePreview.php | 9 ++++ src/Core/File/FileModule.php | 3 +- src/Core/File/RecordFileModule.php | 31 +++++++++++- src/Core/Repository/FileRepo.php | 18 +++++++ src/Core/Repository/RecordRepo.php | 26 ++++++++++ src/Http/Controller/RecordController.php | 49 +++++++++++-------- src/Http/web.php | 3 ++ 10 files changed, 144 insertions(+), 47 deletions(-) create mode 100644 src/Core/Data/RecordFilePreview.php diff --git a/front/js/entry/RecordEditEntry/RecordEditEntry.svelte b/front/js/entry/RecordEditEntry/RecordEditEntry.svelte index af3b495..a9e2f84 100644 --- a/front/js/entry/RecordEditEntry/RecordEditEntry.svelte +++ b/front/js/entry/RecordEditEntry/RecordEditEntry.svelte @@ -50,6 +50,7 @@ {channel} fields={data.fields} edgeRecordPreviews={data.edgeRecordPreviewsDraft} + filesPreviews={data.filesPreviewsDraft} {record} {selectedLocales} validationErrors={data.validationErrors} @@ -62,6 +63,7 @@ {channel} fields={data.fields} edgeRecordPreviews={data.edgeRecordPreviewsLive} + filesPreviews={data.filesPreviewsLive} {record} {selectedLocales} validationErrors={data.validationErrors} diff --git a/front/js/entry/RecordEditEntry/RecordForm.svelte b/front/js/entry/RecordEditEntry/RecordForm.svelte index 92a6f1a..084cc35 100644 --- a/front/js/entry/RecordEditEntry/RecordForm.svelte +++ b/front/js/entry/RecordEditEntry/RecordForm.svelte @@ -9,6 +9,7 @@ validationErrors, fieldData, edgeRecordPreviews, + filesPreviews, selectedLocales, } = $props(); const findFieldValidationError = (field, locale) => { @@ -26,6 +27,13 @@ (e) => e.edge.fieldId === field.id && e.edge.locale === locale, ); }; + const findFieldFiles = (field, locale) => { + return filesPreviews.filter( + (f) => + f.recordFile.fieldId === field.id && + f.recordFile.locale === locale, + ); + }; {#each fields as field} @@ -88,6 +96,6 @@ schemaField={field} {locale} dataField={findDataField(field, locale)} - edgeRecordPreviews={findFieldEdges(field, locale)} + filesPreviews={findFieldFiles(field, locale)} > {/snippet} diff --git a/front/js/entry/RecordEditEntry/fields/FileField.svelte b/front/js/entry/RecordEditEntry/fields/FileField.svelte index f43de6a..757e69d 100644 --- a/front/js/entry/RecordEditEntry/fields/FileField.svelte +++ b/front/js/entry/RecordEditEntry/fields/FileField.svelte @@ -13,6 +13,7 @@ locale, validationError, edgeRecordPreviews, + filesPreviews, } = $props(); let originalValue = dataField?.value ?? schemaField.props.default; let newValue = $state(originalValue); @@ -26,7 +27,7 @@ let suggestionsLoaded = $state(false); let suggestions = $state([]); - let selectedRecordIds = $state([]); + let selectedFilesIds = $state([]); let dialog = $state(); function handleModalOpen(e) { @@ -35,10 +36,10 @@ if (suggestionsLoaded) { return; } - // get(app.url("records/files"), { recordId: record.id }, (data, err) => { - suggestionsLoaded = true; - // suggestions = data; - // }); + get(app.url("records/files"), { recordId: record.id }, (data, err) => { + suggestionsLoaded = true; + suggestions = data; + }); } function handleModalClose(e) { @@ -48,9 +49,9 @@ function handleInsertSelected() { suggestionsLoaded = false; post( - app.url("edges/many"), + app.url("records/files"), { - toIds: selectedRecordIds, + toIds: selectedFilesIds, from: record.id, fieldId: schemaField.id, locale: locale, @@ -179,17 +180,13 @@ - {suggestion.title} - - - - {suggestion.schemaName} - + {suggestion.name} + {/each} @@ -201,21 +198,20 @@
- {#if edgeRecordPreviews.length == 0} - No relations exist + {#if filesPreviews.length == 0} + No files exist {:else} - {#snippet itemView(edgeRecordPreview)} + {#snippet itemView(filesPreview)}
- {edgeRecordPreview.recordPreview.title} - {edgeRecordPreview.recordPreview.schemaName} + {filesPreview.file.name}
diff --git a/src/Core/Data/RecordFilePreview.php b/src/Core/Data/RecordFilePreview.php new file mode 100644 index 0000000..bc6679f --- /dev/null +++ b/src/Core/Data/RecordFilePreview.php @@ -0,0 +1,9 @@ +where("id", $file->id) // ->update(FileModule::toDb($file)); // } + // + public static function findShared(): array + { + return DB::table(self::TABLE_NAME) + ->where("is_shared", true) + ->get() + ->map(fn($file) => FileModule::fromDb($file)) + ->toArray(); + } + + public static function findByRecordId(string $recordId): array + { + return DB::table(self::TABLE_NAME) + ->where("record_id", $recordId) + ->get() + ->map(fn($file) => FileModule::fromDb($file)) + ->toArray(); + } public static function delete(string $fileId): void { diff --git a/src/Core/Repository/RecordRepo.php b/src/Core/Repository/RecordRepo.php index c5c9974..42524fd 100644 --- a/src/Core/Repository/RecordRepo.php +++ b/src/Core/Repository/RecordRepo.php @@ -5,6 +5,8 @@ use Lucent\Core\Data\Record; use Lucent\Core\Data\RecordPreview; use Lucent\Core\Data\RecordMode; use Lucent\Core\Data\EdgeRecordPreview; +use Lucent\Core\File\FileModule; +use Lucent\Core\File\RecordFileModule; use Lucent\Core\Record\RecordModule; class RecordRepo @@ -159,4 +161,28 @@ class RecordRepo ) ->toArray(); } + + /** + * @param Schema[] $schemas + * @return RecordFilePreview[] + */ + public static function findRecordFilePreviewsByRecordId( + string $recordId, + ): array { + return DB::table("records_files") + ->select( + "records_files.*", + "files.*", + "files.id as file_id", + "records_files.id as record_file_id", + ) + ->where("records_files.record_id", $recordId) + ->join("files", "records_files.file_id", "=", "files.id") + ->orderBy("records_files.rank", "asc") + ->distinct() + ->get() + + ->map(fn($row) => RecordFileModule::recordFilePreviewFromDb($row)) + ->toArray(); + } } diff --git a/src/Http/Controller/RecordController.php b/src/Http/Controller/RecordController.php index 8b01568..63496a8 100644 --- a/src/Http/Controller/RecordController.php +++ b/src/Http/Controller/RecordController.php @@ -12,6 +12,7 @@ use Lucent\Core\Query\QueryModule; use Lucent\Core\Repository\FieldRepo; use Lucent\Core\Repository\SchemaRepo; use Lucent\Core\Repository\EdgeRepo; +use Lucent\Core\Repository\FileRepo; use Lucent\Core\Repository\RecordFieldRepo; use Lucent\Core\Record\RecordModule; use Lucent\Core\Record\RecordFieldModule; @@ -154,27 +155,6 @@ class RecordController public function edit(Request $request) { $recordId = $request->route("id"); - - // $graph = $this->query - // ->filter(["id" => $rid]) - // ->limit(1) - // ->skip(0) - // ->childrenDepth(2) - // ->childrenLimit(200) - // ->parentsDepth(1) - // ->parentsLimit(200) - // ->run(); - - // if ($graph->records->isEmpty()) { - // return $this->svelte->render( - // layout: "channel", - // view: "recordNotFound", - // title: "Record Not Found", - // ); - // } - - // $record = $graph->records->first(); - // $record = RecordRepo::findOne($recordId); $recordFields = RecordFieldRepo::findByRecordId($recordId); $draftData = collect($recordFields) @@ -213,6 +193,20 @@ class RecordController $recordEdges, ); + $recordFilesPreviews = RecordRepo::findRecordFilePreviewsByRecordId( + $record->id, + ); + + $recordFilesPreviewsDraft = collect($recordFilesPreviews) + ->where("recordFile.mode", RecordMode::DRAFT) + ->values() + ->toArray(); + + $recordFilesPreviewsLive = collect($recordFilesPreviews) + ->where("recordFile.mode", RecordMode::LIVE) + ->values() + ->toArray(); + return Svelte::view( view: "recordEdit", title: "Edit Record", @@ -222,6 +216,8 @@ class RecordController "fields" => $fields, "edgeRecordPreviewsDraft" => toArray($edgeRecordPreviewsDraft), "edgeRecordPreviewsLive" => toArray($edgeRecordPreviewsLive), + "filesPreviewsDraft" => toArray($recordFilesPreviewsDraft), + "filesPreviewsLive" => toArray($recordFilesPreviewsLive), "record" => toArray($record), "draftData" => $draftData, "liveData" => $liveData, @@ -240,6 +236,17 @@ class RecordController return ok(toArray($records)); } + public function files(Request $request) + { + $recordId = $request->input("recordId"); + + $files = empty($recordId) + ? FileRepo::findShared() + : FileRepo::findByRecordId($recordId); + + return ok(toArray($files)); + } + public function postCreate(Request $request) { $schemaId = $request->input("schemaId"); diff --git a/src/Http/web.php b/src/Http/web.php index 1d11325..d38777b 100644 --- a/src/Http/web.php +++ b/src/Http/web.php @@ -70,6 +70,9 @@ Route::group( // CONTENT Route::get("content/{id}", [RecordController::class, "index"]); + // RECORD FILES + Route::get("records/files", [RecordController::class, "files"]); + // RECORD Route::get("records/suggest", [RecordController::class, "suggest"]); Route::get("records/{id}", [RecordController::class, "edit"]);