diff --git a/front/js/common/Icon.svelte b/front/js/common/Icon.svelte new file mode 100644 index 0000000..66000bc --- /dev/null +++ b/front/js/common/Icon.svelte @@ -0,0 +1,160 @@ + + + + {@html selectedIcon.path} + + + diff --git a/front/js/entry/ContentEntry/ContentEntry.svelte b/front/js/entry/ContentEntry/ContentEntry.svelte new file mode 100644 index 0000000..bfaf169 --- /dev/null +++ b/front/js/entry/ContentEntry/ContentEntry.svelte @@ -0,0 +1,128 @@ + + +
+
+

+ {data.schema.name} +

+
+ New Record +
+
+ +
+ +
+
+ +
+ +
diff --git a/front/js/entry/FieldEditEntry/FieldEditEntry.svelte b/front/js/entry/FieldEditEntry/FieldEditEntry.svelte index cfe944a..74749d6 100644 --- a/front/js/entry/FieldEditEntry/FieldEditEntry.svelte +++ b/front/js/entry/FieldEditEntry/FieldEditEntry.svelte @@ -48,6 +48,14 @@ Edit {data.field.type} field {data.field.name} + {#if data.field.alias == "_title"} + {@render titleField()} + {:else} + {@render normalfield()} + {/if} +{/snippet} + +{#snippet normalfield()}
+
{#if data.field.type === "text"} @@ -88,3 +104,20 @@ {/snippet} {/snippet} + +{#snippet titleField()} + +
+ +
+ + +
+{/snippet} diff --git a/front/js/entry/SetupEntry/SetupEntry.svelte b/front/js/entry/SetupEntry/SetupEntry.svelte new file mode 100644 index 0000000..c2f00c3 --- /dev/null +++ b/front/js/entry/SetupEntry/SetupEntry.svelte @@ -0,0 +1,20 @@ + + + +{#snippet body()} +
+ {#each data.steps as step} + + {/each} + +
+ {#if data.allSuccess} + Create the first user + {/if} +
+
+{/snippet} diff --git a/front/js/svelte/setup/Step.svelte b/front/js/entry/SetupEntry/Step.svelte similarity index 67% rename from front/js/svelte/setup/Step.svelte rename to front/js/entry/SetupEntry/Step.svelte index 955fb7e..9068eed 100644 --- a/front/js/svelte/setup/Step.svelte +++ b/front/js/entry/SetupEntry/Step.svelte @@ -1,42 +1,36 @@ -
-
- {#if step.status === "success"} - - {:else} - - {/if} -
-

{step.name}

- Instuctions + + {#if step.status === "success"} + {step.name} + {:else} + {step.name} + {/if} + {step.instructions}
- -
\ No newline at end of file + diff --git a/front/js/main.js b/front/js/main.js index 02733a5..b33cbca 100644 --- a/front/js/main.js +++ b/front/js/main.js @@ -6,11 +6,11 @@ import Register from "./svelte/account/Register.svelte"; import LoginEntry from "./entry/LoginEntry/LoginEntry.svelte"; import VerifyEntry from "./entry/VerifyEntry/VerifyEntry.svelte"; import Profile from "./svelte/account/Profile.svelte"; -import SetupIndex from "./svelte/setup/Index.svelte"; +import SetupEntry from "./entry/SetupEntry/SetupEntry.svelte"; import Members from "./svelte/members/Members.svelte"; import RecordNotFound from "./svelte/records/NotFound.svelte"; import RecordEdit from "./svelte/records/Edit.svelte"; -import ContentIndex from "./svelte/content/Index.svelte"; +import ContentEntry from "./entry/ContentEntry/ContentEntry.svelte"; import HomeEntry from "./entry/HomeEntry/HomeEntry.svelte"; import SchemaEntry from "./entry/SchemaEntry/SchemaEntry.svelte"; import FieldCreateEntry from "./entry/FieldCreateEntry/FieldCreateEntry.svelte"; @@ -23,14 +23,14 @@ const entryComponents = { members: Members, recordEdit: RecordEdit, recordNotFound: RecordNotFound, - contentIndex: ContentIndex, + contentIndex: ContentEntry, homeIndex: HomeEntry, buildReport: BuildReport, register: Register, login: LoginEntry, verify: VerifyEntry, profile: Profile, - setup: SetupIndex, + setup: SetupEntry, schemas: SchemaEntry, fieldCreate: FieldCreateEntry, fieldEdit: FieldEditEntry, diff --git a/front/js/modules/remote.js b/front/js/modules/remote.js index fbb4f8f..5517ab3 100644 --- a/front/js/modules/remote.js +++ b/front/js/modules/remote.js @@ -34,7 +34,7 @@ export function post(url, postData, callback) { // Turbo.visit(link(res.data.redirect)); return; } - const errors = makeErrors(res.data.errors); + const errors = makeErrors(res.data?.errors ?? []); if (errors.isNotEmpty()) { callback?.(null, errors); } else { diff --git a/front/js/svelte/autocomplete/Autocomplete.svelte b/front/js/svelte/autocomplete/Autocomplete.svelte index 57f0669..da12505 100644 --- a/front/js/svelte/autocomplete/Autocomplete.svelte +++ b/front/js/svelte/autocomplete/Autocomplete.svelte @@ -1,52 +1,44 @@ -
- +
{#if value} -
+
{#if Array.isArray(field.selectOptions)} {value} {:else} {field.selectOptions[value]} {/if} -
-{/if} \ No newline at end of file +{/if} diff --git a/front/js/svelte/common/Icon.svelte b/front/js/svelte/common/Icon.svelte index 66000bc..488fec9 100644 --- a/front/js/svelte/common/Icon.svelte +++ b/front/js/svelte/common/Icon.svelte @@ -56,23 +56,23 @@ path: '', viewBox: "0 0 576 512", }, - "filter": { + filter: { path: '', viewBox: "0 0 512 512", }, - "calendar": { + calendar: { path: '', viewBox: "0 0 448 512", }, - "pencil": { + pencil: { path: '', viewBox: "0 0 512 512", }, - "database": { + database: { path: '', viewBox: "0 0 448 512", }, - "dice": { + dice: { path: '', viewBox: "0 0 640 512", }, @@ -81,7 +81,7 @@ path: '', viewBox: "0 0 512 512", }, - "eye": { + eye: { path: '', viewBox: "0 0 576 512", }, @@ -93,19 +93,19 @@ path: '', viewBox: "0 0 512 512", }, - "expand": { + expand: { path: '', viewBox: "0 0 448 512", }, - "compress": { + compress: { path: '', viewBox: "0 0 448 512", }, - "check": { + check: { path: '', viewBox: "0 0 448 512", }, - "close": { + close: { path: '', viewBox: "0 0 24 24", }, @@ -113,7 +113,7 @@ path: '', viewBox: "0 0 24 24", }, - "list": { + list: { path: '', viewBox: "0 0 24 24", }, @@ -121,13 +121,12 @@ path: '', viewBox: "0 0 24 24", }, - "italic": { + italic: { path: '', viewBox: "0 0 24 24", - } + }, }; - export let width = 16; export let height = 16; export let icon = ""; @@ -138,16 +137,15 @@ {@html selectedIcon.path} @@ -155,6 +153,5 @@ diff --git a/front/js/svelte/content/tools/AppliedFilterNotLinked.svelte b/front/js/svelte/content/tools/AppliedFilterNotLinked.svelte index 880cd70..3f150ea 100644 --- a/front/js/svelte/content/tools/AppliedFilterNotLinked.svelte +++ b/front/js/svelte/content/tools/AppliedFilterNotLinked.svelte @@ -1,15 +1,14 @@ -{#if url.searchParams.get("notlinked")} - +{#if url.searchParams.get("notlinked")} + Not linked - -{/if} \ No newline at end of file + on:click|preventDefault={() => removeFilter()} + type="button" + class="button-text" + aria-label="Close" + > + +{/if} diff --git a/front/js/svelte/content/tools/SortFields.svelte b/front/js/svelte/content/tools/SortFields.svelte index be3dd3c..6a5a70f 100644 --- a/front/js/svelte/content/tools/SortFields.svelte +++ b/front/js/svelte/content/tools/SortFields.svelte @@ -1,6 +1,6 @@ -
{#if sortParam.startsWith("-")} - + {:else} - + {/if} {sortField.label}
- {#each sortableFields as field} - - {/each} - - {#each systemFieldsFiltered as field} - + {/each} + + {#each systemFieldsFiltered as field} + - {/each} + > + {field.label} + +
+ {/each}
diff --git a/front/js/svelte/content/tools/Tools.svelte b/front/js/svelte/content/tools/Tools.svelte index b672267..46fdc75 100644 --- a/front/js/svelte/content/tools/Tools.svelte +++ b/front/js/svelte/content/tools/Tools.svelte @@ -1,10 +1,10 @@ + {#if data.schema}
{#if selectedRecords.length > 0} - - {selectedRecords.length} records selected - + + {selectedRecords.length} records selected + {/if} @@ -96,6 +93,5 @@
- {/if} -
\ No newline at end of file + diff --git a/front/js/svelte/dialog/DialogRecord.svelte b/front/js/svelte/dialog/DialogRecord.svelte index 1e5000b..7ff769d 100644 --- a/front/js/svelte/dialog/DialogRecord.svelte +++ b/front/js/svelte/dialog/DialogRecord.svelte @@ -1,6 +1,5 @@ +
- +
- -
\ No newline at end of file + diff --git a/front/js/svelte/files/Preview.svelte b/front/js/svelte/files/Preview.svelte index 752f878..ce4e013 100644 --- a/front/js/svelte/files/Preview.svelte +++ b/front/js/svelte/files/Preview.svelte @@ -1,7 +1,7 @@ +
{#if record} - {#if record._file.mime.startsWith("image")} {record._file.path} {:else} - + .{record._file.path.split(".").pop().toLowerCase()}.{record._file.path.split(".").pop().toLowerCase()} {/if} {/if} {#if showFilename} {record._file.path} + href="{channel.lucentUrl}/records/{record.id}" + title={record._file.path} + class="preview-file-filename lx-small-text text-decoration-none" + >{record._file.path} + {/if}
\ No newline at end of file + diff --git a/front/js/svelte/records/Info.svelte b/front/js/svelte/records/Info.svelte index 00feea0..a618636 100644 --- a/front/js/svelte/records/Info.svelte +++ b/front/js/svelte/records/Info.svelte @@ -2,7 +2,7 @@ import { friendlyDate } from "../../helpers"; import Avatar from "../../common/Avatar.svelte"; import { usernameById } from "../account/users"; - import Icon from "../common/Icon.svelte"; + import Icon from "../../common/Icon.svelte"; import RevisionCell from "./revisions/RevisionCell.svelte"; import { getContext } from "svelte"; import RevisionEdgeRow from "./revisions/RevisionEdgeRow.svelte"; diff --git a/front/js/svelte/records/elements/ReferenceInlineButtons.svelte b/front/js/svelte/records/elements/ReferenceInlineButtons.svelte index 1240402..72b6c79 100644 --- a/front/js/svelte/records/elements/ReferenceInlineButtons.svelte +++ b/front/js/svelte/records/elements/ReferenceInlineButtons.svelte @@ -1,6 +1,6 @@ {#if schemas.length > 1} -
+
New
{#each schemas as schema} {/each} -
-
+
{#each schemas as schema} {/each} -
{:else}
openBrowseModal(e, schemas[0].name)} > + +
{/if} {#if inLineCreateRecord} (inLineCreateRecord = null)} - on:inlinesaved={save} + {...inLineCreateRecord} + isCreateMode={true} + on:cancel={(e) => (inLineCreateRecord = null)} + on:inlinesaved={save} /> - {/if} - + diff --git a/front/js/svelte/records/elements/ReferenceTags.svelte b/front/js/svelte/records/elements/ReferenceTags.svelte index 39d56d0..bb4b072 100644 --- a/front/js/svelte/records/elements/ReferenceTags.svelte +++ b/front/js/svelte/records/elements/ReferenceTags.svelte @@ -3,7 +3,7 @@ import { previewTitle } from "../Preview"; import { getErrorMessage } from "./errorMessage"; import { insertEdges } from "./reference.js"; - import Icon from "../../common/Icon.svelte"; + import Icon from "../../../common/Icon.svelte"; const channel = getContext("channel"); export let field; diff --git a/front/js/svelte/records/elements/UUID.svelte b/front/js/svelte/records/elements/UUID.svelte index 2c29d21..2f84be8 100644 --- a/front/js/svelte/records/elements/UUID.svelte +++ b/front/js/svelte/records/elements/UUID.svelte @@ -1,6 +1,6 @@ - -
{#if !isCreateMode} - +
- +
Create newCreate new {#if !isCreateMode} Clone {/if} - (activeContentTab = "_info")} - class="dropdown-item" - href="{channel.lucentUrl}">Revisions (activeContentTab = "_info")} + class="dropdown-item" + href={channel.lucentUrl}>Revisions
{/if} - -
\ No newline at end of file + +
diff --git a/front/js/svelte/records/previews/PreviewFile.svelte b/front/js/svelte/records/previews/PreviewFile.svelte index 2272493..cc4fedc 100644 --- a/front/js/svelte/records/previews/PreviewFile.svelte +++ b/front/js/svelte/records/previews/PreviewFile.svelte @@ -1,10 +1,10 @@
- +
{cardTitle} from {schema.label} {#if record.status === "draft"} - + {/if} -
-
-
+
{#if hasInsert}
- +
- + {#each imagePresets as preset} - + {/each}
-
{/if} {#if hasDelete}
-
{/if}
- diff --git a/front/js/svelte/records/previews/PreviewReference.svelte b/front/js/svelte/records/previews/PreviewReference.svelte index 12845cc..b3e38a5 100644 --- a/front/js/svelte/records/previews/PreviewReference.svelte +++ b/front/js/svelte/records/previews/PreviewReference.svelte @@ -1,8 +1,8 @@ -
- {#if cardImageRecord}
- +
{/if}
{cardTitle} from {schema.label} {#if record.status === "draft"} - + {/if} -
-
{#if hasDelete}
-
{/if}
- diff --git a/front/js/svelte/setup/Index.svelte b/front/js/svelte/setup/Index.svelte deleted file mode 100644 index 0c8a37f..0000000 --- a/front/js/svelte/setup/Index.svelte +++ /dev/null @@ -1,20 +0,0 @@ - -
- - {#each steps as step} - - {/each} - -
- {#if allSuccess} - Create the first user - {/if} -
-
\ No newline at end of file diff --git a/src/Core/Auth/AuthModule.php b/src/Core/Auth/AuthModule.php index c346427..e0137f6 100644 --- a/src/Core/Auth/AuthModule.php +++ b/src/Core/Auth/AuthModule.php @@ -1,6 +1,8 @@ get()->isRemoved()) { + // throw new LucentException("Your account is not active"); + // } + + Session::put(["user" => toArray($user)]); + } } diff --git a/src/Core/Channel/ChannelModule.php b/src/Core/Channel/ChannelModule.php index 7ce5473..2ba9339 100644 --- a/src/Core/Channel/ChannelModule.php +++ b/src/Core/Channel/ChannelModule.php @@ -7,6 +7,11 @@ class ChannelModule public static function get(): Channel { $appUrl = rtrim(config("lucent.url") ?? "", "/"); - return new Channel(url: $appUrl, lucentUrl: $appUrl . "/lucent"); + return new Channel( + name: config("lucent.name"), + locales: config("lucent.locales") ?? [], + url: $appUrl, + lucentUrl: $appUrl . "/lucent", + ); } } diff --git a/src/Core/Data/Channel.php b/src/Core/Data/Channel.php index 6a02905..bd3a95b 100644 --- a/src/Core/Data/Channel.php +++ b/src/Core/Data/Channel.php @@ -2,5 +2,10 @@ class Channel { - public function __construct(public string $url, public string $lucentUrl) {} + public function __construct( + public string $name, + public array $locales, + public string $url, + public string $lucentUrl, + ) {} } diff --git a/src/Core/Data/Record.php b/src/Core/Data/Record.php new file mode 100644 index 0000000..6161580 --- /dev/null +++ b/src/Core/Data/Record.php @@ -0,0 +1,23 @@ + $roles + */ + function __construct( + public string $id, + public string $name, + public string $email, + ) {} +} diff --git a/src/Core/Record/RecordModule.php b/src/Core/Record/RecordModule.php new file mode 100644 index 0000000..8f5a13b --- /dev/null +++ b/src/Core/Record/RecordModule.php @@ -0,0 +1,84 @@ + $record->id, + "schema_id" => $record->schemaId, + "draft_data" => json_encode( + array_map(static::recordFieldToDb(...), $record->draftData), + ), + "live_data" => json_encode( + array_map(static::recordFieldToDb(...), $record->liveData), + ), + "created_at" => $record->createdAt->toJSON(), + "created_by" => $record->createdBy, + "published_at" => empty($record->publishedAt) + ? null + : record->publishedAt->toJSON(), + "published_by" => $record->publishedBy, + "trashed_at" => empty($record->trashedAt) + ? null + : record->trashedAt->toJSON(), + "trashed_by" => $record->trashedBy, + ]; + } + + public static function fromDb(stdClass $data): Record + { + $draftDataArr = json_decode(data_get($data, "draft_data"), true); + $liveDataArr = json_decode(data_get($data, "live_data"), true); + + return new Record( + id: data_get($data, "id"), + schemaId: data_get($data, "schema_id"), + draftData: array_map(static::recordFieldFromDb(...), $draftDataArr), + liveData: array_map(static::recordFieldFromDb(...), $liveDataArr), + createdAt: Carbon::parse(data_get($data, "created_at")), + createdBy: data_get($data, "created_by"), + publishedAt: empty(data_get($data, "published_at")) + ? null + : Carbon::parse(data_get($data, "published_at")), + publishedBy: data_get($data, "published_by"), + trashedAt: empty(data_get($data, "trashed_at")) + ? null + : Carbon::parse(data_get($data, "trashed_at")), + trashedBy: data_get($data, "trashed_by"), + ); + } + + public static function recordFieldFromDb(array $field): RecordField + { + return new RecordField( + id: data_get($field, "id"), + locale: data_get($field, "locale", []), + value: data_get($field, "value"), + createdAt: Carbon::parse(data_get($field, "created_at")), + createdBy: data_get($field, "created_by"), + updatedAt: Carbon::parse(data_get($field, "updated_at")), + updatedBy: data_get($field, "updated_by"), + version: data_get($field, "version"), + ); + } + + public static function recordFieldToDb(RecordField $field): array + { + return [ + "id" => $field->id, + "locale" => $field->locale, + "value" => $field->value, + "created_at" => $field->createdAt->toJSON(), + "created_by" => $field->createdBy, + "updated_at" => $field->updatedAt->toJSON(), + "updated_by" => $field->updatedBy, + "version" => $field->version, + ]; + } +} diff --git a/src/Core/Repository/FieldRepo.php b/src/Core/Repository/FieldRepo.php index a2cbdbc..6351de0 100644 --- a/src/Core/Repository/FieldRepo.php +++ b/src/Core/Repository/FieldRepo.php @@ -3,7 +3,6 @@ use Illuminate\Support\Facades\DB; use Lucent\Core\Schema\Data\Field; use Lucent\Core\Schema\FieldModule; -use Lucent\Core\Schema\SchemaModule; class FieldRepo { diff --git a/src/Core/Repository/RecordRepo.php b/src/Core/Repository/RecordRepo.php new file mode 100644 index 0000000..26a910d --- /dev/null +++ b/src/Core/Repository/RecordRepo.php @@ -0,0 +1,15 @@ +insert(RecordModule::toDb($record)); + } +} diff --git a/src/Core/Repository/UserRepo.php b/src/Core/Repository/UserRepo.php new file mode 100644 index 0000000..b74a653 --- /dev/null +++ b/src/Core/Repository/UserRepo.php @@ -0,0 +1,19 @@ +where("id", $id) + ->get() + ->map(UserModule::fromDb(...)) + ->first(); + } +} diff --git a/src/Core/Schema/Data/Field.php b/src/Core/Schema/Data/Field.php index 33012b9..2dc9411 100644 --- a/src/Core/Schema/Data/Field.php +++ b/src/Core/Schema/Data/Field.php @@ -10,6 +10,7 @@ class Field public string $name, public string $type, public string $schemaId, + public bool $translatable, public int $rank, public IFieldProp $props, ) {} diff --git a/src/Core/Schema/FieldModule.php b/src/Core/Schema/FieldModule.php index 8e72090..88439cc 100644 --- a/src/Core/Schema/FieldModule.php +++ b/src/Core/Schema/FieldModule.php @@ -24,6 +24,7 @@ class FieldModule "name" => $field->name, "type" => $field->type, "rank" => $field->rank, + "translatable" => $field->translatable, "props" => json_encode($field->props), "schema_id" => $field->schemaId, ]; @@ -38,6 +39,7 @@ class FieldModule type: data_get($data, "type"), schemaId: data_get($data, "schema_id"), rank: data_get($data, "rank"), + translatable: data_get($data, "translatable"), props: FieldProp::fromDb( data_get($data, "type"), data_get($data, "props"), diff --git a/src/Core/User/UserModule.php b/src/Core/User/UserModule.php new file mode 100644 index 0000000..ac35e11 --- /dev/null +++ b/src/Core/User/UserModule.php @@ -0,0 +1,16 @@ +last()->rank + 1; + if ($alias === "_title") { + return response()->json(["errors" => "System Reserved alias"], 422); + } + $validator = Validator::make($request->all(), [ "name" => "required|string|max:30|min:2", "alias" => "required|alpha_dash:ascii|max:30|min:2", @@ -74,6 +78,7 @@ class FieldController type: $fieldType, props: $fieldProps, rank: $newRank, + translatable: false, ); FieldRepo::insert($field); @@ -132,6 +137,7 @@ class FieldController schemaId: $field->schemaId, name: data_get($fieldData, "name"), alias: data_get($fieldData, "alias"), + translatable: data_get($fieldData, "translatable"), type: $field->type, rank: $field->rank, props: $fieldProps, diff --git a/src/Http/Controller/RecordController.php b/src/Http/Controller/RecordController.php index 25c0c5b..a277f28 100644 --- a/src/Http/Controller/RecordController.php +++ b/src/Http/Controller/RecordController.php @@ -2,24 +2,28 @@ namespace Lucent\Http\Controller; -use App\Http\Controllers\Controller; +use Carbon\Carbon; use Illuminate\Http\Request; use Lucent\Account\AccountService; use Lucent\Channel\ChannelService; +use Lucent\Core\Auth\AuthModule; +use Lucent\Core\Data\RecordField; +use Lucent\Core\Repository\SchemaRepo; +use Lucent\Id\Id; use Lucent\LucentException; use Lucent\Query\Operator\OperatorRegistry; use Lucent\Query\Query; use Lucent\Record\InputData\EdgeInputData; use Lucent\Record\InputData\RecordInputData; use Lucent\Record\Manager; -use Lucent\Record\QueryRecord; +use Lucent\Core\Repository\RecordRepo; use Lucent\Record\RecordService; use Lucent\Record\Status; -use Lucent\Schema\System; use Lucent\Schema\Ui\Reference; use Lucent\Schema\Validator\ValidatorException; use Lucent\Svelte\Svelte; use Lucent\ViewModel\ViewModel; +use Lucent\Core\Data\Record; use function Lucent\Response\fail; use function Lucent\Response\ok; @@ -38,90 +42,84 @@ class RecordController public function index(Request $request) { - $schemaName = $request->route("schemaName"); + $schemaId = $request->route("id"); + $schemas = SchemaRepo::all(); + $schema = collect($schemas)->firstWhere("id", $schemaId); + // $users = $this->accountService->all(); + $users = []; + // $schema = $this->channelService->getSchema($schemaName)->get(); + // $urlParams = $request->all(); + // $sort = data_get($urlParams, "sort") ?? $schema->sortBy; + // $filter = data_get($urlParams, "filter") ?? []; - if ( - !in_array( - $schemaName, - $this->accountService->currentReadableSchemas(), - ) - ) { - return Svelte::view("recordNotFound", "Schema Not Found", []); - } + // $arguments = array_merge( + // [ + // "schema" => $schema->name, + // "status_in" => "draft,published", + // ], + // $filter, + // ); - $users = $this->accountService->all(); - $schema = $this->channelService->getSchema($schemaName)->get(); - $urlParams = $request->all(); - $sort = data_get($urlParams, "sort") ?? $schema->sortBy; - $filter = data_get($urlParams, "filter") ?? []; - - $arguments = array_merge( - [ - "schema" => $schema->name, - "status_in" => "draft,published", - ], - $filter, - ); - - $skip = data_get($urlParams, "skip") ?? 0; + // $skip = data_get($urlParams, "skip") ?? 0; + $skip = 0; $limit = 30; $records = []; - $graphArray = null; + // $graphArray = null; - $graph = $this->query - ->filter($arguments) - ->notLinked($request->input("notlinked") ?? "") - ->limit($limit) - ->status(explode(",", $arguments["status_in"])) - ->skip($skip) - ->sort($sort) - ->childrenFields($schema?->visible ?? []) - ->childrenDepth(1) - ->parentsDepth(0) - ->runWithCount(); + // $graph = $this->query + // ->filter($arguments) + // ->notLinked($request->input("notlinked") ?? "") + // ->limit($limit) + // ->status(explode(",", $arguments["status_in"])) + // ->skip($skip) + // ->sort($sort) + // ->childrenFields($schema?->visible ?? []) + // ->childrenDepth(1) + // ->parentsDepth(0) + // ->runWithCount(); - $records = $graph->getRootRecords()->toArray(); + // $records = $graph->getRootRecords()->toArray(); $data = [ - "schemas" => $this->channelService->channel->schemas, + "schemas" => $schemas, "schema" => $schema, "users" => $users, "records" => $records, - "graph" => toArray($graph), - "systemFields" => array_values(System::list()), - "operators" => $this->operatorRegistry->all(), - "sortParam" => $sort, - "sortField" => $schema->fields - ->merge(array_values(System::list())) - ->firstWhere( - fn($field) => $field->name === $sort || - "-" . $field->name === $sort || - "data." . $field->name === $sort || - "-data." . $field->name === $sort, - ), - "limit" => $limit, - "skip" => $skip, - "total" => $graph->total ?? 0, - "filter" => $request->input("filter") ?? [], - "inModal" => true, - "isWritable" => in_array( - $schemaName, - $this->accountService->currentWritableSchemas(), - ), + // "graph" => toArray($graph), + // "systemFields" => array_values(System::list()), + // "operators" => $this->operatorRegistry->all(), + // "sortParam" => $sort, + // "sortField" => $schema->fields + // ->merge(array_values(System::list())) + // ->firstWhere( + // fn($field) => $field->name === $sort || + // "-" . $field->name === $sort || + // "data." . $field->name === $sort || + // "-data." . $field->name === $sort, + // ), + // "limit" => $limit, + // "skip" => $skip, + // "total" => $graph->total ?? 0, + // "filter" => $request->input("filter") ?? [], + // "inModal" => true, + // "isWritable" => in_array( + // $schemaName, + // $this->accountService->currentWritableSchemas(), + // ), ]; - if ($request->ajax()) { - $data["modalUrl"] = $request->fullUrl(); - if (str_starts_with(config("lucent.url"), "https")) { - $data["modalUrl"] = str_replace( - "http://", - "https://", - $request->fullUrl(), - ); - } - return $data; - } - $data["inModal"] = false; + // if ($request->ajax()) { + // $data["modalUrl"] = $request->fullUrl(); + // if (str_starts_with(config("lucent.url"), "https")) { + // $data["modalUrl"] = str_replace( + // "http://", + // "https://", + // $request->fullUrl(), + // ); + // } + // return $data; + // } + // $data["inModal"] = false; return Svelte::view( view: "contentIndex", title: "Records", @@ -219,78 +217,6 @@ class RecordController }, []); } - public function new(Request $request) - { - if ( - !in_array( - $request->input("schema"), - $this->accountService->currentWritableSchemas(), - ) - ) { - return $this->svelte->render( - layout: "channel", - view: "recordNotFound", - title: "Schema Not Found", - ); - } - - $schema = $this->channelService->channel->schemas - ->where("name", $request->input("schema")) - ->first(); - $recordHistory = $this->recordManager - ->fromSession($request->session()) - ->getRecords(); - $record = $this->recordService->createEmpty($schema); - $queryRecord = QueryRecord::fromRecord($record); - return $this->svelte->render( - layout: "channel", - view: "recordEdit", - title: "New Record", - data: [ - "schema" => $schema, - "record" => $queryRecord, - "recordHistory" => $recordHistory, - "isCreateMode" => true, - "isWritable" => in_array( - $record->schema, - $this->accountService->currentWritableSchemas(), - ), - ], - ); - } - - public function newInline(Request $request) - { - if ( - !in_array( - $request->input("schema"), - $this->accountService->currentWritableSchemas(), - ) - ) { - return $this->svelte->render( - layout: "channel", - view: "recordNotFound", - title: "Schema Not Found", - ); - } - - $schema = $this->channelService - ->getSchema($request->input("schema")) - ->get(); - $record = $this->recordService->createEmpty($schema); - $queryRecord = QueryRecord::fromRecord($record); - - return [ - "schema" => $schema, - "record" => $queryRecord, - "isCreateMode" => true, - "isWritable" => in_array( - $record->schema, - $this->accountService->currentWritableSchemas(), - ), - ]; - } - public function edit(Request $request) { $rid = $request->route("rid"); @@ -381,6 +307,41 @@ class RecordController return ok($records->toArray()); } + public function postCreate(Request $request) + { + $schemaId = $request->input("schemaId"); + $title = $request->input("title"); + $now = Carbon::now(); + $userId = AuthModule::getCurrentUserId(); + + $titleField = new RecordField( + id: "_title", + locale: "main", + value: $title, + createdAt: $now, + createdBy: $userId, + updatedAt: $now, + updatedBy: $userId, + version: 1, + ); + + $record = new Record( + id: Id::new(), + schemaId: $schemaId, + draftData: [$titleField], + liveData: [], + createdAt: $now, + createdBy: $userId, + publishedAt: null, + publishedBy: null, + trashedAt: null, + trashedBy: null, + ); + + RecordRepo::insert($record); + return ok(toArray($record)); + } + public function save(Request $request) { $recordId = $request->input("record.id"); diff --git a/src/Http/Controller/SchemaController.php b/src/Http/Controller/SchemaController.php index d7bdff9..99c19d7 100644 --- a/src/Http/Controller/SchemaController.php +++ b/src/Http/Controller/SchemaController.php @@ -5,6 +5,9 @@ namespace Lucent\Http\Controller; use Illuminate\Http\Request; use Lucent\Core\Repository\SchemaRepo; use Lucent\Core\Repository\FieldRepo; +use Lucent\Core\Schema\Data\Field; +use Lucent\Core\Schema\Data\FieldProp\FieldProp; +use Lucent\Core\Schema\Data\FieldProp\TextFieldProp; use Lucent\Core\Schema\Data\Schema; use Lucent\Id\Id; use Lucent\Svelte\Svelte; @@ -45,6 +48,25 @@ class SchemaController ); SchemaRepo::insert($schema); + $field = new Field( + id: Id::new(), + schemaId: $schema->id, + name: "Title", + alias: "_title", + type: "text", + props: new TextFieldProp( + required: true, + readonly: false, + hidden: false, + default: "", + min: 1, + max: 255, + help: "", + ), + rank: 0, + translatable: false, + ); + FieldRepo::insert($field); return response()->json( ["message" => "Schema created successfully"], diff --git a/src/Http/Controller/SetupController.php b/src/Http/Controller/SetupController.php index 84de0ff..78de94d 100644 --- a/src/Http/Controller/SetupController.php +++ b/src/Http/Controller/SetupController.php @@ -41,6 +41,7 @@ class SetupController ]), [], ); + $allSuccess = array_reduce( $steps, fn(bool $carry, SetupStep $step) => !$carry @@ -57,7 +58,7 @@ class SetupController } } - return $this->svelte->render( + return Svelte::view( view: "setup", title: "Setup Lucent", data: [ diff --git a/src/Http/Middleware/AuthMiddleware.php b/src/Http/Middleware/AuthMiddleware.php index a274b37..4177e89 100644 --- a/src/Http/Middleware/AuthMiddleware.php +++ b/src/Http/Middleware/AuthMiddleware.php @@ -8,6 +8,8 @@ use Illuminate\Support\Facades\View; use Lucent\Account\AccountService; use Lucent\Account\AuthService; use Lucent\Channel\ChannelService; +use Lucent\Core\Auth\AuthModule; +use Lucent\Core\Channel\ChannelModule; use Lucent\ViewModel\ViewModel; readonly class AuthMiddleware @@ -16,21 +18,15 @@ readonly class AuthMiddleware private AuthService $authService, private AccountService $accountService, private ChannelService $channelService, - private ViewModel $viewModel - ) - { - } + private ViewModel $viewModel, + ) {} public function handle(Request $request, Closure $next) { - if (!$this->authService->isLoggedIn()) { - return redirect($this->channelService->channel->lucentUrl . "/login"); + if (!AuthModule::isLoggedIn()) { + return redirect(ChannelModule::get()->lucentUrl . "/login"); } - $this->authService->refreshSession(); - View::share("channel",$this->channelService->channel); - View::share("user",session("user")); - View::share("schemas",$this->channelService->channel->schemas->whereIn("name",$this->accountService->currentReadableSchemas())->values()); - View::share("viewModel",$this->viewModel); + AuthModule::refreshSession(); return $next($request); } diff --git a/src/Http/web.php b/src/Http/web.php index 3a5879d..779eb36 100644 --- a/src/Http/web.php +++ b/src/Http/web.php @@ -67,10 +67,11 @@ Route::group( ]); // CONTENT - Route::get("content/{schemaName}", [ - RecordController::class, - "index", - ]); + Route::get("content/{id}", [RecordController::class, "index"]); + + // RECORD + Route::get("records/{id}", [RecordController::class, "edit"]); + Route::post("records", [RecordController::class, "postCreate"]); }); //OLD @@ -124,7 +125,7 @@ Route::group( RecordController::class, "parents", ]); - Route::post("/", [RecordController::class, "save"]); + // Route::post("/", [RecordController::class, "save"]); Route::post("/status/{status}", [ RecordController::class, "status",