diff --git a/backend/api/items.go b/backend/api/items.go index afd65df..80b8cee 100644 --- a/backend/api/items.go +++ b/backend/api/items.go @@ -35,7 +35,7 @@ func (s *Server) GetCategoryItems(c echo.Context, categoryId autogen.UUID, param return Error500(c) } - count, err := s.DBackend.CountItems(c.Request().Context(), categoryId.String(), state, "") + count, err := s.DBackend.CountItems(c.Request().Context(), categoryId.String(), state, "", "") if err != nil { return Error500(c) } @@ -43,7 +43,7 @@ func (s *Server) GetCategoryItems(c echo.Context, categoryId autogen.UUID, param // Make sure the last page is not empty dbpage, page, limit, maxPage := autogen.Pager(params.Page, params.Limit, &count) - data, err := s.DBackend.GetItems(c.Request().Context(), categoryId.String(), dbpage, limit, state, "") + data, err := s.DBackend.GetItems(c.Request().Context(), categoryId.String(), dbpage, limit, state, "", "") if err != nil { return Error500(c) } @@ -174,6 +174,15 @@ func (s *Server) PatchItem(c echo.Context, categoryId autogen.UUID, itemId autog item.BuyLimit = &buyLimit } } + if p.AmountPerBundle != nil { + item.AmountPerBundle = p.AmountPerBundle + } + if p.RefBundle != nil { + item.RefBundle = p.RefBundle + } + if p.Fournisseur != nil { + item.Fournisseur = p.Fournisseur + } rp := item.RealPrices() item.DisplayPrices = &rp @@ -238,6 +247,7 @@ func (s *Server) GetAllItems(c echo.Context, params autogen.GetAllItemsParams) e state := "" categoryId := "" name := "" + fournisseur := "" if params.State != nil { state = string(*params.State) } @@ -247,8 +257,11 @@ func (s *Server) GetAllItems(c echo.Context, params autogen.GetAllItemsParams) e if params.Name != nil { name = string(*params.Name) } + if params.Fournisseur != nil { + fournisseur = string(*params.Fournisseur) + } - count, err := s.DBackend.CountItems(c.Request().Context(), categoryId, state, name) + count, err := s.DBackend.CountItems(c.Request().Context(), categoryId, state, name, fournisseur) if err != nil { logrus.Error(err) return Error500(c) @@ -257,7 +270,7 @@ func (s *Server) GetAllItems(c echo.Context, params autogen.GetAllItemsParams) e // Make sure the last page is not empty dbpage, page, limit, maxPage := autogen.Pager(params.Page, params.Limit, &count) - data, err := s.DBackend.GetItems(c.Request().Context(), categoryId, dbpage, limit, state, name) + data, err := s.DBackend.GetItems(c.Request().Context(), categoryId, dbpage, limit, state, name, fournisseur) if err != nil { logrus.Error(err) return Error500(c) diff --git a/backend/autogen/bar.gen.go b/backend/autogen/bar.gen.go index befab66..b399ca1 100644 --- a/backend/autogen/bar.gen.go +++ b/backend/autogen/bar.gen.go @@ -262,20 +262,22 @@ type HTTPError struct { // Item defines model for Item. type Item struct { - AmountLeft uint64 `json:"amount_left" bson:"amount_left"` - AvailableFrom *uint64 `json:"available_from,omitempty" bson:"available_from"` - AvailableUntil *uint64 `json:"available_until,omitempty" bson:"available_until"` - BuyLimit *uint64 `json:"buy_limit,omitempty" bson:"buy_limit"` - CategoryId UUID `json:"category_id" bson:"category_id"` - DeletedAt *uint64 `json:"deleted_at,omitempty" bson:"deleted_at"` - DeletedBy *UUID `json:"deleted_by,omitempty" bson:"deleted_by"` - DisplayPrice *uint64 `json:"display_price,omitempty" bson:"display_price"` - DisplayPrices *ItemPrices `json:"display_prices,omitempty" bson:"display_prices"` - Id UUID `json:"id" bson:"id"` - IsMenu bool `json:"is_menu" bson:"is_menu"` - LastTva *uint64 `json:"last_tva,omitempty" bson:"last_tva"` - MenuCategories *[]MenuCategory `json:"menu_categories,omitempty" bson:"menu_categories"` - MenuItems *[]MenuItem `json:"menu_items,omitempty" bson:"menu_items"` + AmountLeft uint64 `json:"amount_left" bson:"amount_left"` + AmountPerBundle *uint64 `json:"amount_per_bundle,omitempty" bson:"amount_per_bundle"` + AvailableFrom *uint64 `json:"available_from,omitempty" bson:"available_from"` + AvailableUntil *uint64 `json:"available_until,omitempty" bson:"available_until"` + BuyLimit *uint64 `json:"buy_limit,omitempty" bson:"buy_limit"` + CategoryId UUID `json:"category_id" bson:"category_id"` + DeletedAt *uint64 `json:"deleted_at,omitempty" bson:"deleted_at"` + DeletedBy *UUID `json:"deleted_by,omitempty" bson:"deleted_by"` + DisplayPrice *uint64 `json:"display_price,omitempty" bson:"display_price"` + DisplayPrices *ItemPrices `json:"display_prices,omitempty" bson:"display_prices"` + Fournisseur *RestockType `json:"fournisseur,omitempty" bson:"fournisseur"` + Id UUID `json:"id" bson:"id"` + IsMenu bool `json:"is_menu" bson:"is_menu"` + LastTva *uint64 `json:"last_tva,omitempty" bson:"last_tva"` + MenuCategories *[]MenuCategory `json:"menu_categories,omitempty" bson:"menu_categories"` + MenuItems *[]MenuItem `json:"menu_items,omitempty" bson:"menu_items"` // Name Name of the current item Name string `json:"name" bson:"name"` @@ -287,6 +289,9 @@ type Item struct { Promotion *uint64 `json:"promotion,omitempty" bson:"promotion"` PromotionEndsAt *uint64 `json:"promotion_ends_at,omitempty" bson:"promotion_ends_at"` + // RefBundle Referal code of the product in the Drive + RefBundle *string `json:"ref_bundle,omitempty" bson:"ref_bundle"` + // State State of the item State ItemState `json:"state" bson:"state"` } @@ -559,14 +564,16 @@ type UpdateCategory struct { // UpdateItem defines model for UpdateItem. type UpdateItem struct { - AmountLeft *uint64 `json:"amount_left,omitempty" bson:"amount_left"` - AvailableFrom *uint64 `json:"available_from,omitempty" bson:"available_from"` - AvailableUntil *uint64 `json:"available_until,omitempty" bson:"available_until"` - BuyLimit *int64 `json:"buy_limit,omitempty" bson:"buy_limit"` - CategoryId *UUID `json:"category_id,omitempty" bson:"category_id"` - IsMenu *bool `json:"is_menu,omitempty" bson:"is_menu"` - MenuCategories *[]MenuCategory `json:"menu_categories,omitempty" bson:"menu_categories"` - MenuItems *[]MenuItem `json:"menu_items,omitempty" bson:"menu_items"` + AmountLeft *uint64 `json:"amount_left,omitempty" bson:"amount_left"` + AmountPerBundle *uint64 `json:"amount_per_bundle,omitempty" bson:"amount_per_bundle"` + AvailableFrom *uint64 `json:"available_from,omitempty" bson:"available_from"` + AvailableUntil *uint64 `json:"available_until,omitempty" bson:"available_until"` + BuyLimit *int64 `json:"buy_limit,omitempty" bson:"buy_limit"` + CategoryId *UUID `json:"category_id,omitempty" bson:"category_id"` + Fournisseur *RestockType `json:"fournisseur,omitempty" bson:"fournisseur"` + IsMenu *bool `json:"is_menu,omitempty" bson:"is_menu"` + MenuCategories *[]MenuCategory `json:"menu_categories,omitempty" bson:"menu_categories"` + MenuItems *[]MenuItem `json:"menu_items,omitempty" bson:"menu_items"` // Name Name of the current item Name *string `json:"name,omitempty" bson:"name"` @@ -577,6 +584,7 @@ type UpdateItem struct { Prices *ItemPrices `json:"prices,omitempty" bson:"prices"` Promotion *uint64 `json:"promotion,omitempty" bson:"promotion"` PromotionEndsAt *uint64 `json:"promotion_ends_at,omitempty" bson:"promotion_ends_at"` + RefBundle *string `json:"ref_bundle,omitempty" bson:"ref_bundle"` // State State of the item State *ItemState `json:"state,omitempty" bson:"state"` @@ -851,6 +859,9 @@ type GetAllItemsParams struct { // Name Filter by name Name *string `form:"name,omitempty" json:"name,omitempty" bson:"name"` + + // Fournisseur Filter by fournisseur + Fournisseur *RestockType `form:"fournisseur,omitempty" json:"fournisseur,omitempty" bson:"fournisseur"` } // GetRefillsParams defines parameters for GetRefills. @@ -2864,6 +2875,13 @@ func (w *ServerInterfaceWrapper) GetAllItems(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) } + // ------------- Optional query parameter "fournisseur" ------------- + + err = runtime.BindQueryParameter("form", true, false, "fournisseur", ctx.QueryParams(), ¶ms.Fournisseur) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter fournisseur: %s", err)) + } + // Invoke the callback with all the unmarshaled arguments err = w.Handler.GetAllItems(ctx, params) return err @@ -10039,131 +10057,132 @@ func (sh *strictHandler) GetTransactionsItems(ctx echo.Context, params GetTransa // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/backend/internal/db/database.go b/backend/internal/db/database.go index d1e4bba..51071fc 100644 --- a/backend/internal/db/database.go +++ b/backend/internal/db/database.go @@ -162,8 +162,8 @@ type DBackend interface { CountAccounts(ctx context.Context, query string) (uint64, error) GetRefills(ctx context.Context, account string, page uint64, size uint64, startAt, endAt uint64) ([]*models.Refill, error) CountRefills(ctx context.Context, account string, startAt, endAt uint64) (uint64, error) - GetItems(ctx context.Context, categoryID string, page, size uint64, state string, name string) ([]*models.Item, error) - CountItems(ctx context.Context, categoryID string, state string, name string) (uint64, error) + GetItems(ctx context.Context, categoryID string, page, size uint64, state string, name string, fournisseur string) ([]*models.Item, error) + CountItems(ctx context.Context, categoryID string, state string, name string, fournisseur string) (uint64, error) GetAllRefills(ctx context.Context, page uint64, size uint64, startAt, endAt uint64) ([]*models.Refill, error) CountAllRefills(ctx context.Context, startAt, endAt uint64) (uint64, error) diff --git a/backend/internal/db/mongo/item_misc.go b/backend/internal/db/mongo/item_misc.go index 6db5557..8b1fb80 100644 --- a/backend/internal/db/mongo/item_misc.go +++ b/backend/internal/db/mongo/item_misc.go @@ -11,7 +11,7 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" ) -func (b *Backend) GetItems(ctx context.Context, categoryID string, page, size uint64, state string, name string) ([]*models.Item, error) { +func (b *Backend) GetItems(ctx context.Context, categoryID string, page, size uint64, state string, name string, fournisseur string) ([]*models.Item, error) { ctx, cancel := b.TimeoutContext(ctx) defer cancel() @@ -72,7 +72,10 @@ func (b *Backend) GetItems(ctx context.Context, categoryID string, page, size ui "$options": "i", } } - + if fournisseur != "" { + filter["fournisseur"] = fournisseur + } + cursor, err := b.db.Collection(ItemsCollection).Find(ctx, filter, options.Find().SetSkip(int64(page*size)).SetLimit(int64(size))) if err != nil { return nil, err @@ -85,7 +88,7 @@ func (b *Backend) GetItems(ctx context.Context, categoryID string, page, size ui return items, nil } -func (b *Backend) CountItems(ctx context.Context, categoryID string, state string, name string) (uint64, error) { +func (b *Backend) CountItems(ctx context.Context, categoryID string, state string, name string, fournisseur string) (uint64, error) { ctx, cancel := b.TimeoutContext(ctx) defer cancel() @@ -142,6 +145,9 @@ func (b *Backend) CountItems(ctx context.Context, categoryID string, state strin "$options": "i", } } + if fournisseur != "" { + filter["fournisseur"] = fournisseur + } count, err := b.db.Collection(ItemsCollection).CountDocuments(ctx, filter) if err != nil { diff --git a/bar.openapi.yml b/bar.openapi.yml index dff9f38..bb55676 100644 --- a/bar.openapi.yml +++ b/bar.openapi.yml @@ -2394,6 +2394,12 @@ paths: required: false schema: type: string + - name: fournisseur + in: query + description: Filter by fournisseur + required: false + schema: + $ref: "#/components/schemas/RestockType" responses: "200": description: "" @@ -4804,6 +4810,13 @@ components: type: array items: $ref: "#/components/schemas/MenuCategory" + amount_per_bundle: + type: integer + format: uint64 + ref_bundle: + type: string + fournisseur: + $ref: "#/components/schemas/RestockType" ItemPrices: type: object properties: @@ -4960,6 +4973,14 @@ components: format: uint64 deleted_by: $ref: "#/components/schemas/UUID" + amount_per_bundle: + type: integer + format: uint64 + ref_bundle: + type: string + description: Referal code of the product in the Drive + fournisseur: + $ref: "#/components/schemas/RestockType" required: - id - prices diff --git a/frontend/src/lib/api/api.ts b/frontend/src/lib/api/api.ts index 82e0ef2..6c32d94 100644 --- a/frontend/src/lib/api/api.ts +++ b/frontend/src/lib/api/api.ts @@ -1028,6 +1028,24 @@ export interface Item { * @memberof Item */ 'deleted_by'?: string; + /** + * + * @type {number} + * @memberof Item + */ + 'amount_per_bundle'?: number; + /** + * Referal code of the product in the Drive + * @type {string} + * @memberof Item + */ + 'ref_bundle'?: string; + /** + * + * @type {RestockType} + * @memberof Item + */ + 'fournisseur'?: RestockType; } @@ -2224,6 +2242,24 @@ export interface UpdateItem { * @memberof UpdateItem */ 'menu_categories'?: Array; + /** + * + * @type {number} + * @memberof UpdateItem + */ + 'amount_per_bundle'?: number; + /** + * + * @type {string} + * @memberof UpdateItem + */ + 'ref_bundle'?: string; + /** + * + * @type {RestockType} + * @memberof UpdateItem + */ + 'fournisseur'?: RestockType; } @@ -6644,10 +6680,11 @@ export const ItemsApiAxiosParamCreator = function (configuration?: Configuration * @param {ItemState} [state] Filter by state * @param {string} [categoryId] Filter by category * @param {string} [name] Filter by name + * @param {RestockType} [fournisseur] Filter by fournisseur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getAllItems: async (page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, options: AxiosRequestConfig = {}): Promise => { + getAllItems: async (page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, fournisseur?: RestockType, options: AxiosRequestConfig = {}): Promise => { const localVarPath = `/items`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); @@ -6682,6 +6719,10 @@ export const ItemsApiAxiosParamCreator = function (configuration?: Configuration localVarQueryParameter['name'] = name; } + if (fournisseur !== undefined) { + localVarQueryParameter['fournisseur'] = fournisseur; + } + setSearchParams(localVarUrlObj, localVarQueryParameter); @@ -6924,11 +6965,12 @@ export const ItemsApiFp = function(configuration?: Configuration) { * @param {ItemState} [state] Filter by state * @param {string} [categoryId] Filter by category * @param {string} [name] Filter by name + * @param {RestockType} [fournisseur] Filter by fournisseur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getAllItems(page, limit, state, categoryId, name, options); + async getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, fournisseur?: RestockType, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getAllItems(page, limit, state, categoryId, name, fournisseur, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -7006,11 +7048,12 @@ export const ItemsApiFactory = function (configuration?: Configuration, basePath * @param {ItemState} [state] Filter by state * @param {string} [categoryId] Filter by category * @param {string} [name] Filter by name + * @param {RestockType} [fournisseur] Filter by fournisseur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, options?: any): AxiosPromise { - return localVarFp.getAllItems(page, limit, state, categoryId, name, options).then((request) => request(axios, basePath)); + getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, fournisseur?: RestockType, options?: any): AxiosPromise { + return localVarFp.getAllItems(page, limit, state, categoryId, name, fournisseur, options).then((request) => request(axios, basePath)); }, /** * Get all items of a category @@ -7082,12 +7125,13 @@ export class ItemsApi extends BaseAPI { * @param {ItemState} [state] Filter by state * @param {string} [categoryId] Filter by category * @param {string} [name] Filter by name + * @param {RestockType} [fournisseur] Filter by fournisseur * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof ItemsApi */ - public getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, options?: AxiosRequestConfig) { - return ItemsApiFp(this.configuration).getAllItems(page, limit, state, categoryId, name, options).then((request) => request(this.axios, this.basePath)); + public getAllItems(page?: number, limit?: number, state?: ItemState, categoryId?: string, name?: string, fournisseur?: RestockType, options?: AxiosRequestConfig) { + return ItemsApiFp(this.configuration).getAllItems(page, limit, state, categoryId, name, fournisseur, options).then((request) => request(this.axios, this.basePath)); } /** diff --git a/frontend/src/routes/admin/produits/+page.svelte b/frontend/src/routes/admin/produits/+page.svelte index cbf860b..2aaefce 100644 --- a/frontend/src/routes/admin/produits/+page.svelte +++ b/frontend/src/routes/admin/produits/+page.svelte @@ -81,7 +81,7 @@ function reloadItems() { itemsApi() - .getAllItems(page, itemsPerPage, searchState, searchCategory, searchName, { + .getAllItems(page, itemsPerPage, searchState, searchCategory, searchName, undefined, { withCredentials: true }) .then((res) => { diff --git a/frontend/src/routes/panel/products/create-menu/+page.svelte b/frontend/src/routes/panel/products/create-menu/+page.svelte index 2bdfcef..565fcd8 100644 --- a/frontend/src/routes/panel/products/create-menu/+page.svelte +++ b/frontend/src/routes/panel/products/create-menu/+page.svelte @@ -145,7 +145,7 @@ on:click={async () => { steps.category = c; currentStep = 2; - const res = await itemsApi().getAllItems(0, 16, undefined, undefined, '', { + const res = await itemsApi().getAllItems(0, 16, undefined, undefined, '', undefined, { withCredentials: true }); if (!Array.isArray(res.data.items)) { @@ -182,7 +182,7 @@ on:keyup={async (e) => { // @ts-ignore let val = e.target?.value; - const res = await itemsApi().getAllItems(0, 16, undefined, undefined, val, { + const res = await itemsApi().getAllItems(0, 16, undefined, undefined, val, undefined, { withCredentials: true }); if (!Array.isArray(res.data.items)) { diff --git a/frontend/src/routes/panel/products/founisseur/+page.svelte b/frontend/src/routes/panel/products/founisseur/+page.svelte new file mode 100644 index 0000000..a15f361 --- /dev/null +++ b/frontend/src/routes/panel/products/founisseur/+page.svelte @@ -0,0 +1,945 @@ + + + + + + + +{#if deletingItem} + { + deletingItem = false; + }} + confirm_callback={deleteItemCallback} + /> +{/if} + + +
+ +
+
+
+
+ +
+
+

Produits

+

Ajouter des produits

+
+ +
+ +
Par catégorie
+
Par état
+
Par nom
+
+ + +
+
+ + +
+
+ { + // @ts-ignore + searchName = e.target.value.toLowerCase(); + reloadItems(); + }} + /> + + + + +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + {#each items as item} + + + + + + + + + + + + {/each} + +
+ + Nom + + + + Catégorie + + + + Image + + +

+ Fournisseur +

+
+ + Nombre de produit par lot + + + + Code de reference du produit + + + + Montant optimal en stock + + + + +
+
+ { + // @ts-ignore + let name = e.target?.value; + editItem(item.id, { name: name }, item.category_id); + }} + /> +
+
+
+ +
+
+ +
+ + + + { + // @ts-ignore + let file = e.target?.files[0]; + reuploadItemPicture(item.id, file, item.category_id); + }} + /> + {#if item.picture_uri != ''} + indisponible + {/if} +
+
+
+ +
+
+
+ { + // @ts-ignore + let amount_per_bundle = parseInt(e.target?.value); + editItem(item.id, { amount_per_bundle: amount_per_bundle }, item.category_id); + }} + /> +
+
+
+ { + // @ts-ignore + let ref_bundle = e.target?.value; + // @ts-ignore + editItem(item.id, { ref_bundle: ref_bundle }, item.category_id); + }} + /> +
+
+
+ { + // @ts-ignore + let optimal_amount = parseInt(e.target?.value); + editItem(item.id, { optimal_amount: optimal_amount }, item.category_id); + }} + /> +
+
+
+ { + let prices = item.prices; + // @ts-ignore + prices[editItemPriceRole] = parsePrice(e.target?.value); + + editItem(item.id, { prices: prices }, item.category_id); + + // Remove the value of elems with id "price" with rebounce timeout + if (rebounceTimeout) clearTimeout(rebounceTimeout); + rebounceTimeout = setTimeout(() => { + let elems = document.querySelectorAll('[id=price]'); + elems.forEach((elem) => { + // @ts-ignore + elem.value = ''; + }); + }, 1000); + }} + /> +
+
+
+ + +
+
+ + + +
+
+

+ {items.length} + résultats +

+
+ +
+
+ + +

+ Page {page} / {maxPage + 1} +

+ + +
+
+
+ +
+
+
+
+ +
+ diff --git a/frontend/src/routes/panel/products/incoherants/+page.svelte b/frontend/src/routes/panel/products/incoherants/+page.svelte index 2b83ae6..e91deda 100644 --- a/frontend/src/routes/panel/products/incoherants/+page.svelte +++ b/frontend/src/routes/panel/products/incoherants/+page.svelte @@ -76,7 +76,7 @@ function reloadItems() { itemsApi() - .getAllItems(page, itemsPerPage, searchState, searchCategory, searchName, { + .getAllItems(page, itemsPerPage, searchState, searchCategory, searchName, undefined, { withCredentials: true }) .then((res) => { diff --git a/frontend/src/routes/panel/products/reappro/+page.svelte b/frontend/src/routes/panel/products/reappro/+page.svelte index 8f16478..20e3f74 100644 --- a/frontend/src/routes/panel/products/reappro/+page.svelte +++ b/frontend/src/routes/panel/products/reappro/+page.svelte @@ -69,7 +69,7 @@ function reloadItems() { itemsApi() - .getAllItems(page, itemsPerPage, undefined, undefined, searchName, { + .getAllItems(page, itemsPerPage, undefined, undefined, searchName, undefined, { withCredentials: true }) .then((res) => { diff --git a/frontend/src/routes/panel/treso/histoproduitmenu/+page.svelte b/frontend/src/routes/panel/treso/histoproduitmenu/+page.svelte index 97a1894..4cbc10a 100644 --- a/frontend/src/routes/panel/treso/histoproduitmenu/+page.svelte +++ b/frontend/src/routes/panel/treso/histoproduitmenu/+page.svelte @@ -11,7 +11,7 @@ let selectedItem: Item | undefined = undefined; async function reloadItems() { - let resp = await itemsApi().getAllItems(1, itemsPerPage, undefined, undefined, searchItem, { + let resp = await itemsApi().getAllItems(1, itemsPerPage, undefined, undefined, searchItem, undefined, { withCredentials: true }); items = resp.data.items ?? []; @@ -25,13 +25,13 @@ if (reloading) return; reloading = true; try { - let resp = await transactionsApi().getTransactions(1, transactionPerPage, 'finished', { + let resp = await transactionsApi().getTransactions(1, transactionPerPage, 'finished', undefined, { withCredentials: true }); let temp = resp.data.transactions ?? []; for (let p = 2; p <= resp.data.max_page; p++) { - let resp = await transactionsApi().getTransactions(p, transactionPerPage, 'finished', { + let resp = await transactionsApi().getTransactions(p, transactionPerPage, 'finished', undefined, { withCredentials: true }); temp.push(...(resp.data.transactions ?? []));