utils.js 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { isUndefined, isDefined } from './../helpers/mixed';
  2. import { objectEach } from './../helpers/object';
  3. import { error } from './../helpers/console';
  4. import { toSingleLine } from './../helpers/templateLiteralTag';
  5. import { DEFAULT_LANGUAGE_CODE, hasLanguageDictionary } from './dictionariesManager';
  6. /**
  7. * Perform shallow extend of a target object with only this extension's properties which doesn't exist in the target.
  8. *
  9. * @param {Object} target An object that will receive the new properties.
  10. * @param {Object} extension An object containing additional properties to merge into the target.
  11. */
  12. // TODO: Maybe it should be moved to global helpers? It's changed `extend` function.
  13. export function extendNotExistingKeys(target, extension) {
  14. objectEach(extension, (value, key) => {
  15. if (isUndefined(target[key])) {
  16. target[key] = value;
  17. }
  18. });
  19. return target;
  20. }
  21. /**
  22. * Create range of values basing on cell indexes. For example, it will create below ranges for specified function arguments:
  23. *
  24. * createCellHeadersRange(2, 7) => `2-7`
  25. * createCellHeadersRange(7, 2) => `2-7`
  26. * createCellHeadersRange(0, 4, 'A', 'D') => `A-D`
  27. * createCellHeadersRange(4, 0, 'D', 'A') => `A-D`
  28. *
  29. * @param {number} firstRowIndex Index of "first" cell
  30. * @param {number} nextRowIndex Index of "next" cell
  31. * @param {*} fromValue Value which will represent "first" cell
  32. * @param {*} toValue Value which will represent "next" cell
  33. * @returns {String} Value representing range i.e. A-Z, 11-15.
  34. */
  35. export function createCellHeadersRange(firstRowIndex, nextRowIndex, fromValue = firstRowIndex, toValue = nextRowIndex) {
  36. // Will swap `fromValue` with `toValue` if it's necessary.
  37. let [from, to] = [fromValue, toValue];
  38. if (firstRowIndex > nextRowIndex) {
  39. [from, to] = [to, from];
  40. }
  41. return `${from}-${to}`;
  42. }
  43. /**
  44. * Normalize language code. It takes handled languageCode proposition and change it to proper languageCode.
  45. * For example, when it takes `eN-us` as parameter it return `en-US`
  46. *
  47. * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.
  48. * @returns {String}
  49. */
  50. export function normalizeLanguageCode(languageCode) {
  51. const languageCodePattern = /^([a-zA-Z]{2})-([a-zA-Z]{2})$/;
  52. const partsOfLanguageCode = languageCodePattern.exec(languageCode);
  53. if (partsOfLanguageCode) {
  54. return `${partsOfLanguageCode[1].toLowerCase()}-${partsOfLanguageCode[2].toUpperCase()}`;
  55. }
  56. return languageCode;
  57. }
  58. /**
  59. * Set proper start language code. User may set language code which is not proper.
  60. *
  61. * @param {Object} settings Settings object.
  62. * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.
  63. * @returns {String}
  64. */
  65. export function applyLanguageSetting(settings, languageCode) {
  66. const normalizedLanguageCode = normalizeLanguageCode(languageCode);
  67. if (hasLanguageDictionary(normalizedLanguageCode)) {
  68. settings.language = normalizedLanguageCode;
  69. } else {
  70. settings.language = DEFAULT_LANGUAGE_CODE;
  71. warnUserAboutLanguageRegistration(languageCode);
  72. }
  73. }
  74. /**
  75. *
  76. * Warn user if there is no registered language.
  77. *
  78. * @param {String} languageCode Language code for specific language i.e. 'en-US', 'pt-BR', 'de-DE'.
  79. */
  80. export function warnUserAboutLanguageRegistration(languageCode) {
  81. if (isDefined(languageCode)) {
  82. error(toSingleLine`Language with code "${languageCode}" was not found. You should register particular language
  83. before using it. Read more about this issue at: https://docs.handsontable.com/i18n/missing-language-code.`);
  84. }
  85. }