{"version":3,"file":"order.mjs","sources":["../../../../src/transformations/transformers/order.ts"],"sourcesContent":["import { clone } from 'lodash';\nimport { map } from 'rxjs/operators';\n\nimport { cacheFieldDisplayNames, getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\n\nexport enum OrderByMode {\n  Manual = 'manual',\n  Auto = 'auto',\n}\n\nexport enum Order {\n  Off = 'off',\n  Asc = 'asc',\n  Desc = 'desc',\n}\n\nexport enum OrderByType {\n  Name = 'name',\n  Label = 'label',\n}\n\nexport interface OrderByItem {\n  type: OrderByType;\n  name?: string;\n  desc?: boolean;\n}\n\nexport interface OrderFieldsTransformerOptions {\n  indexByName?: Record<string, number>;\n  orderByMode?: OrderByMode;\n  orderBy?: OrderByItem[];\n}\n\nexport const orderFieldsTransformer: DataTransformerInfo<OrderFieldsTransformerOptions> = {\n  id: DataTransformerID.order,\n  name: 'Order fields by name',\n  description: 'Order fields based on configuration given by user',\n  defaultOptions: {\n    indexByName: {},\n  },\n\n  /**\n   * Return a modified copy of the series. If the transform is not or should not\n   * be applied, just return the input series\n   */\n  operator:\n    ({ indexByName, orderByMode = OrderByMode.Manual, orderBy = [] }) =>\n    (source) =>\n      source.pipe(\n        map((data) => {\n          cacheFieldDisplayNames(data);\n\n          const orderer =\n            orderByMode === OrderByMode.Manual\n              ? createFieldsOrdererManual(indexByName!)\n              : createFieldsOrdererAuto(orderBy);\n\n          return data.map((frame) => ({\n            ...frame,\n            fields: orderer(frame.fields, data, frame),\n          }));\n        })\n      ),\n};\n\nexport const createOrderFieldsComparer = (indexByName: Record<string, number>) => (a: string, b: string) =>\n  indexOfField(a, indexByName) - indexOfField(b, indexByName);\n\nconst createFieldsOrdererManual =\n  (indexByName: Record<string, number>) => (fields: Field[], data: DataFrame[], frame: DataFrame) => {\n    const comparer = createOrderFieldsComparer(indexByName);\n\n    return clone(fields).sort((a, b) =>\n      comparer(getFieldDisplayName(a, frame, data), getFieldDisplayName(b, frame, data))\n    );\n  };\n\nconst indexOfField = (fieldName: string, indexByName: Record<string, number>) => {\n  if (Number.isInteger(indexByName[fieldName])) {\n    return indexByName[fieldName];\n  }\n  return Number.MAX_SAFE_INTEGER;\n};\n\nconst compare = new Intl.Collator(undefined, { sensitivity: 'base', numeric: true }).compare;\n\n/** @internal */\nexport const createFieldsOrdererAuto = (orderBy: OrderByItem[]) => (fields: Field[]) => {\n  const firstTimeField = fields.find((f) => f.type === FieldType.time);\n  return fields.slice().sort((fieldA, fieldB) => {\n    if (fieldA === firstTimeField) {\n      return -1;\n    }\n    if (fieldB === firstTimeField) {\n      return 1;\n    }\n    for (let i = 0; i < orderBy.length; i++) {\n      let { type, name = '', desc = false } = orderBy[i];\n\n      let aVal = type === OrderByType.Name ? (fieldA.state?.displayName ?? fieldA.name) : (fieldA.labels?.[name] ?? '');\n      let bVal = type === OrderByType.Name ? (fieldB.state?.displayName ?? fieldB.name) : (fieldB.labels?.[name] ?? '');\n\n      let res = compare(aVal, bVal) * (desc ? -1 : 1);\n\n      if (res !== 0) {\n        return res;\n      }\n    }\n    return 0;\n  });\n};\n"],"names":["OrderByMode","Order","OrderByType"],"mappings":"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"}