<script lang="ts" setup>
import { debounce } from 'lodash-es'
import { computed, defineOptions, nextTick, onMounted, ref, unref, watch } from 'vue'
import CustomFieldModalVue from '../modal/CustomFieldModal.vue'
import WorkSheetList from './WorkSheetList.vue'
import { getViewportOffset } from '@/utils/domUtils'
import { useWorkOrder } from '@/store/modules/workOrder'
import { useWindowSizeFn } from '@/hooks/event/useWindowSizeFn'

defineOptions({ name: 'AsideContent' })

const collapse = ref(false)
const workStore = useWorkOrder()
const filterModalRef = ref(null)
const packageListRef = ref<HTMLDivElement | null>(null)

function collapseHandler() {
  collapse.value = !collapse.value
}

const asideWidth = computed(() => {
  return collapse.value ? 0 : 308
})

const asideStyle = computed(() => {
  return {
    width: `${asideWidth.value}px`,
  }
})

const collapseIcon = computed(() => {
  return collapse.value ? 'expand-cir' : 'collapse-cir'
})

const listHeight = ref(700)

function computeListHeight() {
  const listEl = document.querySelector('.work-sheet-list')!
  const { bottomIncludeBody } = getViewportOffset(listEl)
  const height = bottomIncludeBody
  listHeight.value = height - 25
}

const listStyle = computed(() => {
  return {
    height: `${listHeight.value}px`,
  }
})

useWindowSizeFn(computeListHeight, 280)

onMounted(() => {
  nextTick(() => {
    computeListHeight()
  })
})

const asideEnter = ref(false)

const showCollapse = computed(() => {
  return collapse.value ? true : asideEnter.value
})

function showFilter() {
  const modal = unref(filterModalRef)! as any
  modal.showModal()
}

watch(() => workStore.immersion, () => {
  collapse.value = true
})

const showSearch = ref(false)

function setShowSearch(value: boolean) {
  showSearch.value = value

  if (value === false)
    (packageListRef.value as any).search('')
}

const inputHandler = debounce((word) => {
  (packageListRef.value as any).search(word)
}, 500)
</script>

<template>
  <div class="aside" :style="asideStyle" @mouseenter="asideEnter = true" @mouseleave="asideEnter = false">
    <div v-show="showCollapse" class="aside-collapse">
      <div class="aside-collapse-btn" @click="collapseHandler">
        <SvgIcon :name="collapseIcon" size="40" />
      </div>
    </div>
    <div class="aside-header">
      <div v-show="!showSearch" class="warpper">
        <div class="left">
          <svg-icon name="all-worksheet" size="32" />
          <span style="margin-left: 8px;">所有工单</span>
        </div>
        <div class="right">
          <SvgIcon
            style="cursor: pointer;margin-left: 10px;" size="18" name="magnifying-1"
            @click="setShowSearch(true)"
          />
          <SvgIcon style="cursor: pointer;margin-left: 10px;" size="18" name="filter" @click="showFilter" />
        </div>
      </div>
      <div v-show="showSearch" class="warpper">
        <n-input style="flex: 1;height: 32px;" placeholder="请输入你需要搜索的内容" @input="inputHandler">
          <template #suffix>
            <SvgIcon size="14px" name="magnifying-1" />
          </template>
        </n-input>
        <SvgIcon size="16px" style="margin-left: 6px;cursor: pointer;" name="clear" @click="setShowSearch(false)" />
      </div>
    </div>
    <WorkSheetList ref="packageListRef" class="work-sheet-list" />
    <CustomFieldModalVue ref="filterModalRef" :review-type="1" />
  </div>
</template>

<style lang="less" scoped>
.aside {
  display: flex;
  position: relative;
  flex-direction: column;
  background: #FFF;
  border: 1px solid rgb(239, 239, 245);
  border-radius: 3px;
  box-sizing: border-box;

  &-header {
    padding: 12px 16px;
    width: 100%;
    overflow: hidden;

    .warpper {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    .left {
      display: flex;
      align-items: center;
      overflow: hidden;
    }

    .right {
      display: flex;
      align-items: center;
      overflow: hidden;
    }
  }

  &-divider {
    margin-left: 16px;
    width: 292px;
    height: 1px;
    background-color: #e8e8e8;
  }

  &-collapse {
    width: 2px;
    height: 100%;
    background: #507afd;
    position: absolute;
    right: -2px;
    top: 0;
  }

  &-collapse-btn {
    position: absolute;
    cursor: pointer;
    width: 40px;
    height: 40px;
    top: calc(15%);
    right: -20px;
    z-index: 10;
  }
}
</style>
../types
