Nova getting started added

This commit is contained in:
Benjamin Takats
2022-12-01 12:02:10 +01:00
parent 5ad6bc3f05
commit 4699805e60
33 changed files with 1090 additions and 16 deletions

View File

@@ -9,6 +9,8 @@ use Laravel\Nova\Fields\BelongsToMany;
class Category extends Resource class Category extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -32,6 +34,11 @@ class Category extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Categories');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -2,46 +2,48 @@
namespace App\Nova; namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\BelongsTo; use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
class City extends Resource class City extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
*
* @var string * @var string
*/ */
public static $model = \App\Models\City::class; public static $model = \App\Models\City::class;
/** /**
* The single value that should be used to represent the resource when being displayed. * The single value that should be used to represent the resource when being displayed.
*
* @var string * @var string
*/ */
public static $title = 'id'; public static $title = 'id';
/** /**
* The columns that should be searched. * The columns that should be searched.
*
* @var array * @var array
*/ */
public static $search = [ public static $search = [
'id', 'id',
]; ];
public static function label()
{
return __('Cities');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function fields(Request $request) public function fields(Request $request)
{ {
return [ return [
ID::make()->sortable(), ID::make()
->sortable(),
Text::make('Name') Text::make('Name')
->rules('required', 'string'), ->rules('required', 'string'),
@@ -56,6 +58,7 @@ class City extends Resource
* Get the cards available for the request. * Get the cards available for the request.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function cards(Request $request) public function cards(Request $request)
@@ -67,6 +70,7 @@ class City extends Resource
* Get the filters available for the resource. * Get the filters available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function filters(Request $request) public function filters(Request $request)
@@ -78,6 +82,7 @@ class City extends Resource
* Get the lenses available for the resource. * Get the lenses available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function lenses(Request $request) public function lenses(Request $request)
@@ -89,6 +94,7 @@ class City extends Resource
* Get the actions available for the resource. * Get the actions available for the resource.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
*
* @return array * @return array
*/ */
public function actions(Request $request) public function actions(Request $request)

View File

@@ -9,6 +9,8 @@ use Laravel\Nova\Fields\HasMany;
class Country extends Resource class Country extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -32,6 +34,11 @@ class Country extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Countries');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -10,6 +10,8 @@ use Laravel\Nova\Fields\BelongsToMany;
class Course extends Resource class Course extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -33,6 +35,11 @@ class Course extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Courses');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -2,20 +2,24 @@
namespace App\Nova\Dashboards; namespace App\Nova\Dashboards;
use Laravel\Nova\Cards\Help;
use Laravel\Nova\Dashboards\Main as Dashboard; use Laravel\Nova\Dashboards\Main as Dashboard;
use Nova\Start\Start;
class Main extends Dashboard class Main extends Dashboard
{ {
public function name()
{
return 'Getting Started';
}
/** /**
* Get the cards for the dashboard. * Get the cards for the dashboard.
*
* @return array * @return array
*/ */
public function cards() public function cards()
{ {
return [ return [
new Help, new Start,
]; ];
} }
} }

View File

@@ -9,6 +9,8 @@ use Laravel\Nova\Fields\BelongsTo;
class Event extends Resource class Event extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -32,6 +34,11 @@ class Event extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Events');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -10,6 +10,8 @@ use Laravel\Nova\Fields\BelongsTo;
class Lecturer extends Resource class Lecturer extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -33,6 +35,11 @@ class Lecturer extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Lecturers');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -8,6 +8,8 @@ use Laravel\Nova\Fields\Text;
class Participant extends Resource class Participant extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -31,6 +33,11 @@ class Participant extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Participants');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -9,6 +9,8 @@ use Laravel\Nova\Fields\BelongsTo;
class Registration extends Resource class Registration extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -32,6 +34,11 @@ class Registration extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Registrations');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -8,6 +8,8 @@ use Laravel\Nova\Http\Requests\NovaRequest;
class Team extends Resource class Team extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* @var class-string<\App\Models\Team> * @var class-string<\App\Models\Team>

View File

@@ -12,6 +12,8 @@ use Laravel\Nova\Http\Requests\NovaRequest;
class User extends Resource class User extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* @var class-string<\App\Models\User> * @var class-string<\App\Models\User>
@@ -32,6 +34,11 @@ class User extends Resource
'id', 'name', 'email', 'id', 'name', 'email',
]; ];
public static function label()
{
return __('Users');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -9,6 +9,8 @@ use Laravel\Nova\Fields\BelongsTo;
class Venue extends Resource class Venue extends Resource
{ {
/** /**
* The model the resource corresponds to. * The model the resource corresponds to.
* *
@@ -32,6 +34,11 @@ class Venue extends Resource
'id', 'id',
]; ];
public static function label()
{
return __('Venues');
}
/** /**
* Get the fields displayed by the resource. * Get the fields displayed by the resource.
* *

View File

@@ -2,8 +2,23 @@
namespace App\Providers; namespace App\Providers;
use App\Nova\Category;
use App\Nova\City;
use App\Nova\Country;
use App\Nova\Course;
use App\Nova\Dashboards\Main;
use App\Nova\Event;
use App\Nova\Lecturer;
use App\Nova\Participant;
use App\Nova\Registration;
use App\Nova\Team;
use App\Nova\User;
use App\Nova\Venue;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
use Itsmejoshua\Novaspatiepermissions\Novaspatiepermissions; use Itsmejoshua\Novaspatiepermissions\Novaspatiepermissions;
use Laravel\Nova\Menu\MenuItem;
use Laravel\Nova\Menu\MenuSection;
use Laravel\Nova\Nova; use Laravel\Nova\Nova;
use Laravel\Nova\NovaApplicationServiceProvider; use Laravel\Nova\NovaApplicationServiceProvider;
@@ -17,6 +32,34 @@ class NovaServiceProvider extends NovaApplicationServiceProvider
{ {
parent::boot(); parent::boot();
Nova::mainMenu(function (Request $request) {
return [
MenuSection::dashboard(Main::class)
->icon('lightning-bolt'),
MenuSection::make('Schule', [
MenuItem::resource(City::class),
MenuItem::resource(Lecturer::class),
MenuItem::resource(Venue::class),
MenuItem::resource(Course::class),
MenuItem::resource(Event::class),
MenuItem::resource(Participant::class),
MenuItem::resource(Registration::class),
])
->icon('academic-cap')
->collapsable(),
MenuSection::make('Admin', [
MenuItem::resource(Category::class),
MenuItem::resource(Country::class),
MenuItem::resource(Team::class),
MenuItem::resource(User::class),
])
->icon('key')
->collapsable(),
];
});
Nova::withBreadcrumbs(); Nova::withBreadcrumbs();
// disable theme switcher // disable theme switcher

View File

@@ -21,7 +21,8 @@
"spatie/laravel-google-fonts": "^1.2", "spatie/laravel-google-fonts": "^1.2",
"spatie/laravel-sluggable": "^3.4", "spatie/laravel-sluggable": "^3.4",
"stijnvanouplines/blade-country-flags": "^1.0", "stijnvanouplines/blade-country-flags": "^1.0",
"wireui/wireui": "^1.17" "wireui/wireui": "^1.17",
"nova/start": "*"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.9.1", "fakerphp/faker": "^1.9.1",
@@ -92,6 +93,10 @@
{ {
"type": "composer", "type": "composer",
"url": "https://nova.laravel.com" "url": "https://nova.laravel.com"
},
{
"type": "path",
"url": "./nova-components/Start"
} }
] ]
} }

38
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "dafb57f82691675a5d03595d824baa57", "content-hash": "fe688c8ea9a0c69b1cff7d3876e83e4f",
"packages": [ "packages": [
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@@ -3284,6 +3284,42 @@
}, },
"time": "2022-11-12T15:38:23+00:00" "time": "2022-11-12T15:38:23+00:00"
}, },
{
"name": "nova/start",
"version": "dev-blueprint",
"dist": {
"type": "path",
"url": "./nova-components/Start",
"reference": "fbea082cebeff60ba53b11985fbb6ed65ab46008"
},
"require": {
"php": "^7.3|^8.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Nova\\Start\\CardServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Nova\\Start\\": "src/"
}
},
"license": [
"MIT"
],
"description": "A Laravel Nova card.",
"keywords": [
"laravel",
"nova"
],
"transport-options": {
"relative": true
}
},
{ {
"name": "nunomaduro/termwind", "name": "nunomaduro/termwind",
"version": "v1.14.2", "version": "v1.14.2",

View File

@@ -1,4 +1,14 @@
{ {
"Lecturers": "Dozenten",
"Cities": "Städte",
"Venues": "Veranstaltungs-Orte",
"Courses": "Kurse",
"Events": "Termine",
"Participants": "Teilnehmer",
"Registrations": "Registrierungen",
"Categories": "Kategorien",
"Countries": "Länder",
"Users": "Benutzer",
"I want to submit new courses on this platform": "Ich bin Dozent und möchte neue Kurse auf dieser Plattform einstellen", "I want to submit new courses on this platform": "Ich bin Dozent und möchte neue Kurse auf dieser Plattform einstellen",
"(and :count more error)": "(und :count weiterer Fehler)", "(and :count more error)": "(und :count weiterer Fehler)",
"(and :count more errors)": "(und :count weitere Fehler)", "(and :count more errors)": "(und :count weitere Fehler)",

10
nova-components/Start/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
/.idea
/vendor
/node_modules
package-lock.json
composer.phar
composer.lock
phpunit.xml
.phpunit.result.cache
.DS_Store
Thumbs.db

View File

@@ -0,0 +1 @@
progress=false

View File

@@ -0,0 +1,29 @@
{
"name": "nova/start",
"description": "A Laravel Nova card.",
"keywords": [
"laravel",
"nova"
],
"license": "MIT",
"require": {
"php": "^7.3|^8.0"
},
"autoload": {
"psr-4": {
"Nova\\Start\\": "src/"
}
},
"extra": {
"laravel": {
"providers": [
"Nova\\Start\\CardServiceProvider"
]
}
},
"config": {
"sort-packages": true
},
"minimum-stability": "dev",
"prefer-stable": true
}

View File

@@ -0,0 +1,2 @@
/* Nova Card CSS */

522
nova-components/Start/dist/js/card.js vendored Normal file
View File

@@ -0,0 +1,522 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=script&lang=js":
/*!**********************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=script&lang=js ***!
\**********************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
name: 'Help',
props: {
card: Object
},
methods: {
link: function link(path) {
return "https://nova.laravel.com/docs/".concat(this.version, "/").concat(path);
}
},
computed: {
resources: function resources() {
return this.link('resources');
},
actions: function actions() {
return this.link('actions/defining-actions.html');
},
filters: function filters() {
return this.link('filters/defining-filters.html');
},
lenses: function lenses() {
return this.link('lenses/defining-lenses.html');
},
metrics: function metrics() {
return this.link('metrics/defining-metrics.html');
},
cards: function cards() {
return this.link('customization/cards.html');
},
version: function version() {
var parts = Nova.config('version').split('.');
parts.splice(-2);
return "".concat(parts, ".0");
}
}
});
/***/ }),
/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a":
/*!**************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a ***!
\**************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* binding */ render)
/* harmony export */ });
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "vue");
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(vue__WEBPACK_IMPORTED_MODULE_0__);
var _hoisted_1 = {
"class": "flex justify-center items-center"
};
var _hoisted_2 = {
"class": "w-full"
};
var _hoisted_3 = {
"class": "leading-tight mt-3"
};
var _hoisted_4 = {
"class": "leading-tight mt-3"
};
var _hoisted_5 = {
"class": "md:grid md:grid-cols-2"
};
var _hoisted_6 = {
"class": "border-r border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_7 = ["href"];
var _hoisted_8 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "1.")], -1 /* HOISTED */);
var _hoisted_9 = {
"class": "leading-normal mt-3"
};
var _hoisted_10 = {
"class": "border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_11 = ["href"];
var _hoisted_12 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "2.")], -1 /* HOISTED */);
var _hoisted_13 = {
"class": "leading-normal mt-3"
};
var _hoisted_14 = {
"class": "border-r border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_15 = ["href"];
var _hoisted_16 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "3.")], -1 /* HOISTED */);
var _hoisted_17 = {
"class": "leading-normal mt-3"
};
var _hoisted_18 = {
"class": "border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_19 = ["href"];
var _hoisted_20 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "4.")], -1 /* HOISTED */);
var _hoisted_21 = {
"class": "leading-normal mt-3"
};
var _hoisted_22 = {
"class": "border-r md:border-b-0 border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_23 = ["href"];
var _hoisted_24 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "5.")], -1 /* HOISTED */);
var _hoisted_25 = {
"class": "leading-normal mt-3"
};
var _hoisted_26 = {
"class": "md:border-b-0 border-b border-gray-200 dark:border-gray-700"
};
var _hoisted_27 = ["href"];
var _hoisted_28 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "flex justify-center w-11 flex-shrink-0 mr-6"
}, [/*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", {
"class": "text-4xl text-primary-500 dark:text-primary-600"
}, "6.")], -1 /* HOISTED */);
var _hoisted_29 = {
"class": "leading-normal mt-3"
};
function render(_ctx, _cache, $props, $setup, $data, $options) {
var _component_Heading = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Heading");
var _component_Card = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("Card", true);
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, null, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Getting Started')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Als Dozent hast du Zugriff auf das Daten-Backend und kannst neue Items anlegen.')), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Hier ein paar Tipps, wie du am besten startest:')), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Card, {
"class": "mt-8"
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.resources,
"class": "no-underline flex p-6"
}, [_hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Stadt suchen und anlegen')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Gehe auf die Seite "Städte" und suche nach der Stadt, in der du die Items anlegen möchtest. Wenn du die Stadt nicht findest, kannst du sie anlegen.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_7)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.actions,
"class": "no-underline flex p-6"
}, [_hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Veranstaltungs-Ort suchen und anlegen')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Gehe auf die Seite "Veranstaltungs-Orte" und suche nach dem Ort, an dem du die Items anlegen möchtest. Wenn du den Ort nicht findest, kannst du ihn anlegen.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_11)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.filters,
"class": "no-underline flex p-6"
}, [_hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Dozenten-Profil bearbeiten')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Gehe auf die Seite "Dozenten" und suche nach deinem Dozenten-Profil. Wenn du es nicht findest, kannst du es anlegen.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_15)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.lenses,
"class": "no-underline flex p-6"
}, [_hoisted_20, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Kurse anlegen und verwalten')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Gehe auf die Seite "Kurse" und suche nach dem Kurs, den du editieren möchtest. Wenn du den Kurs nicht findest, kannst du ihn anlegen.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_19)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.metrics,
"class": "no-underline flex p-6"
}, [_hoisted_24, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Termine anlegen und verwalten')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_25, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Gehe auf die Seite "Termine" und suche nach dem Termin, den du editieren möchtest. Wenn du den Termin nicht findest, kannst du ihn anlegen.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_23)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_26, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("a", {
href: $options.cards,
"class": "no-underline flex p-6"
}, [_hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_Heading, {
level: 3
}, {
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Berechtigungen')), 1 /* TEXT */)];
}),
_: 1 /* STABLE */
}), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(_ctx.__('Wenn Buttons zur Bearbeitung fehlen, dann hast du nicht die nötigen Berechtigungen. Melde dich bei einem der Admins.')), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_27)])])];
}),
_: 1 /* STABLE */
})])]);
}
/***/ }),
/***/ "./resources/js/card.js":
/*!******************************!*\
!*** ./resources/js/card.js ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _components_Card__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./components/Card */ "./resources/js/components/Card.vue");
Nova.booting(function (app, store) {
app.component('start', _components_Card__WEBPACK_IMPORTED_MODULE_0__["default"]);
});
/***/ }),
/***/ "./resources/css/card.css":
/*!********************************!*\
!*** ./resources/css/card.css ***!
\********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin
/***/ }),
/***/ "./node_modules/vue-loader/dist/exportHelper.js":
/*!******************************************************!*\
!*** ./node_modules/vue-loader/dist/exportHelper.js ***!
\******************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
// runtime helper for setting properties on components
// in a tree-shakable way
exports["default"] = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) {
target[key] = val;
}
return target;
};
/***/ }),
/***/ "./resources/js/components/Card.vue":
/*!******************************************!*\
!*** ./resources/js/components/Card.vue ***!
\******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _Card_vue_vue_type_template_id_b9bc2c0a__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Card.vue?vue&type=template&id=b9bc2c0a */ "./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a");
/* harmony import */ var _Card_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Card.vue?vue&type=script&lang=js */ "./resources/js/components/Card.vue?vue&type=script&lang=js");
/* harmony import */ var _home_fsociety_Code_side_einundzwanzig_bitcoin_school_nova_components_Start_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/vue-loader/dist/exportHelper.js */ "./node_modules/vue-loader/dist/exportHelper.js");
;
const __exports__ = /*#__PURE__*/(0,_home_fsociety_Code_side_einundzwanzig_bitcoin_school_nova_components_Start_node_modules_vue_loader_dist_exportHelper_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_Card_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_1__["default"], [['render',_Card_vue_vue_type_template_id_b9bc2c0a__WEBPACK_IMPORTED_MODULE_0__.render],['__file',"resources/js/components/Card.vue"]])
/* hot reload */
if (false) {}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__exports__);
/***/ }),
/***/ "./resources/js/components/Card.vue?vue&type=script&lang=js":
/*!******************************************************************!*\
!*** ./resources/js/components/Card.vue?vue&type=script&lang=js ***!
\******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Card_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__["default"])
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Card_vue_vue_type_script_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Card.vue?vue&type=script&lang=js */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=script&lang=js");
/***/ }),
/***/ "./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a":
/*!************************************************************************!*\
!*** ./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a ***!
\************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Card_vue_vue_type_template_id_b9bc2c0a__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Card_vue_vue_type_template_id_b9bc2c0a__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Card.vue?vue&type=template&id=b9bc2c0a */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/components/Card.vue?vue&type=template&id=b9bc2c0a");
/***/ }),
/***/ "vue":
/*!**********************!*\
!*** external "Vue" ***!
\**********************/
/***/ ((module) => {
module.exports = Vue;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = __webpack_modules__;
/******/
/************************************************************************/
/******/ /* webpack/runtime/chunk loaded */
/******/ (() => {
/******/ var deferred = [];
/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
/******/ if(chunkIds) {
/******/ priority = priority || 0;
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
/******/ deferred[i] = [chunkIds, fn, priority];
/******/ return;
/******/ }
/******/ var notFulfilled = Infinity;
/******/ for (var i = 0; i < deferred.length; i++) {
/******/ var [chunkIds, fn, priority] = deferred[i];
/******/ var fulfilled = true;
/******/ for (var j = 0; j < chunkIds.length; j++) {
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
/******/ chunkIds.splice(j--, 1);
/******/ } else {
/******/ fulfilled = false;
/******/ if(priority < notFulfilled) notFulfilled = priority;
/******/ }
/******/ }
/******/ if(fulfilled) {
/******/ deferred.splice(i--, 1)
/******/ var r = fn();
/******/ if (r !== undefined) result = r;
/******/ }
/******/ }
/******/ return result;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/jsonp chunk loading */
/******/ (() => {
/******/ // no baseURI
/******/
/******/ // object to store loaded and loading chunks
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
/******/ var installedChunks = {
/******/ "/js/card": 0,
/******/ "css/card": 0
/******/ };
/******/
/******/ // no chunk on demand loading
/******/
/******/ // no prefetching
/******/
/******/ // no preloaded
/******/
/******/ // no HMR
/******/
/******/ // no HMR manifest
/******/
/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
/******/
/******/ // install a JSONP callback for chunk loading
/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
/******/ var [chunkIds, moreModules, runtime] = data;
/******/ // add "moreModules" to the modules object,
/******/ // then flag all "chunkIds" as loaded and fire callback
/******/ var moduleId, chunkId, i = 0;
/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
/******/ for(moduleId in moreModules) {
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
/******/ }
/******/ }
/******/ if(runtime) var result = runtime(__webpack_require__);
/******/ }
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
/******/ for(;i < chunkIds.length; i++) {
/******/ chunkId = chunkIds[i];
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
/******/ installedChunks[chunkId][0]();
/******/ }
/******/ installedChunks[chunkId] = 0;
/******/ }
/******/ return __webpack_require__.O(result);
/******/ }
/******/
/******/ var chunkLoadingGlobal = self["webpackChunknova_start"] = self["webpackChunknova_start"] || [];
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module depends on other loaded chunks and execution need to be delayed
/******/ __webpack_require__.O(undefined, ["css/card"], () => (__webpack_require__("./resources/js/card.js")))
/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["css/card"], () => (__webpack_require__("./resources/css/card.css")))
/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
/******/
/******/ })()
;

