finish 2.3.8

This commit is contained in:
Thomas Peterson 2026-07-13 10:22:55 +02:00
parent 06cffec25a
commit 5f1a673577
4 changed files with 154 additions and 72 deletions

View File

@ -14,7 +14,6 @@ use Symfony\Component\Form\FormEvent;
class General implements Field
{
private $options;
public function getTemplate()
@ -30,11 +29,7 @@ class General implements Field
/**
* @param array $data
*/
public function formPreSubmit(FormEvent $event)
{
}
public function formPreSubmit(FormEvent $event) {}
public function buildForm(FormBuilderInterface $builder, array $options)
{
@ -45,15 +40,31 @@ class General implements Field
$tempLayouts = [];
if ($shopEntity->isCustomTemplates() == 1) {
foreach (new DirectoryIterator('/data/www/old/application/design/vorlagen') as $file) {
if ($file == '.' || $file == '..' || $file == 'config' || $file == '.svn' || $file == 'datapacks' || $file == '.DS_Store') {
if (
$file == '.'
|| $file == '..'
|| $file == 'config'
|| $file == '.svn'
|| $file == 'datapacks'
|| $file == '.DS_Store'
) {
continue;
}
$tempLayouts[$file->getFileName()] = $file->getFileName();
}
} else {
if (file_exists('/data/www/old/application/design/clients/' . $shopEntity->getUID())) {
foreach (new DirectoryIterator('/data/www/old/application/design/clients/' . $shopEntity->getUID()) as $file) {
if ($file == '.' || $file == '..' || $file == 'config' || $file == '.svn' || $file == 'datapacks' || $file == '.DS_Store') {
foreach (new DirectoryIterator(
'/data/www/old/application/design/clients/' . $shopEntity->getUID(),
) as $file) {
if (
$file == '.'
|| $file == '..'
|| $file == 'config'
|| $file == '.svn'
|| $file == 'datapacks'
|| $file == '.DS_Store'
) {
continue;
}
$tempLayouts[$file->getFileName()] = $file->getFileName();
@ -61,37 +72,54 @@ class General implements Field
}
}
$builder->add('displayArticleCount', NumberType::class, ['label' => 'Anzahl Artikel in Liste'])
->add('basketField1', TextType::class, array('required' => false, 'label' => 'Warenkorb Feld 1'))
->add('basketField2', TextType::class, array('required' => false, 'label' => 'Warenkorb Feld 2'))
->add('basketPosField1', TextType::class, array('required' => false, 'label' => 'Warenkorb Position Feld 1'))
->add('basketPosField2', TextType::class, array('required' => false, 'label' => 'Warenkorb Position Feld 2'))
->add('customTemplates', CheckboxType::class, ['label' => 'Vorlagen benutzen', 'required' => false])
->add('templateDisplayProductsCrossselling', CheckboxType::class, ['label' => 'Cross Selling anzeigen', 'required' => false])
->add('templateDisplayUserApproval', CheckboxType::class, ['label' => 'User Freigabebedürftige anzeigen', 'required' => false])
->add('layout', ChoiceType::class, array('label' => 'Layout', 'choices' => $tempLayouts, 'required' => false, 'attr' => array('onchange' => "savestyle();")))
->add('googleanalyticscode', TextType::class, ['required' => false])
->add('defaultFunc', ChoiceType::class, ['required' => false,
'choices' => [
"Cms" => "Cms",
"Overview" => "Overview",
"Page" => "Page",
"Article" => "Article",
"Login" => "Login",
"Index" => "Index",
"OverviewWithRedirect" => "OverviewWithRedirect",
"PersArticle" => "PersArticle",
"Redirect" => "Redirect"
]
])
->add('defaultParam', TextType::class, ['required' => false])
->add('displaySender', CheckboxType::class, ['required' => false, 'label' => 'Absenderadresse benutzen'])
->add('displayDelivery', CheckboxType::class, ['required' => false, 'label' => 'Lieferadresse benutzen'])
;
$builder
->add('displayArticleCount', NumberType::class, ['label' => 'Anzahl Artikel in Liste'])
->add('basketField1', TextType::class, array('required' => false, 'label' => 'Warenkorb Feld 1'))
->add('basketField2', TextType::class, array(
'required' => false,
'label' => 'Warenkorb Feld 2 (XRechnung bt-13)',
))
->add('basketPosField1', TextType::class, array(
'required' => false,
'label' => 'Warenkorb Position Feld 1',
))
->add('basketPosField2', TextType::class, array(
'required' => false,
'label' => 'Warenkorb Position Feld 2',
))
->add('customTemplates', CheckboxType::class, ['label' => 'Vorlagen benutzen', 'required' => false])
->add('templateDisplayProductsCrossselling', CheckboxType::class, [
'label' => 'Cross Selling anzeigen',
'required' => false,
])
->add('templateDisplayUserApproval', CheckboxType::class, [
'label' => 'User Freigabebedürftige anzeigen',
'required' => false,
])
->add('layout', ChoiceType::class, array(
'label' => 'Layout',
'choices' => $tempLayouts,
'required' => false,
'attr' => array('onchange' => 'savestyle();'),
))
->add('googleanalyticscode', TextType::class, ['required' => false])
->add('defaultFunc', ChoiceType::class, [
'required' => false,
'choices' => [
'Cms' => 'Cms',
'Overview' => 'Overview',
'Page' => 'Page',
'Article' => 'Article',
'Login' => 'Login',
'Index' => 'Index',
'OverviewWithRedirect' => 'OverviewWithRedirect',
'PersArticle' => 'PersArticle',
'Redirect' => 'Redirect',
],
])
->add('defaultParam', TextType::class, ['required' => false])
->add('displaySender', CheckboxType::class, ['required' => false, 'label' => 'Absenderadresse benutzen'])
->add('displayDelivery', CheckboxType::class, ['required' => false, 'label' => 'Lieferadresse benutzen']);
return $builder;
}
@ -103,13 +131,16 @@ class General implements Field
public function formPostSetData(FormEvent $event)
{
/** @var Shop $shopEntity */
$shopEntity = $this->options['shopEntity'];
$layoutSettings = json_decode($shopEntity->getLayoutSettings(), true);
$event->getForm()->get('bootstrap4General')->get('displayArticleCount')->setData($shopEntity->getDisplayArticleCount());
$event
->getForm()
->get('bootstrap4General')
->get('displayArticleCount')
->setData($shopEntity->getDisplayArticleCount());
$event->getForm()->get('bootstrap4General')->get('basketField1')->setData($shopEntity->getBasketfield1());
$event->getForm()->get('bootstrap4General')->get('basketField2')->setData($shopEntity->getBasketfield2());
$event->getForm()->get('bootstrap4General')->get('basketPosField1')->setData($shopEntity->getBasketposfield1());
@ -118,29 +149,36 @@ class General implements Field
$event->getForm()->get('bootstrap4General')->get('displayDelivery')->setData($shopEntity->getDisplayDelivery());
$event->getForm()->get('bootstrap4General')->get('layout')->setData($shopEntity->getLayout());
$event->getForm()->get('bootstrap4General')->get('customTemplates')->setData($shopEntity->isCustomTemplates());
$event->getForm()->get('bootstrap4General')->get('googleanalyticscode')->setData($shopEntity->getGoogleanalyticscode());
$event
->getForm()
->get('bootstrap4General')
->get('googleanalyticscode')
->setData($shopEntity->getGoogleanalyticscode());
$event->getForm()->get('bootstrap4General')->get('defaultFunc')->setData($shopEntity->getDefaultFunc());
$event->getForm()->get('bootstrap4General')->get('defaultParam')->setData($shopEntity->getDefaultParam());
$event->getForm()->get('bootstrap4General')->get('templateDisplayProductsCrossselling')->setData($shopEntity->isTemplateDisplayProductsCrossselling());
$event->getForm()->get('bootstrap4General')->get('templateDisplayUserApproval')->setData($shopEntity->isTemplateDisplayUserApproval());
$event
->getForm()
->get('bootstrap4General')
->get('templateDisplayProductsCrossselling')
->setData($shopEntity->isTemplateDisplayProductsCrossselling());
$event
->getForm()
->get('bootstrap4General')
->get('templateDisplayUserApproval')
->setData($shopEntity->isTemplateDisplayUserApproval());
}
public function formPostSubmit(FormEvent $event)
{
public function formPostSubmit(FormEvent $event) {}
}
public function formPreSetData(FormEvent $event)
{
}
public function formPreSetData(FormEvent $event) {}
public function formSubmit(FormEvent $event)
{
/** @var Shop $shopEntity */
$shopEntity = $this->options['shopEntity'];
$shopEntity->setDisplayArticleCount($event->getForm()->get('bootstrap4General')->get('displayArticleCount')->getData());
$shopEntity->setDisplayArticleCount(
$event->getForm()->get('bootstrap4General')->get('displayArticleCount')->getData(),
);
$shopEntity->setBasketfield1($event->getForm()->get('bootstrap4General')->get('basketField1')->getData());
$shopEntity->setBasketfield2($event->getForm()->get('bootstrap4General')->get('basketField2')->getData());
$shopEntity->setBasketposfield1($event->getForm()->get('bootstrap4General')->get('basketPosField1')->getData());
@ -149,11 +187,16 @@ class General implements Field
$shopEntity->setDisplayDelivery($event->getForm()->get('bootstrap4General')->get('displayDelivery')->getData());
$shopEntity->setCustomTemplates($event->getForm()->get('bootstrap4General')->get('customTemplates')->getData());
$shopEntity->setLayout($event->getForm()->get('bootstrap4General')->get('layout')->getData());
$shopEntity->setGoogleanalyticscode($event->getForm()->get('bootstrap4General')->get('googleanalyticscode')->getData());
$shopEntity->setGoogleanalyticscode(
$event->getForm()->get('bootstrap4General')->get('googleanalyticscode')->getData(),
);
$shopEntity->setDefaultFunc($event->getForm()->get('bootstrap4General')->get('defaultFunc')->getData());
$shopEntity->setDefaultParam($event->getForm()->get('bootstrap4General')->get('defaultParam')->getData());
$shopEntity->setTemplateDisplayProductsCrossselling($event->getForm()->get('bootstrap4General')->get('templateDisplayProductsCrossselling')->getData());
$shopEntity->setTemplateDisplayUserApproval($event->getForm()->get('bootstrap4General')->get('templateDisplayUserApproval')->getData());
$shopEntity->setTemplateDisplayProductsCrossselling(
$event->getForm()->get('bootstrap4General')->get('templateDisplayProductsCrossselling')->getData(),
);
$shopEntity->setTemplateDisplayUserApproval(
$event->getForm()->get('bootstrap4General')->get('templateDisplayUserApproval')->getData(),
);
}
}

View File

@ -8,6 +8,26 @@ import Button, { ButtonGroup } from '../base/Button'
import { showToast } from '../../lib/toast'
import React from 'react'
const TYPE_LABELS: Record<number, string> = {
1: 'Auftrag',
2: 'Angebot',
3: 'Storno',
4: 'Gutschrift',
5: 'Rechnung',
6: 'Teilrechnung',
7: 'Teilstorno',
}
const TYPE_PRINT_MAP: Record<number, number> = {
1: 1, // Auftrag → INVOICE
2: 5, // Angebot → OFFER
3: 6, // Storno → STORNO
4: 6, // Gutschrift → STORNO
5: 1, // Rechnung → INVOICE
6: 1, // Teilrechnung → INVOICE
7: 6, // Teilstorno → STORNO
}
class ButtonComponent extends Component<{ loadOrder }, { disabled: boolean, saving: boolean }> {
orderState: OrderState
orderService: OrderService
@ -38,8 +58,14 @@ class ButtonComponent extends Component<{ loadOrder }, { disabled: boolean, savi
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)
const orderType = this.orderState.getCurrentOrder().value.type;
const printType = TYPE_PRINT_MAP[orderType] || 1;
window.open('/apps/backend/order/detail/print/' + printType + '/' + uuid)
}
async handleJobTicket(e) {
const uuid = this.orderState.getCurrentOrder().value.uuid;
window.open('/apps/backend/order/detail/print/7/' + uuid)
}
async handleSave(e) {
@ -58,6 +84,9 @@ class ButtonComponent extends Component<{ loadOrder }, { disabled: boolean, savi
}
render() {
const orderType = this.orderState.getCurrentOrder().value.type;
const typeLabel = TYPE_LABELS[orderType] || 'Auftrag';
return (
<ButtonGroup className="gap-3">
<Button
@ -76,10 +105,25 @@ class ButtonComponent extends Component<{ loadOrder }, { disabled: boolean, savi
disabled={!this.orderState.getCurrentOrder().value.saved}
onClick={(e: any) => this.handlePrint(e)}
>
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth="1.5" stroke="currentColor" className="h-5 w-5">
<path strokeLinecap="round" strokeLinejoin="round" d="M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0 1 10.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0 .229 2.523a1.125 1.125 0 0 1-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0 0 21 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 0 0-1.913-.247M6.34 18H5.25A2.25 2.25 0 0 1 3 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 0 1 1.913-.247m10.5 0a48.536 48.536 0 0 0-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5Zm-3 0h.008v.008H15V10.5Z"></path>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" className="h-5 w-5">
<path d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625Z" fill="currentColor" opacity="0.2"/>
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625Z"/>
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" d="M12 14.25v5.25m-3-3.75h6"/>
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" d="M12.75 6.75h-3.75V3"/>
</svg>
Drucken
{typeLabel} drucken
</Button>
<Button
color="light"
disabled={!this.orderState.getCurrentOrder().value.saved}
onClick={(e: any) => this.handleJobTicket(e)}
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" className="h-5 w-5">
<path d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625Z" fill="currentColor" opacity="0.2"/>
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625Z"/>
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" d="M9 12h6m-3 3V9"/>
</svg>
Job Ticket
</Button>
</ButtonGroup>
)

File diff suppressed because one or more lines are too long

View File

@ -2034,11 +2034,6 @@ html {
background-color: rgb(59 130 246 / var(--tw-bg-opacity));
}
.bg-blue-600{
--tw-bg-opacity: 1;
background-color: rgb(37 99 235 / var(--tw-bg-opacity));
}
.bg-blue-700{
--tw-bg-opacity: 1;
background-color: rgb(29 78 216 / var(--tw-bg-opacity));