diff --git a/config/lucent.php b/config/lucent.php index 83af640..a7e36cb 100644 --- a/config/lucent.php +++ b/config/lucent.php @@ -45,5 +45,15 @@ return [ \Lucent\Schema\Ui\Slug::class, \Lucent\Schema\Ui\Text::class, \Lucent\Schema\Ui\Textarea::class + ], + "renderers" => [ + "row" => [ + "file" => \Lucent\Schema\Renderer\Row\File::class, + "slug" => \Lucent\Schema\Renderer\Row\Text::class, + "text" => \Lucent\Schema\Renderer\Row\Text::class, + "checkbox" => \Lucent\Schema\Renderer\Row\Text::class, + "number" => \Lucent\Schema\Renderer\Row\Text::class, + "rich" => \Lucent\Schema\Renderer\Row\Text::class, + ] ] ]; diff --git a/front/js/main.js b/front/js/main.js index 9210a6b..708db98 100644 --- a/front/js/main.js +++ b/front/js/main.js @@ -6,10 +6,14 @@ import Mustache from "mustache"; import 'htmx.org'; import {dropdown} from "./components/dropdown.js"; import {colorPicker} from "./recordEditor/colorPicker.js"; +import {sortReferences} from "./recordEditor/sortReferences.js"; +import {recordDialog} from "./recordEditor/recordDialog.js"; addEventListener("load", (event) => { dropdown() colorPicker() + sortReferences() + recordDialog() }); Mustache.escape = function (value) { diff --git a/front/js/recordEditor/recordDialog.js b/front/js/recordEditor/recordDialog.js new file mode 100644 index 0000000..02c511d --- /dev/null +++ b/front/js/recordEditor/recordDialog.js @@ -0,0 +1,32 @@ +import axios from "axios"; + +export function recordDialog() { + + document.querySelectorAll("[data-open-modal]").forEach(el => { + const schema = el.dataset.openModal + el.addEventListener("click", e => { + load(schema) + }) + }) +} + + +function load(schema) { + axios + .get("/lucent/content/" + schema) + .then((response) => { + + const dialogWrapperEl = document.createElement("div"); + dialogWrapperEl.innerHTML = response.data; + document.body.appendChild(dialogWrapperEl); + const dialogEl = dialogWrapperEl.querySelector("dialog"); + dialogEl.showModal(); + dialogWrapperEl.querySelector(".close").addEventListener("click", e => dialogEl.close()); + + dialogEl.addEventListener("close", (event) => { + dialogWrapperEl.remove(); + }); + }) + .catch((error) => console.log(error)); +} + diff --git a/front/js/recordEditor/sortReferences.js b/front/js/recordEditor/sortReferences.js new file mode 100644 index 0000000..4802360 --- /dev/null +++ b/front/js/recordEditor/sortReferences.js @@ -0,0 +1,19 @@ +import Sortable from "sortablejs"; +export function sortReferences() { + document.querySelectorAll(".color-picker").forEach(el => { + + let options = { + animation: 150, // ms, animation speed moving items when sorting, `0` — without animation + easing: "cubic-bezier(1, 0, 0, 1)", + direction: 'vertical', + onUpdate: function (/**Event*/ evt) { + // dispatch("update", { + // source: evt.oldIndex, + // target: evt.newIndex, + // }); + } + }; + + Sortable.create(el, options); + }) +} diff --git a/front/js/svelte/content/elements/Rich.svelte b/front/js/svelte/content/elements/Rich.svelte index 15dcfe0..dd9a068 100644 --- a/front/js/svelte/content/elements/Rich.svelte +++ b/front/js/svelte/content/elements/Rich.svelte @@ -11,7 +11,8 @@ /* max-width: 128px; */ max-height: 24px; text-overflow: ellipsis; - /* white-space: nowrap; */ overflow: hidden; + /* white-space: nowrap; */ + } diff --git a/front/sass/_table.scss b/front/sass/_table.scss index d7f1bd4..8cdf57b 100644 --- a/front/sass/_table.scss +++ b/front/sass/_table.scss @@ -55,7 +55,11 @@ border: none; overflow: hidden; - + &.field-ui-number,&.field-ui-slug,&.field-ui-text,&.field-ui-rich,&.field-ui-url{ + max-height: 24px; + text-overflow: ellipsis; + overflow: hidden; + } //img{ // width: 48px; //} diff --git a/front/views/components/avatar.blade.php b/front/views/components/avatar.blade.php index a887a45..e5cff28 100644 --- a/front/views/components/avatar.blade.php +++ b/front/views/components/avatar.blade.php @@ -28,7 +28,7 @@ return strtoupper($segs[0][0]).strtoupper($segs[0][1]); }; - $name = $user["name"]; + $name = (string)data_get($user,"name"); $charIndex = ord($name[1]) + strlen($name); $colorIndex = $charIndex % 19; $bgColor = $colors[$colorIndex]; @@ -39,5 +39,5 @@ title="{{$name}}" style="background-color:{{$bgColor}};height: {{$side}}px;width: {{$side}}px; font-size:{{$side / 2}}px" > -
{{$initials($user["name"])}}
+
{{$initials($name)}}
\ No newline at end of file diff --git a/front/views/components/checkbox.blade.php b/front/views/components/checkbox.blade.php new file mode 100644 index 0000000..cb64c7c --- /dev/null +++ b/front/views/components/checkbox.blade.php @@ -0,0 +1,3 @@ +
+ +
diff --git a/front/views/records-editor/dialog.blade.php b/front/views/records-editor/dialog.blade.php new file mode 100644 index 0000000..ef34a38 --- /dev/null +++ b/front/views/records-editor/dialog.blade.php @@ -0,0 +1,42 @@ + + + + @if($schema) +
+ + + +
+ records selected +
+ + + +
+ +
+ @include("lucent::records.index") +
+ + @endif +
\ No newline at end of file diff --git a/front/views/records-editor/edit.blade.php b/front/views/records-editor/edit.blade.php index 672376e..84163dc 100644 --- a/front/views/records-editor/edit.blade.php +++ b/front/views/records-editor/edit.blade.php @@ -18,5 +18,6 @@ @include("lucent::records-editor.fields", ["field" => $field]) @endforeach + @endsection diff --git a/front/views/records-editor/fields/file.blade.php b/front/views/records-editor/fields/file.blade.php index 2b6f523..3ad9cd8 100644 --- a/front/views/records-editor/fields/file.blade.php +++ b/front/views/records-editor/fields/file.blade.php @@ -1,16 +1,31 @@ @php -$references = $graph->edges -->filter(fn($edge) => $edge->field === $field->name && $edge->source === $record->id) -->map(fn($edge) => $graph->records->firstWhere("id", $edge->target)); + $references = $graph->edges + ->filter(fn($edge) => $edge->field === $field->name && $edge->source === $record->id) + ->map(fn($edge) => $graph->records->firstWhere("id", $edge->target)); + + $collectionSchemas = $schemas->whereIn("name",$field->collections); @endphp -@if ($references->isNotEmpty()) -{{----}} - @foreach($references as $reference) - -
- @include("lucent::records-editor.fields.file.preview") -
- @endforeach - +@if(count($field->collections) === 1) + +@else + + Browse + + @foreach($collectionSchemas as $collectionSchema) + {{$collectionSchema->label}} + @endforeach + + +@endif + +@if ($references->isNotEmpty()) +
+ @foreach($references as $reference) + +
+ @include("lucent::records-editor.fields.file.preview", ["record" => $reference]) +
+ @endforeach +
@endif diff --git a/front/views/records-editor/fields/file/preview.blade.php b/front/views/records-editor/fields/file/preview.blade.php index bbffe92..eceb784 100644 --- a/front/views/records-editor/fields/file/preview.blade.php +++ b/front/views/records-editor/fields/file/preview.blade.php @@ -1,16 +1,17 @@ @php - $schema = $channel->schemas->firstWhere("name",$reference->schema); +$reference = $record; + $schema = $channel->schemas->firstWhere("name",$record->schema); @endphp
- @include("lucent::records-editor.fields.file.thumb", ["size" => "small", "record" => $reference]) + @include("lucent::records-editor.fields.file.thumb", ["size" => "small"])
id}}"> - {{$viewModel->getRecordName($reference)}} + {{$viewModel->getRecordName($record)}} from {{$schema->label}} diff --git a/front/views/records/index.blade.php b/front/views/records/index.blade.php new file mode 100644 index 0000000..ee732ee --- /dev/null +++ b/front/views/records/index.blade.php @@ -0,0 +1,36 @@ + +
+
+

+ {{$schema->label}} +

+{{-- {#if selected.length > 0 && !inModal && isWritable}--}} +{{-- --}} +{{-- {:else}--}} +{{-- --}} +{{-- {/if}--}} + @include("lucent::records.table") +
+ +{{-- --}} +
diff --git a/front/views/records/list.blade.php b/front/views/records/list.blade.php new file mode 100644 index 0000000..0ff7e8c --- /dev/null +++ b/front/views/records/list.blade.php @@ -0,0 +1,7 @@ +@extends("lucent::layouts.channel") + +@section("content") + @include("lucent::records.index") + +@endsection + diff --git a/front/views/records/row.blade.php b/front/views/records/row.blade.php new file mode 100644 index 0000000..b6e044f --- /dev/null +++ b/front/views/records/row.blade.php @@ -0,0 +1,14 @@ +@foreach($schema->visible as $visibleColumn) + @php + $schemaField = $schema->fields->firstWhere("name", $visibleColumn); + @endphp + + @if(in_array($visibleColumn ,["_sys.createdBy","_sys.updatedBy"])) + + @elseif($visibleColumn === "_sys.status") + @include("lucent::records-editor.status",[ "status" => $record->status]) + @else + {!! $viewModel->renderRow($record,$schemaField)!!} + @endif + +@endforeach diff --git a/front/views/records/table.blade.php b/front/views/records/table.blade.php new file mode 100644 index 0000000..519cd64 --- /dev/null +++ b/front/views/records/table.blade.php @@ -0,0 +1,91 @@ +@php + + @endphp + +
+ + + + @if($isWritable) + + @endif + @foreach($schema->visible as $visibleColumn) + @php + $schemaField = $schema->fields->firstWhere("name", $visibleColumn); + if(empty($schemaField)){ + $schemaField = collect($systemFields)->firstWhere("name", str_replace("_sys.", "",$visibleColumn) ); + } + @endphp + + @endforeach + + + + + @foreach($records as $record) + + + @include("lucent::records.row") + + + @endforeach + +
+ + help ?? ""}} + >{{$schemaField->label}}
+
+ @if($isWritable) + + + @endif + @if($record->_file?->path) +
+ @include("lucent::records-editor.fields.file.thumb", ["size" => "small"]) +
+ @if($record->status === "draft") + {{$record->status}} + @endif + id}}" + target={{$inModal ? "_blank" : "_self"}} + > + {{ $viewModel->getRecordName($record)}} + + {{ (int)($record->_file->size / 1024) }}kB + + @if($record->_file->width > 0) + {{$record->_file->width . "x" . $record->_file->height}} + @endif + + Download + +
+ +
+ @else + id}}" + target={{$inModal ? "_blank" : "_self"}} + > + @if($record->status === "draft") + {{$record->status}} + @endif + {{$viewModel->getRecordName($record)}} + + @endif +
+
+ +
+
diff --git a/src/Http/Controller/RecordController.php b/src/Http/Controller/RecordController.php index b04737a..f02135d 100644 --- a/src/Http/Controller/RecordController.php +++ b/src/Http/Controller/RecordController.php @@ -79,14 +79,15 @@ class RecordController extends Controller ->runWithCount(); - $records = $graph->getRootRecords()->toArray(); + $data = [ "schemas" => $this->channelService->channel->schemas, "schema" => $schema, "users" => $users, - "records" => $records, + "records" => $graph->tree(), "graph" => toArray($graph), + "visibleFields" => array_values(System::list()), "systemFields" => array_values(System::list()), "operators" => $this->operatorRegistry->all(), "sortParam" => $sort, @@ -104,9 +105,10 @@ class RecordController extends Controller if (str_starts_with(config("lucent.url"), "https")) { $data["modalUrl"] = str_replace("http://", "https://", $request->fullUrl()); } - return $data; + return view("lucent::records-editor.dialog", $data)->render(); } $data["inModal"] = false; + return view("lucent::records.list", $data); return $this->svelte->render( layout: "channel", view: "contentIndex", diff --git a/src/Schema/Renderer/Row/File.php b/src/Schema/Renderer/Row/File.php new file mode 100644 index 0000000..4ee95cb --- /dev/null +++ b/src/Schema/Renderer/Row/File.php @@ -0,0 +1,19 @@ +name); + if(!isset($reference[0])){ + return ""; + } + return view("lucent::records-editor.fields.file.thumb",["size" => "tiny", "record" => $reference[0]])->render(); + } +} \ No newline at end of file diff --git a/src/Schema/Renderer/Row/IRowRenderer.php b/src/Schema/Renderer/Row/IRowRenderer.php new file mode 100644 index 0000000..71b5ac1 --- /dev/null +++ b/src/Schema/Renderer/Row/IRowRenderer.php @@ -0,0 +1,11 @@ +name,""); + } +} \ No newline at end of file diff --git a/src/ViewModel/ViewModel.php b/src/ViewModel/ViewModel.php index ee5098f..86629ff 100644 --- a/src/ViewModel/ViewModel.php +++ b/src/ViewModel/ViewModel.php @@ -37,4 +37,11 @@ class ViewModel $m = new Mustache_Engine(array('entity_flags' => ENT_QUOTES)); return $m->render($schema->cardTitle, $record->data); } + + public function renderRow(QueryRecord $record, FieldInterface $field): string + { + $renderers = config("lucent.renderers.row"); + return (new $renderers[$field->info->name])($record, $field); + } + } \ No newline at end of file