This commit is contained in:
Thomas Peterson 2024-12-22 17:17:13 +01:00
parent 7becbbf556
commit 83e50198b7
101 changed files with 5426 additions and 27483 deletions

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
import "./login/login.css"

View File

@ -1,21 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.psc-login-page {
@apply relative bg-no-repeat;
background-image: radial-gradient(
circle at top,
theme('colors.psc.50'),
theme('colors.white') 50%
);
}
.psc-login-page form::before {
@apply absolute inset-x-0 mx-auto h-px w-2/3 bg-gradient-to-r from-gray-200 via-psc-300 to-gray-200;
content: '';
z-index: 1;
top: -1px;
}
}

View File

@ -6,9 +6,11 @@
"": {
"license": "UNLICENSED",
"dependencies": {
"@alpinejs/persist": "^3.14.7",
"@babel/core": "^7.20.2",
"@babel/preset-env": "^7.20.2",
"@popperjs/core": "^2.9.3",
"alpinejs": "^3.14.7",
"bootstrap": "^5.1.0",
"bootstrap-toggle": "^2.2.2",
"brace": "^0.11.1",
@ -35,6 +37,7 @@
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.15",
"@types/alpinejs": "^3.13.11",
"@types/node": "^18.7.6",
"autoprefixer": "^10.4.20",
"chart.js": "^3.4.1 || ^4.0",
@ -61,6 +64,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@alpinejs/persist": {
"version": "3.14.7",
"resolved": "https://registry.npmjs.org/@alpinejs/persist/-/persist-3.14.7.tgz",
"integrity": "sha512-MakPAI87flMcJro2LJEbq0wcpwgQMGxK9fx1hVaSC0jLinoUfKkoK4DzF6YJmqLVWKnca5ryO3Av1sWzPftQwQ==",
"license": "MIT"
},
"node_modules/@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@ -3215,6 +3224,13 @@
"node": ">=10.13.0"
}
},
"node_modules/@types/alpinejs": {
"version": "3.13.11",
"resolved": "https://registry.npmjs.org/@types/alpinejs/-/alpinejs-3.13.11.tgz",
"integrity": "sha512-3KhGkDixCPiLdL3Z/ok1GxHwLxEWqQOKJccgaQL01wc0EVM2tCTaqlC3NIedmxAXkVzt/V6VTM8qPgnOHKJ1MA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@ -3633,6 +3649,21 @@
"dev": true,
"peer": true
},
"node_modules/@vue/reactivity": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
"integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.1.5"
}
},
"node_modules/@vue/shared": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz",
"integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==",
"license": "MIT"
},
"node_modules/@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@ -3964,6 +3995,15 @@
"ajv": "^6.9.1"
}
},
"node_modules/alpinejs": {
"version": "3.14.7",
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.7.tgz",
"integrity": "sha512-ScnbydNBcWVnCiVupD3wWUvoMPm8244xkvDNMxVCspgmap9m4QuJ7pjc+77UtByU+1+Ejg0wzYkP4mQaOMcvng==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "~3.1.1"
}
},
"node_modules/amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
@ -13661,6 +13701,11 @@
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true
},
"@alpinejs/persist": {
"version": "3.14.7",
"resolved": "https://registry.npmjs.org/@alpinejs/persist/-/persist-3.14.7.tgz",
"integrity": "sha512-MakPAI87flMcJro2LJEbq0wcpwgQMGxK9fx1hVaSC0jLinoUfKkoK4DzF6YJmqLVWKnca5ryO3Av1sWzPftQwQ=="
},
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
@ -15675,6 +15720,12 @@
"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
"dev": true
},
"@types/alpinejs": {
"version": "3.13.11",
"resolved": "https://registry.npmjs.org/@types/alpinejs/-/alpinejs-3.13.11.tgz",
"integrity": "sha512-3KhGkDixCPiLdL3Z/ok1GxHwLxEWqQOKJccgaQL01wc0EVM2tCTaqlC3NIedmxAXkVzt/V6VTM8qPgnOHKJ1MA==",
"dev": true
},
"@types/aria-query": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz",
@ -16059,6 +16110,19 @@
}
}
},
"@vue/reactivity": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz",
"integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==",
"requires": {
"@vue/shared": "3.1.5"
}
},
"@vue/shared": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz",
"integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA=="
},
"@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@ -16334,6 +16398,14 @@
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"requires": {}
},
"alpinejs": {
"version": "3.14.7",
"resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.7.tgz",
"integrity": "sha512-ScnbydNBcWVnCiVupD3wWUvoMPm8244xkvDNMxVCspgmap9m4QuJ7pjc+77UtByU+1+Ejg0wzYkP4mQaOMcvng==",
"requires": {
"@vue/reactivity": "~3.1.1"
}
},
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",

View File

@ -11,6 +11,7 @@
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.15",
"@types/alpinejs": "^3.13.11",
"@types/node": "^18.7.6",
"autoprefixer": "^10.4.20",
"chart.js": "^3.4.1 || ^4.0",
@ -32,9 +33,11 @@
"build": "encore production --progress"
},
"dependencies": {
"@alpinejs/persist": "^3.14.7",
"@babel/core": "^7.20.2",
"@babel/preset-env": "^7.20.2",
"@popperjs/core": "^2.9.3",
"alpinejs": "^3.14.7",
"bootstrap": "^5.1.0",
"bootstrap-toggle": "^2.2.2",
"brace": "^0.11.1",

View File

@ -14,6 +14,8 @@
namespace PSC\Backend\DashboardBundle\Controller;
use Doctrine\ORM\EntityManagerInterface;
use PSC\Shop\ContactBundle\Repository\ContactRepository;
use PSC\Shop\OrderBundle\Service\Order;
use PSC\Shop\QueueBundle\Service\Queue\Manager;
use PSC\System\SettingsBundle\Service\Instance;
use PSC\System\SettingsBundle\Service\Shop;
@ -48,7 +50,7 @@ class DashboardController extends AbstractController
#[Security("is_granted('ROLE_SHOP')")]
#[Route(path: '/dashboard', name: 'psc_backend_dashboard_index')]
#[Template]
public function indexAction(Migration $migration, Shop $shop, EntityManagerInterface $entityManager, Manager $queueService, Instance $instanceService, ChartBuilderInterface $chartBuilder)
public function indexAction(Migration $migration, Shop $shop, EntityManagerInterface $entityManager, Manager $queueService, Instance $instanceService, ChartBuilderInterface $chartBuilder, ContactRepository $contactRepository, Order $orderService)
{
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
@ -119,6 +121,8 @@ class DashboardController extends AbstractController
return array(
'user' => $this->getUser(),
'shop' => $selectedShop,
'lastContacts' => $contactRepository->getLastCreatedContacts($selectedShop, 10),
'lastOrders' => $orderService->getLastOrders(),
'queueErrorCount' => $queueService->getErrorJobCount(),
'instance' => $instanceService->getInstance(),
'chart' => $chart

View File

@ -20,12 +20,9 @@ use PSC\System\SettingsBundle\Service\Shop;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Routing\Attribute\Route;
/**
* ShopController fürs ProductionBundle
@ -35,16 +32,6 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
*/
class ShopController extends AbstractController
{
/**
* Meine Shops
*
*
*
* @param Request $request
* @param Shop $shop
* @return array
* @throws \Doctrine\ORM\ORMException
*/
#[Security("is_granted('ROLE_SHOP')")]
#[Template]
public function myEditableShopsAction(Request $request, Shop $shop, JWTTokenManagerInterface $jwtManager, EntityManagerInterface $entityManager)
@ -65,6 +52,27 @@ class ShopController extends AbstractController
return array('domain' => $domain, 'shops' => $shops, 'jwt' => $jwtManager->create($this->getUser()), 'selectedShop' => $selectedShop, 'displayDeletedShop' => $request->getSession()->get('displayDeletedShop', false));
}
#[Security("is_granted('ROLE_SHOP')")]
#[Template]
public function myEditableShopsTailwindAction(Request $request, Shop $shop, JWTTokenManagerInterface $jwtManager, EntityManagerInterface $entityManager)
{
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */
$selectedShop = $shop->getSelectedShop();
$shops = $shop->getMyEditableShops();
$domains = $entityManager
->getRepository(Domain::class)->getAllByShopId($selectedShop);
if (count($domains) > 0) {
$domain = array_pop($domains)->getHost();
} else {
$domain = false;
}
return array('domain' => $domain, 'shops' => $shops, 'jwt' => $jwtManager->create($this->getUser()), 'selectedShop' => $selectedShop, 'displayDeletedShop' => $request->getSession()->get('displayDeletedShop', false));
}
/**
* Change Shop
*
@ -76,7 +84,7 @@ class ShopController extends AbstractController
* @return RedirectResponse
*/
#[Security("is_granted('ROLE_SHOP')")]
#[route(path: '/shop/change/{shop_uuid}', name: 'psc_backend_dashboard_shop_change')]
#[Route(path: '/shop/change/{shop_uuid}', name: 'psc_backend_dashboard_shop_change')]
public function changeShopAction(Request $request, EntityManagerInterface $em, \Symfony\Component\Security\Core\Security $security, $shop_uuid)
{
$em
@ -98,7 +106,7 @@ class ShopController extends AbstractController
* @throws \Doctrine\ORM\ORMException
*/
#[Security("is_granted('ROLE_SHOP')")]
#[route(path: '/shop/deleted/toogle', name: 'psc_backend_dashboard_toogle_deleted_shop')]
#[Route(path: '/shop/deleted/toogle', name: 'psc_backend_dashboard_toogle_deleted_shop')]
public function toogleDisplayDeletedShopAction(Request $request, EntityManagerInterface $em, \Symfony\Component\Security\Core\Security $security, Shop $shopService)
{
/** @var \PSC\Shop\EntityBundle\Entity\Shop $selectedShop */

View File

@ -7,4 +7,5 @@ psc_backend_dashboard:
password: Passwort
username: Benutzername
login: Anmelden
new customer: Neue Kunden
new orders: Neue Aufträge

View File

@ -1,66 +1,143 @@
{% extends 'backend_base.html.twig' %}
{% extends 'backend_tailwind_base.html.twig' %}
{% block containerdiv %}max-w-7xl{% endblock %}
{% block header %}
<h1 class="text-psc text-2xl font-medium"><i class="fas fa-chalkboard mr-1"></i>Dashboard</h1>
{% endblock %}
{% block body %}
<div class="header">
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-6 col-lg-6">
<h3>
<i class="fa-fw fa fa-chalkboard"></i> Dashboard <span>> My Dashboard</span>
</h3>
</div>
</div>
</div>
<div class="body">
<div class="grid grid-cols-1 lg:grid-cols-2 filament-widgets-container gap-4 lg:gap-8 mb-6">
{% if is_granted('ROLE_ADMIN') %}
<div class="row">
<div class="col-6">
<div class="panel">
<div class="header">
<h4>Infos</h4>
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
<div class="p-2 space-y-2">
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
Info
</h2>
</div>
<div class="body">
<table class="table">
<tr><td>{{ 'psc_backend_dashboard.Name'|trans }}:</td><td>{{ shop.title }}</td></tr>
<tr><td>{{ 'psc_backend_dashboard.Beschreibung'|trans }}:</td><td>{{ shop.description }}</td></tr>
<tr><td>{{ 'psc_backend_dashboard.Layout'|trans }}:</td><td>{{ shop.layout }}</td></tr>
<tr><td>{{ 'psc_backend_dashboard.UID'|trans }}:</td><td>{{ shop.uid }}</td></tr>
<tr><td>{{ 'psc_backend_dashboard.UUID'|trans }}:</td><td>{{ shop.uuid }}</td></tr>
<div aria-hidden="true" class="filament-hr border-t dark:border-gray-700"></div>
</div>
<table class=" w-full text-start divide-y table-auto">
<tbody class="divide-y">
<tr><td class="px-4 py-3">{{ 'psc_backend_dashboard.Name'|trans }}:</td><td class="px-4 py-3">{{ shop.title }}</td></tr>
<tr><td class="px-4 py-3">{{ 'psc_backend_dashboard.Beschreibung'|trans }}:</td><td class="px-4 py-3">{{ shop.description }}</td></tr>
<tr><td class="px-4 py-3">{{ 'psc_backend_dashboard.Layout'|trans }}:</td><td class="px-4 py-3">{{ shop.layout }}</td></tr>
<tr><td class="px-4 py-3">{{ 'psc_backend_dashboard.UID'|trans }}:</td><td class="px-4 py-3">{{ shop.uid }}</td></tr>
<tr><td class="px-4 py-3">{{ 'psc_backend_dashboard.UUID'|trans }}:</td><td class="px-4 py-3">{{ shop.uuid }}</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-4">
<div class="panel">
<div class="header">
<h4>Warnhinweise</h4>
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
<div class="p-2 space-y-2">
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
Warnhinweise
</h2>
</div>
<div class="body">
<table class="table">
<tr><td>Aktionen:</td><td><p>{% if queueErrorCount > 0 %}<span class="badge rounded-pill bg-danger">{{ queueErrorCount }}</span>{% else %}<span class="badge rounded-pill bg-success">Alles Ok</span>{% endif %}</p></td></tr>
<tr><td>Mailserver:</td><td><p>{% if not instance.isSmtpOwn %}<span class="badge rounded-pill bg-warning">Kein eigener definiert</span>{% else %}{% if instance.smtpHost == '' %}<span class="badge rounded-pill bg-danger">Smtp Einstellungen überprüfen</span>{% else %}<a href="{{ path("psc_backend_system_settings_index") }}" class="badge rounded-pill bg-success">Eigener SMTP eingetragen</a> <a target="_blank" href="{{ path("psc_backend_system_settings_smtptest") }}">Testen</a>{% endif %}{% endif %}</p></td></tr>
<div aria-hidden="true" class="filament-hr border-t dark:border-gray-700"></div>
</div>
<table class="w-full text-start divide-y table-auto">
<tbody>
<tr><td class="px-4 py-3">Aktionen:</td><td class="px-4 py-3"><p>{% if queueErrorCount > 0 %}<span class="bg-red-100 text-red-800 text-xs font-medium mr-2 px-2.5 py-0.5 rounded">{{ queueErrorCount }}</span>{% else %}<span class="bg-green-100 text-green-800 text-xs font-medium mr-2 px-2.5 py-0.5 rounded">Alles Ok</span>{% endif %}</p></td></tr>
<tr><td class="px-4 py-3">Mailserver:</td><td class="px-4 py-3"><p>{% if not instance.isSmtpOwn %}<span class="bg-red-100 text-red-800 text-xs font-medium mr-2 px-2.5 py-0.5 rounded">Kein eigener definiert</span>{% else %}{% if instance.smtpHost == '' or instance.smtpPort == '' or instance.smtpUsername == '' or instance.smtpPassword == '' %}<span class="bg-yellow-500 text-yellow-800 text-xs font-medium mr-2 px-2.5 py-0.5 rounded">Smtp Einstellungen überprüfen</span>{% else %}<span class="bg-green-100 text-green-800 text-xs font-medium mr-2 px-2.5 py-0.5 rounded">Alles Ok</span>{% endif %}{% endif %}</p></td></tr>
</tbody>
</table>
</div>
<div class="col-span-full">
<div class="p-2 space-y-2 bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
<div class="p-2 space-y-2">
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
Umsatz
</h2>
</div>
<div aria-hidden="true" class="filament-hr border-t dark:border-gray-700"></div>
</div>
<div id="sales-graph" class="chart no-padding">{{ render_chart(chart) }}</div>
</div>
</div>
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
<div class="p-2 space-y-2">
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
{{ 'psc_backend_dashboard.new customer'|trans}}
</h2>
</div>
<div aria-hidden="true" class="filament-hr border-t dark:border-gray-700"></div>
</div>
<table class=" w-full text-start divide-y table-auto">
<tbody class="divide-y">
{% for contact in lastContacts %}
{% if contact.email != 'sysadmin@printshopcreator.de' %}
<tr>
<td class="px-4 py-3">
<div>{{ contact.company }} {{contact.firstname }} {{ contact.lastname }}</div>
<div class="text-sm text-gray-500">{{contact.email}}</div>
</td>
<td class="">
<div>
{{contact.createdAt|date("d.m.Y")}}
</div>
<div class="text-sm text-gray-500">
{{contact.createdAt|date("H:m:s")}}
</div>
</td>
<td class="text-end px-4 py-3">
<a href="{{ path("psc_shop_contact_backend_edit", {uuid: contact.uuid}) }}" class="text-gray-900 bg-gray-100 hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 font-medium rounded-lg text-sm px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-gray-500">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 text-psc">
<path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10" />
</svg>
</a>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div>
<div class="panel">
<div class="header">
<h4>Sales Graph</h4>
<div class="bg-white rounded-xl shadow dark:border-gray-600 dark:bg-gray-800">
<div class="p-2 space-y-2">
<div class="flex items-center justify-between gap-8 px-4 py-2 mb-2">
<h2 class="text-xl font-medium tracking-tight filament-card-heading">
{{ 'psc_backend_dashboard.new orders'|trans}}
</h2>
</div>
<div class="body">
{{ render_chart(chart) }}
<div aria-hidden="true" class="filament-hr border-t dark:border-gray-700"></div>
</div>
<table class=" w-full text-start divide-y table-auto">
<tbody class="divide-y">
{% for order in lastOrders %}
<tr>
<td class="px-4 py-3">
<div>{{ order.alias }} {{order.invoiceAddress.firstname }} {{ order.invoiceAddress.lastname }}</div>
<div class="text-sm text-gray-500">{{order.invoiceAddress.email}}</div>
</td>
<td class="">
<div>
{{order.created|date("d.m.Y")}}
</div>
<div class="text-sm text-gray-500">
{{order.created|date("H:m:s")}}
</div>
</td>
<td class="text-end px-4 py-3">
<a href="{{ path("psc_shop_contact_backend_edit", {uuid: order.uuid}) }}" class="text-gray-900 bg-gray-100 hover:bg-gray-200 focus:ring-4 focus:outline-none focus:ring-gray-100 font-medium rounded-lg text-sm px-5 py-2.5 text-center inline-flex items-center dark:focus:ring-gray-500">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4 text-psc">
<path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10" />
</svg>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -16,7 +16,8 @@ namespace PSC\Shop\ContactBundle\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use PSC\Shop\EntityBundle\Entity\Contact;
use PSC\Shop\EntityBundle\Entity\Shop;
use PSC\Shop\EntityBundle\Entity\Shop as PSCShop;
use PSC\System\SettingsBundle\Service\Shop;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
@ -169,4 +170,22 @@ class ContactRepository extends ServiceEntityRepository implements UserLoaderInt
return $user;
}
public function getLastCreatedContacts(PSCShop $selectedShop, int $limit): array
{
$query = $this->getEntityManager()
->createQuery('
SELECT c FROM PSCEntityBundle:Contact c
JOIN c.shops s
WHERE s.uid = :id ORDER BY c.createdAt DESC')
->setParameter('id', $selectedShop->getUid())
->setMaxResults($limit);
try {
$contacts = $query->execute();
return $contacts;
} catch (\Doctrine\ORM\NoResultException $e) {
return [];
}
}
}

View File

@ -283,6 +283,27 @@ class Order
}
public function getLastOrders(int $limit = 10): array
{
$query = $this->entityManager
->createQuery('
SELECT c FROM PSCEntityBundle:Order c
JOIN c.shop s
WHERE s.uid = :id ORDER BY c.created DESC')
->setParameter('id', $this->shopService->getSelectedShop()->getUid())
->setMaxResults($limit);
try {
$orders = $query->execute();
$tmp = [];
foreach ($orders as $order) {
$tmp[] = $this->getOrderByUid($order->getUid());
}
return $tmp;
} catch (\Doctrine\ORM\NoResultException $e) {
return [];
}
}
public function getOrderByUuid($uuid, $load_only_order = false): PSCBase
{
$this->load_only_order = $load_only_order;

View File

@ -14,15 +14,8 @@
namespace PSC\System\SettingsBundle\Controller;
use Doctrine\ODM\MongoDB\DocumentManager;
use PSC\Shop\EntityBundle\Document\Instance;
use PSC\Shop\QueueBundle\Service\Queue\Manager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
/**
@ -33,14 +26,6 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
*/
class FtpController extends AbstractController
{
/**
* Meine Ftp Daten
*
*
*
* @param DocumentManager $mongoManager
* @return array
*/
#[Security("is_granted('ROLE_ADMIN')")]
#[Template]
public function myDataAction(DocumentManager $mongoManager)
@ -48,4 +33,12 @@ class FtpController extends AbstractController
return array();
}
#[Security("is_granted('ROLE_ADMIN')")]
#[Template]
public function myDataTailwindAction(DocumentManager $mongoManager)
{
return array();
}
}

View File

@ -20,6 +20,9 @@
"suppressImplicitAnyIndexErrors": true,
"sourceMap": false,
"allowSyntheticDefaultImports": true
}
},
"exclude": [
"./var/plugins/",
]
}

View File

@ -16,7 +16,7 @@ export default defineConfig({
},
build: {
outDir: '../Resources/public',
outDir: '../Resources/public/invoiceapp',
emptyOutDir: true, // also necessary
}
})

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
#root{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}.logo{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.react:hover{filter:drop-shadow(0 0 2em #61dafbaa)}@keyframes logo-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (prefers-reduced-motion: no-preference){a:nth-of-type(2) .logo{animation:logo-spin infinite 20s linear}}.card{padding:2em}.read-the-docs{color:#888}:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,14 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="./vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<script type="module" crossorigin src="./assets/index-0CZfAX1X.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-DiwrgTda.css">
</head>
<body>
<div id="root"></div>
</body>
</html>

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -7,10 +7,9 @@
<meta name="description" content="">
<meta name="author" content="">
<base href="/apps/backend/component/invoice/index/create/"/>
<link rel="stylesheet" href="/apps/bundles/pluginsystempscinvoice/invoicets/assets/index.js"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
{% block stylesheets %}
{{ encore_entry_link_tags('plugins/system/psc/invoice') }}
{% endblock %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<!-- GOOGLE FONT -->
@ -22,7 +21,7 @@
<script>
var jwt_token = '{{ jwt }}';
</script>
{{ encore_entry_script_tags('plugins/system/psc/invoice') }}
<script src="/apps/bundles/pluginsystempscinvoice/invoicets/assets/index.js"></script>
{% endblock %}
</body>
</html>

View File

@ -1,11 +0,0 @@
import "reflect-metadata";
//import './src/css/style.scss'
import './src/css/output.css'
import * as $ from "jquery";
import { App } from "./src/app/app";
declare var jwt_token: String;
let app = new App(jwt_token);
app.init();
app.run();

File diff suppressed because it is too large Load Diff

View File

@ -1,48 +0,0 @@
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@ebay/nice-modal-react": "^1.2.13",
"@react-icons/all-files": "^4.1.0",
"@rjsf/core": "^5.18.3",
"@rjsf/utils": "^5.18.3",
"@rjsf/validator-ajv6": "^5.18.3",
"@types/react": "^18.3.1",
"@types/react-dom": "^18.3.0",
"@types/styled-components": "^5.1.34",
"axios": "^1.6.8",
"debounce-promise": "^3.1.2",
"eta": "^3.4.0",
"flowbite": "^2.3.0",
"flowbite-react": "^0.9.0",
"i18next": "^23.11.3",
"prop-types": "^15.8.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^14.1.1",
"react-router-dom": "^6.23.0",
"react-select": "^5.8.0",
"react-select-async-paginate": "^0.7.4",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1",
"styled-components": "^6.1.11",
"tsyringe": "^4.8.0",
"use-debounce": "^10.0.0",
"uuid": "^9.0.1",
"zustand": "^4.5.2"
},
"devDependencies": {
"@types/jquery": "^3.5.30",
"@types/uuid": "^10.0.0",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.38",
"tailwindcss": "^3.4.3"
}
}

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@ -1,47 +0,0 @@
import * as Eta from 'eta'
import { Token } from '../services/token'
import {container} from "tsyringe"
import React from 'react'
import ReactDOM from 'react-dom/client'
import NiceModal from "@ebay/nice-modal-react"
import BaseComponent from '../modules/base/BaseComponent'
import {Route, HashRouter as Router, Routes, useSearchParams} from "react-router-dom"
export class App {
private searchParams: any
private setSearchParams: any
constructor(jwt: String) {
let token = container.resolve(Token)
console.log(jwt)
token.currentToken = jwt
token.init()
}
init(): void {
this.buildUi()
}
buildUi() {
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
<NiceModal.Provider>
<Router>
<Routes>
<Route path="/" element={<BaseComponent />} />
<Route path="/:uuid" element={<BaseComponent />} />
</Routes>
</Router>
</NiceModal.Provider>
)
}
run(): void {
}
}

