Compare commits

..

No commits in common. "9e1fe63c333cec7af2663f33e48747e2176aca20" and "4e27dbfe67678a788793b8ef04f5fd9f19c84d2d" have entirely different histories.

17 changed files with 6399 additions and 655 deletions

View File

@ -24,7 +24,7 @@ steps:
- name: node - name: node
image: node:17.9.0-slim image: node:17.9.0-slim
commands: commands:
- npm ci && npm run img && npm run prod && rm -R node_modules - npm ci && npm run prod && npm run img && rm -R node_modules
- name: phpunit_tests - name: phpunit_tests
image: php:8.1.6 image: php:8.1.6

10
.gitignore vendored
View File

@ -1,7 +1,11 @@
/node_modules /node_modules
/public/build
/public/sprite.svg
/public/hot /public/hot
/public/storage
/public/js
/public/css
/public/fonts
/public/img
/public/images
/storage/*.key /storage/*.key
/vendor /vendor
.env .env
@ -13,12 +17,14 @@ Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
tags tags
/public/vendor
/storage/temp /storage/temp
# Temporary files # Temporary files
*.swp *.swp
*.swo *.swo
*.swm *.swm
/public/mix-manifest.json
resources/img/sprite.svg resources/img/sprite.svg
/.php-cs-fixer.cache /.php-cs-fixer.cache
/data /data

6853
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,12 +2,12 @@
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "npm run development", "dev": "npm run development",
"development": "npx vite", "development": "npx mix build",
"watch": "npx vite", "watch": "npx mix watch",
"hot": "npx vite", "hot": "npx mix watch --hot",
"prod": "npx vite build", "prod": "npx mix build --production",
"production": "npm run prod", "production": "npm run prod",
"img": "cd resources/img/svg && npx svg-sprite -s --symbol-dest=sprite *.svg && mv sprite/svg/sprite.css.svg ../../../public/sprite.svg && rm -R sprite", "img": "rm -R public/img && cd resources/img/svg && npx svg-sprite -s --symbol-dest=sprite *.svg && mv sprite/svg/sprite.css.svg ../sprite.svg && rm -R sprite && cd ../../../ && cp -R resources/img public/img",
"lint": "eslint \"resources/js/**/*.{js,vue}\"", "lint": "eslint \"resources/js/**/*.{js,vue}\"",
"fix": "eslint \"resources/js/**/*.{js,vue}\" --fix" "fix": "eslint \"resources/js/**/*.{js,vue}\" --fix"
}, },
@ -16,6 +16,7 @@
"axios": "^1.3.4", "axios": "^1.3.4",
"eslint": "^8.9.0", "eslint": "^8.9.0",
"eslint-plugin-vue": "^8.4.1", "eslint-plugin-vue": "^8.4.1",
"laravel-mix": "^6.0.1",
"postcss": "^8.4.6", "postcss": "^8.4.6",
"tailwindcss": "^3.3", "tailwindcss": "^3.3",
"vue": "2.7", "vue": "2.7",
@ -27,9 +28,7 @@
"@inertiajs/inertia": "^0.11.0", "@inertiajs/inertia": "^0.11.0",
"@inertiajs/inertia-vue": "^0.8.0", "@inertiajs/inertia-vue": "^0.8.0",
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.9",
"@vitejs/plugin-vue2": "^2.2.0",
"change-case": "^4.1.2", "change-case": "^4.1.2",
"laravel-vite-plugin": "^0.7.7",
"leaflet": "^1.9.3", "leaflet": "^1.9.3",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"merge": "^2.1.1", "merge": "^2.1.1",
@ -38,7 +37,6 @@
"postcss-import": "^14.0.1", "postcss-import": "^14.0.1",
"svg-sprite": "^2.0.2", "svg-sprite": "^2.0.2",
"v-tooltip": "^2.1.3", "v-tooltip": "^2.1.3",
"vite": "^4.3.8",
"vue-toasted": "^1.1.28", "vue-toasted": "^1.1.28",
"vue2-leaflet": "^2.7.1", "vue2-leaflet": "^2.7.1",
"wnumb": "^1.2.0" "wnumb": "^1.2.0"

