Plugin Directory

Changeset 3406711


Ignore:
Timestamp:
12/01/2025 10:37:31 AM (3 months ago)
Author:
plainware
Message:

2.0.8

Location:
plain-event-calendar/trunk
Files:
9 added
25 deleted
55 edited

Legend:

Unmodified
Added
Removed
  • plain-event-calendar/trunk/module/web-admin-event/src/Controller/EventController.php

    r3400983 r3406711  
    55use Plainware\Http\Request;
    66use Plainware\Http\Redirect;
    7 use Plainware\Ui\Component\Container;
    87use Plainware\Ui\Component\Link;
    98use Plainware\Ui\Component\Main;
     
    3130            $ret = $this->render($ms);
    3231        } else {
    33             $ret = new Redirect('./create');
    34             return $ret;
     32            return new Redirect('./create');
    3533        }
    3634
    37         $content = new Container();
    38         $content->add(25, new Section($ret));
    39 
    40         $ret = new Main($content);
     35        $ret = new Main($ret);
    4136
    4237        return $ret;
  • plain-event-calendar/trunk/module/web-admin-event/src/Controller/EventCreateController.php

    r3403596 r3406711  
    66use Plainware\Http\Redirect;
    77use Plainware\Ui\Component\Main;
    8 use Plainware\Ui\Component\Link;
    9 use Plainware\Ui\Component\Form;
     8use Plainware\Ui\Component\Form\Button;
     9use Plainware\Ui\Component\Form\Form;
    1010use Plainware\Ui\Component\Form\DateInput;
    1111use Plainware\Ui\Component\Form\RadioSetInput;
    1212use Plainware\Ui\Component\Form\TextInput;
    1313use Plainware\Ui\Component\Form\TextareaInput;
    14 use Plainware\Ui\Component\Form\Button;
    1514use PlainEventCalendar\Core\Action\CreateEventAction;
    1615
     
    1817{
    1918    public $createEventAction = CreateEventAction::class;
     19    private ?Form $form = null;
     20
     21    private function form(): Form
     22    {
     23        if ($this->form) {
     24            return $this->form;
     25        }
     26
     27        $form = new Form();
     28
     29        $form->add((new TextInput('title'))->setLabel('__Event name__')->setRequired());
     30        $form->add((new DateInput('d1'))->setLabel('__Start date__'));
     31        $form->add((new DateInput('d2'))->setLabel('__End date__'));
     32        $form->add((new TextareaInput('description'))->setLabel('__Event description__'));
     33        $form->add((new RadioSetInput('next'))->setLabel('__Next action__'));
     34
     35        $form->addButton(new Button('__Create event__'));
     36
     37        return $this->form = $form;
     38    }
    2039
    2140    public function __invoke(Request $request)
    2241    {
    23         $form = new Form($request);
     42        $form = $this->form();
    2443
    25         $form->withInput('title', new TextInput())
    26             ->setLabel('__Event name__')
    27             ->setRequired()
    28             ;
     44        $options = ['back' => '__Get back to event list__', 'self' => '__Add another event__'];
     45        $v = $request->getQueryParam('next');
     46        if (!isset($options[$v])) {
     47            $v = current(array_keys($options));
     48        }
     49        $form->input('next')->setOptions($options)->setValue($v);
    2950
    30         $form->withInput('d1', new DateInput())
    31             ->setLabel('__Start date__')
    32             ->setRequired()
    33             ;
     51        if ($vs = $form->grab($request)) {
     52            if (!strlen($vs['title'])) {
     53                $form->input('title')->addError('__Required field__');
     54            }
     55            $d1 = $vs['d1'];
     56            $d2 = $vs['d2'];
     57            if ($d2 < $d1) {
     58                $form->input('d2')->addError('__The end date should be after the start date__');
     59            }
     60        }
    3461
    35         $form->withInput('d2', new DateInput())
    36             ->setLabel('__End date__')
    37             ->setRequired()
    38             ;
     62        if ($form->isValid()) {
     63            $this->createEventAction->__invoke($d1, $d2, $vs['title'], $vs['description']);
    3964
    40         $form->withInput('description', new TextareaInput())
    41             ->setLabel('__Event description__')
    42             ;
    43 
    44         $options = [
    45             'back' => '__Get back to event list__',
    46             'self' => '__Add another event__',
    47         ];
    48         $next = $request->getQueryParam('next');
    49         if (!isset($options[$next])) {
    50             $next = current(array_keys($options));
    51         }
    52         $form->withInput('next', new RadioSetInput($options))
    53             ->setLabel('__Next action__')
    54             ->setValue($next)
    55             ;
    56 
    57         $form->withButton('submit', new Button('__Create event__'));
    58 
    59         $form = $form->grab($request);
    60 
    61         if ($form->isSubmitted() && $form->isValid()) {
    62             $vs = $form->getValues();
    63 
    64             if (!strlen($vs['title'])) {
    65                 $form->withInput('title')->addError('__Required field__');
     65            $msg = '__Event created__';
     66            $next = $vs['next'] ?? $next;
     67            if ('self' == $next) {
     68                return (new Redirect('.', ['next' => $next]))->withMessage($msg);
    6669            } else {
    67             }
    68 
    69             $d1 = new \DateTimeImmutable($vs['d1']);
    70             $d2 = new \DateTimeImmutable($vs['d2']);
    71 
    72             if ($d2 < $d1) {
    73                 $form->withInput('d2')->addError('__The end date should be after the start date__');
    74             }
    75 
    76             if ($form->isValid()) {
    77                 $this->createEventAction->__invoke(
    78                     $d1,
    79                     $d2,
    80                     $vs['title'],
    81                     $vs['description']
    82                 );
    83 
    84                 $msg = '__Event created__';
    85                 $next = $vs['next'] ?? $next;
    86                 if ('self' == $next) {
    87                     return (new Redirect('.', ['next' => $next]))->withMessage($msg);
    88                 } else {
    89                     return (new Redirect('..'))->withMessage($msg);
    90                 }
     70                return (new Redirect('..'))->withMessage($msg);
    9171            }
    9272        }
  • plain-event-calendar/trunk/module/web-admin-event/src/Controller/EventIdController.php

    r3403596 r3406711  
    88use Plainware\Ui\Component\Main;
    99use Plainware\Ui\Component\Link;
    10 use Plainware\Ui\Component\Form;
     10use Plainware\Ui\Component\Form\Button;
     11use Plainware\Ui\Component\Form\Form;
    1112use Plainware\Ui\Component\Form\DateInput;
    1213use Plainware\Ui\Component\Form\TextInput;
    1314use Plainware\Ui\Component\Form\TextareaInput;
    14 use Plainware\Ui\Component\Form\Button;
    1515use PlainEventCalendar\Core\Action\RescheduleEventAction;
    1616use PlainEventCalendar\Core\Action\RenameEventAction;
     
    2424    public $rescheduleEventAction = RescheduleEventAction::class;
    2525    public $renameEventAction = RenameEventAction::class;
     26    private ?Form $form = null;
    2627
    2728    public function title(Request $request)
     
    3940    }
    4041
     42    private function form(): Form
     43    {
     44        if ($this->form) {
     45            return $this->form;
     46        }
     47
     48        $form = new Form();
     49
     50        $form->add((new TextInput('title'))->setLabel('__Event name__')->setRequired());
     51        $form->add((new DateInput('d1'))->setLabel('__Start date__'));
     52        $form->add((new DateInput('d2'))->setLabel('__End date__'));
     53        $form->add((new TextareaInput('description'))->setLabel('__Event description__'));
     54
     55        $form->addButton(new Button('__Save changes__'));
     56
     57        return $this->form = $form;
     58    }
     59
    4160    public function __invoke(Request $request)
    4261    {
     
    4463        $m = $this->repo->getById($id);
    4564
    46         $form = new Form($request);
     65        $form = $this->form();
    4766
    48         $form->withInput('title', new TextInput())
    49             ->setLabel('__Event name__')
    50             ->setValue($m->getTitle())
    51             ->setRequired()
    52             ;
     67        $vs = [
     68            'title' => $m->getTitle(),
     69            'd1' => $m->getStartDate(),
     70            'd2' => $m->getEndDate(),
     71            'description' => $m->getDescription(),
     72            ];
     73        $form->setValues($vs);
    5374
    54         $form->withInput('d1', new DateInput())
    55             ->setLabel('__Start date__')
    56             ->setValue($m->getStartDate())
    57             ->setRequired()
    58             ;
     75        if ($vs = $form->grab($request)) {
     76            if (!strlen($vs['title'])) {
     77                $form->input('title')->addError('__Required field__');
     78            }
     79            $d1 = $vs['d1'];
     80            $d2 = $vs['d2'];
     81            if ($d2 < $d1) {
     82                $form->input('d2')->addError('__The end date should be after the start date__');
     83            }
     84        }
    5985
    60         $form->withInput('d2', new DateInput())
    61             ->setLabel('__End date__')
    62             ->setValue($m->getEndDate())
    63             ->setRequired()
    64             ;
     86        if ($form->isValid()) {
     87            $msgs = [];
    6588
    66         $form->withInput('description', new TextareaInput())
    67             ->setLabel('__Event description__')
    68             ->setValue($m->getDescription())
    69             ;
    70 
    71         $form->withButton('submit', new Button('__Save changes__'));
    72 
    73         $form = $form->grab($request);
    74 
    75         if ($form->isSubmitted() && $form->isValid()) {
    76             $vs = $form->getValues();
    77 
    78             if (!strlen($vs['title'])) {
    79                 $form->withInput('title')->addError('__Required field__');
    80             } else {
     89            if (($d1 != $m->getStartDate()) or ($d2 != $m->getEndDate())) {
     90                $this->rescheduleEventAction->__invoke($m, $d1, $d2);
     91                $msgs[] = '__Event rescheduled__';
    8192            }
    8293
    83             $d1 = new \DateTimeImmutable($vs['d1']);
    84             $d2 = new \DateTimeImmutable($vs['d2']);
    85 
    86             if ($d2 < $d1) {
    87                 $form->withInput('d2')->addError('__The end date should be after the start date__');
     94            if (($vs['title'] != $m->getTitle()) or ($vs['description'] != $m->getDescription())) {
     95                $this->renameEventAction->__invoke($m, $vs['title'], $vs['description']);
     96                $msgs[] = '__Event detail changed__';
    8897            }
    8998
    90             if ($form->isValid()) {
    91                 $msgs = [];
     99            $ret = new Redirect('..');
     100            foreach ($msgs as $msg) {
     101                $ret = $ret->withMessage($msg);
     102            }
    92103
    93                 if (($d1 != $m->getStartDate()) or ($d2 != $m->getEndDate())) {
    94                     $this->rescheduleEventAction->__invoke($m, $d1, $d2);
    95                     $msgs[] = '__Event rescheduled__';
    96                 }
    97 
    98                 if (($vs['title'] != $m->getTitle()) or ($vs['description'] != $m->getDescription())) {
    99                     $this->renameEventAction->__invoke($m, $vs['title'], $vs['description']);
    100                     $msgs[] = '__Event detail changed__';
    101                 }
    102 
    103                 $ret = new Redirect('..');
    104                 foreach ($msgs as $msg) {
    105                     $ret = $ret->withMessage($msg);
    106                 }
    107 
    108                 return $ret;
    109             }
     104            return $ret;
    110105        }
    111106
  • plain-event-calendar/trunk/module/web-admin-event/src/Controller/EventIdDeleteController.php

    r3400983 r3406711  
    77use Plainware\Ui\Component\Main;
    88use Plainware\Ui\Component\Link;
    9 use Plainware\Ui\Component\Form;
     9use Plainware\Ui\Component\Form\Form;
    1010use Plainware\Ui\Component\Form\Button;
    1111use PlainEventCalendar\Core\Action\DeleteEventAction;
     
    2323        $m = $this->repo->getById($id);
    2424
    25         $form = new Form($request);
     25        $form = new Form();
     26        $form->append(new Button('__Yes, delete event__'));
    2627
    27         $form->withButton('submit', new Button('__Yes, delete event__'));
     28        $form->grab($request);
    2829
    29         $form = $form->grab($request);
     30        if ($form->isValid()) {
     31            $this->deleteEventAction->__invoke($m);
    3032
    31         if ($form->isSubmitted() && $form->isValid()) {
    32             if ($form->isValid()) {
    33                 $this->deleteEventAction->__invoke($m);
    34 
    35                 return (new Redirect('../..'))
    36                     ->withMessage('__Event deleted__')
    37                 ;
    38             }
     33            return (new Redirect('../..'))->withMessage('__Event deleted__');
    3934        }
    4035
  • plain-event-calendar/trunk/module/web-admin-setting-rest/src/Controller/AdminRestSettingPageController.php

    r3403596 r3406711  
    77use Plainware\Http\Redirect;
    88use Plainware\DateTime\DateTimeFormatter;
    9 use Plainware\Ui\Component\Container;
    109use Plainware\Ui\Component\Main;
    11 use Plainware\Ui\Component\Section;
    12 use Plainware\Ui\Component\Form;
    13 use Plainware\Ui\Component\Form\TextInput;
    14 use Plainware\Ui\Component\Form\CheckboxInput;
    1510use Plainware\Ui\Component\Form\SelectInput;
    1611use Plainware\Ui\Component\Form\Button;
     12use Plainware\Ui\Component\Form\Form;
     13use Plainware\Ui\Component\Form\CheckboxInput;
     14use Plainware\Ui\Component\Form\TextInput;
    1715use PlainEventCalendar\Core\Repo\SettingRepo;
    1816use PlainEventCalendar\Rest\Service\TokenManager;
     
    2422    public $dtf = DateTimeFormatter::class;
    2523    public $tokenManager = TokenManager::class;
     24    private ?Form $form = null;
    2625
    2726    public function title(Request $request)
     
    3231    public function __invoke(Request $request)
    3332    {
    34         $form = new Form();
     33        $form = $this->form();
    3534
    36         $try = new \DateTimeImmutable();
    37 
    38     /* enabled */
    39         $on = $this->repo->get('api_on') ?? true;
    40         $form->withInput('on', new CheckboxInput())
    41             ->setLabel('__Enable REST API__')
    42             ->setValue(1)
    43             ->setChecked($on)
    44             ;
     35    /* enabled? */
     36        $settingValue = $this->repo->get('api_on') ?? true;
     37        $on = (null === $settingValue) ? true : ($settingValue ? true : false);
     38        $form->input('on')->setValue($on);
    4539
    4640    /* auth token */
    4741        $v = $this->tokenManager->get();
    48         $form->withInput('token', new TextInput())
    49             ->setLabel('__Authentication token__')
    50             ->setHelp('__This token is required for creating, updating and deleting.__')
    51             ->setValue($v)
    52             ;
     42        $form->input('token')->setValue($v);
    5343
    54         $form->withInput('token_name', new TextInput())
    55             ->setLabel('__HTTP header name for the authentication token__')
    56             ->setValue('X-WP-PlainEventCalendar-Token')
    57             ->setDisabled()
    58             ;
     44    /* token name */
     45        $v = 'X-WP-PlainEventCalendar-Token';
     46        $form->input('token_name')->setValue($v);
     47
     48        if ($vs = $form->grab($request)) {
     49        }
     50
     51        if ($form->isValid()) {
     52            $v = $vs['on'] ? 1 : 0;
     53            $this->repo->set('api_on', $v);
     54            if (isset($vs['token'])) {
     55                $this->tokenManager->set($vs['token']);
     56            }
     57
     58            return (new Redirect('.'))->withMessage('__Settings updated__');
     59        }
     60
     61        $ret = new Main($form);
     62
     63        return $ret;
     64    }
     65
     66    private function form(): Form
     67    {
     68        if ($this->form) {
     69            return $this->form;
     70        }
     71
     72        $form = new Form();
     73        $form->add((new CheckboxInput('on'))->setLabel('__Enable REST API__'));
     74        $form->add(
     75            (new TextInput('token'))
     76                ->setLabel('__Authentication token__')
     77                ->addHelp('__This token is required for creating, updating and deleting.__')
     78        );
     79        $form->add(
     80            (new TextInput('token_name'))
     81                ->setLabel('__HTTP header name for the authentication token__')
     82                ->addHelp('__Supply the above token code with this HTTP header.__')
     83                ->withAttr('onclick', 'this.focus(); this.select();')
     84                ->withAttr('readonly', true)
     85        );
    5986
    6087        $form
     
    6390            ;
    6491
    65         $form->withButton('submit', new Button())
    66             ->setLabel('__Save__')
    67             ;
     92        $form->addButton(new Button('__Save__'));
    6893
    69         $form->grab($request);
    70         if ($form->isSubmitted()) {
    71             $vs = $form->getValues();
    72             if ($form->isValid()) {
    73                 $v = $vs['on'] ? 1 : 0;
    74                 $this->repo->set('api_on', $v);
    75 
    76                 if (isset($vs['token'])) {
    77                     $v = $vs['token'];
    78                     $this->tokenManager->set($v);
    79                 }
    80 
    81                 return (new Redirect('.'))->withMessage('__Settings updated__');
    82             }
    83         }
    84 
    85         $content = $form;
    86 
    87         $ret = new Main($content);
    88 
    89         return $ret;
     94        return $this->form = $form;
    9095    }
    9196}
  • plain-event-calendar/trunk/module/web-admin-setting/src/Controller/DatetimePageController.php

    r3403596 r3406711  
    77use Plainware\DateTime\DateTimeFormatter;
    88use Plainware\Ui\Component\Main;
    9 use Plainware\Ui\Component\Form;
     9use Plainware\Ui\Component\Form\Form;
    1010use Plainware\Ui\Component\Form\SelectInput;
    1111use Plainware\Ui\Component\Form\Button;
     12use Plainware\Ui\Component\Form\FormLabelRow;
    1213use PlainEventCalendar\Core\Repo\SettingRepo;
    1314
     
    1617    public $repo = SettingRepo::class;
    1718    public $dtf = DateTimeFormatter::class;
    18 
    19     public function title(Request $request)
    20     {
    21         return '__Date and time__';
    22     }
     19    private ?Form $form = null;
    2320
    2421    public function __invoke(Request $request)
    2522    {
    26         $form = new Form();
    27         // $form->withInput('')
     23        $form = $this->form();
    2824
    29         $try = new \DateTimeImmutable();
     25        $props = ['datetime_date_format', 'datetime_time_format', 'datetime_week_starts'];
     26        $values = array_combine($props, array_map(fn($k) => $this->repo->get($k), $props));
     27        $form->setValues($values);
    3028
    31     /* date format */
     29        if ($values = $form->grab($request)) {
     30        }
     31
     32        if ($form->isValid()) {
     33            $values = array_intersect_key($values, array_combine($props, $props));
     34            foreach ($values as $k => $v) {
     35                $this->repo->set($k, $v);
     36            }
     37
     38            return (new Redirect('..'))->withMessage('__Settings updated__');
     39        }
     40
     41        $form->addButton(new Button('__Save__'));
     42        $ret = new Main($form);
     43
     44        return $ret;
     45    }
     46
     47    private function form(): Form
     48    {
     49        if ($this->form) {
     50            return $this->form;
     51        }
     52
     53        $ret = new Form();
     54
     55    /* time format */
    3256        $option = [
    3357            'j M Y', 'F j, Y', 'n/j/Y', 'm/d/Y', 'm-d-Y', 'm.d.Y', 'j/n/Y',
     
    3559            ];
    3660        $option = array_flip($option);
     61
     62        $try = new \DateTimeImmutable();
    3763        foreach (array_keys($option) as $k) {
    3864            $thisView = $try->format($k);
    3965            $option[$k] = $thisView;
    4066        }
    41         $v = $this->repo->get('datetime_date_format');
    42         $form->withInput('datetime_date_format', new SelectInput($option))
    43             ->setLabel('__Date format__')
    44             ->setValue($v)
    45             ;
     67        $ret->add(
     68            (new SelectInput('datetime_date_format'))
     69                ->setOptions($option)
     70                ->setLabel('__Date format__')
     71        );
    4672
    4773    /* time format */
     
    5884            $option[$k] = $thisView;
    5985        }
    60         $v = $this->repo->get('datetime_time_format');
    61         $form->withInput('datetime_time_format', new SelectInput($option))
    62             ->setLabel('__Time format__')
    63             ->setValue($v)
    64             ;
     86        $ret->add(
     87            (new SelectInput('datetime_time_format'))
     88                ->setOptions($option)
     89                ->setLabel('__Time format__')
     90        );
    6591
    6692    /* week starts */
     
    6894        $option = array_flip($option);
    6995        foreach (array_keys($option) as $k) {
    70             $thisView = $this->dtf->formatDayOfWeek($k);
    71             $option[$k] = $thisView;
     96            $option[$k] = $this->dtf->formatDayOfWeek($k);
    7297        }
    73         $v = $this->repo->get('datetime_week_starts');
    74         $form->withInput('datetime_week_starts', new SelectInput($option))
    75             ->setLabel('__Week starts on__')
    76             ->setValue($v)
    77             ;
     98        $ret->add(
     99            (new SelectInput('datetime_week_starts'))
     100                ->setOptions($option)
     101                ->setLabel('__Week starts on__')
     102        );
    78103
    79         $form->withButton('submit', new Button())
    80             ->setLabel('__Save__')
    81             ;
    82 
    83         $form->grab($request);
    84         if ($form->isSubmitted()) {
    85             $vs = $form->getValues();
    86             if ($form->isValid()) {
    87                 $props = ['datetime_date_format', 'datetime_time_format', 'datetime_week_starts'];
    88                 foreach ($props as $k) {
    89                     $this->repo->set($k, $vs[$k]);
    90                 }
    91 
    92                 return (new Redirect('..'))
    93                     ->withMessage('__Settings updated__')
    94                     ;
    95             }
    96         }
    97 
    98         $content = $form;
    99 
    100         $ret = new Main($content);
    101 
    102         return $ret;
     104        return $this->form = $ret;
    103105    }
    104106}
  • plain-event-calendar/trunk/module/web-front/src/Controller/EventController.php

    r3400983 r3406711  
    55use Plainware\Http\Request;
    66use Plainware\Ui\Component\Main;
    7 use Plainware\Ui\Component\SpacedContainer;
    8 use Plainware\Ui\Component\Container;
     7use Plainware\Ui\Component\BlockList;
    98use Plainware\Ui\Component\Section;
    109use Plainware\Ui\Component\Table;
     
    4342    public function render(array $ms)
    4443    {
    45         $ret = new Container();
     44        $ret = (new BlockList())->setSpacing(3);
    4645
    47         $ii = 1;
    4846        foreach ($ms as $m) {
    49             $content = new Container();
    50             $jj = 1;
     47            $content = (new BlockList())->setSpacing(1);
    5148
    5249            $dateView = $this->dtf->formatDateRange($m->getStartDate(), $m->getEndDate());
    5350            $dateView = '<p>' . esc_html($dateView) . '</p>';
    54             $content->add($jj++, $dateView);
     51            $content->add($dateView);
    5552
    5653            $descriptionView = $m->getDescription();
    5754            if (strlen($descriptionView)) {
    58                 $content->add($jj++, $descriptionView);
     55                $content->add($descriptionView);
    5956            }
    6057
    6158            $title = $m->getTitle();
    6259            $title = esc_html($title);
    63             $ret->add($ii++, new Section($content, $title));
     60            $ret->add(new Section($content, $title));
    6461        }
    6562
  • plain-event-calendar/trunk/module/web-install/src/Controller/InstallController.php

    r3400983 r3406711  
    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;
    1515
     
    2626
    2727        $form = new Form();
    28         $form->withButton('submit', new Button('__Click to install__'));
     28        $form->append(new Button('__Click to install__'));
    2929
    30         $form = $form->grab($request);
    31 
    32         if ($form->isSubmitted() && $form->isValid()) {
     30        $form->grab($request);
     31        if ($form->isValid()) {
    3332            $this->migrator->up();
    3433
     
    3635        }
    3736
    38         $ret = (new SpacedContainer())
     37        $ret = (new BlockList())
    3938            ->add(new HtmlElement('h1', '__Installation__'))
    4039            ->add($info)
  • plain-event-calendar/trunk/module/web-install/src/Controller/UninstallController.php

    r3403596 r3406711  
    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;
     
    2424        $form->withButton('submit', new Button('__Click to uninstall__'));
    2525
    26         $form = $form->grab($request);
    27 
    28         if ($form->isSubmitted() && $form->isValid()) {
     26        $form->grab($request);
     27        if ($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)
  • plain-event-calendar/trunk/plain-event-calendar.php

    r3403596 r3406711  
    33Plugin Name: Plain Event Calendar
    44Description: A simple event calendar to manage and publish your events.
    5 Version: 2.0.7
     5Version: 2.0.8
    66Author: plainware
    77Text Domain: plain-event-calendar
  • plain-event-calendar/trunk/readme.txt

    r3403596 r3406711  
    33Tags: event calendar, event manager, calendar, events, school, university, church
    44License: GPLv2 or later
    5 Stable tag: 2.0.7
     5Stable tag: 2.0.8
    66Requires at least: 4.1
    77Tested up to: 6.8
     
    4949== Changelog ==
    5050
     51= 2.0.8 (2025-12-01) =
     52* Framework code update.
     53
    5154= 2.0.7 (2025-11-26) =
    5255* BUG: date and time format settings didn't take effect.
  • plain-event-calendar/trunk/vendor/plainware/http/src/Server.php

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

    r3403596 r3406711  
    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        }
  • plain-event-calendar/trunk/vendor/plainware/ui-wordpress/assets/admin.css

    r3372822 r3406711  
    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) {
  • plain-event-calendar/trunk/vendor/plainware/ui-wordpress/src/Renderer/AdminMainMenuRenderer.php

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

    r3400983 r3406711  
    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#pw2 .pw-form .pw-form-raw-item {padding: .5em 0;}
     441@media (min-width: 48em) {
     442  #pw2 .pw-form-hori .pw-form-label-content {display: grid; grid-template-columns: 12rem 1fr; gap: 0; align-items: start;}
     443  #pw2 .pw-form-hori .pw-form-label-content > :first-child {text-align: end; margin: 0; padding: .5em; overflow: hidden;}
     444  #pw2 .pw-form-hori .pw-form-emptylabel-content {margin-inline-start: 12rem;}
     445}
     446
     447#pw2 .pw-form-inline .pw-form-body,
     448#pw2 .pw-form-inline .pw-form-label-content {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center;}
     449#pw2 .pw-form-inline .pw-form-body {gap: .5em;}
     450#pw2 .pw-form-inline .pw-form-label-content {gap: .25em;}
     451
     452#pw2 .pw-form-vert .pw-form-label-content > :first-child {margin-bottom: .25em;}
     453
     454/* block list */
     455#pw2 .pw-block-list {list-style-type: none; display: block;}
     456#pw2 .pw-block-list > div + div {margin-top: .5em;}
     457#pw2 .pw-block-list.pw-spacing-1 > div + div {margin-top: .25em;}
     458#pw2 .pw-block-list.pw-spacing-3 > div + div {margin-top: 1em;}
     459#pw2 .pw-block-list.pw-spacing-0 > div + div {margin-top: 0;}
     460
     461/* inline list */
     462#pw2 .pw-inline-list {list-style-type: none;}
     463#pw2 .pw-inline-list {display: flex; flex-direction: row; flex-wrap: wrap; justify-content: start; align-items: center; gap: .5em;}
     464#pw2 .pw-valign-top.pw-inline-list {align-items: start;}
     465#pw2 .pw-inline-list.pw-spacing-1 {gap: .25em;}
     466#pw2 .pw-inline-list.pw-spacing-3 {gap: 1em;}
     467#pw2 .pw-inline-list.pw-spacing-0 {gap: 0;}
     468/* #pw2 .pw-inline-list {align-items: baseline;} */
     469#pw2 .pw-inline-list img, #pw2 .pw-inline-list input {display: block;}
     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; }
     473
  • plain-event-calendar/trunk/vendor/plainware/ui/boot.php

    r3400983 r3406711  
    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\TimeInput::class, Renderer\Form\TimeInputRenderer::class)
     41
     42            ->renderer(Component\Collection::class, Renderer\CollectionRenderer::class)
     43
    2444            ->renderer(Component\AbstractTag::class, Renderer\HtmlElementRenderer::class)
    2545            ->renderer(Component\Main::class, Renderer\MainRenderer::class)
     
    2949            ->renderer(Component\Breadcrumbs::class, Renderer\BreadcrumbsRenderer::class)
    3050            ->renderer(Component\Table::class, Renderer\TableRenderer::class)
    31             ->renderer(Component\Container::class, Renderer\ContainerRenderer::class)
    3251            ->renderer(Component\Section::class, Renderer\SectionRenderer::class)
    3352            ->renderer(Component\StartEnd::class, Renderer\StartEndRenderer::class)
     
    3756            ->renderer(Component\Menu::class, Renderer\MenuRenderer::class)
    3857            ->renderer(Component\InlineList::class, Renderer\InlineListRenderer::class)
     58            ->renderer(Component\BlockList::class, Renderer\BlockListRenderer::class)
    3959            ->renderer(Component\TabMenu::class, Renderer\TabMenuRenderer::class)
    4060            ->renderer(Component\Grid::class, Renderer\GridRenderer::class)
     
    4262            ->renderer(Component\Partial::class, Renderer\PartialRenderer::class)
    4363            ->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)
    6564            ;
    6665    });
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/AbstractTag.php

    r3372822 r3406711  
    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;
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Breadcrumbs.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/AbstractInput.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/CheckboxInput.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/CheckboxSetInput.php

    r3372822 r3406711  
    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{
    11     private array $options = [];
    12     private bool $isVertical = false;
     11    private array $options;
     12    private array $value = [];
    1313
    14     public function __construct(array $options)
     14    public function __construct(array $options = [])
    1515    {
    1616        $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;
    3017    }
    3118
     
    3522    }
    3623
    37     public function setVertical(bool $on = true): self
     24    public function setOptions(array $v): self
    3825    {
    39         $this->isVertical = $on;
     26        $this->options = $v;
    4027
    4128        return $this;
    4229    }
    4330
    44     public function isVertical(): bool
     31    public function grab(Request $request): array
    4532    {
    46         return $this->isVertical;
     33        $ret = $request->getPostParam($this->getName()) ?? [];
     34        $ret = array_intersect($ret, array_keys($this->options));
     35
     36        return $ret;
     37    }
     38
     39    public function setValue(array $v): self
     40    {
     41        $this->value = array_intersect($v, array_keys($this->options));
     42
     43        return $this;
     44    }
     45
     46    public function getValue(): array
     47    {
     48        return $this->value;
    4749    }
    4850}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/ColorInput.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/DateInput.php

    r3403596 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/InputInterface.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/NumberInput.php

    r3372822 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/PasswordInput.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/RadioInput.php

    r3332867 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/RadioSetInput.php

    r3372822 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/SelectInput.php

    r3372822 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/TextInput.php

    r3332867 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/TextareaInput.php

    r3332867 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Form/TimeInput.php

    r3400983 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/HtmlElement.php

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

    r3372822 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Component/Menu.php

    r3394866 r3406711  
    33namespace Plainware\Ui\Component;
    44
    5 use Plainware\Ui\Component\Link;
    6 use Plainware\Ui\Component\Container;
     5class Menu
     6{
     7    private array $items = [];
    78
    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 = [])
     9    public function __construct(array $items = [])
    1410    {
    15         $link = new Link($to, $params);
    16 
    17         return $this->add($order, $link);
     11        foreach ($items as $item) {
     12            $this->add($item);
     13        }
    1814    }
    1915
    20     public function setCurrentSlug($currentSlug): self
     16    public function add($item)
    2117    {
    22         $this->currentSlug = $currentSlug;
     18        return $this->addWithOrder($item, 50);
     19    }
     20
     21    public function addWithOrder($item, int $weight): self
     22    {
     23        $this->items[] = [$weight, $item];
    2324
    2425        return $this;
    2526    }
    2627
    27     public function getCurrentSlug()
     28    public function getItems(): array
    2829    {
    29         return $this->currentSlug;
    30     }
     30        $ret = $this->items;
     31        usort($ret, fn($a, $b) => ($a[0] - $b[0]));
     32        $ret = array_column($ret, 1);
    3133
    32     public function setVertical(bool $on = true): self
    33     {
    34         $this->isVertical = $on;
    35 
    36         return $this;
    37     }
    38 
    39     public function isVertical(): bool
    40     {
    41         return $this->isVertical;
     34        return $ret;
    4235    }
    4336}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Middleware/PageLayoutMiddleware.php

    r3400983 r3406711  
    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);
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/BreadcrumbsRenderer.php

    r3394866 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/ButtonRenderer.php

    r3394866 r3406711  
    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();
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/CheckboxInputRenderer.php

    r3394866 r3406711  
    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            $label = (new HtmlElement('label', $label))
     40                ->withAttr('for', $htmlId);
     41                ;
     42            $ret = (new InlineList())
     43                ->setSpacing(1)
     44                ->add($ret)
     45                ->add($label)
     46                ;
    4447        }
    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);
    5548
    5649        return $ret;
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/CheckboxSetInputRenderer.php

    r3372822 r3406711  
    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            ->withAttr('class', 'pw-form-raw-item')
     20            ;
    2321
    2422        $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);
     23        foreach ($options as $k => $label) {
     24            $one = (new CheckboxInput($name . '[]'))
     25                ->setLabel($label)
     26                ->setHtmlValue($k)
     27                ;
     28            if (in_array($k, $value)) {
     29                $one->setValue(true);
    3830            }
    39 
    40             $ret->append($ret_);
     31            $ret->add($one);
    4132        }
    4233
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/DateInputRenderer.php

    r3394866 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/NumberInputRenderer.php

    r3394866 r3406711  
    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(TextInput $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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/PasswordInputRenderer.php

    r3394866 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/RadioInputRenderer.php

    r3394866 r3406711  
    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            $label = (new HtmlElement('label', $label))
     40                ->withAttr('for', $htmlId);
     41                ;
     42            $ret = (new InlineList())
     43                ->setSpacing(1)
     44                ->add($ret)
     45                ->add($label)
     46                ;
     47        }
    4048
    4149        return $ret;
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/RadioSetInputRenderer.php

    r3372822 r3406711  
    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            ->withAttr('class', 'pw-form-raw-item')
     20            ;
     21
    1722        $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);
     23        foreach ($options as $k => $label) {
     24            $one = (new RadioInput($name))
     25                ->setLabel($label)
     26                ->setHtmlValue($k)
     27                ;
     28            if ($k === $value) {
     29                $one->setValue(true);
    3030            }
    31         } elseif (1 === count($options)) {
    32             $v = current($options);
    33             $ret->add($v);
    34         } else {
    35             $ret->add('?');
     31            $ret->add($one);
    3632        }
    3733
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/SelectInputRenderer.php

    r3394866 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/TextInputRenderer.php

    r3394866 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/TextareaInputRenderer.php

    r3394866 r3406711  
    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}
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/Form/TimeInputRenderer.php

    r3400983 r3406711  
    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;
     
    4439        $inputHour->setValue($valueH);
    4540
    46         $ret[] = '<li>';
    47         $ret[] = $this->ui->render($inputHour, $request);
    48         $ret[] = '</li>';
    49 
    50         $ret[] = '<li>:</li>';
    51 
    5241        $options = [];
    5342        $step = $el->getStep();
     
    6049        $inputMinute->setName($name . '_m');
    6150        $inputMinute->setValue($valueM);
     51
     52        $ret = (new InlineList())
     53            ->add($inputHour)
     54            ->add(':')
     55            ->add($inputMinute)
     56            ;
     57
     58        return $ret;
     59
     60
     61
     62
     63
     64
     65        $ret[] = '<li>';
     66        $ret[] = $this->ui->render($inputHour, $request);
     67        $ret[] = '</li>';
     68
     69        $ret[] = '<li>:</li>';
     70
    6271
    6372        $ret[] = '<li>';
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/InlineListRenderer.php

    r3372822 r3406711  
    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();
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/MainMenuRenderer.php

    r3400983 r3406711  
    6262        }
    6363
    64         $wrappers = $el->getWrappers();
    65         foreach (array_reverse($wrappers) as $wrapper) {
    66             $ret = $wrapper->append($ret);
    67         }
    68 
    6964        return $ret;
    7065    }
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/MenuRenderer.php

    r3400983 r3406711  
    3232        }
    3333
    34         $isVertical = $el->isVertical();
     34        // $isVertical = $el->isVertical();
     35        $isVertical = false;
    3536
    3637        $ret = new HtmlElement('div');
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Renderer/PartialRenderer.php

    r3400983 r3406711  
    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
  • plain-event-calendar/trunk/vendor/plainware/ui/src/Ui.php

    r3394866 r3406711  
    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.