Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(input-time-picker)!: localization support for input-time-picker #3354

Merged
merged 80 commits into from
Dec 8, 2021
Merged
Show file tree
Hide file tree
Changes from 61 commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
17fb49b
first commit: breaking out time format logic into a new isValidTime u…
eriklharper Jul 27, 2021
edb145a
localizing the input
eriklharper Jul 30, 2021
83615b7
fixing up tests based on last changes
eriklharper Jul 31, 2021
e95e1fd
updating demo files to include a more comprehensive list of locales
eriklharper Aug 11, 2021
dc35e5c
adding locales to demo
eriklharper Aug 12, 2021
0d1b711
setting up to refactor time-picker to store its value in a regular va…
eriklharper Aug 17, 2021
7811a99
localizing time parts on initial page load in time-picker
eriklharper Aug 18, 2021
347a9e4
stop passing hour, minute and second props and rely on value instead
eriklharper Aug 20, 2021
31c43a0
converting h, m and s from props to state
eriklharper Aug 20, 2021
9538c0c
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Aug 20, 2021
a319095
fixing input blur behavior
eriklharper Aug 23, 2021
aaeaa65
adding conditional seconds formatting
eriklharper Aug 24, 2021
5d64aa9
localizing hour, minute, second and meridiem inside time-picker with …
eriklharper Aug 26, 2021
db58ada
fixing null setting of localizedMeridiem
eriklharper Aug 26, 2021
be5c156
removing h, m, s property watchers and timeChanged prop since they're…
eriklharper Aug 26, 2021
4f40414
restoring original demo page with a css grid layout for locales
eriklharper Aug 27, 2021
65e58a0
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Aug 27, 2021
53e076f
fixing change event bugs
eriklharper Aug 31, 2021
ccc9f1d
deprecating hourDisplayFormat prop in favor of internal hourCycle sta…
eriklharper Sep 2, 2021
377197e
fixing a few bugs and responding to locale prop changes
eriklharper Sep 4, 2021
789950e
demo with all locales
eriklharper Sep 4, 2021
4f51f72
setting up data for displaying time part suffixes
eriklharper Sep 8, 2021
9530e9e
fixing retrieval logic for localizedSecondSuffix
eriklharper Sep 8, 2021
47abf06
supporting localized time suffixes and tailwinding the css
eriklharper Sep 8, 2021
a2975fd
removing a console log and uncessary relative style
eriklharper Sep 8, 2021
4b3037e
renaming setValue to setValuePart, cleaning up unused imports
eriklharper Sep 8, 2021
67e6bb6
new setValue function that can be called from connectedCallback, valu…
eriklharper Sep 9, 2021
aeeca48
alphabetizing demo locales and adding missing ones from AGO official …
eriklharper Sep 9, 2021
c5e9078
adding some more locales
eriklharper Sep 9, 2021
866ed56
suping up the demo page with a locale switcher
eriklharper Sep 9, 2021
6b8748e
adjusting padding of trailing literal based on html direction
eriklharper Sep 10, 2021
a2ece67
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Sep 10, 2021
ff06213
fixing invalid time bug in demo and spiffing up the demo page more wi…
eriklharper Sep 10, 2021
b8224f8
adding labels to demo for future label support
eriklharper Sep 10, 2021
ee6f905
refactoring trailing time literal padding to use css custom property …
eriklharper Sep 11, 2021
d1b9366
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Sep 21, 2021
ca205aa
reverting unnecessary merge diffs
eriklharper Sep 21, 2021
3435be5
fixing meridiem down button test and clearing console warnings
eriklharper Sep 22, 2021
7a6bdbb
adding timepickerchange event logging to demo page for helpful debugging
eriklharper Sep 22, 2021
f985631
refactoring formatTimeString to format both with and without seconds
eriklharper Sep 29, 2021
66bc0c3
refactoring formatTimeString to return hh:mm in addition to hh:mm:ss …
eriklharper Oct 7, 2021
7482ad2
Merge branch 'eriklharper/1475-l10n-time-picker' of github.com:Esri/c…
eriklharper Oct 7, 2021
b05f8b4
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Oct 15, 2021
3c33a5c
fixing bug where tile-select wasn't properly styling blurred items
eriklharper Oct 18, 2021
7d7e1b4
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Oct 21, 2021
102bd49
Merge branch 'eriklharper/1475-l10n-time-picker' of github.com:Esri/c…
eriklharper Oct 21, 2021
b1088f6
fixing some broken tests
eriklharper Oct 23, 2021
50dbf41
Merge branch 'eriklharper/1475-l10n-time-picker' of github.com:Esri/c…
eriklharper Oct 23, 2021
67a5e3f
getting all the tests to pass except accessible
eriklharper Oct 25, 2021
f1c8d70
more test fixes
eriklharper Oct 27, 2021
1685a0b
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Oct 27, 2021
692c9c8
renaming locale to lang
eriklharper Oct 28, 2021
f263ba9
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Oct 29, 2021
4a53868
converting locale to state
eriklharper Nov 3, 2021
0b40b49
Merge branch 'master' into eriklharper/1475-l10n-time-picker
benelan Nov 3, 2021
9fa4767
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Nov 3, 2021
3a2c8ff
observing lang attribute mutations
eriklharper Nov 3, 2021
1567246
Merge branch 'eriklharper/1475-l10n-time-picker' of github.com:Esri/c…
eriklharper Nov 3, 2021
fe0cee3
fixing broken tests
eriklharper Nov 4, 2021
7bdd471
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Nov 5, 2021
87a430b
refactoring away from using a mutation observer to sync changes with …
eriklharper Nov 5, 2021
41d710d
setting locale property instead of attribute in demo page [skip ci]
eriklharper Nov 8, 2021
0da0bb4
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Nov 8, 2021
6001795
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Nov 10, 2021
0cd7463
adding back demo locales asset
eriklharper Nov 10, 2021
b051ee1
some review changes
eriklharper Nov 10, 2021
0ebc774
switching to getting new value from target instead of event detail
eriklharper Nov 10, 2021
91907a0
asserting on value for time-picker test in addition to span content
eriklharper Nov 10, 2021
063f71e
Fixing change handler to set the event target to the time-picker elem…
eriklharper Nov 11, 2021
57c61ce
replacing span rules with more targeted css classes
eriklharper Nov 11, 2021
f6c02e4
adding internal jsdoc to locale in time-picker
eriklharper Nov 15, 2021
c652643
time util review changes
eriklharper Nov 15, 2021
5eef29b
refactoring buttonActivated based on review
eriklharper Nov 15, 2021
960c60f
drying up showSeconds value setting
eriklharper Nov 16, 2021
d8dd7c3
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Nov 16, 2021
0b57121
reverting unrelated tile-select fix in favor of separate pr #3187
eriklharper Nov 16, 2021
b1d97c4
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Dec 6, 2021
e9f0d5f
setting refs with class methods
eriklharper Dec 7, 2021
1b36dac
getting accessible test to pass without setting any props, and other …
eriklharper Dec 8, 2021
87c8eb5
Merge branch 'master' of github.com:Esri/calcite-components into erik…
eriklharper Dec 8, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { newE2EPage } from "@stencil/core/testing";
import { accessible, defaults, focusable, labelable, reflects, renders } from "../../tests/commonTests";
import { formatTimePart, getMeridiem } from "../../utils/time";
import { localizeTimeString } from "../../utils/time";

