From 3f96780514dfd3824426d43270f82d745b5f6200 Mon Sep 17 00:00:00 2001 From: panabonic Date: Mon, 5 Jun 2023 15:08:08 +0300 Subject: [PATCH] many fixes and updates --- .../Controllers/Api/Forms/FormsController.php | 8 +++ .../Api/Objects/ObjectsController.php | 9 +++ .../Controllers/Api/Pages/PagesController.php | 6 +- app/Models/Objects/Field.php | 12 ++-- app/Models/Objects/NirObject.php | 11 +++- app/Models/Objects/Values/DateValue.php | 3 +- app/Models/Objects/Values/DatetimeValue.php | 3 +- app/Models/Objects/Values/DocumentValue.php | 3 +- app/Models/Objects/Values/ImageValue.php | 7 ++- app/Models/Objects/Values/RelationValue.php | 3 +- app/Models/Objects/Values/TimeValue.php | 3 +- app/Models/Objects/Values/Value.php | 3 +- app/Models/Pages/Page.php | 48 ++++++++++----- app/Services/Forms/FormsService.php | 2 + .../Forms/Pages/PageFormsServices.php | 9 +++ app/Support/HasObjectsTrait.php | 59 ++++++++++++++++--- .../Objects/FieldsGroupTransformer.php | 2 +- .../Objects/ObjectPropertyTransformer.php | 2 +- .../Objects/ObjectTransformer.php | 1 + app/Transformers/Pages/PageTransformer.php | 6 +- ...64823_create_field_string_values_table.php | 1 + ...5026_create_field_integer_values_table.php | 1 + ...165156_create_field_float_values_table.php | 1 + ..._165708_create_field_text_values_table.php | 1 + ...5744_create_field_boolean_values_table.php | 1 + ...042_create_field_relation_values_table.php | 1 + ..._185218_create_field_date_values_table.php | 1 + ...18_163715_create_field_datetime_values.php | 1 + ..._09_05_212157_create_objectables_table.php | 1 + ...525_create_field_document_values_table.php | 1 + ..._092500_create_field_time_values_table.php | 1 + ...11_22_204535_create_field_image_values.php | 1 + .../seeders/Objects/FieldsTableSeeder.php | 15 ++--- .../Objects/ObjectTypeFieldsTableSeeder.php | 15 ++--- .../Objects/ObjectTypesTableSeeder.php | 8 +-- routes/api.php | 2 + 36 files changed, 187 insertions(+), 65 deletions(-) create mode 100644 app/Services/Forms/Pages/PageFormsServices.php diff --git a/app/Http/Controllers/Api/Forms/FormsController.php b/app/Http/Controllers/Api/Forms/FormsController.php index dfc0898..5806ef5 100644 --- a/app/Http/Controllers/Api/Forms/FormsController.php +++ b/app/Http/Controllers/Api/Forms/FormsController.php @@ -9,6 +9,7 @@ use App\Services\Filters\FiltersService; use App\Services\Forms\FormsService; use App\Transformers\Objects\ObjectTransformer; use App\Transformers\Objects\ObjectTypeTransformer; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Http\Request; class FormsController extends Controller { @@ -31,10 +32,17 @@ class FormsController extends Controller { } elseif ($objectType = ObjectType::byUuidOrName($type)->first()) { $object = $objectType->objects()->create(); $object->setValues($request->all()); + $this->attachObject($object, $request->get('attach')); return fractal($object->fresh(), new ObjectTransformer()); } } + public function attachObject(NirObject $object, $attach) { + if (($type = $attach['model_type'] ?? null) && ($className = Relation::$morphMap[$type] ?? null) && ($id = $attach['model_id'] ?? null)) { + if ($model = $className::byUuid($id)->first()) $model->attachObject($object, $attach['ord'] ?? null, $attach['group'] ?? null); + } + } + public function filters(Request $request, $type) { $filters = collect(json_decode($request->get('filters', []), true)); diff --git a/app/Http/Controllers/Api/Objects/ObjectsController.php b/app/Http/Controllers/Api/Objects/ObjectsController.php index 4437bdc..14672f0 100644 --- a/app/Http/Controllers/Api/Objects/ObjectsController.php +++ b/app/Http/Controllers/Api/Objects/ObjectsController.php @@ -7,6 +7,7 @@ use App\Models\Objects\Field; use App\Models\Objects\NirObject; use App\Models\Objects\ObjectType; use App\Transformers\Objects\ObjectTransformer; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -56,6 +57,14 @@ class ObjectsController extends Controller { return fractal($model, new ObjectTransformer())->respond(201); } + public function move(Request $request, $id): JsonResponse { + $model = $this->model->byUuid($id)->firstOrFail(); + if (($type = $request->get('model_type')) && ($className = Relation::$morphMap[$type] ?? null) && ($id = $request->get('model_id'))) { + if ($related = $className::byUuid($id)->first()) $related->moveObject($model, $request->get('ord'), $request->get('group')); + } + return fractal($model, new ObjectTransformer())->respond(); + } + public function update(Request $request, $uuid): JsonResponse { $model = $this->model->byUuid($uuid)->firstOrFail(); $this->validate($request, [ diff --git a/app/Http/Controllers/Api/Pages/PagesController.php b/app/Http/Controllers/Api/Pages/PagesController.php index 9b76e7d..9c73633 100644 --- a/app/Http/Controllers/Api/Pages/PagesController.php +++ b/app/Http/Controllers/Api/Pages/PagesController.php @@ -19,13 +19,17 @@ class PagesController extends Controller { return fractal(Page::root(), new PageTransformer())->respond(); } + public function find(Request $request): ?JsonResponse { + return ($page = Page::byUrl($request->get('url'))) ? fractal($page, new PageTransformer())->respond() : null; + } + public function index(Request $request): JsonResponse { $query = $this->model->query(); $paginator = $query->paginate(config('app.pagination_limit')); return fractal($paginator, new PageTransformer())->respond(); } - public function show($id): JsonResponse { + public function show(Request $request, $id): JsonResponse { $model = $this->model->byUuid($id)->firstOrFail(); return fractal($model, new PageTransformer())->respond(); } diff --git a/app/Models/Objects/Field.php b/app/Models/Objects/Field.php index dcd9d2a..1d37bf3 100644 --- a/app/Models/Objects/Field.php +++ b/app/Models/Objects/Field.php @@ -50,7 +50,7 @@ class Field extends Model { } public function objectValues($objectId): HasMany { - return $this->values()->where(['object_id' => $objectId]); + return $this->values()->where(['object_id' => $objectId])->orderBy('ord'); } public function objectsValues(array $ids): HasMany { @@ -121,8 +121,8 @@ class Field extends Model { public function setValue($objectId, $value) { if ($this->multiple) $this->objectValues($objectId)->delete(); if (!($value instanceof Collection)) $value = collect((is_array($value) && !Arr::isAssoc($value)) ? $value : [$value]); - $value->each(function($value) use($objectId) { - if ($this->multiple) $this->values()->create(['object_id' => $objectId])->set($value); + $value->each(function($value, $ord) use($objectId) { + if ($this->multiple) $this->values()->create(['object_id' => $objectId, 'ord' => $ord])->set($value); else $this->values()->firstOrCreate(['object_id' => $objectId])->set($value); }); return $this->getValue($objectId); @@ -130,9 +130,11 @@ class Field extends Model { public function addValue($objectId, $value) { if ($this->multiple) { + $max = $this->objectValues($objectId)->max('ord'); + if (is_null($max)) $max = -1; if (!($value instanceof Collection)) $value = collect((is_array($value) && !Arr::isAssoc($value)) ? $value : [$value]); - $value->each(function($value) use($objectId) { - $this->values()->create(['object_id' => $objectId])->set($value); + $value->each(function($value, $ord) use($objectId, $max) { + $this->values()->create(['object_id' => $objectId, 'ord' => $max + $ord + 1])->set($value); }); } return $this->getValue($objectId); diff --git a/app/Models/Objects/NirObject.php b/app/Models/Objects/NirObject.php index 704ce9e..d661ea6 100644 --- a/app/Models/Objects/NirObject.php +++ b/app/Models/Objects/NirObject.php @@ -47,11 +47,10 @@ class NirObject extends Model { return $this->morphToMany(NirObject::class, 'objectable'); } - public function pollInvitations(): MorphToMany { - return $this->morphedByMany(PollInvitation::class, 'objectable'); + public function objectables($related): MorphToMany { + return $this->morphedByMany($related, 'objectable')->withPivot(['ord', 'group']); } - public function type(): BelongsTo { return $this->belongsTo(ObjectType::class); } @@ -154,6 +153,12 @@ class NirObject extends Model { return $clone; } + public function currentGroup($related) { + return ($res = $this->objectables($related)->first()) ? $res->pivot->group : 'default'; + } + public function currentOrd($related) { + return ($res = $this->objectables($related)->first()) ? $res->pivot->ord : null; + } public function applySearchFilter(Builder $query, $search) { $query->whereHas('stringValues', function($query) use($search) { diff --git a/app/Models/Objects/Values/DateValue.php b/app/Models/Objects/Values/DateValue.php index fd85ec3..090740d 100644 --- a/app/Models/Objects/Values/DateValue.php +++ b/app/Models/Objects/Values/DateValue.php @@ -8,7 +8,8 @@ class DateValue extends Value { protected $table = 'field_date_values'; protected $dates = [ - 'value' + 'value', + 'ord' ]; public function get() { diff --git a/app/Models/Objects/Values/DatetimeValue.php b/app/Models/Objects/Values/DatetimeValue.php index 2857c09..99a192c 100644 --- a/app/Models/Objects/Values/DatetimeValue.php +++ b/app/Models/Objects/Values/DatetimeValue.php @@ -8,7 +8,8 @@ class DatetimeValue extends Value { protected $table = 'field_datetime_values'; protected $dates = [ - 'value' + 'value', + 'ord' ]; public function get() { diff --git a/app/Models/Objects/Values/DocumentValue.php b/app/Models/Objects/Values/DocumentValue.php index f992401..13b0530 100644 --- a/app/Models/Objects/Values/DocumentValue.php +++ b/app/Models/Objects/Values/DocumentValue.php @@ -11,7 +11,8 @@ class DocumentValue extends Value { protected $fillable = [ 'object_id', 'field_id', - 'asset_id' + 'asset_id', + 'ord' ]; public function asset(): BelongsTo { diff --git a/app/Models/Objects/Values/ImageValue.php b/app/Models/Objects/Values/ImageValue.php index fef430e..4676ed7 100644 --- a/app/Models/Objects/Values/ImageValue.php +++ b/app/Models/Objects/Values/ImageValue.php @@ -6,12 +6,13 @@ use App\Models\Asset; use Illuminate\Database\Eloquent\Relations\BelongsTo; class ImageValue extends Value { - protected $table = 'field_document_values'; + protected $table = 'field_image_values'; protected $fillable = [ 'object_id', 'field_id', - 'asset_id' + 'asset_id', + 'ord' ]; public function asset(): BelongsTo { @@ -23,7 +24,7 @@ class ImageValue extends Value { } public function set($value): bool { - if (!is_object($value)) $value = Asset::query()->where(['uuid' => $value])->first(); + if (!is_object($value)) $value = Asset::byUuid($value)->first(); return is_object($value) ? $this->update(['asset_id' => $value->id]) : !$this->delete(); } diff --git a/app/Models/Objects/Values/RelationValue.php b/app/Models/Objects/Values/RelationValue.php index 51f8e8c..2647ed3 100644 --- a/app/Models/Objects/Values/RelationValue.php +++ b/app/Models/Objects/Values/RelationValue.php @@ -12,7 +12,8 @@ class RelationValue extends Value { 'object_id', 'field_id', 'relatable_type', - 'relatable_id' + 'relatable_id', + 'ord' ]; public function relatable(): MorphTo { diff --git a/app/Models/Objects/Values/TimeValue.php b/app/Models/Objects/Values/TimeValue.php index 44f5c9d..35b4129 100644 --- a/app/Models/Objects/Values/TimeValue.php +++ b/app/Models/Objects/Values/TimeValue.php @@ -8,7 +8,8 @@ class TimeValue extends Value { protected $table = 'field_time_values'; protected $dates = [ - 'value' + 'value', + 'ord' ]; public function get() { diff --git a/app/Models/Objects/Values/Value.php b/app/Models/Objects/Values/Value.php index bfedbe2..28ef8f3 100644 --- a/app/Models/Objects/Values/Value.php +++ b/app/Models/Objects/Values/Value.php @@ -14,7 +14,8 @@ abstract class Value extends Model { protected $fillable = [ 'object_id', 'field_id', - 'value' + 'value', + 'ord' ]; protected $hidden = [ diff --git a/app/Models/Pages/Page.php b/app/Models/Pages/Page.php index 26541cc..0143555 100644 --- a/app/Models/Pages/Page.php +++ b/app/Models/Pages/Page.php @@ -39,33 +39,37 @@ class Page extends Model { } public function children(): HasMany { - return $this->hasMany(Page::class, 'parent_id'); + return $this->hasMany(Page::class, 'parent_id')->orderBy('ord'); } public function sections(): MorphToMany { - return $this->objects()->whereHas('type.parent', function($query) { - $query->where(['name' => 'page-section']); - }); + return $this->objects()->wherePivot('group', '=', 'sections'); } - public function sidebar(): Model { - return $this->getObject('page-sidebar'); - } public function sidebars(): MorphToMany { - return $this->objects()->whereHas('type', function($query) { - $query->where(['name' => 'page-sidebar']); + return $this->objects()->wherePivot('group', '=', 'sidebars'); + } + + + public function scopeBySlug($query, $slug) { + $query->where(['slug' => $slug]); + } + + public function scopeNthParentSlug($query, $nth, $slug) { + $query->whereHas(implode('.', array_fill(0, $nth, 'parent')), function($query) use($slug) { + $query->bySlug($slug); }); } public function getLinkAttribute(): string { - return $this->parents->reverse()->push($this)->pluck('slug')->implode('/'); + return '/' . $this->parents->reverse()->push($this)->pluck('slug')->implode('/'); } public function getParentsAttribute(): Collection { $page = $this; $result = collect([]); - while($page = $page->parent) $result->push($page); + while ($page = $page->parent) $result->push($page); return $result; } @@ -75,14 +79,30 @@ class Page extends Model { - public function addSection($typeName, $ord) { - $this->createObject($typeName, $ord); + public function addSection($typeName, $ord = null): ?Model { + return $this->createObject($typeName, $ord, 'sections'); + } + + public function addSidebar($typeName = 'page-sidebar', $ord = null): ?Model { + return $this->createObject($typeName, $ord, 'sidebars'); } + public static function byUrl($url) { + if ($url = trim($url, '/ ')) { + $query = self::query(); + collect(explode('/', $url))->reverse()->values()->each(function ($slug, $index) use ($query) { + if ($slug !== '') { + $index ? $query->nthParentSlug($index, $slug) : $query->bySlug($slug); + } + }); + return $query->first(); + } + return null; + } public static function root() { - return self::query()->where(['parent_id' => 0])->get(); + return self::query()->where(['parent_id' => 0])->orderBy('ord')->get(); } } diff --git a/app/Services/Forms/FormsService.php b/app/Services/Forms/FormsService.php index 50e8fa4..e03717b 100644 --- a/app/Services/Forms/FormsService.php +++ b/app/Services/Forms/FormsService.php @@ -2,12 +2,14 @@ namespace App\Services\Forms; +use App\Services\Forms\Pages\PageFormsServices; use App\Services\Forms\Users\UserFormsServices; class FormsService { public array $formTitles = ['create' => '', 'update' => '']; public static array $services = [ + PageFormsServices::class, UserFormsServices::class ]; diff --git a/app/Services/Forms/Pages/PageFormsServices.php b/app/Services/Forms/Pages/PageFormsServices.php new file mode 100644 index 0000000..ca10d49 --- /dev/null +++ b/app/Services/Forms/Pages/PageFormsServices.php @@ -0,0 +1,9 @@ +morphToMany(NirObject::class, 'objectable')->orderByPivot('ord')->withTimestamps(); + return $this->morphToMany(NirObject::class, 'objectable')->withPivot(['ord', 'group'])->orderByPivot('ord')->withTimestamps(); } + public function objectsByGroup($group = null): MorphToMany { + return $this->objects()->wherePivot('group', '=', $group ?? 'default'); + } + + public function getObjectAttribute() { return $this->objects()->first(); } public function getObject($typeName): ?Model { - return ($type = ObjectType::query()->where(['name' => $typeName])->first()) ? $this->objects()->firstOrCreate(['type_id' => $type->id]) : null; + return ($type = ObjectType::byName($typeName)->first()) ? $this->objects()->firstOrCreate(['type_id' => $type->id]) : null; } - public function createObject($typeName, $ord = null): ?Model { - if (($type = ObjectType::query()->where(['name' => $typeName])->first()) && ($object = NirObject::create(['type_id' => $type->id]))) { - if ($ord !== null) $ord = ($res = $this->objects()->where(['type_id' => $type->id])->withPivot('ord')->reorder()->orderByPivot('ord', 'desc')->first()) ? ($res->pivot->ord + 1) : 0; - $this->objects()->attach($object->id, ['ord' => $ord]); + public function createObject($typeName, $ord = null, $group = null): ?Model { + if (($type = ObjectType::byName($typeName)->first()) && ($object = NirObject::create(['type_id' => $type->id]))) { + $this->attachObject($object, $ord, $group); return $object; } return null; } + public function attachObject(NirObject $object, $ord = null, $group = null) { + $ord = ($ord === null) ? $this->getMaxOrd($group) : $ord; + $this->moveFollowingObjects($ord, $group); + $this->objects()->attach($object->id, ['ord' => $ord ?? 0, 'group' => $group ?? 'default']); + } + + public function moveFollowingObjects($ord, $group = null) { + $this->objectsByGroup($group)->wherePivot('ord', '>=', $ord)->get()->each(function($object) { + $this->objects()->updateExistingPivot($object, ['ord' => $object->pivot->ord + 1]); + }); + } + + public function getMaxOrd($group = null): int { + $res = $this->objectsByGroup($group)->max('ord'); + return ($res !== null) ? ($res + 1) : 0; + } + + + public function moveObject(NirObject $object, $ord, $group = null) { + $currentGroup = $object->currentGroup($this); + $group = $group ?? $currentGroup; + $currentOrd = $object->currentOrd($this); + if (($group === $currentGroup) && ($ord > $currentOrd)) { + $this->objectsByGroup($group)->wherePivot('ord', '>', $currentOrd)->wherePivot('ord', '<=', $ord)->each(function($object) { + $this->objects()->updateExistingPivot($object, ['ord' => $object->pivot->ord - 1]); + }); + } else $this->moveFollowingObjects($ord, $group); + $this->objects()->updateExistingPivot($object, ['ord' => $ord, 'group' => $group ?? 'default']); + $this->trimIndexes([$group, $currentGroup]); + } + + public function trimIndexes($groups) { + collect(is_array($groups) ? $groups : [$groups])->unique()->each(function($group) { + $this->objectsByGroup($group)->each(function($object, $index) { + if ($object->pivot->ord !== $index) $this->objects()->updateExistingPivot($object, ['ord' => $index]); + }); + }); + } + + public function getValue($fieldName) { return $this->object ? $this->object->getValue($fieldName) : null; } - public function setValue($fieldName, $value) { return $this->object ? $this->object->setValue($fieldName, $value) : null; } - public function setValues(array $values) { return $this->object ? $this->object->setValues($values) : null; } - public function addValue($fieldName, $value) { return $this->object ? $this->object->addValue($fieldName, $value) : null; } diff --git a/app/Transformers/Objects/FieldsGroupTransformer.php b/app/Transformers/Objects/FieldsGroupTransformer.php index 7cb69b5..00cf3d1 100644 --- a/app/Transformers/Objects/FieldsGroupTransformer.php +++ b/app/Transformers/Objects/FieldsGroupTransformer.php @@ -26,7 +26,7 @@ class FieldsGroupTransformer extends TransformerAbstract { } public function includeFields(FieldsGroup $model): Collection { - return $this->collection($model->fields, new FieldTransformer($model->objectType)); + return $this->collection($model->fields, new FieldTransformer()); } diff --git a/app/Transformers/Objects/ObjectPropertyTransformer.php b/app/Transformers/Objects/ObjectPropertyTransformer.php index ac787cf..325b426 100644 --- a/app/Transformers/Objects/ObjectPropertyTransformer.php +++ b/app/Transformers/Objects/ObjectPropertyTransformer.php @@ -42,7 +42,7 @@ class ObjectPropertyTransformer extends TransformerAbstract { public function includeValue(Field $model) { if ($value = $model->getValue($this->object->id)) { if ($model->type === FieldType::RELATION) return $this->collection($value->filter(function($val) {return !is_null($val);}), $model->transformer); - elseif ($model->type === FieldType::DOCUMENT) return $this->collection($value, new AssetTransformer()); + elseif (in_array($model->type, [FieldType::DOCUMENT, FieldType::IMAGE])) return $this->collection($value, new AssetTransformer()); else return $this->primitive(['data' => $model->getValue($this->object->id)]); } return null; diff --git a/app/Transformers/Objects/ObjectTransformer.php b/app/Transformers/Objects/ObjectTransformer.php index 01d3ff1..f577a5b 100644 --- a/app/Transformers/Objects/ObjectTransformer.php +++ b/app/Transformers/Objects/ObjectTransformer.php @@ -24,6 +24,7 @@ class ObjectTransformer extends TransformerAbstract { 'id' => $model->uuid, 'name' => $model->name, 'type_title' => $model->type->title, + 'pivot' => ['group' => $model->pivot->group ?? null, 'ord' => $model->pivot->ord ?? null], 'created_at' => $model->created_at ? $model->created_at->toIso8601String() : null, 'updated_at' => $model->updated_at ? $model->updated_at->toIso8601String() : null ]; diff --git a/app/Transformers/Pages/PageTransformer.php b/app/Transformers/Pages/PageTransformer.php index 8770770..ec1c39b 100644 --- a/app/Transformers/Pages/PageTransformer.php +++ b/app/Transformers/Pages/PageTransformer.php @@ -16,7 +16,7 @@ class PageTransformer extends TransformerAbstract { ]; protected array $availableIncludes = [ - 'children', 'parent', 'sections', 'sidebars', 'permissions' + 'children', 'parent', 'parents', 'sections', 'sidebars', 'permissions' ]; public function transform(Page $model): array { @@ -41,6 +41,10 @@ class PageTransformer extends TransformerAbstract { return $model->parent ? $this->item($model->parent, new PageTransformer()) : null; } + public function includeParents(Page $model): Collection { + return $this->collection($model->parents->reverse(), new PageTransformer()); + } + public function includeSections(Page $model): Collection { return $this->collection($model->sections, new ObjectTransformer()); } diff --git a/database/migrations/2022_07_09_164823_create_field_string_values_table.php b/database/migrations/2022_07_09_164823_create_field_string_values_table.php index 0b3a7eb..4c064d4 100644 --- a/database/migrations/2022_07_09_164823_create_field_string_values_table.php +++ b/database/migrations/2022_07_09_164823_create_field_string_values_table.php @@ -18,6 +18,7 @@ class CreateFieldStringValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->string('value', 500)->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_09_165026_create_field_integer_values_table.php b/database/migrations/2022_07_09_165026_create_field_integer_values_table.php index da1a733..b02d040 100644 --- a/database/migrations/2022_07_09_165026_create_field_integer_values_table.php +++ b/database/migrations/2022_07_09_165026_create_field_integer_values_table.php @@ -18,6 +18,7 @@ class CreateFieldIntegerValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->integer('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_09_165156_create_field_float_values_table.php b/database/migrations/2022_07_09_165156_create_field_float_values_table.php index 883a628..280b20e 100644 --- a/database/migrations/2022_07_09_165156_create_field_float_values_table.php +++ b/database/migrations/2022_07_09_165156_create_field_float_values_table.php @@ -18,6 +18,7 @@ class CreateFieldFloatValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->float('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_09_165708_create_field_text_values_table.php b/database/migrations/2022_07_09_165708_create_field_text_values_table.php index c85130f..44d3c7f 100644 --- a/database/migrations/2022_07_09_165708_create_field_text_values_table.php +++ b/database/migrations/2022_07_09_165708_create_field_text_values_table.php @@ -18,6 +18,7 @@ class CreateFieldTextValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->text('value')->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_09_165744_create_field_boolean_values_table.php b/database/migrations/2022_07_09_165744_create_field_boolean_values_table.php index 7f0fe31..18e8971 100644 --- a/database/migrations/2022_07_09_165744_create_field_boolean_values_table.php +++ b/database/migrations/2022_07_09_165744_create_field_boolean_values_table.php @@ -18,6 +18,7 @@ class CreateFieldBooleanValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->boolean('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_09_170042_create_field_relation_values_table.php b/database/migrations/2022_07_09_170042_create_field_relation_values_table.php index d956207..dc5e0f9 100644 --- a/database/migrations/2022_07_09_170042_create_field_relation_values_table.php +++ b/database/migrations/2022_07_09_170042_create_field_relation_values_table.php @@ -18,6 +18,7 @@ class CreateFieldRelationValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->nullableMorphs('relatable'); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_16_185218_create_field_date_values_table.php b/database/migrations/2022_07_16_185218_create_field_date_values_table.php index 9132f2f..a210d13 100644 --- a/database/migrations/2022_07_16_185218_create_field_date_values_table.php +++ b/database/migrations/2022_07_16_185218_create_field_date_values_table.php @@ -18,6 +18,7 @@ class CreateFieldDateValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->date('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_07_18_163715_create_field_datetime_values.php b/database/migrations/2022_07_18_163715_create_field_datetime_values.php index 474f9eb..5e80637 100644 --- a/database/migrations/2022_07_18_163715_create_field_datetime_values.php +++ b/database/migrations/2022_07_18_163715_create_field_datetime_values.php @@ -18,6 +18,7 @@ class CreateFieldDatetimeValues extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->dateTime('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_09_05_212157_create_objectables_table.php b/database/migrations/2022_09_05_212157_create_objectables_table.php index 5634a7c..9784050 100644 --- a/database/migrations/2022_09_05_212157_create_objectables_table.php +++ b/database/migrations/2022_09_05_212157_create_objectables_table.php @@ -17,6 +17,7 @@ class CreateObjectablesTable extends Migration $table->id(); $table->integer('nir_object_id')->index()->nullable(); $table->nullableMorphs('objectable'); + $table->string('group')->index()->default('default'); $table->integer('ord')->index()->default(0); $table->timestamps(); }); diff --git a/database/migrations/2022_10_20_165525_create_field_document_values_table.php b/database/migrations/2022_10_20_165525_create_field_document_values_table.php index c6692e5..3d8aff9 100644 --- a/database/migrations/2022_10_20_165525_create_field_document_values_table.php +++ b/database/migrations/2022_10_20_165525_create_field_document_values_table.php @@ -18,6 +18,7 @@ class CreateFieldDocumentValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->integer('asset_id')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_11_21_092500_create_field_time_values_table.php b/database/migrations/2022_11_21_092500_create_field_time_values_table.php index 3a63407..3478f39 100644 --- a/database/migrations/2022_11_21_092500_create_field_time_values_table.php +++ b/database/migrations/2022_11_21_092500_create_field_time_values_table.php @@ -18,6 +18,7 @@ class CreateFieldTimeValuesTable extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->date('value')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/migrations/2022_11_22_204535_create_field_image_values.php b/database/migrations/2022_11_22_204535_create_field_image_values.php index c50f3e4..4970daf 100644 --- a/database/migrations/2022_11_22_204535_create_field_image_values.php +++ b/database/migrations/2022_11_22_204535_create_field_image_values.php @@ -18,6 +18,7 @@ class CreateFieldImageValues extends Migration $table->integer('object_id')->index()->nullable(); $table->integer('field_id')->index()->nullable(); $table->integer('asset_id')->index()->nullable(); + $table->integer('ord')->index()->default(0); $table->timestamps(); }); } diff --git a/database/seeders/Objects/FieldsTableSeeder.php b/database/seeders/Objects/FieldsTableSeeder.php index eba10f3..cad7043 100644 --- a/database/seeders/Objects/FieldsTableSeeder.php +++ b/database/seeders/Objects/FieldsTableSeeder.php @@ -20,16 +20,6 @@ class FieldsTableSeeder extends Seeder { 'required' => true ], - 'subheader' => [ - 'title' => 'Текст подзаголовка', - 'type' => FieldType::TEXT - ], - 'subheader-required' => [ - 'title' => 'Текст подзаголовка', - 'type' => FieldType::TEXT, - 'required' => true - ], - 'documents' => [ 'title' => 'Документы', 'type' => FieldType::DOCUMENT, @@ -69,6 +59,11 @@ class FieldsTableSeeder extends Seeder { ], 'images' => [ + 'title' => 'Изображения', + 'type' => FieldType::IMAGE, + 'multiple' => true + ], + 'images-required' => [ 'title' => 'Изображения', 'type' => FieldType::IMAGE, 'multiple' => true, diff --git a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php index 5b3e919..3e672d9 100644 --- a/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php +++ b/database/seeders/Objects/ObjectTypeFieldsTableSeeder.php @@ -11,19 +11,15 @@ class ObjectTypeFieldsTableSeeder extends Seeder { public array $objectTypeFields = [ 'page-sidebar' => [ 'common' => [ - 'fields' => ['header', 'subheader', 'documents'] + 'fields' => ['header', 'text', 'documents'] ] ], + 'page-section-header' => [ 'common' => [ 'fields' => ['header-required'] ] ], - 'page-section-subheader' => [ - 'common' => [ - 'fields' => ['subheader-required'] - ] - ], 'page-section-text' => [ 'common' => [ 'fields' => ['text-required'] @@ -36,7 +32,12 @@ class ObjectTypeFieldsTableSeeder extends Seeder { ], 'page-section-images' => [ 'common' => [ - 'fields' => ['images'] + 'fields' => ['images-required'] + ] + ], + 'page-section-documents' => [ + 'common' => [ + 'fields' => ['documents-required'] ] ], 'page-section-videos' => [ diff --git a/database/seeders/Objects/ObjectTypesTableSeeder.php b/database/seeders/Objects/ObjectTypesTableSeeder.php index 1321e3b..744f782 100644 --- a/database/seeders/Objects/ObjectTypesTableSeeder.php +++ b/database/seeders/Objects/ObjectTypesTableSeeder.php @@ -16,11 +16,8 @@ class ObjectTypesTableSeeder extends Seeder { 'page-section-header' => [ 'title' => 'Заголовок' ], - 'page-section-subheader' => [ - 'title' => 'Подзаголовок' - ], 'page-section-text' => [ - 'title' => 'Текст' + 'title' => 'Текстовый блок' ], 'page-section-list' => [ 'title' => 'Список' @@ -28,6 +25,9 @@ class ObjectTypesTableSeeder extends Seeder { 'page-section-images' => [ 'title' => 'Изображения' ], + 'page-section-documents' => [ + 'title' => 'Документы' + ], 'page-section-videos' => [ 'title' => 'Видео' ] diff --git a/routes/api.php b/routes/api.php index 98e4f54..3785990 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,6 +16,7 @@ Route::get('/check-email', 'Api\Auth\RegisterController@checkEmail'); Route::get('pages', 'Api\Pages\PagesController@index'); Route::get('pages/root', 'Api\Pages\PagesController@root'); +Route::get('pages/find', 'Api\Pages\PagesController@find'); Route::get('pages/{id}', 'Api\Pages\PagesController@show'); Route::group(['middleware' => ['auth:api']], function() { @@ -40,6 +41,7 @@ Route::group(['middleware' => ['auth:api']], function() { Route::post('/', 'Api\Assets\UploadFileController@store'); }); + Route::put('objects/move/{id}', 'Api\Objects\ObjectsController@move'); Route::apiResource('objects', 'Api\Objects\ObjectsController'); Route::apiResource('object-types', 'Api\Objects\ObjectTypesController');