Browse code

Implement default slottype and use it for manually creating slots

Benjamin Roth authored on25/07/2024 11:57:21
Showing6 changed files
... ...
@@ -132,12 +132,11 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slot'] = array
132 132
         (
133 133
             'exclude'   => true,
134 134
             'filter'    => true,
135
-            'default'   => time(),
136 135
             'sorting'   => true,
137 136
             'flag'      => DataContainer::SORT_DAY_ASC,
138 137
             'inputType' => 'text',
139 138
             'eval'      => array('rgxp' => 'time', 'mandatory' => true, 'tl_class' => 'w50'),
140
-            'sql'       => "int(10) NULL"
139
+            'sql'       => "int(10) unsigned NULL"
141 140
         ),
142 141
         'duration' => array
143 142
         (
... ...
@@ -38,7 +38,8 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slottypes'] = array
38 38
             'fields'                  => array('title'),
39 39
             'headerFields' => array('title'),
40 40
             'flag'                    => DataContainer::SORT_ASC,
41
-            'panelLayout'             => 'limit'
41
+            'panelLayout'             => 'limit',
42
+            'disableGrouping'          => true
42 43
         ),
43 44
         'label' => array(
44 45
             'fields'                  => array('title'),
... ...
@@ -58,11 +59,11 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slottypes'] = array
58 59
             'edit' => array
59 60
             (
60 61
                 'href'                => 'act=edit',
61
-                'icon'                => 'edit.gif',
62
+                'icon'                => 'edit.svg',
62 63
             ),
63 64
             'copy' => array
64 65
             (
65
-                'href'                => 'act=cut&mode=copy',
66
+                'href'                => 'act=paste&mode=copy',
66 67
                 'icon'                => 'copy.svg'
67 68
             ),
68 69
             'cut' => array
... ...
@@ -74,11 +75,12 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slottypes'] = array
74 75
             'delete' => array
75 76
             (
76 77
                 'href'                => 'act=delete',
77
-                'icon'                => 'delete.gif',
78
+                'icon'                => 'delete.svg',
79
+                'attributes'          => 'onclick="if(!confirm(\'' . ($GLOBALS['TL_LANG']['MSC']['deleteConfirm'] ?? null) . '\'))return false;Backend.getScrollOffset()"'
78 80
             ),
79 81
             'show' => array
80 82
             (
81
-                'icon'                => 'show.gif',
83
+                'icon'                => 'show.svg',
82 84
             ),
83 85
         )
84 86
     ),
... ...
@@ -86,7 +88,7 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slottypes'] = array
86 88
     // Palettes
87 89
     'palettes' => array
88 90
     (
89
-        'default' => '{title_legend},title;{config_legend},duration,containers,units'
91
+        'default' => '{title_legend},title;{config_legend},duration,containers,units;{expert_legend},default'
90 92
     ),
91 93
 
92 94
     // Subpalettes
... ...
@@ -167,6 +169,13 @@ $GLOBALS['TL_DCA']['tl_vr_wa_slottypes'] = array
167 169
                 'tl_class' => 'clr'
168 170
             ),
169 171
             'sql'                     => "blob NULL"
170
-        )
172
+        ),
173
+        'default' => array
174
+        (
175
+            'exclude'                 => true,
176
+            'inputType'               => 'checkbox',
177
+            'eval'                    => array('doNotCopy'=>true, 'tl_class'=>'w50 clr'),
178
+            'sql'                     => "char(1) NOT NULL default ''"
179
+        ),
171 180
     )
172 181
 );
... ...
@@ -34,6 +34,14 @@
34 34
                 <source>Additional selectable container units for slot booking.</source>
35 35
                 <target>Zusätzlich wählbare Behältereinheiten für die Slotbuchung.</target>
36 36
             </trans-unit>
37
+            <trans-unit id="tl_vr_wa_slottypes.default.0">
38
+                <source>Default</source>
39
+                <target>Standard</target>
40
+            </trans-unit>
41
+            <trans-unit id="tl_vr_wa_slottypes.default.1">
42
+                <source>The default slottype is used when adding slots manually.</source>
43
+                <target>Beim manuellen Hinzufügen von Slots wird der Standard-Slottyp verwendet.</target>
44
+            </trans-unit>
37 45
             <trans-unit id="tl_vr_wa_slottypes.title_legend">
38 46
                 <source>Title settings</source>
39 47
                 <target>Titel-Einstellungen</target>
