@dhis2-ui/calendar 8.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ };