diff --git a/backend/database/core.ts b/backend/database/core.ts index 8fb6f7fc..74c03d4b 100644 --- a/backend/database/core.ts +++ b/backend/database/core.ts @@ -422,12 +422,21 @@ export default class DatabaseCore extends DatabaseBase { this.#applyFiltersToBuilder(builder, filters); - if (options.orderBy) { - builder.orderBy(options.orderBy, options.order); + const { orderBy, groupBy, order } = options; + if (Array.isArray(orderBy)) { + builder.orderBy(orderBy.map((column) => ({ column, order }))); } - if (options.groupBy) { - builder.groupBy(options.groupBy); + if (typeof orderBy === 'string') { + builder.orderBy(orderBy, order); + } + + if (Array.isArray(groupBy)) { + builder.groupBy(...groupBy); + } + + if (typeof groupBy === 'string') { + builder.groupBy(groupBy); } if (options.offset) { diff --git a/backend/database/types.ts b/backend/database/types.ts index 7b0c3e15..8318271d 100644 --- a/backend/database/types.ts +++ b/backend/database/types.ts @@ -5,8 +5,8 @@ import { DatabaseManager } from './manager'; export interface GetQueryBuilderOptions { offset?: number; limit?: number; - groupBy?: string; - orderBy?: string; + groupBy?: string | string[]; + orderBy?: string | string[]; order?: 'desc' | 'asc'; } diff --git a/reports/LedgerReport.ts b/reports/LedgerReport.ts index ac06dd27..8a7d6231 100644 --- a/reports/LedgerReport.ts +++ b/reports/LedgerReport.ts @@ -95,7 +95,7 @@ export abstract class LedgerReport extends Report { { fields, filters, - orderBy: 'date', + orderBy: ['date', 'created'], order: this.ascending ? 'asc' : 'desc', } )) as RawLedgerEntry[]; diff --git a/reports/inventory/helpers.ts b/reports/inventory/helpers.ts index 41dcdd44..2cd093fb 100644 --- a/reports/inventory/helpers.ts +++ b/reports/inventory/helpers.ts @@ -26,7 +26,7 @@ export async function getRawStockLedgerEntries(fyo: Fyo) { return (await fyo.db.getAllRaw(ModelNameEnum.StockLedgerEntry, { fields: fieldnames, - orderBy: 'date', + orderBy: ['date', 'created', 'name'], order: 'asc', })) as RawStockLedgerEntry[]; } diff --git a/src/pages/ListView/List.vue b/src/pages/ListView/List.vue index 9c4437bc..2635379b 100644 --- a/src/pages/ListView/List.vue +++ b/src/pages/ListView/List.vue @@ -198,9 +198,10 @@ export default defineComponent({ filters = objectForEach(clone(filters), toRaw); - const orderBy = !!fyo.getField(this.schemaName, 'date') - ? 'date' - : 'created'; + const orderBy = ['created']; + if (fyo.db.fieldMap[this.schemaName]['date']) { + orderBy.unshift('date'); + } this.data = ( await fyo.db.getAll(this.schemaName, { diff --git a/src/utils/export.ts b/src/utils/export.ts index 419bbfaf..48e3a918 100644 --- a/src/utils/export.ts +++ b/src/utils/export.ts @@ -260,9 +260,11 @@ async function getParentData( limit: number | null, fyo: Fyo ) { - const orderBy = !!fields.find((f) => f.fieldname === 'date') - ? 'date' - : 'created'; + const orderBy = ['created']; + if (fyo.db.fieldMap[schemaName]['date']) { + orderBy.unshift('date'); + } + const options: GetAllOptions = { filters, orderBy, order: 'desc' }; if (limit) { options.limit = limit; diff --git a/utils/db/types.ts b/utils/db/types.ts index d8e60614..2be03bce 100644 --- a/utils/db/types.ts +++ b/utils/db/types.ts @@ -59,8 +59,8 @@ export interface GetAllOptions { filters?: QueryFilter; offset?: number; limit?: number; - groupBy?: string; - orderBy?: string; + groupBy?: string | string[]; + orderBy?: string | string[]; order?: 'asc' | 'desc'; }