... ...
@@ -42,6 +50,15 @@
42 50
                 <source>Slot configuration</source>
43 51
                 <target>Slot-Konfiguration</target>
44 52
             </trans-unit>
53
+            <trans-unit id="tl_vr_wa_slottypes.expert_legend">
54
+                <source>Expert settings</source>
55
+                <target>Experten-Einstellungen</target>
56
+            </trans-unit>
57
+
58
+            <trans-unit id="ERR.wa_multiple_default">
59
+                <source>You can only define one default slottype per site</source>
60
+                <target>Sie können nur einen Slot-Typ pro Standort als Standard definieren</target>
61
+            </trans-unit>
45 62
         </body>
46 63
     </file>
47 64
 </xliff>
48 65
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#259232" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><polyline points="20 6 9 17 4 12"></polyline></svg>
0 2
\ No newline at end of file
... ...
@@ -23,6 +23,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
23 23
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
24 24
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
25 25
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
26
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlottypesModel;
26 27
 use vonRotenberg\WeinanlieferungBundle\SlotChecker;
27 28
 
28 29
 class WeinanlieferungSlotContainerListener
... ...
@@ -49,12 +50,12 @@ class WeinanlieferungSlotContainerListener
49 50
 
50 51
         $arrSorten = [];
51 52
 
52
-        $Sorten = StringUtil::deserialize($Slot->sorten,true);
53
-        foreach($Sorten as $sorte)
53
+        $Sorten = StringUtil::deserialize($Slot->sorten, true);
54
+        foreach ($Sorten as $sorte)
54 55
         {
55 56
             $objSorte = WeinanlieferungRebsorteModel::findByPk($sorte['sorte']);
56 57
             $objLeseart = WeinanlieferungLeseartModel::findByPk($sorte['leseart']);
57
-            $arrSorten[] = ($objSorte !== null  ? $objSorte->title : '') . ' ' . ($objLeseart !== null  ? $objLeseart->title : '');
58
+            $arrSorten[] = ($objSorte !== null ? $objSorte->title : '') . ' ' . ($objLeseart !== null ? $objLeseart->title : '');
58 59
         }
59 60
 
60 61
         return sprintf('<div class="tl_content_left"><div class="row u-items-center">
... ...
@@ -71,7 +72,7 @@ class WeinanlieferungSlotContainerListener
71 72
             <div class="col-3">
72 73
               <div class="t-label">Dauer</div>%s %s
73 74
             </div>
74
-        </div></div>',Date::parse(Date::getNumericDateFormat(),$row['date']), Date::parse(Date::getNumericTimeFormat(),$row['time']), Date::parse(Date::getNumericDatimFormat(),$row['buchbar_ab']),Date::parse(Date::getNumericDatimFormat(),$row['buchbar_bis']),$Slot->behaelter,$row['duration'],($row['duration'] == 1 ? $this->translator->trans('MSC.wa_duration_minute', [], 'contao_tl_vr_wa_units') : $this->translator->trans('MSC.wa_duration_minutes', [], 'contao_tl_vr_wa_units')));
75
+        </div></div>', Date::parse(Date::getNumericDateFormat(), $row['date']), Date::parse(Date::getNumericTimeFormat(), $row['time']), Date::parse(Date::getNumericDatimFormat(), $row['buchbar_ab']), Date::parse(Date::getNumericDatimFormat(), $row['buchbar_bis']), $Slot->behaelter, $row['duration'], ($row['duration'] == 1 ? $this->translator->trans('MSC.wa_duration_minute', [], 'contao_tl_vr_wa_units') : $this->translator->trans('MSC.wa_duration_minutes', [], 'contao_tl_vr_wa_units')));
75 76
     }
76 77
 
