123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <script lang="ts">
- export default { name: '{{pascalCase name}}List' };
- </script>
- <script setup lang="ts">
- import { computed, onMounted, ref } from 'vue';
- import { ElMessage } from 'element-plus';
- import { Plus, Delete } from '@element-plus/icons-vue';
- import { useI18n } from 'vue-i18n';
- import { perm } from '@/store/useCurrentUser';
- import { moveList, toParams, resetParams } from '@/utils/common';
- import { delete{{pascalCase name}}, query{{pascalCase name}}List, update{{pascalCase name}}Order } from '@/api/{{kebabCase path}}';
- import { ColumnList, ColumnSetting } from '@/components/TableList';
- import { QueryForm, QueryItem } from '@/components/QueryForm';
- import ListMove from '@/components/ListMove.vue';
- import {{pascalCase name}}Form from './{{pascalCase name}}Form.vue';
- const { t } = useI18n();
- const params = ref<Record<string, any>>({});
- const sort = ref();
- const table = ref();
- const data = ref<any[]>([]);
- const selection = ref<any[]>([]);
- const loading = ref<boolean>(false);
- const formVisible = ref<boolean>(false);
- const beanId = ref<number>();
- const beanIds = computed(() => data.value.map((row) => row.id));
- const filtered = ref<boolean>(false);
- const fetchData = async () => {
- loading.value = true;
- try {
- data.value = await query{{pascalCase name}}List({ ...toParams(params.value), Q_OrderBy: sort.value });
- filtered.value = Object.values(params.value).filter((v) => v !== undefined && v !== '').length > 0 || sort.value !== undefined;
- } finally {
- loading.value = false;
- }
- };
- onMounted(fetchData);
- const handleSort = ({ column, prop, order }: { column: any; prop: string; order: string }) => {
- if (prop) {
- sort.value = (column.sortBy ?? prop) + (order === 'descending' ? '_desc' : '');
- } else {
- sort.value = undefined;
- }
- fetchData();
- };
- const handleSearch = () => fetchData();
- const handleReset = () => {
- table.value.clearSort();
- resetParams(params.value);
- sort.value = undefined;
- fetchData();
- };
- const handleAdd = () => {
- beanId.value = undefined;
- formVisible.value = true;
- };
- const handleEdit = (id: number) => {
- beanId.value = id;
- formVisible.value = true;
- };
- const handleDelete = async (ids: number[]) => {
- await delete{{pascalCase name}}(ids);
- fetchData();
- ElMessage.success(t('success'));
- };
- const move = async (selected: any[], type: 'top' | 'up' | 'down' | 'bottom') => {
- const list = moveList(selected, data.value, type);
- await update{{pascalCase name}}Order(list.map((item) => item.id));
- };
- </script>
- <template>
- <div>
- <div class="mb-3">
- <query-form :params="params" @search="handleSearch" @reset="() => handleReset()">
- <query-item :label="$t('{{camelCase name}}.name')" name="Q_Contains_name"></query-item>
- </query-form>
- </div>
- <div class="space-x-2">
- <el-button type="primary" :disabled="perm('{{camelCase name}}:create')" :icon="Plus" @click="() => handleAdd()">\{{ $t('add') }}</el-button>
- <el-popconfirm :title="$t('confirmDelete')" @confirm="() => handleDelete(selection.map((row) => row.id))">
- <template #reference>
- <el-button :disabled="selection.length <= 0 || perm('{{camelCase name}}:delete')" :icon="Delete">\{{ $t('delete') }}</el-button>
- </template>
- </el-popconfirm>
- <list-move :disabled="selection.length <= 0 || filtered || perm('org:update')" @move="(type) => move(selection, type)" />
- <column-setting name="{{camelCase name}}" />
- </div>
- <div class="app-block mt-3">
- <el-table
- ref="table"
- v-loading="loading"
- :data="data"
- @selection-change="(rows) => (selection = rows)"
- @row-dblclick="(row) => handleEdit(row.id)"
- @sort-change="handleSort"
- >
- <column-list name="{{camelCase name}}">
- <el-table-column type="selection" width="45"></el-table-column>
- <el-table-column property="id" label="ID" width="64" sortable="custom"></el-table-column>
- <el-table-column property="name" :label="$t('{{camelCase name}}.name')" sortable="custom" show-overflow-tooltip></el-table-column>
- <el-table-column :label="$t('table.action')">
- <template #default="{row}">
- <el-button type="primary" :disabled="perm('{{camelCase name}}:update')" @click="() => handleEdit(row.id)" size="small" link>\{{ $t('edit') }}</el-button>
- <el-popconfirm :title="$t('confirmDelete')" @confirm="() => handleDelete([row.id])">
- <template #reference>
- <el-button type="primary" :disabled="perm('{{camelCase name}}:delete')" size="small" link>\{{ $t('delete') }}</el-button>
- </template>
- </el-popconfirm>
- </template>
- </el-table-column>
- </column-list>
- </el-table>
- </div>
- <{{kebabCase name}}-form v-model="formVisible" :bean-id="beanId" :bean-ids="beanIds" @finished="() => fetchData()" />
- </div>
- </template>
|