View File

@ -1,4 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@ -1,55 +0,0 @@
import { Subject, Observable, Subscription } from 'rxjs'
export function observeObject<T extends Object>(obj: T): [T, Observable<T>] {
/// Variables
const changes$ = new Subject<T>()
const propertySubscriptions = new Map<PropertyKey, Subscription>()
/// Helper Functions
const observeChildObject = <U extends {}>(
target: T,
prop: PropertyKey,
childVal: U
): U => {
const [childProxy, childChanges$] = observeObject(childVal)
const sub = childChanges$.subscribe(childObj => changes$.next(target))
propertySubscriptions.set(prop, sub)
return childProxy
}
const stopObservingChildObject = prop => {
propertySubscriptions.get(prop).unsubscribe()
propertySubscriptions.delete(prop)
}
/// Proxy Creation
const proxy = new Proxy({} as T, {
set: (target, prop, value, receiver) => {
// If property is changed TO an object.
if (typeof value === 'object' && !propertySubscriptions.has(prop)) {
value = observeChildObject(target, prop, value)
}
// If property is changed FROM an object.
else if (typeof value !== 'object' && propertySubscriptions.has(prop)) {
stopObservingChildObject(prop)
}
const returnVal = Reflect.set(target, prop, value, receiver)
changes$.next(target)
return returnVal
},
deleteProperty: (target, prop) => {
const returnVal = Reflect.deleteProperty(target, prop)
if (propertySubscriptions.has(prop)) {
stopObservingChildObject(prop)
}
changes$.next(proxy)
return returnVal
}
})
/// Initialization
for (let key of Object.keys(obj)) {
proxy[key] = obj[key]
}
return [proxy, changes$]
}

View File

@ -1,22 +0,0 @@
import {v4 as uuidv4} from 'uuid'
export class Account {
uid: Number
appendix: String
title: String
uuid: String
constructor() {
this.uid = 0
this.uuid = ""
this.appendix = ""
this.title = ""
}
parseFromJson(item: any) {
this.uid = item.account.uid
this.uuid = item.account.uuid
this.title = item.account.title
this.appendix = item.account.appendix
}
}

View File

@ -1,73 +0,0 @@
import {v4 as uuidv4} from 'uuid'
import {Contact} from "./contact"
import {Shop} from "./shop"
export class Address {
uid: Number
uuid: String
firstname: String
lastname: String
street: String
houseNumber: String
zip: String
company: String
company2: String
phone: String
country: String
ustid: String
city: String
email: String
contact: Contact
type: Number
constructor() {
this.uid = 0
this.uuid = ""
this.firstname = ""
this.lastname = ""
this.street = ""
this.houseNumber = ""
this.zip = ""
this.company = ""
this.company2 = ""
this.city = ""
this.email = ""
this.country = ""
this.ustid = ""
this.contact = new Contact()
this.type = 0
}
parseFromJson(item: any) {
this.uid = item.uid
this.uuid = item.uuid
this.firstname = item.firstname
this.lastname = item.lastname
this.street = item.street
this.houseNumber = item.houseNumber
this.zip = item.zip
this.company = item.company
this.company2 = item.company2
this.phone = item.phone
this.city = item.city
this.email = item.email
this.type = item.type
this.country = item.country
this.ustid = item.ustid
}
parseFromFormData(formdata: any) {
this.email = formdata.email
this.company = formdata.company
this.firstname = formdata.firstname
this.lastname = formdata.lastname
this.street = formdata.street
this.houseNumber = formdata.houseNumber
this.zip = formdata.zip
this.city = formdata.city
this.phone = formdata.phone
this.country = formdata.country
this.ustid = formdata.ustid
}
}

View File

@ -1,82 +0,0 @@
import {Shop} from "./shop"
export class LayouterData {
firstname: string
company: string
lastname: string
street: string
houseNumber: string
zip: string
city: string
phone: string
country: string
ustid: string
constructor() {
this.firstname = ""
this.company = ""
this.lastname = ""
this.street = ""
this.houseNumber = ""
this.zip = ""
this.city = ""
this.phone = ""
this.country = ""
this.ustid = ""
}
}
export class Contact {
uid: number
username: string
email: string
password: string
uuid: string
shops: Shop[]
layouter_data: LayouterData
constructor() {
this.uid = 0
this.uuid = ""
this.username = ""
this.email = ""
this.password = ""
this.shops = []
this.layouter_data = new LayouterData()
}
parseFromJson(item: any) {
this.uid = item.contact.uid
this.uuid = item.contact.uuid
this.email = item.contact.email
this.username = item.contact.username
this.layouter_data.firstname = item.contact.layouter_data.firstname
this.layouter_data.company = item.contact.layouter_data.company
this.layouter_data.lastname = item.contact.layouter_data.lastname
this.layouter_data.street = item.contact.layouter_data.street
this.layouter_data.houseNumber = item.contact.layouter_data.houseNumber
this.layouter_data.zip = item.contact.layouter_data.zip
this.layouter_data.city = item.contact.layouter_data.city
this.layouter_data.phone = item.contact.layouter_data.phone
this.layouter_data.country = item.contact.layouter_data.country
this.layouter_data.ustid = item.contact.layouter_data.ustid
}
parseFromFormData(formdata: any, shop: Shop = null) {
this.email = formdata.email
this.layouter_data.company = formdata.company
this.layouter_data.firstname = formdata.firstname
this.layouter_data.lastname = formdata.lastname
this.layouter_data.street = formdata.street
this.layouter_data.houseNumber = formdata.houseNumber
this.layouter_data.zip = formdata.zip
this.layouter_data.city = formdata.city
this.layouter_data.phone = formdata.phone
this.layouter_data.country = formdata.country
this.layouter_data.ustid = formdata.ustid
if(shop) {
this.shops.push(shop)
}
}
}

View File

@ -1,15 +0,0 @@
export class Country {
uuid: String = ""
title: String = ""
code: String = ""
useVatWithUstId: boolean = true
useVatWithoutUstId: boolean = true
parseFromJson(item: any) {
this.uuid = item.uuid
this.title = item.title
this.code = item.code
this.useVatWithUstId = item.useVatWithUstId
this.useVatWithoutUstId = item.useVatWithoutUstId
}
}

View File

