Skip to content

Commit 7c31b68

Browse files
authored
Merge pull request #2 from codem/feat-datalist-improvements
Better datalist support, lots of fixes and enhancements
2 parents af74e83 + 7427b3f commit 7c31b68

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+588
-47
lines changed

composer.json

+13-2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,22 @@
1515
"homepage": "https://github.com/codem/silverstripe-html5-inputs"
1616
}
1717
],
18+
"autoload": {
19+
"psr-4": {
20+
"Codem\\Utilities\\HTML5\\": "src/"
21+
}
22+
},
23+
"autoload-dev": {
24+
"psr-4": {
25+
"Codem\\Utilities\\HTML5\\Tests\\": "tests/"
26+
}
27+
},
1828
"require": {
1929
"silverstripe/framework" : "^4"
2030
},
2131
"require-dev": {
22-
"phpunit/phpunit": "^5.7 | ^7",
23-
"squizlabs/php_codesniffer": "^3.0"
32+
"phpunit/phpunit": "^5.7 | ^9.5",
33+
"squizlabs/php_codesniffer": "^3.0",
34+
"ext-dom" : "*"
2435
}
2536
}

src/Forms/ColorField.php

-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ class ColorField extends TextField {
1616
use Core;
1717
use Datalist;
1818

19-
protected $template = "Codem/Utilities/HTML5/ColorField";
20-
2119
protected $inputType = 'color';
2220

2321
protected $defaultValue = "#ffffff";

src/Forms/DateField.php

+5-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
/**
88
* Provides a date field
9+
* @author James
910
*/
1011
class DateField extends TextField {
1112

@@ -14,23 +15,21 @@ class DateField extends TextField {
1415
use Step;
1516
use MinMax;
1617

17-
protected $template = "Codem/Utilities/HTML5/DateField";
18-
1918
protected $inputType = 'date';
2019

2120
protected $datetime_format = "Y-m-d";
2221

2322
protected $example = "2020-12-31";
2423

25-
protected function formatDate(Datetime $datetime) {
24+
protected function formatDate(\Datetime $datetime) {
2625
return $datetime->format( $this->datetime_format );
2726
}
2827

29-
public function setMin(DateTime $min) {
28+
public function setMin(\DateTime $min) {
3029
return $this->setAttribute('min', $this->formatDate($min));
3130
}
3231

33-
public function setMax(DateTime $max) {
32+
public function setMax(\DateTime $max) {
3433
return $this->setAttribute('max', $this->formatDate($max));
3534
}
3635

@@ -45,7 +44,7 @@ public function validate($validator)
4544
{
4645
try {
4746
$this->value = trim($this->value);
48-
$dt = new Datetime($this->value);
47+
$dt = new \Datetime($this->value);
4948
$formatted = $this->formatDate($dt);
5049
if($formatted != $this->value) {
5150
throw new \Exception("Invalid date value passed");

src/Forms/DatetimeField.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
namespace Codem\Utilities\HTML5;
44

55
/**
6-
* Provides a datetime field, which is basically the same as a DateField
6+
* Provides a datetime-local field, which is basically the same as a DateField
77
* but with hour and minute selection
8+
* @author James
89
*/
910
class DatetimeField extends DateField {
1011

src/Forms/EmailField.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
/**
88
* Text input field with validation for correct email format according to RFC 2822.
9+
* @author james
910
*/
1011
class EmailField extends CoreEmailField {
1112

1213
use Core;
1314
use Datalist;
1415
use Pattern;
16+
use Multiple;
1517

1618
protected $inputType = 'email';
1719

18-
19-
2020
}

src/Forms/MonthField.php

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
/**
66
* Provides a month field, which is basically the same as a DateField
77
* but with month and year selection
8+
* @author James
89
*/
910
class MonthField extends DateField {
1011

src/Forms/NumberField.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
namespace Codem\Utilities\HTML5;
44

5-
use SilverStripe\Forms\NumericField;
5+
use SilverStripe\Forms\TextField;
66

77
/**
8-
* Numeric input field
8+
* Number input field
9+
* @author James
910
*/
10-
class NumberField extends NumericField {
11+
class NumberField extends TextField {
1112

1213
use Core;
1314
use Datalist;

src/Forms/SearchField.php

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
/**
88
* Search input field
9+
* @author James
910
*/
1011
class SearchField extends TextField {
1112

src/Forms/TelField.php

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
/**
88
* From <input> elements of type tel are used to let the user enter and edit a telephone number.
9+
* @author James
910
*/
1011
class TelField extends TextField {
1112

src/Forms/TimeField.php

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
/**
66
* Provides a time field, limited to hour and minute selection only
7+
* @author James
78
*/
89
class TimeField extends DateField {
910

src/Forms/UrlField.php

-5
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ class UrlField extends TextField {
1414
use Datalist;
1515
use Pattern;
1616

17-
/**
18-
* @var string
19-
*/
20-
protected $template = "Codem/Utilities/HTML5/UrlField";
21-
2217
/**
2318
* @var string
2419
*/

src/Forms/WeekField.php

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
* Provides a week field
77
* MDN: <input> elements of type week create input fields allowing easy entry of a
88
* year plus the ISO 8601 week number during that year (i.e., week 1 to 52 or 53).
9+
* @author James
910
*/
1011
class WeekField extends DateField {
1112

src/Traits/Core.php

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
namespace Codem\Utilities\HTML5;
44

5+
/**
6+
* Core common attribute methods
7+
* @author James
8+
*/
59
trait Core {
610

711
protected function bool2str($value) {

src/Traits/Datalist.php

+41-10
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,71 @@
22

33
namespace Codem\Utilities\HTML5;
44

5-
use Silverstripe\ORM\ArrayList;
5+
use SilverStripe\ORM\ArrayList;
6+
use SilverStripe\View\ArrayData;
67

8+
/**
9+
* Datalist trait used for supporting inputs that can have a <datalist>
10+
* @author James
11+
*/
712
trait Datalist {
813

914
/**
1015
* @var array
1116
*/
12-
protected $input_datalist;
17+
protected $inputDatalist;
1318

1419
/**
1520
* @var string
1621
*/
17-
protected $input_datalist_id;
22+
protected $inputDatalistId;
23+
24+
/**
25+
* Return values for a <datalist>
26+
*/
27+
protected function createDataList(array $datalist) : ArrayList {
28+
$list = ArrayList::create();
29+
foreach($datalist as $value => $label) {
30+
$list->push( ArrayData::create([
31+
'Value' => $value,
32+
'Label' => $label
33+
]) );
34+
}
35+
return $list;
36+
}
1837

1938
/**
2039
* Set a list of values rendered into a <datalist> tag (HTMLDataListElement)
2140
* @param array $list
2241
* @param string $id optional datalist id attribute
2342
* @return FormField
2443
*/
25-
public function setDatalist(ArrayList $list, $id = null) {
26-
$this->input_datalist = $list;
27-
if($id) {
28-
$this->input_datalist_id = $id;
44+
public function setDatalist(array $datalist, $id = null) {
45+
$this->inputDatalist = $this->createDataList($datalist);
46+
if(!$id) {
47+
$id = $this->ID() . "_datalist";
2948
}
49+
$this->inputDatalistId = $id;
50+
$this->setAttribute('list', $id);
3051
return $this;
3152
}
3253

33-
public function getDatalist() {
34-
return $this->input_datalist;
54+
public function getDatalist() : ?ArrayList {
55+
return $this->inputDatalist;
3556
}
3657

37-
public function Datalist() {
58+
/**
59+
* Return datalist id value
60+
*/
61+
public function Datalist() : ?ArrayList {
3862
return $this->getDatalist();
3963
}
4064

65+
/**
66+
* Return datalist id value
67+
*/
68+
public function DatalistID() : ?string {
69+
return $this->inputDatalistId;
70+
}
71+
4172
}

src/Traits/MinMax.php

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
namespace Codem\Utilities\HTML5;
44

5+
/**
6+
* Min/Max handling for supporting inputs
7+
* @author James
8+
*/
59
trait MinMax {
610

711
public function setMin($min) {

src/Traits/Multiple.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
namespace Codem\Utilities\HTML5;
44

5-
trait Pattern {
5+
/**
6+
* multiple handling for supporting inputs
7+
* @author James
8+
*/
9+
trait Multiple {
610

711
/**
812
* Set whether an input can accept multiple values

src/Traits/Pattern.php

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
namespace Codem\Utilities\HTML5;
44

5+
/**
6+
* pattern handling for supporting inputs
7+
* @author James
8+
*/
59
trait Pattern {
610

711
/**
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
<input $AttributesHTML />
2-
<% if $Datalist %>
3-
$Datalist
4-
<% end_if %>
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>

templates/Codem/Utilities/HTML5/Datalist.ss

-5
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<% if $Datalist %>
2+
<datalist id="{$DatalistID.XML}">
3+
<% loop $Datalist %>
4+
<option value="{$Value.XML}"<% if $Label %> label="{$Label.XML}"<% end_if %>>
5+
<% end_loop %>
6+
</datalist>
7+
<% end_if %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<input {$AttributesHTML}>
2+
<% include Codem/Utilities/HTML5/Datalist %>

tests/AbstractFieldTest.php

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Codem\Utilities\HTML5\Tests;
4+
5+
use SilverStripe\Dev\SapphireTest;
6+
7+
/**
8+
* Abstract class for field tests
9+
*/
10+
11+
abstract class AbstractFieldTest extends SapphireTest
12+
{
13+
14+
protected $usesDatabase = false;
15+
16+
protected function performDataListTest($field, $options) {
17+
18+
$field->setDatalist( $options );
19+
$template = $field->FieldHolder();
20+
21+
libxml_use_internal_errors(true);
22+
$doc = new \DOMDocument();
23+
$doc->loadHTML($template);
24+
libxml_clear_errors();
25+
$datalist = $doc->getElementsByTagName('datalist')[0];
26+
$this->assertTrue($datalist->hasAttribute('id'), "<datalist> has id attribute");
27+
28+
$option = $datalist->getElementsByTagName('option');
29+
$this->assertEquals( count($options), $option->length);
30+
31+
}
32+
33+
}

0 commit comments

Comments
 (0)