10
postcss.config.js vendored
View File

@ -1,10 +0,0 @@
const tailwindcss = require('tailwindcss');
module.exports = {
plugins: {
'postcss-import': {},
'tailwindcss/nesting': {},
'tailwindcss': {},
'autoprefixer': {},
},
};

View File

@ -2,7 +2,8 @@
@import 'tailwindcss/components'; @import 'tailwindcss/components';
@import 'tailwindcss/utilities'; @import 'tailwindcss/utilities';
@import 'base.css'; @layer components {
@import 'base';
@import 'switch'; @import 'switch';
@import 'layout'; @import 'layout';
@import 'buttons'; @import 'buttons';
@ -12,3 +13,4 @@
@import 'form'; @import 'form';
@import 'tooltip'; @import 'tooltip';
@import 'leaflet'; @import 'leaflet';
}

View File

@ -7,6 +7,7 @@
@apply mb-4; @apply mb-4;
} }
.form-control-font { .form-control-font {
@apply leading-tight text-gray-600 text-sm; @apply leading-tight text-gray-600 text-sm;
} }
@ -17,8 +18,7 @@
top: 34px; top: 34px;
transition: color 02s, padding-bottom 02s, font-size 02s, top 02s; transition: color 02s, padding-bottom 02s, font-size 02s, top 02s;
} }
.field-wrapperfocused label-placeholder, .field-wrapperfocused label-placeholder, label-placeholder-focused {
label-placeholder-focused {
top: 0; top: 0;
@apply text-sm text-gray-600; @apply text-sm text-gray-600;
padding-bottom: 10px; padding-bottom: 10px;
@ -42,25 +42,24 @@ label-placeholder-focused {
@apply py-2; @apply py-2;
} }
input, input, select {
select {
outline: none; outline: none;
} }
input[type='date'], input[type="date"],
input[type='datetime-local'], input[type="datetime-local"],
input[type='time'], input[type="time"],
input[type='month'], input[type="month"],
select, select,
input[type='week'] { input[type="week"] {
height: 37px; height: 37px;
&::-webkit-inner-spin-button { &::-webkit-inner-spin-button {
display: none; display: none;
} }
} }
input[type='date']::-webkit-inner-spin-button, input[type="date"]::-webkit-inner-spin-button,
input[type='date']::-webkit-calendar-picker-indicator { input[type="date"]::-webkit-calendar-picker-indicator {
display: none; display: none;
-webkit-appearance: none; -webkit-appearance: none;
} }

View File

@ -82,8 +82,10 @@
} }
&.popover { &.popover {
$color: #f9f9f9;
.popover-inner { .popover-inner {
background: #f9f9f9; background: $color;
color: black; color: black;
padding: 24px; padding: 24px;
border-radius: 5px; border-radius: 5px;
@ -91,7 +93,7 @@
} }
.popover-arrow { .popover-arrow {
border-color: #f9f9f9; border-color: $color;
} }
} }

14
resources/js/app.js vendored
View File