@ -1,73 +0,0 @@
import {v4 as uuidv4} from 'uuid'
import {Contact} from "./contact"
import {Account} from "./account"
import {Address} from "./address"
import {Pos} from "./pos"
import {Payment} from "./payment"
import {Shipping} from "./shipping"
import {Shop} from "./shop"
export class Order {
alias: String
uuid: String
draft: Boolean
saved: boolean
contact: Contact = new Contact()
account: Account = new Account()
deliveryAddress: Address = new Address()
senderAddress: Address = new Address()
invoiceAddress: Address = new Address()
positions: Array<Pos> = []
payment: Payment = new Payment()
shipping: Shipping = new Shipping()
basketField1: String
basketField2: String
type: Number
shop: Shop = new Shop()
net: number
vat: number
gross: number
constructor() {
this.uuid = uuidv4()
this.basketField1 = ""
this.basketField2 = ""
this.draft = true
this.saved = false
}
addPosition(pos: Pos) {
this.positions.push(pos)
}
parseFromJson(item: any) {
this.shop.parseFromJson(item)
this.contact.parseFromJson(item)
this.account.parseFromJson(item)
this.shipping.parseFromJson(item)
this.payment.parseFromJson(item)
this.invoiceAddress.parseFromJson(item.invoiceAddress)
this.deliveryAddress.parseFromJson(item.deliveryAddress)
this.senderAddress.parseFromJson(item.senderAddress)
this.alias = item.alias
this.uuid = item.uuid
this.type = item.type
this.draft = item.draft
this.saved = true
this.basketField1 = item.basketField1
this.basketField2 = item.basketField2
item.positions.map((e) => {
let pos = new Pos()
pos.parseFromJson(e)
this.positions.push(pos)
})
}
}

View File

@ -1,11 +0,0 @@
export class Payment {
uid: Number = 0
title: String = ""
uuid: String = ""
parseFromJson(item: any) {
this.uid = item.payment.uid
this.title = item.payment.title
this.uuid = String(item.payment.uuid)
}
}

View File

@ -1,23 +0,0 @@
import {v4 as uuidv4} from 'uuid'
import {Product} from "./product"
import {Price} from "./price"
export class Pos {
uuid: String = ""
product: Product = new Product()
status: Number = 10
count: Number = 1
price: Price = new Price()
constructor() {
this.uuid = uuidv4()
}
parseFromJson(item: any) {
this.count = item.price.count
this.status = item.status
this.uuid = item.uuid
this.price.parseFromJson(item.price)
this.product.parseFromJson(item.product)
}
}

View File

@ -1,18 +0,0 @@
export class Price {
net: number = 0
vat: number = 0
gross: number = 0
allNet: number = 0
allVat: number = 0
allGross: number = 0
parseFromJson(item: any) {
this.net = item.net
this.vat = item.vat
this.gross = item.gross
this.allNet = item.allNet
this.allVat = item.allVat
this.allGross = item.allGross
}
}

View File

@ -1,27 +0,0 @@
interface Param {
[key: string]: string | boolean | number
}
export class SpecialProductTypeObject {
params: Array<Param> = []
typ: Number = 0
parseFromJson(item: any) {
this.typ = item.typ
this.params = item.params
}
}
export class Product {
id: Number = 0
title: String = ""
uuid: String = ""
specialProductTypeObject: SpecialProductTypeObject = new SpecialProductTypeObject()
parseFromJson(item: any) {
this.id = item.id
this.title = item.title
this.uuid = item.uuid
this.specialProductTypeObject.parseFromJson(item.specialProductTypeObject)
}
}

View File

@ -1,6 +0,0 @@
export class ProductGroup {
id: Number = 0
label: String = ""
uuid: String = ""
//options: ProductGroup[] = []
}

View File

@ -1,12 +0,0 @@
export class Shipping {
uid: Number = 0
title: String = ""
uuid: String = ""
parseFromJson(item: any) {
this.uid = item.shipping.uid
this.title = item.shipping.title
this.uuid = String(item.shipping.uuid)
}
}

View File

@ -1,20 +0,0 @@
export class Shop {
id: number = 0
name: string = ""
uuid: string = ""
basketField1: string = ""
basketField2: string = ""
basketPosField1: string = ""
basketPosField2: string = ""
parseFromJson(item: any) {
this.id = item.shop.id
this.name = item.shop.name
this.uuid = item.shop.uuid
this.basketField1 = item.shop.basketField1
this.basketField2 = item.shop.basketField2
this.basketPosField1 = item.shop.basketPosField1
this.basketPosField2 = item.shop.basketPosField2
}
}

View File

@ -1,70 +0,0 @@
import { AsyncPaginate } from "react-select-async-paginate"
import { AccountService } from '../../services/account'
import { container } from 'tsyringe'
import { OrderState } from '../../state/order'
import {useEffect, useState} from 'react'
import * as PropTypes from 'prop-types'
import { Shop } from '../../model/shop'
import {Order} from "../../model/order"
import { SelectLabel } from "../base/SelectLabel"
import React from 'react'
const AccountSelectComponent = ({shop, order}) => {
const [shopUuid, setShopUuid] = useState(null)
const [account, setAccount] = useState(0)
useEffect(() => {
setShopUuid(shop.uuid)
}, [shop.uuid])
const orderState: OrderState = container.resolve(OrderState)
const loadOptions = async (searchQuery, loadedOptions) => {
const account_service = new AccountService()
const data = await account_service.getAccounts(shop)
return {
options: data,
hasMore: false,
}
}
useEffect(() => {
setAccount(order.account.uuid)
}, [order.account])
const onChange = (option) => {
order.account = option
let orderObj = orderState.getCurrentOrder().getValue()
orderObj.account = option
orderState.setCurrentOrder(orderObj)
setAccount(option.uid)
}
return (
<AsyncPaginate
defaultOptions
className={`${account == 0 ? "border border-danger" : ""}`}
key={JSON.stringify(shopUuid)}
defaultValue={order.account}
components={{Control: SelectLabel}}
name={'Firma'}
loadOptions={loadOptions}
placeholder=''
getOptionValue={(option) => option.uuid}
getOptionLabel={(option) => option.title}
onChange={onChange}
isSearchable={true}
/>
)
}
AccountSelectComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
order: PropTypes.instanceOf(Order),
}
export default AccountSelectComponent

View File

@ -1,67 +0,0 @@
import { Shop } from '../../model/shop'
import ContactComponent from '../contact/ContactComponent'
import TopBarComponent from '../topbar/TopBarComponent'
import PositionsComponent from '../positions/PositionsComponent'
import {useEffect, useState} from 'react'
import {Order} from "../../model/order"
import PaymentComponent from "../payment/PaymentComponent"
import ShippingComponent from "../shipping/ShippingComponent"
import ButtonComponent from "../button/ButtonComponent"
import {useParams} from "react-router-dom"
import {container} from "tsyringe"
import {OrderState} from "../../state/order"
import {OrderService} from "../../services/order"
import InfoFieldComponent from "../info/InfoFieldComponent"
import React from 'react'
import OrderAliasComponent from '../order/OrderAliasComponent'
const BaseComponent = (props) => {
const [shop, setShop] = useState<Shop>(new Shop())
const [order, setOrder] = useState<Order>(new Order())
const order_state = container.resolve(OrderState)
const orderService = container.resolve(OrderService)
const loadOrder = async (uuid: String) => {
orderService.getOrder(uuid).then((orderObj) => {
order_state.setCurrentOrder(orderObj)
setShop(orderObj.shop)
setOrder(orderObj)
})
}
let params = useParams()
useEffect(() => {
if(params.uuid) {
loadOrder(params.uuid)
}
}, [])
return (
<React.StrictMode>
<div className='ml-1 mt-1 mr-1'>
<div className="flex gap-1 mt-1 mb-1">
<div className="flex-1">
<OrderAliasComponent order={order} />
</div>
<div className="">
<ButtonComponent loadOrder={loadOrder}/>
</div>
</div>
<TopBarComponent shop={shop} order={order} change={setShop} />
<div className="mt-1 mb-1">{ shop.id != 0 && <ContactComponent shop={shop} order={order} /> }</div>
<div>{ shop.id != 0 && <PositionsComponent shop={shop} order={order} /> }</div>
<div className="mt-1 mb-1 flex gap-1">
<div className="flex-1">{ shop.id != 0 && <PaymentComponent shop={shop} order={order} /> }</div>
<div className="flex-1">{ shop.id != 0 && <ShippingComponent shop={shop} order={order} /> }</div>
</div>
{ shop.id != 0 && <InfoFieldComponent shop={shop} order={order} /> }
</div>
</React.StrictMode>
)
}
export default BaseComponent

View File

@ -1,21 +0,0 @@
import { BsPlus } from "@react-icons/all-files/bs/BsPlus"
import { BsPencil } from "@react-icons/all-files/bs/BsPencil"
import { RiSaveFill } from "@react-icons/all-files/ri/RiSaveFill"
import { RiDeleteBin2Line } from "@react-icons/all-files/ri/RiDeleteBin2Line"
import { BsXCircle } from "@react-icons/all-files/bs/BsXCircle"
import { Button as BaseButton } from "flowbite-react"
import React from 'react'
const Button = ({ type , variant , onClick }) => {
return (
<BaseButton color={variant} pill onClick={onClick}>
{ type == 1 && <BsPlus/> }
{ type == 2 && <BsPencil/> }
{ type == 3 && <RiSaveFill/> }
{ type == 4 && <BsXCircle/> }
{ type == 5 && <RiDeleteBin2Line/> }
</BaseButton>
);
};
export default Button;

View File

@ -1,18 +0,0 @@
import React from 'react'
interface IProps {
price: number;
}
const Currency: React.FC<IProps> = ({ price }) => {
return (
<>
{Intl.NumberFormat('de-DE', {
style: 'currency',
currency: 'EUR'
}).format(price/100)}
</>
);
}
export default Currency;

View File

@ -1,24 +0,0 @@
import styled from "styled-components"
import { components } from "react-select"
import React from 'react'
export const SelectLabel = (props: any) => {
return (
<>
<components.Control {...props} />
<Label $isFloating={props.getValue().length == 0 || props.getValue()[0].uuid == ""}>{props.selectProps.name}</Label>
</>
);
};
const Label = styled.label<{ $isFloating?: boolean }>`
left: 10px;
pointer-events: none;
position: absolute;
transition: 0.2s ease all;
-moz-transition: 0.2s ease all;
-webkit-transition: 0.2s ease all;
top: ${(props) => (props.$isFloating ? `20%` : `0px`)};
font-size: ${(props) => (props.$isFloating ? `1rem` : `0.6rem`)};
`;

View File

@ -1,67 +0,0 @@
import { OrderState } from '../../state/order'
import {container} from "tsyringe"
import { OrderService } from '../../services/order'
import { Component } from 'react'
import {debounceTime} from "rxjs"
import {Order} from "../../model/order"
import { RiSaveFill } from "@react-icons/all-files/ri/RiSaveFill"
import { RiPrinterFill } from "@react-icons/all-files/ri/RiPrinterFill"
import { Button } from "flowbite-react"
import React from 'react'
class ButtonComponent extends Component<{loadOrder},{disabled: boolean}> {
orderState: OrderState
orderService: OrderService
constructor(props) {
super(props)
this.orderState = container.resolve(OrderState)
this.orderService = container.resolve(OrderService)
this.state = {disabled: true}
}
componentDidMount() {
this.orderState.getCurrentOrder().pipe(debounceTime(2000)).subscribe((e) => this.saveButton(e))
}
saveButton(order: Order) {
if(order.contact.username != ""
&& order.payment.title != ""
&& order.shipping.title != ""
&& order.shop.name != ""
&& order.account.title != ""
&& order.invoiceAddress.uuid != ""
&& order.type != 0
) {
this.setState({disabled: false})
}
}
async handlePrint(e) {
const uuid = this.orderState.getCurrentOrder().value.uuid;
const type = this.orderState.getCurrentOrder().value.type;
window.open('/apps/backend/order/detail/print/' + type + '/' + uuid)
}
async handleSave(e) {
e.preventDefault()
let result = await this.orderService.saveOrder(this.orderState.getCurrentOrder().value)
this.props.loadOrder(result['uuid'])
}
render() {
return (
<div className="flex gap-3">
<Button size="xs" color="info" disabled={this.state.disabled} onClick={(e:any) => this.handleSave(e)}>
<RiSaveFill className="mr-2 h-5 w-5"/> Speichern
</Button>
<Button size="xs" color="success" disabled={!this.orderState.getCurrentOrder().value.saved} onClick={(e:any) => this.handlePrint(e)}>
<RiPrinterFill className="mr-2 h-5 w-5"/> Drucken
</Button>
</div>
)
}
}
export default ButtonComponent

View File

@ -1,48 +0,0 @@
import React from 'react'
import * as PropTypes from "prop-types"
import {Order} from "../../model/order"
import {container} from "tsyringe"
import {OrderState} from "../../state/order"
import { debounceTime } from 'rxjs'
import {OrderService} from "../../services/order"
import Currency from "../base/Currency"
type MyState = {
order: Order // like this
}
class CalcComponent extends React.Component<{ },MyState> {
orderState: OrderState
orderService: OrderService
state: MyState = {
order: new Order()
}
constructor(props) {
super(props)
this.orderState = container.resolve(OrderState)
this.orderService = container.resolve(OrderService)
}
componentDidMount() {
this.orderState.getCurrentOrder().pipe(debounceTime(2000)).subscribe((e) => this.calc(e))
}
async calc(e: Order) {
let result = await this.orderService.calcOrder(e)
this.setState(() => ({
order: result,
}))
}
render() {
return (
<h3>
<small className="text-body-secondary"> Netto: <Currency price={this.state.order.net} /> + MwSt.: <Currency price={this.state.order.vat} /> =</small> Brutto: <Currency price={this.state.order.gross} />
</h3>
)
}
}
export default CalcComponent

View File

@ -1,16 +0,0 @@
import * as PropTypes from 'prop-types'
import { Address } from '../../model/address'
import React from 'react'
const AddressDetail = ({address}) => {
return (
<small>{address.company} {address.firstname} {address.lastname} {address.street} {address.houseNumber} {address.country} {address.zip} {address.city}</small>
)
}
AddressDetail.propTypes = {
address: PropTypes.instanceOf(Address)
}
export default AddressDetail

View File

@ -1,129 +0,0 @@
import { useEffect, useState } from 'react'
import NiceModal, { useModal, bootstrapDialog } from "@ebay/nice-modal-react"
import Button from '../base/Button'
import {RJSFSchema} from "@rjsf/utils"
import validator from "@rjsf/validator-ajv6"
import Form from "@rjsf/core"
import { CountryService } from '../../services/country'
import { Modal } from "flowbite-react"
import React from 'react'
const Addressdiv = NiceModal.create(
({ title, action, address, shop }) => {
const country_api = new CountryService()
const modal = useModal()
const [formData, setFormData] = useState({})
const [schema, setSchema] = useState<RJSFSchema>({})
useEffect(() => {
if(address) {
setFormData({
email: address.email,
firstname: address.firstname,
lastname: address.lastname,
company: address.company,
street: address.street,
houseNumber: address.houseNumber,
zip: address.zip,
city: address.city,
phone: address.phone,
country: address.country,
ustid: address.ustid
})
}
}, [address])
useEffect(() => {
country_api.getCountry(shop).then(( data ) => {
var countrys: array = [];
data.forEach((item) => {
countrys.push({'title': item.code, 'const': item.code})
})
var schema: RJSFSchema = {
title: 'Address',
type: 'object',
required: ['email'],
properties: {
email: { type: 'string', format: 'email', title: 'E-Mail' },
company: { type: 'string', title: 'Company'},
firstname: { type: 'string', title: 'Firstname'},
lastname: { type: 'string', title: 'Lastname'},
street: { type: 'string', title: 'Street'},
houseNumber: { type: 'string', title: 'Housenumber'},
zip: { type: 'string', title: 'Zip'},
city: { type: 'string', title: 'City'},
phone: { type: 'string', title: 'Phone'},
ustid: { type: 'string', title: 'UstId'},
country: { type: 'string', title: 'Country', oneOf: countrys}
}
};
setSchema(schema)
});
}, []);
const uiSchema: RJSFSchema = {
"ui:submitButtonOptions": {
"submitText": "Save",
"norender": true,
"props": {
"disabled": false,
"className": "btn btn-info"
}
},
}
return (
<Modal show={modal.visible} onClose={() => modal.remove()}>
<Modal.Header>
<div>{title}</div>
</Modal.Header>
<Modal.Body>
{action === "Save" && (
<Form
schema={schema}
formData={formData}
uiSchema={uiSchema}
validator={validator}
onChange={(e) => setFormData(e.formData)}
/>
)}
</Modal.Body>
<Modal.Footer>
<Button
type={3}
variant="success"
onClick={() => {
if (action === "Save") {
if (formData) {
modal.resolve(formData)
modal.remove()
}
} else {
modal.resolve()
modal.remove()
}
}}
/>
<Button
type={4}
variant="warning"
onClick={() => {
modal.remove()
}}
/>
</Modal.Footer>
</Modal>
)
}
)
export default Addressdiv

