@dhis2-ui/calendar 8.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. package/README.md +10 -0
  2. package/build/cjs/__e2e__/calendarInput.stories.e2e.js +58 -0
  3. package/build/cjs/calendar/calendar-prop-types.js +24 -0
  4. package/build/cjs/calendar/calendar-table-cell.js +55 -0
  5. package/build/cjs/calendar/calendar-table-days-header.js +40 -0
  6. package/build/cjs/calendar/calendar-table.js +57 -0
  7. package/build/cjs/calendar/index.js +93 -0
  8. package/build/cjs/calendar/navigation-container.js +134 -0
  9. package/build/cjs/calendar-input/index.js +117 -0
  10. package/build/cjs/features/supports_ethiopic_calendar/supports_ethiopic_calendar.js +39 -0
  11. package/build/cjs/features/supports_ethiopic_calendar.feature +19 -0
  12. package/build/cjs/features/supports_gregorian_calendar/supports_gregorian_calendar.js +39 -0
  13. package/build/cjs/features/supports_gregorian_calendar.feature +19 -0
  14. package/build/cjs/features/supports_islamic_calendar/supports_islamic_calendar.js +18 -0
  15. package/build/cjs/features/supports_islamic_calendar.feature +5 -0
  16. package/build/cjs/features/supports_nepali_calendar/supports_nepali_calendar.js +42 -0
  17. package/build/cjs/features/supports_nepali_calendar.feature +19 -0
  18. package/build/cjs/index.js +21 -0
  19. package/build/cjs/locales/en/translations.json +4 -0
  20. package/build/cjs/locales/index.js +27 -0
  21. package/build/cjs/stories/calendar.stories.js +66 -0
  22. package/build/cjs/stories/calendarInput.stories.js +107 -0
  23. package/build/cjs/stories/calendarStoryWrapper.js +196 -0
  24. package/build/es/__e2e__/calendarInput.stories.e2e.js +6 -0
  25. package/build/es/calendar/calendar-prop-types.js +13 -0
  26. package/build/es/calendar/calendar-table-cell.js +39 -0
  27. package/build/es/calendar/calendar-table-days-header.js +25 -0
  28. package/build/es/calendar/calendar-table.js +40 -0
  29. package/build/es/calendar/index.js +71 -0
  30. package/build/es/calendar/navigation-container.js +116 -0
  31. package/build/es/calendar-input/index.js +95 -0
  32. package/build/es/features/supports_ethiopic_calendar/supports_ethiopic_calendar.js +36 -0
  33. package/build/es/features/supports_ethiopic_calendar.feature +19 -0
  34. package/build/es/features/supports_gregorian_calendar/supports_gregorian_calendar.js +36 -0
  35. package/build/es/features/supports_gregorian_calendar.feature +19 -0
  36. package/build/es/features/supports_islamic_calendar/supports_islamic_calendar.js +15 -0
  37. package/build/es/features/supports_islamic_calendar.feature +5 -0
  38. package/build/es/features/supports_nepali_calendar/supports_nepali_calendar.js +39 -0
  39. package/build/es/features/supports_nepali_calendar.feature +19 -0
  40. package/build/es/index.js +2 -0
  41. package/build/es/locales/en/translations.json +4 -0
  42. package/build/es/locales/index.js +13 -0
  43. package/build/es/stories/calendar.stories.js +44 -0
  44. package/build/es/stories/calendarInput.stories.js +84 -0
  45. package/build/es/stories/calendarStoryWrapper.js +176 -0
  46. package/package.json +53 -0
