Update Settings to return resource data and meta

This commit is contained in:
philipp lang 2024-08-02 13:16:43 +02:00
parent 3e92a7c40a
commit cbb45a0452
11 changed files with 49 additions and 94 deletions

View File

@ -1,21 +0,0 @@
<?php
namespace App\Fileshare\Actions;
use App\Fileshare\Models\Fileshare;
use App\Fileshare\Resources\FileshareResource;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Lorisleiva\Actions\Concerns\AsAction;
class FileshareApiIndexAction
{
use AsAction;
public function handle(): AnonymousResourceCollection
{
session()->put('menu', 'setting');
session()->put('title', 'Datei-Verbindungen');
return FileshareResource::collection(Fileshare::paginate(15));
}
}

View File

@ -21,10 +21,8 @@ class FileshareSettings extends LocalSettings
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function viewData(): array public function data()
{ {
return [ return FileshareResource::collection(Fileshare::paginate(15));
'data' => FileshareResource::collection(Fileshare::paginate(15))
];
} }
} }

View File

@ -18,14 +18,6 @@ class MailgatewaySettings extends LocalSettings
return 'E-Mail-Verbindungen'; return 'E-Mail-Verbindungen';
} }
/**
* @inheritdoc
*/
public function meta(): array
{
return MailgatewayResource::meta();
}
/** /**
* @inheritdoc * @inheritdoc
*/ */

View File

@ -41,11 +41,14 @@ class ModuleSettings extends LocalSettings implements Storeable
/** /**
* @inheritdoc * @inheritdoc
*/ */
public function meta(): array public function data(): array
{ {
return [ return [
...parent::meta(), ...parent::data(),
'modules' => Module::forSelect() 'meta' => [
...parent::data()['meta'],
'modules' => Module::forSelect(),
]
]; ];
} }
} }

View File

@ -20,7 +20,6 @@ class ViewAction
return Inertia::render('setting/' . ucfirst($settingGroup::group()), [ return Inertia::render('setting/' . ucfirst($settingGroup::group()), [
'data' => $settingGroup->data(), 'data' => $settingGroup->data(),
'settingMenu' => app(SettingFactory::class)->getShare(), 'settingMenu' => app(SettingFactory::class)->getShare(),
'meta' => $settingGroup->meta(),
]); ]);
} }
} }

View File

@ -19,21 +19,19 @@ abstract class LocalSettings extends Settings
return $this->url(); return $this->url();
} }
public function meta(): array
{
return [
'links' => [
'store' => $this->storeUrl(),
]
];
}
/** /**
* @return mixed * @return mixed
*/ */
public function data() public function data()
{ {
return $this->toArray(); return [
'data' => $this->toArray(),
'meta' => [
'links' => [
'store' => $this->storeUrl(),
]
]
];
} }
public function beforeSave(ActionRequest $request): void public function beforeSave(ActionRequest $request): void

View File

@ -66,9 +66,12 @@ class NamiSettings extends LocalSettings implements Storeable
public function data(): array public function data(): array
{ {
return [ return [
'mglnr' => $this->mglnr, ...parent::data(),
'password' => '', 'data' => [
'default_group_id' => $this->default_group_id, 'mglnr' => $this->mglnr,
'password' => '',
'default_group_id' => $this->default_group_id,
],
]; ];
} }
} }

View File