View File

@ -1,53 +0,0 @@
import * as PropTypes from "prop-types"
import Button from "../base/Button"
import AddressModal from "./AddressModal"
import { useCallback } from 'react'
import { useModal } from '@ebay/nice-modal-react'
import { Address } from "../../model/address"
import { Shop } from "../../model/shop"
import React from 'react'
const AddressModalComponent = ({handleAdd, handleEdit, address, shop}) => {
const addressModal = useModal(AddressModal)
const showAddModal = useCallback(() => {
addressModal.show({title: 'Add Address', action: 'Save', shop}).then((formData) => {
addAddress(formData)
})
},[addressModal])
const showEditModal = useCallback((address) => {
addressModal.show({ title: 'Edit Address', action: 'Save', address: address, shop }).then((formData) => {
updateAddress(formData)
})
},[addressModal])
const updateAddress = (formData) => {
address.parseFromFormData(formData)
handleEdit(address)
}
const addAddress = (formData) => {
address = new Address()
address.parseFromFormData(formData)
handleAdd(address)
}
return (
<div className={'flex gap-1'}>
<Button type={1} variant="success" onClick={showAddModal} />
<Button type={2} variant="info" onClick={() => {
showEditModal(address)
}} />
</div>
)
}
AddressModalComponent.propTypes = {
handleAdd: PropTypes.func,
handleEdit: PropTypes.func,
address: PropTypes.instanceOf(Address),
shop: PropTypes.instanceOf(Shop)
}
export default AddressModalComponent

View File

@ -1,108 +0,0 @@
import * as PropTypes from 'prop-types'
import { AsyncPaginate } from "react-select-async-paginate"
import { Contact } from '../../model/contact'
import { Address } from '../../model/address'
import {container} from "tsyringe"
import {useEffect,useState} from 'react'
import {OrderState} from "../../state/order"
import {AddressService} from "../../services/address"
import AddressModalComponent from "./AddressModalComponent"
import { SelectLabel } from '../base/SelectLabel'
import AddressDetail from './AddressDetail'
import { Shop } from '../../model/shop'
import React from 'react'
const AddressSelect = ({address, contact, type, changeAddress, name, shop}) => {
const [contactUuid, setContactUuid] = useState(null)
const [localAddress, setLocalAddress] = useState(null)
const address_service = new AddressService()
let orderState = container.resolve(OrderState)
useEffect(() => {
if(contact.uuid != "") {
setContactUuid(contact.uuid)
}
}, [contact.uuid])
useEffect(() => {
setLocalAddress(address)
}, [address])
const order: OrderState = container.resolve(OrderState)
const loadOptions = async (searchQuery, loadedOptions) => {
const data = await address_service.getContactAddress(contact.uuid, type)
return {
options: data,
hasMore: false,
}
}
const handleAdd = (address: Address) => {
address.type = type
address.contact.uuid = contact.uuid
address_service.create(address).then(() => {
setLocalAddress(address)
changeAddress(address, type)
setContactUuid(Math.random())
})
}
const handleEdit = (address: Address) => {
address.type = type
address.contact.uuid = contact.uuid
address_service.update(address).then(() => {
setLocalAddress(address)
changeAddress(address, type)
setContactUuid(Math.random())
})
}
const setAddressInOrder = (option) => {
setLocalAddress(option)
changeAddress(option, type)
}
return (
<div className='flex gap-1'>
<div className='flex-1'>
<AsyncPaginate
defaultOptions
defaultValue={address}
key={JSON.stringify(contactUuid)}
loadOptions={loadOptions}
getOptionValue={(option) => option.uuid}
getOptionLabel={(option) => option.firstname + ' ' + option.lastname}
onChange={setAddressInOrder}
isSearchable={false}
name={name}
placeholder=''
components={{ Control: SelectLabel }}
/>
{ localAddress && <AddressDetail address={localAddress} />}
</div>
<div >
<AddressModalComponent address={localAddress} handleAdd={handleAdd} handleEdit={handleEdit} shop={shop}/>
</div>
</div>
)
}
AddressSelect.propTypes = {
address: PropTypes.instanceOf(Address),
contact: PropTypes.instanceOf(Contact),
shop: PropTypes.instanceOf(Shop),
type: PropTypes.number,
changeAddress: PropTypes.func,
name: PropTypes.string
}
export default AddressSelect

View File

@ -1,94 +0,0 @@
import * as React from 'react'
import * as PropTypes from 'prop-types'
import ContactSelect from './ContactSelect'
import AddressSelect from './AddressSelect'
import {Contact} from '../../model/contact'
import {Address} from '../../model/address'
import {useEffect, useState} from 'react'
import { OrderState } from '../../state/order'
import {container} from "tsyringe"
import AccountSelectComponent from '../account/AccountSelectComponent'
import { Order } from '../../model/order'
import { Shop } from '../../model/shop'
import React from 'react'
const ContactComponent = ({order, shop}) => {
let orderState = container.resolve(OrderState)
const [contact, setContact] = useState<Contact>(new Contact())
const changeAddress = (address: Address, type: Number) => {
if(type == 1) {
orderState.getCurrentOrder().value.invoiceAddress = address
order.invoiceAddress = address
}
if(type == 2) {
orderState.getCurrentOrder().value.deliveryAddress = address
order.deliveryAddress = address
}
if(type == 3) {
orderState.getCurrentOrder().value.senderAddress = address
order.senderAddress = address
}
}
return (
<>
<div className="flex">
<div className="flex-1">
<ContactSelect
order={order}
shop={shop}
onChange={setContact}
/>
</div>
<div className="flex-1">
<AccountSelectComponent
shop={shop} order={order}
/>
</div>
</div>
<div className="flex gap-1">
<div className="flex-1">
{ order.contact.uuid != "" && <AddressSelect
address={order.invoiceAddress}
contact={order.contact}
changeAddress={changeAddress}
name='Rechnungsadresse'
type={1}
shop={shop}
/> }
</div>
<div className="flex-1">
{ order.contact.uuid != "" && <AddressSelect
address={order.deliveryAddress}
contact={order.contact}
changeAddress={changeAddress}
name='Lieferadresse'
type={2}
shop={shop}
/> }
</div>
<div className="flex-1">
{ order.contact.uuid != "" && <AddressSelect
address={order.senderAddress}
changeAddress={changeAddress}
contact={order.contact}
name='Absenderadresse'
type={3}
shop={shop}
/> }
</div>
</div>
</>
)
}
ContactComponent.propTypes = {
order: PropTypes.instanceOf(Order),
shop: PropTypes.instanceOf(Shop),
}
export default ContactComponent

View File

@ -1,130 +0,0 @@
import { useEffect, useState } from 'react';
import NiceModal, { useModal, bootstrapDialog } from "@ebay/nice-modal-react";
import Button from '../base/Button'
import {RJSFSchema} from "@rjsf/utils";
import {Contact} from "../../model/contact";
import validator from "@rjsf/validator-ajv6";
import Form from "@rjsf/core";
import {CountryService} from "../../services/country";
import { Modal } from "flowbite-react";
import React from 'react'
const ContactModal = NiceModal.create(
({ title, action, contact, shop }) => {
const country_api = new CountryService()
const modal = useModal();
const [formData, setFormData] = useState({});
const [schema, setSchema] = useState<RJSFSchema>({})
useEffect(() => {
if(contact.uid != "") {
setFormData({
email: contact.username,
firstname: contact.layouter_data.firstname,
lastname: contact.layouter_data.lastname,
company: contact.layouter_data.company,
street: contact.layouter_data.street,
houseNumber: contact.layouter_data.houseNumber,
zip: contact.layouter_data.zip,
city: contact.layouter_data.city,
phone: contact.layouter_data.phone,
country: contact.layouter_data.country,
ustid: contact.layouter_data.ustid
});
}
}, [contact]);
const uiSchema: RJSFSchema = {
"ui:submitButtonOptions": {
"submitText": "Save",
"norender": true,
"props": {
"disabled": false,
"className": "btn btn-info"
}
},
};
useEffect(() => {
country_api.getCountry(shop).then(( data ) => {
var countrys = [];
data.forEach((item) => {
countrys.push({'title': item.code, 'const': item.code})
})
var schema: RJSFSchema = {
title: 'Contact',
type: 'object',
required: ['email'],
properties: {
email: { type: 'string', format: 'email', title: 'E-Mail' },
company: { type: 'string', title: 'Company'},
firstname: { type: 'string', title: 'Firstname'},
lastname: { type: 'string', title: 'Lastname'},
street: { type: 'string', title: 'Street'},
houseNumber: { type: 'string', title: 'Housenumber'},
zip: { type: 'string', title: 'Zip'},
city: { type: 'string', title: 'City'},
phone: { type: 'string', title: 'Phone'},
ustid: { type: 'string', title: 'UstId'},
country: { type: 'string', title: 'Country', oneOf: countrys}
}
};
setSchema(schema)
});
}, []);
return (
<Modal show={modal.visible} onClose={() => modal.remove()}>
<Modal.Header>
{title}
</Modal.Header>
<Modal.Body>
{action === "Save" && (
<Form
schema={schema}
formData={formData}
uiSchema={uiSchema}
validator={validator}
onChange={(e) => setFormData(e.formData)}
/>
)}
</Modal.Body>
<Modal.Footer>
<Button
type={3}
variant="success"
onClick={() => {
if (action === "Save") {
if (formData) {
modal.resolve(formData);
modal.remove();
}
} else {
modal.resolve();
modal.remove();
}
}}
/>
<Button
type={4}
variant="warning"
onClick={() => {
modal.remove();
}}
/>
</Modal.Footer>
</Modal>
);
}
);
export default ContactModal;

View File

@ -1,75 +0,0 @@
import {Contact} from "../../model/contact"
import * as PropTypes from "prop-types"
import {Shop} from "../../model/shop"
import Button from "../base/Button"
import ContactModal from "./ContactModal"
import { useCallback } from 'react'
import { useModal } from '@ebay/nice-modal-react'
import { ContactService } from "../../services/contact"
import { Address } from "../../model/address"
import { AddressService } from "../../services/address"
import React from 'react'
const ContactModalComponent = ({shop, handleAdd, handleEdit, contact}) => {
const contactModal = useModal(ContactModal)
const showAddModal = useCallback(() => {
contactModal.show({title: 'Add Contact', action: 'Save', shop: shop, contact: new Contact()}).then((formData) => {
addContact(formData)
})
},[contactModal])
const showEditModal = useCallback((contact) => {
contact = contact
contactModal.show({ title: 'Edit Contact', action: 'Save', contact: contact, shop: shop }).then((formData) => {
contact.parseFromFormData(formData)
updateContact(contact)
})
},[contactModal])
const updateContact = (contact) => {
const contact_api = new ContactService()
contact_api.updateContact(contact).then((e: any) => {
handleEdit(contact)
})
}
const addContact = (formData) => {
var contact = new Contact()
contact.parseFromFormData(formData, shop)
const contact_api = new ContactService()
contact_api.createContact(contact).then((e: any) => {
contact.parseFromJson(e)
var address = new Address()
address.parseFromFormData(formData)
address.contact.uuid = contact.uuid
address.type = 1
const address_api = new AddressService()
address_api.create(address)
address.type = 2
address_api.create(address)
handleAdd(contact)
})
}
return (
<div className={'flex gap-1'}>
<Button type={1} variant="success" onClick={showAddModal} />
<Button type={2} variant="info" onClick={() => {
showEditModal(contact)
}} />
</div>
)
}
ContactModalComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
handleAdd: PropTypes.func,
handleEdit: PropTypes.func,
contact: PropTypes.instanceOf(Contact)
}
export default ContactModalComponent

View File

@ -1,89 +0,0 @@
import * as PropTypes from 'prop-types'
import { AsyncPaginate } from "react-select-async-paginate"
import { Contact } from '../../model/contact'
import {ContactService} from '../../services/contact'
import { Shop } from '../../model/shop'
import {useEffect, useState} from 'react'
import { container } from 'tsyringe'
import { OrderState } from '../../state/order'
import ContactModalComponent from "./ContactModalComponent"
import { Order } from '../../model/order'
import { SelectLabel } from '../base/SelectLabel'
import React from 'react'
const ContactSelect = ({order, shop, onChange}) => {
const [shopUuid, setShopUuid] = useState(null);
const orderState: OrderState = container.resolve(OrderState);
const contact_api = new ContactService();
useEffect(() => {
setShopUuid(shop.uuid);
}, [shop]);
const loadOptions = async (searchQuery, loadedOptions, { page }) => {
let contacts = await contact_api.getContacts(searchQuery, page, shop);
return {
options: contacts,
hasMore: false,
additional: {
page: page + 1,
},
};
};
const setContactInOrder = (option) => {
orderState.getCurrentOrder().value.contact = option;
order.contact = option;
onChange(option);
};
const handleAdd = (contact: Contact) => {
setShopUuid(Math.random());
setContactInOrder(contact);
}
const handleEdit = (contact: Contact) => {
setShopUuid(Math.random());
setContactInOrder(contact);
}
return (
<div className="flex gap-1">
<div className="flex-1">
<AsyncPaginate
defaultOptions
className={`${orderState.getCurrentOrder().value.contact.username == "" ? "border border-danger" : ""}`}
key={JSON.stringify(shopUuid)}
defaultValue={order.contact}
components={{Control: SelectLabel}}
placeholder=''
name='Kunde'
value={order.contact}
loadOptions={loadOptions}
getOptionValue={(option) => option.uuid}
getOptionLabel={(option) => option.username}
onChange={setContactInOrder}
isSearchable={true}
additional={{
page: 1,
}}
/>
</div>
<div>
<ContactModalComponent shop={shop} contact={order.contact} handleAdd={handleAdd} handleEdit={handleEdit}/>
</div>
</div>
);
};
ContactSelect.propTypes = {
order: PropTypes.instanceOf(Order),
onChange: PropTypes.func,
shop: PropTypes.instanceOf(Shop),
};
export default ContactSelect;

View File

@ -1,34 +0,0 @@
import {useEffect, useState} from 'react'
import { container } from 'tsyringe'
import { OrderState } from '../../state/order'
import { SelectLabel } from '../base/SelectLabel'
import React from 'react'
const DraftComponent = ({order}) => {
const [draft, setDraft] = useState(true)
const orderState: OrderState = container.resolve(OrderState)
const onChange = (option) => {
let orderObj = orderState.getCurrentOrder().value
orderObj.draft = !draft
orderState.setCurrentOrder(orderObj)
setDraft(!draft)
}
useEffect(() => {
setDraft(order.draft)
}, [order.draft])
return (
<div className="gap-2">
<label className="inline-flex items-center cursor-pointer">
<input type="checkbox" value="1" className="sr-only peer" defaultChecked={draft} onChange={(e) => onChange(e)}/>
<div className="relative w-11 h-6 bg-gray-200 rounded-full peer peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-0.5 after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
<span className="ms-3 text-sm font-medium text-gray-900 dark:text-gray-300">Entwurf</span>
</label>
</div>
)
}
export default DraftComponent

View File