describe("calcite-input-time-picker", () => {
it("renders", async () => renders("calcite-input-time-picker", { display: "inline-block" }));
Expand Down Expand Up @@ -58,210 +58,96 @@ describe("calcite-input-time-picker", () => {
expect(await popover.getProperty("open")).toBe(true);
});

it("changing hour, minute and second values reflects in the input, input-time-picker and time-picker for 24-hour display format", async () => {
it("programmatically changing the value reflects in the input for fr lang (24-hour)", async () => {
const lang = "fr";
const page = await newE2EPage({
html: `<calcite-input-time-picker hour-display-format="24" step="1"></calcite-input-time-picker>`
html: `<calcite-input-time-picker lang="${lang}"" step="1"></calcite-input-time-picker>`
});

const inputTimePicker = await page.find("calcite-input-time-picker");
const input = await page.find("calcite-input-time-picker >>> calcite-input");
const timePicker = await page.find("calcite-input-time-picker >>> calcite-time-picker");

for (let second = 0; second < 10; second++) {
const date = new Date(0);
date.setSeconds(second);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedInputValue = localizeTimeString(expectedValue, lang);

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");

expect(inputValue).toBe(expectedValue);
expect(inputValue).toBe(expectedInputValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}

for (let minute = 0; minute < 10; minute++) {
const date = new Date(0);
date.setMinutes(minute);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedInputValue = localizeTimeString(expectedValue, lang);

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");

expect(inputValue).toBe(expectedValue);
expect(inputValue).toBe(expectedInputValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}

for (let hour = 0; hour < 10; hour++) {
const date = new Date(0);
date.setHours(hour);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedInputValue = localizeTimeString(expectedValue, lang);

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");

expect(inputValue).toBe(expectedValue);
expect(inputValue).toBe(expectedInputValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}
});

it("changing hour, minute and second values reflects in the input, input-time-picker and time-picker for 12-hour display format", async () => {
it("programmatically changing the value reflects in the input for en lang (12-hour)", async () => {
eriklharper marked this conversation as resolved.
Show resolved Hide resolved
const lang = "en";
const page = await newE2EPage({
html: `<calcite-input-time-picker hour-display-format="12" step="1"></calcite-input-time-picker>`
html: `<calcite-input-time-picker step="1"></calcite-input-time-picker>`
});

const inputTimePicker = await page.find("calcite-input-time-picker");
const input = await page.find("calcite-input-time-picker >>> calcite-input");
const timePicker = await page.find("calcite-input-time-picker >>> calcite-time-picker");

for (let second = 0; second < 10; second++) {
const date = new Date(0);
date.setSeconds(second);
const date = new Date(0);
date.setHours(13);
date.setMinutes(59);
date.setSeconds(59);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedHourAsNumber = parseInt(expectedValue.substr(0, 2));
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedDisplayHour =
expectedHourAsNumber > 12
? formatTimePart(expectedHourAsNumber - 12)
: expectedHourAsNumber === 0
? "12"
: formatTimePart(expectedHourAsNumber);
const expectedDisplayValue = `${expectedDisplayHour}:${expectedMinute}:${expectedSecond} ${getMeridiem(
expectedHour
)}`;
const expectedValue = date.toISOString().substr(11, 8);
const expectedDisplayValue = localizeTimeString(expectedValue, lang);

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");

expect(inputValue).toBe(expectedDisplayValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}
inputTimePicker.setProperty("value", expectedValue);

for (let minute = 0; minute < 10; minute++) {
const date = new Date(0);
date.setMinutes(minute);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedHourAsNumber = parseInt(expectedValue.substr(0, 2));
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedDisplayHour =
expectedHourAsNumber > 12
? formatTimePart(expectedHourAsNumber - 12)
: expectedHourAsNumber === 0
? "12"
: formatTimePart(expectedHourAsNumber);
const expectedDisplayValue = `${expectedDisplayHour}:${expectedMinute}:${expectedSecond} ${getMeridiem(
expectedHour
)}`;

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");

expect(inputValue).toBe(expectedDisplayValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}

for (let hour = 0; hour < 10; hour++) {
const date = new Date(0);
date.setHours(hour);

const expectedValue = date.toISOString().substr(11, 8);
const expectedHour = expectedValue.substr(0, 2);
const expectedHourAsNumber = parseInt(expectedValue.substr(0, 2));
const expectedMinute = expectedValue.substr(3, 2);
const expectedSecond = expectedValue.substr(6, 2);
const expectedDisplayHour =
expectedHourAsNumber > 12
? formatTimePart(expectedHourAsNumber - 12)
: expectedHourAsNumber === 0
? "12"
: formatTimePart(expectedHourAsNumber);
const expectedDisplayValue = `${expectedDisplayHour}:${expectedMinute}:${expectedSecond} ${getMeridiem(
expectedHour
)}`;

inputTimePicker.setProperty("value", expectedValue);

await page.waitForChanges();
await page.waitForChanges();

const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");
const timePickerHourValue = await timePicker.getProperty("hour");
const timePickerMinuteValue = await timePicker.getProperty("minute");
const timePickerSecondValue = await timePicker.getProperty("second");
const inputValue = await input.getProperty("value");
const inputTimePickerValue = await inputTimePicker.getProperty("value");

expect(inputValue).toBe(expectedDisplayValue);
expect(inputTimePickerValue).toBe(expectedValue);
expect(timePickerHourValue).toBe(expectedHour);
expect(timePickerMinuteValue).toBe(expectedMinute);
expect(timePickerSecondValue).toBe(expectedSecond);
}
expect(inputValue).toBe(expectedDisplayValue);
expect(inputTimePickerValue).toBe(expectedValue);
});

it("appropriately triggers calciteInputTimePickerChange event when the user types a value", async () => {
Expand Down Expand Up @@ -326,4 +212,13 @@ describe("calcite-input-time-picker", () => {

expect(await inputTimePicker.getProperty("value")).toBe("14:59");
});

it("sets initial value to undefined when it is not a valid time value", async () => {
const page = await newE2EPage({
html: `<calcite-input-time-picker value="invalid"></calcite-input-time-picker>`
});
const inputTimePicker = await page.find("calcite-input-time-picker");

expect(await inputTimePicker.getProperty("value")).toBeUndefined();
jcfranco marked this conversation as resolved.
Show resolved Hide resolved
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ export const LightTheme = (): string => html`
<calcite-input-time-picker
${boolean("disabled", false)}
${boolean("hidden", false)}
hour-display-format="${select("hour-display-format", ["12", "24"], "12")}"
name="${text("name", "light")}"
scale="${select("scale", ["s", "m", "l"], "m")}"
step="${number("step", 1)}"
Expand All @@ -30,7 +29,6 @@ export const DarkTheme = (): string => html`
${boolean("disabled", false)}
${boolean("hidden", false)}
class="calcite-theme-dark"
hour-display-format="${select("hour-display-format", ["12", "24"], "12")}"
name="${text("name", "dark")}"
scale="${select("scale", ["s", "m", "l"], "m")}"
step="${number("step", 1)}"
Expand Down
Loading