Search code examples
javascriptvue.jsprimevue

How to use different HTTP GET request in PrimeVue Datatable


I need to use different GET requests to display in my Datatable. Both come from different tables of the Database using different requests. I'm lost of what i have to do to make this work. I know i'm using different values in the :value of the Datatable. The values that i want to show is the Package and Page.

<DataTable :value="gridData" :paginator="true" :rows="50" :rowHover="true" :loading="loading" @page="scrollUp()"
               paginatorTemplate="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown"
               :rowsPerPageOptions="[15,25,50]" :autoLayout="true"
               selectionMode="single" dataKey="id"
               currentPageReportTemplate="Mostrando {first} até {last} de {totalRecords} Registros"
               :filters="filters"
               class="p-datatable-customers p-datatable p-component p-datatable-hoverable-rows"
               @row-select="onRowSelect">
        <div class="p-datatable-header">
            <div class="table-header">
                Orgs
                <span class="p-input-icon-left">
                <i class="pi pi-search"></i>
                <InputText v-model="filters['global']" placeholder="Global Search"/>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <Button label="Novo" icon="pi pi-plus" iconPos="right" @click="goToNew"/>
                </span>
            </div>
        </div>
        <template #empty>
            Empty
        </template>
        <template #loading>
            load
        </template>
        <Column field="name" header="Name" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                {{slotProps.data.name}}
            </template>
        </Column>
        <Column field="trade_name" header="Trade" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                {{ slotProps.data.trade_name }}
            </template>
        </Column>
        <Column field="created_date" header="Date" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                {{ dateHourFormat(slotProps.data.created_date) }}
            </template>
        </Column>
        <Column field="name" header="Package" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                {{ slotProps.data.name }}
            </template>
        </Column>
        <Column field="file_name" header="Page" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                {{ slotProps.data.file_name }}
            </template>
        </Column>
    </DataTable>
 getAll() {
                this.customerService.getAll()
                    .then((response) => {
                        this.gridData = response;
                    }).catch((error) => {
                    console.log(error);
                })
            },
            getPackage() {
                this.operationPackage = []
                this.operationPackageService.getAllOperationPackages()
                    .then((response) => {
                        this.operationPackage = response;
                    }).catch((error) => {
                    if (error.response && error.response.data && error.response.data.details) {
                        this.$toast.add({
                            severity: 'error',
                            summary: error.response.data.details,
                            life: 5000
                        });
                    } else {
                        this.$toast.add({
                            severity: 'error',
                            summary: 'N',
                            life: 5000
                        });
                    }
                });
            },
            getPage() {
                this.operationPage = []
                this.operationPackageService.getAllHtmlFiles()
                    .then((response) => {
                        this.operationPage = response;
                    }).catch((error) => {
                    if (error.response && error.response.data && error.response.data.details) {
                        this.$toast.add({
                            severity: 'error',
                            summary: error.response.data.details,
                            life: 5000
                        });
                    } else {
                        this.$toast.add({
                            severity: 'error',
                            summary: 'N',
                            life: 5000
                        });
                    }
                });
            },

I tried to use the same :value for the GET requests, but it did not worked. It shows the first value that is loaded in the mounted. If loads getAll first, it show the values, but if loads getPackage, it shows the package values.


Solution

  • I managed to solve it, this is how i made to show the data i wanted

     <Column field="name" header="Package" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                <div v-for="item in operationPackage">
                    <div v-if="slotProps.data.name === item.id">
                        {{ item.name }}
                    </div>
                </div>
            </template>
        </Column>
        <Column field="file_name" header="Page" headerClass="headerClass" bodyClass="bodyClass" :sortable="true"
                filterMatchMode="contains">
            <template #body="slotProps">
                <div v-for="item in operationPage">
                    <div v-if="slotProps.data.file_name === item.id">
                        {{ item.file_name }}
                    </div>
                </div>
            </template>
        </Column>