handlerSortData.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { objectHasKey } from '@/utils/helper';
  2. export async function sliceData({ id, data }) {
  3. let dataToSort = null;
  4. if (data.dataSource === 'table') {
  5. dataToSort = this.engine.referenceData.table;
  6. } else if (data.dataSource === 'variable') {
  7. const { variables } = this.engine.referenceData;
  8. if (!objectHasKey(variables, data.varSourceName)) {
  9. throw new Error(`Cant find "${data.varSourceName}" variable`);
  10. }
  11. dataToSort = variables[data.varSourceName];
  12. }
  13. if (!Array.isArray(dataToSort)) {
  14. const dataType = dataToSort === null ? 'null' : typeof dataToSort;
  15. throw new Error(`Can't sort data with "${dataType}" data type`);
  16. }
  17. const getComparisonValue = ({ itemA, itemB, order = 'asc' }) => {
  18. let comparison = 0;
  19. if (itemA > itemB) {
  20. comparison = 1;
  21. } else if (itemA < itemB) {
  22. comparison = -1;
  23. }
  24. return order === 'desc' ? comparison * -1 : comparison;
  25. };
  26. const sortedArray = dataToSort.sort((a, b) => {
  27. let comparison = 0;
  28. if (data.sortByProperty) {
  29. data.itemProperties.forEach(({ name, order }) => {
  30. comparison = getComparisonValue({
  31. order,
  32. itemA: a[name] ?? a,
  33. itemB: b[name] ?? b,
  34. });
  35. });
  36. } else {
  37. comparison = getComparisonValue({
  38. itemA: a,
  39. itemB: b,
  40. });
  41. }
  42. return comparison;
  43. });
  44. if (data.assignVariable) {
  45. this.setVariable(data.variableName, sortedArray);
  46. }
  47. if (data.saveData) {
  48. this.addDataToColumn(data.dataColumn, sortedArray);
  49. }
  50. return {
  51. data: sortedArray,
  52. nextBlockId: this.getBlockConnections(id),
  53. };
  54. }
  55. export default sliceData;