@openedx/paragon 21.6.1 → 21.7.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 (42) hide show
  1. package/dist/ProductTour/Checkpoint.js +9 -1
  2. package/dist/ProductTour/Checkpoint.js.map +1 -1
  3. package/dist/i18n/messages/ar.json +2 -1
  4. package/dist/i18n/messages/ca.json +2 -1
  5. package/dist/i18n/messages/es_419.json +2 -1
  6. package/dist/i18n/messages/es_AR.json +2 -1
  7. package/dist/i18n/messages/es_ES.json +2 -1
  8. package/dist/i18n/messages/fr.json +2 -1
  9. package/dist/i18n/messages/he.json +2 -1
  10. package/dist/i18n/messages/id.json +2 -1
  11. package/dist/i18n/messages/it_IT.json +2 -1
  12. package/dist/i18n/messages/ko_KR.json +2 -1
  13. package/dist/i18n/messages/pl.json +2 -1
  14. package/dist/i18n/messages/pt_BR.json +2 -1
  15. package/dist/i18n/messages/pt_PT.json +2 -1
  16. package/dist/i18n/messages/ru.json +2 -1
  17. package/dist/i18n/messages/th.json +2 -1
  18. package/dist/i18n/messages/tr_TR.json +2 -1
  19. package/dist/i18n/messages/uk.json +2 -1
  20. package/dist/i18n/messages/zh_CN.json +2 -1
  21. package/package.json +2 -2
  22. package/src/ProductTour/Checkpoint.jsx +9 -2
  23. package/src/ProductTour/Checkpoint.test.jsx +9 -8
  24. package/src/ProductTour/ProductTour.test.jsx +31 -160
  25. package/src/i18n/messages/ar.json +2 -1
  26. package/src/i18n/messages/ca.json +2 -1
  27. package/src/i18n/messages/es_419.json +2 -1
  28. package/src/i18n/messages/es_AR.json +2 -1
  29. package/src/i18n/messages/es_ES.json +2 -1
  30. package/src/i18n/messages/fr.json +2 -1
  31. package/src/i18n/messages/he.json +2 -1
  32. package/src/i18n/messages/id.json +2 -1
  33. package/src/i18n/messages/it_IT.json +2 -1
  34. package/src/i18n/messages/ko_KR.json +2 -1
  35. package/src/i18n/messages/pl.json +2 -1
  36. package/src/i18n/messages/pt_BR.json +2 -1
  37. package/src/i18n/messages/pt_PT.json +2 -1
  38. package/src/i18n/messages/ru.json +2 -1
  39. package/src/i18n/messages/th.json +2 -1
  40. package/src/i18n/messages/tr_TR.json +2 -1
  41. package/src/i18n/messages/uk.json +2 -1
  42. package/src/i18n/messages/zh_CN.json +2 -1
@@ -6,6 +6,7 @@ import React, { useEffect, useState } from 'react';
6
6
  import { useMediaQuery } from 'react-responsive';
7
7
  import PropTypes from 'prop-types';
8
8
  import { createPopper } from '@popperjs/core';
9
+ import { FormattedMessage } from 'react-intl';
9
10
  import breakpoints from '../utils/breakpoints';
10
11
  import CheckpointActionRow from './CheckpointActionRow';
11
12
  import CheckpointBody from './CheckpointBody';