@ -1,62 +0,0 @@
import { AsyncPaginate } from "react-select-async-paginate"
import {ShippingService} from "../../services/shipping"
import * as PropTypes from "prop-types"
import {Shop} from "../../model/shop"
import {container} from "tsyringe"
import {OrderState} from "../../state/order"
import {Order} from "../../model/order"
import {useEffect, useState} from "react"
import React from 'react'
const InfoFieldComponent = ({shop, order}) => {
const [basketField1, setBasketField1] = useState<string>("");
const [basketField2, setBasketField2] = useState<string>("");
const orderState = container.resolve(OrderState);
useEffect(() => {
setBasketField1(order.basketField1)
setBasketField2(order.basketField1)
}, [order.basketField1, order.basketField2])
const changeBasketField1 = (value) => {
let orderObj = orderState.getCurrentOrder().getValue()
orderObj.basketField1 = value
orderState.setCurrentOrder(orderObj)
setBasketField1(value)
}
const changeBasketField2 = (value) => {
let orderObj = orderState.getCurrentOrder().getValue()
orderObj.basketField2 = value
orderState.setCurrentOrder(orderObj)
setBasketField2(value)
}
return (
<div className="">
<div className={"flex"}>
<div className={"flex-1"}>
<div className='flex gap-1'>
<input type="text" name="basketField1" value={basketField1} onChange={ e => changeBasketField1(e.target.value)} className={"bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"} placeholder={"Info 1"} />
<label>{shop.basketField1}</label>
</div>
</div>
<div className={"flex-1"}>
<div className='flex gap-1'>
<input type="text" name="basketField2" value={basketField2} onChange={e => changeBasketField2(e.target.value)} className={"bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"} placeholder={"Info 2"} />
<label>{shop.basketField2}</label>
</div>
</div>
</div>
</div>
);
}
InfoFieldComponent.propTypes = {
order: PropTypes.instanceOf(Order),
shop: PropTypes.instanceOf(Shop),
};
export default InfoFieldComponent;

View File

@ -1,18 +0,0 @@
import * as React from 'react';
import * as PropTypes from "prop-types";
import {Order} from "../../model/order";
const OrderAliasComponent = ({order}) => {
return (
<div className={"m-1 p-2"}>
<h4>NR: {order.alias}</h4>
</div>
);
}
OrderAliasComponent.propTypes = {
order: PropTypes.instanceOf(Order),
};
export default OrderAliasComponent;

View File

@ -1,71 +0,0 @@
import * as React from 'react'
import { AsyncPaginate } from "react-select-async-paginate"
import { PaymentService } from "../../services/payment"
import * as PropTypes from "prop-types"
import { Shop } from "../../model/shop"
import { container } from "tsyringe"
import { OrderState } from "../../state/order"
import { Order } from "../../model/order"
import { useEffect, useState } from "react"
import Select from 'react-select'
import { SelectLabel } from '../base/SelectLabel'
const PaymentComponent = ({ shop, order }) => {
const [shopUuid, setShopUuid] = useState(null)
const orderState = container.resolve(OrderState)
const [payment, setPayment] = useState(0)
const payment_service = new PaymentService()
const loadOptions = async (searchQuery, loadedOptions) => {
const data = await payment_service.getPayments(shop)
return {
options: data,
hasMore: false,
}
}
useEffect(() => {
setShopUuid(shop.uuid)
}, [shop.uuid])
useEffect(() => {
setPayment(order.payment.uid)
}, [order.payment])
const onChange = (option) => {
order.payment = option
let orderObj = orderState.getCurrentOrder().getValue()
orderObj.payment = option
orderState.setCurrentOrder(orderObj)
setPayment(option.uid)
}
return (
<div className={"p-2"}>
<AsyncPaginate
defaultOptions
key={JSON.stringify(shopUuid)}
components={{ Control: SelectLabel }}
defaultValue={order.payment}
loadOptions={loadOptions}
placeholder=''
name='Zahlart'
getOptionValue={(option) => option.uid}
getOptionLabel={(option) => option.title}
onChange={onChange}
isSearchable={false}
className={`${payment == 0 ? "border border-red-500" : ""}`}
/>
</div>
)
}
PaymentComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
order: PropTypes.instanceOf(Order),
}
export default PaymentComponent

View File

@ -1,83 +0,0 @@
import * as React from 'react'
import {useEffect, useState} from 'react'
import * as PropTypes from "prop-types"
import { Shop } from '../../model/shop'
import {Product} from "../../model/product"
import {ProductGroup} from "../../model/productGroup"
import ProductGroupSelect from "../product/ProductGroupSelect"
import ProductSelect from "../product/ProductSelect"
import ProductForm from "../product/ProductForm"
import {Order} from "../../model/order"
import { Pos } from '../../model/pos'
import Button from '../base/Button'
import { Modal } from "flowbite-react";
import React from 'react'
const AddPositionComponent = (props) => {
const [shop, setShop] = useState(null)
useEffect(() => {
setShop(props.shop)
}, [props.shop])
const [show, setShow] = useState(false)
const pos = new Pos();
const handleClose = () => setShow(false)
const handleShow = () => setShow(true)
const [product, setProduct] = useState<Product>(new Product())
const [productGroup, setProductGroup] = useState<ProductGroup>(new ProductGroup())
pos.product = product;
return (
<div className='text-center'>
<Button type={1} onClick={handleShow} variant="success"/>
<Modal size="7xl" show={show} onClose={() => handleClose()}
>
<Modal.Header>
add position
</Modal.Header>
<Modal.Body className="min-h-96">
<div className='flex'>
<div className='flex-1'>
<h4>ProductGroup</h4>
<ProductGroupSelect
value={productGroup}
shop={props.shop}
onChange={setProductGroup}
/>
</div>
<div className='flex-1'>
<h4>Product</h4>
<ProductSelect
value={product}
shop={props.shop}
productGroup={productGroup}
onChange={setProduct}
/>
</div>
</div>
<ProductForm
pos={pos}
handleChange={props.addPos}
handleClose={handleClose}
/>
</Modal.Body>
</Modal>
</div>
)
}
AddPositionComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
addPos: PropTypes.func
}
export default AddPositionComponent

View File

@ -1,49 +0,0 @@
import {useEffect, useState} from 'react'
import * as PropTypes from "prop-types"
import { Shop } from '../../model/shop'
import {Product} from "../../model/product"
import {ProductGroup} from "../../model/productGroup"
import ProductGroupSelect from "../product/ProductGroupSelect"
import ProductSelect from "../product/ProductSelect"
import { Pos } from '../../model/pos'
import Button from '../base/Button'
import ProductForm from '../product/ProductForm'
import { Modal } from "flowbite-react";
import React from 'react'
const EditPositionComponent = ({position, shop, changePos}) => {
const [show, setShow] = useState(false)
const handleClose = () => setShow(false)
const handleShow = () => setShow(true)
return (
<div>
<div>
<Button type={2} variant="gray" onClick={handleShow}/>
</div>
<Modal size="7xl" show={show} onClose={() => handleClose()}>
<Modal.Header className="text-mauve12 m-0 text-[17px] font-medium">
edit position
</Modal.Header>
<Modal.Body>
<ProductForm
pos={position}
handleChange={changePos}
handleClose={handleClose}
/></Modal.Body>
</Modal>
</div>
)
}
EditPositionComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
position: PropTypes.instanceOf(Pos),
changePos: PropTypes.func
}
export default EditPositionComponent

View File

@ -1,53 +0,0 @@
import * as PropTypes from "prop-types"
import PosComponent from "./PosComponent"
import {useEffect} from "react"
import {Order} from "../../model/order"
import { Shop } from '../../model/shop'
import React from 'react'
const ItemsComponent = ({positions, delPos, shop, changePos}) => {
return (
<div>
<div className={'flex'}>
<div className={'flex-1'}>
<h5>Pos</h5>
</div>
<div className={'flex-1'}>
<h5>Title</h5>
</div>
<div className={'flex-1'}>
<h5>Anzahl</h5>
</div>
<div className={'flex-1 text-end'}>
<h5>Netto</h5>
</div>
<div className={'flex-1 text-end'}>
<h5>Tax</h5>
</div>
<div className={'flex-1 text-end'}>
<h5>Gross</h5>
</div>
<div className={'flex-1 text-end'}>
<h5>Status</h5>
</div>
<div className={'flex-1'}>
</div>
</div>
<hr/>
{positions.map((object, i) => <PosComponent pos={object} shop={shop} delPos={delPos} changePos={changePos} key={i} index={i} />)}
</div>
)
}
ItemsComponent.propTypes = {
positions: PropTypes.array,
delPos: PropTypes.func,
changePos: PropTypes.func,
shop: PropTypes.instanceOf(Shop)
}
export default ItemsComponent

View File

@ -1,46 +0,0 @@
import React from 'react'
import * as PropTypes from "prop-types"
import {Pos} from "../../model/pos"
import Button from '../base/Button'
import EditPositionComponent from './EditPositionComponent'
import { Shop } from '../../model/shop'
import Currency from '../base/Currency'
const PosComponent = ({index, pos, delPos, changePos, shop}) => {
const deletePos = (uuid: String) => {
delPos(uuid)
}
return (
<>
<div className={'flex'}>
<div className={'flex-1'}>{index + 1}</div>
<div className={'flex-1'}>{pos.product.title}</div>
<div className={'flex-1'}>{pos.count}</div>
<div className={'flex-1 text-end'}><Currency price={ pos.price.allNet} /></div>
<div className={'flex-1 text-end'}><Currency price={ pos.price.allVat} /></div>
<div className={'flex-1 text-end'}><Currency price={ pos.price.allGross} /></div>
<div className={'flex-1 text-end'}></div>
<div className={'flex-1 text-end'}>
<div className="flex gap-1">
<EditPositionComponent shop={shop} position={pos} changePos={changePos} />
<Button type={5} variant={'failure'} onClick={() => deletePos(pos.uuid)} />
</div>
</div>
</div>
<hr/>
</>
)
}
PosComponent.propTypes = {
index: PropTypes.number,
pos: PropTypes.instanceOf(Pos),
shop: PropTypes.instanceOf(Shop),
delPos: PropTypes.func,
changePos: PropTypes.func
}
export default PosComponent

View File

@ -1,60 +0,0 @@
import React from 'react'
import AddPositionComponent from "./AddPositionComponent"
import ItemsComponent from "./ItemsComponent"
import * as PropTypes from "prop-types"
import { Shop } from '../../model/shop'
import {useEffect, useState} from "react"
import {Pos} from "../../model/pos"
import {Order} from "../../model/order"
import {container} from "tsyringe"
import {OrderState} from "../../state/order"
const PositionsComponent = ({order, shop, updateOrder}) => {
const orderState = container.resolve(OrderState)
const [positions, setPositions] = useState<Array<Pos>>(order.positions)
const addPos = (posObj) => {
setPositions([...positions, posObj])
}
const changePos = (posObj) => {
const nextCounters = positions.map((c, i) => {
if (c.uuid === posObj.uuid) {
return posObj
} else {
return c
}
})
setPositions(nextCounters)
}
const delPos = (uuid) => {
let pos = positions.filter((obj) => obj.uuid !== uuid)
setPositions(pos)
}
useEffect(() => {
let orderObj = orderState.getCurrentOrder().value
orderObj.positions = positions
orderState.setCurrentOrder(orderObj)
}, [positions])
return (
<div className={"p-2"}>
<ItemsComponent positions={positions} shop={shop} delPos={delPos} changePos={changePos}/>
<AddPositionComponent shop={shop} addPos={addPos}/>
</div>
)
}
PositionsComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
order: PropTypes.instanceOf(Order),
updateOrder: PropTypes.func
}
export default PositionsComponent

View File

@ -1,121 +0,0 @@
import * as PropTypes from 'prop-types'
import { Shop } from '../../model/shop'
import {Product} from "../../model/product"
import validator from "@rjsf/validator-ajv6"
import { JSONSchema7 } from "json-schema"
import { container } from 'tsyringe'
import Form from "@rjsf/core"
import {ProductService} from "../../services/product"
import {useEffect, useRef, useState} from "react"
import {Price} from "../../model/price"
import {Pos} from "../../model/pos"
import { useDebouncedCallback } from 'use-debounce'
import Button from '../base/Button'
import Currency from '../base/Currency'
import React from 'react'
const ProductForm = ({shop, pos, handleClose, handleChange}) => {
const product_api = new ProductService()
const [schema, setSchema] = useState<JSONSchema7>({})
const [uiSchema, setUiSchema] = useState<JSONSchema7>({})
const [formData, setFormData] = useState({})
const [type, setType] = useState<number>(0)
const [price, setPrice] = useState<Price>(new Price())
const loadSchema = (loadData: any) => {
if(pos.product.uuid == "") {
return []
}
var data = {}
product_api.getAddProductSchema(pos.product, loadData).then((value) => {
for(const obj in value['jsonForm']['properties']) {
data[obj] = value['jsonForm']['properties'][obj]['default']
}
setFormData(data)
setSchema(value['jsonForm'])
setUiSchema(value['uiJsonForm'])
setPrice(value['price'])
setType(value['typ'])
})
}
const changeCalc = (formData) => {
setFormData(formData)
debounceReCalc()
}
const debounceReCalc = useDebouncedCallback(() => {
var data = {}
product_api.calcProduct(pos.product, formData).then((value) => {
for(const obj in value['jsonForm']['properties']) {
data[obj] = value['jsonForm']['properties'][obj]['default']
}
setFormData(data)
setSchema(value['jsonForm'])
setUiSchema(value['uiJsonForm'])
setPrice(value['price'])
setType(value['typ'])
})
}, 600)
const addProduct = () => {
pos.product.specialProductTypeObject.params = formData
pos.product.specialProductTypeObject.typ = type
if(formData['count']) {
pos.count = formData['count']
}
pos.price = price
handleChange(pos)
handleClose()
}
useEffect(() => {
if(pos.product.specialProductTypeObject.params) {
setFormData(pos.product.specialProductTypeObject.params)
loadSchema(pos.product.specialProductTypeObject.params)
}else{
setFormData({})
loadSchema({})
}
}, [pos.product])
return (
<>
<div className='flex'>
<div className='flex-1'>
<Form schema={schema}
uiSchema={uiSchema}
formData={formData}
onChange={(e) => changeCalc(e.formData)}
validator={validator}/>
</div>
<div className=''>
<>
<h5>Netto: <Currency price={ price.allNet} /></h5>
<h5>Mwert: <Currency price={ price.allVat} /></h5>
<h4>Brutto: <Currency price={ price.allGross} /></h4>
<Button onClick={addProduct} type={3} variant={"success"} />
</>
</div>
</div>
</>
)
}
ProductForm.propTypes = {
shop: PropTypes.instanceOf(Shop),
pos: PropTypes.instanceOf(Pos),
handleClose: PropTypes.func,
handleChange: PropTypes.func
}
export default ProductForm

View File

@ -1,44 +0,0 @@
import * as PropTypes from 'prop-types';
import { Shop } from '../../model/shop';
import { container } from 'tsyringe';
import { OrderState } from '../../state/order';
import {ProductGroup} from "../../model/productGroup";
import {ProductGroupService} from "../../services/productgroup";
import AsyncSelect , { useAsync } from 'react-select/async';
import React from 'react'
const ProductGroupSelect = (props) => {
const orderState: OrderState = container.resolve(OrderState);
const loadOptions = async (searchQuery) => {
const productgroup_api = new ProductGroupService();
return await productgroup_api.getProductGroups(searchQuery, props.shop);
};
const onChange = (option) => {
if (typeof props.onChange === "function") {
props.onChange(option);
}
};
return (
<AsyncSelect
defaultOptions
key={JSON.stringify(props.shop.uuid)}
value={props.value}
loadOptions={loadOptions}
getOptionValue={(option) => option.uuid}
onChange={onChange}
isSearchable={true}
/>
);
};
ProductGroupSelect.propTypes = {
shop: PropTypes.instanceOf(Shop),
value: PropTypes.instanceOf(ProductGroup),
onChange: PropTypes.func,
};
export default ProductGroupSelect;