@@ -0,0 +1,40 @@
1
+ import _JSXStyle from "styled-jsx/style";
2
+ import { spacers } from '@dhis2/ui-constants';
3
+ import PropTypes from 'prop-types';
4
+ import React from 'react';
5
+ import { CalendarTableCell } from './calendar-table-cell.js';
6
+ import { CalendarTableDaysHeader } from './calendar-table-days-header.js';
7
+ export const CalendarTable = _ref => {
8
+ let {
9
+ weekDayLabels,
10
+ calendarWeekDays,
11
+ width,
12
+ cellSize
13
+ } = _ref;
14
+ return /*#__PURE__*/React.createElement("div", {
15
+ className: _JSXStyle.dynamic([["452536960", [spacers.dp4, spacers.dp4]]]) + " " + "calendar-table-wrapper"
16
+ }, /*#__PURE__*/React.createElement("table", {
17
+ className: _JSXStyle.dynamic([["452536960", [spacers.dp4, spacers.dp4]]]) + " " + "calendar-table"
18
+ }, /*#__PURE__*/React.createElement(CalendarTableDaysHeader, {
19
+ weekDayLabels: weekDayLabels
20
+ }), /*#__PURE__*/React.createElement("tbody", {
21
+ className: _JSXStyle.dynamic([["452536960", [spacers.dp4, spacers.dp4]]])
22
+ }, calendarWeekDays.map((week, weekIndex) => /*#__PURE__*/React.createElement("tr", {
23
+ key: "week-".concat(weekIndex + 1),
24
+ className: _JSXStyle.dynamic([["452536960", [spacers.dp4, spacers.dp4]]])
25
+ }, week.map(day => /*#__PURE__*/React.createElement(CalendarTableCell, {
26
+ day: day,
27
+ key: day === null || day === void 0 ? void 0 : day.calendarDate,
28
+ cellSize: cellSize,
29
+ width: width
30
+ })))))), /*#__PURE__*/React.createElement(_JSXStyle, {
31
+ id: "452536960",
32
+ dynamic: [spacers.dp4, spacers.dp4]
33
+ }, [".calendar-table.__jsx-style-dynamic-selector{border:none;border-collapse:collapse;width:100%;margin-block:".concat(spacers.dp4, ";}"), ".calendar-table.__jsx-style-dynamic-selector tr.__jsx-style-dynamic-selector,.calendar-table.__jsx-style-dynamic-selector td.__jsx-style-dynamic-selector{border:none;}", ".calendar-table-wrapper.__jsx-style-dynamic-selector{padding-inline:".concat(spacers.dp4, ";}")]));
34
+ };
35
+ CalendarTable.propTypes = {
36
+ calendarWeekDays: PropTypes.arrayOf(PropTypes.string),
37
+ cellSize: PropTypes.string,
38
+ weekDayLabels: PropTypes.arrayOf(PropTypes.string),
39
+ width: PropTypes.string
40
+ };
@@ -0,0 +1,71 @@
1
+ import _JSXStyle from "styled-jsx/style";
2
+ import { useDatePicker, useResolvedDirection } from '@dhis2/multi-calendar-dates';
3
+ import { colors } from '@dhis2/ui-constants';
4
+ import React, { useState } from 'react';
5
+ import { CalendarProps } from './calendar-prop-types.js';
6
+ import { CalendarTable } from './calendar-table.js';
7
+ import { NavigationContainer } from './navigation-container.js';
8
+ export const Calendar = _ref => {
9
+ let {
10
+ onDateSelect,
11
+ calendar,
12
+ date,
13
+ dir,
14
+ locale,
15
+ numberingSystem,
16
+ weekDayFormat,
17
+ timeZone,
18
+ width,
19
+ cellSize
20
+ } = _ref;
21
+ const wrapperBorderColor = colors.grey300;
22
+ const backgroundColor = 'none';
23
+ const [selectedDateString, setSelectedDateString] = useState(date);
24
+ const languageDirection = useResolvedDirection(dir, locale);
25
+ const options = {
26
+ locale,
27
+ calendar,
28
+ timeZone,
29
+ numberingSystem,
30
+ weekDayFormat
31
+ };
32
+ const pickerOptions = useDatePicker({
33
+ onDateSelect: result => {
34
+ const {
35
+ calendarDateString
36
+ } = result;
37
+ setSelectedDateString(calendarDateString);
38
+ onDateSelect(result);
39
+ },
40
+ date: selectedDateString,
41
+ options
42
+ });
43
+ const {
44
+ calendarWeekDays,
45
+ weekDayLabels
46
+ } = pickerOptions;
47
+ return /*#__PURE__*/React.createElement("div", {
48
+ className: _JSXStyle.dynamic([["2823859047", [backgroundColor, wrapperBorderColor, width]]])
49
+ }, /*#__PURE__*/React.createElement("div", {
50
+ dir: languageDirection,
51
+ "data-test": "calendar",
52
+ className: _JSXStyle.dynamic([["2823859047", [backgroundColor, wrapperBorderColor, width]]]) + " " + "calendar-wrapper"
53
+ }, /*#__PURE__*/React.createElement(NavigationContainer, {
54
+ pickerOptions: pickerOptions,
55
+ languageDirection: languageDirection
56
+ }), /*#__PURE__*/React.createElement(CalendarTable, {
57
+ calendarWeekDays: calendarWeekDays,
58
+ weekDayLabels: weekDayLabels,
59
+ cellSize: cellSize,
60
+ width: width
61
+ })), /*#__PURE__*/React.createElement(_JSXStyle, {
62
+ id: "2823859047",
63
+ dynamic: [backgroundColor, wrapperBorderColor, width]
64
+ }, [".calendar-wrapper.__jsx-style-dynamic-selector{font-family:Roboto,sans-serif;font-weight:400;font-size:14px;background-color:".concat(backgroundColor, ";display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;border:1px solid ").concat(wrapperBorderColor, ";border-radius:3px;min-width:").concat(width, ";width:-webkit-max-content;width:-moz-max-content;width:max-content;box-shadow:0px 4px 6px -2px #2129340d;box-shadow:0px 10px 15px -3px #2129341a;}")]));
65
+ };
66
+ Calendar.defaultProps = {
67
+ cellSize: '32px',
68
+ width: '240px',
69
+ weekDayFormat: 'narrow'
70
+ };
71
+ Calendar.propTypes = CalendarProps;
@@ -0,0 +1,116 @@
1
+ import _JSXStyle from "styled-jsx/style";
2
+ import { colors, spacers } from '@dhis2/ui-constants';
3
+ import { IconChevronLeft16, IconChevronRight16 } from '@dhis2/ui-icons';
4
+ import PropTypes from 'prop-types';
5
+ import React from 'react';
6
+ import i18n from '../locales/index.js';
7
+ const chevronColor = colors.grey600;
8
+ const wrapperBorderColor = colors.grey300;
9
+ const headerBackground = colors.grey050;
10
+ export const NavigationContainer = _ref => {
11
+ let {
12
+ languageDirection,
13
+ pickerOptions
14
+ } = _ref;
15
+ const PreviousIcon = languageDirection === 'ltr' ? IconChevronLeft16 : IconChevronRight16;
16
+ const NextIcon = languageDirection === 'ltr' ? IconChevronRight16 : IconChevronLeft16;
17
+ const {
18
+ currMonth,
19
+ currYear,
20
+ nextMonth,
21
+ nextYear,
22
+ prevMonth,
23
+ prevYear
24
+ } = pickerOptions;
25
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
26
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "navigation-container"
27
+ }, /*#__PURE__*/React.createElement("div", {
28
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "month"
29
+ }, /*#__PURE__*/React.createElement("div", {
30
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "prev"
31
+ }, /*#__PURE__*/React.createElement("button", {
32
+ onClick: prevMonth.navigateTo,
33
+ name: "previous-month",
34
+ "data-test": "calendar-previous-month",
35
+ "aria-label": "".concat(i18n.t("Go to ".concat(prevMonth.label))),
36
+ type: "button",
37
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
38
+ }, /*#__PURE__*/React.createElement(PreviousIcon, {
39
+ color: chevronColor,
40
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
41
+ }))), /*#__PURE__*/React.createElement("div", {
42
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "curr"
43
+ }, /*#__PURE__*/React.createElement("span", {
44
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "label"
45
+ }, currMonth.label)), /*#__PURE__*/React.createElement("div", {
46
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "next"
47
+ }, /*#__PURE__*/React.createElement("button", {
48
+ onClick: nextMonth.navigateTo,
49
+ "data-test": "calendar-next-month",
50
+ name: "next-month",
51
+ "aria-label": "".concat(i18n.t("Go to ".concat(nextMonth.label))),
52
+ type: "button",
53
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
54
+ }, /*#__PURE__*/React.createElement(NextIcon, {
55
+ color: chevronColor,
56
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
57
+ })))), /*#__PURE__*/React.createElement("div", {
58
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "year"
59
+ }, /*#__PURE__*/React.createElement("div", {
60
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "prev"
61
+ }, /*#__PURE__*/React.createElement("button", {
62
+ onClick: prevYear.navigateTo,
63
+ name: "previous-year",
64
+ "aria-label": "".concat(i18n.t('Go to previous year')),
65
+ type: "button",
66
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
67
+ }, /*#__PURE__*/React.createElement(PreviousIcon, {
68
+ color: chevronColor,
69
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
70
+ }))), /*#__PURE__*/React.createElement("div", {
71
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "curr"
72
+ }, /*#__PURE__*/React.createElement("span", {
73
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "label"
74
+ }, currYear.label)), /*#__PURE__*/React.createElement("div", {
75
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]]) + " " + "next"
76
+ }, /*#__PURE__*/React.createElement("button", {
77
+ onClick: nextYear.navigateTo,
78
+ name: "next-year",
79
+ "aria-label": "".concat(i18n.t('Go to next year')),
80
+ type: "button",
81
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
82
+ }, /*#__PURE__*/React.createElement(NextIcon, {
83
+ color: chevronColor,
84
+ className: _JSXStyle.dynamic([["4112940194", [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]]])
85
+ }))))), /*#__PURE__*/React.createElement(_JSXStyle, {
86
+ id: "4112940194",
87
+ dynamic: [spacers.dp4, colors.grey200, spacers.dp36, spacers.dp8, spacers.dp4, wrapperBorderColor, headerBackground]
88
+ }, ["button.__jsx-style-dynamic-selector{background:none;border:0;}", ".month.__jsx-style-dynamic-selector,.year.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}", ".month.__jsx-style-dynamic-selector .curr.__jsx-style-dynamic-selector,.year.__jsx-style-dynamic-selector .curr.__jsx-style-dynamic-selector{-webkit-flex:2;-ms-flex:2;flex:2;white-space:nowrap;}", ".prev.__jsx-style-dynamic-selector,.next.__jsx-style-dynamic-selector{-webkit-flex:1;-ms-flex:1;flex:1;text-align:center;}", ".prev.__jsx-style-dynamic-selector button.__jsx-style-dynamic-selector,.next.__jsx-style-dynamic-selector button.__jsx-style-dynamic-selector{padding:".concat(spacers.dp4, ";}"), ".prev.__jsx-style-dynamic-selector:hover button.__jsx-style-dynamic-selector,.next.__jsx-style-dynamic-selector:hover button.__jsx-style-dynamic-selector{background-color:".concat(colors.grey200, ";cursor:pointer;}"), ".label.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:4px 8px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-height:16px;}", ".navigation-container.__jsx-style-dynamic-selector{height:".concat(spacers.dp36, ";gap:").concat(spacers.dp8, ";padding:").concat(spacers.dp4, ";display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;border-bottom:1px solid ").concat(wrapperBorderColor, ";background-color:").concat(headerBackground, ";font-size:1.08em;}")]));
89
+ };
90
+ NavigationContainer.propTypes = {
91
+ languageDirection: PropTypes.oneOf(['ltr', 'rtl']),
92
+ pickerOptions: PropTypes.shape({
93
+ currMonth: PropTypes.shape({
94
+ label: PropTypes.string
95
+ }),
96
+ currYear: PropTypes.shape({
97
+ label: PropTypes.string
98
+ }),
99
+ nextMonth: PropTypes.shape({
100
+ label: PropTypes.string,
101
+ navigateTo: PropTypes.func
102
+ }),
103
+ nextYear: PropTypes.shape({
104
+ label: PropTypes.string,
105
+ navigateTo: PropTypes.func
106
+ }),
107
+ prevMonth: PropTypes.shape({
108
+ label: PropTypes.string,
109
+ navigateTo: PropTypes.func
110
+ }),
111
+ prevYear: PropTypes.shape({
112
+ label: PropTypes.string,
113
+ navigateTo: PropTypes.func
114
+ })
115
+ })
116
+ };
@@ -0,0 +1,95 @@
1
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ import { Card } from '@dhis2-ui/card';
4
+ import { InputField, InputFieldProps } from '@dhis2-ui/input';
5
+ import { Layer } from '@dhis2-ui/layer';
6
+ import { Popper } from '@dhis2-ui/popper';
7
+ import { getNowInCalendar } from '@dhis2/multi-calendar-dates';
8
+ import React, { useRef, useState } from 'react';
9
+ import { CalendarProps } from '../calendar/calendar-prop-types.js';
10
+ import { Calendar } from '../calendar/index.js';
11
+
12
+ const padWithZeroes = function (number) {
13
+ let count = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
14
+ return String(number).padStart(count, '0');
15
+ };
16
+
17
+ const offsetModifier = {
18
+ name: 'offset',
19
+ options: {
20
+ offset: [0, 2]
21
+ }
22
+ };
23
+ export const CalendarInput = function () {
24
+ let {
25
+ onDateSelect,
26
+ calendar,
27
+ date,
28
+ dir,
29
+ locale,
30
+ numberingSystem,
31
+ weekDayFormat,
32
+ timeZone,
33
+ width,
34
+ cellSize,
35
+ ...rest
36
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
37
+ const ref = useRef();
38
+ const [open, setOpen] = useState(false);
39
+ const currentDate = getNowInCalendar(calendar, timeZone);
40
+ const initialDate = date || "".concat(currentDate.eraYear || currentDate.year, "-").concat(padWithZeroes(currentDate.month), "-").concat(padWithZeroes(currentDate.day));
41
+ const [value, setValue] = useState(initialDate);
42
+ const calendarProps = React.useMemo(() => {
43
+ const onDateSelectWrapper = selectedDate => {
44
+ const {
45
+ calendarDateString
46
+ } = selectedDate;
47
+ setValue(calendarDateString);
48
+ setOpen(false);
49
+ onDateSelect === null || onDateSelect === void 0 ? void 0 : onDateSelect(selectedDate);
50
+ };
51
+
52
+ return {
53
+ onDateSelect: onDateSelectWrapper,
54
+ calendar,
55
+ date,
56
+ dir,
57
+ locale,
58
+ numberingSystem,
59
+ weekDayFormat,
60
+ timeZone,
61
+ width,
62
+ cellSize
63
+ };
64
+ }, [calendar, cellSize, date, dir, locale, numberingSystem, onDateSelect, timeZone, weekDayFormat, width]);
65
+
66
+ const onFocus = () => {
67
+ setOpen(true);
68
+ };
69
+
70
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
71
+ ref: ref
72
+ }, /*#__PURE__*/React.createElement(InputField, _extends({
73
+ label: "Pick a date"
74
+ }, rest, {
75
+ type: "text",
76
+ onFocus: onFocus,
77
+ value: value
78
+ }))), open && /*#__PURE__*/React.createElement(Layer, {
79
+ onBackdropClick: () => {
80
+ setOpen(false);
81
+ }
82
+ }, /*#__PURE__*/React.createElement(Popper, {
83
+ reference: ref,
84
+ placement: "bottom-start",
85
+ modifiers: [offsetModifier]
86
+ }, /*#__PURE__*/React.createElement(Card, null, /*#__PURE__*/React.createElement(Calendar, _extends({}, calendarProps, {
87
+ date: value
88
+ }))))));
89
+ };
90
+ CalendarInput.defaultProps = {
91
+ dataTest: 'dhis2-uiwidgets-calendar-inputfield'
92
+ };
93
+ CalendarInput.propTypes = { ...CalendarProps,
94
+ ...InputFieldProps
95
+ };
@@ -0,0 +1,36 @@
1
+ import { Given, Then, And } from 'cypress-cucumber-preprocessor/steps';
2
+ Given('an Ethiopic calendar is rendered in {word}', language => {
3
+ cy.visitStory('CalendarInputTesting', "Ethiopic With ".concat(language));
4
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"]').click();
5
+ cy.get('[data-test=calendar]').should('be.visible');
6
+ });
7
+ Then('days should be rendered in "{word}"', language => {
8
+ const days = language === 'amharic' ? ['ሰኞ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ', 'እሑድ'] : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
9
+ days.forEach(day => {
10
+ cy.contains(day).should('be.visible');
11
+ });
12
+ });
13
+ And('months should be rendered in "{word}" with navigation', language => {
14
+ const months = language === 'amharic' ? {
15
+ current: 'ጥቅምት',
16
+ previous: 'መስከረም',
17
+ next: 'ኅዳር'
18
+ } : {
19
+ current: 'Tekemt',
20
+ previous: 'Meskerem',
21
+ next: 'Hedar'
22
+ };
23
+ cy.contains(months.current).should('be.visible');
24
+ cy.get('[data-test="calendar-next-month"]').click();
25
+ cy.contains(months.next).should('be.visible');
26
+ cy.get('[data-test="calendar-previous-month"]').click();
27
+ cy.get('[data-test="calendar-previous-month"]').click();
28
+ cy.contains(months.previous).should('be.visible');
29
+ });
30
+ Then('we should be able to select a day', () => {
31
+ const date = '2014-02-03';
32
+ cy.get("[data-test=\"".concat(date, "\"]")).click();
33
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"] input').should('have.value', date);
34
+ cy.get('[data-test="storybook-calendar-result"]').should('have.text', date);
35
+ cy.get('[data-test="storybook-calendar-result-iso"]').should('have.text', '13 October 2021');
36
+ });
@@ -0,0 +1,19 @@
1
+ Feature: The Calendar renders in the Ethiopic calendar system
2
+
3
+ Scenario: Display an Ethiopic calendar in Amharic
4
+ Given an Ethiopic calendar is rendered in "amharic"
5
+ Then days should be rendered in "amharic"
6
+ And months should be rendered in "amharic" with navigation
7
+
8
+ Scenario: Select a day in the Ethiopic calendar in Amharic
9
+ Given an Ethiopic calendar is rendered in "amharic"
10
+ Then we should be able to select a day
11
+
12
+ Scenario: Display an Ethiopic calendar in English
13
+ Given an Ethiopic calendar is rendered in "english"
14
+ Then days should be rendered in "english"
15
+ And months should be rendered in "english" with navigation
16
+
17
+ Scenario: Select a day in the Ethiopic calendar in English
18
+ Given an Ethiopic calendar is rendered in English
19
+ Then we should be able to select a day
@@ -0,0 +1,36 @@
1
+ import { Given, Then, And } from 'cypress-cucumber-preprocessor/steps';
2
+ Given('a Gregorian calendar is rendered in {word}', language => {
3
+ cy.visitStory('CalendarInputTesting', "Gregorian With ".concat(language));
4
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"]').click();
5
+ cy.get('[data-test=calendar]').should('be.visible');
6
+ });
7
+ Then('days should be rendered in "{word}"', language => {
8
+ const days = language === 'arabic' ? ['الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت', 'الأحد'] : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
9
+ days.forEach(day => {
10
+ cy.contains(day).should('be.visible');
11
+ });
12
+ });
13
+ And('months should be rendered in "{word}" with navigation', language => {
14
+ const months = language === 'english' ? {
15
+ current: 'October',
16
+ previous: 'September',
17
+ next: 'November'
18
+ } : {
19
+ current: 'أكتوبر',
20
+ previous: 'سبتمبر',
21
+ next: 'نوفمبر'
22
+ };
23
+ cy.contains(months.current).should('be.visible');
24
+ cy.get('[data-test="calendar-next-month"]').click();
25
+ cy.contains(months.next).should('be.visible');
26
+ cy.get('[data-test="calendar-previous-month"]').click();
27
+ cy.get('[data-test="calendar-previous-month"]').click();
28
+ cy.contains(months.previous).should('be.visible');
29
+ });
30
+ Then('we should be able to select a day', () => {
31
+ const date = '2021-10-13';
32
+ cy.get("[data-test=\"".concat(date, "\"]")).click();
33
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"] input').should('have.value', date);
34
+ cy.get('[data-test="storybook-calendar-result"]').should('have.text', date);
35
+ cy.get('[data-test="storybook-calendar-result-iso"]').should('have.text', '13 October 2021');
36
+ });
@@ -0,0 +1,19 @@
1
+ Feature: The Calendar renders in the Gregorian calendar system
2
+
3
+ Scenario: Display a Gregorian calendar in arabic
4
+ Given a Gregorian calendar is rendered in "arabic"
5
+ Then days should be rendered in "arabic"
6
+ And months should be rendered in "arabic" with navigation
7
+
8
+ Scenario: Select a day in the Gregorian calendar in arabic
9
+ Given a Gregorian calendar is rendered in "arabic"
10
+ Then we should be able to select a day
11
+
12
+ Scenario: Display a Gregorian calendar in English
13
+ Given a Gregorian calendar is rendered in "english"
14
+ Then days should be rendered in "english"
15
+ And months should be rendered in "english" with navigation
16
+
17
+ Scenario: Select a day in the Gregorian calendar in English
18
+ Given a Gregorian calendar is rendered in English
19
+ Then we should be able to select a day
@@ -0,0 +1,15 @@
1
+ import { Given, Then } from 'cypress-cucumber-preprocessor/steps';
2
+ Given('an Islamic calendar is rendered with Arabic locale', () => {
3
+ cy.visitStory('CalendarInputTesting', "Islamic With Arabic");
4
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"]').click();
5
+ cy.get('[data-test=calendar]').should('be.visible');
6
+ });
7
+ Then('days should be rendered in Arabic', () => {
8
+ cy.contains('الأحد').should('be.visible');
9
+ cy.contains('السبت').should('be.visible');
10
+ cy.contains('الجمعة').should('be.visible');
11
+ cy.contains('الخميس').should('be.visible');
12
+ cy.contains('الأربعاء').should('be.visible');
13
+ cy.contains('الثلاثاء').should('be.visible');
14
+ cy.contains('الاثنين').should('be.visible');
15
+ });
@@ -0,0 +1,5 @@
1
+ Feature: The Calendar renders in the islamic-civil calendar system
2
+
3
+ Scenario: A Calendar for the Islamic calendar
4
+ Given an Islamic calendar is rendered with Arabic locale
5
+ Then days should be rendered in Arabic
@@ -0,0 +1,39 @@
1
+ import { Given, Then, And } from 'cypress-cucumber-preprocessor/steps';
2
+ Given('a nepali calendar in "{word}" is rendered', language => {
3
+ cy.visitStory('CalendarInputTesting', "Nepali With ".concat(language));
4
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"]', {
5
+ timeout: 10000
6
+ }).click();
7
+ cy.get('[data-test=calendar]').should('be.visible');
8
+ });
9
+ Then('nepali days should be rendered in "{word}"', language => {
10
+ const days = language === 'nepali' ? ['आइत', 'सोम', 'सोम', 'बुध', 'बिही', 'शुक्र', 'शनि'] : ['Som', 'Mangl', 'Budha', 'Bihi', 'Shukra', 'Shani', 'Aaita'];
11
+ days.forEach(day => {
12
+ cy.contains(day).should('be.visible');
13
+ });
14
+ });
15
+ And('months should be rendered in "{word}" with navigation', language => {
16
+ //
17
+ const months = language === 'nepali' ? {
18
+ current: 'असोज',
19
+ previous: 'भदौ',
20
+ next: 'कार्तिक'
21
+ } : {
22
+ current: 'Ashwin',
23
+ previous: 'Bhadra',
24
+ next: 'Kartik'
25
+ };
26
+ cy.contains(months.current).should('be.visible');
27
+ cy.get('[data-test="calendar-next-month"]').click();
28
+ cy.contains(months.next).should('be.visible');
29
+ cy.get('[data-test="calendar-previous-month"]').click();
30
+ cy.get('[data-test="calendar-previous-month"]').click();
31
+ cy.contains(months.previous).should('be.visible');
32
+ });
33
+ Then('we should be able to select a day', () => {
34
+ const nepaliDate = '2078-06-27';
35
+ cy.get("[data-test=\"".concat(nepaliDate, "\"]")).click();
36
+ cy.get('[data-test="dhis2-uiwidgets-calendar-inputfield"] input').should('have.value', nepaliDate);
37
+ cy.get('[data-test="storybook-calendar-result"]').should('have.text', nepaliDate);
38
+ cy.get('[data-test="storybook-calendar-result-iso"]').should('have.text', '13 October 2021');
39
+ });
@@ -0,0 +1,19 @@
1
+ Feature: The Calendar renders in Nepali calendar system
2
+
3
+ Scenario: Display a Nepali calendar in Nepali
4
+ Given a nepali calendar in "nepali" is rendered
5
+ Then nepali days should be rendered in "nepali"
6
+ And months should be rendered in "nepali" with navigation
7
+
8
+ Scenario: Select a day in the Nepali calendar in Nepali
9
+ Given a nepali calendar in "nepali" is rendered
10
+ Then we should be able to select a day
11
+
12
+ Scenario: Display a Nepali calendar in English
13
+ Given a nepali calendar in "english" is rendered
14
+ Then nepali days should be rendered in "english"
15
+ And months should be rendered in "english" with navigation
16
+
17
+ Scenario: Select a day in the Nepali calendar in English
18
+ Given a nepali calendar in "english" is rendered
19
+ Then we should be able to select a day
@@ -0,0 +1,2 @@
1
+ export { Calendar } from './calendar/index.js';
2
+ export { CalendarInput } from './calendar-input/index.js';
@@ -0,0 +1,4 @@
1
+ {
2
+ "Go to previous year": "Go to previous year",
3
+ "Go to next year": "Go to next year"
4
+ }
@@ -0,0 +1,13 @@
1
+ //------------------------------------------------------------------------------
2
+ // <auto-generated>
3
+ // This code was generated by d2-i18n-generate.
4
+ //
5
+ // Changes to this file may cause incorrect behavior and will be lost if
6
+ // the code is regenerated.
7
+ // </auto-generated>
8
+ //------------------------------------------------------------------------------
9
+ import i18n from '@dhis2/d2-i18n';
10
+ import enTranslations from './en/translations.json';
11
+ const namespace = 'default';
12
+ i18n.addResources('en', namespace, enTranslations);
13
+ export default i18n;
@@ -0,0 +1,44 @@
1
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ import React from 'react';
4
+ import { Calendar } from '../calendar/index.js';
5
+ import { CalendarStoryWrapper } from './calendarStoryWrapper.js';
6
+ const subtitle = "[Experimental] Calendar component is useful for creating a variety of calendars including Ethiopic, Islamic etc..";
7
+ const description = "\nUse a Calendar where there is a need to let the user select a date.\n\nNote that it requires a parent, like [Box](../?path=/docs/layout-box--default), to define its size.\n\n```js\nimport { Calendar } from '@dhis2/ui'\n```\n";
8
+ export default {
9
+ title: 'Calendar',
10
+ component: Calendar,
11
+ parameters: {
12
+ componentSubtitle: subtitle,
13
+ docs: {
14
+ description: {
15
+ component: description
16
+ }
17
+ }
18
+ }
19
+ };
20
+ export const Ethiopic = args => {
21
+ return /*#__PURE__*/React.createElement(CalendarStoryWrapper, _extends({
22
+ calendar: "ethiopic",
23
+ locale: "am-et",
24
+ numberingSystem: "ethi",
25
+ date: "2014-04-05" // 13th of October 2022
26
+ ,
27
+ timeZone: "Africa/Khartoum"
28
+ }, args));
29
+ };
30
+ export const Nepali = args => {
31
+ return /*#__PURE__*/React.createElement(CalendarStoryWrapper, _extends({
32
+ calendar: "nepali",
33
+ locale: "ne-NP",
34
+ date: "2079-06-29" // 13th of October 2022
35
+ ,
36
+ timeZone: "Africa/Khartoum"
37
+ }, args));
38
+ };
39
+ export const WithAnyCalendar = args => {
40
+ return /*#__PURE__*/React.createElement(CalendarStoryWrapper, _extends({
41
+ calendar: "gregory",
42
+ locale: "en-GB"
43
+ }, args));
44
+ };