WIP: Implement admin CRUD
This commit is contained in:
@@ -0,0 +1,27 @@
|
|||||||
|
import { Controller } from '@hotwired/stimulus'
|
||||||
|
|
||||||
|
export default class extends Controller {
|
||||||
|
|
||||||
|
static classes = ['closed', 'iconClosed', 'iconExpanded']
|
||||||
|
static targets = ['submenu', 'button', 'icon']
|
||||||
|
static values = { expanded: Boolean }
|
||||||
|
|
||||||
|
toggleSubmenu() {
|
||||||
|
this.expandedValue = !this.expandedValue
|
||||||
|
}
|
||||||
|
|
||||||
|
expandedValueChanged(expanded) {
|
||||||
|
this.submenuTarget.classList.toggle(this.closedClass, false === expanded)
|
||||||
|
this.buttonTarget.setAttribute('aria-expanded', expanded)
|
||||||
|
if (false === this.hasIconTarget) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (true === expanded) {
|
||||||
|
this.iconTarget.classList.add(...this.iconExpandedClasses)
|
||||||
|
this.iconTarget.classList.remove(...this.iconClosedClasses)
|
||||||
|
} else {
|
||||||
|
this.iconTarget.classList.add(...this.iconClosedClasses)
|
||||||
|
this.iconTarget.classList.remove(...this.iconExpandedClasses)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -141,6 +141,10 @@
|
|||||||
<symbol id="icon-folder" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
|
<symbol id="icon-folder" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
|
||||||
<path d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</symbol>
|
</symbol>
|
||||||
|
<symbol id="icon-bus" fill="currentColor" stroke="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||||
|
<!-- Font Awesome Pro 5.15.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) -->
|
||||||
|
<path d="M488 128h-8V80c0-44.8-99.2-80-224-80S32 35.2 32 80v48h-8c-13.25 0-24 10.74-24 24v80c0 13.25 10.75 24 24 24h8v160c0 17.67 14.33 32 32 32v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h192v32c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32v-32h6.4c16 0 25.6-12.8 25.6-25.6V256h8c13.25 0 24-10.75 24-24v-80c0-13.26-10.75-24-24-24zM112 400c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zm16-112c-17.67 0-32-14.33-32-32V128c0-17.67 14.33-32 32-32h256c17.67 0 32 14.33 32 32v128c0 17.67-14.33 32-32 32H128zm272 112c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z"/>
|
||||||
|
</symbol>
|
||||||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||||
<symbol id="icon-spinner" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="currentColor">
|
<symbol id="icon-spinner" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="currentColor">
|
||||||
<g fill="none" fill-rule="evenodd" stroke-width="2">
|
<g fill="none" fill-rule="evenodd" stroke-width="2">
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
@@ -1,5 +1,5 @@
|
|||||||
@import "components/autocomplete.css";
|
@import "components/autocomplete.css";
|
||||||
@import "components/button.css";
|
@import "components/button.css";
|
||||||
|
@import "components/datatable.css";
|
||||||
@import "components/datepicker.css";
|
@import "components/datepicker.css";
|
||||||
@import "components/menu.css";
|
|
||||||
@import "components/toast.css";
|
@import "components/toast.css";
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
.btn {
|
.btn {
|
||||||
@apply inline-flex justify-center rounded-lg text-sm uppercase font-semibold py-2.5 px-4 bg-primary text-white hover:bg-primary/80 w-full shadow-md;
|
@apply inline-flex justify-center rounded-lg text-sm uppercase font-semibold py-2.5 px-4 bg-primary text-white hover:bg-primary/80 shadow-md;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn--secondary {
|
.btn--secondary {
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
.data-table-wrapper {
|
||||||
|
@apply overflow-x-auto mb-8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-table-wrapper__inner {
|
||||||
|
@apply align-middle inline-block min-w-full overflow-hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
@apply min-w-full;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody {
|
||||||
|
@apply bg-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr {
|
||||||
|
@apply border border-gray-300;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
@apply px-4 py-2 bg-gray-200 text-left text-sm xl:text-base leading-4 font-bold text-primary align-top;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
@apply px-4 py-2 text-sm leading-5 align-top;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
table.horizontal td {
|
||||||
|
@apply py-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-table tbody tr {
|
||||||
|
@apply hover:bg-gray-100;
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
.menu--header {
|
|
||||||
@apply flex items-center space-x-4 h-8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu--main {
|
|
||||||
@apply flex flex-col divide-y divide-gray-200;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu--main > li {
|
|
||||||
@apply py-4 first:pt-0 last:pb-0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu--mobile {
|
|
||||||
@apply flex-col space-x-0 h-auto divide-y divide-gray-200;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu--mobile li {
|
|
||||||
@apply py-4 w-full;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu a,
|
|
||||||
.menu div {
|
|
||||||
@apply uppercase hover:text-slate-700 text-slate-900 text-sm lg:text-base;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu--mobile a {
|
|
||||||
@apply text-lg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu ul {
|
|
||||||
@apply pl-7 pt-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu ul a {
|
|
||||||
@apply text-sm;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu .current > a,
|
|
||||||
.menu .active > a {
|
|
||||||
@apply text-slate-900 font-bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu .icon-link,
|
|
||||||
.menu .icon-section {
|
|
||||||
@apply flex items-center space-x-2;
|
|
||||||
}
|
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
"doctrine/doctrine-migrations-bundle": "^3.2",
|
"doctrine/doctrine-migrations-bundle": "^3.2",
|
||||||
"doctrine/orm": "^2.15",
|
"doctrine/orm": "^2.15",
|
||||||
"knplabs/knp-menu-bundle": "^3.2",
|
"knplabs/knp-menu-bundle": "^3.2",
|
||||||
|
"knplabs/knp-paginator-bundle": "^6.2",
|
||||||
"liip/imagine-bundle": "^2.11",
|
"liip/imagine-bundle": "^2.11",
|
||||||
"nesbot/carbon": "^2.70",
|
"nesbot/carbon": "^2.70",
|
||||||
"oneup/uploader-bundle": "^4.0",
|
"oneup/uploader-bundle": "^4.0",
|
||||||
|
|||||||
Generated
+161
-1
@@ -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": "05df8d6ad31865116a5ac469c6e03b20",
|
"content-hash": "55a86e3af41172ce63979c655a409640",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "doctrine/cache",
|
"name": "doctrine/cache",
|
||||||
@@ -1448,6 +1448,92 @@
|
|||||||
},
|
},
|
||||||
"time": "2023-06-07T14:49:52+00:00"
|
"time": "2023-06-07T14:49:52+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "knplabs/knp-components",
|
||||||
|
"version": "v4.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/KnpLabs/knp-components.git",
|
||||||
|
"reference": "1f6560cc1247c8fe7ba75fe4f80f16ffcc9379a0"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/KnpLabs/knp-components/zipball/1f6560cc1247c8fe7ba75fe4f80f16ffcc9379a0",
|
||||||
|
"reference": "1f6560cc1247c8fe7ba75fe4f80f16ffcc9379a0",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8.0",
|
||||||
|
"symfony/event-dispatcher-contracts": "^3.0"
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"doctrine/dbal": "<3.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"doctrine/mongodb-odm": "^2.4",
|
||||||
|
"doctrine/orm": "^2.12",
|
||||||
|
"doctrine/phpcr-odm": "^1.6",
|
||||||
|
"ext-pdo_sqlite": "*",
|
||||||
|
"jackalope/jackalope-doctrine-dbal": "^1.8",
|
||||||
|
"phpunit/phpunit": "^9.5",
|
||||||
|
"propel/propel1": "^1.7",
|
||||||
|
"ruflin/elastica": "^7.0",
|
||||||
|
"solarium/solarium": "^6.0",
|
||||||
|
"symfony/http-foundation": "^5.4 || ^6.0",
|
||||||
|
"symfony/http-kernel": "^5.4 || ^6.0",
|
||||||
|
"symfony/property-access": "^5.4 || ^6.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"doctrine/common": "to allow usage pagination with Doctrine ArrayCollection",
|
||||||
|
"doctrine/mongodb-odm": "to allow usage pagination with Doctrine ODM MongoDB",
|
||||||
|
"doctrine/orm": "to allow usage pagination with Doctrine ORM",
|
||||||
|
"doctrine/phpcr-odm": "to allow usage pagination with Doctrine ODM PHPCR",
|
||||||
|
"propel/propel1": "to allow usage pagination with Propel ORM",
|
||||||
|
"ruflin/elastica": "to allow usage pagination with ElasticSearch Client",
|
||||||
|
"solarium/solarium": "to allow usage pagination with Solarium Client",
|
||||||
|
"symfony/http-foundation": "to retrieve arguments from Request",
|
||||||
|
"symfony/property-access": "to allow sorting arrays"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "4.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Knp\\Component\\": "src/Knp/Component"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "KnpLabs Team",
|
||||||
|
"homepage": "https://knplabs.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://github.com/KnpLabs/knp-components/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Knplabs component library",
|
||||||
|
"homepage": "https://github.com/KnpLabs/knp-components",
|
||||||
|
"keywords": [
|
||||||
|
"components",
|
||||||
|
"knp",
|
||||||
|
"knplabs",
|
||||||
|
"pager",
|
||||||
|
"paginator"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/KnpLabs/knp-components/issues",
|
||||||
|
"source": "https://github.com/KnpLabs/knp-components/tree/v4.2.0"
|
||||||
|
},
|
||||||
|
"time": "2023-05-09T10:21:13+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "knplabs/knp-menu",
|
"name": "knplabs/knp-menu",
|
||||||
"version": "v3.4.0",
|
"version": "v3.4.0",
|
||||||
@@ -1585,6 +1671,80 @@
|
|||||||
},
|
},
|
||||||
"time": "2021-10-24T07:53:34+00:00"
|
"time": "2021-10-24T07:53:34+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "knplabs/knp-paginator-bundle",
|
||||||
|
"version": "v6.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/KnpLabs/KnpPaginatorBundle.git",
|
||||||
|
"reference": "8da698f0856b1d9c9c02dcacbfc382c5c9440c80"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/KnpLabs/KnpPaginatorBundle/zipball/8da698f0856b1d9c9c02dcacbfc382c5c9440c80",
|
||||||
|
"reference": "8da698f0856b1d9c9c02dcacbfc382c5c9440c80",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"knplabs/knp-components": "^4.1",
|
||||||
|
"php": "^8.0",
|
||||||
|
"symfony/config": "^6.0",
|
||||||
|
"symfony/dependency-injection": "^6.0",
|
||||||
|
"symfony/event-dispatcher": "^6.0",
|
||||||
|
"symfony/http-foundation": "^6.0",
|
||||||
|
"symfony/http-kernel": "^6.0",
|
||||||
|
"symfony/routing": "^6.0",
|
||||||
|
"symfony/translation": "^6.0",
|
||||||
|
"twig/twig": "^3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpstan/phpstan": "^1.9",
|
||||||
|
"phpunit/phpunit": "^9.5",
|
||||||
|
"symfony/expression-language": "^6.0",
|
||||||
|
"symfony/templating": "^6.0"
|
||||||
|
},
|
||||||
|
"type": "symfony-bundle",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "5.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Knp\\Bundle\\PaginatorBundle\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "KnpLabs Team",
|
||||||
|
"homepage": "https://knplabs.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://github.com/KnpLabs/KnpPaginatorBundle/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Paginator bundle for Symfony to automate pagination and simplify sorting and other features",
|
||||||
|
"homepage": "https://github.com/KnpLabs/KnpPaginatorBundle",
|
||||||
|
"keywords": [
|
||||||
|
"bundle",
|
||||||
|
"knp",
|
||||||
|
"knplabs",
|
||||||
|
"pager",
|
||||||
|
"pagination",
|
||||||
|
"paginator",
|
||||||
|
"symfony"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/KnpLabs/KnpPaginatorBundle/issues",
|
||||||
|
"source": "https://github.com/KnpLabs/KnpPaginatorBundle/tree/v6.2.0"
|
||||||
|
},
|
||||||
|
"time": "2023-03-25T06:51:40+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "liip/imagine-bundle",
|
"name": "liip/imagine-bundle",
|
||||||
"version": "2.11.0",
|
"version": "2.11.0",
|
||||||
|
|||||||
@@ -16,4 +16,5 @@ return [
|
|||||||
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
|
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
|
||||||
Oneup\UploaderBundle\OneupUploaderBundle::class => ['all' => true],
|
Oneup\UploaderBundle\OneupUploaderBundle::class => ['all' => true],
|
||||||
Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true],
|
Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true],
|
||||||
|
Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
knp_paginator:
|
||||||
|
default_options:
|
||||||
|
page_name: page
|
||||||
|
sort_field_name: sort
|
||||||
|
sort_direction_name: direction
|
||||||
|
distinct: true
|
||||||
|
filter_field_name: filterField
|
||||||
|
filter_value_name: filterValue
|
||||||
|
template:
|
||||||
|
pagination: 'paginator/sliding.html.twig'
|
||||||
|
sortable: 'paginator/sortable_link.html.twig'
|
||||||
@@ -60,43 +60,25 @@ services:
|
|||||||
arguments:
|
arguments:
|
||||||
$factory: '@knp_menu.factory'
|
$factory: '@knp_menu.factory'
|
||||||
tags:
|
tags:
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createHeaderMenu
|
|
||||||
alias: admin_header
|
|
||||||
- name: knp_menu.menu_builder
|
- name: knp_menu.menu_builder
|
||||||
method: createMainMenu
|
method: createMainMenu
|
||||||
alias: admin_main
|
alias: admin_main
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createMobileMenu
|
|
||||||
alias: admin_mobile
|
|
||||||
|
|
||||||
App\Menu\ManagerMenuBuilder:
|
App\Menu\ManagerMenuBuilder:
|
||||||
arguments:
|
arguments:
|
||||||
$factory: '@knp_menu.factory'
|
$factory: '@knp_menu.factory'
|
||||||
tags:
|
tags:
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createHeaderMenu
|
|
||||||
alias: manager_header
|
|
||||||
- name: knp_menu.menu_builder
|
- name: knp_menu.menu_builder
|
||||||
method: createMainMenu
|
method: createMainMenu
|
||||||
alias: manager_main
|
alias: manager_main
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createMobileMenu
|
|
||||||
alias: manager_mobile
|
|
||||||
|
|
||||||
App\Menu\TeamerMenuBuilder:
|
App\Menu\TeamerMenuBuilder:
|
||||||
arguments:
|
arguments:
|
||||||
$factory: '@knp_menu.factory'
|
$factory: '@knp_menu.factory'
|
||||||
tags:
|
tags:
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createHeaderMenu
|
|
||||||
alias: teamer_header
|
|
||||||
- name: knp_menu.menu_builder
|
- name: knp_menu.menu_builder
|
||||||
method: createMainMenu
|
method: createMainMenu
|
||||||
alias: teamer_main
|
alias: teamer_main
|
||||||
- name: knp_menu.menu_builder
|
|
||||||
method: createMobileMenu
|
|
||||||
alias: teamer_mobile
|
|
||||||
|
|
||||||
App\Service\Upload\UploadHandler:
|
App\Service\Upload\UploadHandler:
|
||||||
arguments:
|
arguments:
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\System\JobProfile;
|
||||||
|
|
||||||
|
use App\Entity\JobProfile;
|
||||||
|
use App\Form\JobProfileType;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class CreateController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly LoggerInterface $logger
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/admin/system/job-profile/create', name: 'app_admin_system_job_profile_create')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(Request $request): Response
|
||||||
|
{
|
||||||
|
$jobProfile = new JobProfile();
|
||||||
|
$form = $this->createForm(JobProfileType::class, $jobProfile);
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
|
$this->entityManager->persist($jobProfile);
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
$this->addFlash('success', 'Das Job-Profil wurde angelegt');
|
||||||
|
$this->logger->info('Create Job profile', [
|
||||||
|
'job_profile' => $jobProfile->getName(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_admin_system_job_profile_index');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('admin/system/job_profile/create.html.twig', [
|
||||||
|
'form' => $form
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\System\JobProfile;
|
||||||
|
|
||||||
|
use App\Repository\JobProfileRepository;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class IndexController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(private readonly JobProfileRepository $jobProfileRepository)
|
||||||
|
{}
|
||||||
|
|
||||||
|
#[Route('/admin/system/job-profile', name: 'app_admin_system_job_profile_index')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(): Response
|
||||||
|
{
|
||||||
|
$jobProfiles = $this
|
||||||
|
->jobProfileRepository
|
||||||
|
->getList()
|
||||||
|
;
|
||||||
|
|
||||||
|
return $this->render('admin/system/job_profile/index.html.twig', [
|
||||||
|
'jobProfiles' => $jobProfiles,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\System\Training;
|
||||||
|
|
||||||
|
use App\Entity\Training;
|
||||||
|
use App\Form\TrainingType;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class CreateController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly LoggerInterface $logger
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/admin/system/training/create', name: 'app_admin_system_training_create')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(Request $request): Response
|
||||||
|
{
|
||||||
|
$training = new Training();
|
||||||
|
$form = $this->createForm(TrainingType::class, $training);
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
|
$this->entityManager->persist($training);
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
$this->addFlash('success', 'Die Fortbildung wurde angelegt');
|
||||||
|
$this->logger->info('Create training', [
|
||||||
|
'training' => $training->getName(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_admin_system_training_index');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('admin/system/training/create.html.twig', [
|
||||||
|
'form' => $form
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\System\Training;
|
||||||
|
|
||||||
|
use App\Entity\Training;
|
||||||
|
use App\Form\TrainingType;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class EditController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EntityManagerInterface $entityManager,
|
||||||
|
private readonly LoggerInterface $logger
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/admin/system/training/edit/{id}', name: 'app_admin_system_training_edit')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(Training $training, Request $request): Response
|
||||||
|
{
|
||||||
|
$form = $this->createForm(TrainingType::class, $training);
|
||||||
|
$form->handleRequest($request);
|
||||||
|
|
||||||
|
if ($form->isSubmitted() && $form->isValid()) {
|
||||||
|
$this->entityManager->flush();
|
||||||
|
|
||||||
|
$this->addFlash('success', 'Die Fortbildung wurde aktualisiert');
|
||||||
|
$this->logger->info('Update training', [
|
||||||
|
'training' => $training->getName(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $this->redirectToRoute('app_admin_system_training_index');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('admin/system/training/edit.html.twig', [
|
||||||
|
'form' => $form
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\System\Training;
|
||||||
|
|
||||||
|
use App\Repository\TrainingRepository;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class IndexController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(private readonly TrainingRepository $trainingRepository)
|
||||||
|
{}
|
||||||
|
|
||||||
|
#[Route('/admin/system/training', name: 'app_admin_system_training_index')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(): Response
|
||||||
|
{
|
||||||
|
$trainings = $this
|
||||||
|
->trainingRepository
|
||||||
|
->getList()
|
||||||
|
;
|
||||||
|
|
||||||
|
return $this->render('admin/system/training/index.html.twig', [
|
||||||
|
'trainings' => $trainings,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller\Admin\Teamer;
|
||||||
|
|
||||||
|
use App\Repository\TeamerRepository;
|
||||||
|
use Knp\Component\Pager\PaginatorInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
use Symfony\Component\Security\Http\Attribute\IsGranted;
|
||||||
|
|
||||||
|
class IndexController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly TeamerRepository $teamerRepository,
|
||||||
|
private readonly PaginatorInterface $paginator
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Route('/admin/teamer', name: 'app_admin_teamer_index')]
|
||||||
|
#[IsGranted('ROLE_ADMIN')]
|
||||||
|
public function index(Request $request): Response
|
||||||
|
{
|
||||||
|
$query = $this
|
||||||
|
->teamerRepository
|
||||||
|
->getListQuery()
|
||||||
|
;
|
||||||
|
|
||||||
|
$pagination = $this->paginator->paginate(
|
||||||
|
$query,
|
||||||
|
$request->query->getInt('page', 1),
|
||||||
|
10,
|
||||||
|
[
|
||||||
|
'defaultSortFieldName' => 'teamer.lastName',
|
||||||
|
'defaultSortDirection' => 'asc',
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->render('admin/teamer/index.html.twig', [
|
||||||
|
'pagination' => $pagination,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,6 +13,6 @@ class AvailabilitiesController extends AbstractController
|
|||||||
#[IsGranted('ROLE_TEAMER')]
|
#[IsGranted('ROLE_TEAMER')]
|
||||||
public function index(): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('');
|
return $this->render('teamer/profile/availabilities.html.twig');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,10 +71,10 @@ class IndexController extends AbstractController
|
|||||||
'user' => $user->getUserIdentifier(),
|
'user' => $user->getUserIdentifier(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $this->redirectToRoute('app_teamer_profile');
|
return $this->redirectToRoute('app_teamer_profile_index');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('teamer/profile.html.twig', [
|
return $this->render('teamer/profile/index.html.twig', [
|
||||||
'form' => $form->createView(),
|
'form' => $form->createView(),
|
||||||
'teamer' => $teamer,
|
'teamer' => $teamer,
|
||||||
'errors' => $errors,
|
'errors' => $errors,
|
||||||
|
|||||||
@@ -13,6 +13,6 @@ class SkillsController extends AbstractController
|
|||||||
#[IsGranted('ROLE_TEAMER')]
|
#[IsGranted('ROLE_TEAMER')]
|
||||||
public function index(): Response
|
public function index(): Response
|
||||||
{
|
{
|
||||||
return $this->render('');
|
return $this->render('teamer/profile/skills.html.twig');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ use App\Repository\JobProfileRepository;
|
|||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
use Symfony\Component\Uid\Uuid;
|
use Symfony\Component\Uid\Uuid;
|
||||||
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: JobProfileRepository::class)]
|
#[ORM\Entity(repositoryClass: JobProfileRepository::class)]
|
||||||
class JobProfile implements BlameableEntityInterface, TimestampableEntityInterface
|
class JobProfile implements BlameableEntityInterface, TimestampableEntityInterface
|
||||||
@@ -24,6 +25,7 @@ class JobProfile implements BlameableEntityInterface, TimestampableEntityInterfa
|
|||||||
private string $uuid;
|
private string $uuid;
|
||||||
|
|
||||||
#[ORM\Column(length: 255)]
|
#[ORM\Column(length: 255)]
|
||||||
|
#[Assert\NotBlank(message: 'Bitte gib die Bezeichnung an')]
|
||||||
private ?string $name = null;
|
private ?string $name = null;
|
||||||
|
|
||||||
#[ORM\ManyToOne]
|
#[ORM\ManyToOne]
|
||||||
|
|||||||
@@ -111,6 +111,9 @@ class Teamer implements TimestampableEntityInterface
|
|||||||
#[ORM\OneToMany(mappedBy: 'teamer', targetEntity: Disposition::class)]
|
#[ORM\OneToMany(mappedBy: 'teamer', targetEntity: Disposition::class)]
|
||||||
private Collection $dispositions;
|
private Collection $dispositions;
|
||||||
|
|
||||||
|
#[ORM\OneToOne(mappedBy: 'teamer')]
|
||||||
|
private ?User $user = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->uuid = Uuid::v4();
|
$this->uuid = Uuid::v4();
|
||||||
@@ -600,4 +603,16 @@ class Teamer implements TimestampableEntityInterface
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getUser(): ?User
|
||||||
|
{
|
||||||
|
return $this->user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setUser(?User $user): static
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ class User implements UserInterface, TimestampableEntityInterface
|
|||||||
#[ORM\Column(nullable: true)]
|
#[ORM\Column(nullable: true)]
|
||||||
private ?\DateTimeImmutable $lastLoginAt = null;
|
private ?\DateTimeImmutable $lastLoginAt = null;
|
||||||
|
|
||||||
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
|
#[ORM\OneToOne(inversedBy: 'user', cascade: ['persist', 'remove'])]
|
||||||
private ?Teamer $teamer = null;
|
private ?Teamer $teamer = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Form;
|
||||||
|
|
||||||
|
use App\Entity\JobProfile;
|
||||||
|
use App\Entity\License;
|
||||||
|
use App\Entity\Training;
|
||||||
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
class JobProfileType extends AbstractType
|
||||||
|
{
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('name', TextType::class, [
|
||||||
|
'label' => 'Bezeichnung',
|
||||||
|
])
|
||||||
|
->add('requiredTraining', EntityType::class, [
|
||||||
|
'label' => 'vorausgesetzte Fortbildung',
|
||||||
|
'required' => false,
|
||||||
|
'placeholder' => 'keine',
|
||||||
|
'class' => Training::class,
|
||||||
|
'choice_label' => 'name',
|
||||||
|
'query_builder' => function (EntityRepository $repository) {
|
||||||
|
return $repository->createQueryBuilder('job_profile')
|
||||||
|
->orderBy('job_profile.name', 'ASC')
|
||||||
|
;
|
||||||
|
},
|
||||||
|
])
|
||||||
|
->add('requiredLicenses', ChoiceType::class, [
|
||||||
|
'label' => 'vorausgesetzte Lizenzen',
|
||||||
|
'required' => false,
|
||||||
|
'expanded' => true,
|
||||||
|
'multiple' => true,
|
||||||
|
'choices' => [
|
||||||
|
'Skilehrer*in' => License::TYPE_SKI,
|
||||||
|
'Snowboardlehrer*in' => License::TYPE_SNOWBOARD,
|
||||||
|
],
|
||||||
|
])
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
|
{
|
||||||
|
$resolver->setDefaults([
|
||||||
|
'data_class' => JobProfile::class,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Form;
|
||||||
|
|
||||||
|
use App\Entity\Training;
|
||||||
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
class TrainingType extends AbstractType
|
||||||
|
{
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('name', TextType::class, [
|
||||||
|
'label' => 'Bezeichnung',
|
||||||
|
])
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configureOptions(OptionsResolver $resolver): void
|
||||||
|
{
|
||||||
|
$resolver->setDefaults([
|
||||||
|
'data_class' => Training::class,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,17 +20,9 @@ abstract class AbstractMenuBuilder
|
|||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function assertMobile(array $options): bool
|
protected function createRootElement(): ItemInterface
|
||||||
{
|
{
|
||||||
return isset($options['mobile']) && true === (bool) $options['mobile'];
|
return $this->factory->createItem('root');
|
||||||
}
|
|
||||||
|
|
||||||
protected function createRootElement(string $class): ItemInterface
|
|
||||||
{
|
|
||||||
return $this
|
|
||||||
->factory->createItem('root')
|
|
||||||
->setChildrenAttribute('class', $class)
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
|
protected function getDefaultRouteParameters(string $parameter = 'id', string $default = '0'): array
|
||||||
@@ -38,7 +30,40 @@ abstract class AbstractMenuBuilder
|
|||||||
return [$parameter => $this->requestStack->getMainRequest()->get($parameter, $default)];
|
return [$parameter => $this->requestStack->getMainRequest()->get($parameter, $default)];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function addLogoutItem(ItemInterface $menu, bool $isMobile = false): void
|
protected function addAdminItem(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
if ($this->security->isGranted('ROLE_ADMIN')) {
|
||||||
|
$menu
|
||||||
|
->addChild('Adminbereich', ['route' => 'app_admin_index'])
|
||||||
|
->setChildrenAttribute('title', 'Adminbereich')
|
||||||
|
->setExtra('icon', 'user')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addManagerItem(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
if ($this->security->isGranted('ROLE_MANAGER')) {
|
||||||
|
$menu
|
||||||
|
->addChild('Managerbereich', ['route' => 'app_manager_index'])
|
||||||
|
->setChildrenAttribute('title', 'Managerbereich')
|
||||||
|
->setExtra('icon', 'user')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addTeamerItem(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
if ($this->security->isGranted('ROLE_TEAMER')) {
|
||||||
|
$menu
|
||||||
|
->addChild('Teamerbereich', ['route' => 'app_teamer_index'])
|
||||||
|
->setChildrenAttribute('title', 'Teamerbereich')
|
||||||
|
->setExtra('icon', 'user')
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addLogoutItem(ItemInterface $menu): void
|
||||||
{
|
{
|
||||||
$token = $this->security->getToken();
|
$token = $this->security->getToken();
|
||||||
|
|
||||||
@@ -55,19 +80,20 @@ abstract class AbstractMenuBuilder
|
|||||||
'class' => 'icon-link',
|
'class' => 'icon-link',
|
||||||
])
|
])
|
||||||
->setExtra('icon', 'logout')
|
->setExtra('icon', 'logout')
|
||||||
->setExtra('icon_only', false === $isMobile)
|
|
||||||
;
|
;
|
||||||
} else {
|
} else {
|
||||||
$menu
|
$menu
|
||||||
->addChild('Logout', ['route' => 'app_security_logout'])
|
->addChild('Logout', ['route' => 'app_security_logout'])
|
||||||
->setLinkAttributes([
|
->setLinkAttributes([
|
||||||
'title' => 'Logout',
|
'title' => 'Logout',
|
||||||
'class' => 'icon-link',
|
|
||||||
])
|
])
|
||||||
->setExtra('icon', 'logout')
|
->setExtra('icon', 'logout')
|
||||||
->setExtra('icon_only', false === $isMobile)
|
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function addDivider(ItemInterface $menu): void
|
||||||
|
{
|
||||||
|
$menu->addChild('%DIVIDER%');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,25 +6,104 @@ use Knp\Menu\ItemInterface;
|
|||||||
|
|
||||||
class AdminMenuBuilder extends AbstractMenuBuilder
|
class AdminMenuBuilder extends AbstractMenuBuilder
|
||||||
{
|
{
|
||||||
public function createHeaderMenu(array $options): ItemInterface
|
|
||||||
{
|
|
||||||
$menu = $this->createRootElement();
|
|
||||||
$this->addLogoutItem($menu);
|
|
||||||
|
|
||||||
return $menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function createMainMenu(array $options): ItemInterface
|
public function createMainMenu(array $options): ItemInterface
|
||||||
{
|
{
|
||||||
$menu = $this->createRootElement();
|
$menu = $this->createRootElement();
|
||||||
|
|
||||||
return $menu;
|
$menu
|
||||||
}
|
->addChild('Dashboard', ['route' => 'app_admin_index'])
|
||||||
|
->setChildrenAttribute('title', 'Dashboard')
|
||||||
|
->setExtra('icon', 'lab')
|
||||||
|
;
|
||||||
|
|
||||||
public function createMobileMenu(array $options): ItemInterface
|
$menu
|
||||||
{
|
->addChild('Einsatzübersicht', ['route' => 'app_admin_index'])
|
||||||
$menu = $this->createRootElement(true);
|
->setChildrenAttribute('title', 'Einsatzübersicht')
|
||||||
$this->addLogoutItem($menu, true);
|
->setExtra('icon', 'calendar')
|
||||||
|
;
|
||||||
|
|
||||||
|
$menu
|
||||||
|
->addChild('Bewerbungsübersicht', ['route' => 'app_admin_index'])
|
||||||
|
->setChildrenAttribute('title', 'Bewerbungsübersicht')
|
||||||
|
->setExtra('icon', 'mail')
|
||||||
|
;
|
||||||
|
|
||||||
|
$menu
|
||||||
|
->addChild('Dokumentenübersicht', ['route' => 'app_admin_index'])
|
||||||
|
->setChildrenAttribute('title', 'Dokumentenübersicht')
|
||||||
|
->setExtra('icon', 'document')
|
||||||
|
;
|
||||||
|
|
||||||
|
$menu
|
||||||
|
->addChild('Teamerübersicht', ['route' => 'app_admin_teamer_index'])
|
||||||
|
->setChildrenAttribute('title', 'Teamerübersicht')
|
||||||
|
->setExtra('icon', 'users')
|
||||||
|
;
|
||||||
|
|
||||||
|
$systemMenu = $menu
|
||||||
|
->addChild('Einstellungen')
|
||||||
|
->setExtra('icon', 'settings')
|
||||||
|
;
|
||||||
|
$feeMenu = $systemMenu
|
||||||
|
->addChild('Honorare', [
|
||||||
|
'route' => 'app_admin_system_fee_index',
|
||||||
|
'linkAttributes' => [
|
||||||
|
'title' => 'Honorare',
|
||||||
|
],
|
||||||
|
'displayChildren' => false,
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$feeMenu
|
||||||
|
->addChild('Honorar anlegen', [
|
||||||
|
'route' => 'app_admin_system_fee_create',
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$feeMenu
|
||||||
|
->addChild('Honorar bearbeiten', [
|
||||||
|
'route' => 'app_admin_system_fee_edit',
|
||||||
|
'routeParameters' => $this->getDefaultRouteParameters(),
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$trainingMenu = $systemMenu
|
||||||
|
->addChild('Fortbildungen', [
|
||||||
|
'route' => 'app_admin_system_training_index',
|
||||||
|
'linkAttributes' => [
|
||||||
|
'title' => 'Fortbildungen',
|
||||||
|
],
|
||||||
|
'displayChildren' => false,
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$trainingMenu
|
||||||
|
->addChild('Fortbildung anlegen', [
|
||||||
|
'route' => 'app_admin_system_training_create',
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$trainingMenu
|
||||||
|
->addChild('Fortbildung bearbeiten', [
|
||||||
|
'route' => 'app_admin_system_training_edit',
|
||||||
|
'routeParameters' => $this->getDefaultRouteParameters(),
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$jobProfileMenu = $systemMenu
|
||||||
|
->addChild('Job-Profile', [
|
||||||
|
'route' => 'app_admin_system_job_profile_index',
|
||||||
|
'linkAttributes' => [
|
||||||
|
'title' => 'Fortbildungen',
|
||||||
|
],
|
||||||
|
'displayChildren' => false,
|
||||||
|
])
|
||||||
|
;
|
||||||
|
$jobProfileMenu
|
||||||
|
->addChild('Job-Profil anlegen', [
|
||||||
|
'route' => 'app_admin_system_job_profile_create',
|
||||||
|
])
|
||||||
|
;
|
||||||
|
|
||||||
|
$this->addDivider($menu);
|
||||||
|
|
||||||
|
$this->addManagerItem($menu);
|
||||||
|
$this->addTeamerItem($menu);
|
||||||
|
$this->addLogoutItem($menu);
|
||||||
|
|
||||||
return $menu;
|
return $menu;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,27 +6,13 @@ use Knp\Menu\ItemInterface;
|
|||||||
|
|
||||||
class ManagerMenuBuilder extends AbstractMenuBuilder
|
class ManagerMenuBuilder extends AbstractMenuBuilder
|
||||||
{
|
{
|
||||||
public function createHeaderMenu(array $options): ItemInterface
|
|
||||||
{
|
|
||||||
$menu = $this->createRootElement();
|
|
||||||
|
|
||||||
$this->addLogoutItem($menu);
|
|
||||||
|
|
||||||
return $menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function createMainMenu(array $options): ItemInterface
|
public function createMainMenu(array $options): ItemInterface
|
||||||
{
|
{
|
||||||
$menu = $this->createRootElement();
|
$menu = $this->createRootElement();
|
||||||
|
|
||||||
return $menu;
|
$this->addAdminItem($menu);
|
||||||
}
|
$this->addTeamerItem($menu);
|
||||||
|
$this->addLogoutItem($menu);
|
||||||
public function createMobileMenu(array $options): ItemInterface
|
|
||||||
{
|
|
||||||
$menu = $this->createRootElement(true);
|
|
||||||
|
|
||||||
$this->addLogoutItem($menu, true);
|
|
||||||
|
|
||||||
return $menu;
|
return $menu;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,86 +6,81 @@ use Knp\Menu\ItemInterface;
|
|||||||
|
|
||||||
class TeamerMenuBuilder extends AbstractMenuBuilder
|
class TeamerMenuBuilder extends AbstractMenuBuilder
|
||||||
{
|
{
|
||||||
public function createHeaderMenu(array $options): ItemInterface
|
|
||||||
{
|
|
||||||
$menu = $this->createRootElement('menu menu--header');
|
|
||||||
|
|
||||||
$this->addLogoutItem($menu);
|
|
||||||
|
|
||||||
return $menu;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function createMainMenu(array $options): ItemInterface
|
public function createMainMenu(array $options): ItemInterface
|
||||||
{
|
{
|
||||||
$menu = $this->createRootElement('menu menu--main');
|
$menu = $this->createRootElement();
|
||||||
|
|
||||||
|
|
||||||
$menu
|
$menu
|
||||||
->addChild('Einsatzübersicht', ['route' => 'app_teamer_disposition_index'])
|
->addChild('Einsatzübersicht', ['route' => 'app_teamer_index'])
|
||||||
->setLinkAttributes([
|
->setChildrenAttribute('title', 'Einsatzübersicht')
|
||||||
'title' => 'Einsatzübersicht',
|
|
||||||
'class' => 'icon-link',
|
|
||||||
])
|
|
||||||
->setExtra('icon', 'calendar')
|
->setExtra('icon', 'calendar')
|
||||||
->setExtra('icon_only', false)
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
$profileMenu = $menu
|
$profileMenu = $menu
|
||||||
->addChild('Mein Profil')
|
->addChild('Mein Profil')
|
||||||
->setExtra('icon', 'user')
|
->setExtra('icon', 'user')
|
||||||
->setExtra('icon_only', false)
|
->setLinkAttribute('title', 'Mein Profil')
|
||||||
;
|
;
|
||||||
$profileMenu
|
$profileMenu
|
||||||
->addChild('Stammdaten und Foto', ['route' => 'app_teamer_profile_index'])
|
->addChild('Stammdaten und Foto', ['route' => 'app_teamer_profile_index'])
|
||||||
->setLinkAttributes([
|
->setLinkAttribute('title', 'Stammdaten und Foto')
|
||||||
'title' => 'Mein Profil',
|
|
||||||
])
|
|
||||||
;
|
;
|
||||||
$profileMenu
|
$profileMenu
|
||||||
->addChild('Jobprofile & Skills', ['route' => 'app_teamer_profile_skills'])
|
->addChild('Jobprofile & Skills', ['route' => 'app_teamer_profile_skills'])
|
||||||
->setLinkAttributes([
|
->setLinkAttribute('title', 'Jobprofile & Skills')
|
||||||
'title' => 'Jobprofile & Skills',
|
|
||||||
])
|
|
||||||
;
|
;
|
||||||
$profileMenu
|
$profileMenu
|
||||||
->addChild('Meine Verfügbarkeit', ['route' => 'app_teamer_profile_availabilities'])
|
->addChild('Meine Verfügbarkeit', ['route' => 'app_teamer_profile_availabilities'])
|
||||||
->setLinkAttributes([
|
->setLinkAttribute('title', 'Meine Verfügbarkeit')
|
||||||
'title' => 'Meine Verfügbarkeit',
|
|
||||||
])
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
$dispositionMenu = $menu
|
$dispositionMenu = $menu
|
||||||
->addChild('Meine Einsätze')
|
->addChild('Meine Einsätze')
|
||||||
->setExtra('icon', 'calendar')
|
->setExtra('icon', 'bus')
|
||||||
->setExtra('icon_only', false)
|
|
||||||
;
|
;
|
||||||
$dispositionMenu
|
$dispositionMenu
|
||||||
->addChild('Merkliste', ['route' => 'app_teamer_disposition_watchlist'])
|
->addChild('Merkliste', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
->setLinkAttributes([
|
->setLinkAttribute('title', 'Merkliste')
|
||||||
'title' => 'Merkliste',
|
;
|
||||||
])
|
$dispositionMenu
|
||||||
|
->addChild('Offene Bewerbungen', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'Offene Bewerbungen')
|
||||||
|
;
|
||||||
|
$dispositionMenu
|
||||||
|
->addChild('Nächste Einsätze', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'Nächste Einsätze')
|
||||||
|
;
|
||||||
|
$dispositionMenu
|
||||||
|
->addChild('Letzte Einsätze', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'Letzte Einsätze')
|
||||||
|
;
|
||||||
|
$dispositionMenu
|
||||||
|
->addChild('Meine Dokumente', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'Meine Dokumente')
|
||||||
|
;
|
||||||
|
$dispositionMenu
|
||||||
|
->addChild('Mein Feedback', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'Mein Feedback')
|
||||||
;
|
;
|
||||||
|
|
||||||
return $menu;
|
$faqMenu = $menu
|
||||||
}
|
->addChild('FAQ & Kontakt')
|
||||||
|
->setExtra('icon', 'info')
|
||||||
public function createMobileMenu(array $options): ItemInterface
|
;
|
||||||
{
|
$faqMenu
|
||||||
$menu = $this->createRootElement('menu menu--mobile');
|
->addChild('FAQ', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
|
->setLinkAttribute('title', 'FAQ')
|
||||||
$menu
|
;
|
||||||
->addChild('Profil', ['route' => 'app_teamer_profile_index'])
|
$faqMenu
|
||||||
->setLinkAttributes([
|
->addChild('Kontakt', ['route' => 'app_teamer_disposition_watchlist'])
|
||||||
'title' => 'Mein Profil',
|
->setLinkAttribute('title', 'Kontakt')
|
||||||
'class' => 'icon-link',
|
|
||||||
])
|
|
||||||
->setExtra('icon', 'user')
|
|
||||||
->setExtra('icon_only', false)
|
|
||||||
;
|
;
|
||||||
|
|
||||||
$this->addLogoutItem($menu, true);
|
$this->addDivider($menu);
|
||||||
|
|
||||||
|
$this->addAdminItem($menu);
|
||||||
|
$this->addManagerItem($menu);
|
||||||
|
$this->addLogoutItem($menu);
|
||||||
|
|
||||||
return $menu;
|
return $menu;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,46 +21,16 @@ class JobProfileRepository extends ServiceEntityRepository
|
|||||||
parent::__construct($registry, JobProfile::class);
|
parent::__construct($registry, JobProfile::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save(JobProfile $entity, bool $flush = false): void
|
public function getList(): array
|
||||||
{
|
{
|
||||||
$this->getEntityManager()->persist($entity);
|
$qb = $this->createQueryBuilder('job_profile');
|
||||||
|
|
||||||
if ($flush) {
|
return $qb
|
||||||
$this->getEntityManager()->flush();
|
->select('job_profile', 'required_training')
|
||||||
}
|
->leftJoin('job_profile.requiredTraining', 'required_training')
|
||||||
|
->orderBy('job_profile.name', 'ASC')
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function remove(JobProfile $entity, bool $flush = false): void
|
|
||||||
{
|
|
||||||
$this->getEntityManager()->remove($entity);
|
|
||||||
|
|
||||||
if ($flush) {
|
|
||||||
$this->getEntityManager()->flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @return JobProfile[] Returns an array of JobProfile objects
|
|
||||||
// */
|
|
||||||
// public function findByExampleField($value): array
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('j')
|
|
||||||
// ->andWhere('j.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->orderBy('j.id', 'ASC')
|
|
||||||
// ->setMaxResults(10)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public function findOneBySomeField($value): ?JobProfile
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('j')
|
|
||||||
// ->andWhere('j.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getOneOrNullResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace App\Repository;
|
|||||||
|
|
||||||
use App\Entity\Teamer;
|
use App\Entity\Teamer;
|
||||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||||
|
use Doctrine\ORM\Query;
|
||||||
use Doctrine\Persistence\ManagerRegistry;
|
use Doctrine\Persistence\ManagerRegistry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,46 +22,13 @@ class TeamerRepository extends ServiceEntityRepository
|
|||||||
parent::__construct($registry, Teamer::class);
|
parent::__construct($registry, Teamer::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save(Teamer $entity, bool $flush = false): void
|
public function getListQuery(): Query
|
||||||
{
|
{
|
||||||
$this->getEntityManager()->persist($entity);
|
$qb = $this->createQueryBuilder('teamer');
|
||||||
|
|
||||||
if ($flush) {
|
return $qb
|
||||||
$this->getEntityManager()->flush();
|
->select('teamer', 'user')
|
||||||
}
|
->leftJoin('teamer.user', 'user')
|
||||||
|
->getQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function remove(Teamer $entity, bool $flush = false): void
|
|
||||||
{
|
|
||||||
$this->getEntityManager()->remove($entity);
|
|
||||||
|
|
||||||
if ($flush) {
|
|
||||||
$this->getEntityManager()->flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @return Teamer[] Returns an array of Teamer objects
|
|
||||||
// */
|
|
||||||
// public function findByExampleField($value): array
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('t')
|
|
||||||
// ->andWhere('t.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->orderBy('t.id', 'ASC')
|
|
||||||
// ->setMaxResults(10)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public function findOneBySomeField($value): ?Teamer
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('t')
|
|
||||||
// ->andWhere('t.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getOneOrNullResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,46 +21,16 @@ class TrainingRepository extends ServiceEntityRepository
|
|||||||
parent::__construct($registry, Training::class);
|
parent::__construct($registry, Training::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save(Training $entity, bool $flush = false): void
|
public function getList(): array
|
||||||
{
|
{
|
||||||
$this->getEntityManager()->persist($entity);
|
$qb = $this->createQueryBuilder('training');
|
||||||
|
|
||||||
if ($flush) {
|
return $qb
|
||||||
$this->getEntityManager()->flush();
|
->select('training', 'training_attendance')
|
||||||
}
|
->leftJoin('training.trainingAttendances', 'training_attendance')
|
||||||
|
->orderBy('training.name', 'ASC')
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function remove(Training $entity, bool $flush = false): void
|
|
||||||
{
|
|
||||||
$this->getEntityManager()->remove($entity);
|
|
||||||
|
|
||||||
if ($flush) {
|
|
||||||
$this->getEntityManager()->flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @return Training[] Returns an array of Training objects
|
|
||||||
// */
|
|
||||||
// public function findByExampleField($value): array
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('t')
|
|
||||||
// ->andWhere('t.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->orderBy('t.id', 'ASC')
|
|
||||||
// ->setMaxResults(10)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// public function findOneBySomeField($value): ?Training
|
|
||||||
// {
|
|
||||||
// return $this->createQueryBuilder('t')
|
|
||||||
// ->andWhere('t.exampleField = :val')
|
|
||||||
// ->setParameter('val', $value)
|
|
||||||
// ->getQuery()
|
|
||||||
// ->getOneOrNullResult()
|
|
||||||
// ;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class AppRuntime implements RuntimeExtensionInterface
|
|||||||
return $this->intlExtension->formatCurrency($amount, 'EUR');
|
return $this->intlExtension->formatCurrency($amount, 'EUR');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function renderIcon(Environment $environment, string $icon, string $classes = 'w-6 h-6'): string
|
public function renderIcon(Environment $environment, string $icon, string $classes = 'w-5 h-5'): string
|
||||||
{
|
{
|
||||||
return $environment->render('_partials/_icon.html.twig', [
|
return $environment->render('_partials/_icon.html.twig', [
|
||||||
'icon' => $icon,
|
'icon' => $icon,
|
||||||
|
|||||||
@@ -29,6 +29,9 @@
|
|||||||
"knplabs/knp-menu-bundle": {
|
"knplabs/knp-menu-bundle": {
|
||||||
"version": "v3.2.0"
|
"version": "v3.2.0"
|
||||||
},
|
},
|
||||||
|
"knplabs/knp-paginator-bundle": {
|
||||||
|
"version": "v6.2.0"
|
||||||
|
},
|
||||||
"liip/imagine-bundle": {
|
"liip/imagine-bundle": {
|
||||||
"version": "2.11",
|
"version": "2.11",
|
||||||
"recipe": {
|
"recipe": {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<div class="flex justify-between border-b border-gray-200 pb-2 mb-4">
|
<div class="flex justify-between border-b border-gray-200 pb-2 mb-4">
|
||||||
<div class="flex items-center space-x-2">
|
<div class="flex items-center space-x-2">
|
||||||
{{ icon('alert', 'w-8 h-8') }}
|
{{ icon('alert', 'w-8 h-8') }}
|
||||||
<span class="text-lg font-medium" {{ stimulus_target('confirmation-modal', 'title') }}></span>
|
<span class="text-xl font-bold" {{ stimulus_target('confirmation-modal', 'title') }}></span>
|
||||||
</div>
|
</div>
|
||||||
<button class="inline-block" {{ stimulus_action('confirmation-modal', 'hide') }}>
|
<button class="inline-block" {{ stimulus_action('confirmation-modal', 'hide') }}>
|
||||||
{{ icon('close', 'w-8 h-8') }}
|
{{ icon('close', 'w-8 h-8') }}
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<form method="post" {{ stimulus_target('confirmation-modal', 'form') }}>
|
<form method="post" {{ stimulus_target('confirmation-modal', 'form') }}>
|
||||||
<div {{ stimulus_target('confirmation-modal', 'content') }}></div>
|
<div {{ stimulus_target('confirmation-modal', 'content') }}></div>
|
||||||
<div class="mt-6 flex items-center space-x-8">
|
<div class="mt-6 flex items-center justify-between">
|
||||||
<button type="submit" class="btn">
|
<button type="submit" class="btn">
|
||||||
Ja
|
Ja
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,27 +1,83 @@
|
|||||||
{% extends 'knp_menu.html.twig' %}
|
{% extends 'knp_menu.html.twig' %}
|
||||||
|
|
||||||
|
{% block list %}
|
||||||
|
{% if item.hasChildren and options.depth is not same as(0) and item.displayChildren %}
|
||||||
|
{% if item.level == 0 %}
|
||||||
|
<div class="min-h-full flex grow flex-col gap-y-5 overflow-y-scroll lg:border-r border-gray-200 bg-white md:pr-6">
|
||||||
|
<nav class="flex flex-1 flex-col">
|
||||||
|
<ul role="list" class="space-y-1">
|
||||||
|
{{ block('children') }}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<ul class="{{ html_classes('mt-1 px-2', { 'hidden': not matcher.isCurrent(item) }) }}" {{ stimulus_target('sidebar-menu', 'submenu') }}>
|
||||||
|
{{ block('children') }}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block item %}
|
||||||
|
{% if item.displayed %}
|
||||||
|
<li>
|
||||||
|
{%- if item.hasChildren and item.displayChildren %}
|
||||||
|
<div {{ stimulus_controller('sidebar-menu', {'expanded': matcher.isAncestor(item)}, {'closed': 'hidden', 'iconClosed': 'text-gray-400', 'iconExpanded': 'text-gray-500'}) }}>
|
||||||
|
{%- endif %}
|
||||||
|
{%- if item.uri is not empty %}
|
||||||
|
{{ block('linkElement') }}
|
||||||
|
{%- else %}
|
||||||
|
{{ block('spanElement') }}
|
||||||
|
{%- endif %}
|
||||||
|
{{ block('list') }}
|
||||||
|
{%- if item.hasChildren and item.displayChildren %}
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block linkElement %}
|
||||||
|
{% import _self as knp_menu %}
|
||||||
|
<a href="{{ item.uri }}"
|
||||||
|
class="{{ html_classes('', {
|
||||||
|
'group flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold text-gray-700 hover:bg-gray-50': item.level == 1,
|
||||||
|
'block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700 hover:bg-gray-50': item.level > 1,
|
||||||
|
'bg-gray-50': matcher.isCurrent(item) or matcher.isAncestor(item)
|
||||||
|
}) }}"
|
||||||
|
{{ knp_menu.attributes(item.linkAttributes) }}>
|
||||||
|
{{ block('label') }}
|
||||||
|
</a>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block spanElement %}
|
||||||
|
{% import _self as knp_menu %}
|
||||||
|
{% if item.hasChildren %}
|
||||||
|
<button type="button"
|
||||||
|
{{ stimulus_action('sidebar-menu', 'toggleSubmenu') }}
|
||||||
|
{{ stimulus_target('sidebar-menu', 'button') }}
|
||||||
|
{{ knp_menu.attributes(item.linkAttributes) }}
|
||||||
|
class="{{ html_classes('hover:bg-gray-50 flex items-center w-full text-left rounded-md p-2 gap-x-3 text-sm leading-6 font-semibold text-gray-700', { 'bg-gray-50': matcher.isAncestor(item) }) }}"
|
||||||
|
aria-expanded="false">
|
||||||
|
{{ block('label') }}
|
||||||
|
</button>
|
||||||
|
{% elseif item.label == '%DIVIDER%' %}
|
||||||
|
<hr class="my-4 h-px bg-gray-200">
|
||||||
|
{% else %}
|
||||||
|
<div class="hover:bg-gray-50 group flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold text-gray-700" role="button">
|
||||||
|
{{ block('label') }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block label %}
|
{% block label %}
|
||||||
{% apply spaceless %}
|
{% apply spaceless %}
|
||||||
{% if item.extras.icon is defined %}
|
{% if item.extras.icon is defined %}
|
||||||
{{ icon(item.extras.icon, 'w-5 h-5') }}
|
{{ icon(item.extras.icon, 'h-6 w-6 shrink-0 text-gray-400') }}
|
||||||
{% if item.extras.icon_only is defined and false == item.extras.icon_only %}
|
{{ item.label|raw }}
|
||||||
<span class="flex-1">{{ item.label|raw }}</span>
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ item.label|raw }}
|
{{ item.label|raw }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endapply %}
|
{% endapply %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block spanElement %}
|
|
||||||
<div class="icon-section" role="button">
|
|
||||||
{% if item.extras.icon is defined %}
|
|
||||||
{{ icon(item.extras.icon, 'w-5 h-5') }}
|
|
||||||
{% if item.extras.icon_only is defined and false == item.extras.icon_only %}
|
|
||||||
<span class="flex-1">{{ item.label|raw }}</span>
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{{ item.label|raw }}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
<div class="fixed top-0 left-0 inset-x-0 z-50 bg-white shadow-sm">
|
|
||||||
<div class="container px-8 py-4 flex items-center justify-between">
|
|
||||||
<a href="{{ path(app.user.defaultRoute) }}" title="Home">
|
|
||||||
<div class="flex items-center space-x-4">
|
|
||||||
<img src="{{ asset('build/images/logo.svg') }}" alt="" class="block w-auto h-8">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<nav class="hidden md:block font-medium">
|
|
||||||
{% block header_menu %}{% endblock %}
|
|
||||||
</nav>
|
|
||||||
<button type="button"
|
|
||||||
class="md:hidden"
|
|
||||||
{{ stimulus_controller('mobilenav', [], [], { 'mobilenav': '#mobilenav' }) }}
|
|
||||||
{{ stimulus_action('mobilenav', 'trigger', null, { 'mode': 'open' }) }}>
|
|
||||||
{{ icon('menu', 'w-8 h-8') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
<div class="flex grow flex-col gap-y-5 overflow-y-scroll md:border-r border-gray-200 bg-white px-6">
|
|
||||||
<nav class="flex flex-1 flex-col">
|
|
||||||
<ul role="list" class="-mx-2 space-y-1">
|
|
||||||
<li>
|
|
||||||
<!-- Current: "bg-gray-50", Default: "hover:bg-gray-50" -->
|
|
||||||
<a href="#" class="bg-gray-50 block rounded-md py-2 pr-2 pl-10 text-sm leading-6 font-semibold text-gray-700">Dashboard</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<div>
|
|
||||||
<button type="button" class="hover:bg-gray-50 flex items-center w-full text-left rounded-md p-2 gap-x-3 text-sm leading-6 font-semibold text-gray-700" aria-controls="sub-menu-1" aria-expanded="false">
|
|
||||||
<!-- Expanded: "rotate-90 text-gray-500", Collapsed: "text-gray-400" -->
|
|
||||||
<svg class="text-gray-400 h-5 w-5 shrink-0" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
||||||
<path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
Teams
|
|
||||||
</button>
|
|
||||||
<!-- Expandable link section, show/hide based on state. -->
|
|
||||||
<ul class="mt-1 px-2" id="sub-menu-1">
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">Engineering</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">Human Resources</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">Customer Success</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<div>
|
|
||||||
<button type="button" class="hover:bg-gray-50 flex items-center w-full text-left rounded-md p-2 gap-x-3 text-sm leading-6 font-semibold text-gray-700" aria-controls="sub-menu-2" aria-expanded="false">
|
|
||||||
<!-- Expanded: "rotate-90 text-gray-500", Collapsed: "text-gray-400" -->
|
|
||||||
<svg class="text-gray-400 h-5 w-5 shrink-0" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
||||||
<path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
Projects
|
|
||||||
</button>
|
|
||||||
<!-- Expandable link section, show/hide based on state. -->
|
|
||||||
<ul class="mt-1 px-2" id="sub-menu-2">
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">GraphQL API</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">iOS App</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">Android App</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-9 text-sm leading-6 text-gray-700">New Customer Portal</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 text-sm leading-6 font-semibold text-gray-700">Calendar</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 text-sm leading-6 font-semibold text-gray-700">Documents</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a href="#" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 text-sm leading-6 font-semibold text-gray-700">Reports</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'layout.html.twig' %}
|
||||||
|
|
||||||
{% block header_menu %}
|
{% block main_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('admin_header'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('admin_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block mobile_menu %}
|
{% block mobile_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('admin_mobile'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('admin_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -3,8 +3,13 @@
|
|||||||
{{ form_row(form.name) }}
|
{{ form_row(form.name) }}
|
||||||
{{ form_row(form.value) }}
|
{{ form_row(form.value) }}
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn">
|
<div class="flex items-center space-x-2">
|
||||||
Speichern
|
<button type="submit" class="btn">
|
||||||
</button>
|
Speichern
|
||||||
|
</button>
|
||||||
|
<a href="{{ path('app_admin_system_fee_index') }}" class="btn btn--secondary">
|
||||||
|
Abbrechen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
{{ form_rest(form) }}
|
{{ form_rest(form) }}
|
||||||
{{ form_end(form) }}
|
{{ form_end(form) }}
|
||||||
|
|||||||
@@ -1,21 +1,12 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
{% block title %}Honorare{% endblock %}
|
{% block title %}Einstellungen - Honorar anlegen{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="grid lg:grid-cols-3 gap-y-8 lg:gap-y-0 lg:gap-x-16">
|
<div class="max-w-screen-sm">
|
||||||
<div class="flex flex-col space-y-2">
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
<a href="{{ path('app_admin_system_fee_index') }}" class="btn btn--secondary">
|
Honorar anlegen
|
||||||
Abbrechen
|
</h1>
|
||||||
</a>
|
{% include 'admin/system/fee/_form.html.twig' %}
|
||||||
</div>
|
|
||||||
<div class="lg:col-span-2">
|
|
||||||
<div class="pb-8 max-w-screen-md mx-auto">
|
|
||||||
<h1 class="text-2xl font-bold pb-8">
|
|
||||||
Honorar anlegen
|
|
||||||
</h1>
|
|
||||||
{% include 'admin/system/fee/_form.html.twig' %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1,21 +1,12 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
{% block title %}Honorare{% endblock %}
|
{% block title %}Einstellungen - Honorar bearbeiten{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="grid lg:grid-cols-3 gap-y-8 lg:gap-y-0 lg:gap-x-16">
|
<div class="max-w-screen-sm">
|
||||||
<div class="flex flex-col space-y-2">
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
<a href="{{ path('app_admin_system_fee_index') }}" class="btn btn--secondary">
|
Honorar bearbeiten
|
||||||
Abbrechen
|
</h1>
|
||||||
</a>
|
{% include 'admin/system/fee/_form.html.twig' %}
|
||||||
</div>
|
|
||||||
<div class="lg:col-span-2">
|
|
||||||
<div class="pb-8 max-w-screen-md mx-auto">
|
|
||||||
<h1 class="text-2xl font-bold pb-8">
|
|
||||||
Honorar bearbeiten
|
|
||||||
</h1>
|
|
||||||
{% include 'admin/system/fee/_form.html.twig' %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1,47 +1,64 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
{% block title %}Honorare{% endblock %}
|
{% block title %}Einstellungen - Honorare{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="grid lg:grid-cols-3 gap-y-8 lg:gap-y-0 lg:gap-x-16">
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
<div class="flex flex-col space-y-2">
|
Honorare
|
||||||
<a href="{{ path('app_admin_system_fee_create') }}" class="btn">
|
</h1>
|
||||||
Neu
|
<div class="data-table-wrapper">
|
||||||
</a>
|
<div class="data-table-wrapper__inner">
|
||||||
</div>
|
<table class="data-table">
|
||||||
<div class="lg:col-span-2">
|
<thead>
|
||||||
<h1 class="text-2xl font-bold pb-8">
|
<tr>
|
||||||
Honorare
|
<th>
|
||||||
</h1>
|
Bezeichnung
|
||||||
<div class="flex flex-col space-y-2">
|
</th>
|
||||||
{% for fee in fees %}
|
<th>
|
||||||
<div class="grid grid-cols-3 items-center py-2 px-4 bg-gray-200 rounded-md">
|
Wert
|
||||||
<div>
|
</th>
|
||||||
{{ fee.name }}
|
<th></th>
|
||||||
</div>
|
</tr>
|
||||||
<div>
|
</thead>
|
||||||
{{ fee.value|format_money }}
|
<tbody>
|
||||||
</div>
|
{% for fee in fees %}
|
||||||
<div class="flex items-center space-x-2 justify-end">
|
<tr>
|
||||||
<button type="button"
|
<td>
|
||||||
class="text-red-500"
|
{{ fee.name }}
|
||||||
{{ stimulus_controller('modal-button', [], [], {'confirmation-modal': '#confirmation-modal'}) }}
|
</td>
|
||||||
{{ stimulus_action('modal-button', 'confirmation', null, {
|
<td>
|
||||||
'title': 'Bist du sicher?',
|
{{ fee.value|format_money }}
|
||||||
'content': 'Möchtest du das Honorar wirklich löschen?',
|
</td>
|
||||||
'target-url': path('app_admin_system_fee_delete', { 'id': fee.id })
|
<td>
|
||||||
}) }}>
|
<div class="flex items-center space-x-2 justify-end">
|
||||||
{{ icon('delete') }}
|
<button type="button"
|
||||||
</button>
|
class="text-red-500"
|
||||||
<a href="{{ path('app_admin_system_fee_edit', { 'id': fee.id }) }}">
|
{{ stimulus_controller('modal-button', [], [], {'confirmation-modal': '#confirmation-modal'}) }}
|
||||||
{{ icon('edit') }}
|
{{ stimulus_action('modal-button', 'confirmation', null, {
|
||||||
</a>
|
'title': 'Bist du sicher?',
|
||||||
</div>
|
'content': 'Möchtest du das Honorar wirklich löschen?',
|
||||||
</div>
|
'target-url': path('app_admin_system_fee_delete', { 'id': fee.id })
|
||||||
{% else %}
|
}) }}>
|
||||||
<div class="text-sm">Keine Daten...</div>
|
{{ icon('delete') }}
|
||||||
{% endfor %}
|
</button>
|
||||||
|
<a href="{{ path('app_admin_system_fee_edit', { 'id': fee.id }) }}">
|
||||||
|
{{ icon('edit') }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
<td colspan="3">
|
||||||
|
<div class="text-sm">Keine Daten...</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<a href="{{ path('app_admin_system_fee_create') }}" class="btn">
|
||||||
|
Neu
|
||||||
|
</a>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{{ form_start(form) }}
|
||||||
|
<div class="flex flex-col space-y-4 pb-8">
|
||||||
|
{{ form_row(form.name) }}
|
||||||
|
{{ form_row(form.requiredTraining) }}
|
||||||
|
{{ form_widget(form.requiredLicenses) }}
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center space-x-2">
|
||||||
|
<button type="submit" class="btn">
|
||||||
|
Speichern
|
||||||
|
</button>
|
||||||
|
<a href="{{ path('app_admin_system_job_profile_index') }}" class="btn btn--secondary">
|
||||||
|
Abbrechen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{ form_rest(form) }}
|
||||||
|
{{ form_end(form) }}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Einstellungen - Job-Profil anlegen{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="max-w-screen-sm">
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Job-Profil anlegen
|
||||||
|
</h1>
|
||||||
|
{% include 'admin/system/job_profile/_form.html.twig' %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Einstellungen - Jobprofile{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Job-Profile
|
||||||
|
</h1>
|
||||||
|
<div class="data-table-wrapper">
|
||||||
|
<div class="data-table-wrapper__inner">
|
||||||
|
<table class="data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
Bezeichnung
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Fortbildung
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Lizenzen
|
||||||
|
</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for jobProfile in jobProfiles %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ jobProfile.name }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ jobProfile.requiredTraining|default('-') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ jobProfile.requiredLicenses|join(', ') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="flex items-center space-x-2 justify-end">
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
<td colspan="4">
|
||||||
|
<div class="text-sm">Keine Daten...</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="{{ path('app_admin_system_job_profile_create') }}" class="btn">
|
||||||
|
Neu
|
||||||
|
</a>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{{ form_start(form) }}
|
||||||
|
<div class="flex flex-col space-y-4 pb-8">
|
||||||
|
{{ form_row(form.name) }}
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center space-x-2">
|
||||||
|
<button type="submit" class="btn">
|
||||||
|
Speichern
|
||||||
|
</button>
|
||||||
|
<a href="{{ path('app_admin_system_training_index') }}" class="btn btn--secondary">
|
||||||
|
Abbrechen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{{ form_rest(form) }}
|
||||||
|
{{ form_end(form) }}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Einstellungen - Fortbildung anlegen{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="max-w-screen-sm">
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Fortbildung anlegen
|
||||||
|
</h1>
|
||||||
|
{% include 'admin/system/training/_form.html.twig' %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Einstellungen - Fortbildung bearbeiten{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="max-w-screen-sm">
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Fortbildung bearbeiten
|
||||||
|
</h1>
|
||||||
|
{% include 'admin/system/training/_form.html.twig' %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Einstellungen - Fortbildungen{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Fortbildungen
|
||||||
|
</h1>
|
||||||
|
<div class="data-table-wrapper">
|
||||||
|
<div class="data-table-wrapper__inner">
|
||||||
|
<table class="data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
Bezeichnung
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Teilnahmen
|
||||||
|
</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for training in trainings %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ training.name }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ training.trainingAttendances|length|default('-') }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="flex items-center space-x-2 justify-end">
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% else %}
|
||||||
|
<tr>
|
||||||
|
<td colspan="3">
|
||||||
|
<div class="text-sm">Keine Daten...</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="{{ path('app_admin_system_training_create') }}" class="btn">
|
||||||
|
Neu
|
||||||
|
</a>
|
||||||
|
{% endblock %}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
{% extends 'admin/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Teamerübersicht{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
|
Teamerübersicht
|
||||||
|
</h1>
|
||||||
|
<div class="data-table-wrapper">
|
||||||
|
<div class="data-table-wrapper__inner">
|
||||||
|
<table class="data-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
{{ knp_pagination_sortable(pagination, 'Name', 'teamer.lastName') }}
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
Vorname
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
{{ knp_pagination_sortable(pagination, 'Status', 'teamer.status') }}
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
{{ knp_pagination_sortable(pagination, 'E-Mail', 'teamer.communication.email') }}
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
{{ knp_pagination_sortable(pagination, 'Letzter Login', 'teamer.lastLoginAt') }}
|
||||||
|
</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for teamer in pagination %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="#" class="whitespace-nowrap">
|
||||||
|
{{ teamer.lastName }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="#" class="whitespace-nowrap">
|
||||||
|
{{ teamer.firstName }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ teamer.status }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ teamer.communication.email }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if teamer.user.lastLoginAt is not null %}
|
||||||
|
{{ teamer.user.lastLoginAt | date('d.m.Y') }}
|
||||||
|
{% else %}
|
||||||
|
-
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="flex items-center space-x-1 justify-end">
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{{ knp_pagination_render(pagination) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
{{ encore_entry_script_tags('app') }}
|
{{ encore_entry_script_tags('app') }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-white font-sans antialiased">
|
<body class="bg-white text-gray-700 font-sans antialiased">
|
||||||
{% block body %}{% endblock %}
|
{% block body %}{% endblock %}
|
||||||
{% include '_partials/_flashes.html.twig' %}
|
{% include '_partials/_flashes.html.twig' %}
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -35,11 +35,11 @@
|
|||||||
{%- block form_widget_simple -%}
|
{%- block form_widget_simple -%}
|
||||||
{%- set type = type|default('text') -%}
|
{%- set type = type|default('text') -%}
|
||||||
{%- if type != 'hidden' -%}
|
{%- if type != 'hidden' -%}
|
||||||
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary sm:text-sm sm:leading-6')|trim }) -%}
|
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset sm:text-sm sm:leading-6')|trim }) -%}
|
||||||
{%- if errors|length -%}
|
{%- if errors|length -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
||||||
{% else %}
|
{% else %}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-slate-400 focus:ring-primary' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-gray-400 focus:ring-primary' }) -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- if disabled is defined and disabled == true -%}
|
{%- if disabled is defined and disabled == true -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
||||||
@@ -52,11 +52,11 @@
|
|||||||
{%- endblock form_widget_simple -%}
|
{%- endblock form_widget_simple -%}
|
||||||
|
|
||||||
{%- block textarea_widget -%}
|
{%- block textarea_widget -%}
|
||||||
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary sm:text-sm sm:leading-6')|trim }) -%}
|
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset sm:text-sm sm:leading-6')|trim }) -%}
|
||||||
{%- if errors|length -%}
|
{%- if errors|length -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
||||||
{% else %}
|
{% else %}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-slate-400 focus:ring-1 focus:ring-primary' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-gray-400 focus:ring-primary' }) -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- if disabled is defined and disabled == true -%}
|
{%- if disabled is defined and disabled == true -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
||||||
@@ -68,11 +68,11 @@
|
|||||||
{%- endblock textarea_widget -%}
|
{%- endblock textarea_widget -%}
|
||||||
|
|
||||||
{%- block choice_widget_collapsed -%}
|
{%- block choice_widget_collapsed -%}
|
||||||
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset focus:ring-primary sm:text-sm sm:leading-6')|trim }) -%}
|
{%- set attr = attr|merge({'class': (attr.class|default('') ~ ' mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 focus:ring-2 focus:ring-inset sm:text-sm sm:leading-6')|trim }) -%}
|
||||||
{%- if errors|length -%}
|
{%- if errors|length -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' ring-red-500 placeholder-red-500 focus:ring-red-500' }) -%}
|
||||||
{% else %}
|
{% else %}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-slate-400 focus:ring-1 focus:ring-primary' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' placeholder:text-gray-400 focus:ring-primary' }) -%}
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- if disabled is defined and disabled == true -%}
|
{%- if disabled is defined and disabled == true -%}
|
||||||
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
{%- set attr = attr|merge({'class': attr.class|default('') ~ ' cursor-not-allowed' }) -%}
|
||||||
@@ -83,6 +83,30 @@
|
|||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
{%- endblock choice_widget_collapsed -%}
|
{%- endblock choice_widget_collapsed -%}
|
||||||
|
|
||||||
|
{%- block choice_widget_expanded -%}
|
||||||
|
<fieldset>
|
||||||
|
{% if form.vars.label %}
|
||||||
|
<legend class="text-base font-bold leading-6 text-gray-900">
|
||||||
|
{{ form.vars.label }}
|
||||||
|
</legend>
|
||||||
|
{% endif %}
|
||||||
|
<div class="mt-4 divide-y divide-gray-200 border-b border-t border-gray-200">
|
||||||
|
{%- for child in form %}
|
||||||
|
<div class="relative flex items-start py-4">
|
||||||
|
<div class="min-w-0 flex-1 text-sm leading-6">
|
||||||
|
<label for="{{ child.vars.id }}" class="select-none font-medium text-gray-900">
|
||||||
|
{{ child.vars.label }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="ml-3 flex h-6 items-center">
|
||||||
|
<input id="{{ child.vars.id }}" name="{{ child.vars.full_name }}" type="checkbox" class="h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor -%}
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
{%- endblock choice_widget_expanded -%}
|
||||||
|
|
||||||
{%- block birthday_widget -%}
|
{%- block birthday_widget -%}
|
||||||
<div class="grid grid-cols-3 gap-x-1">
|
<div class="grid grid-cols-3 gap-x-1">
|
||||||
{{ form_widget(form.children['day']) }}
|
{{ form_widget(form.children['day']) }}
|
||||||
|
|||||||
@@ -1,12 +1,23 @@
|
|||||||
{% extends 'base.html.twig' %}
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="container grid md:grid-cols-4 gap-8 py-8">
|
<div class="container grid lg:grid-cols-4 gap-8 py-8">
|
||||||
<div class="md:col-span-4">
|
<div class="lg:col-span-4 flex items-center justify-between">
|
||||||
<img class="h-8 w-auto" src="{{ asset('build/images/logo.svg') }}" alt="My E&P Team">
|
<img class="h-8 w-auto" src="{{ asset('build/images/logo.svg') }}" alt="My E&P Team">
|
||||||
|
<a href="{{ path('app_security_logout') }}" class="hidden lg:block">
|
||||||
|
{{ icon('logout', 'w-8 h-8 text-gray-700') }}
|
||||||
|
</a>
|
||||||
|
<button type="button"
|
||||||
|
class="lg:hidden"
|
||||||
|
{{ stimulus_controller('mobilenav', [], [], { 'mobilenav': '#mobilenav' }) }}
|
||||||
|
{{ stimulus_action('mobilenav', 'trigger', null, { 'mode': 'open' }) }}>
|
||||||
|
{{ icon('menu', 'w-8 h-8 text-gray-700') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{% include '_partials/_sidebar_menu.html.twig' %}
|
<div class="hidden lg:block">
|
||||||
<div class="md:col-span-3">
|
{% block main_menu %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
<div class="lg:col-span-3">
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -17,14 +28,14 @@
|
|||||||
{{ stimulus_controller('mobilenav', [], { 'closed': '-translate-x-full' }, { 'mobilenav': '#mobilenav' }) }}
|
{{ stimulus_controller('mobilenav', [], { 'closed': '-translate-x-full' }, { 'mobilenav': '#mobilenav' }) }}
|
||||||
>
|
>
|
||||||
<div class="h-screen w-full bg-white">
|
<div class="h-screen w-full bg-white">
|
||||||
<div class="flex justify-between px-8 pt-4">
|
<div class="flex justify-between p-8">
|
||||||
<img src="{{ asset('build/images/logo.svg') }}" alt="" class="block w-auto h-8">
|
<img src="{{ asset('build/images/logo.svg') }}" alt="" class="block w-auto h-8">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
{{ stimulus_action('mobilenav', 'trigger', null, { 'mode': 'close' }) }}>
|
{{ stimulus_action('mobilenav', 'trigger', null, { 'mode': 'close' }) }}>
|
||||||
{{ icon('close', 'w-8 h-8') }}
|
{{ icon('close', 'w-8 h-8') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full h-full p-8 pt-4 overflow-y-scroll">
|
<div class="w-full h-full p-8 pt-0 overflow-y-scroll">
|
||||||
{% block mobile_menu %}{% endblock %}
|
{% block mobile_menu %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'manager/layout.html.twig' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'layout.html.twig' %}
|
||||||
|
|
||||||
{% block header_menu %}
|
{% block main_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('manager_header'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('manager_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block mobile_menu %}
|
{% block mobile_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('manager_mobile'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('manager_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<div class="bg-gray-100 border border-gray-300 border-t-0 px-4 py-3 flex items-center justify-between sm:px-4">
|
||||||
|
<div class="flex-1 flex items-center justify-between">
|
||||||
|
<div>
|
||||||
|
<p class="text-sm leading-5 text-gray-700">{{ 'label.paginator.info'|trans({ '{from}': firstItemNumber, '{to}': lastItemNumber, '{total}': totalCount })|raw }}</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<nav class="relative z-0 inline-flex">
|
||||||
|
{% if pageCount > 1 %}
|
||||||
|
{% if previous is defined %}
|
||||||
|
<a href="{{ path(route, query|merge({(pageParameterName): previous})) }}" class="relative inline-flex items-center px-2 py-2 border border-gray-300 bg-white text-sm leading-5 font-medium hover:bg-secondary hover:text-white" aria-label="Previous">
|
||||||
|
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if current > 3 %}
|
||||||
|
<span class="-ml-px relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm leading-5 font-medium text-gray-700">
|
||||||
|
...
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
{% for page in pagesInRange %}
|
||||||
|
<a href="{{ path(route, query|merge({(pageParameterName): page})) }}" class="-ml-px relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm leading-5 font-medium focus:z-10 hover:bg-secondary {% if page == current %}bg-primary text-white hover:text-white{% else %}bg-white text-gray-700 hover:text-white{% endif %}">
|
||||||
|
{{ page }}
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
{% if current < pageCount - 3 %}
|
||||||
|
<span class="-ml-px relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm leading-5 font-medium text-gray-700">
|
||||||
|
...
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
{% if next is defined %}
|
||||||
|
<a href="{{ path(route, query|merge({(pageParameterName): next})) }}" class="-ml-px relative inline-flex items-center px-2 py-2 border border-gray-300 bg-white text-sm leading-5 font-medium hover:bg-secondary hover:text-white" aria-label="Next">
|
||||||
|
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"/>
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<a href="{{ options.href }}" class="flex items-center space-x-2">
|
||||||
|
<span>{{ title }}</span>
|
||||||
|
{%- if sorted -%}
|
||||||
|
{%- if direction == 'desc' -%}
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path d="M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12"></path>
|
||||||
|
</svg>
|
||||||
|
{%- else -%}
|
||||||
|
<svg class="w-4 h-4 shrink-0" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path d="M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4"></path>
|
||||||
|
</svg>
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endif -%}
|
||||||
|
</a>
|
||||||
|
|
||||||
@@ -19,15 +19,15 @@
|
|||||||
<label for="username" class="block leading-6 text-gray-900">
|
<label for="username" class="block leading-6 text-gray-900">
|
||||||
E-Mail:
|
E-Mail:
|
||||||
</label>
|
</label>
|
||||||
<input type="text" id="username" name="_username" value="{{ last_username }}" class="mt-2 appearance-none text-slate-900 bg-white rounded-md block w-full px-3 h-10 shadow-sm sm:text-sm focus:outline-none placeholder:text-slate-400 focus:ring-2 focus:ring-primary ring-1 ring-slate-200">
|
<input type="text" id="username" name="_username" value="{{ last_username }}" class="mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary sm:text-sm sm:leading-6">
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-6">
|
<div class="mb-6">
|
||||||
<label for="password" class="block leading-6 text-gray-900">
|
<label for="password" class="block leading-6 text-gray-900">
|
||||||
Passwort:
|
Passwort:
|
||||||
</label>
|
</label>
|
||||||
<input type="password" id="password" name="_password" class="mt-2 appearance-none text-slate-900 bg-white rounded-md block w-full px-3 h-10 shadow-sm sm:text-sm focus:outline-none placeholder:text-slate-400 focus:ring-2 focus:ring-primary ring-1 ring-slate-200">
|
<input type="password" id="password" name="_password" class="mt-2 block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-primary sm:text-sm sm:leading-6">
|
||||||
</div>
|
</div>
|
||||||
<button type="submit" class="btn">
|
<button type="submit" class="btn w-full">
|
||||||
Login
|
Login
|
||||||
</button>
|
</button>
|
||||||
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
|
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
{% extends 'layout.html.twig' %}
|
||||||
|
|
||||||
{% block header_menu %}
|
|
||||||
{{ knp_menu_render(knp_menu_get('teamer_header'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block main_menu %}
|
{% block main_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('teamer_main'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('teamer_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block mobile_menu %}
|
{% block mobile_menu %}
|
||||||
{{ knp_menu_render(knp_menu_get('teamer_mobile'), { 'firstClass': null, 'lastClass': null, 'ancestorClass': 'active', 'compressed': true }) }}
|
{{ knp_menu_render(knp_menu_get('teamer_main')) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{% extends 'teamer/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Meine Verfügbarkeit{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
@@ -18,30 +18,34 @@
|
|||||||
{{ form_start(form) }}
|
{{ form_start(form) }}
|
||||||
|
|
||||||
<div {{ stimulus_controller('tabs', {}, { 'buttonActive': 'bg-gray-50' }) }}>
|
<div {{ stimulus_controller('tabs', {}, { 'buttonActive': 'bg-gray-50' }) }}>
|
||||||
|
|
||||||
<div class="grid lg:grid-cols-3 gap-y-8 lg:gap-y-0 lg:gap-x-16">
|
<div class="grid lg:grid-cols-3 gap-y-8 lg:gap-y-0 lg:gap-x-16">
|
||||||
<ul role="list" class="-mx-2 space-y-1">
|
<div>
|
||||||
<li>
|
<h1 class="text-2xl font-bold pb-8">
|
||||||
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 0 }) }}>
|
Mein Profil
|
||||||
Persönliche Daten
|
</h1>
|
||||||
</button>
|
<ul role="list" class="space-y-1">
|
||||||
</li>
|
<li>
|
||||||
<li>
|
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 0 }) }}>
|
||||||
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 1 }) }}>
|
Persönliche Daten
|
||||||
Anschrift/Kontakt
|
</button>
|
||||||
</button>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
<li>
|
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 1 }) }}>
|
||||||
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 2 }) }}>
|
Anschrift/Kontakt
|
||||||
Bankverbindung
|
</button>
|
||||||
</button>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
<li>
|
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 2 }) }}>
|
||||||
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 3 }) }}>
|
Bankverbindung
|
||||||
Sonstiges/Foto
|
</button>
|
||||||
</button>
|
</li>
|
||||||
</li>
|
<li>
|
||||||
</ul>
|
<button type="button" class="hover:bg-gray-50 block rounded-md py-2 pr-2 pl-10 w-full text-left text-sm leading-6 font-semibold text-gray-700" {{ stimulus_target('tabs', 'button') }} {{ stimulus_action('tabs', 'select', null, { 'tab': 3 }) }}>
|
||||||
|
Sonstiges/Foto
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
<div class="lg:col-span-2">
|
<div class="lg:col-span-2">
|
||||||
{% if not form.vars.valid %}
|
{% if not form.vars.valid %}
|
||||||
<div class="border border-red-500 rounded-md p-4 text-red-500 mb-8">
|
<div class="border border-red-500 rounded-md p-4 text-red-500 mb-8">
|
||||||
@@ -62,9 +66,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Persönliche Daten
|
Persönliche Daten
|
||||||
</h3>
|
</h2>
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
{{ form_row(form.salutation) }}
|
{{ form_row(form.salutation) }}
|
||||||
{{ form_row(form.academicTitle) }}
|
{{ form_row(form.academicTitle) }}
|
||||||
@@ -77,18 +81,18 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Anschrift
|
Anschrift
|
||||||
</h3>
|
</h2>
|
||||||
<div class="flex flex-col space-y-4 pb-8">
|
<div class="flex flex-col space-y-4 pb-8">
|
||||||
{{ form_row(form.address.street) }}
|
{{ form_row(form.address.street) }}
|
||||||
{{ form_row(form.address.postCode) }}
|
{{ form_row(form.address.postCode) }}
|
||||||
{{ form_row(form.address.city) }}
|
{{ form_row(form.address.city) }}
|
||||||
{{ form_row(form.address.country) }}
|
{{ form_row(form.address.country) }}
|
||||||
</div>
|
</div>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Kontakt
|
Kontakt
|
||||||
</h3>
|
</h2>
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
{{ form_row(form.communication.email) }}
|
{{ form_row(form.communication.email) }}
|
||||||
{{ form_row(form.communication.phone) }}
|
{{ form_row(form.communication.phone) }}
|
||||||
@@ -97,9 +101,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Bankverbindung
|
Bankverbindung
|
||||||
</h3>
|
</h2>
|
||||||
<div class="flex flex-col space-y-4">
|
<div class="flex flex-col space-y-4">
|
||||||
{{ form_row(form.bankAccount.iban) }}
|
{{ form_row(form.bankAccount.iban) }}
|
||||||
{{ form_row(form.bankAccount.bic) }}
|
{{ form_row(form.bankAccount.bic) }}
|
||||||
@@ -109,17 +113,17 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
<div class="pb-8" {{ stimulus_target('tabs', 'tab') }}>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Sonstiges
|
Sonstiges
|
||||||
</h3>
|
</h2>
|
||||||
<div class="flex flex-col space-y-4 pb-8">
|
<div class="flex flex-col space-y-4 pb-8">
|
||||||
{{ form_row(form.taxId) }}
|
{{ form_row(form.taxId) }}
|
||||||
{{ form_row(form.healthInsuranceCompany) }}
|
{{ form_row(form.healthInsuranceCompany) }}
|
||||||
{{ form_row(form.remarks) }}
|
{{ form_row(form.remarks) }}
|
||||||
</div>
|
</div>
|
||||||
<h3 class="text-xl font-bold pb-2">
|
<h2 class="text-xl font-bold pb-2">
|
||||||
Fotoupload
|
Fotoupload
|
||||||
</h3>
|
</h2>
|
||||||
<div class="grid md:grid-cols-2 gap-8">
|
<div class="grid md:grid-cols-2 gap-8">
|
||||||
<div>
|
<div>
|
||||||
{% include '_partials/_upload_collection_form.html.twig' with {
|
{% include '_partials/_upload_collection_form.html.twig' with {
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{% extends 'teamer/layout.html.twig' %}
|
||||||
|
|
||||||
|
{% block title %}Meine Jobprofile & Skills{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user