View File

@@ -0,0 +1,4 @@
{
"/js/card.js": "/js/card.js",
"/css/card.css": "/css/card.css"
}

View File

@@ -0,0 +1,33 @@
const mix = require('laravel-mix')
const webpack = require('webpack')
const path = require('path')
class NovaExtension {
name() {
return 'nova-extension'
}
register(name) {
this.name = name
}
webpackConfig(webpackConfig) {
webpackConfig.externals = {
vue: 'Vue',
}
webpackConfig.resolve.alias = {
...(webpackConfig.resolve.alias || {}),
'laravel-nova': path.join(
__dirname,
'../../vendor/laravel/nova/resources/js/mixins/packages.js'
),
}
webpackConfig.output = {
uniqueName: this.name,
}
}
}
mix.extend('nova', new NovaExtension())

View File

@@ -0,0 +1,20 @@
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production",
"nova:install": "npm --prefix='../../vendor/laravel/nova' ci"
},
"devDependencies": {
"@vue/compiler-sfc": "^3.2.22",
"laravel-mix": "^6.0.41",
"postcss": "^8.3.11",
"vue-loader": "^16.8.3"
},
"dependencies": {}
}

View File

@@ -0,0 +1 @@
module.exports = {}

View File

@@ -0,0 +1 @@
/* Nova Card CSS */