@ -76,10 +76,12 @@
</template> </template>
<script lang="js" setup> <script lang="js" setup>
import { useApiIndex } from '../../composables/useApiIndex.js'; import { useIndex, indexProps } from '../../composables/useInertiaApiIndex.js';
import SettingLayout from '../setting/Layout.vue'; import SettingLayout from '../setting/Layout.vue';
const { meta, data, reload, create, edit, cancel, single, submit } = useApiIndex('/api/fileshare', 'fileshare'); const props = defineProps(indexProps);
const { meta, data, reload, create, edit, cancel, single, submit } = useIndex(props.data, 'fileshare');
function getType(type) { function getType(type) {
if (!type) { if (!type) {
@ -89,6 +91,4 @@ function getType(type) {
} }
return meta.value.types.find((t) => t.id === type); return meta.value.types.find((t) => t.id === type);
} }
reload();
</script> </script>

View File

@ -2,7 +2,7 @@ import {useIndex} from '../../composables/useInertiaApiIndex.js';
import SettingLayout from './Layout.vue'; import SettingLayout from './Layout.vue';
export function useSettings(props) { export function useSettings(props) {
const {data, meta, router} = useIndex(props); const {data, meta, router} = useIndex(props.data);
function submit() { function submit() {
router.post(meta.value.links.store, {...data.value}); router.post(meta.value.links.store, {...data.value});
@ -19,19 +19,10 @@ export function useSettings(props) {
const props = { const props = {
data: { data: {
type: Object,
required: true,
},
settingMenu: {
type: Object,
required: true,
},
meta: {
type: Object,
required: false,
default: () => { default: () => {
return {}; return {data: [], meta: {}};
}, },
type: Object,
}, },
}; };

View File

@ -19,7 +19,6 @@ use App\Invoice\Actions\InvoiceStoreAction;
use App\Course\Actions\CourseUpdateAction; use App\Course\Actions\CourseUpdateAction;
use App\Dashboard\Actions\IndexAction as DashboardIndexAction; use App\Dashboard\Actions\IndexAction as DashboardIndexAction;
use App\Efz\ShowEfzDocumentAction; use App\Efz\ShowEfzDocumentAction;
use App\Fileshare\Actions\FileshareApiIndexAction;
use App\Fileshare\Actions\FileshareStoreAction; use App\Fileshare\Actions\FileshareStoreAction;
use App\Fileshare\Actions\FileshareUpdateAction; use App\Fileshare\Actions\FileshareUpdateAction;
use App\Fileshare\Actions\ListFilesAction; use App\Fileshare\Actions\ListFilesAction;
@ -182,6 +181,5 @@ Route::group(['middleware' => 'auth:web'], function (): void {
// ------------------------------------ fileshare ----------------------------------- // ------------------------------------ fileshare -----------------------------------
Route::post('/fileshare', FileshareStoreAction::class)->name('fileshare.store'); Route::post('/fileshare', FileshareStoreAction::class)->name('fileshare.store');
Route::patch('/fileshare/{fileshare}', FileshareUpdateAction::class)->name('fileshare.update'); Route::patch('/fileshare/{fileshare}', FileshareUpdateAction::class)->name('fileshare.update');
Route::get('/api/fileshare', FileshareApiIndexAction::class)->name('api.fileshare.index');
Route::post('/api/fileshare/{fileshare}/files', ListFilesAction::class)->name('api.fileshare.files'); Route::post('/api/fileshare/{fileshare}/files', ListFilesAction::class)->name('api.fileshare.files');
}); });

View File

@ -17,31 +17,25 @@ class FileshareIndexActionTest extends FileshareTestCase
->name('lokaler Server') ->name('lokaler Server')
->create(); ->create();
$this->get('/api/fileshare') $this->get(route('setting.view', ['settingGroup' => 'fileshare']))
->assertJsonPath('data.0.name', 'lokaler Server') ->assertComponent('setting/Fileshare')
->assertJsonPath('data.0.type', OwncloudConnection::class) ->assertInertiaPath('data.data.0.name', 'lokaler Server')
->assertJsonPath('data.0.config.user', 'badenpowell') ->assertInertiaPath('data.data.0.type', OwncloudConnection::class)
->assertJsonPath('data.0.config.password', 'secret') ->assertInertiaPath('data.data.0.config.user', 'badenpowell')
->assertJsonPath('data.0.config.base_url', env('TEST_OWNCLOUD_DOMAIN')) ->assertInertiaPath('data.data.0.config.password', 'secret')
->assertJsonPath('data.0.id', $connection->id) ->assertInertiaPath('data.data.0.config.base_url', env('TEST_OWNCLOUD_DOMAIN'))
->assertJsonPath('data.0.is_active', true) ->assertInertiaPath('data.data.0.id', $connection->id)
->assertJsonPath('data.0.type_human', 'Owncloud') ->assertInertiaPath('data.data.0.is_active', true)
->assertJsonPath('data.0.links.update', route('fileshare.update', ['fileshare' => $connection])) ->assertInertiaPath('data.data.0.type_human', 'Owncloud')
->assertJsonPath('meta.default.name', '') ->assertInertiaPath('data.data.0.links.update', route('fileshare.update', ['fileshare' => $connection]))
->assertJsonPath('meta.links.store', route('fileshare.store')) ->assertInertiaPath('data.meta.default.name', '')
->assertJsonPath('meta.types.0.id', NextcloudConnection::class) ->assertInertiaPath('data.meta.links.store', route('fileshare.store'))
->assertJsonPath('meta.types.0.name', 'Nextcloud') ->assertInertiaPath('data.meta.types.0.id', NextcloudConnection::class)
->assertJsonPath('meta.types.0.defaults.base_url', '') ->assertInertiaPath('data.meta.types.0.name', 'Nextcloud')
->assertJsonPath('meta.types.1.id', OwncloudConnection::class) ->assertInertiaPath('data.meta.types.0.defaults.base_url', '')
->assertJsonPath('meta.types.1.name', 'Owncloud') ->assertInertiaPath('data.meta.types.1.id', OwncloudConnection::class)
->assertJsonPath('meta.types.1.defaults.base_url', '') ->assertInertiaPath('data.meta.types.1.name', 'Owncloud')
->assertJsonPath('meta.types.0.fields.1', ['label' => 'Benutzer', 'key' => 'user', 'type' => 'text']); ->assertInertiaPath('data.meta.types.1.defaults.base_url', '')
} ->assertInertiaPath('data.meta.types.0.fields.1', ['label' => 'Benutzer', 'key' => 'user', 'type' => 'text']);
public function testItRendersComponent(): void
{
$this->withoutExceptionHandling()->login()->loginNami();
$this->get('/setting/fileshare')->assertComponent('setting/Fileshare');
} }
} }