AgGridCustomDateComponent.vue 5.31 KB
<!--
 * Ag Grid 自定义日期组件
 * https://www.ag-grid.com/vue-data-grid/component-date/
 -->
<script lang="ts">
import { ref, reactive, defineComponent } from 'vue';
import { AgGridVue } from 'ag-grid-vue3';
// import { date } from 'quasar';

import Com from 'src/components';
import AG_GRID_LOCALE from 'src/config/ag-grid-locale';
import { isEmpty } from 'src/common/utils';

export default defineComponent({
  name: 'AgGridCustomDateComponent',
  components: {
    'ag-grid-vue': AgGridVue,
    // eslint-disable-next-line vue/no-unused-components
    agDateInput: Com.AgGridDateComponent,
  },
  setup() {
    const gridApi = ref<any>(null);
    const gridColumnApi = ref<any>(null);

    const defaultColDef = reactive({
      flex: 1,
      minWidth: 100,
      resizable: true,
      editable: true, // 可编辑
      sortable: true,
      filter: true,
      // floatingFilter: true,
    });

    const columnDefs = reactive([
      { field: 'athlete', headerName: '运动员' },
      { field: 'age', headerName: '年龄', filter: 'agNumberColumnFilter' },
      { field: 'country', headerName: '国家' },
      { field: 'year', headerName: '年份' },
      {
        field: 'date',
        minWidth: 190,
        headerName: '日期',
        filter: 'agDateColumnFilter',
        filterParams: {
          comparator: (filterLocalDateAtMidnight: any, cellValue: any) => {
            // const formattedString = date.formatDate(
            //   filterLocalDateAtMidnight,
            //   'YYYY/MM/DD'
            // );
            // console.log(
            //   'filterLocalDateAtMidnight',
            //   formattedString,
            //   'cellValue',
            //   cellValue
            // );

            const dateAsString = cellValue;
            const dateParts = dateAsString.split('/');
            const cellDate = new Date(
              Number(dateParts[2]),
              Number(dateParts[1]) - 1,
              Number(dateParts[0])
            );
            if (filterLocalDateAtMidnight.getTime() === cellDate.getTime()) {
              return 0;
            }
            if (cellDate < filterLocalDateAtMidnight) {
              return -1;
            }
            if (cellDate > filterLocalDateAtMidnight) {
              return 1;
            }
          },
        },
        comparator: (d1: any, d2: any) => {
          return getComparatorDate(d1).getTime() <
            getComparatorDate(d2).getTime()
            ? -1
            : 1;
        },
        valueFormatter: (params: any) => {
          let resStr = '';
          if (!isEmpty(params.value)) {
            const dateArr = params.value.split('/');
            resStr = dateArr[2] + '-' + dateArr[1] + '-' + dateArr[0];
          }
          return resStr;
        },
      },
      { field: 'sport', headerName: '运动' },
      { field: 'gold', headerName: '金牌', filter: 'agNumberColumnFilter' },
      { field: 'silver', headerName: '银牌', filter: 'agNumberColumnFilter' },
      { field: 'bronze', headerName: '铜牌', filter: 'agNumberColumnFilter' },
      { field: 'total', headerName: '共计', filter: false },
    ]);

    const state = reactive({
      rowData: [] as any[],
    });

    const onGridReady = (params: any) => {
      gridApi.value = params.api;
      gridColumnApi.value = params.columnApi;
      getData();
    };

    const getData = () => {
      fetch('https://www.ag-grid.com/example-assets/olympic-winners.json')
        .then((resp) => resp.json())
        .then((data) => updateData(data));
    };

    const updateData = (data: any) => {
      state.rowData = data.slice(0, 5);
      console.log('rowData[0]', state.rowData[0]);
    };

    const onReset = () => {
      gridApi.value.setFilterModel(null);
      gridApi.value.destroyFilter('date');
    };

    const getComparatorDate = (data: string) => {
      // 21/01/2008
      const dateArr = data.split('/');
      const year = Number(dateArr[2]);
      const month = Number(dateArr[1]);
      const day = Number(dateArr[0]);
      const newDate = new Date(year, month, day);
      return newDate;
    };

    return {
      AG_GRID_LOCALE,
      Com,
      defaultColDef,
      columnDefs,
      state,
      onGridReady,
      onReset,
    };
  },
});
</script>
<template>
  <div>
    <div class="btns">
      <q-btn color="primary" label="重置" no-caps unelevated @click="onReset" />
    </div>
    <!-- 
        rowSelection="multiple":多选,按住control键多选;【control+shift+鼠标点击】可选中多行
        animateRows=true:启用行动画
        :masterDetail="true" 启用展开的细节网格行
        :isRowMaster="isRowMaster" 确定哪一个行该展开
        :pagination="true"
        :paginationPageSize="100"
     -->
    <div class="ag-table">
      <ag-grid-vue
        style="height: 580px"
        class="ag-theme-alpine"
        :localeText="AG_GRID_LOCALE"
        :animateRows="true"
        :pagination="true"
        :paginationPageSize="10"
        :defaultColDef="defaultColDef"
        :columnDefs="columnDefs"
        :rowData="state.rowData"
        @grid-ready="onGridReady"
      >
      </ag-grid-vue>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.btns {
  padding: 10px;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  column-gap: 10px;
}
.ag-table {
  padding: 0 10px 10px 10px;
}
</style>