View File

@@ -0,0 +1,5 @@
import Card from './components/Card'
Nova.booting((app, store) => {
app.component('start', Card)
})

View File

@@ -0,0 +1,167 @@
<template>
<div class="flex justify-center items-center">
<div class="w-full">
<Heading>{{ __('Getting Started') }}</Heading>
<p class="leading-tight mt-3">
{{ __('Als Dozent hast du Zugriff auf das Daten-Backend und kannst neue Items anlegen.') }}
</p>
<p class="leading-tight mt-3">
{{ __('Hier ein paar Tipps, wie du am besten startest:') }}
</p>
<Card class="mt-8">
<div class="md:grid md:grid-cols-2">
<div class="border-r border-b border-gray-200 dark:border-gray-700">
<a :href="resources" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">1.</div>
</div>
<div>
<Heading :level="3">{{ __('Stadt suchen und anlegen') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Gehe auf die Seite "Städte" und suche nach der Stadt, in der du die Items anlegen möchtest. Wenn du die Stadt nicht findest, kannst du sie anlegen.')
}}
</p>
</div>
</a>
</div>
<div class="border-b border-gray-200 dark:border-gray-700">
<a :href="actions" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">2.</div>
</div>
<div>
<Heading :level="3">{{ __('Veranstaltungs-Ort suchen und anlegen') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Gehe auf die Seite "Veranstaltungs-Orte" und suche nach dem Ort, an dem du die Items anlegen möchtest. Wenn du den Ort nicht findest, kannst du ihn anlegen.')
}}
</p>
</div>
</a>
</div>
<div class="border-r border-b border-gray-200 dark:border-gray-700">
<a :href="filters" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">3.</div>
</div>
<div>
<Heading :level="3">{{ __('Dozenten-Profil bearbeiten') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Gehe auf die Seite "Dozenten" und suche nach deinem Dozenten-Profil. Wenn du es nicht findest, kannst du es anlegen.')
}}
</p>
</div>
</a>
</div>
<div class="border-b border-gray-200 dark:border-gray-700">
<a :href="lenses" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">4.</div>
</div>
<div>
<Heading :level="3">{{ __('Kurse anlegen und verwalten') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Gehe auf die Seite "Kurse" und suche nach dem Kurs, den du editieren möchtest. Wenn du den Kurs nicht findest, kannst du ihn anlegen.')
}}
</p>
</div>
</a>
</div>
<div
class="border-r md:border-b-0 border-b border-gray-200 dark:border-gray-700"
>
<a :href="metrics" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">5.</div>
</div>
<div>
<Heading :level="3">{{ __('Termine anlegen und verwalten') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Gehe auf die Seite "Termine" und suche nach dem Termin, den du editieren möchtest. Wenn du den Termin nicht findest, kannst du ihn anlegen.')
}}
</p>
</div>
</a>
</div>
<div
class="md:border-b-0 border-b border-gray-200 dark:border-gray-700"
>
<a :href="cards" class="no-underline flex p-6">
<div class="flex justify-center w-11 flex-shrink-0 mr-6">
<div class="text-4xl text-primary-500 dark:text-primary-600">6.</div>
</div>
<div>
<Heading :level="3">{{ __('Berechtigungen') }}</Heading>
<p class="leading-normal mt-3">
{{
__('Wenn Buttons zur Bearbeitung fehlen, dann hast du nicht die nötigen Berechtigungen. Melde dich bei einem der Admins.')
}}
</p>
</div>
</a>
</div>
</div>
</Card>
</div>
</div>
</template>
<script>
export default {
name: 'Help',
props: {
card: Object,
},
methods: {
link (path) {
return `https://nova.laravel.com/docs/${this.version}/${path}`
},
},
computed: {
resources () {
return this.link('resources')
},
actions () {
return this.link('actions/defining-actions.html')
},
filters () {
return this.link('filters/defining-filters.html')
},
lenses () {
return this.link('lenses/defining-lenses.html')
},
metrics () {
return this.link('metrics/defining-metrics.html')
},
cards () {
return this.link('customization/cards.html')
},
version () {
const parts = Nova.config('version')
.split('.')
parts.splice(-2)
return `${parts}.0`
},
},
}
</script>