View File

@ -1,57 +0,0 @@
import * as PropTypes from 'prop-types';
import { Shop } from '../../model/shop';
import { container } from 'tsyringe';
import { OrderState } from '../../state/order';
import {Product} from "../../model/product";
import {ProductGroup} from "../../model/productGroup";
import AsyncSelect from "react-select/async";
import {ProductService} from "../../services/product";
import {useDebounce} from "use-debounce";
import React from 'react'
const ProductSelect = (props) => {
const orderState: OrderState = container.resolve(OrderState);
const loadOptions = async (searchQuery) => {
if(searchQuery == "" && props.productGroup.uuid == "") {
return [];
}
const product_api = new ProductService();
if(searchQuery != "") {
return await product_api.getProductsByTerm(searchQuery, props.shop);
}else{
return await product_api.getProducts(props.productGroup);
}
};
const debouncedSearchTerm = useDebounce(loadOptions, 500);
const onChange = (option) => {
if (typeof props.onChange === "function") {
props.onChange(option);
}
};
return (
<AsyncSelect
defaultOptions
key={JSON.stringify(props.productGroup.uuid)}
value={props.value}
loadOptions={loadOptions}
getOptionValue={(option) => option.uuid}
getOptionLabel={(option) => option.title}
onChange={onChange}
isSearchable={true}
/>
);
};
ProductSelect.propTypes = {
shop: PropTypes.instanceOf(Shop),
value: PropTypes.instanceOf(Product),
productGroup: PropTypes.instanceOf(ProductGroup),
onChange: PropTypes.func,
};
export default ProductSelect;

View File

@ -1,70 +0,0 @@
import * as React from 'react'
import { AsyncPaginate } from "react-select-async-paginate"
import {ShippingService} from "../../services/shipping"
import * as PropTypes from "prop-types"
import {Shop} from "../../model/shop"
import {container} from "tsyringe"
import {OrderState} from "../../state/order"
import {Order} from "../../model/order"
import {useEffect, useState} from "react"
import { SelectLabel } from '../base/SelectLabel'
import React from 'react'
const ShippingComponent = ({shop, order}) => {
const [shopUuid, setShopUuid] = useState(null)
const orderState = container.resolve(OrderState)
const [shipping, setShipping] = useState(0)
const shipping_service = new ShippingService()
const loadOptions = async (searchQuery, loadedOptions) => {
const data = await shipping_service.getShipping(shop)
return {
options: data,
hasMore: false,
}
}
useEffect(() => {
setShopUuid(shop.uuid)
}, [shop.uuid])
useEffect(() => {
setShipping(order.shipping.uid)
}, [order.shipping])
const onChange = (option) => {
order.shipping = option
let orderObj = orderState.getCurrentOrder().getValue()
orderObj.shipping = option
orderState.setCurrentOrder(orderObj)
setShipping(option.uid)
}
return (
<div className={"p-2"}>
<AsyncPaginate
defaultOptions
key={JSON.stringify(shopUuid)}
components={{Control: SelectLabel}}
defaultValue={order.shipping}
placeholder=''
name='Versandart'
loadOptions={loadOptions}
getOptionValue={(option) => option.uid}
getOptionLabel={(option) => option.title}
onChange={onChange}
isSearchable={false}
className={`${shipping == 0 ? "border border-red-500" : ""}`}
/>
</div>
)
}
ShippingComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
order: PropTypes.instanceOf(Order),
}
export default ShippingComponent

View File

@ -1,49 +0,0 @@
import { AsyncPaginate } from "react-select-async-paginate"
import { ShopService } from '../../services/shop'
import { container } from 'tsyringe'
import { OrderState } from '../../state/order'
import { SelectLabel } from '../base/SelectLabel'
import React from 'react'
const ShopSelectComponent = (props) => {
const orderState = container.resolve(OrderState)
const shop_service = container.resolve(ShopService)
const loadOptions = async (searchQuery, loadedOptions) => {
const data = await shop_service.getShops()
return {
options: data,
hasMore: false,
}
}
const onChange = (option) => {
orderState.getCurrentOrder().value.shop = option
props.change(option)
}
return (
<div>
<AsyncPaginate
defaultOptions
value={props.shop}
components={{ Control: SelectLabel }}
loadOptions={loadOptions}
getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name}
onChange={onChange}
isSearchable={false}
className={`${props.shop.uuid == "" ? "border border-danger" : "border border-slate-200"}`}
name='Shop'
/>
</div>
)
}
export default ShopSelectComponent

View File

@ -1,36 +0,0 @@
import TypeSelectComponent from '../type/TypeSelectComponent'
import ShopSelectComponent from '../shop/ShopSelectComponent'
import * as PropTypes from "prop-types"
import {Shop} from "../../model/shop"
import DraftComponent from "../draft/DraftComponent"
import {Order} from "../../model/order"
import CalcComponent from '../calc/CalcComponent'
import React from 'react'
const TopBarComponent = ({shop, order, change}) => {
return (
<div className="flex gap-3">
<div>
<DraftComponent order={order} />
</div>
<div className="flex-auto">
<TypeSelectComponent order={order} />
</div>
<div className="flex-auto">
<ShopSelectComponent shop={shop} change={change} />
</div>
<div>
<CalcComponent />
</div>
</div>
)
}
TopBarComponent.propTypes = {
shop: PropTypes.instanceOf(Shop),
order: PropTypes.instanceOf(Order),
change: PropTypes.func
}
export default TopBarComponent

View File

@ -1,51 +0,0 @@
import Select from 'react-select'
import {useEffect, useState} from 'react'
import { container } from 'tsyringe'
import { OrderState } from '../../state/order'
import { SelectLabel } from '../base/SelectLabel'
import React from 'react'
const TypeSelectComponent = ({order}) => {
const [type, setType] = useState(0);
const orderState: OrderState = container.resolve(OrderState);
const options = [
{ value: 1, label: 'Auftrag' },
{ value: 2, label: 'Angebot' },
{ value: 3, label: 'Storno' },
{ value: 4, label: 'Gutschrift' },
{ value: 5, label: 'Rechnung' },
{ value: 6, label: 'Teilrechnung' },
{ value: 7, label: 'Teilstorno' },
];
const onChange = (option) => {
let order = orderState.getCurrentOrder().value;
order.type = option.value;
orderState.setCurrentOrder(order);
setType(option);
};
useEffect(() => {
setType(order.type);
}, [order.type]);
return (
<div>
<Select
className={`${type == 0 ? "border border-danger" : ""}`}
options={options}
defaultValue={options.filter((e) => e.value == type).pop()}
value={options.filter((e) => e.value == type).pop()}
onChange={onChange}
components={{ Control: SelectLabel }}
placeholder=""
name="Typ"
/>
</div>
);
}
export default TypeSelectComponent;

View File

@ -1,30 +0,0 @@
import {autoInjectable, singleton} from "tsyringe";
import { Token } from "./token";
import axios from 'axios';
import { Account } from "../model/account";
import { Shop } from "../model/shop";
@singleton()
@autoInjectable()
export class AccountService {
constructor(private token?: Token) {}
async getAccounts(shop: Shop): Promise<Account[]> {
return await axios.get('/apps/api/account/allbyshop/' + shop.uuid, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let account = new Account();
account.uid = item.uid;
account.title = item.title;
account.appendix = item.appendix;
account.uuid = item.uuid;
return account;
})
});
}
}

View File

@ -1,57 +0,0 @@
import {autoInjectable, singleton} from "tsyringe"
import { Token } from "./token"
import axios from 'axios'
import { Address } from "../model/address"
@singleton()
@autoInjectable()
export class AddressService {
constructor(private token?: Token) {}
async create(address: Address): Promise<Address> {
return await axios.post('/apps/api/contact/address/create', {'address': address} ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data
})
}
async update(address: Address): Promise<Address> {
return await axios.put('/apps/api/contact/address/update/' + address.uuid, {'address': address} ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data
})
}
async getContactAddress(contact: String, type: Number): Promise<Address[]> {
return await axios.get('/apps/api/contact/address/getallfortype/' + contact + '/' + type, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let address = new Address
address.uid = item.uid
address.firstname = item.firstname
address.lastname = item.lastname
address.street = item.street
address.country = item.country
address.ustid = item.ustid
address.houseNumber = item.houseNumber
address.zip = item.zip
address.city = item.city
address.company = item.company
address.company2 = item.company2
address.uuid = item.uuid
return address
})
})
}
}

View File

@ -1,51 +0,0 @@
import {autoInjectable, singleton} from "tsyringe";
import { Token } from "./token";
import axios from 'axios';
import { Contact } from "../model/contact";
import { Address } from "../model/address";
import { Shop } from "../model/shop";
@singleton()
@autoInjectable()
export class ContactService {
constructor(private token?: Token) {}
async createContact(contact: Contact): Promise<Contact> {
return await axios.post('/apps/api/contact/create', {'contact': contact} ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
});
}
async updateContact(contact: Contact): Promise<Contact> {
return await axios.put('/apps/api/contact/update/' + contact.uuid, {'contact': contact} ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
});
}
async getContacts(searchQuery: String, page: Number, shop: Shop): Promise<Contact[]> {
return await axios.get('/apps/api/contact/allbyshop/' + shop.uuid + '?term=' + searchQuery + '&page=' + page, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let contact = new Contact;
contact.parseFromJson({contact: item});
return contact;
})
});
}
}

View File

@ -1,21 +0,0 @@
import {autoInjectable, singleton} from "tsyringe"
import axios from 'axios'
import { Shop } from "../model/shop"
import { Country } from "../model/country"
@singleton()
@autoInjectable()
export class CountryService {
async getCountry(shop: Shop): Promise<Country[]> {
return await axios.get('/apps/api/country/by/shop/' + shop.uuid).then(( response ) => {
return response.data.data.map((item: any) => {
let country = new Country()
country.parseFromJson(item)
return country
})
})
}
}

View File

@ -1,49 +0,0 @@
import {autoInjectable, singleton} from "tsyringe";
import { Token } from "./token";
import axios from 'axios';
import {Order} from "../model/order";
@singleton()
@autoInjectable()
export class OrderService {
constructor(private token?: Token) {}
async getOrder(uuid: String): Promise<Order> {
return await axios.post('/apps/api/order/getonebyuuid', {uuid: uuid} ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
let order = new Order();
order.parseFromJson(response.data);
return order;
});
};
async saveOrder(order: Order): Promise<Order> {
return await axios.post('/apps/api/order/create', order ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
});
}
async calcOrder(order: Order): Promise<Order> {
return await axios.post('/apps/api/order/calc', order ,{
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
});
}
}

View File

@ -1,29 +0,0 @@
import {autoInjectable, singleton} from "tsyringe"
import { Token } from "./token"
import axios from 'axios'
import { Shop } from "../model/shop"
import {Payment} from "../model/payment"
@singleton()
@autoInjectable()
export class PaymentService {
constructor(private token?: Token) {}
async getPayments(shop: Shop): Promise<Payment[]> {
return await axios.get('/apps/api/payment/by/shop/' + shop.uuid, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let payment = new Payment()
payment.uid = item.uid
payment.title = item.title
payment.uuid = item.uuid
return payment
})
})
}
}

View File

@ -1,73 +0,0 @@
import {autoInjectable, singleton} from "tsyringe";
import { Token } from "./token";
import axios from 'axios';
import { Shop } from "../model/shop";
import {ProductGroup} from "../model/productGroup";
import {Product} from "../model/product";
import {JSONSchema7} from "json-schema";
@singleton()
@autoInjectable()
export class ProductService {
constructor(private token?: Token) {}
async getProductsByTerm(term: string, shop: Shop): Promise<Product[]> {
return await axios.get('/apps/api/product/getallbyterm/' + shop.uuid + '/' + term, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let p = new Product();
p.id = item.id;
p.title = item.title;
p.uuid = item.uuid;
p.specialProductTypeObject.typ = item.typ;
return p;
})
})
}
async getProducts(productGroup: ProductGroup): Promise<Product[]> {
return await axios.get('/apps/api/product/getallbyproductgroup/' + productGroup.uuid, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let p = new Product();
p.id = item.id;
p.title = item.title;
p.uuid = item.uuid;
p.specialProductTypeObject.typ = item.typ;
return p;
})
})
}
async getAddProductSchema(product: Product, formData: any): Promise<JSONSchema7> {
return await axios.post('/apps/api/product/get/form/json/' + product.uuid, formData, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
})
}
async calcProduct(product: Product, formData): Promise<JSONSchema7> {
return await axios.post('/apps/api/product/get/form/json/' + product.uuid, formData, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data;
})
}
}

View File

@ -1,44 +0,0 @@
import {autoInjectable, singleton} from "tsyringe";
import { Token } from "./token";
import axios from 'axios';
import { Shop } from "../model/shop";
import {ProductGroup} from "../model/productGroup";
@singleton()
@autoInjectable()
export class ProductGroupService {
constructor(private token?: Token) {}
async getProductGroups(searchQuery: String, shop: Shop): Promise<ProductGroup[]> {
return await axios.get('/apps/api/productgroup/gettree/' + shop.uuid + '?term=' + searchQuery, {
headers: {
'Authorization': 'Bearer ' + this.token.currentToken
}
}).then(( response ) => {
let temp: ProductGroup[] = [];
response.data.data.map((item: any) => {
let pg = new ProductGroup;
pg.id = item.id;
pg.label = item.title;
pg.uuid = item.uuid;
temp.push(pg);
item.children.map((sub: any) => {
let spg = new ProductGroup;
spg.id = sub.id;
spg.label = "-- " + sub.title;
spg.uuid = sub.uuid;
temp.push(spg);
});
return pg;
})
return temp;
})
}
}

View File

@ -1,29 +0,0 @@
import {autoInjectable, singleton} from "tsyringe"
import { Token } from "./token"
import axios from 'axios'
import { Shop } from "../model/shop"
import {Shipping} from "../model/shipping"
@singleton()
@autoInjectable()
export class ShippingService {
constructor(private token?: Token) {}
async getShipping(shop: Shop): Promise<Shipping[]> {
return await axios.get('/apps/api/shipping/by/shop/' + shop.uuid, {
headers: {
'Authorization': 'Bearer ' + this.token?.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let shipment = new Shipping()
shipment.uid = item.uid
shipment.title = item.title
shipment.uuid = item.uuid
return shipment
})
})
}
}

View File

@ -1,27 +0,0 @@
import {autoInjectable, singleton} from "tsyringe"
import { Token } from "./token"
import axios from 'axios'
import { Shop } from "../model/shop"
@singleton()
@autoInjectable()
export class ShopService {
constructor(private token: Token) {}
async getShops(): Promise<Shop[]> {
console.log(this.token)
return await axios.get('/apps/api/shops', {
headers: {
'Authorization': 'Bearer ' + this.token.currentToken
}
}).then(( response ) => {
return response.data.data.map((item: any) => {
let shop = new Shop()
shop.parseFromJson({shop: item})
return shop
})
})
}
}

View File

@ -1,22 +0,0 @@
import axios from "axios"
import {singleton} from "tsyringe"
@singleton()
export class Token {
public currentToken:String
init() {
setInterval(() => {
this.refreshToken()
}, 2*60*1000)
}
refreshToken(): void {
axios.get('/apps/api/contact/refresh', {
headers: {
'Authorization': 'Bearer ' + this.currentToken
}
}).then(( response ) => {
this.currentToken = response.data.token
})
}
}

View File

@ -1,31 +0,0 @@
import {singleton} from "tsyringe"
import {Order} from "../model/order"
import {observeObject} from "../lib/ob-ob"
import {BehaviorSubject, Observable, of, Subject} from "rxjs"
@singleton()
export class OrderState {
orders: Array<Order>
private currentOrder: BehaviorSubject<Order>
constructor() {
this.currentOrder = new BehaviorSubject<Order>(new Order())
}
getCurrentOrder() {
return this.currentOrder
}
setCurrentOrder(order: Order) {
this.currentOrder.next(order)
}
getOrder(uuid: String) {
return this.orders.map((e) => e.uuid == uuid)
}
updateOrder(order: Order) {
this.orders.push(order)
}
}