@@ -93,7 +94,14 @@ const Checkpoint = /*#__PURE__*/React.forwardRef((_ref, ref) => {
93
94
  }
94
95
  }, /*#__PURE__*/React.createElement("span", {
95
96
  className: "sr-only"
96
- }, "Top of step ", index + 1), (title || !isOnlyCheckpoint) && /*#__PURE__*/React.createElement("div", {
97
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
98
+ id: "pgn.ProductTour.Checkpoint.position-text",
99
+ defaultMessage: "Top of step {step}",
100
+ value: {
101
+ step: index + 1
102
+ },
103
+ description: "Screen-reader message to indicate the user's position in a sequence of checkpoints."
104
+ })), (title || !isOnlyCheckpoint) && /*#__PURE__*/React.createElement("div", {
97
105
  className: "pgn__checkpoint-header"
98
106
  }, /*#__PURE__*/React.createElement(CheckpointTitle, null, title), /*#__PURE__*/React.createElement(CheckpointBreadcrumbs, {
99
107
  currentIndex: index,
@@ -1 +1 @@
1
- {"version":3,"file":"Checkpoint.js","names":["React","useEffect","useState","useMediaQuery","PropTypes","createPopper","breakpoints","CheckpointActionRow","CheckpointBody","CheckpointBreadcrumbs","CheckpointTitle","Checkpoint","forwardRef","_ref","ref","body","index","placement","target","title","totalCheckpoints","props","_objectWithoutProperties","_excluded","checkpointVisible","setCheckpointVisible","isMobile","maxWidth","small","targetElement","document","querySelector","checkpoint","checkpointPopper","modifiers","name","options","padding","offset","tetherOffset","forceUpdate","targetOffset","getBoundingClientRect","top","bottom","global","innerHeight","includes","scrollTo","behavior","button","focus","isLastCheckpoint","isOnlyCheckpoint","createElement","id","className","role","style","visibility","pointerEvents","currentIndex","_extends","defaultProps","advanceButtonText","dismissButtonText","endButtonText","showDismissButton","undefined","propTypes","node","number","isRequired","onAdvance","func","onDismiss","onEnd","oneOf","string","bool"],"sources":["../../src/ProductTour/Checkpoint.jsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useMediaQuery } from 'react-responsive';\nimport PropTypes from 'prop-types';\nimport { createPopper } from '@popperjs/core';\n\nimport breakpoints from '../utils/breakpoints';\n\nimport CheckpointActionRow from './CheckpointActionRow';\nimport CheckpointBody from './CheckpointBody';\nimport CheckpointBreadcrumbs from './CheckpointBreadcrumbs';\nimport CheckpointTitle from './CheckpointTitle';\n\nconst Checkpoint = React.forwardRef(({\n body,\n index,\n placement,\n target,\n title,\n totalCheckpoints,\n ...props\n}, ref) => {\n const [checkpointVisible, setCheckpointVisible] = useState(false);\n const isMobile = useMediaQuery({ maxWidth: breakpoints.small.maxWidth });\n\n useEffect(() => {\n const targetElement = document.querySelector(target);\n const checkpoint = document.querySelector('#pgn__checkpoint');\n if (targetElement && checkpoint) {\n // Use the Popper library to translate the Checkpoint to its target's coordinates\n const checkpointPopper = createPopper(targetElement, checkpoint, {\n placement: isMobile ? 'top' : placement,\n modifiers: [\n {\n name: 'arrow',\n options: {\n padding: 25,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, 20],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 20,\n tetherOffset: 35,\n },\n },\n ],\n });\n setCheckpointVisible(true);\n if (checkpointPopper) {\n checkpointPopper.forceUpdate();\n }\n }\n }, [target, isMobile, placement]);\n\n useEffect(() => {\n if (checkpointVisible) {\n // Scroll the Checkpoint into view once its rendered\n const targetElement = document.querySelector(target);\n let targetOffset = targetElement.getBoundingClientRect().top;\n if ((targetOffset < 0) || (targetElement.getBoundingClientRect().bottom > global.innerHeight)) {\n if (placement.includes('top')) {\n if (targetOffset < 0) {\n targetOffset *= -1;\n }\n targetOffset -= 280;\n } else {\n targetOffset -= 80;\n }\n\n global.scrollTo({\n top: targetOffset, behavior: 'smooth',\n });\n }\n\n const button = document.querySelector('.pgn__checkpoint-button_advance');\n button.focus();\n }\n }, [target, checkpointVisible, placement]);\n\n const isLastCheckpoint = index + 1 === totalCheckpoints;\n const isOnlyCheckpoint = totalCheckpoints === 1;\n\n return (\n <div\n id=\"pgn__checkpoint\"\n className=\"pgn__checkpoint\"\n aria-labelledby=\"pgn__checkpoint-title\"\n ref={ref}\n role=\"dialog\"\n style={{ visibility: checkpointVisible ? 'visible' : 'hidden', pointerEvents: checkpointVisible ? 'auto' : 'none' }}\n >\n {/* This text is not translated due to Paragon's lack of i18n support */}\n <span className=\"sr-only\">Top of step {index + 1}</span>\n {(title || !isOnlyCheckpoint) && (\n <div className=\"pgn__checkpoint-header\">\n <CheckpointTitle>{title}</CheckpointTitle>\n <CheckpointBreadcrumbs currentIndex={index} totalCheckpoints={totalCheckpoints} />\n </div>\n )}\n <CheckpointBody>{body}</CheckpointBody>\n <CheckpointActionRow\n isLastCheckpoint={isLastCheckpoint}\n index={index}\n {...props}\n />\n <div id=\"pgn__checkpoint-arrow\" data-popper-arrow />\n {/* This text is not translated due to Paragon's lack of i18n support */}\n <span className=\"sr-only\">Bottom of step {index + 1}</span>\n </div>\n );\n});\n\nCheckpoint.defaultProps = {\n advanceButtonText: null,\n body: null,\n dismissButtonText: null,\n endButtonText: null,\n placement: 'top',\n title: null,\n showDismissButton: undefined,\n};\n\nCheckpoint.propTypes = {\n /** The text displayed on the button used to advance the tour for the given Checkpoint. */\n advanceButtonText: PropTypes.node,\n /** The text displayed in the body of the Checkpoint */\n body: PropTypes.node,\n /** The text displayed on the button used to dismiss the tour for the given Checkpoint. */\n dismissButtonText: PropTypes.node,\n /** The text displayed on the button used to end the tour for the given Checkpoint. */\n endButtonText: PropTypes.node,\n /** The current index of the given Checkpoint */\n index: PropTypes.number.isRequired,\n /** A function that runs when triggering the `onClick` event of the advance\n * button for the given Checkpoint. */\n onAdvance: PropTypes.func.isRequired,\n /** A function that runs when triggering the `onClick` event of the dismiss\n * button for the given Checkpoint. */\n onDismiss: PropTypes.func.isRequired,\n /** A function that runs when triggering the `onClick` event of the advance\n * button if the given Checkpoint is the only or last Checkpoint in a tour. */\n onEnd: PropTypes.func.isRequired,\n /** A string that dictates the alignment of the Checkpoint around its target. */\n placement: PropTypes.oneOf([\n 'top', 'top-start', 'top-end', 'right-start', 'right', 'right-end',\n 'left-start', 'left', 'left-end', 'bottom', 'bottom-start', 'bottom-end',\n ]),\n /** The CSS selector for the Checkpoint's desired target. */\n target: PropTypes.string.isRequired,\n /** The text displayed in the title of the Checkpoint */\n title: PropTypes.node,\n /** The total number of Checkpoints in a tour */\n totalCheckpoints: PropTypes.number.isRequired,\n /** Enforces visibility of the dismiss button under all circumstances */\n showDismissButton: PropTypes.bool,\n};\n\nexport default Checkpoint;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Checkpoint.js","names":["React","useEffect","useState","useMediaQuery","PropTypes","createPopper","FormattedMessage","breakpoints","CheckpointActionRow","CheckpointBody","CheckpointBreadcrumbs","CheckpointTitle","Checkpoint","forwardRef","_ref","ref","body","index","placement","target","title","totalCheckpoints","props","_objectWithoutProperties","_excluded","checkpointVisible","setCheckpointVisible","isMobile","maxWidth","small","targetElement","document","querySelector","checkpoint","checkpointPopper","modifiers","name","options","padding","offset","tetherOffset","forceUpdate","targetOffset","getBoundingClientRect","top","bottom","global","innerHeight","includes","scrollTo","behavior","button","focus","isLastCheckpoint","isOnlyCheckpoint","createElement","id","className","role","style","visibility","pointerEvents","defaultMessage","value","step","description","currentIndex","_extends","defaultProps","advanceButtonText","dismissButtonText","endButtonText","showDismissButton","undefined","propTypes","node","number","isRequired","onAdvance","func","onDismiss","onEnd","oneOf","string","bool"],"sources":["../../src/ProductTour/Checkpoint.jsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useMediaQuery } from 'react-responsive';\nimport PropTypes from 'prop-types';\nimport { createPopper } from '@popperjs/core';\nimport { FormattedMessage } from 'react-intl';\n\nimport breakpoints from '../utils/breakpoints';\n\nimport CheckpointActionRow from './CheckpointActionRow';\nimport CheckpointBody from './CheckpointBody';\nimport CheckpointBreadcrumbs from './CheckpointBreadcrumbs';\nimport CheckpointTitle from './CheckpointTitle';\n\nconst Checkpoint = React.forwardRef(({\n body,\n index,\n placement,\n target,\n title,\n totalCheckpoints,\n ...props\n}, ref) => {\n const [checkpointVisible, setCheckpointVisible] = useState(false);\n const isMobile = useMediaQuery({ maxWidth: breakpoints.small.maxWidth });\n\n useEffect(() => {\n const targetElement = document.querySelector(target);\n const checkpoint = document.querySelector('#pgn__checkpoint');\n if (targetElement && checkpoint) {\n // Use the Popper library to translate the Checkpoint to its target's coordinates\n const checkpointPopper = createPopper(targetElement, checkpoint, {\n placement: isMobile ? 'top' : placement,\n modifiers: [\n {\n name: 'arrow',\n options: {\n padding: 25,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, 20],\n },\n },\n {\n name: 'preventOverflow',\n options: {\n padding: 20,\n tetherOffset: 35,\n },\n },\n ],\n });\n setCheckpointVisible(true);\n if (checkpointPopper) {\n checkpointPopper.forceUpdate();\n }\n }\n }, [target, isMobile, placement]);\n\n useEffect(() => {\n if (checkpointVisible) {\n // Scroll the Checkpoint into view once its rendered\n const targetElement = document.querySelector(target);\n let targetOffset = targetElement.getBoundingClientRect().top;\n if ((targetOffset < 0) || (targetElement.getBoundingClientRect().bottom > global.innerHeight)) {\n if (placement.includes('top')) {\n if (targetOffset < 0) {\n targetOffset *= -1;\n }\n targetOffset -= 280;\n } else {\n targetOffset -= 80;\n }\n\n global.scrollTo({\n top: targetOffset, behavior: 'smooth',\n });\n }\n\n const button = document.querySelector('.pgn__checkpoint-button_advance');\n button.focus();\n }\n }, [target, checkpointVisible, placement]);\n\n const isLastCheckpoint = index + 1 === totalCheckpoints;\n const isOnlyCheckpoint = totalCheckpoints === 1;\n\n return (\n <div\n id=\"pgn__checkpoint\"\n className=\"pgn__checkpoint\"\n aria-labelledby=\"pgn__checkpoint-title\"\n ref={ref}\n role=\"dialog\"\n style={{ visibility: checkpointVisible ? 'visible' : 'hidden', pointerEvents: checkpointVisible ? 'auto' : 'none' }}\n >\n <span className=\"sr-only\">\n <FormattedMessage\n id=\"pgn.ProductTour.Checkpoint.position-text\"\n defaultMessage=\"Top of step {step}\"\n value={{ step: index + 1 }}\n description=\"Screen-reader message to indicate the user's position in a sequence of checkpoints.\"\n />\n </span>\n {(title || !isOnlyCheckpoint) && (\n <div className=\"pgn__checkpoint-header\">\n <CheckpointTitle>{title}</CheckpointTitle>\n <CheckpointBreadcrumbs currentIndex={index} totalCheckpoints={totalCheckpoints} />\n </div>\n )}\n <CheckpointBody>{body}</CheckpointBody>\n <CheckpointActionRow\n isLastCheckpoint={isLastCheckpoint}\n index={index}\n {...props}\n />\n <div id=\"pgn__checkpoint-arrow\" data-popper-arrow />\n {/* This text is not translated due to Paragon's lack of i18n support */}\n <span className=\"sr-only\">Bottom of step {index + 1}</span>\n </div>\n );\n});\n\nCheckpoint.defaultProps = {\n advanceButtonText: null,\n body: null,\n dismissButtonText: null,\n endButtonText: null,\n placement: 'top',\n title: null,\n showDismissButton: undefined,\n};\n\nCheckpoint.propTypes = {\n /** The text displayed on the button used to advance the tour for the given Checkpoint. */\n advanceButtonText: PropTypes.node,\n /** The text displayed in the body of the Checkpoint */\n body: PropTypes.node,\n /** The text displayed on the button used to dismiss the tour for the given Checkpoint. */\n dismissButtonText: PropTypes.node,\n /** The text displayed on the button used to end the tour for the given Checkpoint. */\n endButtonText: PropTypes.node,\n /** The current index of the given Checkpoint */\n index: PropTypes.number.isRequired,\n /** A function that runs when triggering the `onClick` event of the advance\n * button for the given Checkpoint. */\n onAdvance: PropTypes.func.isRequired,\n /** A function that runs when triggering the `onClick` event of the dismiss\n * button for the given Checkpoint. */\n onDismiss: PropTypes.func.isRequired,\n /** A function that runs when triggering the `onClick` event of the advance\n * button if the given Checkpoint is the only or last Checkpoint in a tour. */\n onEnd: PropTypes.func.isRequired,\n /** A string that dictates the alignment of the Checkpoint around its target. */\n placement: PropTypes.oneOf([\n 'top', 'top-start', 'top-end', 'right-start', 'right', 'right-end',\n 'left-start', 'left', 'left-end', 'bottom', 'bottom-start', 'bottom-end',\n ]),\n /** The CSS selector for the Checkpoint's desired target. */\n target: PropTypes.string.isRequired,\n /** The text displayed in the title of the Checkpoint */\n title: PropTypes.node,\n /** The total number of Checkpoints in a tour */\n totalCheckpoints: PropTypes.number.isRequired,\n /** Enforces visibility of the dismiss button under all circumstances */\n showDismissButton: PropTypes.bool,\n};\n\nexport default Checkpoint;\n"],"mappings":"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"}
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "رفع {filename} جارٍ.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "إغلاق قائمة الخيارات",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "فتح قائمة الخيارات",
30
- "pgn.Toast.closeLabel": "إغلاق "
30
+ "pgn.Toast.closeLabel": "إغلاق ",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Caricamento {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Chiudi"
30
+ "pgn.Toast.closeLabel": "Chiudi",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Zamknij"
30
+ "pgn.Toast.closeLabel": "Zamknij",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Carregando {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Fechar o menu de opções",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abrir o menu de opções",
30
- "pgn.Toast.closeLabel": "Fechar"
30
+ "pgn.Toast.closeLabel": "Fechar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "{filename} yükleniyor.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Seçenekler menüsünü kapat",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Seçenekler menüsünü aç",
30
- "pgn.Toast.closeLabel": "Kapat"
30
+ "pgn.Toast.closeLabel": "Kapat",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/paragon",
3
- "version": "21.6.1",
3
+ "version": "21.7.0",
4
4
  "description": "Accessible, responsive UI component library based on Bootstrap.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -41,7 +41,7 @@
41
41
  "example:start:with-theme": "npm run start:with-theme --workspace=example",
42
42
  "generate-changelog": "node generate-changelog.js",
43
43
  "i18n_compile": "formatjs compile-folder --format transifex ./src/i18n/messages ./src/i18n/messages",
44
- "i18n_extract": "formatjs extract 'src/**/*.{jsx,js,tsx,ts}' --out-file ./src/i18n/transifex_input.json --format transifex",
44
+ "i18n_extract": "formatjs extract 'src/**/*.{jsx,js,tsx,ts}' --out-file ./src/i18n/transifex_input.json --ignore='**/*.d.ts' --format transifex",
45
45
  "type-check": "tsc --noEmit && tsc --project www --noEmit",
46
46
  "type-check:watch": "npm run type-check -- --watch",
47
47
  "build-types": "tsc --emitDeclarationOnly",
@@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
2
2
  import { useMediaQuery } from 'react-responsive';
3
3
  import PropTypes from 'prop-types';
4
4
  import { createPopper } from '@popperjs/core';
5
+ import { FormattedMessage } from 'react-intl';
5
6
 
6
7
  import breakpoints from '../utils/breakpoints';
7
8
 
@@ -95,8 +96,14 @@ const Checkpoint = React.forwardRef(({
95
96
  role="dialog"
96
97
  style={{ visibility: checkpointVisible ? 'visible' : 'hidden', pointerEvents: checkpointVisible ? 'auto' : 'none' }}
97
98
  >
98
- {/* This text is not translated due to Paragon's lack of i18n support */}
99
- <span className="sr-only">Top of step {index + 1}</span>
99
+ <span className="sr-only">
100
+ <FormattedMessage
101
+ id="pgn.ProductTour.Checkpoint.position-text"
102
+ defaultMessage="Top of step {step}"
103
+ value={{ step: index + 1 }}
104
+ description="Screen-reader message to indicate the user's position in a sequence of checkpoints."
105
+ />
106
+ </span>
100
107
  {(title || !isOnlyCheckpoint) && (
101
108
  <div className="pgn__checkpoint-header">
102
109
  <CheckpointTitle>{title}</CheckpointTitle>
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import userEvent from '@testing-library/user-event';
4
+ import { IntlProvider } from 'react-intl';
4
5
 
5
6
  import * as popper from '@popperjs/core';
6
7
 
@@ -24,7 +25,7 @@ describe('Checkpoint', () => {
24
25
  describe('second Checkpoint in Tour', () => {
25
26
  beforeEach(() => {
26
27
  render(
27
- <>
28
+ <IntlProvider locale="en" messages={{}}>
28
29
  <div id="target-element">...</div>
29
30
  <Checkpoint
30
31
  advanceButtonText="Next"
@@ -39,7 +40,7 @@ describe('Checkpoint', () => {
39
40
  title="Checkpoint title"
40
41
  totalCheckpoints={5}
41
42
  />
42
- </>,
43
+ </IntlProvider>,
43
44
  );
44
45
  });
45
46
 
@@ -75,7 +76,7 @@ describe('Checkpoint', () => {
75
76
  describe('last Checkpoint in Tour', () => {
76
77
  beforeEach(() => {
77
78
  render(
78
- <>
79
+ <IntlProvider locale="en" messages={{}}>
79
80
  <div id="#last-element" />
80
81
  <Checkpoint
81
82
  advanceButtonText="Next"
@@ -90,7 +91,7 @@ describe('Checkpoint', () => {
90
91
  title="Checkpoint title"
91
92
  totalCheckpoints={5}
92
93
  />
93
- </>,
94
+ </IntlProvider>,
94
95
  );
95
96
  });
96
97
 
@@ -108,7 +109,7 @@ describe('Checkpoint', () => {
108
109
  describe('only one Checkpoint in Tour', () => {
109
110
  beforeEach(() => {
110
111
  render(
111
- <>
112
+ <IntlProvider locale="en" messages={{}}>
112
113
  <div id="#target-element" />
113
114
  <Checkpoint
114
115
  advanceButtonText="Next"
@@ -123,7 +124,7 @@ describe('Checkpoint', () => {
123
124
  title="Checkpoint title"
124
125
  totalCheckpoints={1}
125
126
  />
126
- </>,
127
+ </IntlProvider>,
127
128
  );
128
129
  });
129
130
 
@@ -140,7 +141,7 @@ describe('Checkpoint', () => {
140
141
  describe('only one Checkpoint in Tour and showDismissButton set to true', () => {
141
142
  it('it renders dismiss button and end button', () => {
142
143
  render(
143
- <>
144
+ <IntlProvider locale="en" messages={{}}>
144
145
  <div id="#target-element" />
145
146
  <Checkpoint
146
147
  advanceButtonText="Next"
@@ -156,7 +157,7 @@ describe('Checkpoint', () => {
156
157
  totalCheckpoints={1}
157
158
  showDismissButton
158
159
  />
159
- </>,
160
+ </IntlProvider>,
160
161
  );
161
162
  expect(screen.getByText('Dismiss', { selector: 'button' })).toBeInTheDocument();
162
163
  expect(screen.getByText('End', { selector: 'button' })).toBeInTheDocument();
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { render, screen, act } from '@testing-library/react';
3
3
  import userEvent from '@testing-library/user-event';
4
+ import { IntlProvider } from 'react-intl';
4
5
 
5
6
  import * as popper from '@popperjs/core';
6
7
 
@@ -85,17 +86,20 @@ describe('<ProductTour />', () => {
85
86
  popperMock.mockReset();
86
87
  });
87
88
 
89
+ // eslint-disable-next-line react/prop-types
90
+ function ProductTourWrapper({ tours }) {
91
+ return (
92
+ <IntlProvider locale="en" messages={{}}>
93
+ <ProductTour tours={tours} />
94
+ {targets}
95
+ </IntlProvider>
96
+ );
97
+ }
98
+
88
99
  describe('one enabled tour', () => {
89
100
  describe('with default settings', () => {
90
101
  it('renders checkpoint with correct title, body, and breadcrumbs', () => {
91
- render(
92
- <>
93
- <ProductTour
94
- tours={[tourData]}
95
- />
96
- {targets}
97
- </>,
98
- );
102
+ render(<ProductTourWrapper tours={[tourData]} />);
99
103
 
100
104
  expect(screen.getByRole('dialog', { name: 'Checkpoint 1' })).toBeInTheDocument();
101
105
  expect(screen.getByText('Checkpoint 1')).toBeInTheDocument();
@@ -103,14 +107,7 @@ describe('<ProductTour />', () => {
103
107
  });
104
108
 
105
109
  it('onClick of advance button advances to next checkpoint', async () => {
106
- const { rerender } = render(
107
- <>
108
- <ProductTour
109
- tours={[tourData]}
110
- />
111
- {targets}
112
- </>,
113
- );
110
+ const { rerender } = render(<ProductTourWrapper tours={[tourData]} />);
114
111
  // Verify the first Checkpoint has rendered
115
112
  expect(screen.getByRole('heading', { name: 'Checkpoint 1' })).toBeInTheDocument();
116
113
 
@@ -120,14 +117,7 @@ describe('<ProductTour />', () => {
120
117
  await userEvent.click(advanceButton);
121
118
  });
122
119
 
123
- rerender(
124
- <>
125
- <ProductTour
126
- tours={[tourData]}
127
- />
128
- {targets}
129
- </>,
130
- );
120
+ rerender(<ProductTourWrapper tours={[tourData]} />);
131
121
 
132
122
  const heading = screen.getByRole('heading', { name: 'Checkpoint 2' });
133
123
 
@@ -136,14 +126,7 @@ describe('<ProductTour />', () => {
136
126
  });
137
127
 
138
128
  it('onClick of dismiss button disables tour', async () => {
139
- render(
140
- <>
141
- <ProductTour
142
- tours={[tourData]}
143
- />
144
- {targets}
145
- </>,
146
- );
129
+ render(<ProductTourWrapper tours={[tourData]} />);
147
130
 
148
131
  // Verify a Checkpoint has rendered
149
132
  expect(screen.getByRole('dialog', { name: 'Checkpoint 1' })).toBeInTheDocument();
@@ -161,14 +144,7 @@ describe('<ProductTour />', () => {
161
144
  });
162
145
 
163
146
  it('onClick of end button disables tour', async () => {
164
- const { rerender } = render(
165
- <>
166
- <ProductTour
167
- tours={[tourData]}
168
- />
169
- {targets}
170
- </>,
171
- );
147
+ const { rerender } = render(<ProductTourWrapper tours={[tourData]} />);
172
148
 
173
149
  // Verify a Checkpoint has rendered
174
150
  expect(screen.getByRole('dialog', { name: 'Checkpoint 1' })).toBeInTheDocument();
@@ -184,28 +160,14 @@ describe('<ProductTour />', () => {
184
160
  await userEvent.click(advanceButton2);
185
161
  });
186
162
 
187
- rerender(
188
- <>
189
- <ProductTour
190
- tours={[tourData]}
191
- />
192
- {targets}
193
- </>,
194
- );
163
+ rerender(<ProductTourWrapper tours={[tourData]} />);
195
164
 
196
165
  const advanceButton3 = screen.getByRole('button', { name: 'Override advance' });
197
166
  await act(async () => {
198
167
  await userEvent.click(advanceButton3);
199
168
  });
200
169
 
201
- rerender(
202
- <>
203
- <ProductTour
204
- tours={[tourData]}
205
- />
206
- {targets}
207
- </>,
208
- );
170
+ rerender(<ProductTourWrapper tours={[tourData]} />);
209
171
 
210
172
  // Click the end button
211
173
  const endButton = screen.getByRole('button', { name: 'End' });
@@ -220,14 +182,7 @@ describe('<ProductTour />', () => {
220
182
  });
221
183
 
222
184
  it('onClick of escape key disables tour', async () => {
223
- render(
224
- <>
225
- <ProductTour
226
- tours={[tourData]}
227
- />
228
- {targets}
229
- </>,
230
- );
185
+ render(<ProductTourWrapper tours={[tourData]} />);
231
186
 
232
187
  // Verify a Checkpoint has rendered
233
188
  expect(screen.getByRole('dialog', { name: 'Checkpoint 1' })).toBeInTheDocument();
@@ -283,27 +238,13 @@ describe('<ProductTour />', () => {
283
238
  ],
284
239
  };
285
240
  it('renders correct checkpoint on index override', () => {
286
- render(
287
- <>
288
- <ProductTour
289
- tours={[overrideTourData]}
290
- />
291
- {targets}
292
- </>,
293
- );
241
+ render(<ProductTourWrapper tours={[overrideTourData]} />);
294
242
  expect(screen.getByRole('dialog', { name: 'Checkpoint 3' })).toBeInTheDocument();
295
243
  expect(screen.getByRole('heading', { name: 'Checkpoint 3' })).toBeInTheDocument();
296
244
  });
297
245
 
298
246
  it('applies override for advanceButtonText', async () => {
299
- const { rerender } = render(
300
- <>
301
- <ProductTour
302
- tours={[overrideTourData]}
303
- />
304
- {targets}
305
- </>,
306
- );
247
+ const { rerender } = render(<ProductTourWrapper tours={[overrideTourData]} />);
307
248
  expect(screen.getByRole('button', { name: 'Override advance' })).toBeInTheDocument();
308
249
  const advanceButton = screen.getByRole('button', { name: 'Override advance' });
309
250
  await act(async () => {
@@ -312,37 +253,16 @@ describe('<ProductTour />', () => {
312
253
  expect(screen.queryByRole('button', { name: 'Override advance' })).not.toBeInTheDocument();
313
254
  expect(customOnAdvance).toHaveBeenCalledTimes(1);
314
255
 
315
- rerender(
316
- <>
317
- <ProductTour
318
- tours={[overrideTourData]}
319
- />
320
- {targets}
321
- </>,
322
- );
256
+ rerender(<ProductTourWrapper tours={[overrideTourData]} />);
323
257
 
324
258
  expect(screen.getByText('Checkpoint 4')).toBeInTheDocument();
325
259
  });
326
260
  it('applies override for dismissButtonText', () => {
327
- render(
328
- <>
329
- <ProductTour
330
- tours={[overrideTourData]}
331
- />
332
- {targets}
333
- </>,
334
- );
261
+ render(<ProductTourWrapper tours={[overrideTourData]} />);
335
262
  expect(screen.getByRole('button', { name: 'Override dismiss' })).toBeInTheDocument();
336
263
  });
337
264
  it('calls customHandleDismiss onClick of dismiss button', async () => {
338
- render(
339
- <>
340
- <ProductTour
341
- tours={[overrideTourData]}
342
- />
343
- {targets}
344
- </>,
345
- );
265
+ render(<ProductTourWrapper tours={[overrideTourData]} />);
346
266
  const dismissButton = screen.getByRole('button', { name: 'Override dismiss' });
347
267
  await act(async () => {
348
268
  await userEvent.click(dismissButton);
@@ -351,27 +271,13 @@ describe('<ProductTour />', () => {
351
271
  expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
352
272
  });
353
273
  it('calls customHandleOnEnd onClick of end button', async () => {
354
- const { rerender } = render(
355
- <>
356
- <ProductTour
357
- tours={[overrideTourData]}
358
- />
359
- {targets}
360
- </>,
361
- );
274
+ const { rerender } = render(<ProductTourWrapper tours={[overrideTourData]} />);
362
275
  const advanceButton = screen.getByRole('button', { name: 'Override advance' });
363
276
  await act(async () => {
364
277
  await userEvent.click(advanceButton);
365
278
  });
366
279
 
367
- rerender(
368
- <>
369
- <ProductTour
370
- tours={[overrideTourData]}
371
- />
372
- {targets}
373
- </>,
374
- );
280
+ rerender(<ProductTourWrapper tours={[overrideTourData]} />);
375
281
 
376
282
  expect(screen.getByText('Checkpoint 4')).toBeInTheDocument();
377
283
  const endButton = screen.getByRole('button', { name: 'Override end' });
@@ -383,14 +289,7 @@ describe('<ProductTour />', () => {
383
289
  expect(screen.queryByText('Checkpoint 4')).not.toBeInTheDocument();
384
290
  });
385
291
  it('calls onEscape on escape button key press', async () => {
386
- render(
387
- <>
388
- <ProductTour
389
- tours={[overrideTourData]}
390
- />
391
- {targets}
392
- </>,
393
- );
292
+ render(<ProductTourWrapper tours={[overrideTourData]} />);
394
293
  expect(screen.getByText('Checkpoint 3')).toBeInTheDocument();
395
294
  const container = screen.getByRole('dialog');
396
295
  container.focus();
@@ -421,14 +320,7 @@ describe('<ProductTour />', () => {
421
320
  ],
422
321
  };
423
322
 
424
- render(
425
- <>
426
- <ProductTour
427
- tours={[badTourData]}
428
- />
429
- {targets}
430
- </>,
431
- );
323
+ render(<ProductTourWrapper tours={[badTourData]} />);
432
324
 
433
325
  expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
434
326
  });
@@ -456,14 +348,7 @@ describe('<ProductTour />', () => {
456
348
  ],
457
349
  };
458
350
 
459
- render(
460
- <>
461
- <ProductTour
462
- tours={[badTourData]}
463
- />
464
- {targets}
465
- </>,
466
- );
351
+ render(<ProductTourWrapper tours={[badTourData]} />);
467
352
 
468
353
  expect(screen.queryByRole('dialog', { name: 'Checkpoint 1' })).not.toBeInTheDocument();
469
354
  expect(screen.getByRole('dialog', { name: 'Checkpoint 2' })).toBeInTheDocument();
@@ -491,14 +376,7 @@ describe('<ProductTour />', () => {
491
376
  ],
492
377
  };
493
378
 
494
- render(
495
- <>
496
- <ProductTour
497
- tours={[disabledTourData, tourData, secondEnabledTourData]}
498
- />
499
- {targets}
500
- </>,
501
- );
379
+ render(<ProductTourWrapper tours={[disabledTourData, tourData, secondEnabledTourData]} />);
502
380
 
503
381
  expect(screen.getByText('Checkpoint 1')).toBeInTheDocument();
504
382
  expect(screen.queryByText('Second enabled tour')).not.toBeInTheDocument();
@@ -507,14 +385,7 @@ describe('<ProductTour />', () => {
507
385
 
508
386
  describe('disabled tour', () => {
509
387
  it('does not render', () => {
510
- render(
511
- <>
512
- <ProductTour
513
- tours={[disabledTourData]}
514
- />
515
- {targets}
516
- </>,
517
- );
388
+ render(<ProductTourWrapper tours={[disabledTourData]} />);
518
389
 
519
390
  expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
520
391
  });
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "رفع {filename} جارٍ.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "إغلاق قائمة الخيارات",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "فتح قائمة الخيارات",
30
- "pgn.Toast.closeLabel": "إغلاق "
30
+ "pgn.Toast.closeLabel": "إغلاق ",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Subiendo {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Cerrar el menú de opciones",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abre el menú de opciones",
30
- "pgn.Toast.closeLabel": "Cerrar"
30
+ "pgn.Toast.closeLabel": "Cerrar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Caricamento {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Chiudi"
30
+ "pgn.Toast.closeLabel": "Chiudi",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Zamknij"
30
+ "pgn.Toast.closeLabel": "Zamknij",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Carregando {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Fechar o menu de opções",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Abrir o menu de opções",
30
- "pgn.Toast.closeLabel": "Fechar"
30
+ "pgn.Toast.closeLabel": "Fechar",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "{filename} yükleniyor.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Seçenekler menüsünü kapat",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Seçenekler menüsünü aç",
30
- "pgn.Toast.closeLabel": "Kapat"
30
+ "pgn.Toast.closeLabel": "Kapat",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }
@@ -27,5 +27,6 @@
27
27
  "pgn.Dropzone.UploadProgress.uploadLabel": "Uploading {filename}.",
28
28
  "pgn.FormAutosuggest.iconButtonClosed": "Close the options menu",
29
29
  "pgn.FormAutosuggest.iconButtonOpened": "Open the options menu",
30
- "pgn.Toast.closeLabel": "Close"
30
+ "pgn.Toast.closeLabel": "Close",
31
+ "pgn.ProductTour.Checkpoint.position-text": "Top of step {step}"
31
32
  }