77 78
     /**
... ...
@@ -89,13 +90,43 @@ class WeinanlieferungSlotContainerListener
89 90
         }
90 91
 
91 92
         $start = strtotime(date('Y-m-d', $dc->activeRecord->date) . ' ' . date('H:i:s', $varValue));
92
-        $duration = \intval(Input::post('duration')) !== null ? intval(Input::post('duration'))*60 : $dc->activeRecord->duration*60;
93
+        $duration = \intval(Input::post('duration')) !== null ? intval(Input::post('duration')) * 60 : $dc->activeRecord->duration * 60;
93 94
 
94
-        if ($slotchecker->checkTimeApplicableForSite($dc->activeRecord->pid,$start,$start+$duration,0,\intval($dc->id)))
95
+        if ($slotchecker->checkTimeApplicableForSite($dc->activeRecord->pid, $start, $start + $duration, 0, \intval($dc->id)))
95 96
         {
96 97
             throw new \Exception($this->translator->trans('ERR.wa_slot_conflict', [], 'contao_tl_vr_wa_slot'));
97 98
         }
98 99
 
99 100
         return $start;
100 101
     }
102
+
103
+    /**
104
+     * @Callback(table="tl_vr_wa_slot", target="fields.duration.load")
105
+     */
106
+    public function setDurationDefault($varValue, DataContainer $dc)
107
+    {
108
+        $Slottype = WeinanlieferungSlottypesModel::findOneBy(["pid = ?", "`default` = '1'"], [$dc->activeRecord->pid]);
109
+
110
+        if ($Slottype !== null && !$varValue)
111
+        {
112
+            $varValue = $Slottype->duration;
113
+        }
114
+
115
+        return $varValue;
116
+    }
117
+
118
+    /**
119
+     * @Callback(table="tl_vr_wa_slot", target="fields.behaelter.load")
120
+     */
121
+    public function setContainersDefault($varValue, DataContainer $dc)
122
+    {
123
+        $Slottype = WeinanlieferungSlottypesModel::findOneBy(["pid = ?", "`default` = '1'"], [$dc->activeRecord->pid]);
124
+
125
+        if ($Slottype !== null && !$varValue)
126
+        {
127
+            $varValue = $Slottype->containers;
128
+        }
129
+
130
+        return $varValue;
131
+    }
101 132
 }
... ...
@@ -14,6 +14,8 @@ namespace vonRotenberg\WeinanlieferungBundle\EventListener\DataContainer;
14 14
 
15 15
 use Contao\CoreBundle\ServiceAnnotation\Callback;
16 16
 use Contao\DataContainer;
17
+use Contao\Image;
18
+use Contao\StringUtil;
17 19
 use Doctrine\DBAL\Connection;
18 20
 use Symfony\Contracts\Translation\TranslatorInterface;
19 21
 
... ...
@@ -40,6 +42,11 @@ class WeinanlieferungSlottypesContainerListener
40 42
         $label .= ' <span style="color:#999;padding-left:3px">['.$this->translator->trans('MSC.wa_container', [], 'contao_tl_vr_wa_units').': '.$row['containers'].']</span>';
41 43
         $label .= ' <span style="color:#999;padding-left:3px">['.$this->translator->trans('MSC.wa_duration', [], 'contao_tl_vr_wa_units').': '.$row['duration'].' '.($row['duration'] == 1 ? $this->translator->trans('MSC.wa_duration_minute', [], 'contao_tl_vr_wa_units') : $this->translator->trans('MSC.wa_duration_minutes', [], 'contao_tl_vr_wa_units')).']</span>';
42 44
 
45
+        if ($row['default'])
46
+        {
47
+            $label = Image::getHtml('bundles/vonrotenbergweinanlieferung/images/icons/check.svg', '', 'title="' . StringUtil::specialchars($this->translator->trans('tl_vr_wa_slottypes.default.0', [], 'contao_tl_vr_wa_slottypes')) . '"') . ' ' . $label;
48
+        }
49
+
43 50
         return sprintf($strRow,$label);
44 51
     }
45 52
 
... ...
@@ -63,4 +70,26 @@ class WeinanlieferungSlottypesContainerListener
63 70
 
64 71
         return $arrOptions;
65 72
     }
73
+
74
+    /**
75
+     * @Callback(table="tl_vr_wa_slottypes", target="fields.default.save")
76
+     */
77
+    public function checkDefault($varValue, DataContainer $dc)
78
+    {
79
+        if (!$varValue)
80
+        {
81
+            return '';
82
+        }
83
+
84
+        $t = $dc->table;
85
+        $objPage = $this->db->prepare("SELECT id FROM $t WHERE `default` = 1 AND pid = ? AND id != ?")
86
+            ->executeQuery([$dc->activeRecord->pid, $dc->activeRecord->id]);
87
+
88
+        if ($objPage->rowCount())
89
+        {
90
+            throw new \Exception($this->translator->trans('ERR.wa_multiple_default', [], 'contao_tl_vr_wa_slottypes'));
91
+        }
92
+
93
+        return $varValue;
94
+    }
66 95
 }