View File

@ -1,13 +0,0 @@
const flowbite = require("flowbite-react/tailwind");
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./src/**/*.{js,jsx,ts,tsx}',
flowbite.content()
],
theme: {
extend: {},
},
plugins: [flowbite.plugin()],
}

View File

@ -1,19 +0,0 @@
{
"compilerOptions": {
"jsx": "react-jsx",
"module": "commonjs",
"experimentalDecorators": true,
"esModuleInterop": true,
"noUnusedLocals": false,
"strict": false,
"noImplicitAny": true,
"emitDecoratorMetadata": true,
"lib": [
"dom",
"es5",
"scripthost",
"es2015.collection",
"es2015.proxy"
]
}
}

View File

@ -1,980 +0,0 @@
Arguments:
/root/.nvm/versions/node/v19.2.0/bin/node /root/.nvm/versions/node/v19.2.0/bin/yarn install
PATH:
/root/.cargo/bin:/root/.nvm/versions/node/v19.2.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files/Microsoft/jdk-11.0.12.7-hotspot/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/dotnet/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/PuTTY/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Users/info/.cargo/bin:/mnt/c/Users/info/AppData/Local/Microsoft/WindowsApps:/mnt/c/Program Files/JetBrains/PhpStorm 2022.2.2/bin:/mnt/c/Users/info/.dotnet/tools:/mnt/c/Users/info/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin
Yarn version:
1.22.19
Node version:
19.2.0
Platform:
linux x64
Trace:
SyntaxError: /root/projekte/pscdevmake/src/new/var/plugins/System/PSC/Invoice/Webpack/package.json: Expected double-quoted property name in JSON at position 873
at JSON.parse (<anonymous>)
at /root/.nvm/versions/node/v19.2.0/lib/node_modules/yarn/lib/cli.js:1629:59
at Generator.next (<anonymous>)
at step (/root/.nvm/versions/node/v19.2.0/lib/node_modules/yarn/lib/cli.js:310:30)
at /root/.nvm/versions/node/v19.2.0/lib/node_modules/yarn/lib/cli.js:321:13
npm manifest:
{
"name": "webpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@rjsf/core": "^5.0.0-beta.11",
"@rjsf/utils": "^5.0.0-beta.11",
"@rjsf/validator-ajv6": "^5.0.0-beta.11",
"axios": "^0.27.2",
"debounce-promise": "^3.1.2",
"eta": "^1.12.3",
"prop-types": "^15.8.1",
"react": "^18.2.0",
"react-bootstrap": "^2.5.0",
"react-dom": "^18.2.0",
"react-select": "^5.4.0",
"react-select-async-paginate": "^0.6.2",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.6",
"tsyringe": "^4.7.0",
"use-debounce": "^9.0.2",
"uuid": "^8.3.2",
"zustand": "^4.1.1",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"react-router-dom": "^6.5.0",
}
}
yarn manifest:
No manifest
Lockfile:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/code-frame@^7.0.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/helper-module-imports@^7.16.7":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
dependencies:
"@babel/types" "^7.18.6"
"@babel/helper-plugin-utils@^7.18.6":
version "7.20.2"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629"
integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
"@babel/helper-string-parser@^7.19.4":
version "7.19.4"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
"@babel/highlight@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
dependencies:
"@babel/helper-validator-identifier" "^7.18.6"
chalk "^2.0.0"
js-tokens "^4.0.0"
"@babel/plugin-syntax-jsx@^7.17.12":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7":
version "7.20.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
dependencies:
regenerator-runtime "^0.13.11"
"@babel/types@^7.18.6":
version "7.20.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84"
integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==
dependencies:
"@babel/helper-string-parser" "^7.19.4"
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
"@emotion/babel-plugin@^11.10.5":
version "11.10.5"
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c"
integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==
dependencies:
"@babel/helper-module-imports" "^7.16.7"
"@babel/plugin-syntax-jsx" "^7.17.12"
"@babel/runtime" "^7.18.3"
"@emotion/hash" "^0.9.0"
"@emotion/memoize" "^0.8.0"
"@emotion/serialize" "^1.1.1"
babel-plugin-macros "^3.1.0"
convert-source-map "^1.5.0"
escape-string-regexp "^4.0.0"
find-root "^1.1.0"
source-map "^0.5.7"
stylis "4.1.3"
"@emotion/cache@^11.10.5", "@emotion/cache@^11.4.0":
version "11.10.5"
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12"
integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==
dependencies:
"@emotion/memoize" "^0.8.0"
"@emotion/sheet" "^1.2.1"
"@emotion/utils" "^1.2.0"
"@emotion/weak-memoize" "^0.3.0"
stylis "4.1.3"
"@emotion/hash@^0.9.0":
version "0.9.0"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7"
integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==
"@emotion/memoize@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f"
integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
"@emotion/react@^11.8.1":
version "11.10.5"
resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d"
integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==
dependencies:
"@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.10.5"
"@emotion/cache" "^11.10.5"
"@emotion/serialize" "^1.1.1"
"@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
"@emotion/utils" "^1.2.0"
"@emotion/weak-memoize" "^0.3.0"
hoist-non-react-statics "^3.3.1"
"@emotion/serialize@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0"
integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==
dependencies:
"@emotion/hash" "^0.9.0"
"@emotion/memoize" "^0.8.0"
"@emotion/unitless" "^0.8.0"
"@emotion/utils" "^1.2.0"
csstype "^3.0.2"
"@emotion/sheet@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c"
integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==
"@emotion/unitless@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df"
integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
"@emotion/utils@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561"
integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==
"@emotion/weak-memoize@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb"
integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
"@floating-ui/core@^1.0.4":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.0.4.tgz#03066eaea8e9b2a2cd3f5aaa60f1e0f580ebe88e"
integrity sha512-FPFLbg2b06MIw1dqk2SOEMAMX3xlrreGjcui5OTxfBDtaKTmh0kioOVjT8gcfl58juawL/yF+S+gnq8aUYQx/Q==
"@floating-ui/dom@^1.0.1":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.0.9.tgz#3ae1d3e776bc90b9d33b1922f9498fb6f80f3b12"
integrity sha512-nF9P6/BoARdt+h+CdUW3td4EUVngeDONCGuzRgnZveRZiJETx63cxhinE0JaPPC2tbcdTY9IGZocS5/7ag3xRg==
dependencies:
"@floating-ui/core" "^1.0.4"
"@popperjs/core@^2.11.5":
version "2.11.6"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
"@react-aria/ssr@^3.2.0":
version "3.4.0"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.0.tgz#a2b9a170214f56e41d3c4c933d0d8fcffa07a12a"
integrity sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA==
dependencies:
"@babel/runtime" "^7.6.2"
"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7":
version "0.4.7"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39"
integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==
dependencies:
dequal "^2.0.2"
"@restart/ui@^1.4.1":
version "1.4.1"
resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.1.tgz#c9057915f0708c411824eeb16c03d0108c0208d2"
integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A==
dependencies:
"@babel/runtime" "^7.18.3"
"@popperjs/core" "^2.11.5"
"@react-aria/ssr" "^3.2.0"
"@restart/hooks" "^0.4.7"
"@types/warning" "^3.0.0"
dequal "^2.0.2"
dom-helpers "^5.2.0"
uncontrollable "^7.2.1"
warning "^4.0.3"
"@rjsf/core@^5.0.0-beta.11":
version "5.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@rjsf/core/-/core-5.0.0-beta.13.tgz#e13bd67a448460f5d9005033486b277f4eb35cf6"
integrity sha512-uQ3A9aJhMJsz9ct5tV3ogZkSFEkKUxrM9SJ9Hc8ijxmuaW7Jv8tNv5jiWZZsLvNXlIONX83s6JqkiOJf6IOAvg==
dependencies:
lodash "^4.17.15"
lodash-es "^4.17.15"
nanoid "^3.3.4"
prop-types "^15.7.2"
"@rjsf/utils@^5.0.0-beta.11":
version "5.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@rjsf/utils/-/utils-5.0.0-beta.13.tgz#9a78efca6cee84bee4af83b4237cc618c6435f0a"
integrity sha512-hWWWFD2ifjSOhqWueML4OHrZe2HW5pE2nfKGhCObFbwtggHoQlj64xDBsJ1qfUG8DGvCHztJQ/sKIaOvXnpt7w==
dependencies:
json-schema-merge-allof "^0.8.1"
jsonpointer "^5.0.1"
lodash "^4.17.15"
lodash-es "^4.17.15"
react-is "^18.2.0"
"@rjsf/validator-ajv6@^5.0.0-beta.11":
version "5.0.0-beta.13"
resolved "https://registry.yarnpkg.com/@rjsf/validator-ajv6/-/validator-ajv6-5.0.0-beta.13.tgz#2f9ec0519e1c6547e38cadcab56a22339836db2e"
integrity sha512-X9N3/HJYV23MjUN/VJHIdBhUdBuMTUsh4HAZm50eUvUAhWK95wIqjjhAs24rzeLajrjFeH7kFr89zAqDgIFhVQ==
dependencies:
ajv "^6.7.0"
lodash "^4.17.15"
lodash-es "^4.17.15"
"@seznam/compose-react-refs@^1.0.6":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@seznam/compose-react-refs/-/compose-react-refs-1.0.6.tgz#6ec4e70bdd6e32f8e70b4100f27267cf306bd8df"
integrity sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q==
"@types/lodash@^4.14.191":
version "4.14.191"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa"
integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
"@types/prop-types@*":
version "15.7.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.4":
version "4.4.5"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@>=16.9.11":
version "18.0.26"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917"
integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/scheduler@*":
version "0.16.2"
resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
"@types/warning@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==
ajv@^6.7.0:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
axios@^0.27.2:
version "0.27.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies:
follow-redirects "^1.14.9"
form-data "^4.0.0"
babel-plugin-macros@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
dependencies:
"@babel/runtime" "^7.12.5"
cosmiconfig "^7.0.0"
resolve "^1.19.0"
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
classnames@^2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
compute-gcd@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f"
integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==
dependencies:
validate.io-array "^1.0.3"
validate.io-function "^1.0.2"
validate.io-integer-array "^1.0.0"
compute-lcm@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23"
integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==
dependencies:
compute-gcd "^1.2.1"
validate.io-array "^1.0.3"
validate.io-function "^1.0.2"
validate.io-integer-array "^1.0.0"
convert-source-map@^1.5.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
cosmiconfig@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
dependencies:
"@types/parse-json" "^4.0.0"
import-fresh "^3.2.1"
parse-json "^5.0.0"
path-type "^4.0.0"
yaml "^1.10.0"
csstype@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
debounce-promise@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/debounce-promise/-/debounce-promise-3.1.2.tgz#320fb8c7d15a344455cd33cee5ab63530b6dc7c5"
integrity sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
dequal@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
dependencies:
"@babel/runtime" "^7.8.7"
csstype "^3.0.2"
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
dependencies:
is-arrayish "^0.2.1"
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eta@^1.12.3:
version "1.12.3"
resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1"
integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==
fast-deep-equal@^3.1.1:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
follow-redirects@^1.14.9:
version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
hoist-non-react-statics@^3.3.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
dependencies:
react-is "^16.7.0"
import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
parent-module "^1.0.0"
resolve-from "^4.0.0"
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
dependencies:
loose-envify "^1.0.0"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
is-core-module@^2.9.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
dependencies:
has "^1.0.3"
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-compare@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56"
integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==
dependencies:
lodash "^4.17.4"
json-schema-merge-allof@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz#ed2828cdd958616ff74f932830a26291789eaaf2"
integrity sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==
dependencies:
compute-lcm "^1.1.2"
json-schema-compare "^0.2.2"
lodash "^4.17.20"
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
jsonpointer@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
lodash-es@^4.17.15:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
parse-json@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
dependencies:
"@babel/code-frame" "^7.0.0"
error-ex "^1.3.1"
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
prop-types-extra@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
dependencies:
react-is "^16.3.2"
warning "^4.0.0"
prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
dependencies:
loose-envify "^1.4.0"
object-assign "^4.1.1"
react-is "^16.13.1"
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
react-bootstrap@^2.5.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.0.tgz#4a8f0311bccac477dc925366763c536f46e4393b"
integrity sha512-Jcrn6aUuRVBeSB6dzKODKZU1TONOdhAxu0IDm4Sv74SJUm98dMdhSotF2SNvFEADANoR+stV+7TK6SNX1wWu5w==
dependencies:
"@babel/runtime" "^7.17.2"
"@restart/hooks" "^0.4.6"
"@restart/ui" "^1.4.1"
"@types/react-transition-group" "^4.4.4"
classnames "^2.3.1"
dom-helpers "^5.2.1"
invariant "^2.2.4"
prop-types "^15.8.1"
prop-types-extra "^1.1.0"
react-transition-group "^4.4.2"
uncontrollable "^7.2.1"
warning "^4.0.3"
react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
scheduler "^0.23.0"
react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-select-async-paginate@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/react-select-async-paginate/-/react-select-async-paginate-0.6.2.tgz#87ecb2d0e97d70b8904affc404c2a19d41079c27"
integrity sha512-aSK6IONYCsDtP05cYQGk9mkBYwo6XOilr+pUxrLy1CUVOidBotx1+ThKK+PYagIOCL5k+yv9yOX6+7BSdxhYfg==
dependencies:
"@babel/runtime" "^7.18.9"
"@seznam/compose-react-refs" "^1.0.6"
sleep-promise "^9.1.0"
use-is-mounted-ref "^1.5.0"
react-select@^5.4.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6"
integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ==
dependencies:
"@babel/runtime" "^7.12.0"
"@emotion/cache" "^11.4.0"
"@emotion/react" "^11.8.1"
"@floating-ui/dom" "^1.0.1"
"@types/react-transition-group" "^4.4.0"
memoize-one "^6.0.0"
prop-types "^15.6.0"
react-transition-group "^4.3.0"
use-isomorphic-layout-effect "^1.1.2"
react-transition-group@^4.3.0, react-transition-group@^4.4.2:
version "4.4.5"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
dependencies:
"@babel/runtime" "^7.5.5"
dom-helpers "^5.0.1"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
reflect-metadata@^0.1.13:
version "0.1.13"
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
regenerator-runtime@^0.13.11:
version "0.13.11"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve@^1.19.0:
version "1.22.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
dependencies:
is-core-module "^2.9.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
rxjs@^7.5.6:
version "7.6.0"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2"
integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==
dependencies:
tslib "^2.1.0"
scheduler@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
dependencies:
loose-envify "^1.1.0"
sleep-promise@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/sleep-promise/-/sleep-promise-9.1.0.tgz#101ebe65700bcd184709da95d960967b02b79d03"
integrity sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==
source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
stylis@4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7"
integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
tslib@^1.9.3:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.1.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
tsyringe@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.7.0.tgz#aea0a9d565385deebb6def60cda342b15016f283"
integrity sha512-ncFDM1jTLsok4ejMvSW5jN1VGPQD48y2tfAR0pdptWRKYX4bkbqPt92k7KJ5RFJ1KV36JEs/+TMh7I6OUgj74g==
dependencies:
tslib "^1.9.3"
uncontrollable@^7.2.1:
version "7.2.1"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==
dependencies:
"@babel/runtime" "^7.6.3"
"@types/react" ">=16.9.11"
invariant "^2.2.4"
react-lifecycles-compat "^3.0.4"
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
use-debounce@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.2.tgz#2883982ec1eb79affec46f14047244057b78161c"
integrity sha512-QLyB0sxt9F5AisGDrUybCRJSLE60bTQR0yXc+IebNGUu1GCXwii1zsZl82mPGdWqDVQy7+1FKMLHQUixxf5Nbw==
use-is-mounted-ref@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/use-is-mounted-ref/-/use-is-mounted-ref-1.5.0.tgz#d737e7b30f1bbbaca594f21cdd2621dc52ae8180"
integrity sha512-p5FksHf/ospZUr5KU9ese6u3jp9fzvZ3wuSb50i0y6fdONaHWgmOqQtxR/PUcwi6hnhQDbNxWSg3eTK3N6m+dg==
use-isomorphic-layout-effect@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb"
integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==
use-sync-external-store@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
validate.io-array@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d"
integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==
validate.io-function@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7"
integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==
validate.io-integer-array@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089"
integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==
dependencies:
validate.io-array "^1.0.3"
validate.io-integer "^1.0.4"
validate.io-integer@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068"
integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==
dependencies:
validate.io-number "^1.0.3"
validate.io-number@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8"
integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==
warning@^4.0.0, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
dependencies:
loose-envify "^1.0.0"
yaml@^1.10.0:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
zustand@^4.1.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.1.5.tgz#7402b511f5b23ccb0f9ba6d20ae01ec817e16eb6"
integrity sha512-PsdRT8Bvq22Yyh1tvpgdHNE7OAeFKqJXUxtJvj1Ixw2B9O2YZ1M34ImQ+xyZah4wZrR4lENMoDUutKPpyXCQ/Q==
dependencies:
use-sync-external-store "1.2.0"

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +1,30 @@
<?php
namespace Plugin\System\PSC\PaypalPlus\Payment;
use Doctrine\Bundle\MongoDBBundle\ManagerRegistry;
use Doctrine\ODM\MongoDB\DocumentManager;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use PayPalCheckoutSdk\Core\PayPalHttpClient;
use PayPalCheckoutSdk\Core\ProductionEnvironment;
use PayPalCheckoutSdk\Core\SandboxEnvironment;
use Plugin\System\PSC\PaypalPlus\Document\Paypal;
use Plugin\System\PSC\PaypalPlus\Paypal\CreateDoPayRequest;
use Plugin\System\PSC\PaypalPlus\Paypal\CreateOrderRequest;
use Plugin\System\PSC\PaypalPlus\Paypal\CreatePaymentRequest;
use Plugin\System\PSC\PaypalPlus\Paypal\CreateProfileRequest;
use PSC\Shop\EntityBundle\Document\Order;
use PSC\Shop\EntityBundle\Entity\Contact;
use PSC\Shop\EntityBundle\Entity\ContactAddress;
use PSC\Shop\EntityBundle\Entity\Shop;
use PSC\Shop\MediaBundle\Document\Media;
use PSC\Shop\MediaBundle\Form\Type\MediaType;
use PSC\Shop\PaymentBundle\Document\Gatewaysettings;
use PSC\Shop\PaymentBundle\Provider\PaymentProvider;
use PSC\Shop\PaymentBundle\Provider\PaymentProviderInterface;
use PSC\Shop\QueueBundle\Event\Order\Payed;
use PSC\Shop\QueueBundle\Service\Event\Manager;
use Sofort\SofortLib\Notification;
use Sofort\SofortLib\TransactionData;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class Provider extends PaymentProvider
{
@ -59,7 +44,7 @@ class Provider extends PaymentProvider
*/
private SessionInterface $session;
function __construct(RequestStack $requestStack, Manager $eventManager, FormFactoryInterface $formFactory, EntityManagerInterface $entityManager, DocumentManager $doctrine_mongodb, \PSC\System\SettingsBundle\Service\Shop $shopService)
public function __construct(RequestStack $requestStack, Manager $eventManager, FormFactoryInterface $formFactory, EntityManagerInterface $entityManager, DocumentManager $doctrine_mongodb, \PSC\System\SettingsBundle\Service\Shop $shopService)
{
$this->_formFactory = $formFactory;
$this->_entityManager = $entityManager;
@ -125,11 +110,13 @@ class Provider extends PaymentProvider
if ($this->getGatewaySettings()->getGatewayDocument()->isProduction()) {
$environment = new ProductionEnvironment(
$this->getGatewaySettings()->getGatewayDocument()->getClientId(),
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret());
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret()
);
} else {
$environment = new SandboxEnvironment(
$this->getGatewaySettings()->getGatewayDocument()->getClientId(),
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret());
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret()
);
}
$client = new PayPalHttpClient($environment);
@ -178,12 +165,13 @@ class Provider extends PaymentProvider
$request = $request->getContent();
$request = json_decode($request, true);
if(isset($request['resource']) && isset($request['resource']['state']) && $request['resource']['state'] == 'completed')
if (isset($request['resource']) && isset($request['resource']['state']) && $request['resource']['state'] == 'completed') {
/** @var \PSC\Shop\EntityBundle\Document\Order $orderDoc */
$orderDoc = $this->_doctrine_mongodb
->getRepository('PSC\Shop\EntityBundle\Document\Order')
->findOneBy(array('paymentRef' => (string)$request['resource']['parent_payment']));
}
/** @var \PSC\Shop\EntityBundle\Entity\Order $order */
$order = $this->_entityManager
@ -207,11 +195,13 @@ class Provider extends PaymentProvider
if ($this->getGatewaySettings()->getGatewayDocument()->isProduction()) {
$environment = new ProductionEnvironment(
$this->getGatewaySettings()->getGatewayDocument()->getClientId(),
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret());
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret()
);
} else {
$environment = new SandboxEnvironment(
$this->getGatewaySettings()->getGatewayDocument()->getClientId(),
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret());
$this->getGatewaySettings()->getGatewayDocument()->getClientSecret()
);
}
$client = new PayPalHttpClient($environment);

