Skip to content

Commit 752036f

Browse files
committed
feat(pat-date-picker): Add placeholder support for styled behavior.
/cc @cornae This fixes the following two issues: Fixes: #837 Fixes: quaive/ploneintranet.prototype#1289
1 parent fcfdb84 commit 752036f

File tree

3 files changed

+96
-28
lines changed

3 files changed

+96
-28
lines changed

src/pat/date-picker/date-picker.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export default Base.extend({
9595
);
9696
}
9797

98-
let display_el_pat;
98+
let pat_display_time;
9999
if (this.options.outputFormat) {
100100
const PatDisplayTime = (await import("../display-time/display-time")).default; // prettier-ignore
101101
const display_time_config = { format: this.format };
@@ -105,23 +105,39 @@ export default Base.extend({
105105
if (this.options.locale) {
106106
display_time_config.locale = this.options.locale;
107107
}
108-
display_el_pat = new PatDisplayTime(display_el, display_time_config);
109-
} else {
108+
pat_display_time = new PatDisplayTime(display_el, display_time_config);
109+
} else if (this.el.value) {
110110
display_el.textContent = el.value;
111111
}
112112

113-
$(display_el).on("init.display-time.patterns", () =>
114-
this.add_clear_button(display_el)
115-
);
113+
// Add the additional elements "clear button" and placeholder to
114+
// the `<time>` element.
115+
const _add_additional = () => {
116+
this.add_clear_button(display_el);
117+
if (!this.el.value && this.el.placeholder) {
118+
display_el.innerHTML = `<span class="placeholder">${this.el.placeholder}</span>`;
119+
}
120+
};
121+
if (pat_display_time) {
122+
// Add the additional elements after display time has
123+
// eventually cleared the contents or done any other changes.
124+
$(display_el).on("init.display-time.patterns", () => {
125+
_add_additional();
126+
});
127+
} else {
128+
// If no `pat-display-time` was used, add immediately.
129+
_add_additional();
130+
}
116131

117132
this.el.addEventListener("change", () => {
118133
display_el.setAttribute("datetime", this.el.value);
119-
if (display_el_pat) {
120-
display_el_pat.format();
134+
if (pat_display_time && this.el.value) {
135+
pat_display_time.format();
121136
} else {
137+
//} else if (this.el.value) {
122138
display_el.textContent = this.el.value;
123139
}
124-
this.add_clear_button(display_el);
140+
_add_additional();
125141
});
126142

127143
if (disabled) {

src/pat/date-picker/date-picker.test.js

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,31 @@ const mock_fetch_i18n = () =>
3737
}),
3838
});
3939

40+
const select_date = (el, date) => {
41+
// Attention! Just select today.
42+
// Scrolling calendar pages forward and backwards is not supported yet.
43+
el.click();
44+
45+
const day = date.getDate().toString();
46+
const month = date.getMonth().toString(); // remember, month-count starts from 0
47+
const year = date.getFullYear().toString();
48+
49+
const cur_year = document.querySelector('.pika-lendar .pika-select-year option[selected="selected"]'); // prettier-ignore
50+
expect(cur_year.textContent).toBe(year);
51+
52+
const cur_month = document.querySelector('.pika-lendar .pika-select-month option[selected="selected"]'); // prettier-ignore
53+
expect(cur_month.value).toBe(month);
54+
55+
const cur_day = document.querySelector(".pika-lendar td.is-today button"); // prettier-ignore
56+
expect(cur_day.getAttribute("data-pika-day")).toBe(day);
57+
58+
const cur_wkday = document.querySelector(".pika-lendar th:first-child abbr"); // prettier-ignore
59+
expect(cur_wkday.textContent).toBe("Sun");
60+
61+
// select current day.
62+
cur_day.dispatchEvent(new Event("mousedown"));
63+
};
64+
4065
describe("pat-date-picker", function () {
4166
afterEach(function () {
4267
document.body.innerHTML = "";
@@ -57,28 +82,10 @@ describe("pat-date-picker", function () {
5782
expect(el.getAttribute("type")).toBe("date");
5883
expect(el.style.display).toBe("none");
5984

60-
display_el.click();
61-
6285
const date = new Date();
63-
const day = date.getDate().toString();
64-
const month = date.getMonth().toString(); // remember, month-count starts from 0
65-
const year = date.getFullYear().toString();
6686
const isodate = utils.localized_isodate(date);
87+
select_date(display_el, date);
6788

68-
const cur_year = document.querySelector('.pika-lendar .pika-select-year option[selected="selected"]'); // prettier-ignore
69-
expect(cur_year.textContent).toBe(year);
70-
71-
const cur_month = document.querySelector('.pika-lendar .pika-select-month option[selected="selected"]'); // prettier-ignore
72-
expect(cur_month.value).toBe(month);
73-
74-
const cur_day = document.querySelector(".pika-lendar td.is-today button"); // prettier-ignore
75-
expect(cur_day.getAttribute("data-pika-day")).toBe(day);
76-
77-
const cur_wkday = document.querySelector(".pika-lendar th:first-child abbr"); // prettier-ignore
78-
expect(cur_wkday.textContent).toBe("Sun");
79-
80-
// select current day.
81-
cur_day.dispatchEvent(new Event("mousedown"));
8289
// <time> element should contains the current date in iso format
8390
expect(display_el.textContent).toBe(isodate);
8491
// input element contains iso date
@@ -618,4 +625,41 @@ describe("pat-date-picker", function () {
618625
// There should be a error message from pat-validation.
619626
expect(form.querySelectorAll("em.warning").length).toBe(1);
620627
});
628+
629+
it("15 - Placeholder support.", async () => {
630+
document.body.innerHTML = `
631+
<input
632+
type="date"
633+
class="pat-date-picker"
634+
placeholder="Select a date"
635+
/>`;
636+
const el = document.querySelector("input[type=date]");
637+
new pattern(el);
638+
await utils.timeout(1); // wait a tick for async to settle.
639+
640+
const display_el = document.querySelector("time");
641+
expect(display_el).toBeTruthy();
642+
expect(display_el.textContent).toBe("Select a date");
643+
expect(el.value).toBe("");
644+
645+
const date = new Date();
646+
const isodate = utils.localized_isodate(date);
647+
select_date(display_el, date);
648+
649+
// <time> element should contains the current date in iso format
650+
expect(display_el.textContent).toBe(isodate);
651+
// input element contains iso date
652+
expect(el.value).toBe(isodate);
653+
654+
// Clear button is availale
655+
let clear_button = display_el.querySelector(".cancel-button");
656+
expect(clear_button).toBeTruthy();
657+
658+
clear_button.click();
659+
660+
// <time> element should contain the placeholder again
661+
expect(display_el.textContent).toBe("Select a date");
662+
// input element should be empty
663+
expect(el.value).toBe("");
664+
});
621665
});

src/pat/date-picker/index.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@
7575
</label>
7676
<br />
7777

78+
<label>Placeholder support.
79+
<input
80+
class="pat-date-picker"
81+
type="date"
82+
placeholder="YYYY-MM-DD"
83+
/>
84+
</label>
85+
<br />
7886

7987
<label
8088
>Show the week number.

0 commit comments

Comments
 (0)