utils.mjs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { isDef, clamp, extend, createNamespace } from "../utils/index.mjs";
  2. const [name, bem, t] = createNamespace("picker");
  3. const getFirstEnabledOption = (options) => options.find((option) => !option.disabled) || options[0];
  4. function getColumnsType(columns, fields) {
  5. const firstColumn = columns[0];
  6. if (firstColumn) {
  7. if (Array.isArray(firstColumn)) {
  8. return "multiple";
  9. }
  10. if (fields.children in firstColumn) {
  11. return "cascade";
  12. }
  13. }
  14. return "default";
  15. }
  16. function findIndexOfEnabledOption(options, index) {
  17. index = clamp(index, 0, options.length);
  18. for (let i = index; i < options.length; i++) {
  19. if (!options[i].disabled)
  20. return i;
  21. }
  22. for (let i = index - 1; i >= 0; i--) {
  23. if (!options[i].disabled)
  24. return i;
  25. }
  26. return 0;
  27. }
  28. const isOptionExist = (options, value, fields) => value !== void 0 && !!options.find((option) => option[fields.value] === value);
  29. function findOptionByValue(options, value, fields) {
  30. const index = options.findIndex((option) => option[fields.value] === value);
  31. const enabledIndex = findIndexOfEnabledOption(options, index);
  32. return options[enabledIndex];
  33. }
  34. function formatCascadeColumns(columns, fields, selectedValues) {
  35. const formatted = [];
  36. let cursor = {
  37. [fields.children]: columns
  38. };
  39. let columnIndex = 0;
  40. while (cursor && cursor[fields.children]) {
  41. const options = cursor[fields.children];
  42. const value = selectedValues.value[columnIndex];
  43. cursor = isDef(value) ? findOptionByValue(options, value, fields) : void 0;
  44. if (!cursor && options.length) {
  45. const firstValue = getFirstEnabledOption(options)[fields.value];
  46. cursor = findOptionByValue(options, firstValue, fields);
  47. }
  48. columnIndex++;
  49. formatted.push(options);
  50. }
  51. return formatted;
  52. }
  53. function getElementTranslateY(element) {
  54. const { transform } = window.getComputedStyle(element);
  55. const translateY = transform.slice(7, transform.length - 1).split(", ")[5];
  56. return Number(translateY);
  57. }
  58. function assignDefaultFields(fields) {
  59. return extend(
  60. {
  61. text: "text",
  62. value: "value",
  63. children: "children"
  64. },
  65. fields
  66. );
  67. }
  68. export {
  69. assignDefaultFields,
  70. bem,
  71. findIndexOfEnabledOption,
  72. findOptionByValue,
  73. formatCascadeColumns,
  74. getColumnsType,
  75. getElementTranslateY,
  76. getFirstEnabledOption,
  77. isOptionExist,
  78. name,
  79. t
  80. };