<!--
 * Ag Grid 复选框选择
 * https://www.ag-grid.com/vue-data-grid/row-selection/#checkbox-selection
 -->
<script setup lang="ts">
import { ref, reactive, onMounted, watch } from 'vue';
import { AgGridVue } from 'ag-grid-vue3';
import AG_GRID_LOCALE from 'src/config/ag-grid-locale';

const defaultColDef = {
  flex: 1,
  minWidth: 100,
  suppressMenu: true, // 是否禁用标题行菜单
};

const gridApi = ref<any>(null);
const gridColumnApi = ref<any>(null);

const checkAllUsable = ref<any>(null);

const columnDefs = reactive([
  {
    field: 'athlete',
    headerName: '运动员',
    checkboxSelection: (params: any) => {
      return params.data && params.data.year !== 2012;
    },
    showDisabledCheckboxes: true,
  },
  { field: 'sport', headerName: '运动' },
  { field: 'year', maxWidth: 120, headerName: '年份' },
]);

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

watch(checkAllUsable, (val: any) => {
  if (val === true) {
    gridApi.value.forEachNode((node: any) => {
      node.setSelected(true);
    });
  } else if (val === false) {
    deselectRows();
  }
});

onMounted(() => {
  //
});

function getData() {
  fetch('https://www.ag-grid.com/example-assets/small-olympic-winners.json')
    .then((resp) => resp.json())
    .then((data) => {
      state.rowData = data;
      console.log('state.rowData[0]', state.rowData[0]);
    });
}

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

function onFirstDataRendered(params: any) {
  params.api.forEachNode((node: any) =>
    node.setSelected(node.data && node.data.year == 2012)
  );
}

function onSelectionChanged() {
  const length1 = state.rowData.length;
  const selectedRows = gridApi.value.getSelectedRows();
  const length2 = selectedRows.length;
  state.selected = selectedRows.map((item: any) => item.athlete);
  if (length1 && length1 === length2) {
    checkAllUsable.value = true;
  } else if (length1 !== length2) {
    checkAllUsable.value = null;
  } else {
    checkAllUsable.value = false;
  }
}

// function isRowSelectable(params: any) {
//   return !!params.data && params.data.year === 2012;
// }

function deselectRows() {
  //   gridApi.value.deselectAll();
  gridApi.value.forEachNode((node: any) => {
    let falg = false;
    if (node.data && node.data.year == 2012) {
      falg = true;
    }
    node.setSelected(falg);
  });
}
</script>
<template>
  <div class="box">
    <div class="text">
      <div>固定选中<q-chip square :ripple="false">年份=2012</q-chip>的行</div>
      <q-checkbox v-model="checkAllUsable" label="选择全部可选内容" dense />
      <span>已选择:{{ state.selected.join(',') }}</span>
    </div>
    <!-- 
        rowSelection="multiple":多选,按住control键多选;【control+shift+鼠标点击】可选中多行
        animateRows=true:启用行动画
        :masterDetail="true" 启用展开的细节网格行
        :isRowMaster="isRowMaster" 确定哪一个行该展开
        rowSelection="single" single单选 multiple多选
     -->
    <div class="ag-table">
      <ag-grid-vue
        style="height: 550px"
        class="ag-theme-alpine"
        :animateRows="true"
        :localeText="AG_GRID_LOCALE"
        :defaultColDef="defaultColDef"
        :columnDefs="columnDefs"
        :rowData="state.rowData"
        rowSelection="multiple"
        :suppressRowClickSelection="true"
        @grid-ready="onGridReady"
        @first-data-rendered="onFirstDataRendered"
        @selection-changed="onSelectionChanged"
      >
      </ag-grid-vue>
    </div>
  </div>
</template>

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