View File

@@ -0,0 +1,19 @@
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Card API Routes
|--------------------------------------------------------------------------
|
| Here is where you may register API routes for your card. These routes
| are loaded by the ServiceProvider of your card. You're free to add
| as many additional routes to this file as your card may require.
|
*/
// Route::get('/endpoint', function (Request $request) {
// //
// });

View File

@@ -0,0 +1,54 @@
<?php
namespace Nova\Start;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Laravel\Nova\Events\ServingNova;
use Laravel\Nova\Nova;
class CardServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->app->booted(function () {
$this->routes();
});
Nova::serving(function (ServingNova $event) {
Nova::script('start', __DIR__.'/../dist/js/card.js');
Nova::style('start', __DIR__.'/../dist/css/card.css');
});
}
/**
* Register the card's routes.
*
* @return void
*/
protected function routes()
{
if ($this->app->routesAreCached()) {
return;
}
Route::middleware(['nova'])
->prefix('nova-vendor/start')
->group(__DIR__.'/../routes/api.php');
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Nova\Start;
use Laravel\Nova\Card;
class Start extends Card
{
/**
* The width of the card (1/3, 1/2, or full).
*
* @var string
*/
public $width = 'full';
/**
* Get the component name for the element.
*
* @return string
*/
public function component()
{
return 'start';
}
}

View File

@@ -0,0 +1,10 @@
let mix = require('laravel-mix')
require('./nova.mix')
mix
.setPublicPath('dist')
.js('resources/js/card.js', 'js')
.vue({ version: 3 })
.css('resources/css/card.css', 'css')
.nova('nova/start')

View File

@@ -2,7 +2,9 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build" "build": "vite build",
"build-start": "cd nova-components/Start && npm run dev",
"build-start-prod": "cd nova-components/Start && npm run prod"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/forms": "^0.5.2", "@tailwindcss/forms": "^0.5.2",