View File

@ -52,12 +52,14 @@ class Position implements IPositionTransformer
$obj->setParams($posDoc->getSpecialProductTypeObject()['params']);
} else {
$objPosition = unserialize($posEntity->getData());
if ($objPosition) {
$engine->setVariables($objPosition->getOptions());
if (isset($objPosition->getOptions()['kalk_artikel'])) {
$engine->setActiveArticle($objPosition->getOptions()['kalk_artikel']);
}
$obj->setParams($objPosition->getOptions());
}
}
$articleCalc = $engine->getArticle();
$obj->setEngine($engine);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,23 +1,22 @@
"use strict";
(self["webpackChunk"] = self["webpackChunk"] || []).push([["backend/login"],{
/***/ "./assets/backend/login.ts":
/*!*********************************!*\
!*** ./assets/backend/login.ts ***!
\*********************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
/***/ "./assets/backend/login/login.ts":
/*!***************************************!*\
!*** ./assets/backend/login/login.ts ***!
\***************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _css_login_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./css/login.css */ "./assets/backend/login/css/login.css");
exports.__esModule = true;
__webpack_require__(/*! ./login/login.css */ "./assets/backend/login/login.css");
/***/ }),
/***/ "./assets/backend/login/login.css":
/*!****************************************!*\
!*** ./assets/backend/login/login.css ***!
\****************************************/
/***/ "./assets/backend/login/css/login.css":
/*!********************************************!*\
!*** ./assets/backend/login/css/login.css ***!
\********************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
@ -29,7 +28,7 @@ __webpack_require__.r(__webpack_exports__);
},
/******/ __webpack_require__ => { // webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
/******/ var __webpack_exports__ = (__webpack_exec__("./assets/backend/login.ts"));
/******/ var __webpack_exports__ = (__webpack_exec__("./assets/backend/login/login.ts"));
/******/ }
]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZC9sb2dpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBYTs7QUFDYkEsa0JBQWtCLEdBQUcsSUFBSTtBQUN6QkUsbUJBQU8sQ0FBQywyREFBbUIsQ0FBQzs7Ozs7Ozs7Ozs7QUNGNUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvYmFja2VuZC9sb2dpbi50cyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvYmFja2VuZC9sb2dpbi9sb2dpbi5jc3M/MDZmMSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5yZXF1aXJlKFwiLi9sb2dpbi9sb2dpbi5jc3NcIik7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwibmFtZXMiOlsiZXhwb3J0cyIsIl9fZXNNb2R1bGUiLCJyZXF1aXJlIl0sInNvdXJjZVJvb3QiOiIifQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZC9sb2dpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvYmFja2VuZC9sb2dpbi9sb2dpbi50cyIsIndlYnBhY2s6Ly8vLi9hc3NldHMvYmFja2VuZC9sb2dpbi9jc3MvbG9naW4uY3NzPzdhMmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwiLi9jc3MvbG9naW4uY3NzXCI7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=

View File

@ -12,24 +12,28 @@
"backend/dashboard": {
"js": [
"/apps/build/runtime.js",
"/apps/build/vendors-node_modules_core-js_modules_es_array_concat_js-node_modules_core-js_modules_es_array-fb37e9.js",
"/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.js",
"/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.js",
"/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.js",
"/apps/build/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js",
"/apps/build/backend/dashboard.js"
],
"css": [
"/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.css",
"/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.css",
"/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.css",
"/apps/build/backend/dashboard.css"
]
},
"plugins/system/psc/invoice": {
"backend/tailwind": {
"js": [
"/apps/build/runtime.js",
"/apps/build/vendors-node_modules_core-js_modules_es_array_concat_js-node_modules_core-js_modules_es_array-fb37e9.js",
"/apps/build/vendors-var_plugins_System_PSC_Invoice_Webpack_node_modules_ebay_nice-modal-react_lib_esm_ind-73e7df.js",
"/apps/build/plugins/system/psc/invoice.js"
"/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.js",
"/apps/build/vendors-node_modules_alpinejs_persist_dist_module_esm_js-node_modules_alpinejs_dist_module_esm_js.js",
"/apps/build/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js",
"/apps/build/backend/tailwind.js"
],
"css": [
"/apps/build/plugins/system/psc/invoice.css"
"/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.css",
"/apps/build/backend/tailwind.css"
]
}
}

View File

@ -3,13 +3,15 @@
"/apps/backend/login.js": "/apps/build/backend/login.js",
"/apps/backend/dashboard.css": "/apps/build/backend/dashboard.css",
"/apps/backend/dashboard.js": "/apps/build/backend/dashboard.js",
"/apps/plugins/system/psc/invoice.css": "/apps/build/plugins/system/psc/invoice.css",
"/apps/plugins/system/psc/invoice.js": "/apps/build/plugins/system/psc/invoice.js",
"/apps/backend/tailwind.css": "/apps/build/backend/tailwind.css",
"/apps/backend/tailwind.js": "/apps/build/backend/tailwind.js",
"/apps/runtime.js": "/apps/build/runtime.js",
"/apps/vendors-node_modules_core-js_modules_es_array_concat_js-node_modules_core-js_modules_es_array-fb37e9.js": "/apps/build/vendors-node_modules_core-js_modules_es_array_concat_js-node_modules_core-js_modules_es_array-fb37e9.js",
"/apps/vendors-var_plugins_System_PSC_Invoice_Webpack_node_modules_ebay_nice-modal-react_lib_esm_ind-73e7df.js": "/apps/build/vendors-var_plugins_System_PSC_Invoice_Webpack_node_modules_ebay_nice-modal-react_lib_esm_ind-73e7df.js",
"/apps/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.css": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.css",
"/apps/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.js": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_symfony_stimulus-bridge_di-f31401.js",
"/apps/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.css": "/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.css",
"/apps/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.js": "/apps/build/vendors-node_modules_symfony_stimulus-bridge_dist_index_js-node_modules_core-js_modules_es_ar-8b4fee.js",
"/apps/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.css": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.css",
"/apps/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.js": "/apps/build/vendors-node_modules_popperjs_core_dist_cjs_popper_js-node_modules_bootstrap-toggle_js_bootst-2e5edb.js",
"/apps/vendors-node_modules_alpinejs_persist_dist_module_esm_js-node_modules_alpinejs_dist_module_esm_js.js": "/apps/build/vendors-node_modules_alpinejs_persist_dist_module_esm_js-node_modules_alpinejs_dist_module_esm_js.js",
"/apps/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js": "/apps/build/node_modules_symfony_stimulus-bridge_dist_webpack_loader_js_assets_controllers_json.js",
"/apps/fonts/summernote.eot": "/apps/build/fonts/summernote.7a3f9776.eot",
"/apps/fonts/summernote.ttf": "/apps/build/fonts/summernote.eb23b6b7.ttf",
"/apps/fonts/summernote.woff": "/apps/build/fonts/summernote.f2bec4f2.woff",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,22 +1,18 @@
var Encore = require('@symfony/webpack-encore');
const glob = require('glob');
// Manually configure the runtime environment if not already configured yet by the "encore" command.
// It's useful when you use tools that rely on webpack.config.js file.
if (!Encore.isRuntimeEnvironmentConfigured()) {
Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev');
}
function getEntries (){
return glob.sync("./var/plugins/System/**/*/Webpack/index.{js,ts}");
}
Encore
.setOutputPath('web/build/')
.setPublicPath('/apps/build')
.setManifestKeyPrefix('/apps')
.addEntry('backend/login', './assets/backend/login.ts')
.addEntry('backend/login', './assets/backend/login/login.ts')
.addEntry('backend/dashboard', './assets/backend/dashboard/dashboard.js')
.addEntry('backend/tailwind', './assets/tailwind/backend.ts')
.copyFiles({
from: './assets/images',
to: 'images/[path][name].[ext]',
@ -43,11 +39,6 @@ Encore
jQuery: 'jquery'
})
;
for (const entry of getEntries()) {
const splEntry = entry.split('/');
Encore.addEntry('plugins/' + splEntry[3].toLowerCase() + '/' + splEntry[4].toLowerCase() + '/' + splEntry[5].toLowerCase(), entry);
}
let config = Encore.getWebpackConfig();
module.exports = config;

View File

@ -7,6 +7,11 @@
resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
"@alpinejs/persist@^3.14.7":
version "3.14.7"
resolved "https://registry.npmjs.org/@alpinejs/persist/-/persist-3.14.7.tgz"
integrity sha512-MakPAI87flMcJro2LJEbq0wcpwgQMGxK9fx1hVaSC0jLinoUfKkoK4DzF6YJmqLVWKnca5ryO3Av1sWzPftQwQ==
"@ampproject/remapping@^2.1.0":
version "2.2.0"
resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
@ -1287,6 +1292,11 @@
resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/alpinejs@^3.13.11":
version "3.13.11"
resolved "https://registry.npmjs.org/@types/alpinejs/-/alpinejs-3.13.11.tgz"
integrity sha512-3KhGkDixCPiLdL3Z/ok1GxHwLxEWqQOKJccgaQL01wc0EVM2tCTaqlC3NIedmxAXkVzt/V6VTM8qPgnOHKJ1MA==
"@types/aria-query@^4.2.0":
version "4.2.2"
resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz"
@ -1546,6 +1556,18 @@
loupe "^2.3.7"
pretty-format "^29.7.0"
"@vue/reactivity@~3.1.1":
version "3.1.5"
resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz"
integrity sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==
dependencies:
"@vue/shared" "3.1.5"
"@vue/shared@3.1.5":
version "3.1.5"
resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz"
integrity sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz"
@ -1772,6 +1794,13 @@ ajv@^8.8.0, ajv@^8.8.2:
require-from-string "^2.0.2"
uri-js "^4.2.2"
alpinejs@^3.14.7:
version "3.14.7"
resolved "https://registry.npmjs.org/alpinejs/-/alpinejs-3.14.7.tgz"
integrity sha512-ScnbydNBcWVnCiVupD3wWUvoMPm8244xkvDNMxVCspgmap9m4QuJ7pjc+77UtByU+1+Ejg0wzYkP4mQaOMcvng==
dependencies:
"@vue/reactivity" "~3.1.1"
ansi-html-community@^0.0.8:
version "0.0.8"
resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"

Some files were not shown because too many files have changed in this diff Show More