@ -13,11 +13,6 @@ import AppLayout from './layouts/AppLayout.vue';
import hasModule from './mixins/hasModule.js'; import hasModule from './mixins/hasModule.js';
import hasFlash from './mixins/hasFlash.js'; import hasFlash from './mixins/hasFlash.js';
import '../css/app.css';
// ---------------------------------- Assets -----------------------------------
import.meta.glob(['../img/**']);
// ---------------------------------- Plugins ---------------------------------- // ---------------------------------- Plugins ----------------------------------
Vue.use(plugin); Vue.use(plugin);
Vue.use(PortalVue); Vue.use(PortalVue);
@ -30,9 +25,9 @@ Vue.component('SvgSprite', () => import('./components/SvgSprite.js'));
Vue.component('ILink', ILink); Vue.component('ILink', ILink);
// -------------------------------- Components --------------------------------- // -------------------------------- Components ---------------------------------
requireModules(import.meta.glob('./components/form/*.vue'), Vue, 'f'); requireModules(require.context('./components/form', false, /\.vue$/, 'lazy'), Vue, 'f');
requireModules(import.meta.glob('./components/ui/*.vue'), Vue, 'ui'); requireModules(require.context('./components/ui', false, /\.vue$/, 'lazy'), Vue, 'ui');
requireModules(import.meta.glob('./components/page/*.vue', {eager: true}), Vue, 'page'); requireModules(require.context('./components/page', false, /\.vue$/), Vue, 'page');
// ---------------------------------- mixins ----------------------------------- // ---------------------------------- mixins -----------------------------------
Vue.mixin(hasModule); Vue.mixin(hasModule);
@ -44,7 +39,6 @@ const pinia = createPinia();
Inertia.on('start', (event) => window.dispatchEvent(new Event('inertiaStart'))); Inertia.on('start', (event) => window.dispatchEvent(new Event('inertiaStart')));
let views = import.meta.glob('./views/**/*.vue');
new Vue({ new Vue({
pinia, pinia,
render: (h) => render: (h) =>
@ -52,7 +46,7 @@ new Vue({
props: { props: {
initialPage: JSON.parse(el.dataset.page), initialPage: JSON.parse(el.dataset.page),
resolveComponent: async (name) => { resolveComponent: async (name) => {
var page = (await views[`./views/${name}.vue`]()).default; var page = (await import(`./views/${name}`)).default;
if (page.layout === undefined) { if (page.layout === undefined) {
page.layout = AppLayout; page.layout = AppLayout;

View File

@ -1,25 +1,17 @@
export default { export default {
props: { props: {
src: {required: true, type: String}, src: { required: true, type: String }
}, },
render: function(createElement) { render: function(createElement) {
var attr = this.$attrs.class ? this.$attrs.class : ''; var attr = this.$attrs.class ? this.$attrs.class : '';
return createElement( return createElement('svg', {
'svg', class: attr + ' fill-current'
{ }, [
class: attr + ' fill-current', createElement('use', {
}, 'attrs': {
[ 'xlink:href': `/img/sprite.svg#${this.$props.src}`
createElement( }
'use', }, '')
{ ] );
attrs: { }
'xlink:href': `/sprite.svg#${this.$props.src}`,
},
},
''
),
]
);
},
}; };

View File

@ -1,9 +1,11 @@
import {paramCase} from 'change-case'; import {paramCase} from 'change-case';
export default function (context, Vue, prefix) { export default function (context, Vue, prefix) {
for (const file in context) { var isAsync = context.name === 'webpackAsyncContext';
let componentName = paramCase(`${prefix}${file.replace(/^.*\/(.*?)\.vue$/g, '$1')}`);
Vue.component(componentName, typeof context[file] === 'function' ? context[file] : context[file].default); context.keys().forEach((file) => {
} let componentName = paramCase(`${prefix}${file.replace(/^\.\/(.*?)\.vue$/g, '$1')}`);
Vue.component(componentName, isAsync ? () => context(file) : context(file).default);
});
} }

View File

@ -2,7 +2,7 @@
<form @submit.prevent="submit"> <form @submit.prevent="submit">
<div class="h-24 p-6 md:px-10 bg-primary-800 flex justify-between items-center w-full"> <div class="h-24 p-6 md:px-10 bg-primary-800 flex justify-between items-center w-full">
<span class="text-primary-500 text-xl">Login</span> <span class="text-primary-500 text-xl">Login</span>
<img src="../../img/dpsg.gif" class="w-24" /> <img src="/img/dpsg.gif" class="w-24" />
</div> </div>
<div class="p-6 md:p-10 grid gap-5"> <div class="p-6 md:p-10 grid gap-5">
<f-text id="email" label="E-Mail-Adresse" v-model="values.email"></f-text> <f-text id="email" label="E-Mail-Adresse" v-model="values.email"></f-text>
@ -13,7 +13,7 @@
</template> </template>
<script> <script>
import FullLayout from '../layouts/FullLayout.vue'; import FullLayout from '../layouts/FullLayout';
export default { export default {
layout: FullLayout, layout: FullLayout,

View File

@ -16,7 +16,7 @@ export default {
}, },
components: { components: {
'VBlock': () => import('./VBlock.vue'), 'VBlock': () => import('./VBlock'),
'age-group-count': () => import('./AgeGroupCount.vue'), 'age-group-count': () => import('./AgeGroupCount.vue'),
'efz-pending': () => import('./EfzPending.vue'), 'efz-pending': () => import('./EfzPending.vue'),
'ps-pending': () => import('./PsPending.vue'), 'ps-pending': () => import('./PsPending.vue'),

View File

@ -95,15 +95,15 @@ export default {
}, },
components: { components: {
stamm: () => import(/* webpackChunkName: "member" */ './boxes/Stamm.vue'), stamm: () => import(/* webpackChunkName: "member" */ './boxes/Stamm'),
kontakt: () => import(/* webpackChunkName: "member" */ './boxes/Kontakt.vue'), kontakt: () => import(/* webpackChunkName: "member" */ './boxes/Kontakt'),
prae: () => import(/* webpackChunkName: "member" */ './boxes/Prae.vue'), prae: () => import(/* webpackChunkName: "member" */ './boxes/Prae'),
courses: () => import(/* webpackChunkName: "member" */ './boxes/Courses.vue'), courses: () => import(/* webpackChunkName: "member" */ './boxes/Courses'),
system: () => import(/* webpackChunkName: "member" */ './boxes/System.vue'), system: () => import(/* webpackChunkName: "member" */ './boxes/System'),
payments: () => import(/* webpackChunkName: "member" */ './boxes/Payments.vue'), payments: () => import(/* webpackChunkName: "member" */ './boxes/Payments'),
memberships: () => import(/* webpackChunkName: "member" */ './boxes/Memberships.vue'), memberships: () => import(/* webpackChunkName: "member" */ './boxes/Memberships'),
vmap: () => import(/* webpackChunkName: "member" */ './boxes/Vmap.vue'), vmap: () => import(/* webpackChunkName: "member" */ './boxes/Vmap'),
tabs: () => import(/* webpackChunkName: "member" */ './Tabs.vue'), tabs: () => import(/* webpackChunkName: "member" */ './Tabs'),
}, },
created() { created() {

View File

@ -153,9 +153,9 @@ export default {
MemberMemberships, MemberMemberships,
MemberPayments, MemberPayments,
MemberCourses, MemberCourses,
'age-groups': () => import('./AgeGroups.vue'), 'age-groups': () => import(/* webpackChunkName: "member" */ './AgeGroups'),
'tags': () => import('./Tags.vue'), 'tags': () => import(/* webpackChunkName: "member" */ './Tags'),
'actions': () => import('./index/Actions.vue'), 'actions': () => import(/* webpackChunkName: "member" */ './index/Actions'),
}, },
methods: { methods: {

View File

@ -4,7 +4,8 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<meta name="socketport" content="{{env('SOCKET_PORT')}}" /> <meta name="socketport" content="{{env('SOCKET_PORT')}}" />
@vite('resources/js/app.js') <link href="{{ mix('/css/app.css') }}" rel="stylesheet" />
<script src="{{ mix('/js/app.js') }}" defer></script>
</head> </head>
<body class="min-h-full flex flex-col"> <body class="min-h-full flex flex-col">
@inertia @inertia

27
vite.config.js vendored
View File

@ -1,27 +0,0 @@
import {defineConfig} from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue2';
export default defineConfig({
plugins: [
laravel(['resources/js/app.js']),
vue({
template: {
transformAssetUrls: {
// The Vue plugin will re-write asset URLs, when referenced
// in Single File Components, to point to the Laravel web
// server. Setting this to `null` allows the Laravel plugin
// to instead re-write asset URLs to point to the Vite
// server instead.
base: null,
// The Vue plugin will parse absolute URLs and treat them
// as absolute paths to files on disk. Setting this to
// `false` will leave absolute URLs un-touched so they can
// reference assets in the public directory as expected.
includeAbsolute: false,
},
},
}),
],
});