Plugin Directory

Changeset 3407122


Ignore:
Timestamp:
12/01/2025 06:00:43 PM (3 months ago)
Author:
plainware
Message:

3.1.1

Location:
plaintracker/trunk
Files:
11 added
23 deleted
76 edited

Legend:

Unmodified
Added
Removed
  • plaintracker/trunk/languages/plaintracker-cs_CZ.po

    r3403602 r3407122  
    4242msgstr "Archivováno"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-da_DK.po

    r3403602 r3407122  
    4242msgstr "Arkiveret"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-de_DE.po

    r3403602 r3407122  
    4242msgstr "Archiviert"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-fr_FR.po

    r3403602 r3407122  
    4242msgstr "Archivé"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-it_IT.po

    r3403602 r3407122  
    4242msgstr "Archiviato"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-ja_JP.po

    r3403602 r3407122  
    4343msgstr "アーカイブ"
    4444
     45msgid "Are you sure?"
     46msgstr ""
     47
     48msgid "Click a worker to clock them in."
     49msgstr ""
     50
     51msgid "Click a worker to clock them out."
     52msgstr ""
     53
    4554msgid "Click to change"
    4655msgstr ""
     
    364373msgstr ""
    365374
     375msgid "You can add any user as a worker."
     376msgstr ""
     377
    366378msgid "You have clocked in"
    367379msgstr ""
  • plaintracker/trunk/languages/plaintracker-nl_NL.po

    r3403602 r3407122  
    4242msgstr "Gearchiveerd"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-sv_SE.po

    r3403602 r3407122  
    4242msgstr "Arkiverade"
    4343
     44msgid "Are you sure?"
     45msgstr ""
     46
     47msgid "Click a worker to clock them in."
     48msgstr ""
     49
     50msgid "Click a worker to clock them out."
     51msgstr ""
     52
    4453msgid "Click to change"
    4554msgstr ""
     
    363372msgstr ""
    364373
     374msgid "You can add any user as a worker."
     375msgstr ""
     376
    365377msgid "You have clocked in"
    366378msgstr ""
  • plaintracker/trunk/languages/plaintracker-zh_CN.po

    r3403602 r3407122  
    4343msgstr "已归档"
    4444
     45msgid "Are you sure?"
     46msgstr ""
     47
     48msgid "Click a worker to clock them in."
     49msgstr ""
     50
     51msgid "Click a worker to clock them out."
     52msgstr ""
     53
    4554msgid "Click to change"
    4655msgstr ""
     
    364373msgstr ""
    365374
     375msgid "You can add any user as a worker."
     376msgstr ""
     377
    366378msgid "You have clocked in"
    367379msgstr ""
  • plaintracker/trunk/languages/plaintracker.pot

    r3403602 r3407122  
    3030msgstr ""
    3131
     32msgid "Are you sure?"
     33msgstr ""
     34
     35msgid "Click a worker to clock them in."
     36msgstr ""
     37
     38msgid "Click a worker to clock them out."
     39msgstr ""
     40
    3241msgid "Click to change"
    3342msgstr ""
     
    351360msgstr ""
    352361
     362msgid "You can add any user as a worker."
     363msgstr ""
     364
    353365msgid "You have clocked in"
    354366msgstr ""
  • plaintracker/trunk/module/web-admin-dashboard/src/Controller/AdminDashboardClockInPageController.php

    r3403602 r3407122  
    77use Plainware\DateTime\TimeFactory;
    88use Plainware\DateTime\DateTimeFormatter;
    9 use Plainware\Ui\Component\SpacedContainer;
     9use Plainware\Ui\Component\BlockList;
    1010use Plainware\Ui\Component\Link;
    1111use Plainware\Ui\Component\Main;
     
    6666        }
    6767
    68         $ret = new SpacedContainer();
     68        $ret = new BlockList();
    6969
    7070        if ($ms) {
    7171            $menu = new Menu();
    72             $i = 1;
    7372            foreach ($ms as $m) {
    7473                $link = (new Link('.', ['worker' => $m->getId()]))
     
    7675                    ->prependIcon('→')
    7776                    ;
    78 
    79                 $menu->add($i++, $link);
     77                $menu->add($link);
    8078            }
    8179            $menu->setVertical();
    8280
    83             $ret->add('<p>__Click a worker to clock them in.__');
     81            $ret->add('__Click a worker to clock them in.__');
    8482            $ret->add($menu);
    8583        } else {
  • plaintracker/trunk/module/web-admin-dashboard/src/Controller/AdminDashboardClockOutPageController.php

    r3403602 r3407122  
    77use Plainware\DateTime\TimeFactory;
    88use Plainware\DateTime\DateTimeFormatter;
    9 use Plainware\Ui\Component\Container;
     9use Plainware\Ui\Component\BlockList;
    1010use Plainware\Ui\Component\InlineList;
    1111use Plainware\Ui\Component\Link;
     
    8484        }
    8585
    86         $now = $this->timeFactory->startOfDay($this->timeFactory->now());
     86        $now = $this->timeFactory->now();
    8787
    8888    // worker selected, clock them in
     
    9595        }
    9696
    97         $ret = new Container();
     97        $ret = new BlockList();
    9898        if ($ms) {
    9999            $menu = new Menu();
    100             $i = 1;
    101100            foreach ($ms as $m) {
    102101                $record = $workerToRecord[$m->getId()];
     
    117116                    ;
    118117
    119                 $menu->add($i++, $link);
     118                $menu->add($link);
    120119            }
    121120            $menu->setVertical();
    122121
    123             $ret->add(55, '<p>__Click a worker to clock them out.__');
    124             $ret->add(60, $menu);
     122            $ret->add('__Click a worker to clock them out.__');
     123            $ret->add($menu);
    125124        } else {
    126             $ret->add(50, $this->renderNone());
     125            $ret->add($this->renderNone());
    127126        }
    128127
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminCreateRecordPageController.php

    r3403602 r3407122  
    66use Plainware\Http\Redirect;
    77use Plainware\DateTime\TimeFactory;
    8 use Plainware\Ui\Component\Container;
    9 use Plainware\Ui\Component\Form;
    10 use Plainware\Ui\Component\Form\ContentInput;
     8use Plainware\Ui\Component\Form\Form;
    119use Plainware\Ui\Component\Form\DateInput;
    1210use Plainware\Ui\Component\Form\TimeInput;
     
    4947            $v = new Menu();
    5048            $v->add(
    51                 20,
    5249                (new Link('./worker', ['-worker' => null]))
    5350                    ->setLabel($worker)
    5451                    ->withAttr('title', '__Click to change__')
    5552            );
    56             $form->withInput('worker', new ContentInput())
    57                 ->setLabel('__Worker__')
    58                 ->setValue($v)
    59                 ;
     53            $form->add($v)->withLabel('__Worker__');
    6054        }
    6155
    62         $form->withInput('d', new DateInput())
    63             ->setLabel('__Date__')
    64             ->setValue($clockIn->format('Ymd'))
    65             ;
     56        $form->add((new DateInput('d'))->setLabel('__Date__')->setValue($clockIn));
    6657
    67         $form->withInput('t1', new TimeInput())
    68             ->setLabel('__Clock in__')
    69             ->setValue(60 * 60 * $clockIn->format('H') + 60 * $clockIn->format('i'))
    70             ;
     58        $form->add(
     59            (new TimeInput('t1'))
     60                ->setLabel('__Clock in__')
     61                ->setValue(60 * 60 * $clockIn->format('H') + 60 * $clockIn->format('i'))
     62        );
    7163
    72         $form->withInput('desc1', new TextareaInput())
    73             ->setLabel('__Clock-in note__')
    74             ;
     64        $form->add((new TextareaInput('desc1'))->setLabel('__Clock-in note__'));
    7565
    7666        $clockOut = $clockIn->modify('+4 hours');
    77         $form->withInput('t2', new TimeInput())
    78             ->setLabel('__Clock out__')
    79             ->setValue(60 * 60 * $clockOut->format('H') + 60 * $clockOut->format('i'))
    80             ;
     67        $form->add(
     68            (new TimeInput('t2'))
     69                ->setLabel('__Clock out__')
     70                ->setValue(60 * 60 * $clockOut->format('H') + 60 * $clockOut->format('i'))
     71        );
    8172
    82         $form->withInput('desc2', new TextareaInput())
    83             ->setLabel('__Clock-out note__')
    84             ;
     73        $form->add((new TextareaInput('desc2'))->setLabel('__Clock-out note__'));
    8574
    86         $form->withButton('submit', new Button('__Create time record__'));
     75        $form->addButton(new Button('__Create time record__'));
    8776
    88         $form = $form->grab($request);
     77        $vs = $form->grab($request);
    8978
    90         if ($form->isSubmitted()) {
    91             $vs = $form->getValues();
    92 
     79        if ($vs) {
    9380            if ($form->isValid()) {
    9481                $d = $vs['d'];
     
    9683                $t2 = $vs['t2'];
    9784
    98                 $clockIn = $this->timeFactory->fromString($d)->modify('+' . $t1 . ' seconds');
    99                 $clockOut = $this->timeFactory->fromString($d)->modify('+' . $t2 . ' seconds');
     85                $clockIn = $d->modify('+' . $t1 . ' seconds');
     86                $clockOut = $d->modify('+' . $t2 . ' seconds');
    10087                if ($t2 <= $t1) {
    10188                    $clockOut = $clockOut->modify('+1 day');
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminCreateRecordSelectWorkerPageController.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Http\Redirect;
    7 use Plainware\Ui\Component\Container;
    87use Plainware\Ui\Component\Link;
    98use Plainware\Ui\Component\Main;
     
    4847        $menu = new Menu();
    4948
    50         $i = 1;
    5149        foreach ($ms as $m) {
    5250            $link = (new Link('..', ['worker' => $m->getId()]))->setLabel($m);
    53             $menu->add($i++, $link);
     51            $menu->add($link);
    5452        }
    55 
    56         $menu->setVertical();
    5753
    5854        return $menu;
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminRecordIdDeletePageController.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Http\Redirect;
    7 use Plainware\Ui\Component\Container;
     7use Plainware\Ui\Component\Card;
    88use Plainware\Ui\Component\Main;
    9 use Plainware\Ui\Component\Section;
    109use Plainware\Ui\Component\Link;
    11 use Plainware\Ui\Component\Form;
     10use Plainware\Ui\Component\Form\Form;
    1211use Plainware\Ui\Component\Form\Button;
    1312use PlainTracker\Core\Action\DeleteRecordAction;
     
    2625
    2726        $form = new Form();
    28         $form->withButton('submit', new Button('__Yes, confirm deleting__'))
    29             ->prependIcon('&times;')
    30             ;
    31 
    32         $form->grab($request);
    33         if ($form->isSubmitted() && $form->isValid()) {
    34             $this->deleteAction->__invoke($m);
    35 
    36             return (new Redirect('../..'))
    37                 ->withMessage('__Time record deleted__')
    38                 ;
    39         }
    40 
    4127
    4228        $info = '__This entry will be permanently deleted from the database including all
    4329        related entries without possibility to restore it later. If this is not what you
    4430        are intending to do, consider changing the entry status instead.__';
     31        $form->add(new Card($info))->withLabel('__Are you sure?__');
    4532
    46         $ret = (new Container())
    47             ->add(50, new Section($info))
    48             ->add(60, new Section($form))
    49             ;
    50         $ret = new Main($ret);
     33        $form->addButton((new Button('__Yes, confirm deleting__'))->prependIcon('&times;'));
     34
     35        $vs = $form->grab($request);
     36        if ($vs && $form->isValid()) {
     37            $this->deleteAction->__invoke($m);
     38
     39            return (new Redirect('../..'))->withMessage('__Time record deleted__');
     40        }
     41
     42        $ret = new Main($form);
    5143
    5244        return $ret;
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminRecordIdPageController.php

    r3403602 r3407122  
    99use Plainware\Ui\Component\Main;
    1010use Plainware\Ui\Component\Link;
    11 use Plainware\Ui\Component\Form;
     11use Plainware\Ui\Component\Form\Form;
    1212use Plainware\Ui\Component\Form\CheckboxInput;
    1313use Plainware\Ui\Component\Form\ContentInput;
     
    5757        $clockOutAction = $request->getQueryParam('clockout');
    5858
    59         $form = new Form($request);
     59        $form = new Form();
    6060
    6161        $clockIn = $m->getClockIn();
    6262        $v = 60 * 60 * $clockIn->format('H') + 60 * $clockIn->format('i');
    63         $form->withInput('t1', new TimeInput())
    64             ->setLabel('__Clock in__')
    65             ->setValue($v)
    66             ;
     63        $form->add(
     64            (new TimeInput('t1'))
     65                ->setLabel('__Clock in__')
     66                ->setValue($v)
     67        );
    6768
    68         $form->withInput('desc1', new TextareaInput())
    69             ->setLabel('__Clock-in note__')
    70             ->setValue($m->getClockInDescription())
    71             ;
     69        $form->add(
     70            (new TextareaInput('desc1'))
     71                ->setLabel('__Clock-in note__')
     72                ->setValue($m->getClockInDescription() ?? '')
     73        );
     74
    7275
    7376        $clockOut = $m->getClockOut();
    7477
    75         $form->withInput('with_clock_out', new CheckboxInput())
    76             ->setLabel('__With clock-out__')
    77             ->setValue(1)
    78             ->setChecked($clockOut ? true : false)
    79             ;
     78        $form->add(
     79            (new CheckboxInput('with_clock_out'))
     80                ->setLabel('__With clock-out__')
     81                ->setValue($clockOut ? true : false)
     82        );
    8083
    8184        $v = $clockOut ?? $clockIn->modify('+4 hours');
    8285        $v = 60 * 60 * $v->format('H') + 60 * $v->format('i');
    83         $form->withInput('t2', new TimeInput())
    84             ->setLabel('__Clock out__')
    85             ->setValue($v)
    86             ;
     86        $form->add(
     87            (new TimeInput('t2'))
     88                ->setLabel('__Clock out__')
     89                ->setValue($v)
     90        );
    8791
    88         $form->withInput('desc2', new TextareaInput())
    89             ->setLabel('__Clock-out note__')
    90             ->setValue($m->getClockOutDescription())
    91             ;
     92        $form->add(
     93            (new TextareaInput('desc2'))
     94                ->setLabel('__Clock-out note__')
     95                ->setValue($m->getClockOutDescription() ?? '')
     96        );
    9297
    9398        $form
     
    96101            ;
    97102
    98         $form->withButton('submit', new Button('__Save changes__'));
     103        $form->addButton(new Button('__Save changes__'));
    99104
    100         $form = $form->grab($request);
    101 
    102         if ($form->isSubmitted()) {
    103             $vs = $form->getValues();
    104 
     105        $vs = $form->grab($request);
     106        if ($vs) {
    105107            if ($form->isValid()) {
    106108                $clockIn = $clockIn->setTime(0, 0)->modify('+' . $vs['t1'] . ' seconds');
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminRecordPageConfigController.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Http\Redirect;
    7 use Plainware\Ui\Component\Form;
     7use Plainware\Ui\Component\Form\Form;
    88use Plainware\Ui\Component\Form\DatePeriodInput;
    99use Plainware\Ui\Component\Form\Button;
     
    1717
    1818        $v = $request->getQueryParam('-interval') ?? '1w';
    19         $form->withInput('interval', new DatePeriodInput())
    20             ->setLabel('__Display interval__')
    21             ->setValue($v)
    22             ;
     19        $form->add(
     20            (new DatePeriodInput('interval'))
     21                ->setLabel('__Display interval__')
     22                ->setValue($v)
     23        );
    2324
    24         $form->withButton('submit', new Button('__Apply configuration__'));
     25        $form->addButton(new Button('__Apply configuration__'));
    2526
    26         $form = $form->grab($request);
    27 
    28         if ($form->isSubmitted()) {
    29             $vs = $form->getValues();
    30 
     27        $vs = $form->grab($request);
     28        if ($vs) {
    3129            if ($form->isValid()) {
    3230                return (new Redirect('..', ['interval' => $vs['interval']]))
  • plaintracker/trunk/module/web-admin-record/src/Controller/AdminRecordPageController.php

    r3403602 r3407122  
    154154            ;
    155155
    156         $menu = new Menu();
    157         $menu->add(25, $linkPrev);
    158         $menu->add(50, $labelCurrent);
    159         $menu->add(75, $linkNext);
     156        $menu = (new Menu())
     157            ->add($linkPrev)
     158            ->add($labelCurrent)
     159            ->add($linkNext)
     160            ;
    160161
    161162        return $menu;
  • plaintracker/trunk/module/web-admin-setting/src/Controller/DatetimePageController.php

    r3403602 r3407122  
    88use Plainware\DateTime\DateTimeFormatter;
    99use Plainware\Ui\Component\Main;
    10 use Plainware\Ui\Component\Form;
     10use Plainware\Ui\Component\Card;
     11use Plainware\Ui\Component\Form\Form;
    1112use Plainware\Ui\Component\Form\SelectInput;
    1213use Plainware\Ui\Component\Form\TextInput;
     
    2829    {
    2930        $form = new Form();
    30         // $form->withInput('')
    3131
    3232        $try = new \DateTimeImmutable();
     
    4343        }
    4444        $v = $this->repo->get('datetime_date_format');
    45         $form->withInput('datetime_date_format', new SelectInput($option))
     45        $form->add(
     46            (new SelectInput('datetime_date_format'))
     47            ->setOptions($option)
    4648            ->setLabel('__Date format__')
    4749            ->setValue($v)
    48             ;
     50        );
    4951
    5052    /* time format */
     
    6264        }
    6365        $v = $this->repo->get('datetime_time_format');
    64         $form->withInput('datetime_time_format', new SelectInput($option))
     66        $form->add(
     67            (new SelectInput('datetime_time_format'))
     68            ->setOptions($option)
    6569            ->setLabel('__Time format__')
    6670            ->setValue($v)
    67             ;
     71        );
    6872
    6973    /* week starts */
     
    7579        }
    7680        $v = $this->repo->get('datetime_week_starts');
    77         $form->withInput('datetime_week_starts', new SelectInput($option))
     81        $form->add(
     82            (new SelectInput('datetime_week_starts'))
     83            ->setOptions($option)
    7884            ->setLabel('__Week starts on__')
    7985            ->setValue($v)
    80             ;
     86        );
    8187
    8288    /* timezone */
    8389        $v = $this->timeFactory->getTimezone();
    8490        $v = $v->getName();
    85         $form->withInput('datetime_timezone', new TextInput())
    86             ->setLabel('__Timezone__')
    87             ->setValue($v)
    88             ->setDisabled()
     91        $form->add(new Card($v))
     92            ->withLabel('__Timezone__')
    8993            ;
    9094
    91         $form->withButton('submit', new Button())
    92             ->setLabel('__Save__')
    93             ;
     95        $form->addButton(new Button('__Save__'));
    9496
    95         $form->grab($request);
    96         if ($form->isSubmitted()) {
    97             $vs = $form->getValues();
     97        $vs = $form->grab($request);
     98        if ($vs) {
    9899            if ($form->isValid()) {
    99100                $props = ['datetime_date_format', 'datetime_time_format', 'datetime_week_starts'];
     
    108109        }
    109110
    110         $content = $form;
    111 
    112         $ret = new Main($content);
     111        $ret = new Main($form);
    113112
    114113        return $ret;
  • plaintracker/trunk/module/web-admin-worker/src/Controller/AdminCreateWorkerPageController.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Http\Redirect;
    7 use Plainware\Ui\Component\Form;
     7use Plainware\Ui\Component\Form\Form;
    88use Plainware\Ui\Component\Form\ContentInput;
    99use Plainware\Ui\Component\Form\RadioSetInput;
     
    3535
    3636        $v = (new Menu())
    37             ->add(20, (new Link('./user'))->setLabel($wpUser)->withAttr('title', '__Click to change__'))
     37            ->add((new Link('./user'))->setLabel($wpUser)->withAttr('title', '__Click to change__'))
    3838            ;
    39         $form->withInput('user', new ContentInput())
    40             ->setLabel('__WordPress user__')
    41             ->setValue($v)
    42             ;
     39        $form->add($v)->withLabel('__WordPress user__');
    4340
    44         $form->withInput('phone', new TextInput())
    45             ->setLabel('__Phone number__')
    46             ;
     41        $form->add((new TextInput('phone'))->setLabel('__Phone number__'));
    4742
    48         $form->withInput('desc', new TextareaInput())
    49             ->setLabel('__Description__')
    50             ->setHelp('__Visible to admin only__')
    51             ;
     43        $form->add(
     44            (new TextareaInput('desc'))
     45                ->setLabel('__Description__')
     46                ->addHelp('__Visible to admin only__')
     47        );
    5248
    5349        $option = ['..' => '__View workers__', '.' => '__Add another worker__'];
    54         $form->withInput('next', new RadioSetInput($option))
    55             ->setLabel('__Next action__')
    56             ->setValue(current(array_keys($option)))
    57             ;
     50        $form->add(
     51            (new RadioSetInput('next'))
     52                ->setLabel('__Next action__')
     53                ->setOptions($option)
     54                ->setValue(current(array_keys($option)))
     55        );
    5856
    59         $form->withButton('submit', new Button('__Add worker__'));
     57        $form->addButton(new Button('__Add worker__'));
    6058
    61         $form = $form->grab($request);
    62 
    63         if ($form->isSubmitted()) {
    64             $vs = $form->getValues();
    65 
     59        $vs = $form->grab($request);
     60        if ($vs) {
    6661            if ($form->isValid()) {
    6762                $m = $this->createWorkerAction->__invoke($wpUser->ID, $vs['phone'], $vs['desc']);
  • plaintracker/trunk/module/web-admin-worker/src/Controller/AdminCreateWorkerSelectUserPageController.php

    r3403602 r3407122  
    66use Plainware\Http\Redirect;
    77use Plainware\Ui\Component\Link;
    8 use Plainware\Ui\Component\Container;
     8use Plainware\Ui\Component\BlockList;
    99use Plainware\Ui\Component\Main;
    1010use Plainware\Ui\Component\Menu;
     
    3232        if ($ms) {
    3333            $ret = new Menu();
    34 
    35             $i = 1;
    3634            foreach ($ms as $m) {
    37                 $link = (new Link('..', ['user' => $m->ID]))
    38                     ->setLabel($m)
    39                     ;
    40                 $ret->add($i++, $link);
     35                $link = (new Link('..', ['user' => $m->ID]))->setLabel($m);
     36                $ret->add($link);
    4137            }
    4238            $ret->setVertical();
     
    4541        }
    4642
    47 
    48         $ret = (new Container())
    49             ->add(55, '<p>__You can add any user as a worker.__</p>')
    50             ->add(56, $ret)
     43        $ret = (new BlockList())
     44            ->add('__You can add any user as a worker.__')
     45            ->add($ret)
    5146            ;
    5247        $ret = new Main($ret);
  • plaintracker/trunk/module/web-admin-worker/src/Controller/AdminWorkerIdPageController.php

    r3403602 r3407122  
    88use Plainware\Ui\Component\Main;
    99use Plainware\Ui\Component\Link;
    10 use Plainware\Ui\Component\Form;
     10use Plainware\Ui\Component\Form\Form;
    1111use Plainware\Ui\Component\Form\TextInput;
    1212use Plainware\Ui\Component\Form\RadioSetInput;
     
    5252        $m = $this->repo->getById($id);
    5353
    54         $form = new Form($request);
     54        $form = new Form();
    5555
    56         $form->withInput('email', new TextInput())
    57             ->setLabel('__Email address__')
    58             ->setValue($m->getEmail())
    59             ->setDisabled()
    60             ;
     56        $form->add(
     57            (new TextInput('email'))
     58                ->setLabel('__Email address__')
     59                ->setValue($m->getEmail())
     60                ->setDisabled()
     61        );
    6162
    62         $form->withInput('phone', new TextInput())
    63             ->setLabel('__Phone number__')
    64             ->setValue($m->getPhone())
    65             // ->setRequired()
    66             ;
     63        $form->add(
     64            (new TextInput('phone'))
     65                ->setLabel('__Phone number__')
     66                ->setValue($m->getPhone())
     67        );
    6768
    68         $form->withInput('description', new TextareaInput())
    69             ->setLabel('__Description__')
    70             ->setValue($m->getDescription())
    71             ;
     69        $form->add(
     70            (new TextareaInput('description'))
     71                ->setLabel('__Description__')
     72                ->setValue($m->getDescription())
     73        );
    7274
    7375        $stateOptions = [
     
    7577            WorkerState::archived()->getId() => WorkerState::archived()
    7678            ];
    77         $form->withInput('state', new RadioSetInput($stateOptions))
    78             ->setLabel('__Status__')
    79             ->setValue($m->getState()->getId())
    80             ;
     79        $form->add(
     80            (new RadioSetInput('state'))
     81                ->setOptions($stateOptions)
     82                ->setLabel('__Status__')
     83                ->setValue($m->getState()->getId())
     84        );
    8185
    82         $form->withButton('submit', new Button('__Save changes__'));
     86        $form->addButton(new Button('__Save changes__'));
    8387
    84         $form = $form->grab($request);
    85 
    86         if ($form->isSubmitted()) {
    87             $vs = $form->getValues();
    88 
     88        $vs = $form->grab($request);
     89        if ($vs) {
    8990            if ($form->isValid()) {
    9091                $m = ($this->changePhone)($m, $vs['phone']);
  • plaintracker/trunk/module/web-install/src/Controller/InstallController.php

    r3403602 r3407122  
    77use Plainware\Http\Request;
    88use Plainware\Http\Redirect;
    9 use Plainware\Ui\Component\SpacedContainer;
     9use Plainware\Ui\Component\BlockList;
    1010use Plainware\Ui\Component\Dl;
    1111use Plainware\Ui\Component\Main;
    1212use Plainware\Ui\Component\HtmlElement;
    13 use Plainware\Ui\Component\Form;
     13use Plainware\Ui\Component\Form\Form;
    1414use Plainware\Ui\Component\Form\Button;
    1515use PlainTracker\Core\Action\CreateWorkerAction;
     
    2828
    2929        $form = new Form();
    30         $form->withButton('submit', new Button('__Click to install__'));
     30        $form->addButton(new Button('__Click to install__'));
    3131
    32         $form = $form->grab($request);
    33 
    34         if ($form->isSubmitted() && $form->isValid()) {
     32        $vs = $form->grab($request);
     33        if ($vs && $form->isValid()) {
    3534            $this->migrator->up();
    3635
     
    4241        }
    4342
    44         $ret = (new SpacedContainer())
     43        $ret = (new BlockList())
    4544            ->add(new HtmlElement('h1', '__Installation__'))
    4645            ->add($info)
  • plaintracker/trunk/module/web-install/src/Controller/UninstallController.php

    r3403602 r3407122  
    77use Plainware\Http\Request;
    88use Plainware\Http\Redirect;
    9 use Plainware\Ui\Component\SpacedContainer;
     9use Plainware\Ui\Component\BlockList;
    1010use Plainware\Ui\Component\Main;
    11 use Plainware\Ui\Component\Form;
     11use Plainware\Ui\Component\Form\Form;
    1212use Plainware\Ui\Component\Form\Button;
    1313use Plainware\Ui\Component\Link;
     
    2222    {
    2323        $form = new Form();
    24         $form->withButton('submit', new Button('__Click to uninstall__'));
     24        $form->addButton(new Button('__Click to uninstall__'));
    2525
    26         $form = $form->grab($request);
    27 
    28         if ($form->isSubmitted() && $form->isValid()) {
     26        $vs = $form->grab($request);
     27        if ($vs && $form->isValid()) {
    2928            $this->migrator->down();
    3029
     
    3231        }
    3332
    34         $ret = (new SpacedContainer())
     33        $ret = (new BlockList())
    3534            ->add('__This operation can not be undone.__')
    3635            ->add($form)
  • plaintracker/trunk/module/web-promo/boot.php

    r3403602 r3407122  
    2121        $pageMap
    2222            ->when('admin')
    23                 ->addMenuItem((new Link('./promo'))
     23                ->addMenuItem(
     24                    (new Link('./promo'))
    2425                    ->setLabel('__Pro version__')->prependIcon('&star;'),
    2526                    95
    26                     )
     27                )
    2728
    2829            ->when('admin/promo')
  • plaintracker/trunk/module/web-promo/src/Controller/PromoPageController.php

    r3403602 r3407122  
    2323    {
    2424        ob_start();
    25 ?>
     25        ?>
    2626
    2727<style>
     
    3535<section>
    3636<div class="pw-grid-3">
    37     <?php if( 0 ): ?>
     37        <?php if (0) : ?>
    3838    <div class="pw-box">
    3939        <h3 class="pw-inline-list">
     
    4444        </p>
    4545    </div>
    46     <?php endif; ?>
     46        <?php endif; ?>
    4747
    4848    <div class="pw-box">
     
    5151        </h3>
    5252        <p>
    53             You can export your time log records to a CSV file, then you you can further process the data with Microsoft Excel, LibreOffice Calc, or other spreadsheets application.
     53            You can export your time log records to a CSV file,
     54            then you you can further process the data with Microsoft Excel,
     55            LibreOffice Calc, or other spreadsheets application.
    5456        </p>
    5557    </div>
     
    6062        </h3>
    6163        <p>
    62             You can view the total number of time records and work duration within the selected date period with breakdown by worker.
     64            You can view the total number of time records and work duration within the selected
     65            date period with breakdown by worker.
    6366        </p>
    6467    </div>
     
    8588</section>
    8689
    87 <?php
     90        <?php
    8891        $ret = ob_get_clean();
    8992
  • plaintracker/trunk/module/web-user-role-switcher/src/Html/UserRoleSwitcherWidget.php

    r3403602 r3407122  
    4242        }
    4343
    44         $i = 1;
    4544        $ret = new Menu();
    4645        foreach ($items as $item_) {
    47             $ret->add($i++, $item_);
     46            $ret->add($item_);
    4847        }
    4948
  • plaintracker/trunk/module/web-worker-clock/src/Controller/WorkerClockInPageController.php

    r3403602 r3407122  
    66use Plainware\Http\Redirect;
    77use Plainware\DateTime\TimeFactory;
    8 use Plainware\Ui\Component\Form;
     8use Plainware\Ui\Component\Form\Form;
    99use Plainware\Ui\Component\Form\TextareaInput;
    1010use Plainware\Ui\Component\Form\Button;
     
    4747
    4848        $form = new Form();
    49         $form->withInput('desc', (new TextareaInput())->setLabel('__Clock-in note__'));
    50         $form->withButton('submit', (new Button('__Clock in__'))->prependIcon('&rarr;'));
     49        $form->add((new TextareaInput('desc'))->setLabel('__Clock-in note__'));
     50        $form->addButton((new Button('__Clock in__'))->prependIcon('&rarr;'));
    5151
    52         $form->grab($request);
    53         if ($form->isSubmitted()) {
    54             $vs = $form->getValues();
     52        $vs = $form->grab($request);
     53        if ($vs) {
    5554            if ($form->isValid()) {
    5655                $desc = $vs['desc'];
  • plaintracker/trunk/module/web-worker-clock/src/Controller/WorkerClockOutPageController.php

    r3403602 r3407122  
    66use Plainware\Http\Redirect;
    77use Plainware\DateTime\TimeFactory;
    8 use Plainware\Ui\Component\Form;
     8use Plainware\Ui\Component\Form\Form;
    99use Plainware\Ui\Component\Form\TextareaInput;
    1010use Plainware\Ui\Component\Form\Button;
     
    4848
    4949        $form = new Form();
    50         $form->withInput('desc', (new TextareaInput())->setLabel('__Clock-out note__'));
    51         $form->withButton('submit', (new Button('__Clock out__'))->prependIcon('&rarr;'));
     50        $form->add((new TextareaInput('desc'))->setLabel('__Clock-out note__'));
     51        $form->addButton((new Button('__Clock out__'))->prependIcon('&rarr;'));
    5252
    53         $form->grab($request);
    54         if ($form->isSubmitted()) {
    55             $vs = $form->getValues();
     53        $vs = $form->grab($request);
     54        if ($vs) {
    5655            if ($form->isValid()) {
    5756                $this->clockOutAction->__invoke($worker, $now, $vs['desc']);
  • plaintracker/trunk/plaintracker.php

    r3403602 r3407122  
    44Plugin URI: https://www.plaintracker.net/
    55Description: A time clock plugin. Workers clock in and out, managers keep track of their time.
    6 Version: 3.1.0
     6Version: 3.1.1
    77Author: plainware.com
    88Author URI: https://www.plainware.com/
  • plaintracker/trunk/readme.txt

    r3403602 r3407122  
    33Tags: timeclock, employee, attendance, clock, volunteer
    44License: GPLv2 or later
    5 Stable tag: 3.1.0
     5Stable tag: 3.1.1
    66Requires at least: 4.8
    77Tested up to: 6.8
     
    6868
    6969== Changelog ==
     70
     71= 3.1.1 (2025-12-01) =
     72* Clean up some code related to web form controls.
    7073
    7174= 3.1.0 (2025-11-26) =
  • plaintracker/trunk/vendor/plainware/http/src/Server.php

    r3403602 r3407122  
    2525
    2626        return $this;
     27    }
     28
     29    public function getPrefix(): string
     30    {
     31        return $this->prefix;
    2732    }
    2833
  • plaintracker/trunk/vendor/plainware/rest/src/Ui/Renderer/OpenApiInfoRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\Container;
     6use Plainware\Ui\Component\BlockList;
    77use Plainware\Ui\Component\Section;
    88use Plainware\Ui\Component\Table;
     
    2222        $data = YamlParser::YAMLLoadString($yamlCode);
    2323
    24         $ret = new Container();
    25 
    26         $i = 1;
     24        $ret = (new BlockList())->setSpacing(3);
     25
    2726        foreach ($data['paths'] as $path => $pathMethods) {
    2827            foreach ($pathMethods as $method => $methodInfo) {
    29                 $ret_ = new Container();
     28                $ret_ = (new BlockList())->setSpacing(1);
    3029
    3130                $fullPath = $rootUri . $path;
     
    3332                $label->add(new HtmlElement('h3', strtoupper($method)));
    3433                $label->add(new HtmlElement('h3', $fullPath));
    35                 $ret_->add(10, $label);
    36                 $ret_->add(15, $methodInfo['description']);
     34                $ret_->add($label);
     35                $ret_->add($methodInfo['description']);
    3736
    3837                $allParameters = $methodInfo['parameters'] ?? [];
     
    4241                $parameters['header'] = array_filter($allParameters, fn($e) => ('header' === $e['in']));
    4342
    44                 $j = 25;
    4543                foreach ($parameters as $in => $thisParameters) {
    4644                    if (!$thisParameters) {
     
    8684                        }
    8785                        $params->withCell($i, 'description')->setContent($descriptionContent);
     86
    8887                        $i++;
    8988                    }
    9089
    91                     $ret_->add($j++, $params);
     90                    $ret_->add($params);
    9291                }
    9392
     
    9998                    $requestInfo->withHeadCell('head', 'example')->setContent('__Example__');
    10099
    101                     $i = 1;
    102100                    foreach ($requestBodyContent as $type => $typeArray) {
    103101                        $schema = $typeArray['schema'];
     
    144142                                ])
    145143                        ;
    146 
    147                         $i++;
    148                     }
    149 
    150                     $ret_->add($j++, $requestInfo);
     144                    }
     145
     146                    $ret_->add($requestInfo);
    151147                }
    152148
     
    158154                    $params->withHeadCell('head', 'example')->setContent('__Example__');
    159155
    160                     $i = 1;
    161156                    foreach ($methodInfo['responses'] as $code => $pa) {
    162157                        $nameContent = '';
     
    199194                        $params->withCell($i, 'description')->setContent($descriptionContent);
    200195                        $params->withCell($i, 'example')->setContent($exampleContent);
    201 
    202                         $i++;
    203                     }
    204 
    205                     $ret_->add(35, $params);
     196                    }
     197
     198                    $ret_->add($params);
    206199                }
    207200
    208                 $ret->add($i++, new Section($ret_));
     201                $ret->add($ret_);
    209202            }
    210203        }
  • plaintracker/trunk/vendor/plainware/ui-wordpress/assets/admin.css

    r3403602 r3407122  
    1313/* #pw2 td:not([role=menu]) menu > li + li { border-top: #c3c3c3 1px solid; padding-top: .25rem; margin-top: .25rem; } */
    1414#pw2 td a, #pw2 th a {text-decoration: underline;}
    15 
    1615
    1716@media (min-width: 48em) {
  • plaintracker/trunk/vendor/plainware/ui-wordpress/src/Renderer/AdminMainMenuRenderer.php

    r3403602 r3407122  
    6666            }
    6767            $i++;
    68         }
    69 
    70         $wrappers = $el->getWrappers();
    71         foreach ($wrappers as $wrapper) {
    72             $tabMenu->wrapBy($wrapper);
    7368        }
    7469
  • plaintracker/trunk/vendor/plainware/ui/assets/core.css

    r3403602 r3407122  
    206206/* #pw2 .pw-block-list > * + * {margin-top: .25em;} */
    207207
    208 /* inline list */
    209 #pw2 .pw-inline-list {list-style-type: none;}
    210 #pw2 .pw-inline-list {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center; gap: 0.5em;}
    211 #pw2 .pw-inline-flex {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: start; gap: 1rem;}
    212 #pw2 .pw-inline-flex > * { margin: 0; }
    213 #pw2 .pw-valign-top.pw-inline-list {align-items: start;}
    214 #pw2 .pw-inline-list img {display: block;}
    215 
    216208@media (min-width: 48em) {
    217209    #pw2 .pw-col-inline-flex {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: start; gap: 1rem;}
     
    433425/* #pw2 .pw-footer-pagemenu {margin: .5em 0 0 0;} */
    434426
    435 #pw2 label[for] {display: block; width: 100%; padding: 0; margin: 0;}
    436 #pw2 table label {display: block; width: 100%;}
     427/* #pw2 label[for] {display: block; width: 100%; padding: 0; margin: 0;} */
     428/* #pw2 table label {display: block; width: 100%;} */
    437429
    438430/* #pw2 label > span {display: block; padding: .5em 0;} */
    439431/* #pw2 td[style] span:not[style] {background-color: transparent;} */
     432
     433/* form */
     434#pw2 label[for] {display: block; width: 100%; padding: 0; margin: 0;}
     435/* #pw2 input[type=checkbox], #pw2 input[type=radio] {margin: 0; padding: 0;} */
     436
     437#pw2 .pw-form-row {}
     438#pw2 .pw-form-hori .pw-form-row + .pw-form-row, #pw2 .pw-form-vert .pw-form-row + .pw-form-row {margin-top: .75em;}
     439
     440@media (min-width: 48em) {
     441  #pw2 .pw-form-hori .pw-form-label-content {display: grid; grid-template-columns: 12rem 1fr; gap: 0; align-items: start;}
     442  #pw2 .pw-form-hori .pw-form-label-content > :first-child {text-align: end; margin: 0; padding: .5em; overflow: hidden;}
     443  #pw2 .pw-form-hori .pw-form-emptylabel-content {margin-inline-start: 12rem;}
     444}
     445
     446#pw2 label.pw-wrapping-label {padding: .5em 0; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center; gap: .25em;}
     447
     448#pw2 .pw-inline-list img, #pw2 .pw-inline-list input {display: block;}
     449
     450#pw2 .pw-form-inline .pw-form-body,
     451#pw2 .pw-form-inline .pw-form-label-content {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center;}
     452#pw2 .pw-form-inline .pw-form-body {gap: .5em;}
     453#pw2 .pw-form-inline .pw-form-label-content {gap: .25em;}
     454
     455#pw2 .pw-form-vert .pw-form-label-content > :first-child {margin-bottom: .25em;}
     456
     457/* block list */
     458#pw2 .pw-block-list {list-style-type: none; display: block;}
     459#pw2 .pw-block-list > div + div {margin-top: .5em;}
     460#pw2 .pw-block-list.pw-spacing-1 > div + div {margin-top: .25em;}
     461#pw2 .pw-block-list.pw-spacing-3 > div + div {margin-top: 1em;}
     462#pw2 .pw-block-list.pw-spacing-0 > div + div {margin-top: 0;}
     463
     464/* inline list */
     465#pw2 .pw-inline-list {list-style-type: none;}
     466#pw2 .pw-inline-list {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center; gap: .5em;}
     467#pw2 .pw-inline-list.pw-spacing-1 {gap: .25em;}
     468#pw2 .pw-inline-list.pw-spacing-3 {gap: 1em;}
     469#pw2 .pw-inline-list.pw-spacing-0 {gap: 0;}
     470
     471#pw2 .pw-inline-flex {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: start; gap: 1rem;}
     472#pw2 .pw-inline-flex > * { margin: 0; }
  • plaintracker/trunk/vendor/plainware/ui/boot.php

    r3403602 r3407122  
    2222    $app->onBoot(Ui::class, function ($ui) {
    2323        $ui
     24            ->renderer(Component\LabelRow::class, Renderer\LabelRowRenderer::class)
     25            ->renderer(Component\Form\Form::class, Renderer\Form\FormRenderer::class)
     26            ->renderer(Component\Form\Button::class, Renderer\Form\ButtonRenderer::class)
     27            ->renderer(Component\Form\AbstractInput::class, Renderer\Form\InputRenderer::class)
     28            ->renderer(Component\Form\TextInput::class, Renderer\Form\TextInputRenderer::class)
     29            ->renderer(Component\Form\NumberInput::class, Renderer\Form\NumberInputRenderer::class)
     30            ->renderer(Component\Form\TextareaInput::class, Renderer\Form\TextareaInputRenderer::class)
     31            ->renderer(Component\Form\PasswordInput::class, Renderer\Form\PasswordInputRenderer::class)
     32            ->renderer(Component\Form\SelectInput::class, Renderer\Form\SelectInputRenderer::class)
     33            ->renderer(Component\Form\ColorInput::class, Renderer\Form\ColorInputRenderer::class)
     34            ->renderer(Component\Form\ColorPickerInput::class, Renderer\Form\ColorPickerInputRenderer::class)
     35            ->renderer(Component\Form\CheckboxInput::class, Renderer\Form\CheckboxInputRenderer::class)
     36            ->renderer(Component\Form\CheckboxSetInput::class, Renderer\Form\CheckboxSetInputRenderer::class)
     37            ->renderer(Component\Form\RadioInput::class, Renderer\Form\RadioInputRenderer::class)
     38            ->renderer(Component\Form\RadioSetInput::class, Renderer\Form\RadioSetInputRenderer::class)
     39            ->renderer(Component\Form\DateInput::class, Renderer\Form\DateInputRenderer::class)
     40            ->renderer(Component\Form\DatePeriodInput::class, Renderer\Form\DatePeriodInputRenderer::class)
     41            ->renderer(Component\Form\TimeInput::class, Renderer\Form\TimeInputRenderer::class)
     42
     43            ->renderer(Component\Collection::class, Renderer\CollectionRenderer::class)
     44
    2445            ->renderer(Component\AbstractTag::class, Renderer\HtmlElementRenderer::class)
    2546            ->renderer(Component\Main::class, Renderer\MainRenderer::class)
    2647            // ->renderer(Component\Main::class, Renderer\PrintViewMainRendererDecorator::class)
     48            ->renderer(Component\Card::class, Renderer\CardRenderer::class)
    2749            ->renderer(Component\Link::class, Renderer\LinkRenderer::class)
    2850            ->renderer(Component\Details::class, Renderer\DetailsRenderer::class)
    2951            ->renderer(Component\Breadcrumbs::class, Renderer\BreadcrumbsRenderer::class)
    3052            ->renderer(Component\Table::class, Renderer\TableRenderer::class)
    31             ->renderer(Component\Container::class, Renderer\ContainerRenderer::class)
    3253            ->renderer(Component\Section::class, Renderer\SectionRenderer::class)
    3354            ->renderer(Component\StartEnd::class, Renderer\StartEndRenderer::class)
     
    3758            ->renderer(Component\Menu::class, Renderer\MenuRenderer::class)
    3859            ->renderer(Component\InlineList::class, Renderer\InlineListRenderer::class)
     60            ->renderer(Component\BlockList::class, Renderer\BlockListRenderer::class)
    3961            ->renderer(Component\TabMenu::class, Renderer\TabMenuRenderer::class)
    4062            ->renderer(Component\Grid::class, Renderer\GridRenderer::class)
     
    4264            ->renderer(Component\Partial::class, Renderer\PartialRenderer::class)
    4365            ->renderer(Component\TabbedMenu::class, Renderer\TabbedMenuRenderer::class)
    44             ->renderer(Component\SpacedContainer::class, Renderer\SpacedContainerRenderer::class)
    45             ->renderer(Component\Form::class, Renderer\FormRenderer::class)
    46             ->renderer(Component\Form\Button::class, Renderer\Form\ButtonRenderer::class)
    47             ->renderer(Component\Form\TextInput::class, Renderer\Form\TextInputRenderer::class)
    48             ->renderer(Component\Form\PasswordInput::class, Renderer\Form\PasswordInputRenderer::class)
    49             ->renderer(Component\Form\HiddenInput::class, Renderer\Form\HiddenInputRenderer::class)
    50             ->renderer(Component\Form\TextareaInput::class, Renderer\Form\TextareaInputRenderer::class)
    51             ->renderer(Component\Form\NumberInput::class, Renderer\Form\NumberInputRenderer::class)
    52             ->renderer(Component\Form\DateInput::class, Renderer\Form\DateInputRenderer::class)
    53             ->renderer(Component\Form\DatePeriodInput::class, Renderer\Form\DatePeriodInputRenderer::class)
    54             ->renderer(Component\Form\TimeInput::class, Renderer\Form\TimeInputRenderer::class)
    55             ->renderer(Component\Form\CheckboxInput::class, Renderer\Form\CheckboxInputRenderer::class)
    56             ->renderer(Component\Form\RadioInput::class, Renderer\Form\RadioInputRenderer::class)
    57             ->renderer(Component\Form\SelectInput::class, Renderer\Form\SelectInputRenderer::class)
    58             ->renderer(Component\Form\DateTimeInput::class, Renderer\Form\DateTimeInputRenderer::class)
    59             ->renderer(Component\Form\DateFromPeriodInput::class, Renderer\Form\DateFromPeriodInputRenderer::class)
    60             ->renderer(Component\Form\ColorPickerInput::class, Renderer\Form\ColorPickerInputRenderer::class)
    61             ->renderer(Component\Form\CheckboxSetInput::class, Renderer\Form\CheckboxSetInputRenderer::class)
    62             ->renderer(Component\Form\RadioSetInput::class, Renderer\Form\RadioSetInputRenderer::class)
    63             ->renderer(Component\Form\ContentInput::class, Renderer\Form\ContentInputRenderer::class)
    64             ->renderer(Component\Form\TimeRangeInput::class, Renderer\Form\TimeRangeInputRenderer::class)
    6566            ;
    6667    });
  • plaintracker/trunk/vendor/plainware/ui/src/Component/AbstractTag.php

    r3403602 r3407122  
    1515    {
    1616        if (null !== $content) {
    17             $thhis->append($content);
     17            $this->append($content);
    1818        }
     19    }
     20
     21    public function withTag(string $tag): self
     22    {
     23        $ret = clone $this;
     24        $ret->tag = $tag;
     25
     26        return $ret;
    1927    }
    2028
     
    3240
    3341    public function withAttr(string $name, $value): self
     42    {
     43        return $this->setAttr($name, $value);
     44    }
     45
     46    public function setAttr(string $name, $value): self
    3447    {
    3548        if ('class' === $name) {
     
    8396    }
    8497
    85     public function append($el): self
     98    final public function append($el): self
    8699    {
    87100        $this->children[] = $el;
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Breadcrumbs.php

    r3403602 r3407122  
    66{
    77    private array $items = [];
    8     private array $wrappers = [];
    98
    109    public function __construct(array $items = [])
     
    2625        return $this->items;
    2726    }
    28 
    29     public function wrapBy(HtmlElement $el): self
    30     {
    31         $this->wrappers[] = $el;
    32 
    33         return $this;
    34     }
    35 
    36     public function getWrappers(): array
    37     {
    38         return $this->wrappers;
    39     }
    4027}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/AbstractInput.php

    r3403602 r3407122  
    33namespace Plainware\Ui\Component\Form;
    44
     5use Plainware\Http\Request;
     6use Plainware\Ui\Component\HtmlElement;
    57use Plainware\Ui\Component\AbstractTag;
    6 use Plainware\Ui\Component\Form\InputInterface;
    78
    89abstract class AbstractInput extends AbstractTag implements InputInterface
    910{
    10     private string $name = '';
    11     private $value = null;
     11    private string $name;
     12    private array $errors = [];
     13    private array $helps = [];
    1214    private $label = null;
    13     private $help = '';
    14     private array $errors = [];
    15     private bool $isDisabled = false;
    16     private bool $isRequired = false;
    17     private $isRequiredLabel = null;
     15    private bool $required = false;
     16    private $requiredLabel = null;
     17    private bool $disabled = false;
    1818
    19     public function isBasic(): bool
     19    abstract public function grab(Request $request);
     20
     21    final public function __construct(string $name)
    2022    {
    21         return false;
     23        $this->setName($name);
     24    }
     25
     26    public function setName(string $v): self
     27    {
     28        $this->name = $v;
     29
     30        return $this;
    2231    }
    2332
     
    2534    {
    2635        return $this->name;
    27     }
    28 
    29     public function setName(string $name): self
    30     {
    31         $this->name = $name;
    32 
    33         return $this;
    34     }
    35 
    36     public function getValue()
    37     {
    38         return $this->value;
    39     }
    40 
    41     public function setValue($value): self
    42     {
    43         $this->value = $value;
    44 
    45         return $this;
    46     }
    47 
    48     public function getLabel()
    49     {
    50         return $this->label;
    51     }
    52 
    53     public function setLabel($label): self
    54     {
    55         $this->label = $label;
    56 
    57         return $this;
    5836    }
    5937
     
    7048    }
    7149
    72     public function setDisabled(bool $on = true): self
     50    public function addHelp($help): self
    7351    {
    74         $this->isDisabled = $on;
     52        $this->helps[] = $help;
    7553
    7654        return $this;
    7755    }
    7856
    79     public function isDisabled(): bool
     57    public function getHelps(): array
    8058    {
    81         return $this->isDisabled;
     59        return $this->helps;
    8260    }
    8361
    84     public function setRequired($isRequiredLabel = '__Required field__'): self
     62    public function setLabel($v): self
    8563    {
    86         if (false === $isRequiredLabel) {
    87             $this->isRequired = false;
    88             $this->isRequiredLabel = '';
    89         } else {
    90             $this->isRequired = true;
    91             $this->isRequiredLabel = $isRequiredLabel;
    92         }
     64        $this->label = $v;
    9365
    9466        return $this;
    9567    }
    9668
     69    public function getLabel()
     70    {
     71        return $this->label;
     72    }
     73
    9774    public function isRequired(): bool
    9875    {
    99         return $this->isRequired;
     76        return $this->required;
     77    }
     78
     79    public function setRequired($label = '__Required field__'): self
     80    {
     81        $this->required = true;
     82        $this->requiredLabel = $label;
     83
     84        return $this;
    10085    }
    10186
    10287    public function getRequiredLabel()
    10388    {
    104         return $this->isRequiredLabel;
     89        return $this->requiredLabel;
    10590    }
    10691
    107     public function setHelp($help): self
     92    public function isDisabled(): bool
    10893    {
    109         $this->help = $help;
     94        return $this->disabled;
     95    }
     96
     97    public function setDisabled(bool $v = true): self
     98    {
     99        $this->disabled = $v;
    110100
    111101        return $this;
    112102    }
    113 
    114     public function getHelp()
    115     {
    116         return $this->help;
    117     }
    118103}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/CheckboxInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class CheckboxInput extends AbstractInput implements InputInterface
     8class CheckboxInput extends AbstractInput
    109{
    11     private bool $checked = false;
     10    private bool $value = false;
     11    private string $htmlValue = '1';
    1212
    13     public function __construct()
     13    public function grab(Request $request): bool
    1414    {
    15         $this->setValue(1);
    16     }
    17 
    18     public function isBasic(): bool
    19     {
    20         return true;
    21     }
    22 
    23     public function grab(Request $request)
    24     {
    25         $ret = $request->getPostParam($this->getName()) ?? false;
     15        $postedValue = $request->getPostParam($this->getName());
     16        $ret = (null === $postedValue) ? false : true;
    2617
    2718        return $ret;
    2819    }
    2920
    30     public function setChecked(bool $checked = true): self
     21    public function setValue(bool $v): self
    3122    {
    32         $this->checked = $checked;
     23        $this->value = $v;
    3324
    3425        return $this;
    3526    }
    3627
    37     public function isChecked(): bool
     28    public function getValue(): bool
    3829    {
    39         return $this->checked;
     30        return $this->value;
     31    }
     32
     33    public function setHtmlValue(string $v): self
     34    {
     35        $this->htmlValue = $v;
     36
     37        return $this;
     38    }
     39
     40    public function getHtmlValue(): string
     41    {
     42        return $this->htmlValue;
    4043    }
    4144}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/CheckboxSetInput.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
     6use Plainware\Ui\Component\Form\CheckboxInput;
     7use Plainware\Ui\Component\Form\AbstractFieldset;
    88
    9 class CheckboxSetInput extends AbstractInput implements InputInterface
     9class CheckboxSetInput extends AbstractFieldset
    1010{
    1111    private array $options = [];
    12     private bool $isVertical = false;
    13 
    14     public function __construct(array $options)
    15     {
    16         $this->options = $options;
    17         $this->setValue([]);
    18     }
    19 
    20     public function isBasic(): bool
    21     {
    22         return false;
    23     }
    24 
    25     public function grab(Request $request)
    26     {
    27         $ret = $request->getPostParam($this->getName()) ?? [];
    28 
    29         return $ret;
    30     }
     12    private array $value = [];
    3113
    3214    public function getOptions(): array
     
    3517    }
    3618
    37     public function setVertical(bool $on = true): self
     19    public function setOptions(array $v): self
    3820    {
    39         $this->isVertical = $on;
     21        $this->options = $v;
    4022
    4123        return $this;
    4224    }
    4325
    44     public function isVertical(): bool
     26    public function grab(Request $request): array
    4527    {
    46         return $this->isVertical;
     28        $ret = $request->getPostParam($this->getName()) ?? [];
     29        $ret = array_intersect($ret, array_keys($this->options));
     30
     31        return $ret;
     32    }
     33
     34    public function setValue(array $v): self
     35    {
     36        $this->value = array_intersect($v, array_keys($this->options));
     37
     38        return $this;
     39    }
     40
     41    public function getValue(): array
     42    {
     43        return $this->value;
    4744    }
    4845}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/ColorInput.php

    r3403602 r3407122  
    33namespace Plainware\Ui\Component\Form;
    44
    5 use Plainware\Ui\Component\Form\TextInput;
    6 use Plainware\Ui\Component\Form\InputInterface;
     5use Plainware\Http\Request;
     6use Plainware\Ui\Component\Form\AbstractInput;
    77
    8 class ColorInput extends TextInput implements InputInterface
     8class ColorInput extends AbstractInput
    99{
    10     public function __construct()
     10    private string $value = '#cbe86b';
     11
     12    public function grab(Request $request): ?string
    1113    {
    12         $this->withAttr('type', 'color');
    13         $this->setValue('#cbe86b');
     14        return $request->getPostParam($this->getName());
     15    }
     16
     17    public function setValue(string $v): self
     18    {
     19        $this->value = $v;
     20
     21        return $this;
     22    }
     23
     24    public function getValue(): string
     25    {
     26        return $this->value;
    1427    }
    1528}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/DateInput.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
     6use Plainware\Ui\Component\Form\AbstractFieldset;
    87
    9 class DateInput extends AbstractInput implements InputInterface
     8class DateInput extends AbstractFieldset
    109{
    11     public function grab(Request $request)
     10    private ?\DateTimeInterface $value = null;
     11
     12    public function grab(Request $request): ?\DateTimeInterface
    1213    {
    1314        $ret = $request->getPostParam($this->getName());
     15        $ret = (null !== $ret) ? new \DateTimeImmutable($ret) : null;
    1416
    1517        return $ret;
    1618    }
     19
     20    public function setValue(?\DateTimeInterface $v): self
     21    {
     22        $this->value = $v;
     23
     24        return $this;
     25    }
     26
     27    public function getValue(): ?\DateTimeInterface
     28    {
     29        return $this->value;
     30    }
    1731}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/DatePeriodInput.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Time\DatePeriod;
    7 use Plainware\Ui\Component\Form\AbstractInput;
    8 use Plainware\Ui\Component\Form\InputInterface;
     6use Plainware\Ui\Component\Form\AbstractFieldset;
    97use Plainware\Ui\Component\Form\NumberInput;
    108use Plainware\Ui\Component\Form\SelectInput;
    119
    12 class DatePeriodInput extends AbstractInput implements InputInterface
     10class DatePeriodInput extends AbstractFieldset
    1311{
    14     private NumberInput $inputQty;
    15     private SelectInput $inputUnit;
     12    private ?NumberInput $inputQty = null;
     13    private ?SelectInput $inputUnit = null;
    1614
    1715    private const RANGE_DAY = 'day';
     
    1917    private const RANGE_MONTH = 'month';
    2018    private array $range = [self::RANGE_WEEK, 1];
    21     private int $d = 0;
    22 
    23     public function __construct()
    24     {
    25         $this->inputQty = new NumberInput();
    26         $options = ['d' => '__Day__', 'w' => '__Week__', 'm' => '__Month__'];
    27         $this->inputUnit = new SelectInput($options);
    28     }
    29 
    30     public function setValue($v): self
    31     {
    32         $qty = (int) substr($v, 0, -1);
    33         $unit = substr($v, -1);
    34 
    35         $this->inputQty->setValue($qty);
    36         $this->inputUnit->setValue($unit);
    37 
    38         return parent::setValue($v);
    39     }
    40 
    41     public function grab(Request $request)
    42     {
    43         $name = $this->getName();
    44 
    45         $retQty = $this->getInputQty()
    46             ->setName($name . '_qty')
    47             ->grab($request)
    48             ;
    49 
    50         $retUnit = $this->getInputUnit()
    51             ->setName($name . '_unit')
    52             ->grab($request)
    53             ;
    54 
    55         $ret = $retQty . $retUnit;
    56 
    57         return $ret;
    58     }
     19    // private int $d = 0;
     20    private string $value = '1w';
    5921
    6022    public function getInputQty(): NumberInput
    6123    {
     24        if (null === $this->inputQty) {
     25            $name = $this->getName();
     26            $this->inputQty = new NumberInput($name . '_qty');
     27        }
     28
    6229        return $this->inputQty;
    6330    }
     
    6532    public function getInputUnit(): SelectInput
    6633    {
     34        if (null === $this->inputUnit) {
     35            $name = $this->getName();
     36            $options = ['d' => '__Day__', 'w' => '__Week__', 'm' => '__Month__'];
     37            $this->inputUnit = (new SelectInput($name . '_unit'))->setOptions($options);
     38        }
     39
    6740        return $this->inputUnit;
     41    }
     42
     43    public function setValue(string $v): self
     44    {
     45        $this->value = $v;
     46
     47        $qty = (int) substr($v, 0, -1);
     48        $unit = substr($v, -1);
     49
     50        $this->getInputQty()->setValue($qty);
     51        $this->getInputUnit()->setValue($unit);
     52
     53        return $this;
     54    }
     55
     56    public function getValue(): string
     57    {
     58        return $this->value;
     59    }
     60
     61    public function grab(Request $request)
     62    {
     63        $retQty = $this->getInputQty()->grab($request);
     64        $retUnit = $this->getInputUnit()->grab($request);
     65
     66        $ret = $retQty . $retUnit;
     67
     68        return $ret;
    6869    }
    6970
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/InputInterface.php

    r3403602 r3407122  
    77interface InputInterface
    88{
    9     public function isBasic(): bool;
    10     public function isRequired(): bool;
    11     public function setRequired($isRequiredLabel = '__Required field__'): self;
    12     public function getRequiredLabel();
     9    public function setName(string $name): self;
    1310    public function getName(): string;
    14     public function setName(string $name): self;
    15     public function getLabel();
    16     public function setLabel($label): self;
    17     public function getValue();
    18     public function setValue($value): self;
    1911    public function grab(Request $request);
    2012    public function addError($error): self;
    2113    public function getErrors(): array;
    22     public function setHelp($help): self;
    23     public function getHelp();
     14    public function addHelp($help): self;
     15    public function getHelps(): array;
     16    public function setLabel($v): self;
     17    public function getLabel();
     18    public function isRequired(): bool;
     19    public function setRequired($label = '__Required field__'): self;
     20    public function isDisabled(): bool;
     21    public function setDisabled(bool $v = true): self;
    2422}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/NumberInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class NumberInput extends AbstractInput implements InputInterface
     8class NumberInput extends AbstractInput
    109{
     10    private ?int $value = null;
    1111    private float $min = 1;
    1212    private float $max = 99;
    1313    private float $step = 1;
    1414
    15     public function isBasic(): bool
     15    public function grab(Request $request): ?int
    1616    {
    17         return true;
     17        return (int) $request->getPostParam($this->getName());
    1818    }
    1919
    20     public function grab(Request $request)
     20    public function setValue(int $v): self
    2121    {
    22         $ret = $request->getPostParam($this->getName());
     22        $this->value = $v;
    2323
    24         return $ret;
     24        return $this;
     25    }
     26
     27    public function getValue(): ?int
     28    {
     29        return $this->value;
    2530    }
    2631
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/PasswordInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class PasswordInput extends AbstractInput implements InputInterface
     8class PasswordInput extends AbstractInput
    109{
    11     public function isBasic(): bool
     10    private string $value = '';
     11
     12    public function grab(Request $request): ?string
    1213    {
    13         return true;
     14        return $request->getPostParam($this->getName());
    1415    }
    1516
    16     public function grab(Request $request)
     17    public function setValue(string $v): self
    1718    {
    18         $ret = $request->getPostParam($this->getName());
     19        $this->value = $v;
    1920
    20         return $ret;
     21        return $this;
     22    }
     23
     24    public function getValue(): ?string
     25    {
     26        return $this->value;
    2127    }
    2228}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/RadioInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class RadioInput extends AbstractInput implements InputInterface
     8class RadioInput extends AbstractInput
    109{
    11     private bool $checked = false;
     10    private bool $value = false;
     11    private string $htmlValue = '1';
    1212
    13     public function isBasic(): bool
     13    public function grab(Request $request): bool
    1414    {
    15         return true;
    16     }
    17 
    18     public function grab(Request $request)
    19     {
    20         $ret = $request->getPostParam($this->getName()) ?? false;
     15        $postedValue = $request->getPostParam($this->getName());
     16        $ret = ($this->htmlValue === $postedValue) ? true : false;
    2117
    2218        return $ret;
    2319    }
    2420
    25     public function setChecked(bool $checked = true): self
     21    public function setValue(bool $v): self
    2622    {
    27         $this->checked = $checked;
     23        $this->value = $v;
    2824
    2925        return $this;
    3026    }
    3127
    32     public function isChecked(): bool
     28    public function getValue(): bool
    3329    {
    34         return $this->checked;
     30        return $this->value;
     31    }
     32
     33    public function setHtmlValue(string $v): self
     34    {
     35        $this->htmlValue = $v;
     36
     37        return $this;
     38    }
     39
     40    public function getHtmlValue(): string
     41    {
     42        return $this->htmlValue;
    3543    }
    3644}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/RadioSetInput.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
     6use Plainware\Ui\Component\Form\CheckboxInput;
     7use Plainware\Ui\Component\Form\AbstractFieldset;
    88
    9 class RadioSetInput extends AbstractInput implements InputInterface
     9class RadioSetInput extends AbstractFieldset
    1010{
    11     private $options = [];
    12     private array $optionAttr = [];
    13 
    14     public function __construct(array $options)
    15     {
    16         $this->options = $options;
    17         $this->setValue([]);
    18     }
    19 
    20     public function isBasic(): bool
    21     {
    22         return false;
    23     }
    24 
    25     public function grab(Request $request)
    26     {
    27         $ret = null;
    28         $options = $this->getOptions();
    29 
    30         if (!$options) {
    31             return $ret;
    32         }
    33 
    34         if (1 === count($options)) {
    35             $ret = current(array_keys($options));
    36         } else {
    37             $ret = $request->getPostParam($this->getName()) ?? null;
    38             if (!isset($options[$ret])) {
    39                 $ret = null;
    40             }
    41         }
    42 
    43         return $ret;
    44     }
     11    private array $options = [];
     12    private ?string $value = null;
    4513
    4614    public function getOptions(): array
     
    4917    }
    5018
    51     public function withOptionAttr($optionName, string $name, $value): self
     19    public function setOptions(array $v): self
    5220    {
    53         $attr = $this->optionAttr[$optionName] ?? [];
    54 
    55         if ('class' === $name) {
    56             if (!isset($attr[$name])) {
    57                 $attr[$name] = [];
    58             }
    59             if (!is_array($attr[$name])) {
    60                 $attr[$name] = [$attr[$name] => $attr[$name]];
    61             }
    62             $attr[$name][$value] = $value;
    63         } else {
    64             $attr[$name] = $value;
    65         }
    66         $this->optionAttr[$optionName] = $attr;
     21        $this->options = $v;
    6722
    6823        return $this;
    6924    }
    7025
    71     public function getOptionAttr(string $optionName, string $name = '')
     26    public function grab(Request $request): ?string
    7227    {
    73         return strlen($name) ? ($this->optionAttr[$optionName][$name] ?? null) : ($this->optionAttr[$optionName] ?? []);
     28        $ret = $request->getPostParam($this->getName());
     29        if (!array_key_exists($ret, $this->options)) {
     30            $ret = null;
     31        }
     32
     33        return $ret;
     34    }
     35
     36    public function setValue(?string $v): self
     37    {
     38        $this->value = array_key_exists($v, $this->options) ? $v : null;
     39
     40        return $this;
     41    }
     42
     43    public function getValue(): ?string
     44    {
     45        return $this->value;
    7446    }
    7547}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/SelectInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class SelectInput extends AbstractInput implements InputInterface
     8class SelectInput extends AbstractInput
    109{
    11     private $options = [];
     10    private ?string $value = '';
     11    private array $options = [];
    1212
    13     public function __construct(array $options)
     13    public function setOptions(array $options): self
    1414    {
    1515        $this->options = $options;
     16
     17        return $this;
    1618    }
    1719
    18     public function isBasic(): bool
     20    public function grab(Request $request): ?string
    1921    {
    20         return true;
     22        $ret = $request->getPostParam($this->getName());
     23        $this->setValue($ret);
     24
     25        return $ret;
    2126    }
    2227
    23     public function grab(Request $request)
     28    public function setValue(?string $v): self
    2429    {
    25         $ret = null;
    26         $options = $this->getOptions();
     30        $this->value = $v;
    2731
    28         if (!$options) {
    29             return $ret;
    30         }
     32        return $this;
     33    }
    3134
    32         if (1 === count($options)) {
    33             $ret = current(array_keys($options));
    34         } else {
    35             $ret = $request->getPostParam($this->getName()) ?? null;
    36             if (!isset($options[$ret])) {
    37                 $ret = null;
    38             }
    39         }
    40 
    41         return $ret;
     35    public function getValue(): ?string
     36    {
     37        return $this->value;
    4238    }
    4339
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/TextInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class TextInput extends AbstractInput implements InputInterface
     8class TextInput extends AbstractInput
    109{
    11     public function isBasic(): bool
     10    private string $value = '';
     11
     12    public function grab(Request $request): ?string
    1213    {
    13         return true;
     14        return $request->getPostParam($this->getName());
    1415    }
    1516
    16     public function grab(Request $request)
     17    public function setValue(string $v): self
    1718    {
    18         $ret = $request->getPostParam($this->getName());
     19        $this->value = $v;
    1920
    20         return $ret;
     21        return $this;
     22    }
     23
     24    public function getValue(): string
     25    {
     26        return $this->value;
    2127    }
    2228}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/TextareaInput.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
    87
    9 class TextareaInput extends AbstractInput implements InputInterface
     8class TextareaInput extends AbstractInput
    109{
    11     public function isBasic(): bool
     10    private string $value = '';
     11
     12    public function grab(Request $request): ?string
    1213    {
    13         return true;
     14        return $request->getPostParam($this->getName());
    1415    }
    1516
    16     public function grab(Request $request)
     17    public function setValue(string $v): self
    1718    {
    18         $ret = $request->getPostParam($this->getName());
     19        $this->value = $v;
    1920
    20         return $ret;
     21        return $this;
     22    }
     23
     24    public function getValue(): string
     25    {
     26        return $this->value;
    2127    }
    2228}
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Form/TimeInput.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\Form\AbstractInput;
    7 use Plainware\Ui\Component\Form\InputInterface;
     6use Plainware\Ui\Component\Form\AbstractFieldset;
    87
    9 class TimeInput extends AbstractInput implements InputInterface
     8class TimeInput extends AbstractFieldset
    109{
     10    private int $value = 0;
    1111    private int $step = 1;
    1212
    13     public function grab(Request $request)
     13    public function grab(Request $request): int
    1414    {
    1515        $name = $this->getName();
     
    1919        $retH = $request->getPostParam($nameH);
    2020        $retM = $request->getPostParam($nameM);
     21
    2122        $ret = ((int) $retH) * 60 * 60 + ((int) $retM) * 60;
    2223
    2324        return $ret;
     25    }
     26
     27    public function setValue(int $v): self
     28    {
     29        $this->value = $v;
     30
     31        return $this;
     32    }
     33
     34    public function getValue(): int
     35    {
     36        return $this->value;
    2437    }
    2538
  • plaintracker/trunk/vendor/plainware/ui/src/Component/HtmlElement.php

    r3403602 r3407122  
    33namespace Plainware\Ui\Component;
    44
    5 final class HtmlElement extends AbstractTag
     5class HtmlElement extends AbstractTag
    66{
    77    public function __construct(string $tag, ...$children)
  • plaintracker/trunk/vendor/plainware/ui/src/Component/InlineList.php

    r3403602 r3407122  
    66{
    77    private array $items = [];
     8    private int $spacing = 2;
    89    private bool $separateWithComma = false;
    910    private bool $separateWithMiddot = false;
     
    1213    {
    1314        $this->items = $items;
     15    }
     16
     17    public function setSpacing(int $v): self
     18    {
     19        if ($v < 0) {
     20            $v = 0;
     21        }
     22        if ($v > 3) {
     23            $v = 3;
     24        }
     25        $this->spacing = $v;
     26
     27        return $this;
     28    }
     29
     30    public function getSpacing(): int
     31    {
     32        return $this->spacing;
    1433    }
    1534
  • plaintracker/trunk/vendor/plainware/ui/src/Component/Menu.php

    r3403602 r3407122  
    33namespace Plainware\Ui\Component;
    44
    5 use Plainware\Ui\Component\Link;
    6 use Plainware\Ui\Component\Container;
     5class Menu
     6{
     7    private array $items = [];
     8    private bool $vertical = false;
    79
    8 class Menu extends Container
    9 {
    10     private bool $isVertical = false;
    11     private $currentSlug = null;
    12 
    13     public function addLink(int $order, string $to, array $params = [])
     10    public function __construct(array $items = [])
    1411    {
    15         $link = new Link($to, $params);
    16 
    17         return $this->add($order, $link);
     12        foreach ($items as $item) {
     13            $this->add($item);
     14        }
    1815    }
    1916
    20     public function setCurrentSlug($currentSlug): self
     17    public function add($item)
    2118    {
    22         $this->currentSlug = $currentSlug;
     19        return $this->addWithOrder($item, 50);
     20    }
     21
     22    public function addWithOrder($item, int $weight): self
     23    {
     24        $this->items[] = [$weight, $item];
    2325
    2426        return $this;
    2527    }
    2628
    27     public function getCurrentSlug()
     29    public function getItems(): array
    2830    {
    29         return $this->currentSlug;
    30     }
     31        $ret = $this->items;
     32        usort($ret, fn($a, $b) => ($a[0] - $b[0]));
     33        $ret = array_column($ret, 1);
    3134
    32     public function setVertical(bool $on = true): self
    33     {
    34         $this->isVertical = $on;
    35 
    36         return $this;
     35        return $ret;
    3736    }
    3837
    3938    public function isVertical(): bool
    4039    {
    41         return $this->isVertical;
     40        return $this->vertical;
     41    }
     42
     43    public function setVertical(bool $v = true): self
     44    {
     45        $this->vertical = $v;
     46
     47        return $this;
    4248    }
    4349}
  • plaintracker/trunk/vendor/plainware/ui/src/Middleware/PageLayoutMiddleware.php

    r3403602 r3407122  
    1010use Plainware\Ui\Ui;
    1111use Plainware\Ui\PageMap;
    12 use Plainware\Ui\Component\SpacedContainer;
     12use Plainware\Ui\Component\BlockList;
    1313use Plainware\Ui\Component\Link;
    1414use Plainware\Ui\Component\Section;
     
    5454
    5555        if ($errorMessages or $messages) {
    56             $v = new SpacedContainer();
     56            $v = (new BlockList())->setSpacing(1);
    5757            foreach ($errorMessages as $msg) {
    5858                $msg = (new FlashMessage($msg))->setError();
     
    7878        $sections = array_column($sections, 1);
    7979
    80         $content = new SpacedContainer();
     80        $content = (new BlockList())->setSpacing(3);
    8181        foreach ($sections as $k => $v) {
    8282            $content->add($v);
     
    131131            $ret_ = new MainMenu();
    132132            foreach ($items_ as $item) {
    133                 $ret_->add(50, $item);
     133                $ret_->add($item);
    134134            }
    135135            $ret_->setCurrentPath($path);
     
    303303                $ret_ = new Menu();
    304304                foreach ($items_ as $item) {
    305                     $ret_->add(50, $item);
     305                    $ret_->add($item);
    306306                }
    307307                $ret_ = $this->ui->render($ret_, $request);
     
    322322                $ret_ = new Menu();
    323323                foreach ($items_ as $item) {
    324                     $ret_->add(50, $item);
     324                    $ret_->add($item);
    325325                }
    326326                $ret_ = $this->ui->render($ret_, $tabRootRequest);
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/BreadcrumbsRenderer.php

    r3403602 r3407122  
    1919
    2020        $ret = new Menu();
    21         $i_ = 1;
    2221        foreach ($items as $item) {
    2322            if ($item instanceof Link) {
    2423                $item->prependIcon('&larr;');
    2524            }
    26             $ret->add($i_++, $item);
    27         }
    28 
    29         $wrappers = $el->getWrappers();
    30         foreach (array_reverse($wrappers) as $wrapper) {
    31             $ret = $wrapper->append($ret);
     25            $ret->add($item);
    3226        }
    3327
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/ButtonRenderer.php

    r3403602 r3407122  
    66use Plainware\Ui\Component\HtmlElement;
    77use Plainware\Ui\Component\Form\Button;
    8 use Plainware\Ui\Ui;
    98
    109class ButtonRenderer
    1110{
    12     public $ui = Ui::class;
    13 
    1411    public function __invoke(Button $el, Request $request)
    1512    {
    16         $name = $request->getParamName($el->getName());
     13        $name = $el->getName();
    1714
    1815        $isDanger = $el->isDanger();
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/CheckboxInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Ui;
     6use Plainware\Ui\Component\Form\CheckboxInput;
    77use Plainware\Ui\Component\HtmlElement;
    8 use Plainware\Ui\Component\Form\CheckboxInput;
     8use Plainware\Ui\Component\InlineList;
    99
    10 class CheckboxInputRenderer
     10final class CheckboxInputRenderer
    1111{
    12     public $ui = Ui::class;
     12    private static $htmlId = 1;
    1313
    14     public function __invoke(CheckboxInput $el, Request $request)
     14    public function __invoke(CheckboxInput $el, Request $request, callable $next)
    1515    {
    16         // $name = $el->getName();
    17         $name = $request->getParamName($el->getName());
     16        $el = $el
     17            ->withTag('input')
     18            ->withAttr('type', 'checkbox')
     19            ->withAttr('value', $el->getHtmlValue())
     20            ;
    1821
    19         $value = (string) $el->getValue();
    20         $isChecked = $el->isChecked();
    21         $isRequired = $el->isRequired();
    22 
    23         $attr = $el->getAttr();
    24 
    25         $ret = new HtmlElement('input');
    26         $ret->withAttr('type', 'checkbox');
    27         $ret->withAttr('name', $name);
    28         $ret->withAttr('value', $value);
    29         if ($isChecked) {
    30             $ret->withAttr('checked', true);
    31         }
    32         if ($isRequired) {
    33             $ret->withAttr('required', true);
     22        $val = $el->getValue();
     23        if ($val) {
     24            $el = $el->withAttr('checked', true);
    3425        }
    3526
    36         foreach ($attr as $k_ => $v_) {
    37             $ret->withAttr($k_, $v_);
     27        $label = $el->getLabel();
     28        if (null !== $label) {
     29            $htmlId = $el->getAttr('id');
     30            if (null === $htmlId) {
     31                $htmlId = 'pw-checkbox-' . static::$htmlId++;
     32                $el->withAttr('id', $htmlId);
     33            }
    3834        }
    3935
    40     // wrap it
    41         $label = $el->getLabel();
    42         if (null === $label) {
    43             return $ret;
     36        $ret = $next($el, $request);
     37
     38        if (null !== $label) {
     39            $ret = (new HtmlElement('label'))
     40                ->withAttr('class', 'pw-wrapping-label')
     41                ->append($ret)
     42                ->append(new HtmlElement('span', $label))
     43                ;
    4444        }
    45 
    46         if ('' !== $label) {
    47             $ret = (new HtmlElement('span'))
    48                 ->withAttr('class', 'pw-inline-list')
    49                 ->append($ret)
    50                 ;
    51             $ret->append(new HtmlElement('span', $label));
    52         }
    53 
    54         $ret = (new HtmlElement('label'))->append($ret);
    5545
    5646        return $ret;
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/CheckboxSetInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Ui\Component\HtmlElement;
     6use Plainware\Ui\Component\InlineList;
    67use Plainware\Ui\Component\Form\CheckboxSetInput;
    78use Plainware\Ui\Component\Form\CheckboxInput;
    89
    9 class CheckboxSetInputRenderer
     10final class CheckboxSetInputRenderer
    1011{
    1112    public function __invoke(CheckboxSetInput $el)
     
    1314        $name = $el->getName();
    1415        $value = $el->getValue();
    15         $isVertical = $el->isVertical();
    1616
    17         if ($isVertical) {
    18             $ret = new HtmlElement('div');
    19         } else {
    20             $ret = new HtmlElement('span');
    21             $ret->withAttr('class', 'pw-inline-list');
    22         }
     17        $ret = (new InlineList())
     18            ->setSpacing(3)
     19            ;
    2320
    2421        $options = $el->getOptions();
    25         foreach ($options as $k => $v) {
    26             $input = new CheckboxInput();
    27             $input->setName($name . '[]');
    28             $input->setValue($k);
    29             $input->setLabel($v);
    30 
    31             $checked = in_array($k, $value) ? true : false;
    32             $input->setChecked($checked);
    33 
    34             if ($isVertical) {
    35                 $ret_ = new HtmlElement('div', $input);
    36             } else {
    37                 $ret_ = new HtmlElement('span', $input);
     22        foreach ($options as $k => $label) {
     23            $one = (new CheckboxInput($name . '[]'))
     24                ->setLabel($label)
     25                ->setHtmlValue($k)
     26                ;
     27            if (in_array($k, $value)) {
     28                $one->setValue(true);
    3829            }
    39 
    40             $ret->append($ret_);
     30            $ret->add($one);
    4131        }
    4232
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/DateInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
     6use Plainware\DateTime\TimeFactory;
    67use Plainware\DateTime\DateTimeFormatter;
     8use Plainware\Ui\Component\HtmlElement;
    79use Plainware\Ui\Component\Form\Button;
     10use Plainware\Ui\Component\Form\TextInput;
    811use Plainware\Ui\Component\Form\DateInput;
    9 use Plainware\Ui\HtmlHelper;
    1012use Plainware\Ui\Ui;
    1113
     
    1315{
    1416    public $dtf = DateTimeFormatter::class;
     17    public $timeFactory = TimeFactory::class;
    1518    public $ui = Ui::class;
    16 
    17     public function __invoke(DateInput $el, Request $request): string
     19    private int $htmlId = 1;
     20
     21    public function __invoke(DateInput $el, Request $request)
    1822    {
    19         $name = $request->getParamName($el->getName());
    20         $value = $el->getValue();
    21 
    22 
    23         if (null === $value) {
    24             $value = '';
    25         }
    26         if ($value instanceof \DateTimeInterface) {
    27             $value = $value->format('Ymd');
    28         }
    29         if (strlen($value) < 8) {
    30             $value = '';
    31         }
    32 
    33         $nameY = $name . '_y';
    34         $nameM = $name . '_m';
    35         $nameD = $name . '_d';
    36 
    37         $dt = strlen($value) ? new \DateTimeImmutable($value) : new \DateTimeImmutable();
    38         $value = $dt->format('Ymd');
    39 
    40         $attr = [];
    41         $attr['type'] = 'text';
    42         $attr['name'] = $name;
    43         $attr['value'] = $value;
    44         $attr['title'] = $this->dtf->formatDateFull($dt);
    45         $attr['data-pw-input-date'] = true;
    46 
    47         $ret = [];
    48         $ret[] = '<input';
    49         if ($attr) {
    50             $ret[] = ' ' . HtmlHelper::attr($attr);
    51         }
    52         $ret[] = '>';
    53 
    54         $ret = join('', $ret);
    55 
    56         $ret = $this->renderStyle($name) . $ret . $this->renderJs($name, $value, $request);
     23        $pwHtmlId = 'dateinput-' . $this->htmlId++;
     24
     25        $name = $el->getName();
     26        $value = $el->getValue() ?? $this->timeFactory->now();
     27
     28        $htmlValue = $value ? $value->format('Ymd') : '';
     29
     30        $ret = (new TextInput($name))
     31            ->setValue($htmlValue)
     32            ->withAttr('data-pw-input-date', true)
     33            ->withAttr('data-pw-id', $pwHtmlId)
     34            ;
     35
     36        $ret = (new HtmlElement(''))
     37            ->append($this->renderStyle())
     38            ->append($ret)
     39            ->append($this->renderJs($pwHtmlId, $value, $request))
     40            ;
    5741
    5842        return $ret;
    5943    }
    6044
    61     public function renderStyle($inputName)
     45    private function renderStyle()
    6246    {
    6347        static $alreadyShown = false;
     
    7963    }
    8064
    81     public function renderJs($inputName, $inputValue, Request $request)
     65    private function renderJs($pwHtmlId, $inputValue, Request $request)
    8266    {
    8367        // static $alreadyShown = false;
     
    147131}
    148132
    149 doInput(document.querySelector('input[name="<?php echo esc_attr($inputName); ?>"]'));
     133doInput(document.querySelector('input[data-pw-id="<?php echo esc_attr($pwHtmlId); ?>"]'));
    150134// document.querySelectorAll('[data-pw-input-date]').forEach(doInput);
    151135
     
    191175    const jsDate = new Date( d.y, d.m - 1, d.d );
    192176    let dayOfWeek = jsDate.getDay();
    193     if( 0 == dayOfWeek ) dayOfWeek = 7;
     177    // if( 0 == dayOfWeek ) dayOfWeek = 7;
    194178    ret = wkdLabel[ dayOfWeek ] + ', ' + ret;
    195179
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/DatePeriodInputRenderer.php

    r3403602 r3407122  
    1010    public function __invoke(DatePeriodInput $el)
    1111    {
    12         $name = $el->getName();
    13 
    14         $el->getInputQty()->setName($name . '_qty');
    15         $el->getInputUnit()->setName($name . '_unit');
    16 
    17         $ret = new InlineList();
    18         $ret->add($el->getInputQty());
    19         $ret->add($el->getInputUnit());
     12        $ret = (new InlineList())
     13            ->add($el->getInputQty())
     14            ->add($el->getInputUnit())
     15            ;
    2016
    2117        return $ret;
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/NumberInputRenderer.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\NumberInput;
    7 use Plainware\Ui\HtmlHelper;
    8 use Plainware\Ui\Ui;
    97
    10 class NumberInputRenderer
     8final class NumberInputRenderer
    119{
    12     public $ui = Ui::class;
     10    public function __invoke(NumberInput $el, Request $request, callable $next)
     11    {
     12        $el = $el
     13            ->withTag('input')
     14            ->withAttr('type', 'number')
     15            ->withAttr('value', (string) $el->getValue())
     16            ->withAttr('min', $el->getMin())
     17            ->withAttr('max', $el->getMax())
     18            ->withAttr('step', $el->getStep())
     19            ->withAttr('size', 6)
     20            ;
    1321
    14     public function __invoke(NumberInput $el, Request $request): string
    15     {
    16         $ret = [];
    17 
    18         $value = (string) $el->getValue();
    19 
    20         $attr['type'] = 'number';
    21 
    22         $name = $request->getParamName($el->getName());
    23         $attr['name'] = $name;
    24 
    25         if ($el->isDisabled()) {
    26             $attr['disabled'] = true;
    27         }
    28         if ($el->isRequired()) {
    29             $attr['required'] = true;
    30         }
    31 
    32         $attr['value'] = $value;
    33         $attr['min'] = $el->getMin();
    34         $attr['max'] = $el->getMax();
    35         $attr['step'] = $el->getStep();
    36         $attr['size'] = 6;
    37 
    38         $ret[] = '<input';
    39         if ($attr) {
    40             $ret[] = ' ' . HtmlHelper::attr($attr);
    41         }
    42         $ret[] = '>';
    43 
    44         $ret = join('', $ret);
    45 
    46         return $ret;
     22        return $next($el, $request);
    4723    }
    4824}
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/PasswordInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\HtmlElement;
    76use Plainware\Ui\Component\Form\PasswordInput;
    87
    9 class PasswordInputRenderer
     8final class PasswordInputRenderer
    109{
    11     public function __invoke(PasswordInput $el, Request $request)
     10    public function __invoke(PasswordInput $el, Request $request, callable $next)
    1211    {
    13         $value = (string) $el->getValue();
    14         $name = $request->getParamName($el->getName());
    15         $attr = $el->getAttr();
     12        $el = $el
     13            ->withTag('input')
     14            ->withAttr('type', 'password')
     15            // ->withAttr('value', $el->getValue())
     16            ;
    1617
    17         $ret = new HtmlElement('input');
    18         foreach ($attr as $k => $v) {
    19             $ret->withAttr($k, $v);
    20         }
    21         $ret->withAttr('type', 'password');
    22         $ret->withAttr('name', $name);
    23         if ($el->isDisabled()) {
    24             $ret->withAttr('disabled', true);
    25         }
    26         if ($el->isRequired()) {
    27             $ret->withAttr('required', true);
    28         }
    29         $ret->withAttr('value', $value);
    30 
    31         return $ret;
     18        return $next($el, $request);
    3219    }
    3320}
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/RadioInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
     6use Plainware\Ui\Component\Form\RadioInput;
    67use Plainware\Ui\Component\HtmlElement;
    7 use Plainware\Ui\Component\Form\RadioInput;
     8use Plainware\Ui\Component\InlineList;
    89
    9 class RadioInputRenderer
     10final class RadioInputRenderer
    1011{
    11     public function __invoke(RadioInput $el, Request $request)
     12    private static $htmlId = 1;
     13
     14    public function __invoke(RadioInput $el, Request $request, callable $next)
    1215    {
    13         // $name = $el->getName();
    14         $name = $request->getParamName($el->getName());
     16        $el = $el
     17            ->withTag('input')
     18            ->withAttr('type', 'radio')
     19            ->withAttr('value', $el->getHtmlValue())
     20            ;
    1521
    16         $value = (string) $el->getValue();
    17         $isChecked = $el->isChecked();
    18 
    19         $ret = new HtmlElement('input');
    20         $ret->withAttr('type', 'radio');
    21         $ret->withAttr('name', $name);
    22         $ret->withAttr('value', $value);
    23         if ($isChecked) {
    24             $ret->withAttr('checked', true);
     22        $val = $el->getValue();
     23        if ($val) {
     24            $el = $el->withAttr('checked', true);
    2525        }
    2626
    27     // wrap it
    2827        $label = $el->getLabel();
    29         if (!$label) {
    30             return $ret;
     28        if (null !== $label) {
     29            $htmlId = $el->getAttr('id');
     30            if (null === $htmlId) {
     31                $htmlId = 'pw-radio-' . static::$htmlId++;
     32                $el->withAttr('id', $htmlId);
     33            }
    3134        }
    3235
    33         $input = $ret;
     36        $ret = $next($el, $request);
    3437
    35         $ret = (new HtmlElement('span'))->withAttr('class', 'pw-inline-list');
    36         $ret->append($input);
    37         $ret->append(new HtmlElement('span', $label));
    38 
    39         $ret = (new HtmlElement('label'))->append($ret);
     38        if (null !== $label) {
     39            $ret = (new HtmlElement('label'))
     40                ->withAttr('class', 'pw-wrapping-label')
     41                ->append($ret)
     42                ->append(new HtmlElement('span', $label))
     43                ;
     44        }
    4045
    4146        return $ret;
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/RadioSetInputRenderer.php

    r3403602 r3407122  
    33namespace Plainware\Ui\Renderer\Form;
    44
     5use Plainware\Ui\Component\HtmlElement;
    56use Plainware\Ui\Component\InlineList;
    67use Plainware\Ui\Component\Form\RadioSetInput;
    78use Plainware\Ui\Component\Form\RadioInput;
    89
    9 class RadioSetInputRenderer
     10final class RadioSetInputRenderer
    1011{
    1112    public function __invoke(RadioSetInput $el)
     
    1415        $value = $el->getValue();
    1516
    16         $ret = new InlineList();
     17        $ret = (new InlineList())
     18            ->setSpacing(3)
     19            ;
     20
    1721        $options = $el->getOptions();
    18 
    19         if (count($options) > 1) {
    20             foreach ($options as $k => $v) {
    21                 $input = new RadioInput();
    22                 $input->setName($name);
    23                 $input->setValue($k);
    24                 $input->setLabel($v);
    25 
    26                 $checked = ($k == $value) ? true : false;
    27                 $input->setChecked($checked);
    28 
    29                 $ret->add($input);
     22        foreach ($options as $k => $label) {
     23            $one = (new RadioInput($name))
     24                ->setLabel($label)
     25                ->setHtmlValue($k)
     26                ;
     27            if ($k == $value) {
     28                $one->setValue(true);
    3029            }
    31         } elseif (1 === count($options)) {
    32             $v = current($options);
    33             $ret->add($v);
    34         } else {
    35             $ret->add('?');
     30            $ret->add($one);
    3631        }
    3732
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/SelectInputRenderer.php

    r3403602 r3407122  
    77use Plainware\Ui\Component\HtmlElement;
    88
    9 class SelectInputRenderer
     9final class SelectInputRenderer
    1010{
    11     public function __invoke(SelectInput $el, Request $request)
     11    public function __invoke(SelectInput $el, Request $request, callable $next)
    1212    {
    13         $name = $request->getParamName($el->getName());
     13        $el = $el
     14            ->withTag('select')
     15            ;
    1416
    15         $value = (string) $el->getValue();
     17        $value = $el->getValue();
     18
    1619        $options = $el->getOptions();
     20        foreach ($options as $k => $v) {
     21            $option = (new HtmlElement('option', $v))
     22                ->withAttr('value', $k)
     23                ;
     24            if ($value == $k) {
     25                $option->withAttr('selected', true);
     26            }
    1727
    18         $ret = new HtmlElement('select');
    19         $ret->withAttr('name', $name);
    20         if ($el->isDisabled()) {
    21             $ret->withAttr('disabled', true);
    22         }
    23         if ($el->isRequired()) {
    24             $ret->withAttr('required', true);
     28            $el->append($option);
    2529        }
    2630
    27         foreach ($options as $k => $v) {
    28             $ret_ = new HtmlElement('option', $v);
    29             $ret_->withAttr('value', $k);
    30             if ($value == $k) {
    31                 $ret_->withAttr('selected', true);
    32             }
    33             $ret->append($ret_);
    34         }
    35 
    36         return $ret;
     31        return $next($el, $request);
    3732    }
    3833}
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/TextInputRenderer.php

    r3403602 r3407122  
    44
    55use Plainware\Http\Request;
    6 use Plainware\Ui\Component\HtmlElement;
    76use Plainware\Ui\Component\Form\TextInput;
    8 use Plainware\Ui\Ui;
    97
    10 class TextInputRenderer
     8final class TextInputRenderer
    119{
    12     public $ui = Ui::class;
     10    public function __invoke(TextInput $el, Request $request, callable $next)
     11    {
     12        $el = $el
     13            ->withTag('input')
     14            ->withAttr('type', 'text')
     15            ->withAttr('value', $el->getValue())
     16            ;
    1317
    14     public function __invoke(TextInput $el, Request $request)
    15     {
    16         $value = (string) $el->getValue();
    17         $name = $request->getParamName($el->getName());
    18         $attr = $el->getAttr();
    19 
    20         $ret = new HtmlElement('input');
    21         foreach ($attr as $k => $v) {
    22             $ret->withAttr($k, $v);
    23         }
    24 
    25         if (!$ret->getAttr('type')) {
    26             $ret->withAttr('type', 'text');
    27         }
    28 
    29         $ret->withAttr('name', $name);
    30         if ($el->isDisabled()) {
    31             $ret->withAttr('disabled', true);
    32         }
    33         if ($el->isRequired()) {
    34             $ret->withAttr('required', true);
    35         }
    36         $ret->withAttr('value', $value);
    37 
    38         return $ret;
     18        return $next($el, $request);
    3919    }
    4020}
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/TextareaInputRenderer.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Form\TextareaInput;
    7 use Plainware\Ui\HtmlHelper;
    8 use Plainware\Ui\Ui;
    97
    10 class TextareaInputRenderer
     8final class TextareaInputRenderer
    119{
    12     public $ui = Ui::class;
     10    public function __invoke(TextareaInput $el, Request $request, callable $next)
     11    {
     12        $value = $el->getValue();
     13        $value = esc_textarea($value);
    1314
    14     public function __invoke(TextareaInput $el, Request $request): string
    15     {
    16         $ret = [];
     15        $el = $el
     16            ->withTag('textarea')
     17            ->setContent($value)
     18            ;
    1719
    18         $value = (string) $el->getValue();
    19 
    20         $name = $request->getParamName($el->getName());
    21         $attr['name'] = $name;
    22 
    23         if ($el->isDisabled()) {
    24             $attr['disabled'] = true;
    25         }
    26         if ($el->isRequired()) {
    27             $attr['required'] = true;
    28         }
    29 
    30         $ret[] = '<textarea';
    31         if ($attr) {
    32             $ret[] = ' ' . HtmlHelper::attr($attr);
    33         }
    34         $ret[] = '>';
    35 
    36         $ret[] = esc_textarea($value);
    37 
    38         $ret[] = '</textarea>';
    39 
    40         $ret = join('', $ret);
    41 
    42         return $ret;
     20        return $next($el, $request);
    4321    }
    4422}
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/Form/TimeInputRenderer.php

    r3403602 r3407122  
    66use Plainware\Ui\Component\Form\TimeInput;
    77use Plainware\Ui\Component\Form\SelectInput;
    8 use Plainware\Ui\HtmlHelper;
     8use Plainware\Ui\Component\InlineList;
    99use Plainware\Ui\Ui;
    1010use Plainware\DateTime\DateTimeFormatter;
     
    1515    public $dtf = DateTimeFormatter::class;
    1616
    17     public function __invoke(TimeInput $el, Request $request): string
     17    public function __invoke(TimeInput $el, Request $request)
    1818    {
    19         $ret = [];
    20 
    2119        $name = $el->getName();
    2220        $value = $el->getValue();
     
    2523        $valueM = floor(($value - $valueH * (60 * 60)) / 60);
    2624
    27         $ret[] = '<ul class="pw-inline-list">';
     25        $dt = new \DateTime();
    2826
    29         $today = 20250710;
    3027        $options = [];
    31 
    32         $dt = new \DateTime();
    3328        foreach (range(0, 23, 1) as $k) {
    3429            $v = $k;
     
    4035            $options[$k] = $v2;
    4136        }
    42         $inputHour = new SelectInput($options);
    43         $inputHour->setName($name . '_h');
    44         $inputHour->setValue($valueH);
    45 
    46         $ret[] = '<li>';
    47         $ret[] = $this->ui->render($inputHour, $request);
    48         $ret[] = '</li>';
    49 
    50         $ret[] = '<li>:</li>';
     37        $inputHour = (new SelectInput($name . '_h'))
     38            ->setOptions($options)
     39            ->setValue($valueH)
     40            ;
    5141
    5242        $options = [];
     
    5747        }
    5848
    59         $inputMinute = new SelectInput($options);
    60         $inputMinute->setName($name . '_m');
    61         $inputMinute->setValue($valueM);
     49        $inputMinute = (new SelectInput($name . '_m'))
     50            ->setOptions($options)
     51            ->setValue($valueM)
     52            ;
    6253
    63         $ret[] = '<li>';
    64         $ret[] = $this->ui->render($inputMinute, $request);
    65         $ret[] = '</li>';
    66 
    67         $ret[] = '</ul>';
    68 
    69         $ret = join('', $ret);
     54        $ret = (new InlineList())
     55            ->add($inputHour)
     56            ->add(':')
     57            ->add($inputMinute)
     58            ;
    7059
    7160        return $ret;
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/InlineListRenderer.php

    r3403602 r3407122  
    1010    public function __invoke(InlineList $el)
    1111    {
     12        $spacing = $el->getSpacing();
    1213        $items = $el->getItems();
    13 
    1414        if (!$items) {
    1515            $ret = '';
     
    2020            ->withAttr('class', 'pw-inline-list')
    2121            ;
     22
     23        if (2 !== $spacing) {
     24            $ret->withAttr('class', 'pw-spacing-' . $spacing);
     25        }
    2226
    2327        $attr = $el->getAttr();
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/MainMenuRenderer.php

    r3403602 r3407122  
    6262        }
    6363
    64         $wrappers = $el->getWrappers();
    65         foreach (array_reverse($wrappers) as $wrapper) {
    66             $ret = $wrapper->append($ret);
    67         }
    68 
    6964        return $ret;
    7065    }
  • plaintracker/trunk/vendor/plainware/ui/src/Renderer/PartialRenderer.php

    r3403602 r3407122  
    55use Plainware\Http\Request;
    66use Plainware\Http\Router;
    7 use Plainware\Ui\Component\Container;
     7use Plainware\Ui\Component\Collection;
    88use Plainware\Ui\Component\HtmlElement;
    99use Plainware\Ui\Component\InlineList;
     
    8181        $ret = array_column($ret, 1);
    8282
    83         $ret_ = new Container();
    84         foreach ($ret as $k => $v) {
    85             $v = new Section($v);
    86             $ret_->add($k, $v);
     83        $ret_ = new Collection();
     84        foreach ($ret as $v) {
     85            $ret_->add(new Section($v));
    8786        }
    8887
  • plaintracker/trunk/vendor/plainware/ui/src/Ui.php

    r3403602 r3407122  
    4242        }
    4343
     44/*
    4445        $funcs = $this->findRenderers(get_class($el));
    4546
     
    6364            }
    6465        }
     66*/
     67
     68        $funcs = [];
     69
     70        $parentClasses = class_parents($el);
     71        foreach (array_reverse($parentClasses) as $parentClass) {
     72            $funcs = array_merge($funcs, $this->findRenderers($parentClass));
     73        }
     74
     75        $interfaces = class_implements($el);
     76        foreach ($interfaces as $interface) {
     77            $funcs = array_merge($funcs, $this->findRenderers($interface));
     78        }
     79
     80        $funcs = array_merge($funcs, $this->findRenderers(get_class($el)));
    6581
    6682        if (!$funcs) {
Note: See TracChangeset for help on using the changeset viewer.