Возможным решением может быть всегда возвращать только 30 записей, а остальные записи генерируются как поддельные. Но на конкретной странице, где в данный момент находится пользователь, должны отображаться только реальные записи. Поддельные страницы появятся на других страницах, где пользователь в данный момент отсутствует. Это означает, что на самом деле одновременно извлекаются только 30 записей, но при навигации пользователя всегда будет загружаться следующий пакет из 30 реальных записей.
Проблема в том, что API этого не делает. позвольте мне загрузить все 187 билетов одновременно. К сожалению, я понятия не имею, как это реализовать, чтобы оно работало корректно. Поэтому я хочу узнать, сталкивался ли кто-нибудь в StackOverflow с подобной проблемой.
Это мой метод в контроллере для получения билетов.
Код: Выделить всё
public function getTicketsWithoutPurchase(Request $request)
{
$this->checkPermissions("index");
$groupIds = [77000033482, 77000271931, 77000008014, 77000008015, 77000269172, 77000017316, 77000008013, 77000008012];
$groupQuery = implode(' OR ', array_map(function ($id) {
return "group_id:$id";
}, $groupIds));
$statusQuery = "status:2 OR status:3";
$query = '"(' . $groupQuery . ') AND (' . $statusQuery . ')"';
$page = $request->input('page', 1);
$response = FreshdeskService::filterTickets($query, 'lp', $page);
if ($response['success']) {
$tickets = $response['response']['results'] ?? [];
$totalTickets = $response['response']['total'] ?? 0;
$perPage = 30;
$start = ($page - 1) * $perPage;
dd($start);
$totalPages = ceil($totalTickets / $perPage);
if ($page > $totalPages) {
$data = collect()->pad($perPage, [
'id' => null,
'subject' => 'Fake Ticket',
'updated_at' => null,
'to_emails' => 'No Email provided',
'status' => null,
'group' => null
]);
} else {
$ticketCollection = collect($tickets);
$data = $ticketCollection->map(function ($ticket) {
return [
'id' => $ticket['id'] ?? null,
'subject' => $ticket['subject'] ?? '-',
'updated_at' => $ticket['updated_at'] ?? '-',
'to_emails' => $ticket['to_emails'] ?? 'No Email provided',
'status' => $ticket['status'],
'group' => $ticket['group_id']
];
});
}
return self::watchDataTable($data, $request);
}
return response()->json(['message' => 'Could not retrieve tickets'], 500);
}
Код: Выделить всё
public static function filterTickets(string $query, $alias): array
{
return self::simpleRequest("search/tickets?query=" . urlencode($query), [], "GET", $alias);
}
Код: Выделить всё
[h4]
[i][/i]
{{ this.$t('purchases.select_ticket_for_purchase') }}
[/h4]
export default {
// props: {
// model: { type: Object, required: true },
// },
data() {
return {
freshdeskGridTableSettings: {
fetchUrl: "/data/no-purchase",
columns: [
{
key: "id",
label: "purchases.ticket_id",
hidden: false,
},
{
key: "subject",
label: "purchases.subject",
searchable: false,
sortable: false
},
{
key: "updated_at",
label: "purchases.updated_at",
searchable: false,
sortable: false
},
{
key: "to_emails",
label: "purchases.to_emails",
searchable: false,
sortable: false
},
{
key: "status",
label: "purchases.status",
searchable: false,
sortable: false
},
// {
// key: "agent",
// label: "purchases.agent",
// searchable: false,
// sortable: false
// },
{
key: "group",
label: "purchases.group",
searchable: true,
sortable: false
},
{
type: "event",
key: "add",
// callback: this.newPosition,
permissions: ["manage purchases"],
icon: "fa-plus",
label: "purchases.add_ticket",
classes: "btn btn-success",
// conditions: {
// visible: [{ model: this.model, property: "status", operator: "le", value: 110 }]
// }
}
],
defaultSearchParams: {
// purchase_id: this.model.id,
},
showSearch: true,
showSearchColumn: true,
showPageLength: true,
defaultSortBy: "id",
defaultOrder: "desc",
defaultPerPage: 5,
pageLengths: [5, 10, 25, 50, 100],
columnId: "id",
},
};
},
methods: {
addTicket(){
this.axios.post()
}
},
};
Подробнее здесь: https://stackoverflow.com/questions/790 ... -freshdesk