{"version":3,"file":"index.mjs","sources":["../../../../src/components/DataTable/index.vue"],"sourcesContent":["<template>\n  <div ref=\"table\" class=\"flex h-full flex-col gap-y-2 sm:gap-y-2 relative\">\n    <div v-if=\"search\" class=\"search-wrapper\">\n      <Input v-model=\"searchModel\" placeholder=\"Search\" />\n      <!-- Display filters -->\n      <div>\n        <slot name=\"filter\" />\n      </div>\n    </div>\n    <RobustNotice\n      v-if=\"displayInfo && isSelectedAll()\"\n      variant=\"info\"\n      class=\"mb-0\"\n    >\n      You've selected {{ selectedRows.length }} entries.\n      <button\n        type=\"button\"\n        class=\"dark:text-primay-300 font-semibold text-primary-400\"\n        @click=\"selectAll(true)\"\n      >\n        Select all.\n      </button>\n    </RobustNotice>\n    <slot name=\"header\" />\n    <div\n      class=\"flex\"\n      :class=\"[\n        options.stickyHeaderClass,\n        horizontalScroll ? 'overflow-scroll' : 'overflow-hidden',\n      ]\"\n    >\n      <div\n        v-bind=\"options.isVirtualised ? containerProps : {}\"\n        :class=\"options.isVirtualised ? 'h-screen flex' : 'w-full'\"\n      >\n        <div\n          v-bind=\"options.isVirtualised ? wrapperProps : {}\"\n          class=\"h-full\"\n          :class=\"\n            options.isVirtualised || options.firstColumnSticky\n              ? 'flex'\n              : 'w-full'\n          \"\n        >\n          <div\n            v-if=\"options.firstColumnSticky\"\n            class=\"flex flex-col sticky left-0 z-20 h-max\"\n          >\n            <div\n              class=\"datatable-grid-column robust-datatable-first-header select-none items-center flex\"\n              :style=\"\n                header?.clientHeight\n                  ? {\n                      height: header.clientHeight + 'px',\n                      width: firstColumnSize,\n                    }\n                  : { width: firstColumnSize }\n              \"\n              :class=\"[\n                headerClass,\n                horizontalScroll ? 'w-max' : '',\n                options.stickyHeader ? 'sticky top-0 z-10' : '',\n              ]\"\n            >\n              <div class=\"checkbox\">\n                <Checkbox\n                  v-if=\"options.selection !== false\"\n                  v-model=\"checkAllModel\"\n                />\n              </div>\n              <div\n                class=\"robust-table-column relative flex min-h-[48px] items-center justify-between w-full\"\n                :class=\"[firstColumn?.class]\"\n              >\n                <div\n                  v-if=\"!$slots[`c_${firstColumn?.key}`]\"\n                  class=\"mr-auto overflow-hidden truncate break-words\"\n                >\n                  {{ firstColumn?.name }}\n                </div>\n                <slot\n                  v-else\n                  :name=\"`c_${firstColumn?.key}`\"\n                  :data=\"firstColumn\"\n                />\n                <button\n                  v-if=\"firstColumn?.sortable !== false\"\n                  type=\"button\"\n                  @click=\"sortColumn(firstColumn, $event)\"\n                >\n                  <PhSortAscending\n                    v-show=\"getDirection(firstColumn) === 1\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                  <PhSortDescending\n                    v-show=\"getDirection(firstColumn) === -1\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                  <PhEquals\n                    v-show=\"getDirection(firstColumn) === 0\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                </button>\n              </div>\n            </div>\n            <Separator\n              v-if=\"!options.removeSeparators\"\n              class=\"hidden sm:block\"\n            />\n            <div>\n              <div\n                v-for=\"(entry, idx) in sortedData\"\n                :key=\"idx\"\n                class=\"flex flex-col justify-between hover:bg-gray-100 hover:dark:bg-gray-700\"\n                @click=\"onClickRow(entry, idx)\"\n                @mouseover=\"emitMouseOverRow($event, entry)\"\n                @mouseleave=\"emitMouseLeaveRow($event, entry)\"\n                @mousemove=\"emitMouseMoveRow($event, entry)\"\n                @mouseenter=\"emitMouseEnterRow($event, entry)\"\n              >\n                <div\n                  class=\"datatable-grid-columns flex flex-col gap-x-2 gap-y-2\"\n                  :class=\"entry.rowClass ?? ''\"\n                >\n                  <!-- Columns -->\n                  <div\n                    class=\"grid min-h-[48px] grid-cols-2 items-center sm:flex\"\n                    :class=\"firstColumn?.class ?? ''\"\n                  >\n                    <div\n                      class=\"block sm:hidden\"\n                      :class=\"firstColumn?.class ?? ''\"\n                    >\n                      {{ firstColumn?.name }}\n                    </div>\n                    <slot\n                      v-if=\"$slots[firstColumn?.key] && !loading\"\n                      :name=\"`${firstColumn?.key}`\"\n                      :data=\"entry\"\n                      :idx=\"idx\"\n                      :on-click=\"() => onClickCell(entry)\"\n                    />\n                    <!-- Column content -->\n                    <div\n                      v-else-if=\"!$slots[firstColumn?.key] && !loading\"\n                      class=\"w-full overflow-hidden break-words\"\n                      @click=\"() => onClickCell(entry)\"\n                    >\n                      {{\n                        entry[firstColumn?.key] === undefined\n                          ? 'No data'\n                          : entry[firstColumn?.key]\n                      }}\n                    </div>\n                    <div\n                      v-else\n                      class=\"loading dark:loading-dark h-6 w-full\"\n                    ></div>\n                  </div>\n                </div>\n                <slot\n                  name=\"collapsed\"\n                  :data=\"entry\"\n                  :style=\"{\n                    display: 'grid',\n                    gridTemplateColumns: sizes,\n                  }\"\n                />\n                <Separator v-if=\"!options.removeSeparators\" />\n              </div>\n            </div>\n          </div>\n          <div\n            ref=\"tableWrapper\"\n            class=\"rows-wrapper h-full flex flex-col flex-1\"\n            :class=\"options.firstColumnSticky && 'h-max'\"\n          >\n            <div\n              ref=\"header\"\n              class=\"datatable-grid-columns robust-datatable-header hidden select-none items-center gap-x-2 sm:grid\"\n              :style=\"{\n                gridTemplateColumns: sizes,\n              }\"\n              :class=\"[\n                headerClass,\n                horizontalScroll ? 'w-max' : '',\n                options.stickyHeader ? 'sticky top-0 z-10' : '',\n              ]\"\n            >\n              <div class=\"checkbox\">\n                <Checkbox\n                  v-if=\"options.selection !== false\"\n                  v-model=\"checkAllModel\"\n                />\n              </div>\n              <div\n                v-for=\"column in tableColumns\"\n                :key=\"column.key\"\n                class=\"robust-table-column relative flex min-h-[48px] items-center justify-between\"\n                :class=\"[column.class]\"\n              >\n                <div\n                  v-if=\"!$slots[`c_${column.key}`]\"\n                  class=\"mr-auto overflow-hidden truncate break-words\"\n                >\n                  {{ column.name }}\n                </div>\n                <slot v-else :name=\"`c_${column.key}`\" :data=\"column\" />\n                <button\n                  v-if=\"column.sortable !== false\"\n                  type=\"button\"\n                  @click=\"sortColumn(column, $event)\"\n                >\n                  <PhSortAscending\n                    v-show=\"getDirection(column) === 1\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                  <PhSortDescending\n                    v-show=\"getDirection(column) === -1\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                  <PhEquals\n                    v-show=\"getDirection(column) === 0\"\n                    class=\"text-gray-500\"\n                    :size=\"20\"\n                  />\n                </button>\n              </div>\n            </div>\n\n            <Separator\n              v-if=\"!options.removeSeparators\"\n              class=\"hidden sm:block\"\n            />\n\n            <div\n              :class=\"[\n                !options.firstColumnSticky &&\n                  'overflow-y-auto scrollable-content overflow-x-auto',\n                horizontalScroll ? 'w-max' : '',\n              ]\"\n            >\n              <!-- Rows -->\n\n              <div\n                v-for=\"(entry, idx) in sortedData\"\n                :key=\"idx\"\n                class=\"flex flex-col justify-between hover:bg-gray-100 hover:dark:bg-gray-700\"\n                @click=\"onClickRow(entry, idx)\"\n                @mouseover=\"emitMouseOverRow($event, entry)\"\n                @mouseleave=\"emitMouseLeaveRow($event, entry)\"\n                @mousemove=\"emitMouseMoveRow($event, entry)\"\n                @mouseenter=\"emitMouseEnterRow($event, entry)\"\n              >\n                <div v-if=\"entry.isHeader\">\n                  <slot\n                    name=\"header-row\"\n                    :data=\"entry\"\n                    :style=\"{\n                      gridTemplateColumns: sizes,\n                    }\"\n                  />\n                </div>\n                <div v-else>\n                  <div\n                    class=\"datatable-grid-columns flex flex-col gap-x-2 gap-y-2 sm:grid sm:items-center\"\n                    :style=\"{\n                      gridTemplateColumns: sizes,\n                    }\"\n                    :class=\"entry.rowClass ?? ''\"\n                  >\n                    <div>\n                      <Checkbox\n                        v-if=\"options.selection !== false\"\n                        v-model=\"checkboxSelected\"\n                        :value=\"entry[options.id]\"\n                      />\n                    </div>\n                    <!-- Columns -->\n                    <div\n                      v-for=\"column in tableColumns\"\n                      :key=\"column.key\"\n                      class=\"grid min-h-[48px] grid-cols-2 items-center sm:flex\"\n                      :class=\"column.class ?? ''\"\n                    >\n                      <div class=\"block sm:hidden\" :class=\"column.class ?? ''\">\n                        {{ column.name }}\n                      </div>\n                      <slot\n                        v-if=\"$slots[column.key] && !loading\"\n                        :name=\"`${column.key}`\"\n                        :data=\"entry\"\n                        :idx=\"idx\"\n                        :on-click=\"() => onClickCell(entry)\"\n                      />\n                      <!-- Column content -->\n                      <div\n                        v-else-if=\"!$slots[column.key] && !loading\"\n                        class=\"w-full overflow-hidden break-words\"\n                        @click=\"() => onClickCell(entry)\"\n                      >\n                        {{\n                          entry[column.key] === undefined\n                            ? 'No data'\n                            : entry[column.key]\n                        }}\n                      </div>\n                      <div\n                        v-else\n                        class=\"loading dark:loading-dark h-6 w-full\"\n                      ></div>\n                    </div>\n                  </div>\n                  <slot\n                    name=\"collapsed\"\n                    :data=\"entry\"\n                    :style=\"{\n                      display: 'grid',\n                      gridTemplateColumns: sizes,\n                    }\"\n                  />\n                </div>\n                <Separator v-if=\"!options.removeSeparators\" />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <slot\n    v-if=\"$slots.footer\"\n    name=\"footer\"\n    :data=\"{\n      size: sizes,\n    }\"\n  />\n  <div v-if=\"isFooterVisible\" class=\"flex items-center justify-between py-2\">\n    <div v-if=\"page !== undefined\" class=\"flex items-center gap-x-2\">\n      <div class=\"flex gap-x-2\">\n        <PhCaretDoubleLeft :size=\"24\" @click=\"firstPage\" />\n        <PhCaretLeft :size=\"24\" @click=\"prevPage\" />\n      </div>\n      <div>{{ page }}</div>\n      <div class=\"flex gap-x-2\">\n        <PhCaretRight :size=\"24\" @click=\"nextPage\" />\n        <PhCaretDoubleRight :size=\"24\" @click=\"lastPage\" />\n      </div>\n    </div>\n    <div\n      v-if=\"rowsLimitOptions !== undefined\"\n      class=\"flex items-center gap-x-2\"\n    >\n      <div>Rows per page:</div>\n      <Select\n        v-model=\"rowsLimit\"\n        :options=\"rowsLimitOptions\"\n        @change=\"rowsLimitChange\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from 'vue';\nimport { onMounted, onUnmounted, PropType, ref, toRefs, watch } from 'vue';\nimport Separator from '../Separator/index.vue';\nimport {\n  PhSortDescending,\n  PhSortAscending,\n  PhCaretLeft,\n  PhCaretDoubleLeft,\n  PhCaretRight,\n  PhCaretDoubleRight,\n  PhEquals,\n} from '@phosphor-icons/vue';\nimport Select from '../Select/index.vue';\nimport Checkbox from '../Checkbox/index.vue';\nimport Input from '../Input/index.vue';\nimport Fuse from 'fuse.js';\nimport { debouncedWatch } from '@vueuse/shared';\nimport { RobustNotice } from '..';\nimport { useVirtualList } from '@vueuse/core';\n\nexport type Direction = 0 | -1 | 1;\n\nexport interface Column {\n  key: string;\n  name: string;\n  class?: string;\n  size?: string;\n  direction?: Direction;\n  sortable?: boolean;\n  resizable?: boolean;\n  fixed?: boolean;\n  sort?: (\n    a: number | string | boolean,\n    b: number | string | boolean,\n    direction: 'asc' | 'desc'\n  ) => number;\n}\n\ntype DataTableOptions = {\n  columns: Column[];\n  /* key of identifier */\n  id: string;\n  serverSide?: boolean;\n  rowsLimit?: number;\n  page?: number;\n  maxPage: number;\n  rowsLimitOptions?: number[];\n  searchKeys?: string[];\n  resize: boolean;\n  minColSize: number;\n  ghostColumns?: boolean;\n  defaultColSize?: string;\n  selection?: boolean;\n  search?: boolean;\n  searchModel?: string;\n  robustSearch?: boolean;\n  stickyHeader?: boolean;\n  stickyHeaderClass?: string;\n  firstColumnSticky?: boolean;\n  removeSeparators?: boolean;\n  isVirtualised?: boolean;\n};\n\nconst defaultOptions: Partial<DataTableOptions> = {\n  serverSide: false,\n  rowsLimit: 10,\n  page: 1,\n  maxPage: 1,\n  rowsLimitOptions: [10, 25, 50],\n  resize: true,\n  minColSize: 100,\n  ghostColumns: true,\n  defaultColSize: '150px',\n  selection: true,\n  search: true,\n  searchModel: '',\n  isVirtualised: false,\n};\n\nconst props = defineProps({\n  data: {\n    type: Array as PropType<Record<string, unknown>[]>,\n    required: true,\n  },\n  options: {\n    type: Object as PropType<DataTableOptions>,\n    required: true,\n  },\n  loading: {\n    type: Boolean,\n    default: false,\n  },\n  headerClass: {\n    type: String,\n    default: () => '',\n  },\n  horizontalScroll: {\n    type: Boolean,\n    default: false,\n  },\n});\n\nconst emit = defineEmits([\n  'update:page',\n  'update:rowsLimit',\n  'update:sort',\n  'update:search',\n  'update:selectedRows',\n  'update:resize',\n  'clickRow',\n  'clickCell',\n  'onHoverRow',\n  'onLeaveRow',\n  'onMoveRow',\n  'onEnterRow',\n]);\n\nconst { data, options, loading, headerClass, horizontalScroll } = toRefs(props);\n\nconst table = ref();\nconst header = ref();\nconst tableWrapper = ref();\nconst search = ref(\n  options.value.search === undefined\n    ? defaultOptions.search\n    : options.value.search\n);\n\nconst minColSize = computed(() => {\n  return options.value.minColSize ?? defaultOptions.minColSize;\n});\n\nconst fuseOptions = computed(() => ({\n  includeScore: false,\n  keys: options.value.searchKeys ?? options.value.columns.map((c) => c.key),\n  threshold: 0.3,\n}));\n\nconst checkAllModel = computed({\n  get() {\n    return selectedRows.value.length > 0 || selectedAll.value;\n  },\n  set(value) {\n    if (!value) {\n      selectedRows.value = [];\n      emit('update:selectedRows', {\n        type: 'include',\n        data: selectedRows.value,\n      });\n      selectAll(false);\n    } else {\n      selectedRows.value = sortedData.value.map((d) => d[options.value.id]);\n      emit('update:selectedRows', {\n        type: 'include',\n        data: selectedRows.value,\n      });\n      displayInfo.value = true;\n    }\n  },\n});\n\n// const checkAllModel = computed(() => selectedRows.value.length > 0)\n\nconst selectedRows = ref([]);\nconst excludedRows = ref([]);\nconst searchModel = ref(\n  options.value.searchModel === undefined\n    ? defaultOptions.searchModel\n    : options.value.searchModel\n);\nconst displayInfo = ref(false);\nconst selectedAll = ref(false);\n\nconst checkboxSelected = computed({\n  get() {\n    return selectedRows.value;\n  },\n  set(value) {\n    if (options.value.serverSide && selectedAll.value) {\n      const excluded = [];\n      for (const row of data.value) {\n        if (!value.includes(row[options.value.id])) {\n          excluded.push(row[options.value.id]);\n        }\n      }\n      excludedRows.value = excluded;\n    } else {\n      emit('update:selectedRows', {\n        type: 'include',\n        data: selectedRows.value,\n      });\n    }\n  },\n});\n\nconst rowsLimitController = ref(options.value.rowsLimit ?? data.value.length);\nconst rowsLimit = computed({\n  get() {\n    if (options.value.serverSide) {\n      return options.value.rowsLimit;\n    }\n    return rowsLimitController.value;\n  },\n  set(value: number) {\n    rowsLimitController.value = value;\n  },\n});\n\nconst rowsLimitOptionsInit = () => {\n  const optionsArray = options.value.rowsLimitOptions;\n  if (!optionsArray) {\n    return undefined;\n  }\n  return optionsArray.map((o) => ({\n    value: o,\n    title: `${o}`,\n  }));\n};\nconst rowsLimitOptions = ref(rowsLimitOptionsInit());\n\nconst ghostColumns = computed(() => {\n  if (\n    options.value.ghostColumns === undefined ||\n    options.value.ghostColumns === true\n  ) {\n    return rowsLimit.value;\n  }\n  return sortedData.value.length;\n});\n\nconst { list, containerProps, wrapperProps } = useVirtualList(props.data, {\n  itemHeight: 40,\n  overscan: 2,\n});\n\nconst sortedData = computed(() => {\n  if (loading.value) {\n    return Array(rowsLimit.value).fill({});\n  }\n  if (options.value.serverSide) {\n    return data.value;\n  }\n  if (options.value.isVirtualised) {\n    const data = list.value.map((d) => {\n      return d.data;\n    });\n    return data;\n  }\n  const sorted = sortData();\n  gotoPage(page.value);\n  const pageOffset = page.value - 1;\n  const currPage = pageOffset * rowsLimit.value;\n  return sorted.slice(currPage, currPage + rowsLimit.value);\n});\n\nconst initMaxPage = () => {\n  if (options.value.serverSide) {\n    return options.value.maxPage ?? defaultOptions.maxPage;\n  }\n  return Math.ceil(data.value.length / rowsLimit.value);\n};\nconst maxPageController = ref(initMaxPage());\n\nconst maxPage = computed({\n  get() {\n    if (options.value.serverSide) {\n      return initMaxPage();\n    }\n    return maxPageController.value;\n  },\n  set(value) {\n    maxPageController.value = value;\n  },\n});\n\nconst initPage = () => {\n  if (!options.value.page) {\n    return defaultOptions.page;\n  }\n  if (options.value.page > maxPage.value) {\n    return defaultOptions.page;\n  }\n  return options.value.page;\n};\n\nconst pageController = ref(initPage());\n\nconst page = computed({\n  get() {\n    if (options.value.serverSide) {\n      return options.value.page;\n    }\n    return pageController.value;\n  },\n  set(value) {\n    pageController.value = value;\n  },\n});\n\nconst initSorting = () => {\n  const sortArray: Column[] = [];\n  for (const column of options.value.columns) {\n    sortArray.push({\n      direction: 0,\n      ...column,\n    });\n  }\n  return sortArray;\n};\n\n// Used for storing column order direction\n// key: Column.key\n// value: Sort\nconst sorting = ref<Column[]>(initSorting());\n\nconst isPercentage = (str: string) => {\n  if (str) {\n    return str.includes('%');\n  }\n};\n\nconst isPx = (str: string) => {\n  if (str) {\n    return str.includes('px');\n  }\n};\n\nconst initSizes = () => {\n  const colsSizeArray = options.value.columns.map(\n    (c) =>\n      c.size ?? options.value.defaultColSize ?? defaultOptions.defaultColSize\n  );\n\n  // checkbox\n  const size = options.value.selection === false ? '0px' : '24px';\n  colsSizeArray.unshift(size);\n  return colsSizeArray;\n};\n\nconst sizesController = ref(initSizes());\n\nconst sizes = computed(() => {\n  let controller = [...sizesController.value];\n  if (options.value.firstColumnSticky) {\n    controller.splice(1, 1);\n  }\n  const colsSizeArray = controller.map((size) => {\n    return size !== undefined ? `${size}` : `minmax(0,1fr)`;\n  });\n  return colsSizeArray.join(' ');\n});\n\nconst firstColumnSize = computed(() => {\n  return sizesController.value[1];\n});\n\nconst firstColumn = computed(() => {\n  return options.value.columns[0];\n});\n\nconst tableColumns = computed(() => {\n  if (options.value.firstColumnSticky) {\n    return options.value.columns.slice(1);\n  } else {\n    return options.value.columns;\n  }\n});\n\nconst robustSearch = (search: string, data: unknown[], keys: string[]) => {\n  const matchingDataMapped = data.map((d: any) => {\n    const matchingFilter = [];\n    keys.forEach((k) => matchingFilter.push(String(d[k]).toLowerCase()));\n    d.matchingFilter = matchingFilter;\n    return d;\n  });\n\n  const searchWords = search.toLowerCase().split(' ');\n\n  const filteredData = matchingDataMapped.filter((d: any) => {\n    const searchWordsMatchAny = searchWords.every((s: string) =>\n      d.matchingFilter.some((f: any) => f.includes(s))\n    );\n\n    return (\n      d.matchingFilter.includes(String(search).toLowerCase()) ||\n      searchWordsMatchAny\n    );\n  });\n\n  return filteredData;\n};\n\nconst sortData = () => {\n  let cpData = Array.from(data.value);\n\n  if (searchModel.value !== '') {\n    if (options.value.robustSearch) {\n      cpData = robustSearch(searchModel.value, cpData, fuseOptions.value.keys);\n    } else {\n      const fuse = new Fuse(cpData, fuseOptions.value);\n      cpData = fuse.search(searchModel.value).map((d) => d.item);\n    }\n  }\n\n  if (!options.value.serverSide) {\n    maxPage.value = Math.ceil(cpData.length / rowsLimit.value);\n  }\n\n  const sorted = cpData.sort((a, b) => {\n    for (const sort of sorting.value) {\n      // Skip unsorted keys\n      if (sort.direction === 0) {\n        continue;\n      }\n\n      const sortKey = sort.key;\n\n      if (sort.direction === -1) {\n        if (sort.sort) {\n          const rSort = sort.sort(\n            (a as any)[sortKey],\n            (b as any)[sortKey],\n            'desc'\n          );\n          if (rSort) {\n            return rSort;\n          }\n        } else {\n          if (a[sortKey] > b[sortKey]) {\n            return -1;\n          }\n          if (a[sortKey] < b[sortKey]) {\n            return 1;\n          }\n        }\n      } else if (sort.direction === 1) {\n        if (sort.sort) {\n          const rSort = sort.sort(\n            (a as any)[sortKey],\n            (b as any)[sortKey],\n            'asc'\n          );\n          if (rSort) {\n            return rSort;\n          }\n        } else {\n          if (a[sortKey] > b[sortKey]) {\n            return 1;\n          }\n          if (a[sortKey] < b[sortKey]) {\n            return -1;\n          }\n        }\n      }\n    }\n  });\n  return sorted;\n};\n\nconst sortOnShiftClick = (cSort: Column) => {\n  const index = sorting.value.findIndex((s) => s.key === cSort.key);\n  const tempSortObj = sorting.value[index];\n\n  // on click at the latest clicked column change direction\n  if (tempSortObj.direction === 0 || index === sorting.value.length - 1) {\n    // changing direction based on current direction\n    // 0 to 1 (default to ascending)\n    // 1 to -1 (ascending to descending)\n    // -1 to 0 (descending to default)\n    switch (tempSortObj.direction) {\n      case 0:\n        tempSortObj.direction = 1;\n        break;\n      case 1:\n        tempSortObj.direction = -1;\n        break;\n      default:\n        tempSortObj.direction = 0;\n    }\n  }\n  // otherwise we reset column to default value\n  else {\n    tempSortObj.direction = 0;\n  }\n\n  sorting.value.splice(index, 1);\n\n  // placing element at the end of the array to keep history\n  // in case of ascending and descendng direction\n  if (tempSortObj.direction) {\n    sorting.value.push(tempSortObj);\n  }\n  // if element is at default direction\n  // placing it at the beginning\n  else {\n    sorting.value.unshift(tempSortObj);\n  }\n\n  // emit directions for server side sorting\n  const directions = sorting.value.filter((c) => c.direction !== 0);\n  emit('update:sort', directions);\n};\n\nconst sortOnSimpleClick = (cSort: Column) => {\n  const index = sorting.value.findIndex((s) => s.key === cSort.key);\n  const tempSortObj = sorting.value[index];\n\n  // changing direction based on current direction\n  // 0 to 1 (default to ascending)\n  // 1 to -1 (ascending to descending)\n  // -1 to 0 (descending to default)\n  switch (tempSortObj.direction) {\n    case 0:\n      tempSortObj.direction = 1;\n      break;\n    case 1:\n      tempSortObj.direction = -1;\n      break;\n    default:\n      tempSortObj.direction = 0;\n  }\n\n  sorting.value.splice(index, 1);\n\n  // Resetting all other column directions on slimple click\n  // Shift + Click used for multiple sorting\n  sorting.value = sorting.value.map((cSort) => ({\n    ...cSort,\n    direction: 0,\n  }));\n\n  // placing element at the end of the array to keep history\n  // in case of ascending and descendng direction\n  sorting.value.push(tempSortObj);\n\n  // emit directions for server side sorting\n  const directions = sorting.value.filter((c) => c.direction !== 0);\n  emit('update:sort', directions);\n};\n\nconst sortColumn = (cSort: Column, event: MouseEvent) => {\n  if (loading.value) {\n    return;\n  }\n  // if sortable is explicitly false -> not sorting\n  // since it's sortable by default\n  if (cSort.sortable === false) {\n    return;\n  }\n  if (event.shiftKey) {\n    return sortOnShiftClick(cSort);\n  }\n  return sortOnSimpleClick(cSort);\n};\n\nconst getDirection = (column: Column) => {\n  const dir = sorting.value.find((s) => s.key === column.key);\n  if (dir) {\n    return dir.direction;\n  }\n  const foundColumn = options.value.columns.find(\n    (col) => col.key === column.key\n  );\n  const newColumn = {\n    direction: 0,\n    ...foundColumn,\n  };\n  sorting.value.push(newColumn as Column);\n  return newColumn;\n};\n\nconst clamp = (num: number, min: number, max: number) =>\n  Math.min(Math.max(num, min), max);\n\nconst gotoPage = (pageNum: number, emitEvent = true) => {\n  if (loading.value) {\n    return;\n  }\n  if (options.value.serverSide) {\n    if (emitEvent) {\n      emit('update:page', pageNum);\n    }\n    return;\n  }\n  page.value = clamp(pageNum, 1, maxPage.value);\n};\n\nconst nextPage = () => gotoPage(page.value + 1);\nconst prevPage = () => gotoPage(page.value - 1);\nconst firstPage = () => gotoPage(1);\nconst lastPage = () => {\n  if (!options.value.serverSide) {\n    return gotoPage(Infinity);\n  }\n  return gotoPage(options.value.maxPage);\n};\n\nconst rowsLimitChange = (newLimit: number) => {\n  rowsLimit.value = newLimit;\n  gotoPage(page.value);\n  emit('update:rowsLimit', newLimit);\n};\n\ndebouncedWatch(\n  searchModel,\n  () => {\n    emit('update:search', searchModel.value);\n  },\n  {\n    debounce: 150,\n  }\n);\n\nwatch(maxPage, () => {\n  gotoPage(page.value);\n});\n\nwatch(excludedRows, () => {\n  if (options.value.serverSide && selectedAll.value) {\n    emit('update:selectedRows', {\n      type: 'exclude',\n      data: excludedRows.value,\n    });\n  }\n});\n\nwatch(data, () => {\n  if (options.value.serverSide && selectedAll.value) {\n    const newSelectedRows = [];\n    for (const row of data.value) {\n      if (!excludedRows.value.includes(row[options.value.id])) {\n        newSelectedRows.push(row[options.value.id]);\n      }\n    }\n    selectedRows.value = newSelectedRows;\n  }\n  if (options.value.rowsLimit === undefined) {\n    rowsLimitController.value = data.value.length;\n  }\n});\n\n/*\n Resets column sizes to px value.\n**/\n// TODO: Bring back gap-x-2 between columns\nconst resetSizes = (resizable = false) => {\n  const tableEl = table.value;\n  const cols: HTMLElement[] = tableEl.querySelectorAll('.robust-table-column');\n  const rowsWrapper = tableEl.querySelector('.rows-wrapper');\n  const sizes: string[] = [];\n  cols.forEach((col, idx) => {\n    if (resizable && options.value.columns[idx].fixed !== true) {\n      const perc =\n        col && rowsWrapper\n          ? (col.clientWidth / rowsWrapper.clientWidth) * 100\n          : 0;\n      sizesController.value[idx + 1] = `minmax(0, ${perc}%)`;\n      sizes.push(`${perc}%`);\n    } else {\n      sizesController.value[idx + 1] = `${col.clientWidth}px`;\n      sizes.push(`${col.clientWidth}px`);\n    }\n  });\n  if (resizable) {\n    emit('update:resize', sizes);\n  }\n};\n\nconst initColSize = (sizes: string[]) => {\n  sizes.forEach((sz, idx) => {\n    sizesController.value[idx + 1] = `minmax(0, ${sz})`;\n  });\n};\n\n/*\n  Creates resizable column by adding event listeners.\n  Calculates new size of column by calculating offset\n  of mouse x position before and after resize.\n**/\nconst createResizableColumn = function (\n  col: HTMLElement,\n  resizer: HTMLElement,\n  resizerHandle: HTMLElement,\n  idx: number\n) {\n  if (!options.value.resize) {\n    return;\n  }\n  // Track the current position of mouse\n  let x = 0;\n  let w = 0;\n\n  // Storing width of coulmn and mouse X position\n  // for calculating offset between current and new X postion\n  const mouseDownHandler = function (e: MouseEvent) {\n    resetSizes();\n    const currentCol = idx + 1;\n    sizesController.value[currentCol + 1] =\n      `minmax(${minColSize.value}px, 1fr)`;\n    // Get the current mouse position\n    x = e.clientX;\n\n    // Calculate the current width of column\n    w = col.clientWidth;\n\n    // Attach listeners for document's events\n    document.addEventListener('mousemove', mouseMoveHandler);\n    document.addEventListener('mouseup', mouseUpHandler);\n    const body = document.querySelector('body');\n    body.classList.add('resizer-cursor');\n\n    const resizers = document.querySelectorAll('.resizer');\n    resizers.forEach((r) => r.classList.add('resizer-not-active'));\n\n    resizer.classList.remove('resizer-not-active');\n    resizer.classList.add('resizing');\n  };\n\n  const mouseMoveHandler = function (e: MouseEvent) {\n    // Determine how far the mouse has been moved\n    const dx = e.clientX - x;\n    const calculatedWidth = w + dx;\n\n    const currentCol = idx + 1;\n    const size = Math.max(calculatedWidth, minColSize.value);\n\n    // Update the width of column\n    sizesController.value[currentCol] =\n      `minmax(${minColSize.value}px,${size}px)`;\n\n    // we set next column size to 1fr such that\n    // it adapts to newly calculated width of previous column\n    // const nextColWidth = Math.max(\n    //   parseInt(sizesController.value[currentCol + 1]) - dx,\n    //   minColSize.value\n    // );\n    // const normalized = isNaN(nextColWidth) ? minColSize.value : nextColWidth;\n    // sizesController.value[\n    //   currentCol + 1\n    // ] = `minmax(${minColSize.value}px, 1fr)`;\n  };\n\n  // When user releases the mouse, remove the existing event listeners\n  const mouseUpHandler = function () {\n    document.removeEventListener('mousemove', mouseMoveHandler);\n    document.removeEventListener('mouseup', mouseUpHandler);\n    resetSizes(true);\n\n    const body = document.querySelector('body');\n    body.classList.remove('resizer-cursor');\n\n    const resizers = document.querySelectorAll('.resizer');\n    resizers.forEach((r) => r.classList.remove('resizer-not-active'));\n    resizer.classList.remove('resizing');\n  };\n\n  resizerHandle.addEventListener('mousedown', mouseDownHandler);\n};\n\n// resetting resize Line\nconst resizeLine = () => {\n  if (!options.value.resize) {\n    return;\n  }\n  const tableEl = table.value;\n  if (!tableEl) {\n    return;\n  }\n  const cols: HTMLElement[] = tableEl.querySelectorAll('.robust-table-column');\n  const rowsWrapper = tableEl.querySelector('.rows-wrapper');\n\n  cols.forEach((col, i) => {\n    if (i < cols.length - 1) {\n      const resizer = col.querySelector<HTMLDivElement>('.resizer');\n      const resizerHandle =\n        col.querySelector<HTMLDivElement>('.resizer-handle');\n\n      if (resizer) {\n        resizer.style.height = `${rowsWrapper.clientHeight}px`;\n      }\n\n      if (resizerHandle) {\n        resizerHandle.style.height = `${header.value.clientHeight}px`;\n      }\n    }\n  });\n};\n\nconst createResizableTable = () => {\n  if (!options.value.resize || horizontalScroll.value) {\n    return;\n  }\n\n  const tableEl = table.value;\n  if (!tableEl) {\n    return;\n  }\n  const cols: HTMLElement[] = tableEl.querySelectorAll('.robust-table-column');\n  const rowsWrapper = tableEl.querySelector('.rows-wrapper');\n\n  cols.forEach((col, idx) => {\n    if (idx < cols.length - 1) {\n      if (options.value.columns[idx].resizable === false) {\n        return;\n      }\n      const resizer = document.createElement('div');\n      const resizerHandle = document.createElement('div');\n\n      resizerHandle.addEventListener('click', (e) => e.stopPropagation());\n\n      resizer.classList.add('resizer');\n      resizerHandle.classList.add('resizer-handle');\n\n      resizerHandle.style.height = `${header.value.clientHeight}px`;\n      resizerHandle.style.zIndex = '2';\n      resizer.style.height = `${rowsWrapper.clientHeight}px`;\n      col.appendChild(resizerHandle);\n      col.appendChild(resizer);\n      createResizableColumn(col, resizer, resizerHandle, idx);\n    }\n  });\n\n  // resetSizes()\n};\n\nconst selectAll = (value: boolean) => {\n  selectedAll.value = value;\n\n  if (selectedAll.value) {\n    selectedRows.value = data.value.map((d) => d[options.value.id]);\n    emit('update:selectedRows', {\n      type: 'exclude',\n      data: [],\n    });\n    displayInfo.value = false;\n  } else {\n    if (options.value.serverSide) {\n      excludedRows.value = [];\n    }\n    selectedRows.value = [];\n    displayInfo.value = false;\n  }\n};\n\nconst isFooterVisible = computed(() => {\n  return maxPage.value > 1 || rowsLimitOptions.value !== undefined;\n});\n\nconst isSelectedAll = () => {\n  return (\n    (!options.value.serverSide &&\n      selectedRows.value.length !== data.value.length) ||\n    options.value.serverSide\n  );\n};\n\nconst onClickRow = (data: any, idx: number) => {\n  emit('clickRow', data, idx);\n};\n\nconst onClickCell = (data: any) => {\n  emit('clickCell', data);\n};\n\nlet resizeObserver: ResizeObserver;\n\nconst onResize = () => {\n  resizeLine();\n};\n\nconst getSpace = () => {\n  // gap between columns 8px\n  const padding = 8;\n  let sizes = options.value.columns.map((c) => {\n    if (c.size && !isPercentage(c.size) && !isPx(c.size)) {\n      throw Error('Only \"px\" and \"%\" units are allowed for column size!');\n    }\n    const size =\n      c.size ?? options.value.defaultColSize ?? defaultOptions.defaultColSize;\n    const type = isPercentage(size) ? '%' : 'px';\n    return {\n      type,\n      value: parseInt(size),\n    };\n  });\n  const headerWidth = header.value.clientWidth;\n  const checkboxWidth =\n    header.value.querySelector('.checkbox').clientWidth + padding;\n  const availableSpace = headerWidth - checkboxWidth;\n  const fixedSpace = sizes\n    .filter((c) => c.type === 'px')\n    .reduce((acc, curr) => acc + curr.value, 0);\n  const percentages = sizes\n    .filter((c) => c.type === '%')\n    .reduce((acc, curr) => acc + curr.value, 0);\n  const scale = availableSpace / fixedSpace;\n  const percentageScale = 100 / percentages;\n  const responsiveSpace = Math.max(availableSpace - fixedSpace, 0);\n  const perc = (c: any) => {\n    const t = ((c.value * percentageScale) / 100) * responsiveSpace;\n    const t2 = (t / availableSpace) * 100;\n    return t2;\n  };\n  if (fixedSpace > availableSpace) {\n    sizes = sizes.map((c) => ({\n      ...c,\n      value: c.type === 'px' ? c.value * scale : c.value,\n    }));\n  }\n  sizes = sizes.map((c) => ({\n    ...c,\n    value: c.type === '%' ? perc(c) : c.value,\n  }));\n\n  if (horizontalScroll.value && tableWrapper.value) {\n    // Transform percentages in px\n    sizes = sizes.map((c) => ({\n      ...c,\n      value: c.type === '%' ? c.value * (availableSpace / 100) : c.value,\n      type: 'px',\n    }));\n    const tableWidth = tableWrapper.value.clientWidth;\n    if (headerWidth < tableWidth) {\n      const diff = tableWidth - headerWidth;\n      sizes = sizes.map((c) => ({\n        ...c,\n        value: c.value + diff / sizes.length,\n      }));\n    }\n  }\n  return {\n    sizes,\n    available: availableSpace,\n    responsive_space: responsiveSpace,\n  };\n};\n\nconst emitMouseOverRow = (e: MouseEvent, data: any) => {\n  emit('onHoverRow', e, data);\n};\n\nconst emitMouseMoveRow = (e: MouseEvent, data: any) => {\n  emit('onMoveRow', e, data);\n};\n\nconst emitMouseEnterRow = (e: MouseEvent, data: any) => {\n  emit('onEnterRow', e, data);\n};\n\nconst emitMouseLeaveRow = (e: MouseEvent, data: any) => {\n  emit('onLeaveRow', e, data);\n};\n\nconst initSpace = () => {\n  const space = getSpace();\n  const newSizeValues = space.sizes.map((s) => s.value + s.type);\n  initColSize(newSizeValues);\n};\n\nwatch(\n  () => options.value.columns,\n  () => {\n    initSpace();\n  },\n  {\n    deep: true,\n  }\n);\n\nwatch(\n  () => horizontalScroll,\n  () => {\n    initSpace();\n  },\n  {\n    deep: true,\n  }\n);\n\nonMounted(() => {\n  createResizableTable();\n  initSpace();\n  resizeObserver = new ResizeObserver(onResize);\n  resizeObserver.observe(table.value);\n});\n\nonUnmounted(() => {\n  resizeObserver?.disconnect();\n});\n</script>\n\n<style lang=\"postcss\">\n/* .datatable-grid-columns { */\n/*   grid-template-columns: v-bind('sizes'); */\n/* } */\n\n/* use v-bind for (max rows per page) */\n.datatable-grid-rows {\n  display: grid;\n  grid-template-rows: repeat(v-bind(ghostColumns), minmax(0, 1fr));\n}\n\n.datatable-grid-rows-empty {\n  display: grid;\n  grid-template-rows: repeat(v-bind(ghostColumns), minmax(0, 3.57rem));\n}\n\n@keyframes shine {\n  to {\n    background-position-x: -200%;\n  }\n}\n\n.loading {\n  background: linear-gradient(110deg, #ececec 8%, #f5f5f5 18%, #ececec 33%);\n  border-radius: 5px;\n  background-size: 200% 100%;\n  animation: 1s shine linear infinite;\n}\n\n.dark .dark\\:loading-dark {\n  background: linear-gradient(110deg, #1f2937 8%, #374151 18%, #1f2937 33%);\n  border-radius: 5px;\n  background-size: 200% 100%;\n  animation: 1s shine linear infinite;\n}\n\n.search-wrapper {\n  display: grid;\n  grid-template-columns: minmax(0, 24rem) minmax(0, 1fr);\n  align-items: center;\n  column-gap: 1rem;\n}\n\n.resizer {\n  position: absolute;\n  top: 0;\n  right: -4px;\n  width: 1px;\n  user-select: none;\n  height: 999999px;\n}\n\n.resizer-handle {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  right: -8px;\n  width: 8px;\n  cursor: col-resize;\n}\n\n.resizer-handle:hover + .resizer:not(.resizer-not-active) {\n  @apply visible flex bg-gray-400;\n}\n\n.resizing {\n  @apply visible flex bg-gray-400;\n}\n\n.robust-table-column.robust-table-column-not-active {\n  cursor: col-resize;\n}\n\n.resizer-cursor * {\n  cursor: col-resize;\n}\n</style>\n"],"names":["defaultOptions","props","__props","emit","__emit","data","options","loading","headerClass","horizontalScroll","toRefs","table","ref","header","tableWrapper","search","minColSize","computed","fuseOptions","c","checkAllModel","selectedRows","selectedAll","value","sortedData","d","displayInfo","selectAll","excludedRows","searchModel","checkboxSelected","excluded","row","rowsLimitController","rowsLimit","rowsLimitOptions","optionsArray","o","ghostColumns","list","containerProps","wrapperProps","useVirtualList","sorted","sortData","gotoPage","page","currPage","initMaxPage","maxPageController","maxPage","pageController","sorting","sortArray","column","isPercentage","str","isPx","sizesController","colsSizeArray","size","sizes","controller","firstColumnSize","firstColumn","tableColumns","robustSearch","keys","matchingDataMapped","matchingFilter","k","searchWords","searchWordsMatchAny","f","cpData","Fuse","a","b","sort","sortKey","rSort","sortOnShiftClick","cSort","index","s","tempSortObj","directions","sortOnSimpleClick","sortColumn","event","getDirection","dir","newColumn","col","clamp","num","min","max","pageNum","emitEvent","nextPage","prevPage","firstPage","lastPage","rowsLimitChange","newLimit","debouncedWatch","watch","newSelectedRows","resetSizes","resizable","tableEl","cols","rowsWrapper","idx","perc","initColSize","sz","createResizableColumn","resizer","resizerHandle","x","w","mouseDownHandler","e","currentCol","mouseMoveHandler","mouseUpHandler","r","dx","calculatedWidth","resizeLine","i","createResizableTable","isFooterVisible","isSelectedAll","onClickRow","onClickCell","resizeObserver","onResize","getSpace","headerWidth","checkboxWidth","availableSpace","fixedSpace","acc","curr","percentages","scale","percentageScale","responsiveSpace","tableWidth","diff","emitMouseOverRow","emitMouseMoveRow","emitMouseEnterRow","emitMouseLeaveRow","initSpace","newSizeValues","onMounted","onUnmounted"],"mappings":"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"}